sbp 2.1.7 → 2.2.0
raw patch · 8 files changed
+673/−44 lines, 8 files
Files
- README.md +6/−0
- sbp.cabal +1/−1
- src/SwiftNav/SBP.hs +54/−0
- src/SwiftNav/SBP/ExtEvents.hs +7/−7
- src/SwiftNav/SBP/Gnss.hs +5/−5
- src/SwiftNav/SBP/Navigation.hs +17/−18
- src/SwiftNav/SBP/Observation.hs +506/−13
- src/SwiftNav/SBP/Piksi.hs +77/−0
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
@@ -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
@@ -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
@@ -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)
@@ -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)
@@ -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)
@@ -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)