sbp 2.3.2 → 2.3.5
raw patch · 25 files changed
+1379/−281 lines, 25 filesdep ~aesondep ~arraydep ~base
Dependency ranges changed: aeson, array, base, base64-bytestring, basic-prelude, binary, binary-conduit, bytestring, conduit, conduit-extra, data-binary-ieee754, lens, lens-aeson, monad-loops, resourcet, tasty, tasty-hunit, template-haskell, text, yaml
Files
- README.md +4/−4
- sbp.cabal +111/−116
- src/SwiftNav/SBP.hs +6/−2
- src/SwiftNav/SBP/Acquisition.hs +2/−2
- src/SwiftNav/SBP/Bootload.hs +2/−2
- src/SwiftNav/SBP/ExtEvents.hs +2/−2
- src/SwiftNav/SBP/FileIo.hs +2/−2
- src/SwiftNav/SBP/Flash.hs +2/−2
- src/SwiftNav/SBP/Gnss.hs +2/−2
- src/SwiftNav/SBP/Imu.hs +10/−9
- src/SwiftNav/SBP/Logging.hs +2/−2
- src/SwiftNav/SBP/Mag.hs +2/−2
- src/SwiftNav/SBP/Msg.hs +96/−8
- src/SwiftNav/SBP/Navigation.hs +368/−39
- src/SwiftNav/SBP/Ndb.hs +2/−2
- src/SwiftNav/SBP/Observation.hs +2/−2
- src/SwiftNav/SBP/Orientation.hs +234/−0
- src/SwiftNav/SBP/Piksi.hs +2/−2
- src/SwiftNav/SBP/Sbas.hs +72/−0
- src/SwiftNav/SBP/Settings.hs +2/−2
- src/SwiftNav/SBP/Ssr.hs +278/−0
- src/SwiftNav/SBP/System.hs +26/−2
- src/SwiftNav/SBP/Tracking.hs +75/−75
- src/SwiftNav/SBP/User.hs +2/−2
- src/SwiftNav/SBP/Vehicle.hs +73/−0
README.md view
@@ -10,10 +10,10 @@ Available on [Hackage as `sbp`](http://hackage.haskell.org/package/sbp). -The library supports building against Stackage LTS-6. To+The library supports building against Stackage LTS-10. To install from Hackage using `stack`: - $ stack install --resolver lts-6.35 sbp # (LTS-6)+ $ stack install --resolver lts-10.0 sbp # (LTS-10) Note that we explicitly specify the resolvers to use, as installing `libsbp` may fail to build with more recent resolvers.@@ -41,9 +41,9 @@ ## Publishing To publish to [Hackage](http://hackage.haskell.org/package/sbp), use the-`publish-lower` recipe in the `Shakefile.hs` with LTS-6 `stack.yaml`:+`publish-lower` recipe in the `Shakefile.hs` with LTS-10 `stack.yaml`: - $ STACK_YAML=stack-lts-6.yaml ./Shakefile.hs publish-lower+ $ STACK_YAML=stack-lts-10.yaml ./Shakefile.hs publish-lower ## References
sbp.cabal view
@@ -1,129 +1,124 @@-name: sbp-version: 2.3.2-cabal-version: >=1.22-build-type: Simple-license: LGPL-3-copyright: Copyright (C) 2015 Swift Navigation, Inc.-maintainer: Mark Fine <dev@swiftnav.com>-homepage: https://github.com/swift-nav/libsbp-synopsis: SwiftNav's SBP Library+name: sbp+version: 2.3.5+synopsis: SwiftNav's SBP Library+homepage: https://github.com/swift-nav/libsbp+license: LGPL-3+author: Swift Navigation Inc.+maintainer: Swift Navigation <dev@swiftnav.com>+copyright: Copyright (C) 2015-2018 Swift Navigation, Inc.+category: Network+build-type: Simple+cabal-version: >= 1.22+extra-source-files: README.md description:- Haskell bindings for Swift Navigation Binary Protocol (SBP), a fast,- simple, and minimal binary protocol for communicating with Swift- devices. It is the native binary protocol used by the Piksi GPS- receiver to transmit solutions, observations, status and debugging- messages, as well as receive messages from the host operating- system, such as differential corrections and the almanac.-category: Network-author: Swift Navigation Inc.-extra-source-files:- README.md+ Haskell bindings for Swift Navigation Binary Protocol (SBP), a fast,+ simple, and minimal binary protocol for communicating with Swift+ devices. It is the native binary protocol used by the Piksi GPS+ receiver to transmit solutions, observations, status and debugging+ messages, as well as receive messages from the host operating+ system, such as differential corrections and the almanac. source-repository head- type: git- location: git@github.com:swift-nav/libsbp.git+ type: git+ location: git@github.com:swift-nav/libsbp.git library- exposed-modules:- SwiftNav.CRC16- SwiftNav.SBP- build-depends:- aeson >=0.11.3.0,- array >=0.5.1.0,- base >=4.8 && <5,- base64-bytestring >=1.0.0.1,- basic-prelude >=0.5.2,- binary >=0.7.5.0,- bytestring >=0.10.6.0,- data-binary-ieee754 >=0.4.4,- lens >=4.13,- lens-aeson >=1.0.0.5,- monad-loops >=0.4.3,- template-haskell >=2.10.0.0,- text >=1.2.2.2- default-language: Haskell2010- hs-source-dirs: src- other-modules:- SwiftNav.SBP.Msg- SwiftNav.SBP.TH- SwiftNav.SBP.Types- SwiftNav.SBP.Acquisition- SwiftNav.SBP.Bootload- SwiftNav.SBP.ExtEvents- SwiftNav.SBP.FileIo- SwiftNav.SBP.Flash- SwiftNav.SBP.Gnss- SwiftNav.SBP.Imu- SwiftNav.SBP.Logging- SwiftNav.SBP.Mag- SwiftNav.SBP.Navigation- SwiftNav.SBP.Ndb- SwiftNav.SBP.Observation- SwiftNav.SBP.Piksi- SwiftNav.SBP.Settings- SwiftNav.SBP.System- SwiftNav.SBP.Tracking- SwiftNav.SBP.User- ghc-options: -Wall+ exposed-modules: SwiftNav.CRC16+ , SwiftNav.SBP+ other-modules: SwiftNav.SBP.Msg+ , SwiftNav.SBP.TH+ , SwiftNav.SBP.Types+ , SwiftNav.SBP.Acquisition+ , SwiftNav.SBP.Bootload+ , SwiftNav.SBP.ExtEvents+ , SwiftNav.SBP.FileIo+ , SwiftNav.SBP.Flash+ , SwiftNav.SBP.Gnss+ , SwiftNav.SBP.Imu+ , SwiftNav.SBP.Logging+ , SwiftNav.SBP.Mag+ , SwiftNav.SBP.Navigation+ , SwiftNav.SBP.Ndb+ , SwiftNav.SBP.Observation+ , SwiftNav.SBP.Orientation+ , SwiftNav.SBP.Piksi+ , SwiftNav.SBP.Sbas+ , SwiftNav.SBP.Settings+ , SwiftNav.SBP.Ssr+ , SwiftNav.SBP.System+ , SwiftNav.SBP.Tracking+ , SwiftNav.SBP.User+ , SwiftNav.SBP.Vehicle+ default-language: Haskell2010+ hs-source-dirs: src+ ghc-options: -Wall+ build-depends: aeson+ , array+ , base >= 4.8 && < 5+ , base64-bytestring+ , basic-prelude+ , binary+ , bytestring+ , data-binary-ieee754+ , lens+ , lens-aeson+ , monad-loops+ , template-haskell+ , text executable sbp2json- main-is: SBP2JSON.hs- build-depends:- aeson >=0.11.3.0,- base >=4.8.2.0,- basic-prelude >=0.5.2,- binary-conduit >=1.2.4.1,- bytestring >=0.10.6.0,- conduit >=1.2.10,- conduit-extra >=1.1.16,- resourcet >=1.1.9,- sbp- default-language: Haskell2010- hs-source-dirs: main- ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall+ hs-source-dirs: main+ main-is: SBP2JSON.hs+ ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall+ build-depends: aeson+ , base+ , basic-prelude+ , binary-conduit+ , bytestring+ , conduit+ , conduit-extra+ , resourcet+ , sbp+ default-language: Haskell2010 executable json2sbp- main-is: JSON2SBP.hs- build-depends:- aeson >=0.11.3.0,- base >=4.8.2.0,- basic-prelude >=0.5.2,- binary-conduit >=1.2.4.1,- conduit >=1.2.10,- conduit-extra >=1.1.16,- resourcet >=1.1.9,- sbp- default-language: Haskell2010- hs-source-dirs: main- ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall+ hs-source-dirs: main+ main-is: JSON2SBP.hs+ ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall+ build-depends: aeson+ , base+ , basic-prelude+ , binary-conduit+ , conduit+ , conduit-extra+ , resourcet+ , sbp+ default-language: Haskell2010 executable sbp2yaml- main-is: SBP2YAML.hs- build-depends:- base >=4.8.2.0,- basic-prelude >=0.5.2,- binary-conduit >=1.2.4.1,- bytestring >=0.10.6.0,- conduit >=1.2.10,- conduit-extra >=1.1.16,- resourcet >=1.1.9,- sbp,- yaml >=0.8.23- default-language: Haskell2010- hs-source-dirs: main- ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall+ hs-source-dirs: main+ main-is: SBP2YAML.hs+ ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall+ build-depends: base+ , basic-prelude+ , binary-conduit+ , bytestring+ , conduit+ , conduit-extra+ , resourcet+ , sbp+ , yaml+ default-language: Haskell2010 test-suite test- type: exitcode-stdio-1.0- main-is: Test.hs- build-depends:- base >=4.8.2.0,- basic-prelude >=0.5.2,- sbp,- tasty >=0.11.2.1,- tasty-hunit >=0.9.2- default-language: Haskell2010- hs-source-dirs: test- other-modules:- Test.SwiftNav.CRC16- ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall+ type: exitcode-stdio-1.0+ hs-source-dirs: test+ main-is: Test.hs+ other-modules: Test.SwiftNav.CRC16+ build-depends: base+ , basic-prelude+ , sbp+ , tasty+ , tasty-hunit+ ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall+ default-language: Haskell2010
@@ -1,8 +1,8 @@ -- | -- Module: SwiftNav.SBP--- Copyright: Copyright (C) 2015 Swift Navigation, Inc.+-- Copyright: Copyright (C) 2015-2018 Swift Navigation, Inc. -- License: LGPL-3--- Maintainer: Mark Fine <dev@swiftnav.com>+-- Maintainer: Swift Navigation <dev@swiftnav.com> -- Stability: experimental -- Portability: portable --@@ -26,8 +26,12 @@ import SwiftNav.SBP.Navigation as Exports import SwiftNav.SBP.Ndb as Exports import SwiftNav.SBP.Observation as Exports+import SwiftNav.SBP.Orientation as Exports import SwiftNav.SBP.Piksi as Exports+import SwiftNav.SBP.Sbas as Exports import SwiftNav.SBP.Settings as Exports+import SwiftNav.SBP.Ssr as Exports import SwiftNav.SBP.System as Exports import SwiftNav.SBP.Tracking as Exports import SwiftNav.SBP.User as Exports+import SwiftNav.SBP.Vehicle as Exports
@@ -5,9 +5,9 @@ -- | -- Module: SwiftNav.SBP.Acquisition--- Copyright: Copyright (C) 2015 Swift Navigation, Inc.+-- Copyright: Copyright (C) 2015-2018 Swift Navigation, Inc. -- License: LGPL-3--- Maintainer: Mark Fine <dev@swiftnav.com>+-- Maintainer: Swift Navigation <dev@swiftnav.com> -- Stability: experimental -- Portability: portable --
@@ -5,9 +5,9 @@ -- | -- Module: SwiftNav.SBP.Bootload--- Copyright: Copyright (C) 2015 Swift Navigation, Inc.+-- Copyright: Copyright (C) 2015-2018 Swift Navigation, Inc. -- License: LGPL-3--- Maintainer: Mark Fine <dev@swiftnav.com>+-- Maintainer: Swift Navigation <dev@swiftnav.com> -- Stability: experimental -- Portability: portable --
@@ -5,9 +5,9 @@ -- | -- Module: SwiftNav.SBP.ExtEvents--- Copyright: Copyright (C) 2015 Swift Navigation, Inc.+-- Copyright: Copyright (C) 2015-2018 Swift Navigation, Inc. -- License: LGPL-3--- Maintainer: Mark Fine <dev@swiftnav.com>+-- Maintainer: Swift Navigation <dev@swiftnav.com> -- Stability: experimental -- Portability: portable --
@@ -5,9 +5,9 @@ -- | -- Module: SwiftNav.SBP.FileIo--- Copyright: Copyright (C) 2015 Swift Navigation, Inc.+-- Copyright: Copyright (C) 2015-2018 Swift Navigation, Inc. -- License: LGPL-3--- Maintainer: Mark Fine <dev@swiftnav.com>+-- Maintainer: Swift Navigation <dev@swiftnav.com> -- Stability: experimental -- Portability: portable --
@@ -5,9 +5,9 @@ -- | -- Module: SwiftNav.SBP.Flash--- Copyright: Copyright (C) 2015 Swift Navigation, Inc.+-- Copyright: Copyright (C) 2015-2018 Swift Navigation, Inc. -- License: LGPL-3--- Maintainer: Mark Fine <dev@swiftnav.com>+-- Maintainer: Swift Navigation <dev@swiftnav.com> -- Stability: experimental -- Portability: portable --
@@ -5,9 +5,9 @@ -- | -- Module: SwiftNav.SBP.Gnss--- Copyright: Copyright (C) 2015 Swift Navigation, Inc.+-- Copyright: Copyright (C) 2015-2018 Swift Navigation, Inc. -- License: LGPL-3--- Maintainer: Mark Fine <dev@swiftnav.com>+-- Maintainer: Swift Navigation <dev@swiftnav.com> -- Stability: experimental -- Portability: portable --
@@ -5,9 +5,9 @@ -- | -- Module: SwiftNav.SBP.Imu--- Copyright: Copyright (C) 2015 Swift Navigation, Inc.+-- Copyright: Copyright (C) 2015-2018 Swift Navigation, Inc. -- License: LGPL-3--- Maintainer: Mark Fine <dev@swiftnav.com>+-- Maintainer: Swift Navigation <dev@swiftnav.com> -- Stability: experimental -- Portability: portable --@@ -41,7 +41,8 @@ -- | SBP class for message MSG_IMU_RAW (0x0900). -- -- Raw data from the Inertial Measurement Unit, containing accelerometer and--- gyroscope readings.+-- gyroscope readings. The sense of the measurements are to be aligned with+-- the indications on the device itself. data MsgImuRaw = MsgImuRaw { _msgImuRaw_tow :: !Word32 -- ^ Milliseconds since start of GPS week. If the high bit is set, the time@@ -49,17 +50,17 @@ , _msgImuRaw_tow_f :: !Word8 -- ^ Milliseconds since start of GPS week, fractional part , _msgImuRaw_acc_x :: !Int16- -- ^ Acceleration in the body frame X axis+ -- ^ Acceleration in the IMU frame X axis , _msgImuRaw_acc_y :: !Int16- -- ^ Acceleration in the body frame Y axis+ -- ^ Acceleration in the IMU frame Y axis , _msgImuRaw_acc_z :: !Int16- -- ^ Acceleration in the body frame Z axis+ -- ^ Acceleration in the IMU frame Z axis , _msgImuRaw_gyr_x :: !Int16- -- ^ Angular rate around the body frame X axis+ -- ^ Angular rate around IMU frame X axis , _msgImuRaw_gyr_y :: !Int16- -- ^ Angular rate around the body frame Y axis+ -- ^ Angular rate around IMU frame Y axis , _msgImuRaw_gyr_z :: !Int16- -- ^ Angular rate around the body frame Z axis+ -- ^ Angular rate around IMU frame Z axis } deriving ( Show, Read, Eq ) instance Binary MsgImuRaw where
@@ -5,9 +5,9 @@ -- | -- Module: SwiftNav.SBP.Logging--- Copyright: Copyright (C) 2015 Swift Navigation, Inc.+-- Copyright: Copyright (C) 2015-2018 Swift Navigation, Inc. -- License: LGPL-3--- Maintainer: Mark Fine <dev@swiftnav.com>+-- Maintainer: Swift Navigation <dev@swiftnav.com> -- Stability: experimental -- Portability: portable --
@@ -5,9 +5,9 @@ -- | -- Module: SwiftNav.SBP.Mag--- Copyright: Copyright (C) 2015 Swift Navigation, Inc.+-- Copyright: Copyright (C) 2015-2018 Swift Navigation, Inc. -- License: LGPL-3--- Maintainer: Mark Fine <dev@swiftnav.com>+-- Maintainer: Swift Navigation <dev@swiftnav.com> -- Stability: experimental -- Portability: portable --
@@ -6,9 +6,9 @@ -- | -- Module: SwiftNav.SBP.Msg--- Copyright: Copyright (C) 2015 Swift Navigation, Inc.+-- Copyright: Copyright (C) 2015-2018 Swift Navigation, Inc. -- License: LGPL-3--- Maintainer: Mark Fine <dev@swiftnav.com>+-- Maintainer: Swift Navigation <dev@swiftnav.com> -- Stability: experimental -- Portability: portable --@@ -36,11 +36,15 @@ import SwiftNav.SBP.Navigation import SwiftNav.SBP.Ndb import SwiftNav.SBP.Observation+import SwiftNav.SBP.Orientation import SwiftNav.SBP.Piksi+import SwiftNav.SBP.Sbas import SwiftNav.SBP.Settings+import SwiftNav.SBP.Ssr import SwiftNav.SBP.System import SwiftNav.SBP.Tracking import SwiftNav.SBP.User+import SwiftNav.SBP.Vehicle import SwiftNav.SBP.Types @@ -61,6 +65,7 @@ | SBPMsgAlmanacGloDep MsgAlmanacGloDep Msg | SBPMsgAlmanacGps MsgAlmanacGps Msg | SBPMsgAlmanacGpsDep MsgAlmanacGpsDep Msg+ | SBPMsgAngularRate MsgAngularRate Msg | SBPMsgBasePosEcef MsgBasePosEcef Msg | SBPMsgBasePosLlh MsgBasePosLlh Msg | SBPMsgBaselineEcef MsgBaselineEcef Msg@@ -119,6 +124,7 @@ | SBPMsgImuAux MsgImuAux Msg | SBPMsgImuRaw MsgImuRaw Msg | SBPMsgInitBase MsgInitBase Msg+ | SBPMsgInsStatus MsgInsStatus Msg | SBPMsgIono MsgIono Msg | SBPMsgLog MsgLog Msg | SBPMsgM25FlashWriteStatus MsgM25FlashWriteStatus Msg@@ -134,14 +140,20 @@ | SBPMsgObsDepA MsgObsDepA Msg | SBPMsgObsDepB MsgObsDepB Msg | SBPMsgObsDepC MsgObsDepC Msg+ | SBPMsgOdometry MsgOdometry Msg+ | SBPMsgOrientEuler MsgOrientEuler Msg+ | SBPMsgOrientQuat MsgOrientQuat Msg | SBPMsgPosEcef MsgPosEcef Msg+ | SBPMsgPosEcefCov MsgPosEcefCov Msg | SBPMsgPosEcefDepA MsgPosEcefDepA Msg | SBPMsgPosLlh MsgPosLlh Msg+ | SBPMsgPosLlhCov MsgPosLlhCov Msg | SBPMsgPosLlhDepA MsgPosLlhDepA Msg | SBPMsgPrintDep MsgPrintDep Msg | SBPMsgReset MsgReset Msg | SBPMsgResetDep MsgResetDep Msg | SBPMsgResetFilters MsgResetFilters Msg+ | SBPMsgSbasRaw MsgSbasRaw Msg | SBPMsgSetTime MsgSetTime Msg | SBPMsgSettingsReadByIndexDone MsgSettingsReadByIndexDone Msg | SBPMsgSettingsReadByIndexReq MsgSettingsReadByIndexReq Msg@@ -154,6 +166,9 @@ | SBPMsgSettingsWriteResp MsgSettingsWriteResp Msg | SBPMsgSpecan MsgSpecan Msg | SBPMsgSpecanDep MsgSpecanDep Msg+ | SBPMsgSsrCodeBiases MsgSsrCodeBiases Msg+ | SBPMsgSsrOrbitClock MsgSsrOrbitClock Msg+ | SBPMsgSsrPhaseBiases MsgSsrPhaseBiases Msg | SBPMsgStartup MsgStartup Msg | SBPMsgStmFlashLockSector MsgStmFlashLockSector Msg | SBPMsgStmFlashUnlockSector MsgStmFlashUnlockSector Msg@@ -166,16 +181,19 @@ | SBPMsgTrackingState MsgTrackingState Msg | SBPMsgTrackingStateDepA MsgTrackingStateDepA Msg | SBPMsgTrackingStateDepB MsgTrackingStateDepB Msg- | SBPMsgTrackingStateDetailed MsgTrackingStateDetailed Msg | SBPMsgTrackingStateDetailedDep MsgTrackingStateDetailedDep Msg+ | SBPMsgTrackingStateDetailedDepA MsgTrackingStateDetailedDepA Msg | SBPMsgTweet MsgTweet Msg | SBPMsgUartState MsgUartState Msg | SBPMsgUartStateDepa MsgUartStateDepa Msg | SBPMsgUserData MsgUserData Msg | SBPMsgUtcTime MsgUtcTime Msg+ | SBPMsgVelBody MsgVelBody Msg | SBPMsgVelEcef MsgVelEcef Msg+ | SBPMsgVelEcefCov MsgVelEcefCov Msg | SBPMsgVelEcefDepA MsgVelEcefDepA Msg | SBPMsgVelNed MsgVelNed Msg+ | SBPMsgVelNedCov MsgVelNedCov Msg | SBPMsgVelNedDepA MsgVelNedDepA Msg | SBPMsgBadCrc Msg | SBPMsgUnknown Msg@@ -202,6 +220,7 @@ | _msgSBPType == msgAlmanacGloDep = SBPMsgAlmanacGloDep (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgAlmanacGps = SBPMsgAlmanacGps (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgAlmanacGpsDep = SBPMsgAlmanacGpsDep (decode (fromStrict (unBytes _msgSBPPayload))) m+ | _msgSBPType == msgAngularRate = SBPMsgAngularRate (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgBasePosEcef = SBPMsgBasePosEcef (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgBasePosLlh = SBPMsgBasePosLlh (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgBaselineEcef = SBPMsgBaselineEcef (decode (fromStrict (unBytes _msgSBPPayload))) m@@ -260,6 +279,7 @@ | _msgSBPType == msgImuAux = SBPMsgImuAux (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgImuRaw = SBPMsgImuRaw (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgInitBase = SBPMsgInitBase (decode (fromStrict (unBytes _msgSBPPayload))) m+ | _msgSBPType == msgInsStatus = SBPMsgInsStatus (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgIono = SBPMsgIono (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgLog = SBPMsgLog (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgM25FlashWriteStatus = SBPMsgM25FlashWriteStatus (decode (fromStrict (unBytes _msgSBPPayload))) m@@ -275,14 +295,20 @@ | _msgSBPType == msgObsDepA = SBPMsgObsDepA (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgObsDepB = SBPMsgObsDepB (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgObsDepC = SBPMsgObsDepC (decode (fromStrict (unBytes _msgSBPPayload))) m+ | _msgSBPType == msgOdometry = SBPMsgOdometry (decode (fromStrict (unBytes _msgSBPPayload))) m+ | _msgSBPType == msgOrientEuler = SBPMsgOrientEuler (decode (fromStrict (unBytes _msgSBPPayload))) m+ | _msgSBPType == msgOrientQuat = SBPMsgOrientQuat (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgPosEcef = SBPMsgPosEcef (decode (fromStrict (unBytes _msgSBPPayload))) m+ | _msgSBPType == msgPosEcefCov = SBPMsgPosEcefCov (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgPosEcefDepA = SBPMsgPosEcefDepA (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgPosLlh = SBPMsgPosLlh (decode (fromStrict (unBytes _msgSBPPayload))) m+ | _msgSBPType == msgPosLlhCov = SBPMsgPosLlhCov (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgPosLlhDepA = SBPMsgPosLlhDepA (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgPrintDep = SBPMsgPrintDep (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgReset = SBPMsgReset (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgResetDep = SBPMsgResetDep (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgResetFilters = SBPMsgResetFilters (decode (fromStrict (unBytes _msgSBPPayload))) m+ | _msgSBPType == msgSbasRaw = SBPMsgSbasRaw (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgSetTime = SBPMsgSetTime (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgSettingsReadByIndexDone = SBPMsgSettingsReadByIndexDone (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgSettingsReadByIndexReq = SBPMsgSettingsReadByIndexReq (decode (fromStrict (unBytes _msgSBPPayload))) m@@ -295,6 +321,9 @@ | _msgSBPType == msgSettingsWriteResp = SBPMsgSettingsWriteResp (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgSpecan = SBPMsgSpecan (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgSpecanDep = SBPMsgSpecanDep (decode (fromStrict (unBytes _msgSBPPayload))) m+ | _msgSBPType == msgSsrCodeBiases = SBPMsgSsrCodeBiases (decode (fromStrict (unBytes _msgSBPPayload))) m+ | _msgSBPType == msgSsrOrbitClock = SBPMsgSsrOrbitClock (decode (fromStrict (unBytes _msgSBPPayload))) m+ | _msgSBPType == msgSsrPhaseBiases = SBPMsgSsrPhaseBiases (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgStartup = SBPMsgStartup (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgStmFlashLockSector = SBPMsgStmFlashLockSector (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgStmFlashUnlockSector = SBPMsgStmFlashUnlockSector (decode (fromStrict (unBytes _msgSBPPayload))) m@@ -307,16 +336,19 @@ | _msgSBPType == msgTrackingState = SBPMsgTrackingState (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgTrackingStateDepA = SBPMsgTrackingStateDepA (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgTrackingStateDepB = SBPMsgTrackingStateDepB (decode (fromStrict (unBytes _msgSBPPayload))) m- | _msgSBPType == msgTrackingStateDetailed = SBPMsgTrackingStateDetailed (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgTrackingStateDetailedDep = SBPMsgTrackingStateDetailedDep (decode (fromStrict (unBytes _msgSBPPayload))) m+ | _msgSBPType == msgTrackingStateDetailedDepA = SBPMsgTrackingStateDetailedDepA (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgTweet = SBPMsgTweet (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgUartState = SBPMsgUartState (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgUartStateDepa = SBPMsgUartStateDepa (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgUserData = SBPMsgUserData (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgUtcTime = SBPMsgUtcTime (decode (fromStrict (unBytes _msgSBPPayload))) m+ | _msgSBPType == msgVelBody = SBPMsgVelBody (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgVelEcef = SBPMsgVelEcef (decode (fromStrict (unBytes _msgSBPPayload))) m+ | _msgSBPType == msgVelEcefCov = SBPMsgVelEcefCov (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgVelEcefDepA = SBPMsgVelEcefDepA (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgVelNed = SBPMsgVelNed (decode (fromStrict (unBytes _msgSBPPayload))) m+ | _msgSBPType == msgVelNedCov = SBPMsgVelNedCov (decode (fromStrict (unBytes _msgSBPPayload))) m | _msgSBPType == msgVelNedDepA = SBPMsgVelNedDepA (decode (fromStrict (unBytes _msgSBPPayload))) m | otherwise = SBPMsgUnknown m @@ -335,6 +367,7 @@ encoder (SBPMsgAlmanacGloDep _ m) = put m encoder (SBPMsgAlmanacGps _ m) = put m encoder (SBPMsgAlmanacGpsDep _ m) = put m+ encoder (SBPMsgAngularRate _ m) = put m encoder (SBPMsgBasePosEcef _ m) = put m encoder (SBPMsgBasePosLlh _ m) = put m encoder (SBPMsgBaselineEcef _ m) = put m@@ -393,6 +426,7 @@ encoder (SBPMsgImuAux _ m) = put m encoder (SBPMsgImuRaw _ m) = put m encoder (SBPMsgInitBase _ m) = put m+ encoder (SBPMsgInsStatus _ m) = put m encoder (SBPMsgIono _ m) = put m encoder (SBPMsgLog _ m) = put m encoder (SBPMsgM25FlashWriteStatus _ m) = put m@@ -408,14 +442,20 @@ encoder (SBPMsgObsDepA _ m) = put m encoder (SBPMsgObsDepB _ m) = put m encoder (SBPMsgObsDepC _ m) = put m+ encoder (SBPMsgOdometry _ m) = put m+ encoder (SBPMsgOrientEuler _ m) = put m+ encoder (SBPMsgOrientQuat _ m) = put m encoder (SBPMsgPosEcef _ m) = put m+ encoder (SBPMsgPosEcefCov _ m) = put m encoder (SBPMsgPosEcefDepA _ m) = put m encoder (SBPMsgPosLlh _ m) = put m+ encoder (SBPMsgPosLlhCov _ m) = put m encoder (SBPMsgPosLlhDepA _ m) = put m encoder (SBPMsgPrintDep _ m) = put m encoder (SBPMsgReset _ m) = put m encoder (SBPMsgResetDep _ m) = put m encoder (SBPMsgResetFilters _ m) = put m+ encoder (SBPMsgSbasRaw _ m) = put m encoder (SBPMsgSetTime _ m) = put m encoder (SBPMsgSettingsReadByIndexDone _ m) = put m encoder (SBPMsgSettingsReadByIndexReq _ m) = put m@@ -428,6 +468,9 @@ encoder (SBPMsgSettingsWriteResp _ m) = put m encoder (SBPMsgSpecan _ m) = put m encoder (SBPMsgSpecanDep _ m) = put m+ encoder (SBPMsgSsrCodeBiases _ m) = put m+ encoder (SBPMsgSsrOrbitClock _ m) = put m+ encoder (SBPMsgSsrPhaseBiases _ m) = put m encoder (SBPMsgStartup _ m) = put m encoder (SBPMsgStmFlashLockSector _ m) = put m encoder (SBPMsgStmFlashUnlockSector _ m) = put m@@ -440,16 +483,19 @@ encoder (SBPMsgTrackingState _ m) = put m encoder (SBPMsgTrackingStateDepA _ m) = put m encoder (SBPMsgTrackingStateDepB _ m) = put m- encoder (SBPMsgTrackingStateDetailed _ m) = put m encoder (SBPMsgTrackingStateDetailedDep _ m) = put m+ encoder (SBPMsgTrackingStateDetailedDepA _ m) = put m encoder (SBPMsgTweet _ m) = put m encoder (SBPMsgUartState _ m) = put m encoder (SBPMsgUartStateDepa _ m) = put m encoder (SBPMsgUserData _ m) = put m encoder (SBPMsgUtcTime _ m) = put m+ encoder (SBPMsgVelBody _ m) = put m encoder (SBPMsgVelEcef _ m) = put m+ encoder (SBPMsgVelEcefCov _ m) = put m encoder (SBPMsgVelEcefDepA _ m) = put m encoder (SBPMsgVelNed _ m) = put m+ encoder (SBPMsgVelNedCov _ m) = put m encoder (SBPMsgVelNedDepA _ m) = put m encoder (SBPMsgUnknown m) = put m encoder (SBPMsgBadCrc m) = put m@@ -472,6 +518,7 @@ | msgType == msgAlmanacGloDep = SBPMsgAlmanacGloDep <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgAlmanacGps = SBPMsgAlmanacGps <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgAlmanacGpsDep = SBPMsgAlmanacGpsDep <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj+ | msgType == msgAngularRate = SBPMsgAngularRate <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgBasePosEcef = SBPMsgBasePosEcef <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgBasePosLlh = SBPMsgBasePosLlh <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgBaselineEcef = SBPMsgBaselineEcef <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj@@ -530,6 +577,7 @@ | msgType == msgImuAux = SBPMsgImuAux <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgImuRaw = SBPMsgImuRaw <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgInitBase = SBPMsgInitBase <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj+ | msgType == msgInsStatus = SBPMsgInsStatus <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgIono = SBPMsgIono <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgLog = SBPMsgLog <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgM25FlashWriteStatus = SBPMsgM25FlashWriteStatus <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj@@ -545,14 +593,20 @@ | msgType == msgObsDepA = SBPMsgObsDepA <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgObsDepB = SBPMsgObsDepB <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgObsDepC = SBPMsgObsDepC <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj+ | msgType == msgOdometry = SBPMsgOdometry <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj+ | msgType == msgOrientEuler = SBPMsgOrientEuler <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj+ | msgType == msgOrientQuat = SBPMsgOrientQuat <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgPosEcef = SBPMsgPosEcef <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj+ | msgType == msgPosEcefCov = SBPMsgPosEcefCov <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgPosEcefDepA = SBPMsgPosEcefDepA <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgPosLlh = SBPMsgPosLlh <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj+ | msgType == msgPosLlhCov = SBPMsgPosLlhCov <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgPosLlhDepA = SBPMsgPosLlhDepA <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgPrintDep = SBPMsgPrintDep <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgReset = SBPMsgReset <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgResetDep = SBPMsgResetDep <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgResetFilters = SBPMsgResetFilters <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj+ | msgType == msgSbasRaw = SBPMsgSbasRaw <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgSetTime = SBPMsgSetTime <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgSettingsReadByIndexDone = SBPMsgSettingsReadByIndexDone <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgSettingsReadByIndexReq = SBPMsgSettingsReadByIndexReq <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj@@ -565,6 +619,9 @@ | msgType == msgSettingsWriteResp = SBPMsgSettingsWriteResp <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgSpecan = SBPMsgSpecan <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgSpecanDep = SBPMsgSpecanDep <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj+ | msgType == msgSsrCodeBiases = SBPMsgSsrCodeBiases <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj+ | msgType == msgSsrOrbitClock = SBPMsgSsrOrbitClock <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj+ | msgType == msgSsrPhaseBiases = SBPMsgSsrPhaseBiases <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgStartup = SBPMsgStartup <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgStmFlashLockSector = SBPMsgStmFlashLockSector <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgStmFlashUnlockSector = SBPMsgStmFlashUnlockSector <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj@@ -577,16 +634,19 @@ | msgType == msgTrackingState = SBPMsgTrackingState <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgTrackingStateDepA = SBPMsgTrackingStateDepA <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgTrackingStateDepB = SBPMsgTrackingStateDepB <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj- | msgType == msgTrackingStateDetailed = SBPMsgTrackingStateDetailed <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgTrackingStateDetailedDep = SBPMsgTrackingStateDetailedDep <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj+ | msgType == msgTrackingStateDetailedDepA = SBPMsgTrackingStateDetailedDepA <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgTweet = SBPMsgTweet <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgUartState = SBPMsgUartState <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgUartStateDepa = SBPMsgUartStateDepa <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgUserData = SBPMsgUserData <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgUtcTime = SBPMsgUtcTime <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj+ | msgType == msgVelBody = SBPMsgVelBody <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgVelEcef = SBPMsgVelEcef <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj+ | msgType == msgVelEcefCov = SBPMsgVelEcefCov <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgVelEcefDepA = SBPMsgVelEcefDepA <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgVelNed = SBPMsgVelNed <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj+ | msgType == msgVelNedCov = SBPMsgVelNedCov <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | msgType == msgVelNedDepA = SBPMsgVelNedDepA <$> pure (decode (fromStrict (unBytes payload))) <*> parseJSON obj | otherwise = SBPMsgUnknown <$> parseJSON obj parseJSON _ = mzero@@ -610,6 +670,7 @@ toJSON (SBPMsgAlmanacGloDep n m) = toJSON n <<>> toJSON m toJSON (SBPMsgAlmanacGps n m) = toJSON n <<>> toJSON m toJSON (SBPMsgAlmanacGpsDep n m) = toJSON n <<>> toJSON m+ toJSON (SBPMsgAngularRate n m) = toJSON n <<>> toJSON m toJSON (SBPMsgBasePosEcef n m) = toJSON n <<>> toJSON m toJSON (SBPMsgBasePosLlh n m) = toJSON n <<>> toJSON m toJSON (SBPMsgBaselineEcef n m) = toJSON n <<>> toJSON m@@ -668,6 +729,7 @@ toJSON (SBPMsgImuAux n m) = toJSON n <<>> toJSON m toJSON (SBPMsgImuRaw n m) = toJSON n <<>> toJSON m toJSON (SBPMsgInitBase n m) = toJSON n <<>> toJSON m+ toJSON (SBPMsgInsStatus n m) = toJSON n <<>> toJSON m toJSON (SBPMsgIono n m) = toJSON n <<>> toJSON m toJSON (SBPMsgLog n m) = toJSON n <<>> toJSON m toJSON (SBPMsgM25FlashWriteStatus n m) = toJSON n <<>> toJSON m@@ -683,14 +745,20 @@ toJSON (SBPMsgObsDepA n m) = toJSON n <<>> toJSON m toJSON (SBPMsgObsDepB n m) = toJSON n <<>> toJSON m toJSON (SBPMsgObsDepC n m) = toJSON n <<>> toJSON m+ toJSON (SBPMsgOdometry n m) = toJSON n <<>> toJSON m+ toJSON (SBPMsgOrientEuler n m) = toJSON n <<>> toJSON m+ toJSON (SBPMsgOrientQuat n m) = toJSON n <<>> toJSON m toJSON (SBPMsgPosEcef n m) = toJSON n <<>> toJSON m+ toJSON (SBPMsgPosEcefCov n m) = toJSON n <<>> toJSON m toJSON (SBPMsgPosEcefDepA n m) = toJSON n <<>> toJSON m toJSON (SBPMsgPosLlh n m) = toJSON n <<>> toJSON m+ toJSON (SBPMsgPosLlhCov n m) = toJSON n <<>> toJSON m toJSON (SBPMsgPosLlhDepA n m) = toJSON n <<>> toJSON m toJSON (SBPMsgPrintDep n m) = toJSON n <<>> toJSON m toJSON (SBPMsgReset n m) = toJSON n <<>> toJSON m toJSON (SBPMsgResetDep n m) = toJSON n <<>> toJSON m toJSON (SBPMsgResetFilters n m) = toJSON n <<>> toJSON m+ toJSON (SBPMsgSbasRaw n m) = toJSON n <<>> toJSON m toJSON (SBPMsgSetTime n m) = toJSON n <<>> toJSON m toJSON (SBPMsgSettingsReadByIndexDone n m) = toJSON n <<>> toJSON m toJSON (SBPMsgSettingsReadByIndexReq n m) = toJSON n <<>> toJSON m@@ -703,6 +771,9 @@ toJSON (SBPMsgSettingsWriteResp n m) = toJSON n <<>> toJSON m toJSON (SBPMsgSpecan n m) = toJSON n <<>> toJSON m toJSON (SBPMsgSpecanDep n m) = toJSON n <<>> toJSON m+ toJSON (SBPMsgSsrCodeBiases n m) = toJSON n <<>> toJSON m+ toJSON (SBPMsgSsrOrbitClock n m) = toJSON n <<>> toJSON m+ toJSON (SBPMsgSsrPhaseBiases n m) = toJSON n <<>> toJSON m toJSON (SBPMsgStartup n m) = toJSON n <<>> toJSON m toJSON (SBPMsgStmFlashLockSector n m) = toJSON n <<>> toJSON m toJSON (SBPMsgStmFlashUnlockSector n m) = toJSON n <<>> toJSON m@@ -715,16 +786,19 @@ toJSON (SBPMsgTrackingState n m) = toJSON n <<>> toJSON m toJSON (SBPMsgTrackingStateDepA n m) = toJSON n <<>> toJSON m toJSON (SBPMsgTrackingStateDepB n m) = toJSON n <<>> toJSON m- toJSON (SBPMsgTrackingStateDetailed n m) = toJSON n <<>> toJSON m toJSON (SBPMsgTrackingStateDetailedDep n m) = toJSON n <<>> toJSON m+ toJSON (SBPMsgTrackingStateDetailedDepA n m) = toJSON n <<>> toJSON m toJSON (SBPMsgTweet n m) = toJSON n <<>> toJSON m toJSON (SBPMsgUartState n m) = toJSON n <<>> toJSON m toJSON (SBPMsgUartStateDepa n m) = toJSON n <<>> toJSON m toJSON (SBPMsgUserData n m) = toJSON n <<>> toJSON m toJSON (SBPMsgUtcTime n m) = toJSON n <<>> toJSON m+ toJSON (SBPMsgVelBody n m) = toJSON n <<>> toJSON m toJSON (SBPMsgVelEcef n m) = toJSON n <<>> toJSON m+ toJSON (SBPMsgVelEcefCov n m) = toJSON n <<>> toJSON m toJSON (SBPMsgVelEcefDepA n m) = toJSON n <<>> toJSON m toJSON (SBPMsgVelNed n m) = toJSON n <<>> toJSON m+ toJSON (SBPMsgVelNedCov n m) = toJSON n <<>> toJSON m toJSON (SBPMsgVelNedDepA n m) = toJSON n <<>> toJSON m toJSON (SBPMsgBadCrc m) = toJSON m toJSON (SBPMsgUnknown m) = toJSON m@@ -742,6 +816,7 @@ msg f (SBPMsgAlmanacGloDep n m) = SBPMsgAlmanacGloDep n <$> f m msg f (SBPMsgAlmanacGps n m) = SBPMsgAlmanacGps n <$> f m msg f (SBPMsgAlmanacGpsDep n m) = SBPMsgAlmanacGpsDep n <$> f m+ msg f (SBPMsgAngularRate n m) = SBPMsgAngularRate n <$> f m msg f (SBPMsgBasePosEcef n m) = SBPMsgBasePosEcef n <$> f m msg f (SBPMsgBasePosLlh n m) = SBPMsgBasePosLlh n <$> f m msg f (SBPMsgBaselineEcef n m) = SBPMsgBaselineEcef n <$> f m@@ -800,6 +875,7 @@ 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 (SBPMsgInsStatus n m) = SBPMsgInsStatus n <$> f m msg f (SBPMsgIono n m) = SBPMsgIono n <$> f m msg f (SBPMsgLog n m) = SBPMsgLog n <$> f m msg f (SBPMsgM25FlashWriteStatus n m) = SBPMsgM25FlashWriteStatus n <$> f m@@ -815,14 +891,20 @@ msg f (SBPMsgObsDepA n m) = SBPMsgObsDepA n <$> f m msg f (SBPMsgObsDepB n m) = SBPMsgObsDepB n <$> f m msg f (SBPMsgObsDepC n m) = SBPMsgObsDepC n <$> f m+ msg f (SBPMsgOdometry n m) = SBPMsgOdometry n <$> f m+ msg f (SBPMsgOrientEuler n m) = SBPMsgOrientEuler n <$> f m+ msg f (SBPMsgOrientQuat n m) = SBPMsgOrientQuat n <$> f m msg f (SBPMsgPosEcef n m) = SBPMsgPosEcef n <$> f m+ msg f (SBPMsgPosEcefCov n m) = SBPMsgPosEcefCov n <$> f m msg f (SBPMsgPosEcefDepA n m) = SBPMsgPosEcefDepA n <$> f m msg f (SBPMsgPosLlh n m) = SBPMsgPosLlh n <$> f m+ msg f (SBPMsgPosLlhCov n m) = SBPMsgPosLlhCov n <$> f m 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 (SBPMsgSbasRaw n m) = SBPMsgSbasRaw n <$> f m msg f (SBPMsgSetTime n m) = SBPMsgSetTime n <$> f m msg f (SBPMsgSettingsReadByIndexDone n m) = SBPMsgSettingsReadByIndexDone n <$> f m msg f (SBPMsgSettingsReadByIndexReq n m) = SBPMsgSettingsReadByIndexReq n <$> f m@@ -835,6 +917,9 @@ msg f (SBPMsgSettingsWriteResp n m) = SBPMsgSettingsWriteResp n <$> f m msg f (SBPMsgSpecan n m) = SBPMsgSpecan n <$> f m msg f (SBPMsgSpecanDep n m) = SBPMsgSpecanDep n <$> f m+ msg f (SBPMsgSsrCodeBiases n m) = SBPMsgSsrCodeBiases n <$> f m+ msg f (SBPMsgSsrOrbitClock n m) = SBPMsgSsrOrbitClock n <$> f m+ msg f (SBPMsgSsrPhaseBiases n m) = SBPMsgSsrPhaseBiases n <$> f m msg f (SBPMsgStartup n m) = SBPMsgStartup n <$> f m msg f (SBPMsgStmFlashLockSector n m) = SBPMsgStmFlashLockSector n <$> f m msg f (SBPMsgStmFlashUnlockSector n m) = SBPMsgStmFlashUnlockSector n <$> f m@@ -847,16 +932,19 @@ msg f (SBPMsgTrackingState n m) = SBPMsgTrackingState n <$> f m msg f (SBPMsgTrackingStateDepA n m) = SBPMsgTrackingStateDepA n <$> f m msg f (SBPMsgTrackingStateDepB n m) = SBPMsgTrackingStateDepB n <$> f m- msg f (SBPMsgTrackingStateDetailed n m) = SBPMsgTrackingStateDetailed n <$> f m msg f (SBPMsgTrackingStateDetailedDep n m) = SBPMsgTrackingStateDetailedDep n <$> f m+ msg f (SBPMsgTrackingStateDetailedDepA n m) = SBPMsgTrackingStateDetailedDepA n <$> f m msg f (SBPMsgTweet n m) = SBPMsgTweet n <$> f m msg f (SBPMsgUartState n m) = SBPMsgUartState n <$> f m msg f (SBPMsgUartStateDepa n m) = SBPMsgUartStateDepa n <$> f m msg f (SBPMsgUserData n m) = SBPMsgUserData n <$> f m msg f (SBPMsgUtcTime n m) = SBPMsgUtcTime n <$> f m+ msg f (SBPMsgVelBody n m) = SBPMsgVelBody n <$> f m msg f (SBPMsgVelEcef n m) = SBPMsgVelEcef n <$> f m+ msg f (SBPMsgVelEcefCov n m) = SBPMsgVelEcefCov n <$> f m msg f (SBPMsgVelEcefDepA n m) = SBPMsgVelEcefDepA n <$> f m msg f (SBPMsgVelNed n m) = SBPMsgVelNed n <$> f m+ msg f (SBPMsgVelNedCov n m) = SBPMsgVelNedCov n <$> f m msg f (SBPMsgVelNedDepA n m) = SBPMsgVelNedDepA n <$> f m msg f (SBPMsgUnknown m) = SBPMsgUnknown <$> f m msg f (SBPMsgBadCrc m) = SBPMsgBadCrc <$> f m
@@ -5,9 +5,9 @@ -- | -- Module: SwiftNav.SBP.Navigation--- Copyright: Copyright (C) 2015 Swift Navigation, Inc.+-- Copyright: Copyright (C) 2015-2018 Swift Navigation, Inc. -- License: LGPL-3--- Maintainer: Mark Fine <dev@swiftnav.com>+-- Maintainer: Swift Navigation <dev@swiftnav.com> -- Stability: experimental -- Portability: portable --@@ -19,7 +19,12 @@ -- differential GPS solution, which can use either a fixed/integer or floating -- carrier phase ambiguity. The pseudo-absolute position solution uses a user- -- provided, well-surveyed base station position (if available) and the RTK--- solution in tandem.+-- solution in tandem. When the inertial navigation mode indicates that the+-- IMU is used, all messages are reported in the vehicle body frame as defined+-- by device settings. By default, the vehicle body frame is configured to be+-- coincident with the antenna phase center. When there is no inertial+-- navigation, the solution will be reported at the phase center of the+-- antenna. module SwiftNav.SBP.Navigation ( module SwiftNav.SBP.Navigation@@ -216,7 +221,7 @@ , _msgPosEcef_z :: !Double -- ^ ECEF Z coordinate , _msgPosEcef_accuracy :: !Word16- -- ^ Position accuracy estimate.+ -- ^ Position estimated standard deviation , _msgPosEcef_n_sats :: !Word8 -- ^ Number of satellites used in solution , _msgPosEcef_flags :: !Word8@@ -247,6 +252,80 @@ $(makeJSON "_msgPosEcef_" ''MsgPosEcef) $(makeLenses ''MsgPosEcef) +msgPosEcefCov :: Word16+msgPosEcefCov = 0x0214++-- | SBP class for message MSG_POS_ECEF_COV (0x0214).+--+-- The position solution message reports absolute Earth Centered Earth Fixed+-- (ECEF) coordinates and the status (single point vs pseudo-absolute RTK) of+-- the position solution. The message also reports the upper triangular portion+-- of the 3x3 covariance matrix. If the receiver knows the surveyed position of+-- the base station and has an RTK solution, this reports a pseudo-absolute+-- position solution using the base station position and the rover's RTK+-- baseline vector. The full GPS time is given by the preceding MSG_GPS_TIME+-- with the matching time-of-week (tow).+data MsgPosEcefCov = MsgPosEcefCov+ { _msgPosEcefCov_tow :: !Word32+ -- ^ GPS Time of Week+ , _msgPosEcefCov_x :: !Double+ -- ^ ECEF X coordinate+ , _msgPosEcefCov_y :: !Double+ -- ^ ECEF Y coordinate+ , _msgPosEcefCov_z :: !Double+ -- ^ ECEF Z coordinate+ , _msgPosEcefCov_cov_x_x :: !Float+ -- ^ Estimated variance of x+ , _msgPosEcefCov_cov_x_y :: !Float+ -- ^ Estimated covariance of x and y+ , _msgPosEcefCov_cov_x_z :: !Float+ -- ^ Estimated covariance of x and z+ , _msgPosEcefCov_cov_y_y :: !Float+ -- ^ Estimated variance of y+ , _msgPosEcefCov_cov_y_z :: !Float+ -- ^ Estimated covariance of y and z+ , _msgPosEcefCov_cov_z_z :: !Float+ -- ^ Estimated variance of z+ , _msgPosEcefCov_n_sats :: !Word8+ -- ^ Number of satellites used in solution+ , _msgPosEcefCov_flags :: !Word8+ -- ^ Status flags+ } deriving ( Show, Read, Eq )++instance Binary MsgPosEcefCov where+ get = do+ _msgPosEcefCov_tow <- getWord32le+ _msgPosEcefCov_x <- getFloat64le+ _msgPosEcefCov_y <- getFloat64le+ _msgPosEcefCov_z <- getFloat64le+ _msgPosEcefCov_cov_x_x <- getFloat32le+ _msgPosEcefCov_cov_x_y <- getFloat32le+ _msgPosEcefCov_cov_x_z <- getFloat32le+ _msgPosEcefCov_cov_y_y <- getFloat32le+ _msgPosEcefCov_cov_y_z <- getFloat32le+ _msgPosEcefCov_cov_z_z <- getFloat32le+ _msgPosEcefCov_n_sats <- getWord8+ _msgPosEcefCov_flags <- getWord8+ pure MsgPosEcefCov {..}++ put MsgPosEcefCov {..} = do+ putWord32le _msgPosEcefCov_tow+ putFloat64le _msgPosEcefCov_x+ putFloat64le _msgPosEcefCov_y+ putFloat64le _msgPosEcefCov_z+ putFloat32le _msgPosEcefCov_cov_x_x+ putFloat32le _msgPosEcefCov_cov_x_y+ putFloat32le _msgPosEcefCov_cov_x_z+ putFloat32le _msgPosEcefCov_cov_y_y+ putFloat32le _msgPosEcefCov_cov_y_z+ putFloat32le _msgPosEcefCov_cov_z_z+ putWord8 _msgPosEcefCov_n_sats+ putWord8 _msgPosEcefCov_flags++$(makeSBP 'msgPosEcefCov ''MsgPosEcefCov)+$(makeJSON "_msgPosEcefCov_" ''MsgPosEcefCov)+$(makeLenses ''MsgPosEcefCov)+ msgPosLlh :: Word16 msgPosLlh = 0x020A @@ -269,9 +348,9 @@ , _msgPosLlh_height :: !Double -- ^ Height above WGS84 ellipsoid , _msgPosLlh_h_accuracy :: !Word16- -- ^ Horizontal position accuracy estimate.+ -- ^ Horizontal position estimated standard deviation , _msgPosLlh_v_accuracy :: !Word16- -- ^ Vertical position accuracy estimate.+ -- ^ Vertical position estimated standard deviation , _msgPosLlh_n_sats :: !Word8 -- ^ Number of satellites used in solution. , _msgPosLlh_flags :: !Word8@@ -304,6 +383,80 @@ $(makeJSON "_msgPosLlh_" ''MsgPosLlh) $(makeLenses ''MsgPosLlh) +msgPosLlhCov :: Word16+msgPosLlhCov = 0x0211++-- | SBP class for message MSG_POS_LLH_COV (0x0211).+--+-- This position solution message reports the absolute geodetic coordinates and+-- the status (single point vs pseudo-absolute RTK) of the position solution as+-- well as the upper triangle of the 3x3 covariance matrix. The position+-- information and Fix Mode flags should follow the MSG_POS_LLH message. Since+-- the covariance matrix is computed in the local-level North, East, Down+-- frame, the covariance terms follow with that convention. Thus, covariances+-- are reported against the "downward" measurement and care should be taken+-- with the sign convention.+data MsgPosLlhCov = MsgPosLlhCov+ { _msgPosLlhCov_tow :: !Word32+ -- ^ GPS Time of Week+ , _msgPosLlhCov_lat :: !Double+ -- ^ Latitude+ , _msgPosLlhCov_lon :: !Double+ -- ^ Longitude+ , _msgPosLlhCov_height :: !Double+ -- ^ Height above WGS84 ellipsoid+ , _msgPosLlhCov_cov_n_n :: !Float+ -- ^ Estimated variance of northing+ , _msgPosLlhCov_cov_n_e :: !Float+ -- ^ Covariance of northing and easting+ , _msgPosLlhCov_cov_n_d :: !Float+ -- ^ Covariance of northing and downward measurement+ , _msgPosLlhCov_cov_e_e :: !Float+ -- ^ Estimated variance of easting+ , _msgPosLlhCov_cov_e_d :: !Float+ -- ^ Covariance of easting and downward measurement+ , _msgPosLlhCov_cov_d_d :: !Float+ -- ^ Estimated variance of downward measurement+ , _msgPosLlhCov_n_sats :: !Word8+ -- ^ Number of satellites used in solution.+ , _msgPosLlhCov_flags :: !Word8+ -- ^ Status flags+ } deriving ( Show, Read, Eq )++instance Binary MsgPosLlhCov where+ get = do+ _msgPosLlhCov_tow <- getWord32le+ _msgPosLlhCov_lat <- getFloat64le+ _msgPosLlhCov_lon <- getFloat64le+ _msgPosLlhCov_height <- getFloat64le+ _msgPosLlhCov_cov_n_n <- getFloat32le+ _msgPosLlhCov_cov_n_e <- getFloat32le+ _msgPosLlhCov_cov_n_d <- getFloat32le+ _msgPosLlhCov_cov_e_e <- getFloat32le+ _msgPosLlhCov_cov_e_d <- getFloat32le+ _msgPosLlhCov_cov_d_d <- getFloat32le+ _msgPosLlhCov_n_sats <- getWord8+ _msgPosLlhCov_flags <- getWord8+ pure MsgPosLlhCov {..}++ put MsgPosLlhCov {..} = do+ putWord32le _msgPosLlhCov_tow+ putFloat64le _msgPosLlhCov_lat+ putFloat64le _msgPosLlhCov_lon+ putFloat64le _msgPosLlhCov_height+ putFloat32le _msgPosLlhCov_cov_n_n+ putFloat32le _msgPosLlhCov_cov_n_e+ putFloat32le _msgPosLlhCov_cov_n_d+ putFloat32le _msgPosLlhCov_cov_e_e+ putFloat32le _msgPosLlhCov_cov_e_d+ putFloat32le _msgPosLlhCov_cov_d_d+ putWord8 _msgPosLlhCov_n_sats+ putWord8 _msgPosLlhCov_flags++$(makeSBP 'msgPosLlhCov ''MsgPosLlhCov)+$(makeJSON "_msgPosLlhCov_" ''MsgPosLlhCov)+$(makeLenses ''MsgPosLlhCov)+ msgBaselineEcef :: Word16 msgBaselineEcef = 0x020B @@ -323,7 +476,7 @@ , _msgBaselineEcef_z :: !Int32 -- ^ Baseline ECEF Z coordinate , _msgBaselineEcef_accuracy :: !Word16- -- ^ Position accuracy estimate+ -- ^ Position estimated standard deviation , _msgBaselineEcef_n_sats :: !Word8 -- ^ Number of satellites used in solution , _msgBaselineEcef_flags :: !Word8@@ -375,9 +528,9 @@ , _msgBaselineNed_d :: !Int32 -- ^ Baseline Down coordinate , _msgBaselineNed_h_accuracy :: !Word16- -- ^ Horizontal position accuracy estimate+ -- ^ Horizontal position estimated standard deviation , _msgBaselineNed_v_accuracy :: !Word16- -- ^ Vertical position accuracy estimate+ -- ^ Vertical position estimated standard deviation , _msgBaselineNed_n_sats :: !Word8 -- ^ Number of satellites used in solution , _msgBaselineNed_flags :: !Word8@@ -428,7 +581,7 @@ , _msgVelEcef_z :: !Int32 -- ^ Velocity ECEF Z coordinate , _msgVelEcef_accuracy :: !Word16- -- ^ Velocity accuracy estimate+ -- ^ Velocity estimated standard deviation , _msgVelEcef_n_sats :: !Word8 -- ^ Number of satellites used in solution , _msgVelEcef_flags :: !Word8@@ -459,6 +612,75 @@ $(makeJSON "_msgVelEcef_" ''MsgVelEcef) $(makeLenses ''MsgVelEcef) +msgVelEcefCov :: Word16+msgVelEcefCov = 0x0215++-- | SBP class for message MSG_VEL_ECEF_COV (0x0215).+--+-- This message reports the velocity in Earth Centered Earth Fixed (ECEF)+-- coordinates. The full GPS time is given by the preceding MSG_GPS_TIME with+-- the matching time-of-week (tow).+data MsgVelEcefCov = MsgVelEcefCov+ { _msgVelEcefCov_tow :: !Word32+ -- ^ GPS Time of Week+ , _msgVelEcefCov_x :: !Int32+ -- ^ Velocity ECEF X coordinate+ , _msgVelEcefCov_y :: !Int32+ -- ^ Velocity ECEF Y coordinate+ , _msgVelEcefCov_z :: !Int32+ -- ^ Velocity ECEF Z coordinate+ , _msgVelEcefCov_cov_x_x :: !Float+ -- ^ Estimated variance of x+ , _msgVelEcefCov_cov_x_y :: !Float+ -- ^ Estimated covariance of x and y+ , _msgVelEcefCov_cov_x_z :: !Float+ -- ^ Estimated covariance of x and z+ , _msgVelEcefCov_cov_y_y :: !Float+ -- ^ Estimated variance of y+ , _msgVelEcefCov_cov_y_z :: !Float+ -- ^ Estimated covariance of y and z+ , _msgVelEcefCov_cov_z_z :: !Float+ -- ^ Estimated variance of z+ , _msgVelEcefCov_n_sats :: !Word8+ -- ^ Number of satellites used in solution+ , _msgVelEcefCov_flags :: !Word8+ -- ^ Status flags+ } deriving ( Show, Read, Eq )++instance Binary MsgVelEcefCov where+ get = do+ _msgVelEcefCov_tow <- getWord32le+ _msgVelEcefCov_x <- fromIntegral <$> getWord32le+ _msgVelEcefCov_y <- fromIntegral <$> getWord32le+ _msgVelEcefCov_z <- fromIntegral <$> getWord32le+ _msgVelEcefCov_cov_x_x <- getFloat32le+ _msgVelEcefCov_cov_x_y <- getFloat32le+ _msgVelEcefCov_cov_x_z <- getFloat32le+ _msgVelEcefCov_cov_y_y <- getFloat32le+ _msgVelEcefCov_cov_y_z <- getFloat32le+ _msgVelEcefCov_cov_z_z <- getFloat32le+ _msgVelEcefCov_n_sats <- getWord8+ _msgVelEcefCov_flags <- getWord8+ pure MsgVelEcefCov {..}++ put MsgVelEcefCov {..} = do+ putWord32le _msgVelEcefCov_tow+ putWord32le $ fromIntegral _msgVelEcefCov_x+ putWord32le $ fromIntegral _msgVelEcefCov_y+ putWord32le $ fromIntegral _msgVelEcefCov_z+ putFloat32le _msgVelEcefCov_cov_x_x+ putFloat32le _msgVelEcefCov_cov_x_y+ putFloat32le _msgVelEcefCov_cov_x_z+ putFloat32le _msgVelEcefCov_cov_y_y+ putFloat32le _msgVelEcefCov_cov_y_z+ putFloat32le _msgVelEcefCov_cov_z_z+ putWord8 _msgVelEcefCov_n_sats+ putWord8 _msgVelEcefCov_flags++$(makeSBP 'msgVelEcefCov ''MsgVelEcefCov)+$(makeJSON "_msgVelEcefCov_" ''MsgVelEcefCov)+$(makeLenses ''MsgVelEcefCov)+ msgVelNed :: Word16 msgVelNed = 0x020E @@ -478,9 +700,9 @@ , _msgVelNed_d :: !Int32 -- ^ Velocity Down coordinate , _msgVelNed_h_accuracy :: !Word16- -- ^ Horizontal velocity accuracy estimate+ -- ^ Horizontal velocity estimated standard deviation , _msgVelNed_v_accuracy :: !Word16- -- ^ Vertical velocity accuracy estimate+ -- ^ Vertical velocity estimated standard deviation , _msgVelNed_n_sats :: !Word8 -- ^ Number of satellites used in solution , _msgVelNed_flags :: !Word8@@ -513,43 +735,150 @@ $(makeJSON "_msgVelNed_" ''MsgVelNed) $(makeLenses ''MsgVelNed) -msgBaselineHeading :: Word16-msgBaselineHeading = 0x020F+msgVelNedCov :: Word16+msgVelNedCov = 0x0212 --- | SBP class for message MSG_BASELINE_HEADING (0x020F).+-- | SBP class for message MSG_VEL_NED_COV (0x0212). ----- This message reports the baseline heading pointing from the base station to--- the rover relative to True North. The full GPS time is given by the--- preceding MSG_GPS_TIME with the matching time-of-week (tow). It is intended--- that time-matched RTK mode is used when the base station is moving.-data MsgBaselineHeading = MsgBaselineHeading- { _msgBaselineHeading_tow :: !Word32+-- This message reports the velocity in local North East Down (NED)+-- coordinates. The NED coordinate system is defined as the local WGS84 tangent+-- plane centered at the current position. The full GPS time is given by the+-- preceding MSG_GPS_TIME with the matching time-of-week (tow). This message is+-- similar to the MSG_VEL_NED, but it includes the upper triangular portion of+-- the 3x3 covariance matrix.+data MsgVelNedCov = MsgVelNedCov+ { _msgVelNedCov_tow :: !Word32 -- ^ GPS Time of Week- , _msgBaselineHeading_heading :: !Word32- -- ^ Heading- , _msgBaselineHeading_n_sats :: !Word8+ , _msgVelNedCov_n :: !Int32+ -- ^ Velocity North coordinate+ , _msgVelNedCov_e :: !Int32+ -- ^ Velocity East coordinate+ , _msgVelNedCov_d :: !Int32+ -- ^ Velocity Down coordinate+ , _msgVelNedCov_cov_n_n :: !Float+ -- ^ Estimated variance of northward measurement+ , _msgVelNedCov_cov_n_e :: !Float+ -- ^ Covariance of northward and eastward measurement+ , _msgVelNedCov_cov_n_d :: !Float+ -- ^ Covariance of northward and downward measurement+ , _msgVelNedCov_cov_e_e :: !Float+ -- ^ Estimated variance of eastward measurement+ , _msgVelNedCov_cov_e_d :: !Float+ -- ^ Covariance of eastward and downward measurement+ , _msgVelNedCov_cov_d_d :: !Float+ -- ^ Estimated variance of downward measurement+ , _msgVelNedCov_n_sats :: !Word8 -- ^ Number of satellites used in solution- , _msgBaselineHeading_flags :: !Word8+ , _msgVelNedCov_flags :: !Word8 -- ^ Status flags } deriving ( Show, Read, Eq ) -instance Binary MsgBaselineHeading where+instance Binary MsgVelNedCov where get = do- _msgBaselineHeading_tow <- getWord32le- _msgBaselineHeading_heading <- getWord32le- _msgBaselineHeading_n_sats <- getWord8- _msgBaselineHeading_flags <- getWord8- pure MsgBaselineHeading {..}+ _msgVelNedCov_tow <- getWord32le+ _msgVelNedCov_n <- fromIntegral <$> getWord32le+ _msgVelNedCov_e <- fromIntegral <$> getWord32le+ _msgVelNedCov_d <- fromIntegral <$> getWord32le+ _msgVelNedCov_cov_n_n <- getFloat32le+ _msgVelNedCov_cov_n_e <- getFloat32le+ _msgVelNedCov_cov_n_d <- getFloat32le+ _msgVelNedCov_cov_e_e <- getFloat32le+ _msgVelNedCov_cov_e_d <- getFloat32le+ _msgVelNedCov_cov_d_d <- getFloat32le+ _msgVelNedCov_n_sats <- getWord8+ _msgVelNedCov_flags <- getWord8+ pure MsgVelNedCov {..} - put MsgBaselineHeading {..} = do- putWord32le _msgBaselineHeading_tow- putWord32le _msgBaselineHeading_heading- putWord8 _msgBaselineHeading_n_sats- putWord8 _msgBaselineHeading_flags+ put MsgVelNedCov {..} = do+ putWord32le _msgVelNedCov_tow+ putWord32le $ fromIntegral _msgVelNedCov_n+ putWord32le $ fromIntegral _msgVelNedCov_e+ putWord32le $ fromIntegral _msgVelNedCov_d+ putFloat32le _msgVelNedCov_cov_n_n+ putFloat32le _msgVelNedCov_cov_n_e+ putFloat32le _msgVelNedCov_cov_n_d+ putFloat32le _msgVelNedCov_cov_e_e+ putFloat32le _msgVelNedCov_cov_e_d+ putFloat32le _msgVelNedCov_cov_d_d+ putWord8 _msgVelNedCov_n_sats+ putWord8 _msgVelNedCov_flags -$(makeSBP 'msgBaselineHeading ''MsgBaselineHeading)-$(makeJSON "_msgBaselineHeading_" ''MsgBaselineHeading)-$(makeLenses ''MsgBaselineHeading)+$(makeSBP 'msgVelNedCov ''MsgVelNedCov)+$(makeJSON "_msgVelNedCov_" ''MsgVelNedCov)+$(makeLenses ''MsgVelNedCov)++msgVelBody :: Word16+msgVelBody = 0x0213++-- | SBP class for message MSG_VEL_BODY (0x0213).+--+-- This message reports the velocity in the Vehicle Body Frame. By convention,+-- the x-axis should point out the nose of the vehicle and represent the+-- forward direction, while as the y-axis should point out the right hand side+-- of the vehicle. Since this is a right handed system, z should point out the+-- bottom of the vehicle. The orientation and origin of the Vehicle Body Frame+-- are specified via the device settings. The full GPS time is given by the+-- preceding MSG_GPS_TIME with the matching time-of-week (tow).+data MsgVelBody = MsgVelBody+ { _msgVelBody_tow :: !Word32+ -- ^ GPS Time of Week+ , _msgVelBody_x :: !Int32+ -- ^ Velocity in x direction+ , _msgVelBody_y :: !Int32+ -- ^ Velocity in y direction+ , _msgVelBody_z :: !Int32+ -- ^ Velocity in z direction+ , _msgVelBody_cov_x_x :: !Float+ -- ^ Estimated variance of x+ , _msgVelBody_cov_x_y :: !Float+ -- ^ Covariance of x and y+ , _msgVelBody_cov_x_z :: !Float+ -- ^ Covariance of x and z+ , _msgVelBody_cov_y_y :: !Float+ -- ^ Estimated variance of y+ , _msgVelBody_cov_y_z :: !Float+ -- ^ Covariance of y and z+ , _msgVelBody_cov_z_z :: !Float+ -- ^ Estimated variance of z+ , _msgVelBody_n_sats :: !Word8+ -- ^ Number of satellites used in solution+ , _msgVelBody_flags :: !Word8+ -- ^ Status flags+ } deriving ( Show, Read, Eq )++instance Binary MsgVelBody where+ get = do+ _msgVelBody_tow <- getWord32le+ _msgVelBody_x <- fromIntegral <$> getWord32le+ _msgVelBody_y <- fromIntegral <$> getWord32le+ _msgVelBody_z <- fromIntegral <$> getWord32le+ _msgVelBody_cov_x_x <- getFloat32le+ _msgVelBody_cov_x_y <- getFloat32le+ _msgVelBody_cov_x_z <- getFloat32le+ _msgVelBody_cov_y_y <- getFloat32le+ _msgVelBody_cov_y_z <- getFloat32le+ _msgVelBody_cov_z_z <- getFloat32le+ _msgVelBody_n_sats <- getWord8+ _msgVelBody_flags <- getWord8+ pure MsgVelBody {..}++ put MsgVelBody {..} = do+ putWord32le _msgVelBody_tow+ putWord32le $ fromIntegral _msgVelBody_x+ putWord32le $ fromIntegral _msgVelBody_y+ putWord32le $ fromIntegral _msgVelBody_z+ putFloat32le _msgVelBody_cov_x_x+ putFloat32le _msgVelBody_cov_x_y+ putFloat32le _msgVelBody_cov_x_z+ putFloat32le _msgVelBody_cov_y_y+ putFloat32le _msgVelBody_cov_y_z+ putFloat32le _msgVelBody_cov_z_z+ putWord8 _msgVelBody_n_sats+ putWord8 _msgVelBody_flags++$(makeSBP 'msgVelBody ''MsgVelBody)+$(makeJSON "_msgVelBody_" ''MsgVelBody)+$(makeLenses ''MsgVelBody) msgAgeCorrections :: Word16 msgAgeCorrections = 0x0210
@@ -5,9 +5,9 @@ -- | -- Module: SwiftNav.SBP.Ndb--- Copyright: Copyright (C) 2015 Swift Navigation, Inc.+-- Copyright: Copyright (C) 2015-2018 Swift Navigation, Inc. -- License: LGPL-3--- Maintainer: Mark Fine <dev@swiftnav.com>+-- Maintainer: Swift Navigation <dev@swiftnav.com> -- Stability: experimental -- Portability: portable --
@@ -5,9 +5,9 @@ -- | -- Module: SwiftNav.SBP.Observation--- Copyright: Copyright (C) 2015 Swift Navigation, Inc.+-- Copyright: Copyright (C) 2015-2018 Swift Navigation, Inc. -- License: LGPL-3--- Maintainer: Mark Fine <dev@swiftnav.com>+-- Maintainer: Swift Navigation <dev@swiftnav.com> -- Stability: experimental -- Portability: portable --
@@ -0,0 +1,234 @@+{-# OPTIONS_GHC -fno-warn-unused-imports #-}+{-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE RecordWildCards #-}++-- |+-- Module: SwiftNav.SBP.Orientation+-- Copyright: Copyright (C) 2015-2018 Swift Navigation, Inc.+-- License: LGPL-3+-- Maintainer: Swift Navigation <dev@swiftnav.com>+-- Stability: experimental+-- Portability: portable+--+-- Orientation Messages++module SwiftNav.SBP.Orientation+ ( module SwiftNav.SBP.Orientation+ ) where++import BasicPrelude+import Control.Lens+import Control.Monad.Loops+import Data.Binary+import Data.Binary.Get+import Data.Binary.IEEE754+import Data.Binary.Put+import Data.ByteString.Lazy hiding (ByteString)+import Data.Int+import Data.Word+import SwiftNav.SBP.TH++{-# ANN module ("HLint: ignore Use camelCase"::String) #-}+{-# ANN module ("HLint: ignore Redundant do"::String) #-}+{-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}+++msgBaselineHeading :: Word16+msgBaselineHeading = 0x020F++-- | SBP class for message MSG_BASELINE_HEADING (0x020F).+--+-- This message reports the baseline heading pointing from the base station to+-- the rover relative to True North. The full GPS time is given by the+-- preceding MSG_GPS_TIME with the matching time-of-week (tow). It is intended+-- that time-matched RTK mode is used when the base station is moving.+data MsgBaselineHeading = MsgBaselineHeading+ { _msgBaselineHeading_tow :: !Word32+ -- ^ GPS Time of Week+ , _msgBaselineHeading_heading :: !Word32+ -- ^ Heading+ , _msgBaselineHeading_n_sats :: !Word8+ -- ^ Number of satellites used in solution+ , _msgBaselineHeading_flags :: !Word8+ -- ^ Status flags+ } deriving ( Show, Read, Eq )++instance Binary MsgBaselineHeading where+ get = do+ _msgBaselineHeading_tow <- getWord32le+ _msgBaselineHeading_heading <- getWord32le+ _msgBaselineHeading_n_sats <- getWord8+ _msgBaselineHeading_flags <- getWord8+ pure MsgBaselineHeading {..}++ put MsgBaselineHeading {..} = do+ putWord32le _msgBaselineHeading_tow+ putWord32le _msgBaselineHeading_heading+ putWord8 _msgBaselineHeading_n_sats+ putWord8 _msgBaselineHeading_flags++$(makeSBP 'msgBaselineHeading ''MsgBaselineHeading)+$(makeJSON "_msgBaselineHeading_" ''MsgBaselineHeading)+$(makeLenses ''MsgBaselineHeading)++msgOrientQuat :: Word16+msgOrientQuat = 0x0220++-- | SBP class for message MSG_ORIENT_QUAT (0x0220).+--+-- This message reports the quaternion vector describing the vehicle body+-- frame's orientation with respect to a local-level NED frame. The components+-- of the vector should sum to a unit vector assuming that the LSB of each+-- component as a value of 2^-31.+data MsgOrientQuat = MsgOrientQuat+ { _msgOrientQuat_tow :: !Word32+ -- ^ GPS Time of Week+ , _msgOrientQuat_w :: !Int32+ -- ^ Real component+ , _msgOrientQuat_x :: !Int32+ -- ^ 1st imaginary component+ , _msgOrientQuat_y :: !Int32+ -- ^ 2nd imaginary component+ , _msgOrientQuat_z :: !Int32+ -- ^ 3rd imaginary component+ , _msgOrientQuat_acc_w :: !Float+ -- ^ Estimated standard deviation of w+ , _msgOrientQuat_acc_x :: !Float+ -- ^ Estimated standard deviation of x+ , _msgOrientQuat_acc_y :: !Float+ -- ^ Estimated standard deviation of y+ , _msgOrientQuat_acc_z :: !Float+ -- ^ Estimated standard deviation of z+ , _msgOrientQuat_flags :: !Word8+ -- ^ Status flags+ } deriving ( Show, Read, Eq )++instance Binary MsgOrientQuat where+ get = do+ _msgOrientQuat_tow <- getWord32le+ _msgOrientQuat_w <- fromIntegral <$> getWord32le+ _msgOrientQuat_x <- fromIntegral <$> getWord32le+ _msgOrientQuat_y <- fromIntegral <$> getWord32le+ _msgOrientQuat_z <- fromIntegral <$> getWord32le+ _msgOrientQuat_acc_w <- getFloat32le+ _msgOrientQuat_acc_x <- getFloat32le+ _msgOrientQuat_acc_y <- getFloat32le+ _msgOrientQuat_acc_z <- getFloat32le+ _msgOrientQuat_flags <- getWord8+ pure MsgOrientQuat {..}++ put MsgOrientQuat {..} = do+ putWord32le _msgOrientQuat_tow+ putWord32le $ fromIntegral _msgOrientQuat_w+ putWord32le $ fromIntegral _msgOrientQuat_x+ putWord32le $ fromIntegral _msgOrientQuat_y+ putWord32le $ fromIntegral _msgOrientQuat_z+ putFloat32le _msgOrientQuat_acc_w+ putFloat32le _msgOrientQuat_acc_x+ putFloat32le _msgOrientQuat_acc_y+ putFloat32le _msgOrientQuat_acc_z+ putWord8 _msgOrientQuat_flags++$(makeSBP 'msgOrientQuat ''MsgOrientQuat)+$(makeJSON "_msgOrientQuat_" ''MsgOrientQuat)+$(makeLenses ''MsgOrientQuat)++msgOrientEuler :: Word16+msgOrientEuler = 0x0221++-- | SBP class for message MSG_ORIENT_EULER (0x0221).+--+-- This message reports the yaw, pitch, and roll angles of the vehicle body+-- frame. The rotations should applied intrinsically in the order yaw, pitch,+-- and roll in order to rotate the from a frame aligned with the local-level+-- NED frame to the vehicle body frame.+data MsgOrientEuler = MsgOrientEuler+ { _msgOrientEuler_tow :: !Word32+ -- ^ GPS Time of Week+ , _msgOrientEuler_roll :: !Int32+ -- ^ rotation about the forward axis of the vehicle+ , _msgOrientEuler_pitch :: !Int32+ -- ^ rotation about the rightward axis of the vehicle+ , _msgOrientEuler_yaw :: !Int32+ -- ^ rotation about the downward axis of the vehicle+ , _msgOrientEuler_var_roll :: !Float+ -- ^ Estimated standard deviation of roll+ , _msgOrientEuler_var_pitch :: !Float+ -- ^ Estimated standard deviation of pitch+ , _msgOrientEuler_var_yaw :: !Float+ -- ^ Estimated standard deviation of yaw+ , _msgOrientEuler_flags :: !Word8+ -- ^ Status flags+ } deriving ( Show, Read, Eq )++instance Binary MsgOrientEuler where+ get = do+ _msgOrientEuler_tow <- getWord32le+ _msgOrientEuler_roll <- fromIntegral <$> getWord32le+ _msgOrientEuler_pitch <- fromIntegral <$> getWord32le+ _msgOrientEuler_yaw <- fromIntegral <$> getWord32le+ _msgOrientEuler_var_roll <- getFloat32le+ _msgOrientEuler_var_pitch <- getFloat32le+ _msgOrientEuler_var_yaw <- getFloat32le+ _msgOrientEuler_flags <- getWord8+ pure MsgOrientEuler {..}++ put MsgOrientEuler {..} = do+ putWord32le _msgOrientEuler_tow+ putWord32le $ fromIntegral _msgOrientEuler_roll+ putWord32le $ fromIntegral _msgOrientEuler_pitch+ putWord32le $ fromIntegral _msgOrientEuler_yaw+ putFloat32le _msgOrientEuler_var_roll+ putFloat32le _msgOrientEuler_var_pitch+ putFloat32le _msgOrientEuler_var_yaw+ putWord8 _msgOrientEuler_flags++$(makeSBP 'msgOrientEuler ''MsgOrientEuler)+$(makeJSON "_msgOrientEuler_" ''MsgOrientEuler)+$(makeLenses ''MsgOrientEuler)++msgAngularRate :: Word16+msgAngularRate = 0x0222++-- | SBP class for message MSG_ANGULAR_RATE (0x0222).+--+-- This message reports the orientation rates in the vehicle body frame. The+-- values represent the measurements a strapped down gyroscope would make and+-- are not equivalent to the time derivative of the Euler angles. The+-- orientation and origin of the user frame is specified via device settings.+-- By convention, the vehicle x-axis is expected to be aligned with the forward+-- direction, while the vehicle y-axis is expected to be aligned with the right+-- direction, and the vehicle z-axis should be aligned with the down direction.+data MsgAngularRate = MsgAngularRate+ { _msgAngularRate_tow :: !Word32+ -- ^ GPS Time of Week+ , _msgAngularRate_x :: !Int32+ -- ^ angular rate about x axis+ , _msgAngularRate_y :: !Int32+ -- ^ angular rate about y axis+ , _msgAngularRate_z :: !Int32+ -- ^ angular rate about z axis+ , _msgAngularRate_flags :: !Word8+ -- ^ Status flags+ } deriving ( Show, Read, Eq )++instance Binary MsgAngularRate where+ get = do+ _msgAngularRate_tow <- getWord32le+ _msgAngularRate_x <- fromIntegral <$> getWord32le+ _msgAngularRate_y <- fromIntegral <$> getWord32le+ _msgAngularRate_z <- fromIntegral <$> getWord32le+ _msgAngularRate_flags <- getWord8+ pure MsgAngularRate {..}++ put MsgAngularRate {..} = do+ putWord32le _msgAngularRate_tow+ putWord32le $ fromIntegral _msgAngularRate_x+ putWord32le $ fromIntegral _msgAngularRate_y+ putWord32le $ fromIntegral _msgAngularRate_z+ putWord8 _msgAngularRate_flags++$(makeSBP 'msgAngularRate ''MsgAngularRate)+$(makeJSON "_msgAngularRate_" ''MsgAngularRate)+$(makeLenses ''MsgAngularRate)
@@ -5,9 +5,9 @@ -- | -- Module: SwiftNav.SBP.Piksi--- Copyright: Copyright (C) 2015 Swift Navigation, Inc.+-- Copyright: Copyright (C) 2015-2018 Swift Navigation, Inc. -- License: LGPL-3--- Maintainer: Mark Fine <dev@swiftnav.com>+-- Maintainer: Swift Navigation <dev@swiftnav.com> -- Stability: experimental -- Portability: portable --
@@ -0,0 +1,72 @@+{-# OPTIONS_GHC -fno-warn-unused-imports #-}+{-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE RecordWildCards #-}++-- |+-- Module: SwiftNav.SBP.Sbas+-- Copyright: Copyright (C) 2015-2018 Swift Navigation, Inc.+-- License: LGPL-3+-- Maintainer: Swift Navigation <dev@swiftnav.com>+-- Stability: experimental+-- Portability: portable+--+-- SBAS data++module SwiftNav.SBP.Sbas+ ( module SwiftNav.SBP.Sbas+ ) where++import BasicPrelude+import Control.Lens+import Control.Monad.Loops+import Data.Binary+import Data.Binary.Get+import Data.Binary.IEEE754+import Data.Binary.Put+import Data.ByteString.Lazy hiding (ByteString)+import Data.Int+import Data.Word+import SwiftNav.SBP.TH+import SwiftNav.SBP.Gnss++{-# ANN module ("HLint: ignore Use camelCase"::String) #-}+{-# ANN module ("HLint: ignore Redundant do"::String) #-}+{-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}+++msgSbasRaw :: Word16+msgSbasRaw = 0x7777++-- | SBP class for message MSG_SBAS_RAW (0x7777).+--+-- This message is sent once per second per SBAS satellite. ME checks the+-- parity of the data block and sends only blocks that pass the check.+data MsgSbasRaw = MsgSbasRaw+ { _msgSbasRaw_sid :: !GnssSignal+ -- ^ GNSS signal identifier.+ , _msgSbasRaw_tow :: !Word32+ -- ^ GPS time-of-week at the start of the data block.+ , _msgSbasRaw_message_type :: !Word8+ -- ^ SBAS message type (0-63)+ , _msgSbasRaw_data :: ![Word8]+ -- ^ Raw SBAS data field of 212 bits (last byte padded with zeros).+ } deriving ( Show, Read, Eq )++instance Binary MsgSbasRaw where+ get = do+ _msgSbasRaw_sid <- get+ _msgSbasRaw_tow <- getWord32le+ _msgSbasRaw_message_type <- getWord8+ _msgSbasRaw_data <- replicateM 27 getWord8+ pure MsgSbasRaw {..}++ put MsgSbasRaw {..} = do+ put _msgSbasRaw_sid+ putWord32le _msgSbasRaw_tow+ putWord8 _msgSbasRaw_message_type+ mapM_ putWord8 _msgSbasRaw_data++$(makeSBP 'msgSbasRaw ''MsgSbasRaw)+$(makeJSON "_msgSbasRaw_" ''MsgSbasRaw)+$(makeLenses ''MsgSbasRaw)
@@ -5,9 +5,9 @@ -- | -- Module: SwiftNav.SBP.Settings--- Copyright: Copyright (C) 2015 Swift Navigation, Inc.+-- Copyright: Copyright (C) 2015-2018 Swift Navigation, Inc. -- License: LGPL-3--- Maintainer: Mark Fine <dev@swiftnav.com>+-- Maintainer: Swift Navigation <dev@swiftnav.com> -- Stability: experimental -- Portability: portable --
@@ -0,0 +1,278 @@+{-# OPTIONS_GHC -fno-warn-unused-imports #-}+{-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE RecordWildCards #-}++-- |+-- Module: SwiftNav.SBP.Ssr+-- Copyright: Copyright (C) 2015-2018 Swift Navigation, Inc.+-- License: LGPL-3+-- Maintainer: Swift Navigation <dev@swiftnav.com>+-- Stability: experimental+-- Portability: portable+--+-- Precise State Space Representation (SSR) corrections format++module SwiftNav.SBP.Ssr+ ( module SwiftNav.SBP.Ssr+ ) where++import BasicPrelude+import Control.Lens+import Control.Monad.Loops+import Data.Binary+import Data.Binary.Get+import Data.Binary.IEEE754+import Data.Binary.Put+import Data.ByteString.Lazy hiding (ByteString)+import Data.Int+import Data.Word+import SwiftNav.SBP.TH+import SwiftNav.SBP.Types+import SwiftNav.SBP.Gnss++{-# ANN module ("HLint: ignore Use camelCase"::String) #-}+{-# ANN module ("HLint: ignore Redundant do"::String) #-}+{-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}+++-- | CodeBiasesContent.+--+-- Code biases are to be added to pseudorange. The corrections are conform with+-- typical RTCMv3 MT1059 and 1065.+data CodeBiasesContent = CodeBiasesContent+ { _codeBiasesContent_code :: !Word8+ -- ^ Signal constellation, band and code+ , _codeBiasesContent_value :: !Int16+ -- ^ Code bias value+ } deriving ( Show, Read, Eq )++instance Binary CodeBiasesContent where+ get = do+ _codeBiasesContent_code <- getWord8+ _codeBiasesContent_value <- fromIntegral <$> getWord16le+ pure CodeBiasesContent {..}++ put CodeBiasesContent {..} = do+ putWord8 _codeBiasesContent_code+ putWord16le $ fromIntegral _codeBiasesContent_value++$(makeJSON "_codeBiasesContent_" ''CodeBiasesContent)+$(makeLenses ''CodeBiasesContent)++-- | PhaseBiasesContent.+--+-- Phase biases are to be added to carrier phase measurements. The corrections+-- are conform with typical RTCMv3 MT1059 and 1065.+data PhaseBiasesContent = PhaseBiasesContent+ { _phaseBiasesContent_code :: !Word8+ -- ^ Signal constellation, band and code+ , _phaseBiasesContent_integer_indicator :: !Word8+ -- ^ Indicator for integer property+ , _phaseBiasesContent_widelane_integer_indicator :: !Word8+ -- ^ Indicator for two groups of Wide-Lane(s) integer property+ , _phaseBiasesContent_discontinuity_counter :: !Word8+ -- ^ Signal phase discontinuity counter. Increased for every discontinuity+ -- in phase.+ , _phaseBiasesContent_bias :: !Int32+ -- ^ Phase bias for specified signal+ } deriving ( Show, Read, Eq )++instance Binary PhaseBiasesContent where+ get = do+ _phaseBiasesContent_code <- getWord8+ _phaseBiasesContent_integer_indicator <- getWord8+ _phaseBiasesContent_widelane_integer_indicator <- getWord8+ _phaseBiasesContent_discontinuity_counter <- getWord8+ _phaseBiasesContent_bias <- fromIntegral <$> getWord32le+ pure PhaseBiasesContent {..}++ put PhaseBiasesContent {..} = do+ putWord8 _phaseBiasesContent_code+ putWord8 _phaseBiasesContent_integer_indicator+ putWord8 _phaseBiasesContent_widelane_integer_indicator+ putWord8 _phaseBiasesContent_discontinuity_counter+ putWord32le $ fromIntegral _phaseBiasesContent_bias++$(makeJSON "_phaseBiasesContent_" ''PhaseBiasesContent)+$(makeLenses ''PhaseBiasesContent)++msgSsrOrbitClock :: Word16+msgSsrOrbitClock = 0x05DC++-- | SBP class for message MSG_SSR_ORBIT_CLOCK (0x05DC).+--+-- The precise orbit and clock correction message is to be applied as a delta+-- correction to broadcast ephemeris and is typically an equivalent to the+-- 1060 and 1066 RTCM message types+data MsgSsrOrbitClock = MsgSsrOrbitClock+ { _msgSsrOrbitClock_time :: !GpsTimeSec+ -- ^ GNSS reference time of the correction+ , _msgSsrOrbitClock_sid :: !GnssSignal+ -- ^ GNSS signal identifier (16 bit)+ , _msgSsrOrbitClock_update_interval :: !Word8+ -- ^ Update interval between consecutive corrections+ , _msgSsrOrbitClock_iod_ssr :: !Word8+ -- ^ IOD of the SSR correction. A change of Issue Of Data SSR is used to+ -- indicate a change in the SSR generating configuration+ , _msgSsrOrbitClock_iod :: !Word8+ -- ^ Issue of broadcast ephemeris data+ , _msgSsrOrbitClock_radial :: !Int32+ -- ^ Orbit radial delta correction+ , _msgSsrOrbitClock_along :: !Int32+ -- ^ Orbit along delta correction+ , _msgSsrOrbitClock_cross :: !Int32+ -- ^ Orbit along delta correction+ , _msgSsrOrbitClock_dot_radial :: !Int32+ -- ^ Velocity of orbit radial delta correction+ , _msgSsrOrbitClock_dot_along :: !Int32+ -- ^ Velocity of orbit along delta correction+ , _msgSsrOrbitClock_dot_cross :: !Int32+ -- ^ Velocity of orbit cross delta correction+ , _msgSsrOrbitClock_c0 :: !Int32+ -- ^ C0 polynomial coefficient for correction of broadcast satellite clock+ , _msgSsrOrbitClock_c1 :: !Int32+ -- ^ C1 polynomial coefficient for correction of broadcast satellite clock+ , _msgSsrOrbitClock_c2 :: !Int32+ -- ^ C2 polynomial coefficient for correction of broadcast satellite clock+ } deriving ( Show, Read, Eq )++instance Binary MsgSsrOrbitClock where+ get = do+ _msgSsrOrbitClock_time <- get+ _msgSsrOrbitClock_sid <- get+ _msgSsrOrbitClock_update_interval <- getWord8+ _msgSsrOrbitClock_iod_ssr <- getWord8+ _msgSsrOrbitClock_iod <- getWord8+ _msgSsrOrbitClock_radial <- fromIntegral <$> getWord32le+ _msgSsrOrbitClock_along <- fromIntegral <$> getWord32le+ _msgSsrOrbitClock_cross <- fromIntegral <$> getWord32le+ _msgSsrOrbitClock_dot_radial <- fromIntegral <$> getWord32le+ _msgSsrOrbitClock_dot_along <- fromIntegral <$> getWord32le+ _msgSsrOrbitClock_dot_cross <- fromIntegral <$> getWord32le+ _msgSsrOrbitClock_c0 <- fromIntegral <$> getWord32le+ _msgSsrOrbitClock_c1 <- fromIntegral <$> getWord32le+ _msgSsrOrbitClock_c2 <- fromIntegral <$> getWord32le+ pure MsgSsrOrbitClock {..}++ put MsgSsrOrbitClock {..} = do+ put _msgSsrOrbitClock_time+ put _msgSsrOrbitClock_sid+ putWord8 _msgSsrOrbitClock_update_interval+ putWord8 _msgSsrOrbitClock_iod_ssr+ putWord8 _msgSsrOrbitClock_iod+ putWord32le $ fromIntegral _msgSsrOrbitClock_radial+ putWord32le $ fromIntegral _msgSsrOrbitClock_along+ putWord32le $ fromIntegral _msgSsrOrbitClock_cross+ putWord32le $ fromIntegral _msgSsrOrbitClock_dot_radial+ putWord32le $ fromIntegral _msgSsrOrbitClock_dot_along+ putWord32le $ fromIntegral _msgSsrOrbitClock_dot_cross+ putWord32le $ fromIntegral _msgSsrOrbitClock_c0+ putWord32le $ fromIntegral _msgSsrOrbitClock_c1+ putWord32le $ fromIntegral _msgSsrOrbitClock_c2++$(makeSBP 'msgSsrOrbitClock ''MsgSsrOrbitClock)+$(makeJSON "_msgSsrOrbitClock_" ''MsgSsrOrbitClock)+$(makeLenses ''MsgSsrOrbitClock)++msgSsrCodeBiases :: Word16+msgSsrCodeBiases = 0x05E1++-- | SBP class for message MSG_SSR_CODE_BIASES (0x05E1).+--+-- The precise code biases message is to be added to the pseudorange of the+-- corresponding signal to get corrected pseudorange. It is typically an+-- equivalent to the 1059 and 1065 RTCM message types+data MsgSsrCodeBiases = MsgSsrCodeBiases+ { _msgSsrCodeBiases_time :: !GpsTimeSec+ -- ^ GNSS reference time of the correction+ , _msgSsrCodeBiases_sid :: !GnssSignal+ -- ^ GNSS signal identifier (16 bit)+ , _msgSsrCodeBiases_update_interval :: !Word8+ -- ^ Update interval between consecutive corrections+ , _msgSsrCodeBiases_iod_ssr :: !Word8+ -- ^ IOD of the SSR correction. A change of Issue Of Data SSR is used to+ -- indicate a change in the SSR generating configuration+ , _msgSsrCodeBiases_biases :: ![CodeBiasesContent]+ -- ^ Code biases for the different satellite signals+ } deriving ( Show, Read, Eq )++instance Binary MsgSsrCodeBiases where+ get = do+ _msgSsrCodeBiases_time <- get+ _msgSsrCodeBiases_sid <- get+ _msgSsrCodeBiases_update_interval <- getWord8+ _msgSsrCodeBiases_iod_ssr <- getWord8+ _msgSsrCodeBiases_biases <- replicateM 8 get+ pure MsgSsrCodeBiases {..}++ put MsgSsrCodeBiases {..} = do+ put _msgSsrCodeBiases_time+ put _msgSsrCodeBiases_sid+ putWord8 _msgSsrCodeBiases_update_interval+ putWord8 _msgSsrCodeBiases_iod_ssr+ mapM_ put _msgSsrCodeBiases_biases++$(makeSBP 'msgSsrCodeBiases ''MsgSsrCodeBiases)+$(makeJSON "_msgSsrCodeBiases_" ''MsgSsrCodeBiases)+$(makeLenses ''MsgSsrCodeBiases)++msgSsrPhaseBiases :: Word16+msgSsrPhaseBiases = 0x05E6++-- | SBP class for message MSG_SSR_PHASE_BIASES (0x05E6).+--+-- The precise phase biases message contains the biases to be added to the+-- carrier phase of the corresponding signal to get corrected carrier phase+-- measurement, as well as the satellite yaw angle to be applied to compute+-- the phase wind-up correction. It is typically an equivalent to the 1265+-- RTCM message types+data MsgSsrPhaseBiases = MsgSsrPhaseBiases+ { _msgSsrPhaseBiases_time :: !GpsTimeSec+ -- ^ GNSS reference time of the correction+ , _msgSsrPhaseBiases_sid :: !GnssSignal+ -- ^ GNSS signal identifier (16 bit)+ , _msgSsrPhaseBiases_update_interval :: !Word8+ -- ^ Update interval between consecutive corrections+ , _msgSsrPhaseBiases_iod_ssr :: !Word8+ -- ^ IOD of the SSR correction. A change of Issue Of Data SSR is used to+ -- indicate a change in the SSR generating configuration+ , _msgSsrPhaseBiases_dispersive_bias :: !Word8+ -- ^ Indicator for the dispersive phase biases property.+ , _msgSsrPhaseBiases_mw_consistency :: !Word8+ -- ^ Consistency indicator for Melbourne-Wubbena linear combinations+ , _msgSsrPhaseBiases_yaw :: !Word16+ -- ^ Satellite yaw angle+ , _msgSsrPhaseBiases_yaw_rate :: !Int16+ -- ^ Satellite yaw angle rate+ , _msgSsrPhaseBiases_biases :: ![PhaseBiasesContent]+ -- ^ Phase biases corrections for a satellite being tracked.+ } deriving ( Show, Read, Eq )++instance Binary MsgSsrPhaseBiases where+ get = do+ _msgSsrPhaseBiases_time <- get+ _msgSsrPhaseBiases_sid <- get+ _msgSsrPhaseBiases_update_interval <- getWord8+ _msgSsrPhaseBiases_iod_ssr <- getWord8+ _msgSsrPhaseBiases_dispersive_bias <- getWord8+ _msgSsrPhaseBiases_mw_consistency <- getWord8+ _msgSsrPhaseBiases_yaw <- getWord16le+ _msgSsrPhaseBiases_yaw_rate <- fromIntegral <$> getWord16le+ _msgSsrPhaseBiases_biases <- replicateM 8 get+ pure MsgSsrPhaseBiases {..}++ put MsgSsrPhaseBiases {..} = do+ put _msgSsrPhaseBiases_time+ put _msgSsrPhaseBiases_sid+ putWord8 _msgSsrPhaseBiases_update_interval+ putWord8 _msgSsrPhaseBiases_iod_ssr+ putWord8 _msgSsrPhaseBiases_dispersive_bias+ putWord8 _msgSsrPhaseBiases_mw_consistency+ putWord16le _msgSsrPhaseBiases_yaw+ putWord16le $ fromIntegral _msgSsrPhaseBiases_yaw_rate+ mapM_ put _msgSsrPhaseBiases_biases++$(makeSBP 'msgSsrPhaseBiases ''MsgSsrPhaseBiases)+$(makeJSON "_msgSsrPhaseBiases_" ''MsgSsrPhaseBiases)+$(makeLenses ''MsgSsrPhaseBiases)
@@ -5,9 +5,9 @@ -- | -- Module: SwiftNav.SBP.System--- Copyright: Copyright (C) 2015 Swift Navigation, Inc.+-- Copyright: Copyright (C) 2015-2018 Swift Navigation, Inc. -- License: LGPL-3--- Maintainer: Mark Fine <dev@swiftnav.com>+-- Maintainer: Swift Navigation <dev@swiftnav.com> -- Stability: experimental -- Portability: portable --@@ -133,3 +133,27 @@ $(makeSBP 'msgHeartbeat ''MsgHeartbeat) $(makeJSON "_msgHeartbeat_" ''MsgHeartbeat) $(makeLenses ''MsgHeartbeat)++msgInsStatus :: Word16+msgInsStatus = 0xFF03++-- | SBP class for message MSG_INS_STATUS (0xFF03).+--+-- The INS status message describes the state of the operation and+-- initialization of the inertial navigation system.+data MsgInsStatus = MsgInsStatus+ { _msgInsStatus_flags :: !Word32+ -- ^ Status flags+ } deriving ( Show, Read, Eq )++instance Binary MsgInsStatus where+ get = do+ _msgInsStatus_flags <- getWord32le+ pure MsgInsStatus {..}++ put MsgInsStatus {..} = do+ putWord32le _msgInsStatus_flags++$(makeSBP 'msgInsStatus ''MsgInsStatus)+$(makeJSON "_msgInsStatus_" ''MsgInsStatus)+$(makeLenses ''MsgInsStatus)
@@ -5,9 +5,9 @@ -- | -- Module: SwiftNav.SBP.Tracking--- Copyright: Copyright (C) 2015 Swift Navigation, Inc.+-- Copyright: Copyright (C) 2015-2018 Swift Navigation, Inc. -- License: LGPL-3--- Maintainer: Mark Fine <dev@swiftnav.com>+-- Maintainer: Swift Navigation <dev@swiftnav.com> -- Stability: experimental -- Portability: portable --@@ -36,115 +36,115 @@ {-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-} -msgTrackingStateDetailed :: Word16-msgTrackingStateDetailed = 0x0021+msgTrackingStateDetailedDepA :: Word16+msgTrackingStateDetailedDepA = 0x0021 --- | SBP class for message MSG_TRACKING_STATE_DETAILED (0x0021).+-- | SBP class for message MSG_TRACKING_STATE_DETAILED_DEP_A (0x0021). -- -- The tracking message returns a set tracking channel parameters for a single -- tracking channel useful for debugging issues.-data MsgTrackingStateDetailed = MsgTrackingStateDetailed- { _msgTrackingStateDetailed_recv_time :: !Word64+data MsgTrackingStateDetailedDepA = MsgTrackingStateDetailedDepA+ { _msgTrackingStateDetailedDepA_recv_time :: !Word64 -- ^ Receiver clock time.- , _msgTrackingStateDetailed_tot :: !GpsTime+ , _msgTrackingStateDetailedDepA_tot :: !GpsTime -- ^ Time of transmission of signal from satellite. TOW only valid when TOW -- status is decoded or propagated. WN only valid when week number valid -- flag is set.- , _msgTrackingStateDetailed_P :: !Word32+ , _msgTrackingStateDetailedDepA_P :: !Word32 -- ^ Pseudorange observation. Valid only when pseudorange valid flag is set.- , _msgTrackingStateDetailed_P_std :: !Word16+ , _msgTrackingStateDetailedDepA_P_std :: !Word16 -- ^ Pseudorange observation standard deviation. Valid only when pseudorange -- valid flag is set.- , _msgTrackingStateDetailed_L :: !CarrierPhase+ , _msgTrackingStateDetailedDepA_L :: !CarrierPhase -- ^ Carrier phase observation with typical sign convention. Valid only when -- PLL pessimistic lock is achieved.- , _msgTrackingStateDetailed_cn0 :: !Word8+ , _msgTrackingStateDetailedDepA_cn0 :: !Word8 -- ^ Carrier-to-Noise density- , _msgTrackingStateDetailed_lock :: !Word16+ , _msgTrackingStateDetailedDepA_lock :: !Word16 -- ^ Lock time. It is encoded according to DF402 from the RTCM 10403.2 -- Amendment 2 specification. Valid values range from 0 to 15.- , _msgTrackingStateDetailed_sid :: !GnssSignal+ , _msgTrackingStateDetailedDepA_sid :: !GnssSignal -- ^ GNSS signal identifier.- , _msgTrackingStateDetailed_doppler :: !Int32+ , _msgTrackingStateDetailedDepA_doppler :: !Int32 -- ^ Carrier Doppler frequency.- , _msgTrackingStateDetailed_doppler_std :: !Word16+ , _msgTrackingStateDetailedDepA_doppler_std :: !Word16 -- ^ Carrier Doppler frequency standard deviation.- , _msgTrackingStateDetailed_uptime :: !Word32+ , _msgTrackingStateDetailedDepA_uptime :: !Word32 -- ^ Number of seconds of continuous tracking. Specifies how much time signal -- is in continuous track.- , _msgTrackingStateDetailed_clock_offset :: !Int16+ , _msgTrackingStateDetailedDepA_clock_offset :: !Int16 -- ^ TCXO clock offset. Valid only when valid clock valid flag is set.- , _msgTrackingStateDetailed_clock_drift :: !Int16+ , _msgTrackingStateDetailedDepA_clock_drift :: !Int16 -- ^ TCXO clock drift. Valid only when valid clock valid flag is set.- , _msgTrackingStateDetailed_corr_spacing :: !Word16+ , _msgTrackingStateDetailedDepA_corr_spacing :: !Word16 -- ^ Early-Prompt (EP) and Prompt-Late (PL) correlators spacing.- , _msgTrackingStateDetailed_acceleration :: !Int8+ , _msgTrackingStateDetailedDepA_acceleration :: !Int8 -- ^ Acceleration. Valid only when acceleration valid flag is set.- , _msgTrackingStateDetailed_sync_flags :: !Word8+ , _msgTrackingStateDetailedDepA_sync_flags :: !Word8 -- ^ Synchronization status flags.- , _msgTrackingStateDetailed_tow_flags :: !Word8+ , _msgTrackingStateDetailedDepA_tow_flags :: !Word8 -- ^ TOW status flags.- , _msgTrackingStateDetailed_track_flags :: !Word8+ , _msgTrackingStateDetailedDepA_track_flags :: !Word8 -- ^ Tracking loop status flags.- , _msgTrackingStateDetailed_nav_flags :: !Word8+ , _msgTrackingStateDetailedDepA_nav_flags :: !Word8 -- ^ Navigation data status flags.- , _msgTrackingStateDetailed_pset_flags :: !Word8+ , _msgTrackingStateDetailedDepA_pset_flags :: !Word8 -- ^ Parameters sets flags.- , _msgTrackingStateDetailed_misc_flags :: !Word8+ , _msgTrackingStateDetailedDepA_misc_flags :: !Word8 -- ^ Miscellaneous flags. } deriving ( Show, Read, Eq ) -instance Binary MsgTrackingStateDetailed where+instance Binary MsgTrackingStateDetailedDepA where get = do- _msgTrackingStateDetailed_recv_time <- getWord64le- _msgTrackingStateDetailed_tot <- get- _msgTrackingStateDetailed_P <- getWord32le- _msgTrackingStateDetailed_P_std <- getWord16le- _msgTrackingStateDetailed_L <- get- _msgTrackingStateDetailed_cn0 <- getWord8- _msgTrackingStateDetailed_lock <- getWord16le- _msgTrackingStateDetailed_sid <- get- _msgTrackingStateDetailed_doppler <- fromIntegral <$> getWord32le- _msgTrackingStateDetailed_doppler_std <- getWord16le- _msgTrackingStateDetailed_uptime <- getWord32le- _msgTrackingStateDetailed_clock_offset <- fromIntegral <$> getWord16le- _msgTrackingStateDetailed_clock_drift <- fromIntegral <$> getWord16le- _msgTrackingStateDetailed_corr_spacing <- getWord16le- _msgTrackingStateDetailed_acceleration <- fromIntegral <$> getWord8- _msgTrackingStateDetailed_sync_flags <- getWord8- _msgTrackingStateDetailed_tow_flags <- getWord8- _msgTrackingStateDetailed_track_flags <- getWord8- _msgTrackingStateDetailed_nav_flags <- getWord8- _msgTrackingStateDetailed_pset_flags <- getWord8- _msgTrackingStateDetailed_misc_flags <- getWord8- pure MsgTrackingStateDetailed {..}+ _msgTrackingStateDetailedDepA_recv_time <- getWord64le+ _msgTrackingStateDetailedDepA_tot <- get+ _msgTrackingStateDetailedDepA_P <- getWord32le+ _msgTrackingStateDetailedDepA_P_std <- getWord16le+ _msgTrackingStateDetailedDepA_L <- get+ _msgTrackingStateDetailedDepA_cn0 <- getWord8+ _msgTrackingStateDetailedDepA_lock <- getWord16le+ _msgTrackingStateDetailedDepA_sid <- get+ _msgTrackingStateDetailedDepA_doppler <- fromIntegral <$> getWord32le+ _msgTrackingStateDetailedDepA_doppler_std <- getWord16le+ _msgTrackingStateDetailedDepA_uptime <- getWord32le+ _msgTrackingStateDetailedDepA_clock_offset <- fromIntegral <$> getWord16le+ _msgTrackingStateDetailedDepA_clock_drift <- fromIntegral <$> getWord16le+ _msgTrackingStateDetailedDepA_corr_spacing <- getWord16le+ _msgTrackingStateDetailedDepA_acceleration <- fromIntegral <$> getWord8+ _msgTrackingStateDetailedDepA_sync_flags <- getWord8+ _msgTrackingStateDetailedDepA_tow_flags <- getWord8+ _msgTrackingStateDetailedDepA_track_flags <- getWord8+ _msgTrackingStateDetailedDepA_nav_flags <- getWord8+ _msgTrackingStateDetailedDepA_pset_flags <- getWord8+ _msgTrackingStateDetailedDepA_misc_flags <- getWord8+ pure MsgTrackingStateDetailedDepA {..} - put MsgTrackingStateDetailed {..} = do- putWord64le _msgTrackingStateDetailed_recv_time- put _msgTrackingStateDetailed_tot- putWord32le _msgTrackingStateDetailed_P- putWord16le _msgTrackingStateDetailed_P_std- put _msgTrackingStateDetailed_L- putWord8 _msgTrackingStateDetailed_cn0- putWord16le _msgTrackingStateDetailed_lock- put _msgTrackingStateDetailed_sid- putWord32le $ fromIntegral _msgTrackingStateDetailed_doppler- putWord16le _msgTrackingStateDetailed_doppler_std- putWord32le _msgTrackingStateDetailed_uptime- putWord16le $ fromIntegral _msgTrackingStateDetailed_clock_offset- putWord16le $ fromIntegral _msgTrackingStateDetailed_clock_drift- putWord16le _msgTrackingStateDetailed_corr_spacing- putWord8 $ fromIntegral _msgTrackingStateDetailed_acceleration- putWord8 _msgTrackingStateDetailed_sync_flags- putWord8 _msgTrackingStateDetailed_tow_flags- putWord8 _msgTrackingStateDetailed_track_flags- putWord8 _msgTrackingStateDetailed_nav_flags- putWord8 _msgTrackingStateDetailed_pset_flags- putWord8 _msgTrackingStateDetailed_misc_flags+ put MsgTrackingStateDetailedDepA {..} = do+ putWord64le _msgTrackingStateDetailedDepA_recv_time+ put _msgTrackingStateDetailedDepA_tot+ putWord32le _msgTrackingStateDetailedDepA_P+ putWord16le _msgTrackingStateDetailedDepA_P_std+ put _msgTrackingStateDetailedDepA_L+ putWord8 _msgTrackingStateDetailedDepA_cn0+ putWord16le _msgTrackingStateDetailedDepA_lock+ put _msgTrackingStateDetailedDepA_sid+ putWord32le $ fromIntegral _msgTrackingStateDetailedDepA_doppler+ putWord16le _msgTrackingStateDetailedDepA_doppler_std+ putWord32le _msgTrackingStateDetailedDepA_uptime+ putWord16le $ fromIntegral _msgTrackingStateDetailedDepA_clock_offset+ putWord16le $ fromIntegral _msgTrackingStateDetailedDepA_clock_drift+ putWord16le _msgTrackingStateDetailedDepA_corr_spacing+ putWord8 $ fromIntegral _msgTrackingStateDetailedDepA_acceleration+ putWord8 _msgTrackingStateDetailedDepA_sync_flags+ putWord8 _msgTrackingStateDetailedDepA_tow_flags+ putWord8 _msgTrackingStateDetailedDepA_track_flags+ putWord8 _msgTrackingStateDetailedDepA_nav_flags+ putWord8 _msgTrackingStateDetailedDepA_pset_flags+ putWord8 _msgTrackingStateDetailedDepA_misc_flags -$(makeSBP 'msgTrackingStateDetailed ''MsgTrackingStateDetailed)-$(makeJSON "_msgTrackingStateDetailed_" ''MsgTrackingStateDetailed)-$(makeLenses ''MsgTrackingStateDetailed)+$(makeSBP 'msgTrackingStateDetailedDepA ''MsgTrackingStateDetailedDepA)+$(makeJSON "_msgTrackingStateDetailedDepA_" ''MsgTrackingStateDetailedDepA)+$(makeLenses ''MsgTrackingStateDetailedDepA) msgTrackingStateDetailedDep :: Word16 msgTrackingStateDetailedDep = 0x0011
@@ -5,9 +5,9 @@ -- | -- Module: SwiftNav.SBP.User--- Copyright: Copyright (C) 2015 Swift Navigation, Inc.+-- Copyright: Copyright (C) 2015-2018 Swift Navigation, Inc. -- License: LGPL-3--- Maintainer: Mark Fine <dev@swiftnav.com>+-- Maintainer: Swift Navigation <dev@swiftnav.com> -- Stability: experimental -- Portability: portable --
@@ -0,0 +1,73 @@+{-# OPTIONS_GHC -fno-warn-unused-imports #-}+{-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE RecordWildCards #-}++-- |+-- Module: SwiftNav.SBP.Vehicle+-- Copyright: Copyright (C) 2015-2018 Swift Navigation, Inc.+-- License: LGPL-3+-- Maintainer: Swift Navigation <dev@swiftnav.com>+-- Stability: experimental+-- Portability: portable+--+-- Messages from a vehicle.++module SwiftNav.SBP.Vehicle+ ( module SwiftNav.SBP.Vehicle+ ) where++import BasicPrelude+import Control.Lens+import Control.Monad.Loops+import Data.Binary+import Data.Binary.Get+import Data.Binary.IEEE754+import Data.Binary.Put+import Data.ByteString.Lazy hiding (ByteString)+import Data.Int+import Data.Word+import SwiftNav.SBP.TH++{-# ANN module ("HLint: ignore Use camelCase"::String) #-}+{-# ANN module ("HLint: ignore Redundant do"::String) #-}+{-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}+++msgOdometry :: Word16+msgOdometry = 0x0903++-- | SBP class for message MSG_ODOMETRY (0x0903).+--+-- Message representing the x component of vehicle velocity in the user frame+-- at the odometry reference point(s) specified by the user. The offset for the+-- odometry reference point and the definition and origin of the user frame+-- are defined through the device settings interface. There are 4 possible+-- user-defined sources of this message which are labeled arbitrarily source+-- 0 through 3.+data MsgOdometry = MsgOdometry+ { _msgOdometry_tow :: !Word32+ -- ^ Time field representing either milliseconds in the GPS Week or local CPU+ -- time from the producing system in milliseconds. See the tow_source flag+ -- for the exact source of this timestamp.+ , _msgOdometry_velocity :: !Int32+ -- ^ The signed forward component of vehicle velocity.+ , _msgOdometry_flags :: !Word8+ -- ^ Status flags+ } deriving ( Show, Read, Eq )++instance Binary MsgOdometry where+ get = do+ _msgOdometry_tow <- getWord32le+ _msgOdometry_velocity <- fromIntegral <$> getWord32le+ _msgOdometry_flags <- getWord8+ pure MsgOdometry {..}++ put MsgOdometry {..} = do+ putWord32le _msgOdometry_tow+ putWord32le $ fromIntegral _msgOdometry_velocity+ putWord8 _msgOdometry_flags++$(makeSBP 'msgOdometry ''MsgOdometry)+$(makeJSON "_msgOdometry_" ''MsgOdometry)+$(makeLenses ''MsgOdometry)