module SwiftNav.SBP.Observation where
import Control.Monad
import Control.Monad.Loops
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
data ObsGPSTime = ObsGPSTime
{ obsGPSTimeTow :: Word32
, obsGPSTimeWn :: Word16
} deriving ( Show, Read, Eq )
instance Binary ObsGPSTime where
get = do
obsGPSTimeTow <- getWord32le
obsGPSTimeWn <- getWord16le
return ObsGPSTime {..}
put ObsGPSTime {..} = do
putWord32le obsGPSTimeTow
putWord16le obsGPSTimeWn
data CarrierPhase = CarrierPhase
{ carrierPhaseI :: Int32
, carrierPhaseF :: Word8
} deriving ( Show, Read, Eq )
instance Binary CarrierPhase where
get = do
carrierPhaseI <- liftM fromIntegral getWord32le
carrierPhaseF <- getWord8
return CarrierPhase {..}
put CarrierPhase {..} = do
putWord32le $ fromIntegral carrierPhaseI
putWord8 carrierPhaseF
data ObservationHeader = ObservationHeader
{ observationHeaderT :: ObsGPSTime
, observationHeaderNObs :: Word8
} deriving ( Show, Read, Eq )
instance Binary ObservationHeader where
get = do
observationHeaderT <- get
observationHeaderNObs <- getWord8
return ObservationHeader {..}
put ObservationHeader {..} = do
put observationHeaderT
putWord8 observationHeaderNObs
data PackedObsContent = PackedObsContent
{ packedObsContentP :: Word32
, packedObsContentL :: CarrierPhase
, packedObsContentCn0 :: Word8
, packedObsContentLock :: Word16
, packedObsContentSid :: Word32
} deriving ( Show, Read, Eq )
instance Binary PackedObsContent where
get = do
packedObsContentP <- getWord32le
packedObsContentL <- get
packedObsContentCn0 <- getWord8
packedObsContentLock <- getWord16le
packedObsContentSid <- getWord32le
return PackedObsContent {..}
put PackedObsContent {..} = do
putWord32le packedObsContentP
put packedObsContentL
putWord8 packedObsContentCn0
putWord16le packedObsContentLock
putWord32le packedObsContentSid
msgObs :: Word16
msgObs = 0x0043
data MsgObs = MsgObs
{ msgObsHeader :: ObservationHeader
, msgObsObs :: [PackedObsContent]
} deriving ( Show, Read, Eq )
instance Binary MsgObs where
get = do
msgObsHeader <- get
msgObsObs <- whileM (liftM not isEmpty) get
return MsgObs {..}
put MsgObs {..} = do
put msgObsHeader
mapM_ put msgObsObs
msgBasePos :: Word16
msgBasePos = 0x0044
data MsgBasePos = MsgBasePos
{ msgBasePosLat :: Double
, msgBasePosLon :: Double
, msgBasePosHeight :: Double
} deriving ( Show, Read, Eq )
instance Binary MsgBasePos where
get = do
msgBasePosLat <- getFloat64le
msgBasePosLon <- getFloat64le
msgBasePosHeight <- getFloat64le
return MsgBasePos {..}
put MsgBasePos {..} = do
putFloat64le msgBasePosLat
putFloat64le msgBasePosLon
putFloat64le msgBasePosHeight
msgEphemeris :: Word16
msgEphemeris = 0x0047
data MsgEphemeris = MsgEphemeris
{ msgEphemerisTgd :: Double
, msgEphemerisCRs :: Double
, msgEphemerisCRc :: Double
, msgEphemerisCUc :: Double
, msgEphemerisCUs :: Double
, msgEphemerisCIc :: Double
, msgEphemerisCIs :: Double
, msgEphemerisDn :: Double
, msgEphemerisM0 :: Double
, msgEphemerisEcc :: Double
, msgEphemerisSqrta :: Double
, msgEphemerisOmega0 :: Double
, msgEphemerisOmegadot :: Double
, msgEphemerisW :: Double
, msgEphemerisInc :: Double
, msgEphemerisIncDot :: Double
, msgEphemerisAf0 :: Double
, msgEphemerisAf1 :: Double
, msgEphemerisAf2 :: Double
, msgEphemerisToeTow :: Double
, msgEphemerisToeWn :: Word16
, msgEphemerisTocTow :: Double
, msgEphemerisTocWn :: Word16
, msgEphemerisValid :: Word8
, msgEphemerisHealthy :: Word8
, msgEphemerisSid :: Word32
, msgEphemerisIode :: Word8
, msgEphemerisIodc :: Word16
, msgEphemerisReserved :: Word32
} deriving ( Show, Read, Eq )
instance Binary MsgEphemeris where
get = do
msgEphemerisTgd <- getFloat64le
msgEphemerisCRs <- getFloat64le
msgEphemerisCRc <- getFloat64le
msgEphemerisCUc <- getFloat64le
msgEphemerisCUs <- getFloat64le
msgEphemerisCIc <- getFloat64le
msgEphemerisCIs <- getFloat64le
msgEphemerisDn <- getFloat64le
msgEphemerisM0 <- getFloat64le
msgEphemerisEcc <- getFloat64le
msgEphemerisSqrta <- getFloat64le
msgEphemerisOmega0 <- getFloat64le
msgEphemerisOmegadot <- getFloat64le
msgEphemerisW <- getFloat64le
msgEphemerisInc <- getFloat64le
msgEphemerisIncDot <- getFloat64le
msgEphemerisAf0 <- getFloat64le
msgEphemerisAf1 <- getFloat64le
msgEphemerisAf2 <- getFloat64le
msgEphemerisToeTow <- getFloat64le
msgEphemerisToeWn <- getWord16le
msgEphemerisTocTow <- getFloat64le
msgEphemerisTocWn <- getWord16le
msgEphemerisValid <- getWord8
msgEphemerisHealthy <- getWord8
msgEphemerisSid <- getWord32le
msgEphemerisIode <- getWord8
msgEphemerisIodc <- getWord16le
msgEphemerisReserved <- getWord32le
return MsgEphemeris {..}
put MsgEphemeris {..} = do
putFloat64le msgEphemerisTgd
putFloat64le msgEphemerisCRs
putFloat64le msgEphemerisCRc
putFloat64le msgEphemerisCUc
putFloat64le msgEphemerisCUs
putFloat64le msgEphemerisCIc
putFloat64le msgEphemerisCIs
putFloat64le msgEphemerisDn
putFloat64le msgEphemerisM0
putFloat64le msgEphemerisEcc
putFloat64le msgEphemerisSqrta
putFloat64le msgEphemerisOmega0
putFloat64le msgEphemerisOmegadot
putFloat64le msgEphemerisW
putFloat64le msgEphemerisInc
putFloat64le msgEphemerisIncDot
putFloat64le msgEphemerisAf0
putFloat64le msgEphemerisAf1
putFloat64le msgEphemerisAf2
putFloat64le msgEphemerisToeTow
putWord16le msgEphemerisToeWn
putFloat64le msgEphemerisTocTow
putWord16le msgEphemerisTocWn
putWord8 msgEphemerisValid
putWord8 msgEphemerisHealthy
putWord32le msgEphemerisSid
putWord8 msgEphemerisIode
putWord16le msgEphemerisIodc
putWord32le msgEphemerisReserved
msgEphemerisDepA :: Word16
msgEphemerisDepA = 0x001A
data MsgEphemerisDepA = MsgEphemerisDepA
{ msgEphemerisDepATgd :: Double
, msgEphemerisDepACRs :: Double
, msgEphemerisDepACRc :: Double
, msgEphemerisDepACUc :: Double
, msgEphemerisDepACUs :: Double
, msgEphemerisDepACIc :: Double
, msgEphemerisDepACIs :: Double
, msgEphemerisDepADn :: Double
, msgEphemerisDepAM0 :: Double
, msgEphemerisDepAEcc :: Double
, msgEphemerisDepASqrta :: Double
, msgEphemerisDepAOmega0 :: Double
, msgEphemerisDepAOmegadot :: Double
, msgEphemerisDepAW :: Double
, msgEphemerisDepAInc :: Double
, msgEphemerisDepAIncDot :: Double
, msgEphemerisDepAAf0 :: Double
, msgEphemerisDepAAf1 :: Double
, msgEphemerisDepAAf2 :: Double
, msgEphemerisDepAToeTow :: Double
, msgEphemerisDepAToeWn :: Word16
, msgEphemerisDepATocTow :: Double
, msgEphemerisDepATocWn :: Word16
, msgEphemerisDepAValid :: Word8
, msgEphemerisDepAHealthy :: Word8
, msgEphemerisDepAPrn :: Word8
} deriving ( Show, Read, Eq )
instance Binary MsgEphemerisDepA where
get = do
msgEphemerisDepATgd <- getFloat64le
msgEphemerisDepACRs <- getFloat64le
msgEphemerisDepACRc <- getFloat64le
msgEphemerisDepACUc <- getFloat64le
msgEphemerisDepACUs <- getFloat64le
msgEphemerisDepACIc <- getFloat64le
msgEphemerisDepACIs <- getFloat64le
msgEphemerisDepADn <- getFloat64le
msgEphemerisDepAM0 <- getFloat64le
msgEphemerisDepAEcc <- getFloat64le
msgEphemerisDepASqrta <- getFloat64le
msgEphemerisDepAOmega0 <- getFloat64le
msgEphemerisDepAOmegadot <- getFloat64le
msgEphemerisDepAW <- getFloat64le
msgEphemerisDepAInc <- getFloat64le
msgEphemerisDepAIncDot <- getFloat64le
msgEphemerisDepAAf0 <- getFloat64le
msgEphemerisDepAAf1 <- getFloat64le
msgEphemerisDepAAf2 <- getFloat64le
msgEphemerisDepAToeTow <- getFloat64le
msgEphemerisDepAToeWn <- getWord16le
msgEphemerisDepATocTow <- getFloat64le
msgEphemerisDepATocWn <- getWord16le
msgEphemerisDepAValid <- getWord8
msgEphemerisDepAHealthy <- getWord8
msgEphemerisDepAPrn <- getWord8
return MsgEphemerisDepA {..}
put MsgEphemerisDepA {..} = do
putFloat64le msgEphemerisDepATgd
putFloat64le msgEphemerisDepACRs
putFloat64le msgEphemerisDepACRc
putFloat64le msgEphemerisDepACUc
putFloat64le msgEphemerisDepACUs
putFloat64le msgEphemerisDepACIc
putFloat64le msgEphemerisDepACIs
putFloat64le msgEphemerisDepADn
putFloat64le msgEphemerisDepAM0
putFloat64le msgEphemerisDepAEcc
putFloat64le msgEphemerisDepASqrta
putFloat64le msgEphemerisDepAOmega0
putFloat64le msgEphemerisDepAOmegadot
putFloat64le msgEphemerisDepAW
putFloat64le msgEphemerisDepAInc
putFloat64le msgEphemerisDepAIncDot
putFloat64le msgEphemerisDepAAf0
putFloat64le msgEphemerisDepAAf1
putFloat64le msgEphemerisDepAAf2
putFloat64le msgEphemerisDepAToeTow
putWord16le msgEphemerisDepAToeWn
putFloat64le msgEphemerisDepATocTow
putWord16le msgEphemerisDepATocWn
putWord8 msgEphemerisDepAValid
putWord8 msgEphemerisDepAHealthy
putWord8 msgEphemerisDepAPrn
msgEphemerisDepB :: Word16
msgEphemerisDepB = 0x0046
data MsgEphemerisDepB = MsgEphemerisDepB
{ msgEphemerisDepBTgd :: Double
, msgEphemerisDepBCRs :: Double
, msgEphemerisDepBCRc :: Double
, msgEphemerisDepBCUc :: Double
, msgEphemerisDepBCUs :: Double
, msgEphemerisDepBCIc :: Double
, msgEphemerisDepBCIs :: Double
, msgEphemerisDepBDn :: Double
, msgEphemerisDepBM0 :: Double
, msgEphemerisDepBEcc :: Double
, msgEphemerisDepBSqrta :: Double
, msgEphemerisDepBOmega0 :: Double
, msgEphemerisDepBOmegadot :: Double
, msgEphemerisDepBW :: Double
, msgEphemerisDepBInc :: Double
, msgEphemerisDepBIncDot :: Double
, msgEphemerisDepBAf0 :: Double
, msgEphemerisDepBAf1 :: Double
, msgEphemerisDepBAf2 :: Double
, msgEphemerisDepBToeTow :: Double
, msgEphemerisDepBToeWn :: Word16
, msgEphemerisDepBTocTow :: Double
, msgEphemerisDepBTocWn :: Word16
, msgEphemerisDepBValid :: Word8
, msgEphemerisDepBHealthy :: Word8
, msgEphemerisDepBPrn :: Word8
, msgEphemerisDepBIode :: Word8
} deriving ( Show, Read, Eq )
instance Binary MsgEphemerisDepB where
get = do
msgEphemerisDepBTgd <- getFloat64le
msgEphemerisDepBCRs <- getFloat64le
msgEphemerisDepBCRc <- getFloat64le
msgEphemerisDepBCUc <- getFloat64le
msgEphemerisDepBCUs <- getFloat64le
msgEphemerisDepBCIc <- getFloat64le
msgEphemerisDepBCIs <- getFloat64le
msgEphemerisDepBDn <- getFloat64le
msgEphemerisDepBM0 <- getFloat64le
msgEphemerisDepBEcc <- getFloat64le
msgEphemerisDepBSqrta <- getFloat64le
msgEphemerisDepBOmega0 <- getFloat64le
msgEphemerisDepBOmegadot <- getFloat64le
msgEphemerisDepBW <- getFloat64le
msgEphemerisDepBInc <- getFloat64le
msgEphemerisDepBIncDot <- getFloat64le
msgEphemerisDepBAf0 <- getFloat64le
msgEphemerisDepBAf1 <- getFloat64le
msgEphemerisDepBAf2 <- getFloat64le
msgEphemerisDepBToeTow <- getFloat64le
msgEphemerisDepBToeWn <- getWord16le
msgEphemerisDepBTocTow <- getFloat64le
msgEphemerisDepBTocWn <- getWord16le
msgEphemerisDepBValid <- getWord8
msgEphemerisDepBHealthy <- getWord8
msgEphemerisDepBPrn <- getWord8
msgEphemerisDepBIode <- getWord8
return MsgEphemerisDepB {..}
put MsgEphemerisDepB {..} = do
putFloat64le msgEphemerisDepBTgd
putFloat64le msgEphemerisDepBCRs
putFloat64le msgEphemerisDepBCRc
putFloat64le msgEphemerisDepBCUc
putFloat64le msgEphemerisDepBCUs
putFloat64le msgEphemerisDepBCIc
putFloat64le msgEphemerisDepBCIs
putFloat64le msgEphemerisDepBDn
putFloat64le msgEphemerisDepBM0
putFloat64le msgEphemerisDepBEcc
putFloat64le msgEphemerisDepBSqrta
putFloat64le msgEphemerisDepBOmega0
putFloat64le msgEphemerisDepBOmegadot
putFloat64le msgEphemerisDepBW
putFloat64le msgEphemerisDepBInc
putFloat64le msgEphemerisDepBIncDot
putFloat64le msgEphemerisDepBAf0
putFloat64le msgEphemerisDepBAf1
putFloat64le msgEphemerisDepBAf2
putFloat64le msgEphemerisDepBToeTow
putWord16le msgEphemerisDepBToeWn
putFloat64le msgEphemerisDepBTocTow
putWord16le msgEphemerisDepBTocWn
putWord8 msgEphemerisDepBValid
putWord8 msgEphemerisDepBHealthy
putWord8 msgEphemerisDepBPrn
putWord8 msgEphemerisDepBIode
data PackedObsContentDepA = PackedObsContentDepA
{ packedObsContentDepAP :: Word32
, packedObsContentDepAL :: CarrierPhase
, packedObsContentDepACn0 :: Word8
, packedObsContentDepALock :: Word16
, packedObsContentDepAPrn :: Word8
} deriving ( Show, Read, Eq )
instance Binary PackedObsContentDepA where
get = do
packedObsContentDepAP <- getWord32le
packedObsContentDepAL <- get
packedObsContentDepACn0 <- getWord8
packedObsContentDepALock <- getWord16le
packedObsContentDepAPrn <- getWord8
return PackedObsContentDepA {..}
put PackedObsContentDepA {..} = do
putWord32le packedObsContentDepAP
put packedObsContentDepAL
putWord8 packedObsContentDepACn0
putWord16le packedObsContentDepALock
putWord8 packedObsContentDepAPrn
msgObsDepA :: Word16
msgObsDepA = 0x0045
data MsgObsDepA = MsgObsDepA
{ msgObsDepAHeader :: ObservationHeader
, msgObsDepAObs :: [PackedObsContentDepA]
} deriving ( Show, Read, Eq )
instance Binary MsgObsDepA where
get = do
msgObsDepAHeader <- get
msgObsDepAObs <- whileM (liftM not isEmpty) get
return MsgObsDepA {..}
put MsgObsDepA {..} = do
put msgObsDepAHeader
mapM_ put msgObsDepAObs