-- | -- Module: Data.RTCM3.SSR -- Copyright: Copyright (C) 2015 Swift Navigation, Inc. -- License: LGPL-3 -- Maintainer: Mark Fine -- Stability: experimental -- Portability: portable -- -- RTCMv3 messages for State Space Representation parameters. module Data.RTCM3.SSR where import BasicPrelude import Control.Lens import Data.Aeson.TH import Data.Binary import Data.Binary.Bits import qualified Data.Binary.Bits.Get as B import qualified Data.Binary.Bits.Put as B import Data.RTCM3.Extras import Data.RTCM3.TH -- | GpsOrbitCorrectionHeader. -- -- GPS orbit correction header. data GpsOrbitCorrectionHeader = GpsOrbitCorrectionHeader { _gpsOrbitCorrectionHeader_num :: Word16 -- ^ Message number. , _gpsOrbitCorrectionHeader_epochs :: Word32 -- ^ GPS epoch time. , _gpsOrbitCorrectionHeader_updateInterval :: Word8 -- ^ SSR update interval. , _gpsOrbitCorrectionHeader_multiple :: Bool -- ^ Multiple message indicator. , _gpsOrbitCorrectionHeader_datum :: Bool -- ^ Satellite reference datum. , _gpsOrbitCorrectionHeader_iod :: Word8 -- ^ IOD SSR. , _gpsOrbitCorrectionHeader_provider :: Word16 -- ^ SSR provider id. , _gpsOrbitCorrectionHeader_solution :: Word8 -- ^ SSR solution id. , _gpsOrbitCorrectionHeader_n :: Word8 -- ^ Number of satellites. } deriving ( Show, Read, Eq ) $(makeLenses ''GpsOrbitCorrectionHeader) $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_gpsOrbitCorrectionHeader_" . stripPrefix "_gpsOrbitCorrectionHeader_"} ''GpsOrbitCorrectionHeader) instance BinaryBit GpsOrbitCorrectionHeader where getBits _n = do _gpsOrbitCorrectionHeader_num <- B.getWord16be 12 _gpsOrbitCorrectionHeader_epochs <- B.getWord32be 20 _gpsOrbitCorrectionHeader_updateInterval <- B.getWord8 4 _gpsOrbitCorrectionHeader_multiple <- B.getBool _gpsOrbitCorrectionHeader_datum <- B.getBool _gpsOrbitCorrectionHeader_iod <- B.getWord8 4 _gpsOrbitCorrectionHeader_provider <- B.getWord16be 16 _gpsOrbitCorrectionHeader_solution <- B.getWord8 4 _gpsOrbitCorrectionHeader_n <- B.getWord8 6 return GpsOrbitCorrectionHeader {..} putBits _n GpsOrbitCorrectionHeader {..} = do B.putWord16be 12 _gpsOrbitCorrectionHeader_num B.putWord32be 20 _gpsOrbitCorrectionHeader_epochs B.putWord8 4 _gpsOrbitCorrectionHeader_updateInterval B.putBool _gpsOrbitCorrectionHeader_multiple B.putBool _gpsOrbitCorrectionHeader_datum B.putWord8 4 _gpsOrbitCorrectionHeader_iod B.putWord16be 16 _gpsOrbitCorrectionHeader_provider B.putWord8 4 _gpsOrbitCorrectionHeader_solution B.putWord8 6 _gpsOrbitCorrectionHeader_n -- | GpsOrbitCorrectionMessage. -- -- GPS orbit correction message. data GpsOrbitCorrection = GpsOrbitCorrection { _gpsOrbitCorrection_sat :: Word8 -- ^ GPS satellite id. , _gpsOrbitCorrection_iode :: Word8 -- ^ GPS IODE. , _gpsOrbitCorrection_deltaRadial :: Int32 -- ^ Delta Radial. , _gpsOrbitCorrection_deltaAlongTrack :: Int32 -- ^ Delta Along-Track. , _gpsOrbitCorrection_deltaCrossTrack :: Int32 -- ^ Delta Cross-Track. , _gpsOrbitCorrection_dotDeltaRadial :: Int32 -- ^ Dot Delta Radial. , _gpsOrbitCorrection_dotDeltaAlongTrack :: Int32 -- ^ Dot Delta Along-Track. , _gpsOrbitCorrection_dotDeltaCrossTrack :: Int32 -- ^ Dot Delta Cross-Track. } deriving ( Show, Read, Eq ) $(makeLenses ''GpsOrbitCorrection) $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_gpsOrbitCorrection_" . stripPrefix "_gpsOrbitCorrection_"} ''GpsOrbitCorrection) instance BinaryBit GpsOrbitCorrection where getBits _n = do _gpsOrbitCorrection_sat <- B.getWord8 6 _gpsOrbitCorrection_iode <- B.getWord8 8 _gpsOrbitCorrection_deltaRadial <- getInt32be 22 _gpsOrbitCorrection_deltaAlongTrack <- getInt32be 20 _gpsOrbitCorrection_deltaCrossTrack <- getInt32be 20 _gpsOrbitCorrection_dotDeltaRadial <- getInt32be 21 _gpsOrbitCorrection_dotDeltaAlongTrack <- getInt32be 19 _gpsOrbitCorrection_dotDeltaCrossTrack <- getInt32be 19 return GpsOrbitCorrection {..} putBits _n GpsOrbitCorrection {..} = do B.putWord8 6 _gpsOrbitCorrection_sat B.putWord8 8 _gpsOrbitCorrection_iode putInt32be 22 _gpsOrbitCorrection_deltaRadial putInt32be 20 _gpsOrbitCorrection_deltaAlongTrack putInt32be 20 _gpsOrbitCorrection_deltaCrossTrack putInt32be 21 _gpsOrbitCorrection_dotDeltaRadial putInt32be 19 _gpsOrbitCorrection_dotDeltaAlongTrack putInt32be 19 _gpsOrbitCorrection_dotDeltaCrossTrack -- | GpsClockCorrectionHeader. -- -- GPS clock correction message. data GpsClockCorrectionHeader = GpsClockCorrectionHeader { _gpsClockCorrectionHeader_num :: Word16 -- ^ Message number. , _gpsClockCorrectionHeader_epochs :: Word32 -- ^ GPS epoch time. , _gpsClockCorrectionHeader_updateInterval :: Word8 -- ^ SSR update interval. , _gpsClockCorrectionHeader_multiple :: Bool -- ^ Multiple message indicator. , _gpsClockCorrectionHeader_iod :: Word8 -- ^ IOD SSR. , _gpsClockCorrectionHeader_provider :: Word16 -- ^ SSR provider id. , _gpsClockCorrectionHeader_solution :: Word8 -- ^ SSR solution id. , _gpsClockCorrectionHeader_n :: Word8 -- ^ Number of satellites. } deriving ( Show, Read, Eq ) $(makeLenses ''GpsClockCorrectionHeader) $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_gpsClockCorrectionHeader_" . stripPrefix "_gpsClockCorrectionHeader_"} ''GpsClockCorrectionHeader) instance BinaryBit GpsClockCorrectionHeader where getBits _n = do _gpsClockCorrectionHeader_num <- B.getWord16be 12 _gpsClockCorrectionHeader_epochs <- B.getWord32be 20 _gpsClockCorrectionHeader_updateInterval <- B.getWord8 4 _gpsClockCorrectionHeader_multiple <- B.getBool _gpsClockCorrectionHeader_iod <- B.getWord8 4 _gpsClockCorrectionHeader_provider <- B.getWord16be 16 _gpsClockCorrectionHeader_solution <- B.getWord8 4 _gpsClockCorrectionHeader_n <- B.getWord8 6 return GpsClockCorrectionHeader {..} putBits _n GpsClockCorrectionHeader {..} = do B.putWord16be 12 _gpsClockCorrectionHeader_num B.putWord32be 20 _gpsClockCorrectionHeader_epochs B.putWord8 4 _gpsClockCorrectionHeader_updateInterval B.putBool _gpsClockCorrectionHeader_multiple B.putWord8 4 _gpsClockCorrectionHeader_iod B.putWord16be 16 _gpsClockCorrectionHeader_provider B.putWord8 4 _gpsClockCorrectionHeader_solution B.putWord8 6 _gpsClockCorrectionHeader_n -- | GpsClockCorrectionMessage. -- -- GPS clock correction message. data GpsClockCorrection = GpsClockCorrection { _gpsClockCorrection_sat :: Word8 -- ^ GPS satellite id. , _gpsClockCorrection_deltaClockC0 :: Int32 -- ^ Delta clock C0. , _gpsClockCorrection_deltaClockC1 :: Int32 -- ^ Delta clock C1. , _gpsClockCorrection_deltaClockC2 :: Int32 -- ^ Delta clock C2. } deriving ( Show, Read, Eq ) $(makeLenses ''GpsClockCorrection) $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_gpsClockCorrection_" . stripPrefix "_gpsClockCorrection_"} ''GpsClockCorrection) instance BinaryBit GpsClockCorrection where getBits _n = do _gpsClockCorrection_sat <- B.getWord8 6 _gpsClockCorrection_deltaClockC0 <- getInt32be 22 _gpsClockCorrection_deltaClockC1 <- getInt32be 21 _gpsClockCorrection_deltaClockC2 <- getInt32be 27 return GpsClockCorrection {..} putBits _n GpsClockCorrection {..} = do B.putWord8 6 _gpsClockCorrection_sat putInt32be 22 _gpsClockCorrection_deltaClockC0 putInt32be 21 _gpsClockCorrection_deltaClockC1 putInt32be 27 _gpsClockCorrection_deltaClockC2 -- | GlonassOrbitCorrectionHeader. -- -- GLONASS orbit correction header. data GlonassOrbitCorrectionHeader = GlonassOrbitCorrectionHeader { _glonassOrbitCorrectionHeader_num :: Word16 -- ^ Message number. , _glonassOrbitCorrectionHeader_epochs :: Word32 -- ^ GLONASS epoch time. , _glonassOrbitCorrectionHeader_updateInterval :: Word8 -- ^ SSR update interval. , _glonassOrbitCorrectionHeader_multiple :: Bool -- ^ Multiple message indicator. , _glonassOrbitCorrectionHeader_datum :: Bool -- ^ Satellite reference datum. , _glonassOrbitCorrectionHeader_iod :: Word8 -- ^ IOD SSR. , _glonassOrbitCorrectionHeader_provider :: Word16 -- ^ SSR provider id. , _glonassOrbitCorrectionHeader_solution :: Word8 -- ^ SSR solution id. , _glonassOrbitCorrectionHeader_n :: Word8 -- ^ Number of satellites. } deriving ( Show, Read, Eq ) $(makeLenses ''GlonassOrbitCorrectionHeader) $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_glonassOrbitCorrectionHeader_" . stripPrefix "_glonassOrbitCorrectionHeader_"} ''GlonassOrbitCorrectionHeader) instance BinaryBit GlonassOrbitCorrectionHeader where getBits _n = do _glonassOrbitCorrectionHeader_num <- B.getWord16be 12 _glonassOrbitCorrectionHeader_epochs <- B.getWord32be 17 _glonassOrbitCorrectionHeader_updateInterval <- B.getWord8 4 _glonassOrbitCorrectionHeader_multiple <- B.getBool _glonassOrbitCorrectionHeader_datum <- B.getBool _glonassOrbitCorrectionHeader_iod <- B.getWord8 4 _glonassOrbitCorrectionHeader_provider <- B.getWord16be 16 _glonassOrbitCorrectionHeader_solution <- B.getWord8 4 _glonassOrbitCorrectionHeader_n <- B.getWord8 6 return GlonassOrbitCorrectionHeader {..} putBits _n GlonassOrbitCorrectionHeader {..} = do B.putWord16be 12 _glonassOrbitCorrectionHeader_num B.putWord32be 17 _glonassOrbitCorrectionHeader_epochs B.putWord8 4 _glonassOrbitCorrectionHeader_updateInterval B.putBool _glonassOrbitCorrectionHeader_multiple B.putBool _glonassOrbitCorrectionHeader_datum B.putWord8 4 _glonassOrbitCorrectionHeader_iod B.putWord16be 16 _glonassOrbitCorrectionHeader_provider B.putWord8 4 _glonassOrbitCorrectionHeader_solution B.putWord8 6 _glonassOrbitCorrectionHeader_n -- | GlonassOrbitCorrectionMessage. -- -- GLONASS orbit correction message. data GlonassOrbitCorrection = GlonassOrbitCorrection { _glonassOrbitCorrection_sat :: Word8 -- ^ GLONASS satellite id. , _glonassOrbitCorrection_iode :: Word8 -- ^ GLONASS IODE. , _glonassOrbitCorrection_deltaRadial :: Int32 -- ^ Delta Radial. , _glonassOrbitCorrection_deltaAlongTrack :: Int32 -- ^ Delta Along-Track. , _glonassOrbitCorrection_deltaCrossTrack :: Int32 -- ^ Delta Cross-Track. , _glonassOrbitCorrection_dotDeltaRadial :: Int32 -- ^ Dot Delta Radial. , _glonassOrbitCorrection_dotDeltaAlongTrack :: Int32 -- ^ Dot Delta Along-Track. , _glonassOrbitCorrection_dotDeltaCrossTrack :: Int32 -- ^ Dot Delta Cross-Track. } deriving ( Show, Read, Eq ) $(makeLenses ''GlonassOrbitCorrection) $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_glonassOrbitCorrection_" . stripPrefix "_glonassOrbitCorrection_"} ''GlonassOrbitCorrection) instance BinaryBit GlonassOrbitCorrection where getBits _n = do _glonassOrbitCorrection_sat <- B.getWord8 5 _glonassOrbitCorrection_iode <- B.getWord8 8 _glonassOrbitCorrection_deltaRadial <- getInt32be 22 _glonassOrbitCorrection_deltaAlongTrack <- getInt32be 20 _glonassOrbitCorrection_deltaCrossTrack <- getInt32be 20 _glonassOrbitCorrection_dotDeltaRadial <- getInt32be 21 _glonassOrbitCorrection_dotDeltaAlongTrack <- getInt32be 19 _glonassOrbitCorrection_dotDeltaCrossTrack <- getInt32be 19 return GlonassOrbitCorrection {..} putBits _n GlonassOrbitCorrection {..} = do B.putWord8 5 _glonassOrbitCorrection_sat B.putWord8 8 _glonassOrbitCorrection_iode putInt32be 22 _glonassOrbitCorrection_deltaRadial putInt32be 20 _glonassOrbitCorrection_deltaAlongTrack putInt32be 20 _glonassOrbitCorrection_deltaCrossTrack putInt32be 21 _glonassOrbitCorrection_dotDeltaRadial putInt32be 19 _glonassOrbitCorrection_dotDeltaAlongTrack putInt32be 19 _glonassOrbitCorrection_dotDeltaCrossTrack -- | GlonassClockCorrectionHeader. -- -- GLONASS clock correction message. data GlonassClockCorrectionHeader = GlonassClockCorrectionHeader { _glonassClockCorrectionHeader_num :: Word16 -- ^ Message number. , _glonassClockCorrectionHeader_epochs :: Word32 -- ^ GLONASS epoch time. , _glonassClockCorrectionHeader_updateInterval :: Word8 -- ^ SSR update interval. , _glonassClockCorrectionHeader_multiple :: Bool -- ^ Multiple message indicator. , _glonassClockCorrectionHeader_iod :: Word8 -- ^ IOD SSR. , _glonassClockCorrectionHeader_provider :: Word16 -- ^ SSR provider id. , _glonassClockCorrectionHeader_solution :: Word8 -- ^ SSR solution id. , _glonassClockCorrectionHeader_n :: Word8 -- ^ Number of satellites. } deriving ( Show, Read, Eq ) $(makeLenses ''GlonassClockCorrectionHeader) $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_glonassClockCorrectionHeader_" . stripPrefix "_glonassClockCorrectionHeader_"} ''GlonassClockCorrectionHeader) instance BinaryBit GlonassClockCorrectionHeader where getBits _n = do _glonassClockCorrectionHeader_num <- B.getWord16be 12 _glonassClockCorrectionHeader_epochs <- B.getWord32be 17 _glonassClockCorrectionHeader_updateInterval <- B.getWord8 4 _glonassClockCorrectionHeader_multiple <- B.getBool _glonassClockCorrectionHeader_iod <- B.getWord8 4 _glonassClockCorrectionHeader_provider <- B.getWord16be 16 _glonassClockCorrectionHeader_solution <- B.getWord8 4 _glonassClockCorrectionHeader_n <- B.getWord8 6 return GlonassClockCorrectionHeader {..} putBits _n GlonassClockCorrectionHeader {..} = do B.putWord16be 12 _glonassClockCorrectionHeader_num B.putWord32be 17 _glonassClockCorrectionHeader_epochs B.putWord8 4 _glonassClockCorrectionHeader_updateInterval B.putBool _glonassClockCorrectionHeader_multiple B.putWord8 4 _glonassClockCorrectionHeader_iod B.putWord16be 16 _glonassClockCorrectionHeader_provider B.putWord8 4 _glonassClockCorrectionHeader_solution B.putWord8 6 _glonassClockCorrectionHeader_n -- | GlonassClockCorrectionMessage. -- -- GLONASS clock correction message. data GlonassClockCorrection = GlonassClockCorrection { _glonassClockCorrection_sat :: Word8 -- ^ GLONASS satellite id. , _glonassClockCorrection_deltaClockC0 :: Int32 -- ^ Delta clock C0. , _glonassClockCorrection_deltaClockC1 :: Int32 -- ^ Delta clock C1. , _glonassClockCorrection_deltaClockC2 :: Int32 -- ^ Delta clock C2. } deriving ( Show, Read, Eq ) $(makeLenses ''GlonassClockCorrection) $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_glonassClockCorrection_" . stripPrefix "_glonassClockCorrection_"} ''GlonassClockCorrection) instance BinaryBit GlonassClockCorrection where getBits _n = do _glonassClockCorrection_sat <- B.getWord8 5 _glonassClockCorrection_deltaClockC0 <- getInt32be 22 _glonassClockCorrection_deltaClockC1 <- getInt32be 21 _glonassClockCorrection_deltaClockC2 <- getInt32be 27 return GlonassClockCorrection {..} putBits _n GlonassClockCorrection {..} = do B.putWord8 5 _glonassClockCorrection_sat putInt32be 22 _glonassClockCorrection_deltaClockC0 putInt32be 21 _glonassClockCorrection_deltaClockC1 putInt32be 27 _glonassClockCorrection_deltaClockC2 msg1057 :: Word16 msg1057 = 1057 -- | Msg 1057. -- -- RTCMv3 message 1057. data Msg1057 = Msg1057 { _msg1057_header :: GpsOrbitCorrectionHeader -- ^ GPS orbit correction header. , _msg1057_corrections :: [GpsOrbitCorrection] -- ^ GPS orbit corrections. } deriving ( Show, Read, Eq ) $(makeLenses ''Msg1057) $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1057_" . stripPrefix "_msg1057_"} ''Msg1057) instance Binary Msg1057 where get = B.runBitGet $ do _msg1057_header <- getBits 0 _msg1057_corrections <- replicateM (fromIntegral $ _msg1057_header ^. gpsOrbitCorrectionHeader_n) $ getBits 0 return Msg1057 {..} put Msg1057 {..} = B.runBitPut $ do putBits 0 _msg1057_header forM_ _msg1057_corrections $ putBits 0 $(deriveRTCM3 ''Msg1057) msg1058 :: Word16 msg1058 = 1058 -- | Msg 1058. -- -- RTCMv3 message 1058. data Msg1058 = Msg1058 { _msg1058_header :: GpsClockCorrectionHeader -- ^ GPS clock correction header. , _msg1058_corrections :: [GpsClockCorrection] -- ^ GPS clock corrections. } deriving ( Show, Read, Eq ) $(makeLenses ''Msg1058) $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1058_" . stripPrefix "_msg1058_"} ''Msg1058) instance Binary Msg1058 where get = B.runBitGet $ do _msg1058_header <- getBits 0 _msg1058_corrections <- replicateM (fromIntegral $ _msg1058_header ^. gpsClockCorrectionHeader_n) $ getBits 0 return Msg1058 {..} put Msg1058 {..} = B.runBitPut $ do putBits 0 _msg1058_header forM_ _msg1058_corrections $ putBits 0 $(deriveRTCM3 ''Msg1058) msg1063 :: Word16 msg1063 = 1063 -- | Msg 1063. -- -- RTCMv3 message 1063. data Msg1063 = Msg1063 { _msg1063_header :: GlonassOrbitCorrectionHeader -- ^ GLONASS orbit correction header. , _msg1063_corrections :: [GlonassOrbitCorrection] -- ^ GLONASS orbit corrections. } deriving ( Show, Read, Eq ) $(makeLenses ''Msg1063) $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1063_" . stripPrefix "_msg1063_"} ''Msg1063) instance Binary Msg1063 where get = B.runBitGet $ do _msg1063_header <- getBits 0 _msg1063_corrections <- replicateM (fromIntegral $ _msg1063_header ^. glonassOrbitCorrectionHeader_n) $ getBits 0 return Msg1063 {..} put Msg1063 {..} = B.runBitPut $ do putBits 0 _msg1063_header forM_ _msg1063_corrections $ putBits 0 $(deriveRTCM3 ''Msg1063) msg1064 :: Word16 msg1064 = 1064 -- | Msg 1064. -- -- RTCMv3 message 1064. data Msg1064 = Msg1064 { _msg1064_header :: GlonassClockCorrectionHeader -- ^ GLONASS clock correction header. , _msg1064_corrections :: [GlonassClockCorrection] -- ^ GLONASS clock corrections. } deriving ( Show, Read, Eq ) $(makeLenses ''Msg1064) $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1064_" . stripPrefix "_msg1064_"} ''Msg1064) instance Binary Msg1064 where get = B.runBitGet $ do _msg1064_header <- getBits 0 _msg1064_corrections <- replicateM (fromIntegral $ _msg1064_header ^. glonassClockCorrectionHeader_n) $ getBits 0 return Msg1064 {..} put Msg1064 {..} = B.runBitPut $ do putBits 0 _msg1064_header forM_ _msg1064_corrections $ putBits 0 $(deriveRTCM3 ''Msg1064)