module Data.RTCM3
( module Data.RTCM3
, module Export
) where
import BasicPrelude
import Control.Lens hiding ((.=))
import Data.Aeson hiding (decode)
import Data.Aeson.Lens
import Data.Binary
import Data.ByteString.Lazy
import Data.RTCM3.Antennas as Export
import Data.RTCM3.Ephemerides as Export
import Data.RTCM3.Observations as Export
import Data.RTCM3.SSR as Export
import Data.RTCM3.System as Export
import Data.RTCM3.Types as Export
data RTCM3Msg =
RTCM3Msg1001 Msg1001 Msg
| RTCM3Msg1002 Msg1002 Msg
| RTCM3Msg1003 Msg1003 Msg
| RTCM3Msg1004 Msg1004 Msg
| RTCM3Msg1005 Msg1005 Msg
| RTCM3Msg1006 Msg1006 Msg
| RTCM3Msg1007 Msg1007 Msg
| RTCM3Msg1008 Msg1008 Msg
| RTCM3Msg1009 Msg1009 Msg
| RTCM3Msg1010 Msg1010 Msg
| RTCM3Msg1011 Msg1011 Msg
| RTCM3Msg1012 Msg1012 Msg
| RTCM3Msg1013 Msg1013 Msg
| RTCM3Msg1019 Msg1019 Msg
| RTCM3Msg1020 Msg1020 Msg
| RTCM3Msg1033 Msg1033 Msg
| RTCM3Msg1057 Msg1057 Msg
| RTCM3Msg1058 Msg1058 Msg
| RTCM3Msg1059 Msg1059 Msg
| RTCM3Msg1060 Msg1060 Msg
| RTCM3Msg1063 Msg1063 Msg
| RTCM3Msg1064 Msg1064 Msg
| RTCM3Msg1065 Msg1065 Msg
| RTCM3Msg1066 Msg1066 Msg
| RTCM3Msg1230 Msg1230 Msg
| RTCM3Msg1265 Msg1265 Msg
| RTCM3Msg1266 Msg1266 Msg
| RTCM3MsgUnknown Word16 Msg
| RTCM3MsgBadCrc Msg
| RTCM3MsgEmpty Msg
deriving ( Show, Read, Eq )
$(makePrisms ''RTCM3Msg)
instance Binary RTCM3Msg where
get = do
preamble <- getWord8
if preamble /= msgRTCM3Preamble then get else
decoder <$> get where
decoder m@Msg {..}
| crc /= _msgRTCM3Crc = RTCM3MsgBadCrc m
| 0 == _msgRTCM3Len = RTCM3MsgEmpty m
| num == msg1001 = RTCM3Msg1001 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1002 = RTCM3Msg1002 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1003 = RTCM3Msg1003 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1004 = RTCM3Msg1004 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1005 = RTCM3Msg1005 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1006 = RTCM3Msg1006 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1007 = RTCM3Msg1007 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1008 = RTCM3Msg1008 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1009 = RTCM3Msg1009 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1010 = RTCM3Msg1010 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1011 = RTCM3Msg1011 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1012 = RTCM3Msg1012 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1013 = RTCM3Msg1013 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1019 = RTCM3Msg1019 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1020 = RTCM3Msg1020 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1033 = RTCM3Msg1033 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1057 = RTCM3Msg1057 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1058 = RTCM3Msg1058 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1059 = RTCM3Msg1059 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1060 = RTCM3Msg1060 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1063 = RTCM3Msg1063 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1064 = RTCM3Msg1064 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1065 = RTCM3Msg1065 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1066 = RTCM3Msg1066 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1230 = RTCM3Msg1230 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1265 = RTCM3Msg1265 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| num == msg1266 = RTCM3Msg1266 (decode $ fromStrict $ unBytes _msgRTCM3Payload) m
| otherwise = RTCM3MsgUnknown num m where
crc = checkCrc _msgRTCM3Len $ unBytes _msgRTCM3Payload
num = checkNum $ unBytes _msgRTCM3Payload
put rm = do
putWord8 msgRTCM3Preamble
encoder rm where
encoder (RTCM3Msg1001 _n m) = put m
encoder (RTCM3Msg1002 _n m) = put m
encoder (RTCM3Msg1003 _n m) = put m
encoder (RTCM3Msg1004 _n m) = put m
encoder (RTCM3Msg1005 _n m) = put m
encoder (RTCM3Msg1006 _n m) = put m
encoder (RTCM3Msg1007 _n m) = put m
encoder (RTCM3Msg1008 _n m) = put m
encoder (RTCM3Msg1009 _n m) = put m
encoder (RTCM3Msg1010 _n m) = put m
encoder (RTCM3Msg1011 _n m) = put m
encoder (RTCM3Msg1012 _n m) = put m
encoder (RTCM3Msg1013 _n m) = put m
encoder (RTCM3Msg1019 _n m) = put m
encoder (RTCM3Msg1020 _n m) = put m
encoder (RTCM3Msg1033 _n m) = put m
encoder (RTCM3Msg1057 _n m) = put m
encoder (RTCM3Msg1058 _n m) = put m
encoder (RTCM3Msg1059 _n m) = put m
encoder (RTCM3Msg1060 _n m) = put m
encoder (RTCM3Msg1063 _n m) = put m
encoder (RTCM3Msg1064 _n m) = put m
encoder (RTCM3Msg1065 _n m) = put m
encoder (RTCM3Msg1066 _n m) = put m
encoder (RTCM3Msg1230 _n m) = put m
encoder (RTCM3Msg1265 _n m) = put m
encoder (RTCM3Msg1266 _n m) = put m
encoder (RTCM3MsgUnknown _n m) = put m
encoder (RTCM3MsgBadCrc m) = put m
encoder (RTCM3MsgEmpty m) = put m
instance HasMsg RTCM3Msg where
msg f (RTCM3Msg1001 n m) = RTCM3Msg1001 n <$> f m
msg f (RTCM3Msg1002 n m) = RTCM3Msg1002 n <$> f m
msg f (RTCM3Msg1003 n m) = RTCM3Msg1003 n <$> f m
msg f (RTCM3Msg1004 n m) = RTCM3Msg1004 n <$> f m
msg f (RTCM3Msg1005 n m) = RTCM3Msg1005 n <$> f m
msg f (RTCM3Msg1006 n m) = RTCM3Msg1006 n <$> f m
msg f (RTCM3Msg1007 n m) = RTCM3Msg1007 n <$> f m
msg f (RTCM3Msg1008 n m) = RTCM3Msg1008 n <$> f m
msg f (RTCM3Msg1009 n m) = RTCM3Msg1009 n <$> f m
msg f (RTCM3Msg1010 n m) = RTCM3Msg1010 n <$> f m
msg f (RTCM3Msg1011 n m) = RTCM3Msg1011 n <$> f m
msg f (RTCM3Msg1012 n m) = RTCM3Msg1012 n <$> f m
msg f (RTCM3Msg1013 n m) = RTCM3Msg1013 n <$> f m
msg f (RTCM3Msg1019 n m) = RTCM3Msg1019 n <$> f m
msg f (RTCM3Msg1020 n m) = RTCM3Msg1020 n <$> f m
msg f (RTCM3Msg1033 n m) = RTCM3Msg1033 n <$> f m
msg f (RTCM3Msg1057 n m) = RTCM3Msg1057 n <$> f m
msg f (RTCM3Msg1058 n m) = RTCM3Msg1058 n <$> f m
msg f (RTCM3Msg1059 n m) = RTCM3Msg1059 n <$> f m
msg f (RTCM3Msg1060 n m) = RTCM3Msg1060 n <$> f m
msg f (RTCM3Msg1063 n m) = RTCM3Msg1063 n <$> f m
msg f (RTCM3Msg1064 n m) = RTCM3Msg1064 n <$> f m
msg f (RTCM3Msg1065 n m) = RTCM3Msg1065 n <$> f m
msg f (RTCM3Msg1066 n m) = RTCM3Msg1066 n <$> f m
msg f (RTCM3Msg1230 n m) = RTCM3Msg1230 n <$> f m
msg f (RTCM3Msg1265 n m) = RTCM3Msg1265 n <$> f m
msg f (RTCM3Msg1266 n m) = RTCM3Msg1266 n <$> f m
msg f (RTCM3MsgUnknown n m) = RTCM3MsgUnknown n <$> f m
msg f (RTCM3MsgBadCrc m) = RTCM3MsgBadCrc <$> f m
msg f (RTCM3MsgEmpty m) = RTCM3MsgEmpty <$> f m
(<<>>) :: Value -> Value -> Value
(<<>>) a b = fromMaybe Null $ do
c <- preview _Object a
d <- preview _Object b
pure $ review _Object $ c <> d
instance ToJSON RTCM3Msg where
toJSON (RTCM3Msg1001 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1002 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1003 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1004 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1005 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1006 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1007 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1008 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1009 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1010 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1011 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1012 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1013 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1019 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1020 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1033 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1057 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1058 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1059 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1060 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1063 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1064 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1065 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1066 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1230 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1265 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3Msg1266 n m) = toJSON n <<>> toJSON m
toJSON (RTCM3MsgUnknown n m) = object [ "num" .= n ] <<>> toJSON m
toJSON (RTCM3MsgBadCrc m) = toJSON m
toJSON (RTCM3MsgEmpty m) = toJSON m
instance FromJSON RTCM3Msg where
parseJSON obj@(Object o) = do
payload <- o .: "payload"
decoder (checkNum $ unBytes payload) payload where
decoder num payload
| num == msg1001 = RTCM3Msg1001 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| num == msg1002 = RTCM3Msg1002 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| num == msg1003 = RTCM3Msg1003 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| num == msg1004 = RTCM3Msg1004 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| num == msg1005 = RTCM3Msg1005 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| num == msg1006 = RTCM3Msg1006 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| num == msg1007 = RTCM3Msg1007 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| num == msg1008 = RTCM3Msg1008 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| num == msg1009 = RTCM3Msg1009 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| num == msg1010 = RTCM3Msg1010 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| num == msg1011 = RTCM3Msg1011 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| num == msg1012 = RTCM3Msg1012 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| num == msg1013 = RTCM3Msg1013 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| num == msg1019 = RTCM3Msg1019 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| num == msg1020 = RTCM3Msg1020 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| num == msg1033 = RTCM3Msg1033 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| num == msg1057 = RTCM3Msg1057 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| num == msg1058 = RTCM3Msg1058 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| num == msg1059 = RTCM3Msg1059 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| num == msg1060 = RTCM3Msg1060 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| num == msg1063 = RTCM3Msg1063 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| num == msg1064 = RTCM3Msg1064 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| num == msg1065 = RTCM3Msg1065 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| num == msg1066 = RTCM3Msg1066 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| num == msg1230 = RTCM3Msg1230 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| num == msg1265 = RTCM3Msg1265 <$> pure (decode $ fromStrict $ unBytes payload) <*> parseJSON obj
| otherwise = RTCM3MsgUnknown <$> pure num <*> parseJSON obj
parseJSON _ = mzero