sbp 2.1.3 → 2.1.5
raw patch · 6 files changed
+183/−15 lines, 6 files
Files
- sbp.cabal +2/−1
- src/SwiftNav/SBP.hs +20/−0
- src/SwiftNav/SBP/Gnss.hs +3/−1
- src/SwiftNav/SBP/Imu.hs +118/−0
- src/SwiftNav/SBP/Navigation.hs +8/−6
- src/SwiftNav/SBP/Piksi.hs +32/−7
sbp.cabal view
@@ -1,5 +1,5 @@ name: sbp-version: 2.1.3+version: 2.1.5 synopsis: SwiftNav's SBP Library homepage: https://github.com/swift-nav/libsbp license: LGPL-3@@ -31,6 +31,7 @@ , SwiftNav.SBP.FileIo , SwiftNav.SBP.Flash , SwiftNav.SBP.Gnss+ , SwiftNav.SBP.Imu , SwiftNav.SBP.Logging , SwiftNav.SBP.Navigation , SwiftNav.SBP.Observation
@@ -17,6 +17,7 @@ , module SwiftNav.SBP.FileIo , module SwiftNav.SBP.Flash , module SwiftNav.SBP.Gnss+ , module SwiftNav.SBP.Imu , module SwiftNav.SBP.Logging , module SwiftNav.SBP.Navigation , module SwiftNav.SBP.Observation@@ -38,6 +39,7 @@ import SwiftNav.SBP.FileIo import SwiftNav.SBP.Flash import SwiftNav.SBP.Gnss+import SwiftNav.SBP.Imu import SwiftNav.SBP.Logging import SwiftNav.SBP.Navigation import SwiftNav.SBP.Observation@@ -106,6 +108,8 @@ | SBPMsgGroupDelay MsgGroupDelay Msg | SBPMsgHeartbeat MsgHeartbeat Msg | SBPMsgIarState MsgIarState Msg+ | SBPMsgImuAux MsgImuAux Msg+ | SBPMsgImuRaw MsgImuRaw Msg | SBPMsgInitBase MsgInitBase Msg | SBPMsgIono MsgIono Msg | SBPMsgLog MsgLog Msg@@ -123,6 +127,7 @@ | SBPMsgPosLlhDepA MsgPosLlhDepA Msg | SBPMsgPrintDep MsgPrintDep Msg | SBPMsgReset MsgReset Msg+ | SBPMsgResetDep MsgResetDep Msg | SBPMsgResetFilters MsgResetFilters Msg | SBPMsgSetTime MsgSetTime Msg | SBPMsgSettingsReadByIndexDone MsgSettingsReadByIndexDone Msg@@ -218,6 +223,8 @@ | _msgSBPType == msgGroupDelay = SBPMsgGroupDelay (decode (fromStrict _msgSBPPayload)) m | _msgSBPType == msgHeartbeat = SBPMsgHeartbeat (decode (fromStrict _msgSBPPayload)) m | _msgSBPType == msgIarState = SBPMsgIarState (decode (fromStrict _msgSBPPayload)) m+ | _msgSBPType == msgImuAux = SBPMsgImuAux (decode (fromStrict _msgSBPPayload)) m+ | _msgSBPType == msgImuRaw = SBPMsgImuRaw (decode (fromStrict _msgSBPPayload)) m | _msgSBPType == msgInitBase = SBPMsgInitBase (decode (fromStrict _msgSBPPayload)) m | _msgSBPType == msgIono = SBPMsgIono (decode (fromStrict _msgSBPPayload)) m | _msgSBPType == msgLog = SBPMsgLog (decode (fromStrict _msgSBPPayload)) m@@ -235,6 +242,7 @@ | _msgSBPType == msgPosLlhDepA = SBPMsgPosLlhDepA (decode (fromStrict _msgSBPPayload)) m | _msgSBPType == msgPrintDep = SBPMsgPrintDep (decode (fromStrict _msgSBPPayload)) m | _msgSBPType == msgReset = SBPMsgReset (decode (fromStrict _msgSBPPayload)) m+ | _msgSBPType == msgResetDep = SBPMsgResetDep (decode (fromStrict _msgSBPPayload)) m | _msgSBPType == msgResetFilters = SBPMsgResetFilters (decode (fromStrict _msgSBPPayload)) m | _msgSBPType == msgSetTime = SBPMsgSetTime (decode (fromStrict _msgSBPPayload)) m | _msgSBPType == msgSettingsReadByIndexDone = SBPMsgSettingsReadByIndexDone (decode (fromStrict _msgSBPPayload)) m@@ -322,6 +330,8 @@ encode' (SBPMsgGroupDelay _ m) = put m encode' (SBPMsgHeartbeat _ m) = put m encode' (SBPMsgIarState _ m) = put m+ encode' (SBPMsgImuAux _ m) = put m+ encode' (SBPMsgImuRaw _ m) = put m encode' (SBPMsgInitBase _ m) = put m encode' (SBPMsgIono _ m) = put m encode' (SBPMsgLog _ m) = put m@@ -339,6 +349,7 @@ encode' (SBPMsgPosLlhDepA _ m) = put m encode' (SBPMsgPrintDep _ m) = put m encode' (SBPMsgReset _ m) = put m+ encode' (SBPMsgResetDep _ m) = put m encode' (SBPMsgResetFilters _ m) = put m encode' (SBPMsgSetTime _ m) = put m encode' (SBPMsgSettingsReadByIndexDone _ m) = put m@@ -429,6 +440,8 @@ | msgType == msgGroupDelay = SBPMsgGroupDelay <$> parseJSON obj <*> parseJSON obj | msgType == msgHeartbeat = SBPMsgHeartbeat <$> parseJSON obj <*> parseJSON obj | msgType == msgIarState = SBPMsgIarState <$> parseJSON obj <*> parseJSON obj+ | msgType == msgImuAux = SBPMsgImuAux <$> parseJSON obj <*> parseJSON obj+ | msgType == msgImuRaw = SBPMsgImuRaw <$> parseJSON obj <*> parseJSON obj | msgType == msgInitBase = SBPMsgInitBase <$> parseJSON obj <*> parseJSON obj | msgType == msgIono = SBPMsgIono <$> parseJSON obj <*> parseJSON obj | msgType == msgLog = SBPMsgLog <$> parseJSON obj <*> parseJSON obj@@ -446,6 +459,7 @@ | msgType == msgPosLlhDepA = SBPMsgPosLlhDepA <$> parseJSON obj <*> parseJSON obj | msgType == msgPrintDep = SBPMsgPrintDep <$> parseJSON obj <*> parseJSON obj | msgType == msgReset = SBPMsgReset <$> parseJSON obj <*> parseJSON obj+ | msgType == msgResetDep = SBPMsgResetDep <$> parseJSON obj <*> parseJSON obj | msgType == msgResetFilters = SBPMsgResetFilters <$> parseJSON obj <*> parseJSON obj | msgType == msgSetTime = SBPMsgSetTime <$> parseJSON obj <*> parseJSON obj | msgType == msgSettingsReadByIndexDone = SBPMsgSettingsReadByIndexDone <$> parseJSON obj <*> parseJSON obj@@ -538,6 +552,8 @@ toJSON (SBPMsgGroupDelay n m) = toJSON n `mergeValues` toJSON m toJSON (SBPMsgHeartbeat n m) = toJSON n `mergeValues` toJSON m toJSON (SBPMsgIarState n m) = toJSON n `mergeValues` toJSON m+ toJSON (SBPMsgImuAux n m) = toJSON n `mergeValues` toJSON m+ toJSON (SBPMsgImuRaw n m) = toJSON n `mergeValues` toJSON m toJSON (SBPMsgInitBase n m) = toJSON n `mergeValues` toJSON m toJSON (SBPMsgIono n m) = toJSON n `mergeValues` toJSON m toJSON (SBPMsgLog n m) = toJSON n `mergeValues` toJSON m@@ -555,6 +571,7 @@ toJSON (SBPMsgPosLlhDepA n m) = toJSON n `mergeValues` toJSON m toJSON (SBPMsgPrintDep n m) = toJSON n `mergeValues` toJSON m toJSON (SBPMsgReset n m) = toJSON n `mergeValues` toJSON m+ toJSON (SBPMsgResetDep n m) = toJSON n `mergeValues` toJSON m toJSON (SBPMsgResetFilters n m) = toJSON n `mergeValues` toJSON m toJSON (SBPMsgSetTime n m) = toJSON n `mergeValues` toJSON m toJSON (SBPMsgSettingsReadByIndexDone n m) = toJSON n `mergeValues` toJSON m@@ -641,6 +658,8 @@ msg f (SBPMsgGroupDelay n m) = SBPMsgGroupDelay n <$> f m msg f (SBPMsgHeartbeat n m) = SBPMsgHeartbeat n <$> f m msg f (SBPMsgIarState n m) = SBPMsgIarState n <$> f m+ msg f (SBPMsgImuAux n m) = SBPMsgImuAux n <$> f m+ msg f (SBPMsgImuRaw n m) = SBPMsgImuRaw n <$> f m msg f (SBPMsgInitBase n m) = SBPMsgInitBase n <$> f m msg f (SBPMsgIono n m) = SBPMsgIono n <$> f m msg f (SBPMsgLog n m) = SBPMsgLog n <$> f m@@ -658,6 +677,7 @@ msg f (SBPMsgPosLlhDepA n m) = SBPMsgPosLlhDepA n <$> f m msg f (SBPMsgPrintDep n m) = SBPMsgPrintDep n <$> f m msg f (SBPMsgReset n m) = SBPMsgReset n <$> f m+ msg f (SBPMsgResetDep n m) = SBPMsgResetDep n <$> f m msg f (SBPMsgResetFilters n m) = SBPMsgResetFilters n <$> f m msg f (SBPMsgSetTime n m) = SBPMsgSetTime n <$> f m msg f (SBPMsgSettingsReadByIndexDone n m) = SBPMsgSettingsReadByIndexDone n <$> f m
@@ -55,7 +55,9 @@ -- Signal identifier containing constellation, band, and satellite identifier data GnssSignal = GnssSignal { _gnssSignal_sat :: Word16- -- ^ Constellation-specific satellite identifier+ -- ^ Constellation-specific satellite identifier. Note: unlike GnssSignal16,+ -- GPS satellites are encoded as (PRN - 1). Other constellations do not+ -- have this offset. , _gnssSignal_code :: Word8 -- ^ Signal constellation, band and code , _gnssSignal_reserved :: Word8
@@ -0,0 +1,118 @@+{-# OPTIONS_GHC -fno-warn-unused-imports #-}+-- |+-- Module: SwiftNav.SBP.Imu+-- Copyright: Copyright (C) 2015 Swift Navigation, Inc.+-- License: LGPL-3+-- Maintainer: Mark Fine <dev@swiftnav.com>+-- Stability: experimental+-- Portability: portable+--+-- Inertial Measurement Unit (IMU) messages.++module SwiftNav.SBP.Imu where++import BasicPrelude as P+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++msgImuRaw :: Word16+msgImuRaw = 0x0900++-- | SBP class for message MSG_IMU_RAW (0x0900).+--+-- Raw data from the Inertial Measurement Unit, containing accelerometer and+-- gyroscope readings.+data MsgImuRaw = MsgImuRaw+ { _msgImuRaw_tow :: Word32+ -- ^ Milliseconds since start of GPS week. If the high bit is set, the time+ -- is unknown or invalid.+ , _msgImuRaw_tow_f :: Word8+ -- ^ Milliseconds since start of GPS week, fractional part+ , _msgImuRaw_acc_x :: Int16+ -- ^ Acceleration in the body frame X axis+ , _msgImuRaw_acc_y :: Int16+ -- ^ Acceleration in the body frame Y axis+ , _msgImuRaw_acc_z :: Int16+ -- ^ Acceleration in the body frame Z axis+ , _msgImuRaw_gyr_x :: Int16+ -- ^ Angular rate around the body frame X axis+ , _msgImuRaw_gyr_y :: Int16+ -- ^ Angular rate around the body frame Y axis+ , _msgImuRaw_gyr_z :: Int16+ -- ^ Angular rate around the body frame Z axis+ } deriving ( Show, Read, Eq )++instance Binary MsgImuRaw where+ get = do+ _msgImuRaw_tow <- getWord32le+ _msgImuRaw_tow_f <- getWord8+ _msgImuRaw_acc_x <- fromIntegral <$> getWord16le+ _msgImuRaw_acc_y <- fromIntegral <$> getWord16le+ _msgImuRaw_acc_z <- fromIntegral <$> getWord16le+ _msgImuRaw_gyr_x <- fromIntegral <$> getWord16le+ _msgImuRaw_gyr_y <- fromIntegral <$> getWord16le+ _msgImuRaw_gyr_z <- fromIntegral <$> getWord16le+ return MsgImuRaw {..}++ put MsgImuRaw {..} = do+ putWord32le _msgImuRaw_tow+ putWord8 _msgImuRaw_tow_f+ putWord16le $ fromIntegral _msgImuRaw_acc_x+ putWord16le $ fromIntegral _msgImuRaw_acc_y+ putWord16le $ fromIntegral _msgImuRaw_acc_z+ putWord16le $ fromIntegral _msgImuRaw_gyr_x+ putWord16le $ fromIntegral _msgImuRaw_gyr_y+ putWord16le $ fromIntegral _msgImuRaw_gyr_z++$(deriveSBP 'msgImuRaw ''MsgImuRaw)++$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgImuRaw_" . P.stripPrefix "_msgImuRaw_"}+ ''MsgImuRaw)+$(makeLenses ''MsgImuRaw)++msgImuAux :: Word16+msgImuAux = 0x0901++-- | SBP class for message MSG_IMU_AUX (0x0901).+--+-- Auxiliary data specific to a particular IMU. The `imu_type` field will+-- always be consistent but the rest of the payload is device specific and+-- depends on the value of `imu_type`.+data MsgImuAux = MsgImuAux+ { _msgImuAux_imu_type :: Word8+ -- ^ IMU type+ , _msgImuAux_temp :: Int16+ -- ^ Raw IMU temperature+ , _msgImuAux_imu_conf :: Word8+ -- ^ IMU configuration+ } deriving ( Show, Read, Eq )++instance Binary MsgImuAux where+ get = do+ _msgImuAux_imu_type <- getWord8+ _msgImuAux_temp <- fromIntegral <$> getWord16le+ _msgImuAux_imu_conf <- getWord8+ return MsgImuAux {..}++ put MsgImuAux {..} = do+ putWord8 _msgImuAux_imu_type+ putWord16le $ fromIntegral _msgImuAux_temp+ putWord8 _msgImuAux_imu_conf++$(deriveSBP 'msgImuAux ''MsgImuAux)++$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgImuAux_" . P.stripPrefix "_msgImuAux_"}+ ''MsgImuAux)+$(makeLenses ''MsgImuAux)
@@ -215,7 +215,7 @@ , _msgPosEcef_z :: Double -- ^ ECEF Z coordinate , _msgPosEcef_accuracy :: Word16- -- ^ Position accuracy estimate. Defaults to 0.+ -- ^ Position accuracy estimate. Not implemented in SPP mode, defaults to 0. , _msgPosEcef_n_sats :: Word8 -- ^ Number of satellites used in solution , _msgPosEcef_flags :: Word8@@ -270,9 +270,11 @@ , _msgPosLlh_height :: Double -- ^ Height above WGS84 ellipsoid , _msgPosLlh_h_accuracy :: Word16- -- ^ Horizontal position accuracy estimate (not implemented). Defaults to 0.+ -- ^ Horizontal position accuracy estimate. Not implemented in SPP mode,+ -- defaults to 0. , _msgPosLlh_v_accuracy :: Word16- -- ^ Vertical position accuracy estimate (not implemented). Defaults to 0.+ -- ^ Vertical position accuracy estimate. Not implemented in SPP mode,+ -- defaults to 0. , _msgPosLlh_n_sats :: Word8 -- ^ Number of satellites used in solution. , _msgPosLlh_flags :: Word8@@ -326,7 +328,7 @@ , _msgBaselineEcef_z :: Int32 -- ^ Baseline ECEF Z coordinate , _msgBaselineEcef_accuracy :: Word16- -- ^ Position accuracy estimate (not implemented). Defaults to 0.+ -- ^ Position accuracy estimate , _msgBaselineEcef_n_sats :: Word8 -- ^ Number of satellites used in solution , _msgBaselineEcef_flags :: Word8@@ -380,9 +382,9 @@ , _msgBaselineNed_d :: Int32 -- ^ Baseline Down coordinate , _msgBaselineNed_h_accuracy :: Word16- -- ^ Horizontal position accuracy estimate (not implemented). Defaults to 0.+ -- ^ Horizontal position accuracy estimate , _msgBaselineNed_v_accuracy :: Word16- -- ^ Vertical position accuracy estimate (not implemented). Defaults to 0.+ -- ^ Vertical position accuracy estimate , _msgBaselineNed_n_sats :: Word8 -- ^ Number of satellites used in solution , _msgBaselineNed_flags :: Word8
@@ -77,26 +77,51 @@ $(makeLenses ''MsgSetTime) msgReset :: Word16-msgReset = 0x00B2+msgReset = 0x00B6 --- | SBP class for message MSG_RESET (0x00B2).+-- | SBP class for message MSG_RESET (0x00B6). -- -- This message from the host resets the Piksi back into the bootloader. data MsgReset = MsgReset- deriving ( Show, Read, Eq )+ { _msgReset_flags :: Word32+ -- ^ Reset flags+ } deriving ( Show, Read, Eq ) instance Binary MsgReset where- get =- return MsgReset+ get = do+ _msgReset_flags <- getWord32le+ return MsgReset {..} - put MsgReset =- return ()+ put MsgReset {..} = do+ putWord32le _msgReset_flags $(deriveSBP 'msgReset ''MsgReset) $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgReset_" . P.stripPrefix "_msgReset_"} ''MsgReset) $(makeLenses ''MsgReset)++msgResetDep :: Word16+msgResetDep = 0x00B2++-- | SBP class for message MSG_RESET_DEP (0x00B2).+--+-- This message from the host resets the Piksi back into the bootloader.+data MsgResetDep = MsgResetDep+ deriving ( Show, Read, Eq )++instance Binary MsgResetDep where+ get =+ return MsgResetDep++ put MsgResetDep =+ return ()++$(deriveSBP 'msgResetDep ''MsgResetDep)++$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgResetDep_" . P.stripPrefix "_msgResetDep_"}+ ''MsgResetDep)+$(makeLenses ''MsgResetDep) msgCwResults :: Word16 msgCwResults = 0x00C0