packages feed

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 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
src/SwiftNav/SBP.hs view
@@ -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
src/SwiftNav/SBP/Acquisition.hs view
@@ -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 --
src/SwiftNav/SBP/Bootload.hs view
@@ -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 --
src/SwiftNav/SBP/ExtEvents.hs view
@@ -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 --
src/SwiftNav/SBP/FileIo.hs view
@@ -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 --
src/SwiftNav/SBP/Flash.hs view
@@ -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 --
src/SwiftNav/SBP/Gnss.hs view
@@ -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 --
src/SwiftNav/SBP/Imu.hs view
@@ -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
src/SwiftNav/SBP/Logging.hs view
@@ -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 --
src/SwiftNav/SBP/Mag.hs view
@@ -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 --
src/SwiftNav/SBP/Msg.hs view
@@ -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
src/SwiftNav/SBP/Navigation.hs view
@@ -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
src/SwiftNav/SBP/Ndb.hs view
@@ -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 --
src/SwiftNav/SBP/Observation.hs view
@@ -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 --
+ src/SwiftNav/SBP/Orientation.hs view
@@ -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)
src/SwiftNav/SBP/Piksi.hs view
@@ -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 --
+ src/SwiftNav/SBP/Sbas.hs view
@@ -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)
src/SwiftNav/SBP/Settings.hs view
@@ -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 --
+ src/SwiftNav/SBP/Ssr.hs view
@@ -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)
src/SwiftNav/SBP/System.hs view
@@ -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)
src/SwiftNav/SBP/Tracking.hs view
@@ -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
src/SwiftNav/SBP/User.hs view
@@ -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 --
+ src/SwiftNav/SBP/Vehicle.hs view
@@ -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)