packages feed

sbp 0.52.2 → 1.0.0

raw patch · 4 files changed

+357/−16 lines, 4 files

Files

sbp.cabal view
@@ -1,5 +1,5 @@ name:                  sbp-version:               0.52.2+version:               1.0.0 synopsis:              SwiftNav's SBP Library homepage:              https://github.com/swift-nav/libsbp license:               LGPL-3
src/SwiftNav/SBP.hs view
@@ -72,6 +72,7 @@    | SBPMsgEphemeris MsgEphemeris Msg    | SBPMsgEphemerisDepA MsgEphemerisDepA Msg    | SBPMsgEphemerisDepB MsgEphemerisDepB Msg+   | SBPMsgEphemerisDepC MsgEphemerisDepC Msg    | SBPMsgExtEvent MsgExtEvent Msg    | SBPMsgFileioReadDirReq MsgFileioReadDirReq Msg    | SBPMsgFileioReadDirResp MsgFileioReadDirResp Msg@@ -96,6 +97,7 @@    | SBPMsgNapDeviceDnaResp MsgNapDeviceDnaResp Msg    | SBPMsgObs MsgObs Msg    | SBPMsgObsDepA MsgObsDepA Msg+   | SBPMsgObsDepB MsgObsDepB Msg    | SBPMsgPosEcef MsgPosEcef Msg    | SBPMsgPosLlh MsgPosLlh Msg    | SBPMsgPrintDep MsgPrintDep Msg@@ -120,6 +122,7 @@    | SBPMsgTrackingStateDepA MsgTrackingStateDepA Msg    | SBPMsgTweet MsgTweet Msg    | SBPMsgUartState MsgUartState Msg+   | SBPMsgUartStateDepa MsgUartStateDepa Msg    | SBPMsgUserData MsgUserData Msg    | SBPMsgVelEcef MsgVelEcef Msg    | SBPMsgVelNed MsgVelNed Msg@@ -154,6 +157,7 @@           | _msgSBPType == msgEphemeris = SBPMsgEphemeris (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgEphemerisDepA = SBPMsgEphemerisDepA (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgEphemerisDepB = SBPMsgEphemerisDepB (decode (fromStrict _msgSBPPayload)) m+          | _msgSBPType == msgEphemerisDepC = SBPMsgEphemerisDepC (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgExtEvent = SBPMsgExtEvent (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgFileioReadDirReq = SBPMsgFileioReadDirReq (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgFileioReadDirResp = SBPMsgFileioReadDirResp (decode (fromStrict _msgSBPPayload)) m@@ -178,6 +182,7 @@           | _msgSBPType == msgNapDeviceDnaResp = SBPMsgNapDeviceDnaResp (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           | _msgSBPType == msgPosEcef = SBPMsgPosEcef (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgPosLlh = SBPMsgPosLlh (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgPrintDep = SBPMsgPrintDep (decode (fromStrict _msgSBPPayload)) m@@ -202,6 +207,7 @@           | _msgSBPType == msgTrackingStateDepA = SBPMsgTrackingStateDepA (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgTweet = SBPMsgTweet (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgUartState = SBPMsgUartState (decode (fromStrict _msgSBPPayload)) m+          | _msgSBPType == msgUartStateDepa = SBPMsgUartStateDepa (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgUserData = SBPMsgUserData (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgVelEcef = SBPMsgVelEcef (decode (fromStrict _msgSBPPayload)) m           | _msgSBPType == msgVelNed = SBPMsgVelNed (decode (fromStrict _msgSBPPayload)) m@@ -228,6 +234,7 @@       encode' (SBPMsgEphemeris _ m) = put m       encode' (SBPMsgEphemerisDepA _ m) = put m       encode' (SBPMsgEphemerisDepB _ m) = put m+      encode' (SBPMsgEphemerisDepC _ m) = put m       encode' (SBPMsgExtEvent _ m) = put m       encode' (SBPMsgFileioReadDirReq _ m) = put m       encode' (SBPMsgFileioReadDirResp _ m) = put m@@ -252,6 +259,7 @@       encode' (SBPMsgNapDeviceDnaResp _ m) = put m       encode' (SBPMsgObs _ m) = put m       encode' (SBPMsgObsDepA _ m) = put m+      encode' (SBPMsgObsDepB _ m) = put m       encode' (SBPMsgPosEcef _ m) = put m       encode' (SBPMsgPosLlh _ m) = put m       encode' (SBPMsgPrintDep _ m) = put m@@ -276,6 +284,7 @@       encode' (SBPMsgTrackingStateDepA _ m) = put m       encode' (SBPMsgTweet _ m) = put m       encode' (SBPMsgUartState _ m) = put m+      encode' (SBPMsgUartStateDepa _ m) = put m       encode' (SBPMsgUserData _ m) = put m       encode' (SBPMsgVelEcef _ m) = put m       encode' (SBPMsgVelNed _ m) = put m@@ -305,6 +314,7 @@         | msgType == msgEphemeris = SBPMsgEphemeris <$> parseJSON obj <*> parseJSON obj         | msgType == msgEphemerisDepA = SBPMsgEphemerisDepA <$> parseJSON obj <*> parseJSON obj         | msgType == msgEphemerisDepB = SBPMsgEphemerisDepB <$> parseJSON obj <*> parseJSON obj+        | msgType == msgEphemerisDepC = SBPMsgEphemerisDepC <$> parseJSON obj <*> parseJSON obj         | msgType == msgExtEvent = SBPMsgExtEvent <$> parseJSON obj <*> parseJSON obj         | msgType == msgFileioReadDirReq = SBPMsgFileioReadDirReq <$> parseJSON obj <*> parseJSON obj         | msgType == msgFileioReadDirResp = SBPMsgFileioReadDirResp <$> parseJSON obj <*> parseJSON obj@@ -329,6 +339,7 @@         | msgType == msgNapDeviceDnaResp = SBPMsgNapDeviceDnaResp <$> 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         | msgType == msgPosEcef = SBPMsgPosEcef <$> parseJSON obj <*> parseJSON obj         | msgType == msgPosLlh = SBPMsgPosLlh <$> parseJSON obj <*> parseJSON obj         | msgType == msgPrintDep = SBPMsgPrintDep <$> parseJSON obj <*> parseJSON obj@@ -353,6 +364,7 @@         | msgType == msgTrackingStateDepA = SBPMsgTrackingStateDepA <$> parseJSON obj <*> parseJSON obj         | msgType == msgTweet = SBPMsgTweet <$> parseJSON obj <*> parseJSON obj         | msgType == msgUartState = SBPMsgUartState <$> parseJSON obj <*> parseJSON obj+        | msgType == msgUartStateDepa = SBPMsgUartStateDepa <$> parseJSON obj <*> parseJSON obj         | msgType == msgUserData = SBPMsgUserData <$> parseJSON obj <*> parseJSON obj         | msgType == msgVelEcef = SBPMsgVelEcef <$> parseJSON obj <*> parseJSON obj         | msgType == msgVelNed = SBPMsgVelNed <$> parseJSON obj <*> parseJSON obj@@ -384,6 +396,7 @@   toJSON (SBPMsgEphemeris n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgEphemerisDepA n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgEphemerisDepB n m) = toJSON n `mergeValues` toJSON m+  toJSON (SBPMsgEphemerisDepC n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgExtEvent 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@@ -408,6 +421,7 @@   toJSON (SBPMsgNapDeviceDnaResp 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   toJSON (SBPMsgPosEcef n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgPosLlh n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgPrintDep n m) = toJSON n `mergeValues` toJSON m@@ -432,6 +446,7 @@   toJSON (SBPMsgTrackingStateDepA n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgTweet n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgUartState n m) = toJSON n `mergeValues` toJSON m+  toJSON (SBPMsgUartStateDepa n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgUserData n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgVelEcef n m) = toJSON n `mergeValues` toJSON m   toJSON (SBPMsgVelNed n m) = toJSON n `mergeValues` toJSON m@@ -457,6 +472,7 @@   msg f (SBPMsgEphemeris n m) = SBPMsgEphemeris n <$> f m   msg f (SBPMsgEphemerisDepA n m) = SBPMsgEphemerisDepA n <$> f m   msg f (SBPMsgEphemerisDepB n m) = SBPMsgEphemerisDepB n <$> f m+  msg f (SBPMsgEphemerisDepC n m) = SBPMsgEphemerisDepC n <$> f m   msg f (SBPMsgExtEvent n m) = SBPMsgExtEvent n <$> f m   msg f (SBPMsgFileioReadDirReq n m) = SBPMsgFileioReadDirReq n <$> f m   msg f (SBPMsgFileioReadDirResp n m) = SBPMsgFileioReadDirResp n <$> f m@@ -481,6 +497,7 @@   msg f (SBPMsgNapDeviceDnaResp n m) = SBPMsgNapDeviceDnaResp 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   msg f (SBPMsgPosEcef n m) = SBPMsgPosEcef n <$> f m   msg f (SBPMsgPosLlh n m) = SBPMsgPosLlh n <$> f m   msg f (SBPMsgPrintDep n m) = SBPMsgPrintDep n <$> f m@@ -505,6 +522,7 @@   msg f (SBPMsgTrackingStateDepA n m) = SBPMsgTrackingStateDepA 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 (SBPMsgVelEcef n m) = SBPMsgVelEcef n <$> f m   msg f (SBPMsgVelNed n m) = SBPMsgVelNed n <$> f m
src/SwiftNav/SBP/Observation.hs view
@@ -56,7 +56,7 @@ -- -- Carrier phase measurement in cycles represented as a 40-bit fixed point -- number with Q32.8 layout, i.e. 32-bits of whole cycles and 8-bits of--- fractional cycles.+-- fractional cycles.  This phase has the  same sign as the pseudorange. data CarrierPhase = CarrierPhase   { _carrierPhase_i :: Int32     -- ^ Carrier phase whole cycles@@ -103,12 +103,14 @@  -- | PackedObsContent. ----- Pseudorange and carrier phase observation for a satellite being tracked.+-- Pseudorange and carrier phase observation for a satellite being tracked. The+-- observations should be interoperable with 3rd party  receivers and conform+-- with typical RTCMv3 GNSS observations. data PackedObsContent = PackedObsContent   { _packedObsContent_P  :: Word32     -- ^ Pseudorange observation   , _packedObsContent_L  :: CarrierPhase-    -- ^ Carrier phase observation+    -- ^ Carrier phase observation with typical sign convention.   , _packedObsContent_cn0 :: Word8     -- ^ Carrier-to-Noise density   , _packedObsContent_lock :: Word16@@ -139,14 +141,16 @@ $(makeLenses ''PackedObsContent)  msgObs :: Word16-msgObs = 0x0043+msgObs = 0x0049 --- | SBP class for message MSG_OBS (0x0043).+-- | SBP class for message MSG_OBS (0x0049). -- -- The GPS observations message reports all the raw pseudorange and carrier -- phase observations for the satellites being tracked by the device. Carrier -- phase observation here is represented as a 40-bit fixed point number with -- Q32.8 layout (i.e. 32-bits of whole cycles and 8-bits of fractional cycles).+-- The observations  should be interoperable with 3rd party receivers and+-- conform  with typical RTCMv3 GNSS observations. data MsgObs = MsgObs   { _msgObs_header :: ObservationHeader     -- ^ Header of a GPS observation message@@ -244,9 +248,9 @@ $(makeLenses ''MsgBasePosEcef)  msgEphemeris :: Word16-msgEphemeris = 0x0047+msgEphemeris = 0x0080 --- | SBP class for message MSG_EPHEMERIS (0x0047).+-- | SBP class for message MSG_EPHEMERIS (0x0080). -- -- The ephemeris message returns a set of satellite orbit parameters that is -- used to calculate GPS satellite position, velocity, and clock offset. Please@@ -649,14 +653,184 @@              ''MsgEphemerisDepB) $(makeLenses ''MsgEphemerisDepB) +msgEphemerisDepC :: Word16+msgEphemerisDepC = 0x0047++-- | SBP class for message MSG_EPHEMERIS_DEP_C (0x0047).+--+-- 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 MsgEphemerisDepC = MsgEphemerisDepC+  { _msgEphemerisDepC_tgd    :: Double+    -- ^ Group delay differential between L1 and L2+  , _msgEphemerisDepC_c_rs   :: Double+    -- ^ Amplitude of the sine harmonic correction term to the orbit radius+  , _msgEphemerisDepC_c_rc   :: Double+    -- ^ Amplitude of the cosine harmonic correction term to the orbit radius+  , _msgEphemerisDepC_c_uc   :: Double+    -- ^ Amplitude of the cosine harmonic correction term to the argument of+    -- latitude+  , _msgEphemerisDepC_c_us   :: Double+    -- ^ Amplitude of the sine harmonic correction term to the argument of+    -- latitude+  , _msgEphemerisDepC_c_ic   :: Double+    -- ^ Amplitude of the cosine harmonic correction term to the angle of+    -- inclination+  , _msgEphemerisDepC_c_is   :: Double+    -- ^ Amplitude of the sine harmonic correction term to the angle of+    -- inclination+  , _msgEphemerisDepC_dn     :: Double+    -- ^ Mean motion difference+  , _msgEphemerisDepC_m0     :: Double+    -- ^ Mean anomaly at reference time+  , _msgEphemerisDepC_ecc    :: Double+    -- ^ Eccentricity of satellite orbit+  , _msgEphemerisDepC_sqrta  :: Double+    -- ^ Square root of the semi-major axis of orbit+  , _msgEphemerisDepC_omega0 :: Double+    -- ^ Longitude of ascending node of orbit plane at weekly epoch+  , _msgEphemerisDepC_omegadot :: Double+    -- ^ Rate of right ascension+  , _msgEphemerisDepC_w      :: Double+    -- ^ Argument of perigee+  , _msgEphemerisDepC_inc    :: Double+    -- ^ Inclination+  , _msgEphemerisDepC_inc_dot :: Double+    -- ^ Inclination first derivative+  , _msgEphemerisDepC_af0    :: Double+    -- ^ Polynomial clock correction coefficient (clock bias)+  , _msgEphemerisDepC_af1    :: Double+    -- ^ Polynomial clock correction coefficient (clock drift)+  , _msgEphemerisDepC_af2    :: Double+    -- ^ Polynomial clock correction coefficient (rate of clock drift)+  , _msgEphemerisDepC_toe_tow :: Double+    -- ^ Time of week+  , _msgEphemerisDepC_toe_wn :: Word16+    -- ^ Week number+  , _msgEphemerisDepC_toc_tow :: Double+    -- ^ Clock reference time of week+  , _msgEphemerisDepC_toc_wn :: Word16+    -- ^ Clock reference week number+  , _msgEphemerisDepC_valid  :: Word8+    -- ^ Is valid?+  , _msgEphemerisDepC_healthy :: Word8+    -- ^ Satellite is healthy?+  , _msgEphemerisDepC_sid    :: GnssSignal+    -- ^ GNSS signal identifier+  , _msgEphemerisDepC_iode   :: Word8+    -- ^ Issue of ephemeris data+  , _msgEphemerisDepC_iodc   :: Word16+    -- ^ Issue of clock data+  , _msgEphemerisDepC_reserved :: Word32+    -- ^ Reserved field+  } deriving ( Show, Read, Eq )++instance Binary MsgEphemerisDepC where+  get = do+    _msgEphemerisDepC_tgd <- getFloat64le+    _msgEphemerisDepC_c_rs <- getFloat64le+    _msgEphemerisDepC_c_rc <- getFloat64le+    _msgEphemerisDepC_c_uc <- getFloat64le+    _msgEphemerisDepC_c_us <- getFloat64le+    _msgEphemerisDepC_c_ic <- getFloat64le+    _msgEphemerisDepC_c_is <- getFloat64le+    _msgEphemerisDepC_dn <- getFloat64le+    _msgEphemerisDepC_m0 <- getFloat64le+    _msgEphemerisDepC_ecc <- getFloat64le+    _msgEphemerisDepC_sqrta <- getFloat64le+    _msgEphemerisDepC_omega0 <- getFloat64le+    _msgEphemerisDepC_omegadot <- getFloat64le+    _msgEphemerisDepC_w <- getFloat64le+    _msgEphemerisDepC_inc <- getFloat64le+    _msgEphemerisDepC_inc_dot <- getFloat64le+    _msgEphemerisDepC_af0 <- getFloat64le+    _msgEphemerisDepC_af1 <- getFloat64le+    _msgEphemerisDepC_af2 <- getFloat64le+    _msgEphemerisDepC_toe_tow <- getFloat64le+    _msgEphemerisDepC_toe_wn <- getWord16le+    _msgEphemerisDepC_toc_tow <- getFloat64le+    _msgEphemerisDepC_toc_wn <- getWord16le+    _msgEphemerisDepC_valid <- getWord8+    _msgEphemerisDepC_healthy <- getWord8+    _msgEphemerisDepC_sid <- get+    _msgEphemerisDepC_iode <- getWord8+    _msgEphemerisDepC_iodc <- getWord16le+    _msgEphemerisDepC_reserved <- getWord32le+    return MsgEphemerisDepC {..}++  put MsgEphemerisDepC {..} = do+    putFloat64le _msgEphemerisDepC_tgd+    putFloat64le _msgEphemerisDepC_c_rs+    putFloat64le _msgEphemerisDepC_c_rc+    putFloat64le _msgEphemerisDepC_c_uc+    putFloat64le _msgEphemerisDepC_c_us+    putFloat64le _msgEphemerisDepC_c_ic+    putFloat64le _msgEphemerisDepC_c_is+    putFloat64le _msgEphemerisDepC_dn+    putFloat64le _msgEphemerisDepC_m0+    putFloat64le _msgEphemerisDepC_ecc+    putFloat64le _msgEphemerisDepC_sqrta+    putFloat64le _msgEphemerisDepC_omega0+    putFloat64le _msgEphemerisDepC_omegadot+    putFloat64le _msgEphemerisDepC_w+    putFloat64le _msgEphemerisDepC_inc+    putFloat64le _msgEphemerisDepC_inc_dot+    putFloat64le _msgEphemerisDepC_af0+    putFloat64le _msgEphemerisDepC_af1+    putFloat64le _msgEphemerisDepC_af2+    putFloat64le _msgEphemerisDepC_toe_tow+    putWord16le _msgEphemerisDepC_toe_wn+    putFloat64le _msgEphemerisDepC_toc_tow+    putWord16le _msgEphemerisDepC_toc_wn+    putWord8 _msgEphemerisDepC_valid+    putWord8 _msgEphemerisDepC_healthy+    put _msgEphemerisDepC_sid+    putWord8 _msgEphemerisDepC_iode+    putWord16le _msgEphemerisDepC_iodc+    putWord32le _msgEphemerisDepC_reserved++$(deriveSBP 'msgEphemerisDepC ''MsgEphemerisDepC)++$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgEphemerisDepC_" . stripPrefix "_msgEphemerisDepC_"}+             ''MsgEphemerisDepC)+$(makeLenses ''MsgEphemerisDepC)++-- | CarrierPhaseDepA.+--+-- Carrier phase measurement in cycles represented as a 40-bit fixed point+-- number with Q32.8 layout, i.e. 32-bits of whole cycles and 8-bits of+-- fractional cycles. This has the opposite sign convention than a typical GPS+-- receiver and the phase has the opposite sign as the pseudorange.+data CarrierPhaseDepA = CarrierPhaseDepA+  { _carrierPhaseDepA_i :: Int32+    -- ^ Carrier phase whole cycles+  , _carrierPhaseDepA_f :: Word8+    -- ^ Carrier phase fractional part+  } deriving ( Show, Read, Eq )++instance Binary CarrierPhaseDepA where+  get = do+    _carrierPhaseDepA_i <- liftM fromIntegral getWord32le+    _carrierPhaseDepA_f <- getWord8+    return CarrierPhaseDepA {..}++  put CarrierPhaseDepA {..} = do+    putWord32le $ fromIntegral _carrierPhaseDepA_i+    putWord8 _carrierPhaseDepA_f+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_carrierPhaseDepA_" . stripPrefix "_carrierPhaseDepA_"}+             ''CarrierPhaseDepA)+$(makeLenses ''CarrierPhaseDepA)+ -- | PackedObsContentDepA. -- -- Deprecated. data PackedObsContentDepA = PackedObsContentDepA   { _packedObsContentDepA_P  :: Word32     -- ^ Pseudorange observation-  , _packedObsContentDepA_L  :: CarrierPhase-    -- ^ Carrier phase observation+  , _packedObsContentDepA_L  :: CarrierPhaseDepA+    -- ^ Carrier phase observation with opposite sign from typical convention   , _packedObsContentDepA_cn0 :: Word8     -- ^ Carrier-to-Noise density   , _packedObsContentDepA_lock :: Word16@@ -686,6 +860,44 @@              ''PackedObsContentDepA) $(makeLenses ''PackedObsContentDepA) +-- | PackedObsContentDepB.+--+-- Pseudorange and carrier phase observation for a satellite being tracked.+-- Pseudoranges are referenced to a nominal pseudorange.+data PackedObsContentDepB = PackedObsContentDepB+  { _packedObsContentDepB_P  :: Word32+    -- ^ Pseudorange observation+  , _packedObsContentDepB_L  :: CarrierPhaseDepA+    -- ^ Carrier phase observation with opposite sign from typical convention.+  , _packedObsContentDepB_cn0 :: Word8+    -- ^ Carrier-to-Noise density+  , _packedObsContentDepB_lock :: Word16+    -- ^ Lock indicator. This value changes whenever a satellite signal has lost+    -- and regained lock, indicating that the carrier phase ambiguity may have+    -- changed.+  , _packedObsContentDepB_sid :: GnssSignal+    -- ^ GNSS signal identifier+  } deriving ( Show, Read, Eq )++instance Binary PackedObsContentDepB where+  get = do+    _packedObsContentDepB_P <- getWord32le+    _packedObsContentDepB_L <- get+    _packedObsContentDepB_cn0 <- getWord8+    _packedObsContentDepB_lock <- getWord16le+    _packedObsContentDepB_sid <- get+    return PackedObsContentDepB {..}++  put PackedObsContentDepB {..} = do+    putWord32le _packedObsContentDepB_P+    put _packedObsContentDepB_L+    putWord8 _packedObsContentDepB_cn0+    putWord16le _packedObsContentDepB_lock+    put _packedObsContentDepB_sid+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_packedObsContentDepB_" . stripPrefix "_packedObsContentDepB_"}+             ''PackedObsContentDepB)+$(makeLenses ''PackedObsContentDepB)+ msgObsDepA :: Word16 msgObsDepA = 0x0045 @@ -714,3 +926,35 @@ $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgObsDepA_" . stripPrefix "_msgObsDepA_"}              ''MsgObsDepA) $(makeLenses ''MsgObsDepA)++msgObsDepB :: Word16+msgObsDepB = 0x0043++-- | SBP class for message MSG_OBS_DEP_B (0x0043).+--+-- This observation message has been deprecated in favor of  observations that+-- are more interoperable. This message should be used for observations+-- referenced to  a nominal pseudorange which are not interoperable with most+-- 3rd party GNSS receievers or typical RTCMv3  observations.+data MsgObsDepB = MsgObsDepB+  { _msgObsDepB_header :: ObservationHeader+    -- ^ Header of a GPS observation message+  , _msgObsDepB_obs  :: [PackedObsContentDepB]+    -- ^ Pseudorange and carrier phase observation for a satellite being tracked.+  } deriving ( Show, Read, Eq )++instance Binary MsgObsDepB where+  get = do+    _msgObsDepB_header <- get+    _msgObsDepB_obs <- whileM (liftM not isEmpty) get+    return MsgObsDepB {..}++  put MsgObsDepB {..} = do+    put _msgObsDepB_header+    mapM_ put _msgObsDepB_obs++$(deriveSBP 'msgObsDepB ''MsgObsDepB)++$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgObsDepB_" . stripPrefix "_msgObsDepB_"}+             ''MsgObsDepB)+$(makeLenses ''MsgObsDepB)
src/SwiftNav/SBP/Piksi.hs view
@@ -273,6 +273,41 @@              ''UARTChannel) $(makeLenses ''UARTChannel) +-- | Period.+--+-- Statistics on the period of observations received from the base station. As+-- complete observation sets are received, their time of reception is compared+-- with the prior set''s time of reception. This measurement provides a proxy+-- for link quality as incomplete or missing sets will increase the period.+-- Long periods can cause momentary RTK solution outages.+data Period = Period+  { _period_avg   :: Int32+    -- ^ Average period+  , _period_pmin  :: Int32+    -- ^ Minimum period+  , _period_pmax  :: Int32+    -- ^ Maximum period+  , _period_current :: Int32+    -- ^ Smoothed estimate of the current period+  } deriving ( Show, Read, Eq )++instance Binary Period where+  get = do+    _period_avg <- liftM fromIntegral getWord32le+    _period_pmin <- liftM fromIntegral getWord32le+    _period_pmax <- liftM fromIntegral getWord32le+    _period_current <- liftM fromIntegral getWord32le+    return Period {..}++  put Period {..} = do+    putWord32le $ fromIntegral _period_avg+    putWord32le $ fromIntegral _period_pmin+    putWord32le $ fromIntegral _period_pmax+    putWord32le $ fromIntegral _period_current+$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_period_" . stripPrefix "_period_"}+             ''Period)+$(makeLenses ''Period)+ -- | Latency. -- -- Statistics on the latency of observations received from the base station. As@@ -308,24 +343,29 @@ $(makeLenses ''Latency)  msgUartState :: Word16-msgUartState = 0x0018+msgUartState = 0x001D --- | SBP class for message MSG_UART_STATE (0x0018).+-- | SBP class for message MSG_UART_STATE (0x001D). -- -- The UART message reports data latency and throughput of the UART channels -- providing SBP I/O. On the default Piksi configuration, UARTs A and B are -- used for telemetry radios, but can also be host access ports for embedded -- hosts, or other interfaces in future. The reported percentage values must be--- normalized.+-- normalized. Observations latency and period can be used to assess the+-- health of the differential corrections link. Latency provides the timeliness+-- of received base observations while the  period indicates their likelihood+-- of transmission. data MsgUartState = MsgUartState-  { _msgUartState_uart_a  :: UARTChannel+  { _msgUartState_uart_a   :: UARTChannel     -- ^ State of UART A-  , _msgUartState_uart_b  :: UARTChannel+  , _msgUartState_uart_b   :: UARTChannel     -- ^ State of UART B   , _msgUartState_uart_ftdi :: UARTChannel     -- ^ State of UART FTDI (USB logger)-  , _msgUartState_latency :: Latency+  , _msgUartState_latency  :: Latency     -- ^ UART communication latency+  , _msgUartState_obs_period :: Period+    -- ^ Observation receipt period   } deriving ( Show, Read, Eq )  instance Binary MsgUartState where@@ -334,6 +374,7 @@     _msgUartState_uart_b <- get     _msgUartState_uart_ftdi <- get     _msgUartState_latency <- get+    _msgUartState_obs_period <- get     return MsgUartState {..}    put MsgUartState {..} = do@@ -341,12 +382,50 @@     put _msgUartState_uart_b     put _msgUartState_uart_ftdi     put _msgUartState_latency+    put _msgUartState_obs_period  $(deriveSBP 'msgUartState ''MsgUartState)  $(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgUartState_" . stripPrefix "_msgUartState_"}              ''MsgUartState) $(makeLenses ''MsgUartState)++msgUartStateDepa :: Word16+msgUartStateDepa = 0x0018++-- | SBP class for message MSG_UART_STATE_DEPA (0x0018).+--+-- Deprecated+data MsgUartStateDepa = MsgUartStateDepa+  { _msgUartStateDepa_uart_a  :: UARTChannel+    -- ^ State of UART A+  , _msgUartStateDepa_uart_b  :: UARTChannel+    -- ^ State of UART B+  , _msgUartStateDepa_uart_ftdi :: UARTChannel+    -- ^ State of UART FTDI (USB logger)+  , _msgUartStateDepa_latency :: Latency+    -- ^ UART communication latency+  } deriving ( Show, Read, Eq )++instance Binary MsgUartStateDepa where+  get = do+    _msgUartStateDepa_uart_a <- get+    _msgUartStateDepa_uart_b <- get+    _msgUartStateDepa_uart_ftdi <- get+    _msgUartStateDepa_latency <- get+    return MsgUartStateDepa {..}++  put MsgUartStateDepa {..} = do+    put _msgUartStateDepa_uart_a+    put _msgUartStateDepa_uart_b+    put _msgUartStateDepa_uart_ftdi+    put _msgUartStateDepa_latency++$(deriveSBP 'msgUartStateDepa ''MsgUartStateDepa)++$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msgUartStateDepa_" . stripPrefix "_msgUartStateDepa_"}+             ''MsgUartStateDepa)+$(makeLenses ''MsgUartStateDepa)  msgIarState :: Word16 msgIarState = 0x0019