module SwiftNav.SBP.Navigation 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 msgGpsTime :: Word16 msgGpsTime = 0x0100 data MsgGpsTime = MsgGpsTime { msgGpsTimeWn :: Word16 , msgGpsTimeTow :: Word32 , msgGpsTimeNs :: Int32 , msgGpsTimeFlags :: Word8 } deriving ( Show, Read, Eq ) instance Binary MsgGpsTime where get = do msgGpsTimeWn <- getWord16le msgGpsTimeTow <- getWord32le msgGpsTimeNs <- liftM fromIntegral getWord32le msgGpsTimeFlags <- getWord8 return MsgGpsTime {..} put MsgGpsTime {..} = do putWord16le msgGpsTimeWn putWord32le msgGpsTimeTow putWord32le $ fromIntegral msgGpsTimeNs putWord8 msgGpsTimeFlags msgDops :: Word16 msgDops = 0x0206 data MsgDops = MsgDops { msgDopsTow :: Word32 , msgDopsGdop :: Word16 , msgDopsPdop :: Word16 , msgDopsTdop :: Word16 , msgDopsHdop :: Word16 , msgDopsVdop :: Word16 } deriving ( Show, Read, Eq ) instance Binary MsgDops where get = do msgDopsTow <- getWord32le msgDopsGdop <- getWord16le msgDopsPdop <- getWord16le msgDopsTdop <- getWord16le msgDopsHdop <- getWord16le msgDopsVdop <- getWord16le return MsgDops {..} put MsgDops {..} = do putWord32le msgDopsTow putWord16le msgDopsGdop putWord16le msgDopsPdop putWord16le msgDopsTdop putWord16le msgDopsHdop putWord16le msgDopsVdop msgPosEcef :: Word16 msgPosEcef = 0x0200 data MsgPosEcef = MsgPosEcef { msgPosEcefTow :: Word32 , msgPosEcefX :: Double , msgPosEcefY :: Double , msgPosEcefZ :: Double , msgPosEcefAccuracy :: Word16 , msgPosEcefNSats :: Word8 , msgPosEcefFlags :: Word8 } deriving ( Show, Read, Eq ) instance Binary MsgPosEcef where get = do msgPosEcefTow <- getWord32le msgPosEcefX <- getFloat64le msgPosEcefY <- getFloat64le msgPosEcefZ <- getFloat64le msgPosEcefAccuracy <- getWord16le msgPosEcefNSats <- getWord8 msgPosEcefFlags <- getWord8 return MsgPosEcef {..} put MsgPosEcef {..} = do putWord32le msgPosEcefTow putFloat64le msgPosEcefX putFloat64le msgPosEcefY putFloat64le msgPosEcefZ putWord16le msgPosEcefAccuracy putWord8 msgPosEcefNSats putWord8 msgPosEcefFlags msgPosLlh :: Word16 msgPosLlh = 0x0201 data MsgPosLlh = MsgPosLlh { msgPosLlhTow :: Word32 , msgPosLlhLat :: Double , msgPosLlhLon :: Double , msgPosLlhHeight :: Double , msgPosLlhHAccuracy :: Word16 , msgPosLlhVAccuracy :: Word16 , msgPosLlhNSats :: Word8 , msgPosLlhFlags :: Word8 } deriving ( Show, Read, Eq ) instance Binary MsgPosLlh where get = do msgPosLlhTow <- getWord32le msgPosLlhLat <- getFloat64le msgPosLlhLon <- getFloat64le msgPosLlhHeight <- getFloat64le msgPosLlhHAccuracy <- getWord16le msgPosLlhVAccuracy <- getWord16le msgPosLlhNSats <- getWord8 msgPosLlhFlags <- getWord8 return MsgPosLlh {..} put MsgPosLlh {..} = do putWord32le msgPosLlhTow putFloat64le msgPosLlhLat putFloat64le msgPosLlhLon putFloat64le msgPosLlhHeight putWord16le msgPosLlhHAccuracy putWord16le msgPosLlhVAccuracy putWord8 msgPosLlhNSats putWord8 msgPosLlhFlags msgBaselineEcef :: Word16 msgBaselineEcef = 0x0202 data MsgBaselineEcef = MsgBaselineEcef { msgBaselineEcefTow :: Word32 , msgBaselineEcefX :: Int32 , msgBaselineEcefY :: Int32 , msgBaselineEcefZ :: Int32 , msgBaselineEcefAccuracy :: Word16 , msgBaselineEcefNSats :: Word8 , msgBaselineEcefFlags :: Word8 } deriving ( Show, Read, Eq ) instance Binary MsgBaselineEcef where get = do msgBaselineEcefTow <- getWord32le msgBaselineEcefX <- liftM fromIntegral getWord32le msgBaselineEcefY <- liftM fromIntegral getWord32le msgBaselineEcefZ <- liftM fromIntegral getWord32le msgBaselineEcefAccuracy <- getWord16le msgBaselineEcefNSats <- getWord8 msgBaselineEcefFlags <- getWord8 return MsgBaselineEcef {..} put MsgBaselineEcef {..} = do putWord32le msgBaselineEcefTow putWord32le $ fromIntegral msgBaselineEcefX putWord32le $ fromIntegral msgBaselineEcefY putWord32le $ fromIntegral msgBaselineEcefZ putWord16le msgBaselineEcefAccuracy putWord8 msgBaselineEcefNSats putWord8 msgBaselineEcefFlags msgBaselineNed :: Word16 msgBaselineNed = 0x0203 data MsgBaselineNed = MsgBaselineNed { msgBaselineNedTow :: Word32 , msgBaselineNedN :: Int32 , msgBaselineNedE :: Int32 , msgBaselineNedD :: Int32 , msgBaselineNedHAccuracy :: Word16 , msgBaselineNedVAccuracy :: Word16 , msgBaselineNedNSats :: Word8 , msgBaselineNedFlags :: Word8 } deriving ( Show, Read, Eq ) instance Binary MsgBaselineNed where get = do msgBaselineNedTow <- getWord32le msgBaselineNedN <- liftM fromIntegral getWord32le msgBaselineNedE <- liftM fromIntegral getWord32le msgBaselineNedD <- liftM fromIntegral getWord32le msgBaselineNedHAccuracy <- getWord16le msgBaselineNedVAccuracy <- getWord16le msgBaselineNedNSats <- getWord8 msgBaselineNedFlags <- getWord8 return MsgBaselineNed {..} put MsgBaselineNed {..} = do putWord32le msgBaselineNedTow putWord32le $ fromIntegral msgBaselineNedN putWord32le $ fromIntegral msgBaselineNedE putWord32le $ fromIntegral msgBaselineNedD putWord16le msgBaselineNedHAccuracy putWord16le msgBaselineNedVAccuracy putWord8 msgBaselineNedNSats putWord8 msgBaselineNedFlags msgVelEcef :: Word16 msgVelEcef = 0x0204 data MsgVelEcef = MsgVelEcef { msgVelEcefTow :: Word32 , msgVelEcefX :: Int32 , msgVelEcefY :: Int32 , msgVelEcefZ :: Int32 , msgVelEcefAccuracy :: Word16 , msgVelEcefNSats :: Word8 , msgVelEcefFlags :: Word8 } deriving ( Show, Read, Eq ) instance Binary MsgVelEcef where get = do msgVelEcefTow <- getWord32le msgVelEcefX <- liftM fromIntegral getWord32le msgVelEcefY <- liftM fromIntegral getWord32le msgVelEcefZ <- liftM fromIntegral getWord32le msgVelEcefAccuracy <- getWord16le msgVelEcefNSats <- getWord8 msgVelEcefFlags <- getWord8 return MsgVelEcef {..} put MsgVelEcef {..} = do putWord32le msgVelEcefTow putWord32le $ fromIntegral msgVelEcefX putWord32le $ fromIntegral msgVelEcefY putWord32le $ fromIntegral msgVelEcefZ putWord16le msgVelEcefAccuracy putWord8 msgVelEcefNSats putWord8 msgVelEcefFlags msgVelNed :: Word16 msgVelNed = 0x0205 data MsgVelNed = MsgVelNed { msgVelNedTow :: Word32 , msgVelNedN :: Int32 , msgVelNedE :: Int32 , msgVelNedD :: Int32 , msgVelNedHAccuracy :: Word16 , msgVelNedVAccuracy :: Word16 , msgVelNedNSats :: Word8 , msgVelNedFlags :: Word8 } deriving ( Show, Read, Eq ) instance Binary MsgVelNed where get = do msgVelNedTow <- getWord32le msgVelNedN <- liftM fromIntegral getWord32le msgVelNedE <- liftM fromIntegral getWord32le msgVelNedD <- liftM fromIntegral getWord32le msgVelNedHAccuracy <- getWord16le msgVelNedVAccuracy <- getWord16le msgVelNedNSats <- getWord8 msgVelNedFlags <- getWord8 return MsgVelNed {..} put MsgVelNed {..} = do putWord32le msgVelNedTow putWord32le $ fromIntegral msgVelNedN putWord32le $ fromIntegral msgVelNedE putWord32le $ fromIntegral msgVelNedD putWord16le msgVelNedHAccuracy putWord16le msgVelNedVAccuracy putWord8 msgVelNedNSats putWord8 msgVelNedFlags