sbp 0.52.2 → 1.0.0
raw patch · 4 files changed
+357/−16 lines, 4 files
Files
- sbp.cabal +1/−1
- src/SwiftNav/SBP.hs +18/−0
- src/SwiftNav/SBP/Observation.hs +253/−9
- src/SwiftNav/SBP/Piksi.hs +85/−6
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
@@ -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
@@ -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)
@@ -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