module SwiftNav.SBP.Piksi 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 msgAlmanac :: Word16 msgAlmanac = 0x0069 data MsgAlmanac = MsgAlmanac deriving ( Show, Read, Eq ) instance Binary MsgAlmanac where get = return MsgAlmanac put MsgAlmanac = return () msgSetTime :: Word16 msgSetTime = 0x0068 data MsgSetTime = MsgSetTime deriving ( Show, Read, Eq ) instance Binary MsgSetTime where get = return MsgSetTime put MsgSetTime = return () msgReset :: Word16 msgReset = 0x00B2 data MsgReset = MsgReset deriving ( Show, Read, Eq ) instance Binary MsgReset where get = return MsgReset put MsgReset = return () msgCwResults :: Word16 msgCwResults = 0x00C0 data MsgCwResults = MsgCwResults deriving ( Show, Read, Eq ) instance Binary MsgCwResults where get = return MsgCwResults put MsgCwResults = return () msgCwStart :: Word16 msgCwStart = 0x00C1 data MsgCwStart = MsgCwStart deriving ( Show, Read, Eq ) instance Binary MsgCwStart where get = return MsgCwStart put MsgCwStart = return () msgResetFilters :: Word16 msgResetFilters = 0x0022 data MsgResetFilters = MsgResetFilters { msgResetFiltersFilter :: Word8 } deriving ( Show, Read, Eq ) instance Binary MsgResetFilters where get = do msgResetFiltersFilter <- getWord8 return MsgResetFilters {..} put MsgResetFilters {..} = do putWord8 msgResetFiltersFilter msgInitBase :: Word16 msgInitBase = 0x0023 data MsgInitBase = MsgInitBase deriving ( Show, Read, Eq ) instance Binary MsgInitBase where get = return MsgInitBase put MsgInitBase = return () msgThreadState :: Word16 msgThreadState = 0x0017 data MsgThreadState = MsgThreadState { msgThreadStateName :: ByteString , msgThreadStateCpu :: Word16 , msgThreadStateStackFree :: Word32 } deriving ( Show, Read, Eq ) instance Binary MsgThreadState where get = do msgThreadStateName <- getByteString 20 msgThreadStateCpu <- getWord16le msgThreadStateStackFree <- getWord32le return MsgThreadState {..} put MsgThreadState {..} = do putByteString msgThreadStateName putWord16le msgThreadStateCpu putWord32le msgThreadStateStackFree data UARTChannel = UARTChannel { uARTChannelTxThroughput :: Float , uARTChannelRxThroughput :: Float , uARTChannelCrcErrorCount :: Word16 , uARTChannelIoErrorCount :: Word16 , uARTChannelTxBufferLevel :: Word8 , uARTChannelRxBufferLevel :: Word8 } deriving ( Show, Read, Eq ) instance Binary UARTChannel where get = do uARTChannelTxThroughput <- getFloat32le uARTChannelRxThroughput <- getFloat32le uARTChannelCrcErrorCount <- getWord16le uARTChannelIoErrorCount <- getWord16le uARTChannelTxBufferLevel <- getWord8 uARTChannelRxBufferLevel <- getWord8 return UARTChannel {..} put UARTChannel {..} = do putFloat32le uARTChannelTxThroughput putFloat32le uARTChannelRxThroughput putWord16le uARTChannelCrcErrorCount putWord16le uARTChannelIoErrorCount putWord8 uARTChannelTxBufferLevel putWord8 uARTChannelRxBufferLevel data Latency = Latency { latencyAvg :: Int32 , latencyLmin :: Int32 , latencyLmax :: Int32 , latencyCurrent :: Int32 } deriving ( Show, Read, Eq ) instance Binary Latency where get = do latencyAvg <- liftM fromIntegral getWord32le latencyLmin <- liftM fromIntegral getWord32le latencyLmax <- liftM fromIntegral getWord32le latencyCurrent <- liftM fromIntegral getWord32le return Latency {..} put Latency {..} = do putWord32le $ fromIntegral latencyAvg putWord32le $ fromIntegral latencyLmin putWord32le $ fromIntegral latencyLmax putWord32le $ fromIntegral latencyCurrent msgUartState :: Word16 msgUartState = 0x0018 data MsgUartState = MsgUartState { msgUartStateUartA :: UARTChannel , msgUartStateUartB :: UARTChannel , msgUartStateUartFtdi :: UARTChannel , msgUartStateLatency :: Latency } deriving ( Show, Read, Eq ) instance Binary MsgUartState where get = do msgUartStateUartA <- get msgUartStateUartB <- get msgUartStateUartFtdi <- get msgUartStateLatency <- get return MsgUartState {..} put MsgUartState {..} = do put msgUartStateUartA put msgUartStateUartB put msgUartStateUartFtdi put msgUartStateLatency msgIarState :: Word16 msgIarState = 0x0019 data MsgIarState = MsgIarState { msgIarStateNumHyps :: Word32 } deriving ( Show, Read, Eq ) instance Binary MsgIarState where get = do msgIarStateNumHyps <- getWord32le return MsgIarState {..} put MsgIarState {..} = do putWord32le msgIarStateNumHyps msgMaskSatellite :: Word16 msgMaskSatellite = 0x001B data MsgMaskSatellite = MsgMaskSatellite { msgMaskSatelliteMask :: Word8 , msgMaskSatelliteSid :: Word32 } deriving ( Show, Read, Eq ) instance Binary MsgMaskSatellite where get = do msgMaskSatelliteMask <- getWord8 msgMaskSatelliteSid <- getWord32le return MsgMaskSatellite {..} put MsgMaskSatellite {..} = do putWord8 msgMaskSatelliteMask putWord32le msgMaskSatelliteSid