packages feed

sbp 2.1.7 → 2.2.0

raw patch · 8 files changed

+673/−44 lines, 8 files

Files

README.md view
@@ -10,6 +10,12 @@  Available on [Hackage as `sbp`](http://hackage.haskell.org/package/sbp). +To install from Hackage using `stack`:++    $ stack install --resolver lts-6.25 sbp+    +Note that we explicitly specify the `lts-6.25` resolver, `libsbp` may fail to build with more recent resolvers.+ ## Setup  To build:
sbp.cabal view
@@ -1,5 +1,5 @@ name:                  sbp-version:               2.1.7+version:               2.2.0 synopsis:              SwiftNav's SBP Library homepage:              https://github.com/swift-nav/libsbp license:               LGPL-3
src/SwiftNav/SBP.hs view
@@ -64,6 +64,8 @@    | SBPMsgAcqSvProfile MsgAcqSvProfile Msg    | SBPMsgAgeCorrections MsgAgeCorrections Msg    | SBPMsgAlmanac MsgAlmanac Msg+   | SBPMsgAlmanacGlo MsgAlmanacGlo Msg+   | SBPMsgAlmanacGps MsgAlmanacGps Msg    | SBPMsgBasePosEcef MsgBasePosEcef Msg    | SBPMsgBasePosLlh MsgBasePosLlh Msg    | SBPMsgBaselineEcef MsgBaselineEcef Msg@@ -89,9 +91,13 @@    | SBPMsgEphemerisDepC MsgEphemerisDepC Msg    | SBPMsgEphemerisDepD MsgEphemerisDepD Msg    | SBPMsgEphemerisGlo MsgEphemerisGlo Msg+   | SBPMsgEphemerisGloDepA MsgEphemerisGloDepA Msg    | SBPMsgEphemerisGps MsgEphemerisGps Msg+   | SBPMsgEphemerisGpsDepE MsgEphemerisGpsDepE Msg    | SBPMsgEphemerisSbas MsgEphemerisSbas Msg+   | SBPMsgEphemerisSbasDepA MsgEphemerisSbasDepA Msg    | SBPMsgExtEvent MsgExtEvent Msg+   | SBPMsgFcnsGlo MsgFcnsGlo Msg    | SBPMsgFileioReadDirReq MsgFileioReadDirReq Msg    | SBPMsgFileioReadDirResp MsgFileioReadDirResp Msg    | SBPMsgFileioReadReq MsgFileioReadReq Msg@@ -108,6 +114,7 @@    | SBPMsgGpsTime MsgGpsTime Msg    | SBPMsgGpsTimeDepA MsgGpsTimeDepA Msg    | SBPMsgGroupDelay MsgGroupDelay Msg+   | SBPMsgGroupDelayDepA MsgGroupDelayDepA Msg    | SBPMsgHeartbeat MsgHeartbeat Msg    | SBPMsgIarState MsgIarState Msg    | SBPMsgImuAux MsgImuAux Msg@@ -120,6 +127,8 @@    | SBPMsgNapDeviceDnaReq MsgNapDeviceDnaReq Msg    | SBPMsgNapDeviceDnaResp MsgNapDeviceDnaResp Msg    | SBPMsgNdbEvent MsgNdbEvent Msg+   | SBPMsgNetworkStateReq MsgNetworkStateReq Msg+   | SBPMsgNetworkStateResp MsgNetworkStateResp Msg    | SBPMsgObs MsgObs Msg    | SBPMsgObsDepA MsgObsDepA Msg    | SBPMsgObsDepB MsgObsDepB Msg@@ -180,6 +189,8 @@           | _msgSBPType == msgAcqSvProfile = SBPMsgAcqSvProfile (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgAgeCorrections = SBPMsgAgeCorrections (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgAlmanac = SBPMsgAlmanac (decode (fromStrict _msgSBPPayload)) m+          | _msgSBPType == msgAlmanacGlo = SBPMsgAlmanacGlo (decode (fromStrict _msgSBPPayload)) m+          | _msgSBPType == msgAlmanacGps = SBPMsgAlmanacGps (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgBasePosEcef = SBPMsgBasePosEcef (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgBasePosLlh = SBPMsgBasePosLlh (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgBaselineEcef = SBPMsgBaselineEcef (decode (fromStrict _msgSBPPayload)) m@@ -205,9 +216,13 @@           | _msgSBPType == msgEphemerisDepC = SBPMsgEphemerisDepC (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgEphemerisDepD = SBPMsgEphemerisDepD (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgEphemerisGlo = SBPMsgEphemerisGlo (decode (fromStrict _msgSBPPayload)) m+          | _msgSBPType == msgEphemerisGloDepA = SBPMsgEphemerisGloDepA (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgEphemerisGps = SBPMsgEphemerisGps (decode (fromStrict _msgSBPPayload)) m+          | _msgSBPType == msgEphemerisGpsDepE = SBPMsgEphemerisGpsDepE (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgEphemerisSbas = SBPMsgEphemerisSbas (decode (fromStrict _msgSBPPayload)) m+          | _msgSBPType == msgEphemerisSbasDepA = SBPMsgEphemerisSbasDepA (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgExtEvent = SBPMsgExtEvent (decode (fromStrict _msgSBPPayload)) m+          | _msgSBPType == msgFcnsGlo = SBPMsgFcnsGlo (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgFileioReadDirReq = SBPMsgFileioReadDirReq (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgFileioReadDirResp = SBPMsgFileioReadDirResp (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgFileioReadReq = SBPMsgFileioReadReq (decode (fromStrict _msgSBPPayload)) m@@ -224,6 +239,7 @@           | _msgSBPType == msgGpsTime = SBPMsgGpsTime (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgGpsTimeDepA = SBPMsgGpsTimeDepA (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgGroupDelay = SBPMsgGroupDelay (decode (fromStrict _msgSBPPayload)) m+          | _msgSBPType == msgGroupDelayDepA = SBPMsgGroupDelayDepA (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgHeartbeat = SBPMsgHeartbeat (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgIarState = SBPMsgIarState (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgImuAux = SBPMsgImuAux (decode (fromStrict _msgSBPPayload)) m@@ -236,6 +252,8 @@           | _msgSBPType == msgNapDeviceDnaReq = SBPMsgNapDeviceDnaReq (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgNapDeviceDnaResp = SBPMsgNapDeviceDnaResp (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgNdbEvent = SBPMsgNdbEvent (decode (fromStrict _msgSBPPayload)) m+          | _msgSBPType == msgNetworkStateReq = SBPMsgNetworkStateReq (decode (fromStrict _msgSBPPayload)) m+          | _msgSBPType == msgNetworkStateResp = SBPMsgNetworkStateResp (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgObs = SBPMsgObs (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgObsDepA = SBPMsgObsDepA (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgObsDepB = SBPMsgObsDepB (decode (fromStrict _msgSBPPayload)) m@@ -288,6 +306,8 @@       encode' (SBPMsgAcqSvProfile _ m) = put m       encode' (SBPMsgAgeCorrections _ m) = put m       encode' (SBPMsgAlmanac _ m) = put m+      encode' (SBPMsgAlmanacGlo _ m) = put m+      encode' (SBPMsgAlmanacGps _ m) = put m       encode' (SBPMsgBasePosEcef _ m) = put m       encode' (SBPMsgBasePosLlh _ m) = put m       encode' (SBPMsgBaselineEcef _ m) = put m@@ -313,9 +333,13 @@       encode' (SBPMsgEphemerisDepC _ m) = put m       encode' (SBPMsgEphemerisDepD _ m) = put m       encode' (SBPMsgEphemerisGlo _ m) = put m+      encode' (SBPMsgEphemerisGloDepA _ m) = put m       encode' (SBPMsgEphemerisGps _ m) = put m+      encode' (SBPMsgEphemerisGpsDepE _ m) = put m       encode' (SBPMsgEphemerisSbas _ m) = put m+      encode' (SBPMsgEphemerisSbasDepA _ m) = put m       encode' (SBPMsgExtEvent _ m) = put m+      encode' (SBPMsgFcnsGlo _ m) = put m       encode' (SBPMsgFileioReadDirReq _ m) = put m       encode' (SBPMsgFileioReadDirResp _ m) = put m       encode' (SBPMsgFileioReadReq _ m) = put m@@ -332,6 +356,7 @@       encode' (SBPMsgGpsTime _ m) = put m       encode' (SBPMsgGpsTimeDepA _ m) = put m       encode' (SBPMsgGroupDelay _ m) = put m+      encode' (SBPMsgGroupDelayDepA _ m) = put m       encode' (SBPMsgHeartbeat _ m) = put m       encode' (SBPMsgIarState _ m) = put m       encode' (SBPMsgImuAux _ m) = put m@@ -344,6 +369,8 @@       encode' (SBPMsgNapDeviceDnaReq _ m) = put m       encode' (SBPMsgNapDeviceDnaResp _ m) = put m       encode' (SBPMsgNdbEvent _ m) = put m+      encode' (SBPMsgNetworkStateReq _ m) = put m+      encode' (SBPMsgNetworkStateResp _ m) = put m       encode' (SBPMsgObs _ m) = put m       encode' (SBPMsgObsDepA _ m) = put m       encode' (SBPMsgObsDepB _ m) = put m@@ -399,6 +426,8 @@         | msgType == msgAcqSvProfile = SBPMsgAcqSvProfile <$> parseJSON obj <*> parseJSON obj         | msgType == msgAgeCorrections = SBPMsgAgeCorrections <$> parseJSON obj <*> parseJSON obj         | msgType == msgAlmanac = SBPMsgAlmanac <$> parseJSON obj <*> parseJSON obj+        | msgType == msgAlmanacGlo = SBPMsgAlmanacGlo <$> parseJSON obj <*> parseJSON obj+        | msgType == msgAlmanacGps = SBPMsgAlmanacGps <$> parseJSON obj <*> parseJSON obj         | msgType == msgBasePosEcef = SBPMsgBasePosEcef <$> parseJSON obj <*> parseJSON obj         | msgType == msgBasePosLlh = SBPMsgBasePosLlh <$> parseJSON obj <*> parseJSON obj         | msgType == msgBaselineEcef = SBPMsgBaselineEcef <$> parseJSON obj <*> parseJSON obj@@ -424,9 +453,13 @@         | msgType == msgEphemerisDepC = SBPMsgEphemerisDepC <$> parseJSON obj <*> parseJSON obj         | msgType == msgEphemerisDepD = SBPMsgEphemerisDepD <$> parseJSON obj <*> parseJSON obj         | msgType == msgEphemerisGlo = SBPMsgEphemerisGlo <$> parseJSON obj <*> parseJSON obj+        | msgType == msgEphemerisGloDepA = SBPMsgEphemerisGloDepA <$> parseJSON obj <*> parseJSON obj         | msgType == msgEphemerisGps = SBPMsgEphemerisGps <$> parseJSON obj <*> parseJSON obj+        | msgType == msgEphemerisGpsDepE = SBPMsgEphemerisGpsDepE <$> parseJSON obj <*> parseJSON obj         | msgType == msgEphemerisSbas = SBPMsgEphemerisSbas <$> parseJSON obj <*> parseJSON obj+        | msgType == msgEphemerisSbasDepA = SBPMsgEphemerisSbasDepA <$> parseJSON obj <*> parseJSON obj         | msgType == msgExtEvent = SBPMsgExtEvent <$> parseJSON obj <*> parseJSON obj+        | msgType == msgFcnsGlo = SBPMsgFcnsGlo <$> parseJSON obj <*> parseJSON obj         | msgType == msgFileioReadDirReq = SBPMsgFileioReadDirReq <$> parseJSON obj <*> parseJSON obj         | msgType == msgFileioReadDirResp = SBPMsgFileioReadDirResp <$> parseJSON obj <*> parseJSON obj         | msgType == msgFileioReadReq = SBPMsgFileioReadReq <$> parseJSON obj <*> parseJSON obj@@ -443,6 +476,7 @@         | msgType == msgGpsTime = SBPMsgGpsTime <$> parseJSON obj <*> parseJSON obj         | msgType == msgGpsTimeDepA = SBPMsgGpsTimeDepA <$> parseJSON obj <*> parseJSON obj         | msgType == msgGroupDelay = SBPMsgGroupDelay <$> parseJSON obj <*> parseJSON obj+        | msgType == msgGroupDelayDepA = SBPMsgGroupDelayDepA <$> parseJSON obj <*> parseJSON obj         | msgType == msgHeartbeat = SBPMsgHeartbeat <$> parseJSON obj <*> parseJSON obj         | msgType == msgIarState = SBPMsgIarState <$> parseJSON obj <*> parseJSON obj         | msgType == msgImuAux = SBPMsgImuAux <$> parseJSON obj <*> parseJSON obj@@ -455,6 +489,8 @@         | msgType == msgNapDeviceDnaReq = SBPMsgNapDeviceDnaReq <$> parseJSON obj <*> parseJSON obj         | msgType == msgNapDeviceDnaResp = SBPMsgNapDeviceDnaResp <$> parseJSON obj <*> parseJSON obj         | msgType == msgNdbEvent = SBPMsgNdbEvent <$> parseJSON obj <*> parseJSON obj+        | msgType == msgNetworkStateReq = SBPMsgNetworkStateReq <$> parseJSON obj <*> parseJSON obj+        | msgType == msgNetworkStateResp = SBPMsgNetworkStateResp <$> parseJSON obj <*> parseJSON obj         | msgType == msgObs = SBPMsgObs <$> parseJSON obj <*> parseJSON obj         | msgType == msgObsDepA = SBPMsgObsDepA <$> parseJSON obj <*> parseJSON obj         | msgType == msgObsDepB = SBPMsgObsDepB <$> parseJSON obj <*> parseJSON obj@@ -512,6 +548,8 @@   toJSON (SBPMsgAcqSvProfile n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgAgeCorrections n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgAlmanac n m) = toJSON n `mergeValues` toJSON m+  toJSON (SBPMsgAlmanacGlo n m) = toJSON n `mergeValues` toJSON m+  toJSON (SBPMsgAlmanacGps n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgBasePosEcef n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgBasePosLlh n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgBaselineEcef n m) = toJSON n `mergeValues` toJSON m@@ -537,9 +575,13 @@   toJSON (SBPMsgEphemerisDepC n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgEphemerisDepD n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgEphemerisGlo n m) = toJSON n `mergeValues` toJSON m+  toJSON (SBPMsgEphemerisGloDepA n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgEphemerisGps n m) = toJSON n `mergeValues` toJSON m+  toJSON (SBPMsgEphemerisGpsDepE n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgEphemerisSbas n m) = toJSON n `mergeValues` toJSON m+  toJSON (SBPMsgEphemerisSbasDepA n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgExtEvent n m) = toJSON n `mergeValues` toJSON m+  toJSON (SBPMsgFcnsGlo n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgFileioReadDirReq n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgFileioReadDirResp n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgFileioReadReq n m) = toJSON n `mergeValues` toJSON m@@ -556,6 +598,7 @@   toJSON (SBPMsgGpsTime n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgGpsTimeDepA n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgGroupDelay n m) = toJSON n `mergeValues` toJSON m+  toJSON (SBPMsgGroupDelayDepA n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgHeartbeat n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgIarState n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgImuAux n m) = toJSON n `mergeValues` toJSON m@@ -568,6 +611,8 @@   toJSON (SBPMsgNapDeviceDnaReq n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgNapDeviceDnaResp n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgNdbEvent n m) = toJSON n `mergeValues` toJSON m+  toJSON (SBPMsgNetworkStateReq n m) = toJSON n `mergeValues` toJSON m+  toJSON (SBPMsgNetworkStateResp n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgObs n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgObsDepA n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgObsDepB n m) = toJSON n `mergeValues` toJSON m@@ -619,6 +664,8 @@   msg f (SBPMsgAcqSvProfile n m) = SBPMsgAcqSvProfile n <$> f m   msg f (SBPMsgAgeCorrections n m) = SBPMsgAgeCorrections n <$> f m   msg f (SBPMsgAlmanac n m) = SBPMsgAlmanac n <$> f m+  msg f (SBPMsgAlmanacGlo n m) = SBPMsgAlmanacGlo n <$> f m+  msg f (SBPMsgAlmanacGps n m) = SBPMsgAlmanacGps 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@@ -644,9 +691,13 @@   msg f (SBPMsgEphemerisDepC n m) = SBPMsgEphemerisDepC n <$> f m   msg f (SBPMsgEphemerisDepD n m) = SBPMsgEphemerisDepD n <$> f m   msg f (SBPMsgEphemerisGlo n m) = SBPMsgEphemerisGlo n <$> f m+  msg f (SBPMsgEphemerisGloDepA n m) = SBPMsgEphemerisGloDepA n <$> f m   msg f (SBPMsgEphemerisGps n m) = SBPMsgEphemerisGps n <$> f m+  msg f (SBPMsgEphemerisGpsDepE n m) = SBPMsgEphemerisGpsDepE n <$> f m   msg f (SBPMsgEphemerisSbas n m) = SBPMsgEphemerisSbas n <$> f m+  msg f (SBPMsgEphemerisSbasDepA n m) = SBPMsgEphemerisSbasDepA n <$> f m   msg f (SBPMsgExtEvent n m) = SBPMsgExtEvent n <$> f m+  msg f (SBPMsgFcnsGlo n m) = SBPMsgFcnsGlo n <$> f m   msg f (SBPMsgFileioReadDirReq n m) = SBPMsgFileioReadDirReq n <$> f m   msg f (SBPMsgFileioReadDirResp n m) = SBPMsgFileioReadDirResp n <$> f m   msg f (SBPMsgFileioReadReq n m) = SBPMsgFileioReadReq n <$> f m@@ -663,6 +714,7 @@   msg f (SBPMsgGpsTime n m) = SBPMsgGpsTime n <$> f m   msg f (SBPMsgGpsTimeDepA n m) = SBPMsgGpsTimeDepA n <$> f m   msg f (SBPMsgGroupDelay n m) = SBPMsgGroupDelay n <$> f m+  msg f (SBPMsgGroupDelayDepA n m) = SBPMsgGroupDelayDepA n <$> f m   msg f (SBPMsgHeartbeat n m) = SBPMsgHeartbeat n <$> f m   msg f (SBPMsgIarState n m) = SBPMsgIarState n <$> f m   msg f (SBPMsgImuAux n m) = SBPMsgImuAux n <$> f m@@ -675,6 +727,8 @@   msg f (SBPMsgNapDeviceDnaReq n m) = SBPMsgNapDeviceDnaReq n <$> f m   msg f (SBPMsgNapDeviceDnaResp n m) = SBPMsgNapDeviceDnaResp n <$> f m   msg f (SBPMsgNdbEvent n m) = SBPMsgNdbEvent n <$> f m+  msg f (SBPMsgNetworkStateReq n m) = SBPMsgNetworkStateReq n <$> f m+  msg f (SBPMsgNetworkStateResp n m) = SBPMsgNetworkStateResp n <$> f m   msg f (SBPMsgObs n m) = SBPMsgObs n <$> f m   msg f (SBPMsgObsDepA n m) = SBPMsgObsDepA n <$> f m   msg f (SBPMsgObsDepB n m) = SBPMsgObsDepB n <$> f m
src/SwiftNav/SBP/ExtEvents.hs view
@@ -36,16 +36,16 @@ -- Reports detection of an external event, the GPS time it occurred, which pin -- it was and whether it was rising or falling. data MsgExtEvent = MsgExtEvent-  { _msgExtEvent_wn  :: Word16+  { _msgExtEvent_wn        :: Word16     -- ^ GPS week number-  , _msgExtEvent_tow :: Word32+  , _msgExtEvent_tow       :: Word32     -- ^ GPS time of week rounded to the nearest millisecond-  , _msgExtEvent_ns  :: Int32+  , _msgExtEvent_ns_residual :: Int32     -- ^ Nanosecond residual of millisecond-rounded TOW (ranges from -500000 to     -- 500000)-  , _msgExtEvent_flags :: Word8+  , _msgExtEvent_flags     :: Word8     -- ^ Flags-  , _msgExtEvent_pin :: Word8+  , _msgExtEvent_pin       :: Word8     -- ^ Pin number.  0..9 = DEBUG0..9.   } deriving ( Show, Read, Eq ) @@ -53,7 +53,7 @@   get = do     _msgExtEvent_wn <- getWord16le     _msgExtEvent_tow <- getWord32le-    _msgExtEvent_ns <- fromIntegral <$> getWord32le+    _msgExtEvent_ns_residual <- fromIntegral <$> getWord32le     _msgExtEvent_flags <- getWord8     _msgExtEvent_pin <- getWord8     return MsgExtEvent {..}@@ -61,7 +61,7 @@   put MsgExtEvent {..} = do     putWord16le _msgExtEvent_wn     putWord32le _msgExtEvent_tow-    putWord32le $ fromIntegral _msgExtEvent_ns+    putWord32le $ fromIntegral _msgExtEvent_ns_residual     putWord8 _msgExtEvent_flags     putWord8 _msgExtEvent_pin 
src/SwiftNav/SBP/Gnss.hs view
@@ -109,25 +109,25 @@ -- beginning of the week on the Saturday/Sunday transition. In most cases, -- observations are epoch aligned so ns field will be 0. data GpsTimeNano = GpsTimeNano-  { _gpsTimeNano_tow :: Word32+  { _gpsTimeNano_tow       :: Word32     -- ^ Milliseconds since start of GPS week-  , _gpsTimeNano_ns :: Int32+  , _gpsTimeNano_ns_residual :: Int32     -- ^ Nanosecond residual of millisecond-rounded TOW (ranges from -500000 to     -- 500000)-  , _gpsTimeNano_wn :: Word16+  , _gpsTimeNano_wn        :: Word16     -- ^ GPS week number   } deriving ( Show, Read, Eq )  instance Binary GpsTimeNano where   get = do     _gpsTimeNano_tow <- getWord32le-    _gpsTimeNano_ns <- fromIntegral <$> getWord32le+    _gpsTimeNano_ns_residual <- fromIntegral <$> getWord32le     _gpsTimeNano_wn <- getWord16le     return GpsTimeNano {..}    put GpsTimeNano {..} = do     putWord32le _gpsTimeNano_tow-    putWord32le $ fromIntegral _gpsTimeNano_ns+    putWord32le $ fromIntegral _gpsTimeNano_ns_residual     putWord16le _gpsTimeNano_wn $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_gpsTimeNano_" . P.stripPrefix "_gpsTimeNano_"}              ''GpsTimeNano)
src/SwiftNav/SBP/Navigation.hs view
@@ -50,14 +50,14 @@ -- other navigation messages referenced to the same time (but lacking the ns -- field) and indicates a more precise time of these messages. data MsgGpsTime = MsgGpsTime-  { _msgGpsTime_wn  :: Word16+  { _msgGpsTime_wn        :: Word16     -- ^ GPS week number-  , _msgGpsTime_tow :: Word32+  , _msgGpsTime_tow       :: Word32     -- ^ GPS time of week rounded to the nearest millisecond-  , _msgGpsTime_ns  :: Int32+  , _msgGpsTime_ns_residual :: Int32     -- ^ Nanosecond residual of millisecond-rounded TOW (ranges from -500000 to     -- 500000)-  , _msgGpsTime_flags :: Word8+  , _msgGpsTime_flags     :: Word8     -- ^ Status flags (reserved)   } deriving ( Show, Read, Eq ) @@ -65,14 +65,14 @@   get = do     _msgGpsTime_wn <- getWord16le     _msgGpsTime_tow <- getWord32le-    _msgGpsTime_ns <- fromIntegral <$> getWord32le+    _msgGpsTime_ns_residual <- fromIntegral <$> getWord32le     _msgGpsTime_flags <- getWord8     return MsgGpsTime {..}    put MsgGpsTime {..} = do     putWord16le _msgGpsTime_wn     putWord32le _msgGpsTime_tow-    putWord32le $ fromIntegral _msgGpsTime_ns+    putWord32le $ fromIntegral _msgGpsTime_ns_residual     putWord8 _msgGpsTime_flags  $(deriveSBP 'msgGpsTime ''MsgGpsTime)@@ -105,10 +105,9 @@   , _msgUtcTime_minutes :: Word8     -- ^ minutes of hour (range 0-59)   , _msgUtcTime_seconds :: Word8-    -- ^ seconds of minute (range 0-60)-  , _msgUtcTime_ns    :: Int32-    -- ^ Nanosecond residual of millisecond-rounded TOW (ranges from -500000 to-    -- 500000)+    -- ^ seconds of minute (range 0-60) rounded down+  , _msgUtcTime_ns    :: Word32+    -- ^ nanoseconds of second (range 0-999999999)   } deriving ( Show, Read, Eq )  instance Binary MsgUtcTime where@@ -121,7 +120,7 @@     _msgUtcTime_hours <- getWord8     _msgUtcTime_minutes <- getWord8     _msgUtcTime_seconds <- getWord8-    _msgUtcTime_ns <- fromIntegral <$> getWord32le+    _msgUtcTime_ns <- getWord32le     return MsgUtcTime {..}    put MsgUtcTime {..} = do@@ -133,7 +132,7 @@     putWord8 _msgUtcTime_hours     putWord8 _msgUtcTime_minutes     putWord8 _msgUtcTime_seconds-    putWord32le $ fromIntegral _msgUtcTime_ns+    putWord32le _msgUtcTime_ns  $(deriveSBP 'msgUtcTime ''MsgUtcTime) @@ -609,14 +608,14 @@ -- other navigation messages referenced to the same time (but lacking the ns -- field) and indicates a more precise time of these messages. data MsgGpsTimeDepA = MsgGpsTimeDepA-  { _msgGpsTimeDepA_wn  :: Word16+  { _msgGpsTimeDepA_wn        :: Word16     -- ^ GPS week number-  , _msgGpsTimeDepA_tow :: Word32+  , _msgGpsTimeDepA_tow       :: Word32     -- ^ GPS time of week rounded to the nearest millisecond-  , _msgGpsTimeDepA_ns  :: Int32+  , _msgGpsTimeDepA_ns_residual :: Int32     -- ^ Nanosecond residual of millisecond-rounded TOW (ranges from -500000 to     -- 500000)-  , _msgGpsTimeDepA_flags :: Word8+  , _msgGpsTimeDepA_flags     :: Word8     -- ^ Status flags (reserved)   } deriving ( Show, Read, Eq ) @@ -624,14 +623,14 @@   get = do     _msgGpsTimeDepA_wn <- getWord16le     _msgGpsTimeDepA_tow <- getWord32le-    _msgGpsTimeDepA_ns <- fromIntegral <$> getWord32le+    _msgGpsTimeDepA_ns_residual <- fromIntegral <$> getWord32le     _msgGpsTimeDepA_flags <- getWord8     return MsgGpsTimeDepA {..}    put MsgGpsTimeDepA {..} = do     putWord16le _msgGpsTimeDepA_wn     putWord32le _msgGpsTimeDepA_tow-    putWord32le $ fromIntegral _msgGpsTimeDepA_ns+    putWord32le $ fromIntegral _msgGpsTimeDepA_ns_residual     putWord8 _msgGpsTimeDepA_flags  $(deriveSBP 'msgGpsTimeDepA ''MsgGpsTimeDepA)
src/SwiftNav/SBP/Observation.hs view
@@ -237,8 +237,8 @@ $(makeLenses ''MsgBasePosEcef)  data EphemerisCommonContent = EphemerisCommonContent-  { _ephemerisCommonContent_sid        :: GnssSignal-    -- ^ GNSS signal identifier+  { _ephemerisCommonContent_sid        :: GnssSignal16+    -- ^ GNSS signal identifier (16 bit)   , _ephemerisCommonContent_toe        :: GpsTime     -- ^ Time of Ephemerides   , _ephemerisCommonContent_ura        :: Double@@ -273,10 +273,167 @@              ''EphemerisCommonContent) $(makeLenses ''EphemerisCommonContent) +data EphemerisCommonContentDepA = EphemerisCommonContentDepA+  { _ephemerisCommonContentDepA_sid        :: GnssSignal+    -- ^ GNSS signal identifier+  , _ephemerisCommonContentDepA_toe        :: GpsTime+    -- ^ Time of Ephemerides+  , _ephemerisCommonContentDepA_ura        :: Double+    -- ^ User Range Accuracy+  , _ephemerisCommonContentDepA_fit_interval :: Word32+    -- ^ Curve fit interval+  , _ephemerisCommonContentDepA_valid      :: Word8+    -- ^ Status of ephemeris, 1 = valid, 0 = invalid+  , _ephemerisCommonContentDepA_health_bits :: Word8+    -- ^ Satellite health status. GPS: ICD-GPS-200, chapter 20.3.3.3.1.4 SBAS: 0+    -- = valid, non-zero = invalid GLO: 0 = valid, non-zero = invalid+  } deriving ( Show, Read, Eq )++instance Binary EphemerisCommonContentDepA where+  get = do+    _ephemerisCommonContentDepA_sid <- get+    _ephemerisCommonContentDepA_toe <- get+    _ephemerisCommonContentDepA_ura <- getFloat64le+    _ephemerisCommonContentDepA_fit_interval <- getWord32le+    _ephemerisCommonContentDepA_valid <- getWord8+    _ephemerisCommonContentDepA_health_bits <- getWord8+    return EphemerisCommonContentDepA {..}++  put EphemerisCommonContentDepA {..} = do+    put _ephemerisCommonContentDepA_sid+    put _ephemerisCommonContentDepA_toe+    putFloat64le _ephemerisCommonContentDepA_ura+    putWord32le _ephemerisCommonContentDepA_fit_interval+    putWord8 _ephemerisCommonContentDepA_valid+    putWord8 _ephemerisCommonContentDepA_health_bits+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_ephemerisCommonContentDepA_" . P.stripPrefix "_ephemerisCommonContentDepA_"}+             ''EphemerisCommonContentDepA)+$(makeLenses ''EphemerisCommonContentDepA)++msgEphemerisGpsDepE :: Word16+msgEphemerisGpsDepE = 0x0081++-- | SBP class for message MSG_EPHEMERIS_GPS_DEP_E (0x0081).+--+-- The ephemeris message returns a set of satellite orbit parameters that is+-- used to calculate GPS satellite position, velocity, and clock offset. Please+-- see the Navstar GPS Space Segment/Navigation user interfaces (ICD-GPS-200,+-- Table 20-III) for more details.+data MsgEphemerisGpsDepE = MsgEphemerisGpsDepE+  { _msgEphemerisGpsDepE_common :: EphemerisCommonContentDepA+    -- ^ Values common for all ephemeris types+  , _msgEphemerisGpsDepE_tgd    :: Double+    -- ^ Group delay differential between L1 and L2+  , _msgEphemerisGpsDepE_c_rs   :: Double+    -- ^ Amplitude of the sine harmonic correction term to the orbit radius+  , _msgEphemerisGpsDepE_c_rc   :: Double+    -- ^ Amplitude of the cosine harmonic correction term to the orbit radius+  , _msgEphemerisGpsDepE_c_uc   :: Double+    -- ^ Amplitude of the cosine harmonic correction term to the argument of+    -- latitude+  , _msgEphemerisGpsDepE_c_us   :: Double+    -- ^ Amplitude of the sine harmonic correction term to the argument of+    -- latitude+  , _msgEphemerisGpsDepE_c_ic   :: Double+    -- ^ Amplitude of the cosine harmonic correction term to the angle of+    -- inclination+  , _msgEphemerisGpsDepE_c_is   :: Double+    -- ^ Amplitude of the sine harmonic correction term to the angle of+    -- inclination+  , _msgEphemerisGpsDepE_dn     :: Double+    -- ^ Mean motion difference+  , _msgEphemerisGpsDepE_m0     :: Double+    -- ^ Mean anomaly at reference time+  , _msgEphemerisGpsDepE_ecc    :: Double+    -- ^ Eccentricity of satellite orbit+  , _msgEphemerisGpsDepE_sqrta  :: Double+    -- ^ Square root of the semi-major axis of orbit+  , _msgEphemerisGpsDepE_omega0 :: Double+    -- ^ Longitude of ascending node of orbit plane at weekly epoch+  , _msgEphemerisGpsDepE_omegadot :: Double+    -- ^ Rate of right ascension+  , _msgEphemerisGpsDepE_w      :: Double+    -- ^ Argument of perigee+  , _msgEphemerisGpsDepE_inc    :: Double+    -- ^ Inclination+  , _msgEphemerisGpsDepE_inc_dot :: Double+    -- ^ Inclination first derivative+  , _msgEphemerisGpsDepE_af0    :: Double+    -- ^ Polynomial clock correction coefficient (clock bias)+  , _msgEphemerisGpsDepE_af1    :: Double+    -- ^ Polynomial clock correction coefficient (clock drift)+  , _msgEphemerisGpsDepE_af2    :: Double+    -- ^ Polynomial clock correction coefficient (rate of clock drift)+  , _msgEphemerisGpsDepE_toc    :: GpsTime+    -- ^ Clock reference+  , _msgEphemerisGpsDepE_iode   :: Word8+    -- ^ Issue of ephemeris data+  , _msgEphemerisGpsDepE_iodc   :: Word16+    -- ^ Issue of clock data+  } deriving ( Show, Read, Eq )++instance Binary MsgEphemerisGpsDepE where+  get = do+    _msgEphemerisGpsDepE_common <- get+    _msgEphemerisGpsDepE_tgd <- getFloat64le+    _msgEphemerisGpsDepE_c_rs <- getFloat64le+    _msgEphemerisGpsDepE_c_rc <- getFloat64le+    _msgEphemerisGpsDepE_c_uc <- getFloat64le+    _msgEphemerisGpsDepE_c_us <- getFloat64le+    _msgEphemerisGpsDepE_c_ic <- getFloat64le+    _msgEphemerisGpsDepE_c_is <- getFloat64le+    _msgEphemerisGpsDepE_dn <- getFloat64le+    _msgEphemerisGpsDepE_m0 <- getFloat64le+    _msgEphemerisGpsDepE_ecc <- getFloat64le+    _msgEphemerisGpsDepE_sqrta <- getFloat64le+    _msgEphemerisGpsDepE_omega0 <- getFloat64le+    _msgEphemerisGpsDepE_omegadot <- getFloat64le+    _msgEphemerisGpsDepE_w <- getFloat64le+    _msgEphemerisGpsDepE_inc <- getFloat64le+    _msgEphemerisGpsDepE_inc_dot <- getFloat64le+    _msgEphemerisGpsDepE_af0 <- getFloat64le+    _msgEphemerisGpsDepE_af1 <- getFloat64le+    _msgEphemerisGpsDepE_af2 <- getFloat64le+    _msgEphemerisGpsDepE_toc <- get+    _msgEphemerisGpsDepE_iode <- getWord8+    _msgEphemerisGpsDepE_iodc <- getWord16le+    return MsgEphemerisGpsDepE {..}++  put MsgEphemerisGpsDepE {..} = do+    put _msgEphemerisGpsDepE_common+    putFloat64le _msgEphemerisGpsDepE_tgd+    putFloat64le _msgEphemerisGpsDepE_c_rs+    putFloat64le _msgEphemerisGpsDepE_c_rc+    putFloat64le _msgEphemerisGpsDepE_c_uc+    putFloat64le _msgEphemerisGpsDepE_c_us+    putFloat64le _msgEphemerisGpsDepE_c_ic+    putFloat64le _msgEphemerisGpsDepE_c_is+    putFloat64le _msgEphemerisGpsDepE_dn+    putFloat64le _msgEphemerisGpsDepE_m0+    putFloat64le _msgEphemerisGpsDepE_ecc+    putFloat64le _msgEphemerisGpsDepE_sqrta+    putFloat64le _msgEphemerisGpsDepE_omega0+    putFloat64le _msgEphemerisGpsDepE_omegadot+    putFloat64le _msgEphemerisGpsDepE_w+    putFloat64le _msgEphemerisGpsDepE_inc+    putFloat64le _msgEphemerisGpsDepE_inc_dot+    putFloat64le _msgEphemerisGpsDepE_af0+    putFloat64le _msgEphemerisGpsDepE_af1+    putFloat64le _msgEphemerisGpsDepE_af2+    put _msgEphemerisGpsDepE_toc+    putWord8 _msgEphemerisGpsDepE_iode+    putWord16le _msgEphemerisGpsDepE_iodc++$(deriveSBP 'msgEphemerisGpsDepE ''MsgEphemerisGpsDepE)++$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgEphemerisGpsDepE_" . P.stripPrefix "_msgEphemerisGpsDepE_"}+             ''MsgEphemerisGpsDepE)+$(makeLenses ''MsgEphemerisGpsDepE)+ msgEphemerisGps :: Word16-msgEphemerisGps = 0x0081+msgEphemerisGps = 0x0086 --- | SBP class for message MSG_EPHEMERIS_GPS (0x0081).+-- | SBP class for message MSG_EPHEMERIS_GPS (0x0086). -- -- The ephemeris message returns a set of satellite orbit parameters that is -- used to calculate GPS satellite position, velocity, and clock offset. Please@@ -393,8 +550,98 @@              ''MsgEphemerisGps) $(makeLenses ''MsgEphemerisGps) +msgEphemerisSbasDepA :: Word16+msgEphemerisSbasDepA = 0x0082++data MsgEphemerisSbasDepA = MsgEphemerisSbasDepA+  { _msgEphemerisSbasDepA_common :: EphemerisCommonContentDepA+    -- ^ Values common for all ephemeris types+  , _msgEphemerisSbasDepA_pos  :: [Double]+    -- ^ Position of the GEO at time toe+  , _msgEphemerisSbasDepA_vel  :: [Double]+    -- ^ Velocity of the GEO at time toe+  , _msgEphemerisSbasDepA_acc  :: [Double]+    -- ^ Acceleration of the GEO at time toe+  , _msgEphemerisSbasDepA_a_gf0 :: Double+    -- ^ Time offset of the GEO clock w.r.t. SBAS Network Time+  , _msgEphemerisSbasDepA_a_gf1 :: Double+    -- ^ Drift of the GEO clock w.r.t. SBAS Network Time+  } deriving ( Show, Read, Eq )++instance Binary MsgEphemerisSbasDepA where+  get = do+    _msgEphemerisSbasDepA_common <- get+    _msgEphemerisSbasDepA_pos <- replicateM 3 getFloat64le+    _msgEphemerisSbasDepA_vel <- replicateM 3 getFloat64le+    _msgEphemerisSbasDepA_acc <- replicateM 3 getFloat64le+    _msgEphemerisSbasDepA_a_gf0 <- getFloat64le+    _msgEphemerisSbasDepA_a_gf1 <- getFloat64le+    return MsgEphemerisSbasDepA {..}++  put MsgEphemerisSbasDepA {..} = do+    put _msgEphemerisSbasDepA_common+    mapM_ putFloat64le _msgEphemerisSbasDepA_pos+    mapM_ putFloat64le _msgEphemerisSbasDepA_vel+    mapM_ putFloat64le _msgEphemerisSbasDepA_acc+    putFloat64le _msgEphemerisSbasDepA_a_gf0+    putFloat64le _msgEphemerisSbasDepA_a_gf1++$(deriveSBP 'msgEphemerisSbasDepA ''MsgEphemerisSbasDepA)++$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgEphemerisSbasDepA_" . P.stripPrefix "_msgEphemerisSbasDepA_"}+             ''MsgEphemerisSbasDepA)+$(makeLenses ''MsgEphemerisSbasDepA)++msgEphemerisGloDepA :: Word16+msgEphemerisGloDepA = 0x0083++-- | SBP class for message MSG_EPHEMERIS_GLO_DEP_A (0x0083).+--+-- The ephemeris message returns a set of satellite orbit parameters that is+-- used to calculate GLO satellite position, velocity, and clock offset. Please+-- see the GLO ICD 5.1 "Table 4.5 Characteristics of words of immediate+-- information (ephemeris parameters)" for more details.+data MsgEphemerisGloDepA = MsgEphemerisGloDepA+  { _msgEphemerisGloDepA_common :: EphemerisCommonContentDepA+    -- ^ Values common for all ephemeris types+  , _msgEphemerisGloDepA_gamma :: Double+    -- ^ Relative deviation of predicted carrier frequency from nominal+  , _msgEphemerisGloDepA_tau  :: Double+    -- ^ Correction to the SV time+  , _msgEphemerisGloDepA_pos  :: [Double]+    -- ^ Position of the SV at tb in PZ-90.02 coordinates system+  , _msgEphemerisGloDepA_vel  :: [Double]+    -- ^ Velocity vector of the SV at tb in PZ-90.02 coordinates system+  , _msgEphemerisGloDepA_acc  :: [Double]+    -- ^ Acceleration vector of the SV at tb in PZ-90.02 coordinates sys+  } deriving ( Show, Read, Eq )++instance Binary MsgEphemerisGloDepA where+  get = do+    _msgEphemerisGloDepA_common <- get+    _msgEphemerisGloDepA_gamma <- getFloat64le+    _msgEphemerisGloDepA_tau <- getFloat64le+    _msgEphemerisGloDepA_pos <- replicateM 3 getFloat64le+    _msgEphemerisGloDepA_vel <- replicateM 3 getFloat64le+    _msgEphemerisGloDepA_acc <- replicateM 3 getFloat64le+    return MsgEphemerisGloDepA {..}++  put MsgEphemerisGloDepA {..} = do+    put _msgEphemerisGloDepA_common+    putFloat64le _msgEphemerisGloDepA_gamma+    putFloat64le _msgEphemerisGloDepA_tau+    mapM_ putFloat64le _msgEphemerisGloDepA_pos+    mapM_ putFloat64le _msgEphemerisGloDepA_vel+    mapM_ putFloat64le _msgEphemerisGloDepA_acc++$(deriveSBP 'msgEphemerisGloDepA ''MsgEphemerisGloDepA)++$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgEphemerisGloDepA_" . P.stripPrefix "_msgEphemerisGloDepA_"}+             ''MsgEphemerisGloDepA)+$(makeLenses ''MsgEphemerisGloDepA)+ msgEphemerisSbas :: Word16-msgEphemerisSbas = 0x0082+msgEphemerisSbas = 0x0084  data MsgEphemerisSbas = MsgEphemerisSbas   { _msgEphemerisSbas_common :: EphemerisCommonContent@@ -436,9 +683,9 @@ $(makeLenses ''MsgEphemerisSbas)  msgEphemerisGlo :: Word16-msgEphemerisGlo = 0x0083+msgEphemerisGlo = 0x0085 --- | SBP class for message MSG_EPHEMERIS_GLO (0x0083).+-- | SBP class for message MSG_EPHEMERIS_GLO (0x0085). -- -- The ephemeris message returns a set of satellite orbit parameters that is -- used to calculate GLO satellite position, velocity, and clock offset. Please@@ -1372,17 +1619,60 @@              ''MsgSvConfigurationGps) $(makeLenses ''MsgSvConfigurationGps) +msgGroupDelayDepA :: Word16+msgGroupDelayDepA = 0x0092++-- | SBP class for message MSG_GROUP_DELAY_DEP_A (0x0092).+--+-- Please see ICD-GPS-200 (30.3.3.3.1.1) for more details.+data MsgGroupDelayDepA = MsgGroupDelayDepA+  { _msgGroupDelayDepA_t_op   :: GpsTime+    -- ^ Data Predict Time of Week+  , _msgGroupDelayDepA_prn    :: Word8+    -- ^ Satellite number+  , _msgGroupDelayDepA_valid  :: Word8+    -- ^ bit-field indicating validity of the values, LSB indicating tgd validity+    -- etc. 1 = value is valid, 0 = value is not valid.+  , _msgGroupDelayDepA_tgd    :: Int16+  , _msgGroupDelayDepA_isc_l1ca :: Int16+  , _msgGroupDelayDepA_isc_l2c :: Int16+  } deriving ( Show, Read, Eq )++instance Binary MsgGroupDelayDepA where+  get = do+    _msgGroupDelayDepA_t_op <- get+    _msgGroupDelayDepA_prn <- getWord8+    _msgGroupDelayDepA_valid <- getWord8+    _msgGroupDelayDepA_tgd <- fromIntegral <$> getWord16le+    _msgGroupDelayDepA_isc_l1ca <- fromIntegral <$> getWord16le+    _msgGroupDelayDepA_isc_l2c <- fromIntegral <$> getWord16le+    return MsgGroupDelayDepA {..}++  put MsgGroupDelayDepA {..} = do+    put _msgGroupDelayDepA_t_op+    putWord8 _msgGroupDelayDepA_prn+    putWord8 _msgGroupDelayDepA_valid+    putWord16le $ fromIntegral _msgGroupDelayDepA_tgd+    putWord16le $ fromIntegral _msgGroupDelayDepA_isc_l1ca+    putWord16le $ fromIntegral _msgGroupDelayDepA_isc_l2c++$(deriveSBP 'msgGroupDelayDepA ''MsgGroupDelayDepA)++$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgGroupDelayDepA_" . P.stripPrefix "_msgGroupDelayDepA_"}+             ''MsgGroupDelayDepA)+$(makeLenses ''MsgGroupDelayDepA)+ msgGroupDelay :: Word16-msgGroupDelay = 0x0092+msgGroupDelay = 0x0093 --- | SBP class for message MSG_GROUP_DELAY (0x0092).+-- | SBP class for message MSG_GROUP_DELAY (0x0093). -- -- Please see ICD-GPS-200 (30.3.3.3.1.1) for more details. data MsgGroupDelay = MsgGroupDelay   { _msgGroupDelay_t_op   :: GpsTime     -- ^ Data Predict Time of Week-  , _msgGroupDelay_prn    :: Word8-    -- ^ Satellite number+  , _msgGroupDelay_sid    :: GnssSignal+    -- ^ GNSS signal identifier   , _msgGroupDelay_valid  :: Word8     -- ^ bit-field indicating validity of the values, LSB indicating tgd validity     -- etc. 1 = value is valid, 0 = value is not valid.@@ -1394,7 +1684,7 @@ instance Binary MsgGroupDelay where   get = do     _msgGroupDelay_t_op <- get-    _msgGroupDelay_prn <- getWord8+    _msgGroupDelay_sid <- get     _msgGroupDelay_valid <- getWord8     _msgGroupDelay_tgd <- fromIntegral <$> getWord16le     _msgGroupDelay_isc_l1ca <- fromIntegral <$> getWord16le@@ -1403,7 +1693,7 @@    put MsgGroupDelay {..} = do     put _msgGroupDelay_t_op-    putWord8 _msgGroupDelay_prn+    put _msgGroupDelay_sid     putWord8 _msgGroupDelay_valid     putWord16le $ fromIntegral _msgGroupDelay_tgd     putWord16le $ fromIntegral _msgGroupDelay_isc_l1ca@@ -1414,3 +1704,206 @@ $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgGroupDelay_" . P.stripPrefix "_msgGroupDelay_"}              ''MsgGroupDelay) $(makeLenses ''MsgGroupDelay)++data AlmanacCommonContent = AlmanacCommonContent+  { _almanacCommonContent_sid        :: GnssSignal+    -- ^ GNSS signal identifier+  , _almanacCommonContent_toa        :: GpsTime+    -- ^ Reference time of almanac+  , _almanacCommonContent_ura        :: Double+    -- ^ User Range Accuracy+  , _almanacCommonContent_fit_interval :: Word32+    -- ^ Curve fit interval+  , _almanacCommonContent_valid      :: Word8+    -- ^ Status of almanac, 1 = valid, 0 = invalid+  , _almanacCommonContent_health_bits :: Word8+    -- ^ Satellite health status for GPS:   - bits 5-7: NAV data health status.+    -- See IS-GPS-200H     Table 20-VII: NAV Data Health Indications.   - bits+    -- 0-4: Signal health status. See IS-GPS-200H     Table 20-VIII. Codes for+    -- Health of SV Signal     Components. Satellite health status for GLO:+    -- See GLO ICD 5.1 table 5.1 for details   - bit 0: C(n), "unhealthy" flag+    -- that is transmitted within      non-immediate data and indicates overall+    -- constellation status     at the moment of almanac uploading.     '0'+    -- indicates malfunction of n-satellite.     '1' indicates that n-satellite+    -- is operational.   - bit 1: Bn(ln), '0' indicates the satellite is+    -- operational     and suitable for navigation.+  } deriving ( Show, Read, Eq )++instance Binary AlmanacCommonContent where+  get = do+    _almanacCommonContent_sid <- get+    _almanacCommonContent_toa <- get+    _almanacCommonContent_ura <- getFloat64le+    _almanacCommonContent_fit_interval <- getWord32le+    _almanacCommonContent_valid <- getWord8+    _almanacCommonContent_health_bits <- getWord8+    return AlmanacCommonContent {..}++  put AlmanacCommonContent {..} = do+    put _almanacCommonContent_sid+    put _almanacCommonContent_toa+    putFloat64le _almanacCommonContent_ura+    putWord32le _almanacCommonContent_fit_interval+    putWord8 _almanacCommonContent_valid+    putWord8 _almanacCommonContent_health_bits+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_almanacCommonContent_" . P.stripPrefix "_almanacCommonContent_"}+             ''AlmanacCommonContent)+$(makeLenses ''AlmanacCommonContent)++msgAlmanacGps :: Word16+msgAlmanacGps = 0x0070++-- | SBP class for message MSG_ALMANAC_GPS (0x0070).+--+-- The almanac message returns a set of satellite orbit parameters. Almanac+-- data is not very precise and is considered valid for up to several months.+-- Please see the Navstar GPS Space Segment/Navigation user interfaces (ICD-+-- GPS-200, Chapter 20.3.3.5.1.2 Almanac Data) for more details.+data MsgAlmanacGps = MsgAlmanacGps+  { _msgAlmanacGps_common :: AlmanacCommonContent+    -- ^ Values common for all almanac types+  , _msgAlmanacGps_m0     :: Double+    -- ^ Mean anomaly at reference time+  , _msgAlmanacGps_ecc    :: Double+    -- ^ Eccentricity of satellite orbit+  , _msgAlmanacGps_sqrta  :: Double+    -- ^ Square root of the semi-major axis of orbit+  , _msgAlmanacGps_omega0 :: Double+    -- ^ Longitude of ascending node of orbit plane at weekly epoch+  , _msgAlmanacGps_omegadot :: Double+    -- ^ Rate of right ascension+  , _msgAlmanacGps_w      :: Double+    -- ^ Argument of perigee+  , _msgAlmanacGps_inc    :: Double+    -- ^ Inclination+  , _msgAlmanacGps_af0    :: Double+    -- ^ Polynomial clock correction coefficient (clock bias)+  , _msgAlmanacGps_af1    :: Double+    -- ^ Polynomial clock correction coefficient (clock drift)+  } deriving ( Show, Read, Eq )++instance Binary MsgAlmanacGps where+  get = do+    _msgAlmanacGps_common <- get+    _msgAlmanacGps_m0 <- getFloat64le+    _msgAlmanacGps_ecc <- getFloat64le+    _msgAlmanacGps_sqrta <- getFloat64le+    _msgAlmanacGps_omega0 <- getFloat64le+    _msgAlmanacGps_omegadot <- getFloat64le+    _msgAlmanacGps_w <- getFloat64le+    _msgAlmanacGps_inc <- getFloat64le+    _msgAlmanacGps_af0 <- getFloat64le+    _msgAlmanacGps_af1 <- getFloat64le+    return MsgAlmanacGps {..}++  put MsgAlmanacGps {..} = do+    put _msgAlmanacGps_common+    putFloat64le _msgAlmanacGps_m0+    putFloat64le _msgAlmanacGps_ecc+    putFloat64le _msgAlmanacGps_sqrta+    putFloat64le _msgAlmanacGps_omega0+    putFloat64le _msgAlmanacGps_omegadot+    putFloat64le _msgAlmanacGps_w+    putFloat64le _msgAlmanacGps_inc+    putFloat64le _msgAlmanacGps_af0+    putFloat64le _msgAlmanacGps_af1++$(deriveSBP 'msgAlmanacGps ''MsgAlmanacGps)++$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgAlmanacGps_" . P.stripPrefix "_msgAlmanacGps_"}+             ''MsgAlmanacGps)+$(makeLenses ''MsgAlmanacGps)++msgAlmanacGlo :: Word16+msgAlmanacGlo = 0x0071++-- | SBP class for message MSG_ALMANAC_GLO (0x0071).+--+-- The almanac message returns a set of satellite orbit parameters. Almanac+-- data is not very precise and is considered valid for up to several months.+-- Please see the GLO ICD 5.1 "Chapter 4.5 Non-immediate information and+-- almanac" for details.+data MsgAlmanacGlo = MsgAlmanacGlo+  { _msgAlmanacGlo_common    :: AlmanacCommonContent+    -- ^ Values common for all almanac types+  , _msgAlmanacGlo_lambda_na :: Double+    -- ^ Longitude of the first ascending node of the orbit in PZ-90.02+    -- coordinate system+  , _msgAlmanacGlo_t_lambda_na :: Double+    -- ^ Time of the first ascending node passage+  , _msgAlmanacGlo_i         :: Double+    -- ^ Value of inclination at instant of t_lambda+  , _msgAlmanacGlo_t         :: Double+    -- ^ Value of Draconian period at instant of t_lambda+  , _msgAlmanacGlo_t_dot     :: Double+    -- ^ Rate of change of the Draconian period+  , _msgAlmanacGlo_epsilon   :: Double+    -- ^ Eccentricity at instant of t_lambda+  , _msgAlmanacGlo_omega     :: Double+    -- ^ Argument of perigee at instant of t_lambda+  } deriving ( Show, Read, Eq )++instance Binary MsgAlmanacGlo where+  get = do+    _msgAlmanacGlo_common <- get+    _msgAlmanacGlo_lambda_na <- getFloat64le+    _msgAlmanacGlo_t_lambda_na <- getFloat64le+    _msgAlmanacGlo_i <- getFloat64le+    _msgAlmanacGlo_t <- getFloat64le+    _msgAlmanacGlo_t_dot <- getFloat64le+    _msgAlmanacGlo_epsilon <- getFloat64le+    _msgAlmanacGlo_omega <- getFloat64le+    return MsgAlmanacGlo {..}++  put MsgAlmanacGlo {..} = do+    put _msgAlmanacGlo_common+    putFloat64le _msgAlmanacGlo_lambda_na+    putFloat64le _msgAlmanacGlo_t_lambda_na+    putFloat64le _msgAlmanacGlo_i+    putFloat64le _msgAlmanacGlo_t+    putFloat64le _msgAlmanacGlo_t_dot+    putFloat64le _msgAlmanacGlo_epsilon+    putFloat64le _msgAlmanacGlo_omega++$(deriveSBP 'msgAlmanacGlo ''MsgAlmanacGlo)++$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgAlmanacGlo_" . P.stripPrefix "_msgAlmanacGlo_"}+             ''MsgAlmanacGlo)+$(makeLenses ''MsgAlmanacGlo)++msgFcnsGlo :: Word16+msgFcnsGlo = 0x0072++-- | SBP class for message MSG_FCNS_GLO (0x0072).+--+-- The message reports mapping information regarding GLONASS SV orbital and+-- frequency slots. Mapped as follow: index (SV orbital slot)  fcns[index] 0+-- 0xFF 1                        FCN for SV orbital slot 1 ...+-- ... 28                       FCN for SV orbital slot 28 29+-- 0xFF 30                       0xFF 31                       0xFF+data MsgFcnsGlo = MsgFcnsGlo+  { _msgFcnsGlo_wn   :: Word16+    -- ^ GPS Week number+  , _msgFcnsGlo_tow_ms :: Word32+    -- ^ GPS Time of week+  , _msgFcnsGlo_fcns :: [Word8]+    -- ^ GLONASS fequency number per orbital slot+  } deriving ( Show, Read, Eq )++instance Binary MsgFcnsGlo where+  get = do+    _msgFcnsGlo_wn <- getWord16le+    _msgFcnsGlo_tow_ms <- getWord32le+    _msgFcnsGlo_fcns <- replicateM 32 getWord8+    return MsgFcnsGlo {..}++  put MsgFcnsGlo {..} = do+    putWord16le _msgFcnsGlo_wn+    putWord32le _msgFcnsGlo_tow_ms+    mapM_ putWord8 _msgFcnsGlo_fcns++$(deriveSBP 'msgFcnsGlo ''MsgFcnsGlo)++$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgFcnsGlo_" . P.stripPrefix "_msgFcnsGlo_"}+             ''MsgFcnsGlo)+$(makeLenses ''MsgFcnsGlo)
src/SwiftNav/SBP/Piksi.hs view
@@ -611,3 +611,80 @@ $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgCommandResp_" . P.stripPrefix "_msgCommandResp_"}              ''MsgCommandResp) $(makeLenses ''MsgCommandResp)++msgNetworkStateReq :: Word16+msgNetworkStateReq = 0x00BA++-- | SBP class for message MSG_NETWORK_STATE_REQ (0x00BA).+--+-- Request state of Piksi network interfaces. Output will be sent in+-- MSG_NETWORK_STATE_RESP messages+data MsgNetworkStateReq = MsgNetworkStateReq+  deriving ( Show, Read, Eq )++instance Binary MsgNetworkStateReq where+  get =+    return MsgNetworkStateReq++  put MsgNetworkStateReq =+    return ()++$(deriveSBP 'msgNetworkStateReq ''MsgNetworkStateReq)++$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgNetworkStateReq_" . P.stripPrefix "_msgNetworkStateReq_"}+             ''MsgNetworkStateReq)+$(makeLenses ''MsgNetworkStateReq)++msgNetworkStateResp :: Word16+msgNetworkStateResp = 0x00BB++-- | SBP class for message MSG_NETWORK_STATE_RESP (0x00BB).+--+-- The state of a network interface on the Piksi. Data is made to reflect+-- output of ifaddrs struct returned by getifaddrs in c.+data MsgNetworkStateResp = MsgNetworkStateResp+  { _msgNetworkStateResp_ipv4_address :: [Word8]+    -- ^ IPv4 address (all zero when unavailable)+  , _msgNetworkStateResp_ipv4_mask_size :: Word8+    -- ^ IPv4 netmask CIDR notation+  , _msgNetworkStateResp_ipv6_address :: [Word8]+    -- ^ IPv6 address (all zero when unavailable)+  , _msgNetworkStateResp_ipv6_mask_size :: Word8+    -- ^ IPv6 netmask CIDR notation+  , _msgNetworkStateResp_rx_bytes     :: Word32+    -- ^ Number of Rx bytes+  , _msgNetworkStateResp_tx_bytes     :: Word32+    -- ^ Number of Tx bytes+  , _msgNetworkStateResp_interface_name :: Text+    -- ^ Interface Name+  , _msgNetworkStateResp_flags        :: Word32+    -- ^ Interface flags from SIOCGIFFLAGS+  } deriving ( Show, Read, Eq )++instance Binary MsgNetworkStateResp where+  get = do+    _msgNetworkStateResp_ipv4_address <- replicateM 4 getWord8+    _msgNetworkStateResp_ipv4_mask_size <- getWord8+    _msgNetworkStateResp_ipv6_address <- replicateM 16 getWord8+    _msgNetworkStateResp_ipv6_mask_size <- getWord8+    _msgNetworkStateResp_rx_bytes <- getWord32le+    _msgNetworkStateResp_tx_bytes <- getWord32le+    _msgNetworkStateResp_interface_name <- decodeUtf8 <$> getByteString 16+    _msgNetworkStateResp_flags <- getWord32le+    return MsgNetworkStateResp {..}++  put MsgNetworkStateResp {..} = do+    mapM_ putWord8 _msgNetworkStateResp_ipv4_address+    putWord8 _msgNetworkStateResp_ipv4_mask_size+    mapM_ putWord8 _msgNetworkStateResp_ipv6_address+    putWord8 _msgNetworkStateResp_ipv6_mask_size+    putWord32le _msgNetworkStateResp_rx_bytes+    putWord32le _msgNetworkStateResp_tx_bytes+    putByteString $ encodeUtf8 _msgNetworkStateResp_interface_name+    putWord32le _msgNetworkStateResp_flags++$(deriveSBP 'msgNetworkStateResp ''MsgNetworkStateResp)++$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgNetworkStateResp_" . P.stripPrefix "_msgNetworkStateResp_"}+             ''MsgNetworkStateResp)+$(makeLenses ''MsgNetworkStateResp)