module SwiftNav.SBP.Tracking 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 TrackingChannelState = TrackingChannelState
{ trackingChannelStateState :: Word8
, trackingChannelStateSid :: Word32
, trackingChannelStateCn0 :: Float
} deriving ( Show, Read, Eq )
instance Binary TrackingChannelState where
get = do
trackingChannelStateState <- getWord8
trackingChannelStateSid <- getWord32le
trackingChannelStateCn0 <- getFloat32le
return TrackingChannelState {..}
put TrackingChannelState {..} = do
putWord8 trackingChannelStateState
putWord32le trackingChannelStateSid
putFloat32le trackingChannelStateCn0
msgTrackingState :: Word16
msgTrackingState = 0x0013
data MsgTrackingState = MsgTrackingState
{ msgTrackingStateStates :: [TrackingChannelState]
} deriving ( Show, Read, Eq )
instance Binary MsgTrackingState where
get = do
msgTrackingStateStates <- whileM (liftM not isEmpty) get
return MsgTrackingState {..}
put MsgTrackingState {..} = do
mapM_ put msgTrackingStateStates
data TrackingChannelCorrelation = TrackingChannelCorrelation
{ trackingChannelCorrelationI :: Int32
, trackingChannelCorrelationQ :: Int32
} deriving ( Show, Read, Eq )
instance Binary TrackingChannelCorrelation where
get = do
trackingChannelCorrelationI <- liftM fromIntegral getWord32le
trackingChannelCorrelationQ <- liftM fromIntegral getWord32le
return TrackingChannelCorrelation {..}
put TrackingChannelCorrelation {..} = do
putWord32le $ fromIntegral trackingChannelCorrelationI
putWord32le $ fromIntegral trackingChannelCorrelationQ
msgTrackingIq :: Word16
msgTrackingIq = 0x001C
data MsgTrackingIq = MsgTrackingIq
{ msgTrackingIqChannel :: Word8
, msgTrackingIqSid :: Word32
, msgTrackingIqCorrs :: [TrackingChannelCorrelation]
} deriving ( Show, Read, Eq )
instance Binary MsgTrackingIq where
get = do
msgTrackingIqChannel <- getWord8
msgTrackingIqSid <- getWord32le
msgTrackingIqCorrs <- replicateM 3 get
return MsgTrackingIq {..}
put MsgTrackingIq {..} = do
putWord8 msgTrackingIqChannel
putWord32le msgTrackingIqSid
mapM_ put msgTrackingIqCorrs
data TrackingChannelStateDepA = TrackingChannelStateDepA
{ trackingChannelStateDepAState :: Word8
, trackingChannelStateDepAPrn :: Word8
, trackingChannelStateDepACn0 :: Float
} deriving ( Show, Read, Eq )
instance Binary TrackingChannelStateDepA where
get = do
trackingChannelStateDepAState <- getWord8
trackingChannelStateDepAPrn <- getWord8
trackingChannelStateDepACn0 <- getFloat32le
return TrackingChannelStateDepA {..}
put TrackingChannelStateDepA {..} = do
putWord8 trackingChannelStateDepAState
putWord8 trackingChannelStateDepAPrn
putFloat32le trackingChannelStateDepACn0
msgTrackingStateDepA :: Word16
msgTrackingStateDepA = 0x0016
data MsgTrackingStateDepA = MsgTrackingStateDepA
{ msgTrackingStateDepAStates :: [TrackingChannelStateDepA]
} deriving ( Show, Read, Eq )
instance Binary MsgTrackingStateDepA where
get = do
msgTrackingStateDepAStates <- whileM (liftM not isEmpty) get
return MsgTrackingStateDepA {..}
put MsgTrackingStateDepA {..} = do
mapM_ put msgTrackingStateDepAStates