module SwiftNav.SBP.Observation where
import BasicPrelude
import Control.Lens
import Control.Monad.Loops
import Data.Aeson.TH (defaultOptions, deriveJSON, fieldLabelModifier)
import Data.Binary
import Data.Binary.Get
import Data.Binary.IEEE754
import Data.Binary.Put
import Data.ByteString
import Data.ByteString.Lazy hiding (ByteString)
import Data.Int
import Data.Word
import SwiftNav.SBP.Encoding
import SwiftNav.SBP.TH
import SwiftNav.SBP.Types
import SwiftNav.SBP.GnssSignal
data ObsGPSTime = ObsGPSTime
{ _obsGPSTime_tow :: Word32
, _obsGPSTime_wn :: Word16
} deriving ( Show, Read, Eq )
instance Binary ObsGPSTime where
get = do
_obsGPSTime_tow <- getWord32le
_obsGPSTime_wn <- getWord16le
return ObsGPSTime {..}
put ObsGPSTime {..} = do
putWord32le _obsGPSTime_tow
putWord16le _obsGPSTime_wn
$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_obsGPSTime_" . stripPrefix "_obsGPSTime_"}
''ObsGPSTime)
$(makeLenses ''ObsGPSTime)
data CarrierPhase = CarrierPhase
{ _carrierPhase_i :: Int32
, _carrierPhase_f :: Word8
} deriving ( Show, Read, Eq )
instance Binary CarrierPhase where
get = do
_carrierPhase_i <- liftM fromIntegral getWord32le
_carrierPhase_f <- getWord8
return CarrierPhase {..}
put CarrierPhase {..} = do
putWord32le $ fromIntegral _carrierPhase_i
putWord8 _carrierPhase_f
$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_carrierPhase_" . stripPrefix "_carrierPhase_"}
''CarrierPhase)
$(makeLenses ''CarrierPhase)
data ObservationHeader = ObservationHeader
{ _observationHeader_t :: ObsGPSTime
, _observationHeader_n_obs :: Word8
} deriving ( Show, Read, Eq )
instance Binary ObservationHeader where
get = do
_observationHeader_t <- get
_observationHeader_n_obs <- getWord8
return ObservationHeader {..}
put ObservationHeader {..} = do
put _observationHeader_t
putWord8 _observationHeader_n_obs
$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_observationHeader_" . stripPrefix "_observationHeader_"}
''ObservationHeader)
$(makeLenses ''ObservationHeader)
data PackedObsContent = PackedObsContent
{ _packedObsContent_P :: Word32
, _packedObsContent_L :: CarrierPhase
, _packedObsContent_cn0 :: Word8
, _packedObsContent_lock :: Word16
, _packedObsContent_sid :: GnssSignal
} deriving ( Show, Read, Eq )
instance Binary PackedObsContent where
get = do
_packedObsContent_P <- getWord32le
_packedObsContent_L <- get
_packedObsContent_cn0 <- getWord8
_packedObsContent_lock <- getWord16le
_packedObsContent_sid <- get
return PackedObsContent {..}
put PackedObsContent {..} = do
putWord32le _packedObsContent_P
put _packedObsContent_L
putWord8 _packedObsContent_cn0
putWord16le _packedObsContent_lock
put _packedObsContent_sid
$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_packedObsContent_" . stripPrefix "_packedObsContent_"}
''PackedObsContent)
$(makeLenses ''PackedObsContent)
msgObs :: Word16
msgObs = 0x0043
data MsgObs = MsgObs
{ _msgObs_header :: ObservationHeader
, _msgObs_obs :: [PackedObsContent]
} deriving ( Show, Read, Eq )
instance Binary MsgObs where
get = do
_msgObs_header <- get
_msgObs_obs <- whileM (liftM not isEmpty) get
return MsgObs {..}
put MsgObs {..} = do
put _msgObs_header
mapM_ put _msgObs_obs
$(deriveSBP 'msgObs ''MsgObs)
$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgObs_" . stripPrefix "_msgObs_"}
''MsgObs)
$(makeLenses ''MsgObs)
msgBasePosLlh :: Word16
msgBasePosLlh = 0x0044
data MsgBasePosLlh = MsgBasePosLlh
{ _msgBasePosLlh_lat :: Double
, _msgBasePosLlh_lon :: Double
, _msgBasePosLlh_height :: Double
} deriving ( Show, Read, Eq )
instance Binary MsgBasePosLlh where
get = do
_msgBasePosLlh_lat <- getFloat64le
_msgBasePosLlh_lon <- getFloat64le
_msgBasePosLlh_height <- getFloat64le
return MsgBasePosLlh {..}
put MsgBasePosLlh {..} = do
putFloat64le _msgBasePosLlh_lat
putFloat64le _msgBasePosLlh_lon
putFloat64le _msgBasePosLlh_height
$(deriveSBP 'msgBasePosLlh ''MsgBasePosLlh)
$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgBasePosLlh_" . stripPrefix "_msgBasePosLlh_"}
''MsgBasePosLlh)
$(makeLenses ''MsgBasePosLlh)
msgBasePosEcef :: Word16
msgBasePosEcef = 0x0048
data MsgBasePosEcef = MsgBasePosEcef
{ _msgBasePosEcef_x :: Double
, _msgBasePosEcef_y :: Double
, _msgBasePosEcef_z :: Double
} deriving ( Show, Read, Eq )
instance Binary MsgBasePosEcef where
get = do
_msgBasePosEcef_x <- getFloat64le
_msgBasePosEcef_y <- getFloat64le
_msgBasePosEcef_z <- getFloat64le
return MsgBasePosEcef {..}
put MsgBasePosEcef {..} = do
putFloat64le _msgBasePosEcef_x
putFloat64le _msgBasePosEcef_y
putFloat64le _msgBasePosEcef_z
$(deriveSBP 'msgBasePosEcef ''MsgBasePosEcef)
$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgBasePosEcef_" . stripPrefix "_msgBasePosEcef_"}
''MsgBasePosEcef)
$(makeLenses ''MsgBasePosEcef)
msgEphemeris :: Word16
msgEphemeris = 0x0047
data MsgEphemeris = MsgEphemeris
{ _msgEphemeris_tgd :: Double
, _msgEphemeris_c_rs :: Double
, _msgEphemeris_c_rc :: Double
, _msgEphemeris_c_uc :: Double
, _msgEphemeris_c_us :: Double
, _msgEphemeris_c_ic :: Double
, _msgEphemeris_c_is :: Double
, _msgEphemeris_dn :: Double
, _msgEphemeris_m0 :: Double
, _msgEphemeris_ecc :: Double
, _msgEphemeris_sqrta :: Double
, _msgEphemeris_omega0 :: Double
, _msgEphemeris_omegadot :: Double
, _msgEphemeris_w :: Double
, _msgEphemeris_inc :: Double
, _msgEphemeris_inc_dot :: Double
, _msgEphemeris_af0 :: Double
, _msgEphemeris_af1 :: Double
, _msgEphemeris_af2 :: Double
, _msgEphemeris_toe_tow :: Double
, _msgEphemeris_toe_wn :: Word16
, _msgEphemeris_toc_tow :: Double
, _msgEphemeris_toc_wn :: Word16
, _msgEphemeris_valid :: Word8
, _msgEphemeris_healthy :: Word8
, _msgEphemeris_sid :: GnssSignal
, _msgEphemeris_iode :: Word8
, _msgEphemeris_iodc :: Word16
, _msgEphemeris_reserved :: Word32
} deriving ( Show, Read, Eq )
instance Binary MsgEphemeris where
get = do
_msgEphemeris_tgd <- getFloat64le
_msgEphemeris_c_rs <- getFloat64le
_msgEphemeris_c_rc <- getFloat64le
_msgEphemeris_c_uc <- getFloat64le
_msgEphemeris_c_us <- getFloat64le
_msgEphemeris_c_ic <- getFloat64le
_msgEphemeris_c_is <- getFloat64le
_msgEphemeris_dn <- getFloat64le
_msgEphemeris_m0 <- getFloat64le
_msgEphemeris_ecc <- getFloat64le
_msgEphemeris_sqrta <- getFloat64le
_msgEphemeris_omega0 <- getFloat64le
_msgEphemeris_omegadot <- getFloat64le
_msgEphemeris_w <- getFloat64le
_msgEphemeris_inc <- getFloat64le
_msgEphemeris_inc_dot <- getFloat64le
_msgEphemeris_af0 <- getFloat64le
_msgEphemeris_af1 <- getFloat64le
_msgEphemeris_af2 <- getFloat64le
_msgEphemeris_toe_tow <- getFloat64le
_msgEphemeris_toe_wn <- getWord16le
_msgEphemeris_toc_tow <- getFloat64le
_msgEphemeris_toc_wn <- getWord16le
_msgEphemeris_valid <- getWord8
_msgEphemeris_healthy <- getWord8
_msgEphemeris_sid <- get
_msgEphemeris_iode <- getWord8
_msgEphemeris_iodc <- getWord16le
_msgEphemeris_reserved <- getWord32le
return MsgEphemeris {..}
put MsgEphemeris {..} = do
putFloat64le _msgEphemeris_tgd
putFloat64le _msgEphemeris_c_rs
putFloat64le _msgEphemeris_c_rc
putFloat64le _msgEphemeris_c_uc
putFloat64le _msgEphemeris_c_us
putFloat64le _msgEphemeris_c_ic
putFloat64le _msgEphemeris_c_is
putFloat64le _msgEphemeris_dn
putFloat64le _msgEphemeris_m0
putFloat64le _msgEphemeris_ecc
putFloat64le _msgEphemeris_sqrta
putFloat64le _msgEphemeris_omega0
putFloat64le _msgEphemeris_omegadot
putFloat64le _msgEphemeris_w
putFloat64le _msgEphemeris_inc
putFloat64le _msgEphemeris_inc_dot
putFloat64le _msgEphemeris_af0
putFloat64le _msgEphemeris_af1
putFloat64le _msgEphemeris_af2
putFloat64le _msgEphemeris_toe_tow
putWord16le _msgEphemeris_toe_wn
putFloat64le _msgEphemeris_toc_tow
putWord16le _msgEphemeris_toc_wn
putWord8 _msgEphemeris_valid
putWord8 _msgEphemeris_healthy
put _msgEphemeris_sid
putWord8 _msgEphemeris_iode
putWord16le _msgEphemeris_iodc
putWord32le _msgEphemeris_reserved
$(deriveSBP 'msgEphemeris ''MsgEphemeris)
$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgEphemeris_" . stripPrefix "_msgEphemeris_"}
''MsgEphemeris)
$(makeLenses ''MsgEphemeris)
msgEphemerisDepA :: Word16
msgEphemerisDepA = 0x001A
data MsgEphemerisDepA = MsgEphemerisDepA
{ _msgEphemerisDepA_tgd :: Double
, _msgEphemerisDepA_c_rs :: Double
, _msgEphemerisDepA_c_rc :: Double
, _msgEphemerisDepA_c_uc :: Double
, _msgEphemerisDepA_c_us :: Double
, _msgEphemerisDepA_c_ic :: Double
, _msgEphemerisDepA_c_is :: Double
, _msgEphemerisDepA_dn :: Double
, _msgEphemerisDepA_m0 :: Double
, _msgEphemerisDepA_ecc :: Double
, _msgEphemerisDepA_sqrta :: Double
, _msgEphemerisDepA_omega0 :: Double
, _msgEphemerisDepA_omegadot :: Double
, _msgEphemerisDepA_w :: Double
, _msgEphemerisDepA_inc :: Double
, _msgEphemerisDepA_inc_dot :: Double
, _msgEphemerisDepA_af0 :: Double
, _msgEphemerisDepA_af1 :: Double
, _msgEphemerisDepA_af2 :: Double
, _msgEphemerisDepA_toe_tow :: Double
, _msgEphemerisDepA_toe_wn :: Word16
, _msgEphemerisDepA_toc_tow :: Double
, _msgEphemerisDepA_toc_wn :: Word16
, _msgEphemerisDepA_valid :: Word8
, _msgEphemerisDepA_healthy :: Word8
, _msgEphemerisDepA_prn :: Word8
} deriving ( Show, Read, Eq )
instance Binary MsgEphemerisDepA where
get = do
_msgEphemerisDepA_tgd <- getFloat64le
_msgEphemerisDepA_c_rs <- getFloat64le
_msgEphemerisDepA_c_rc <- getFloat64le
_msgEphemerisDepA_c_uc <- getFloat64le
_msgEphemerisDepA_c_us <- getFloat64le
_msgEphemerisDepA_c_ic <- getFloat64le
_msgEphemerisDepA_c_is <- getFloat64le
_msgEphemerisDepA_dn <- getFloat64le
_msgEphemerisDepA_m0 <- getFloat64le
_msgEphemerisDepA_ecc <- getFloat64le
_msgEphemerisDepA_sqrta <- getFloat64le
_msgEphemerisDepA_omega0 <- getFloat64le
_msgEphemerisDepA_omegadot <- getFloat64le
_msgEphemerisDepA_w <- getFloat64le
_msgEphemerisDepA_inc <- getFloat64le
_msgEphemerisDepA_inc_dot <- getFloat64le
_msgEphemerisDepA_af0 <- getFloat64le
_msgEphemerisDepA_af1 <- getFloat64le
_msgEphemerisDepA_af2 <- getFloat64le
_msgEphemerisDepA_toe_tow <- getFloat64le
_msgEphemerisDepA_toe_wn <- getWord16le
_msgEphemerisDepA_toc_tow <- getFloat64le
_msgEphemerisDepA_toc_wn <- getWord16le
_msgEphemerisDepA_valid <- getWord8
_msgEphemerisDepA_healthy <- getWord8
_msgEphemerisDepA_prn <- getWord8
return MsgEphemerisDepA {..}
put MsgEphemerisDepA {..} = do
putFloat64le _msgEphemerisDepA_tgd
putFloat64le _msgEphemerisDepA_c_rs
putFloat64le _msgEphemerisDepA_c_rc
putFloat64le _msgEphemerisDepA_c_uc
putFloat64le _msgEphemerisDepA_c_us
putFloat64le _msgEphemerisDepA_c_ic
putFloat64le _msgEphemerisDepA_c_is
putFloat64le _msgEphemerisDepA_dn
putFloat64le _msgEphemerisDepA_m0
putFloat64le _msgEphemerisDepA_ecc
putFloat64le _msgEphemerisDepA_sqrta
putFloat64le _msgEphemerisDepA_omega0
putFloat64le _msgEphemerisDepA_omegadot
putFloat64le _msgEphemerisDepA_w
putFloat64le _msgEphemerisDepA_inc
putFloat64le _msgEphemerisDepA_inc_dot
putFloat64le _msgEphemerisDepA_af0
putFloat64le _msgEphemerisDepA_af1
putFloat64le _msgEphemerisDepA_af2
putFloat64le _msgEphemerisDepA_toe_tow
putWord16le _msgEphemerisDepA_toe_wn
putFloat64le _msgEphemerisDepA_toc_tow
putWord16le _msgEphemerisDepA_toc_wn
putWord8 _msgEphemerisDepA_valid
putWord8 _msgEphemerisDepA_healthy
putWord8 _msgEphemerisDepA_prn
$(deriveSBP 'msgEphemerisDepA ''MsgEphemerisDepA)
$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgEphemerisDepA_" . stripPrefix "_msgEphemerisDepA_"}
''MsgEphemerisDepA)
$(makeLenses ''MsgEphemerisDepA)
msgEphemerisDepB :: Word16
msgEphemerisDepB = 0x0046
data MsgEphemerisDepB = MsgEphemerisDepB
{ _msgEphemerisDepB_tgd :: Double
, _msgEphemerisDepB_c_rs :: Double
, _msgEphemerisDepB_c_rc :: Double
, _msgEphemerisDepB_c_uc :: Double
, _msgEphemerisDepB_c_us :: Double
, _msgEphemerisDepB_c_ic :: Double
, _msgEphemerisDepB_c_is :: Double
, _msgEphemerisDepB_dn :: Double
, _msgEphemerisDepB_m0 :: Double
, _msgEphemerisDepB_ecc :: Double
, _msgEphemerisDepB_sqrta :: Double
, _msgEphemerisDepB_omega0 :: Double
, _msgEphemerisDepB_omegadot :: Double
, _msgEphemerisDepB_w :: Double
, _msgEphemerisDepB_inc :: Double
, _msgEphemerisDepB_inc_dot :: Double
, _msgEphemerisDepB_af0 :: Double
, _msgEphemerisDepB_af1 :: Double
, _msgEphemerisDepB_af2 :: Double
, _msgEphemerisDepB_toe_tow :: Double
, _msgEphemerisDepB_toe_wn :: Word16
, _msgEphemerisDepB_toc_tow :: Double
, _msgEphemerisDepB_toc_wn :: Word16
, _msgEphemerisDepB_valid :: Word8
, _msgEphemerisDepB_healthy :: Word8
, _msgEphemerisDepB_prn :: Word8
, _msgEphemerisDepB_iode :: Word8
} deriving ( Show, Read, Eq )
instance Binary MsgEphemerisDepB where
get = do
_msgEphemerisDepB_tgd <- getFloat64le
_msgEphemerisDepB_c_rs <- getFloat64le
_msgEphemerisDepB_c_rc <- getFloat64le
_msgEphemerisDepB_c_uc <- getFloat64le
_msgEphemerisDepB_c_us <- getFloat64le
_msgEphemerisDepB_c_ic <- getFloat64le
_msgEphemerisDepB_c_is <- getFloat64le
_msgEphemerisDepB_dn <- getFloat64le
_msgEphemerisDepB_m0 <- getFloat64le
_msgEphemerisDepB_ecc <- getFloat64le
_msgEphemerisDepB_sqrta <- getFloat64le
_msgEphemerisDepB_omega0 <- getFloat64le
_msgEphemerisDepB_omegadot <- getFloat64le
_msgEphemerisDepB_w <- getFloat64le
_msgEphemerisDepB_inc <- getFloat64le
_msgEphemerisDepB_inc_dot <- getFloat64le
_msgEphemerisDepB_af0 <- getFloat64le
_msgEphemerisDepB_af1 <- getFloat64le
_msgEphemerisDepB_af2 <- getFloat64le
_msgEphemerisDepB_toe_tow <- getFloat64le
_msgEphemerisDepB_toe_wn <- getWord16le
_msgEphemerisDepB_toc_tow <- getFloat64le
_msgEphemerisDepB_toc_wn <- getWord16le
_msgEphemerisDepB_valid <- getWord8
_msgEphemerisDepB_healthy <- getWord8
_msgEphemerisDepB_prn <- getWord8
_msgEphemerisDepB_iode <- getWord8
return MsgEphemerisDepB {..}
put MsgEphemerisDepB {..} = do
putFloat64le _msgEphemerisDepB_tgd
putFloat64le _msgEphemerisDepB_c_rs
putFloat64le _msgEphemerisDepB_c_rc
putFloat64le _msgEphemerisDepB_c_uc
putFloat64le _msgEphemerisDepB_c_us
putFloat64le _msgEphemerisDepB_c_ic
putFloat64le _msgEphemerisDepB_c_is
putFloat64le _msgEphemerisDepB_dn
putFloat64le _msgEphemerisDepB_m0
putFloat64le _msgEphemerisDepB_ecc
putFloat64le _msgEphemerisDepB_sqrta
putFloat64le _msgEphemerisDepB_omega0
putFloat64le _msgEphemerisDepB_omegadot
putFloat64le _msgEphemerisDepB_w
putFloat64le _msgEphemerisDepB_inc
putFloat64le _msgEphemerisDepB_inc_dot
putFloat64le _msgEphemerisDepB_af0
putFloat64le _msgEphemerisDepB_af1
putFloat64le _msgEphemerisDepB_af2
putFloat64le _msgEphemerisDepB_toe_tow
putWord16le _msgEphemerisDepB_toe_wn
putFloat64le _msgEphemerisDepB_toc_tow
putWord16le _msgEphemerisDepB_toc_wn
putWord8 _msgEphemerisDepB_valid
putWord8 _msgEphemerisDepB_healthy
putWord8 _msgEphemerisDepB_prn
putWord8 _msgEphemerisDepB_iode
$(deriveSBP 'msgEphemerisDepB ''MsgEphemerisDepB)
$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgEphemerisDepB_" . stripPrefix "_msgEphemerisDepB_"}
''MsgEphemerisDepB)
$(makeLenses ''MsgEphemerisDepB)
data PackedObsContentDepA = PackedObsContentDepA
{ _packedObsContentDepA_P :: Word32
, _packedObsContentDepA_L :: CarrierPhase
, _packedObsContentDepA_cn0 :: Word8
, _packedObsContentDepA_lock :: Word16
, _packedObsContentDepA_prn :: Word8
} deriving ( Show, Read, Eq )
instance Binary PackedObsContentDepA where
get = do
_packedObsContentDepA_P <- getWord32le
_packedObsContentDepA_L <- get
_packedObsContentDepA_cn0 <- getWord8
_packedObsContentDepA_lock <- getWord16le
_packedObsContentDepA_prn <- getWord8
return PackedObsContentDepA {..}
put PackedObsContentDepA {..} = do
putWord32le _packedObsContentDepA_P
put _packedObsContentDepA_L
putWord8 _packedObsContentDepA_cn0
putWord16le _packedObsContentDepA_lock
putWord8 _packedObsContentDepA_prn
$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_packedObsContentDepA_" . stripPrefix "_packedObsContentDepA_"}
''PackedObsContentDepA)
$(makeLenses ''PackedObsContentDepA)
msgObsDepA :: Word16
msgObsDepA = 0x0045
data MsgObsDepA = MsgObsDepA
{ _msgObsDepA_header :: ObservationHeader
, _msgObsDepA_obs :: [PackedObsContentDepA]
} deriving ( Show, Read, Eq )
instance Binary MsgObsDepA where
get = do
_msgObsDepA_header <- get
_msgObsDepA_obs <- whileM (liftM not isEmpty) get
return MsgObsDepA {..}
put MsgObsDepA {..} = do
put _msgObsDepA_header
mapM_ put _msgObsDepA_obs
$(deriveSBP 'msgObsDepA ''MsgObsDepA)
$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgObsDepA_" . stripPrefix "_msgObsDepA_"}
''MsgObsDepA)
$(makeLenses ''MsgObsDepA)