gnss-converters 0.1.18 → 0.1.19
raw patch · 3 files changed
+68/−68 lines, 3 files
Files
- gnss-converters.cabal +1/−1
- src/Data/RTCM3/SBP.hs +29/−29
- test/Test/Data/RTCM3/SBP.hs +38/−38
gnss-converters.cabal view
@@ -1,5 +1,5 @@ name: gnss-converters-version: 0.1.18+version: 0.1.19 synopsis: GNSS Converters. description: Haskell bindings for GNSS converters. homepage: http://github.com/swift-nav/gnss-converters
src/Data/RTCM3/SBP.hs view
@@ -327,15 +327,15 @@ => Word8 -- ^ Total messages -> Word8 -- ^ Message in sequence -> GpsObservationHeader -- ^ RTCM observation header- -> m ObservationHeader+ -> m ObservationHeaderDep fromGpsObservationHeader totalMsgs n hdr = do t <- toGpsTime hdr- return ObservationHeader- { _observationHeader_t = t+ return ObservationHeaderDep+ { _observationHeaderDep_t = t -- First nibble is the size of the sequence (n), second nibble is the -- zero-indexed counter (ith packet of n). See observation header packing -- https://github.com/swift-nav/libsbp/blob/master/spec/yaml/swiftnav/sbp/observation.yaml#L63- , _observationHeader_n_obs = totalMsgs `shiftL` 4 .|. n+ , _observationHeaderDep_n_obs = totalMsgs `shiftL` 4 .|. n } -- | Construct an L1 GnssSignal@@ -355,18 +355,18 @@ -> Word8 -- ^ Satellite PRN -> GpsL1Observation -> GpsL1ExtObservation- -> m PackedObsContent+ -> m PackedObsContentDepC fromL1SatelliteObservation station sat l1 l1e = do -- Checks GPS L1 code indicator for RTCM message 1002. -- See DF010, pg. 3-17 of the RTCM3 spec. let sid = toL1GnssSignal sat l1 lock <- toLock station sid $ l1 ^. gpsL1Observation_lockTime- return PackedObsContent- { _packedObsContent_P = toP_L1 l1 l1e- , _packedObsContent_L = toL_L1 l1 l1e- , _packedObsContent_cn0 = toCn0_L1 l1e- , _packedObsContent_lock = lock- , _packedObsContent_sid = sid+ return PackedObsContentDepC+ { _packedObsContentDepC_P = toP_L1 l1 l1e+ , _packedObsContentDepC_L = toL_L1 l1 l1e+ , _packedObsContentDepC_cn0 = toCn0_L1 l1e+ , _packedObsContentDepC_lock = lock+ , _packedObsContentDepC_sid = sid } -- | Construct an L2 GnssSignal@@ -389,18 +389,18 @@ -> GpsL1ExtObservation -> GpsL2Observation -> GpsL2ExtObservation- -> m (Maybe PackedObsContent)+ -> m (Maybe PackedObsContentDepC) fromL2SatelliteObservation station sat l1 l1e l2 l2e = -- Checks GPS L2 code indicator. -- See DF016, pg. 3-17 of the RTCM3 spec. maybe' (toL2GnssSignal sat l2) (return Nothing) $ \sid -> do lock <- toLock station sid $ l2 ^. gpsL2Observation_lockTime- return $ Just PackedObsContent- { _packedObsContent_P = toP_L2 l1 l1e l2- , _packedObsContent_L = toL_L2 l1 l1e l2 l2e- , _packedObsContent_cn0 = toCn0_L2 l2e- , _packedObsContent_lock = lock- , _packedObsContent_sid = sid+ return $ Just PackedObsContentDepC+ { _packedObsContentDepC_P = toP_L2 l1 l1e l2+ , _packedObsContentDepC_L = toL_L2 l1 l1e l2 l2e+ , _packedObsContentDepC_cn0 = toCn0_L2 l2e+ , _packedObsContentDepC_lock = lock+ , _packedObsContentDepC_sid = sid } -- | Construct SBP GPS observation message (possibly chunked).@@ -409,13 +409,13 @@ => GpsObservationHeader -- ^ RTCM observation header -> Word8 -- ^ Total messages -> Word8 -- ^ Message in sequence- -> [PackedObsContent]- -> m MsgObs+ -> [PackedObsContentDepC]+ -> m MsgObsDepC chunkToMsgObs hdr totalMsgs n packed = do header <- fromGpsObservationHeader totalMsgs n hdr- return MsgObs- { _msgObs_header = header- , _msgObs_obs = packed+ return MsgObsDepC+ { _msgObsDepC_header = header+ , _msgObsDepC_obs = packed } -- | Sender Id is Station Id with high byte or'd in@@ -431,7 +431,7 @@ -- | Construct an L1 SBP PackedObsContent from an RTCM Msg 1002. ---fromObservation1002 :: MonadStore e m => Word16 -> Observation1002 -> m [PackedObsContent]+fromObservation1002 :: MonadStore e m => Word16 -> Observation1002 -> m [PackedObsContentDepC] fromObservation1002 station obs = do obs1 <- fromL1SatelliteObservation station sat l1 l1e return $@@ -449,7 +449,7 @@ -- -- This chunking takes places because the number of observations in a given 1002 -- may very well exceed the maximum SBP supported payload size of 255 bytes.-fromMsg1002 :: MonadStore e m => Msg1002 -> m [MsgObs]+fromMsg1002 :: MonadStore e m => Msg1002 -> m [MsgObsDepC] fromMsg1002 m = do let hdr = m ^. msg1002_header station = hdr ^. gpsObservationHeader_station@@ -460,7 +460,7 @@ -- | Construct an L1/L2 SBP PackedObsContent from an RTCM Msg 1004. ---fromObservation1004 :: MonadStore e m => Word16 -> Observation1004 -> m [PackedObsContent]+fromObservation1004 :: MonadStore e m => Word16 -> Observation1004 -> m [PackedObsContentDepC] fromObservation1004 station obs = do obs1 <- fromL1SatelliteObservation station sat l1 l1e obs2 <- fromL2SatelliteObservation station sat l1 l1e l2 l2e@@ -483,7 +483,7 @@ -- -- This chunking takes places because the number of observations in a given 1004 -- may very well exceed the maximum SBP supported payload size of 255 bytes.-fromMsg1004 :: MonadStore e m => Msg1004 -> m [MsgObs]+fromMsg1004 :: MonadStore e m => Msg1004 -> m [MsgObsDepC] fromMsg1004 m = do let hdr = m ^. msg1004_header station = hdr ^. gpsObservationHeader_station@@ -519,11 +519,11 @@ (RTCM3Msg1002 m _rtcm3) -> do let sender = m ^. msg1002_header ^. gpsObservationHeader_station m' <- fromMsg1002 m- return $ flip fmap m' $ \x -> SBPMsgObs x $ toSBP x $ toSender sender+ return $ flip fmap m' $ \x -> SBPMsgObsDepC x $ toSBP x $ toSender sender (RTCM3Msg1004 m _rtcm3) -> do let sender = m ^. msg1004_header ^. gpsObservationHeader_station m' <- fromMsg1004 m- return $ flip fmap m' $ \x -> SBPMsgObs x $ toSBP x $ toSender sender+ return $ flip fmap m' $ \x -> SBPMsgObsDepC x $ toSBP x $ toSender sender (RTCM3Msg1005 m _rtcm3) -> do let sender = m ^. msg1005_reference ^. antennaReference_station m' <- fromMsg1005 m
test/Test/Data/RTCM3/SBP.hs view
@@ -44,27 +44,27 @@ , msg' ^. msgBasePosEcef_z ) -isL1 :: PackedObsContent -> Bool-isL1 obs = (obs ^. packedObsContent_sid ^. gnssSignal_code) == l1CSidCode+isL1 :: PackedObsContentDepC -> Bool+isL1 obs = (obs ^. packedObsContentDepC_sid ^. gnssSignal_code) == l1CSidCode -isL2 :: PackedObsContent -> Bool+isL2 :: PackedObsContentDepC -> Bool isL2 obs = code == l2CMSidCode || code == l2PSidCode where- code = obs ^. packedObsContent_sid ^. gnssSignal_code+ code = obs ^. packedObsContentDepC_sid ^. gnssSignal_code -sat :: PackedObsContent -> Word16-sat obs = obs ^. packedObsContent_sid ^. gnssSignal_sat+sat :: PackedObsContentDepC -> Word16+sat obs = obs ^. packedObsContentDepC_sid ^. gnssSignal_sat -cn0 :: PackedObsContent -> Double-cn0 obs = 0.25 * fromIntegral (obs ^. packedObsContent_cn0)+cn0 :: PackedObsContentDepC -> Double+cn0 obs = 0.25 * fromIntegral (obs ^. packedObsContentDepC_cn0) -pseudorange :: PackedObsContent -> Double-pseudorange obs = fromIntegral (obs ^. packedObsContent_P) / sbpCMinM+pseudorange :: PackedObsContentDepC -> Double+pseudorange obs = fromIntegral (obs ^. packedObsContentDepC_P) / sbpCMinM -carrierPhase :: PackedObsContent -> Double+carrierPhase :: PackedObsContentDepC -> Double carrierPhase obs = whole + fraction where- phase = obs ^. packedObsContent_L+ phase = obs ^. packedObsContentDepC_L whole = fromIntegral (phase ^. carrierPhase_i) fraction = fromIntegral (phase ^. carrierPhase_f) / q32Width @@ -73,13 +73,13 @@ assertEqual "Base station position error!" pos $ basePosition posEcef assertExpectedBase _ _ = assertFailure "Invalid message type!" -assertObsHeader :: SBPMsg -> ObservationHeader -> Assertion-assertObsHeader (SBPMsgObs obs _) header =- assertEqual "Observation header is not equal" header $ obs ^. msgObs_header+assertObsHeader :: SBPMsg -> ObservationHeaderDep -> Assertion+assertObsHeader (SBPMsgObsDepC obs _) header =+ assertEqual "Observation header is not equal" header $ obs ^. msgObsDepC_header assertObsHeader _ _ = assertFailure "Invalid message type!" assertObs :: HashMap Word16 (Double, Double, Double)- -> PackedObsContent+ -> PackedObsContentDepC -> Double -- ^ Pseudorange tolerance (meters) -> Double -- ^ Carrier phase tolerance (cycles) -> Word8 -- ^ Satellite band code@@ -88,7 +88,7 @@ let prn = 1 + sat obs def = (0, 0, 0) (p, c, snr) = lookupDefault def prn truth- code = obs ^. packedObsContent_sid ^. gnssSignal_code+ code = obs ^. packedObsContentDepC_sid ^. gnssSignal_code msg' = textToString $ "PRN=" ++ show prn ++ " CODE=" ++ show code -- Pseudorange representation error assertApproxEqual ("Incorrect pseudorange" ++ msg') ptol p $ pseudorange obs@@ -99,11 +99,11 @@ assertEqual ("Incorrect code" ++ msg') sig code assertMsgObs :: SBPMsg -> Assertion-assertMsgObs (SBPMsgObs obs' _) = do+assertMsgObs (SBPMsgObsDepC obs' _) = do let ptol = 0.020 -- 2cm representation errorn ctol_L1 = 0.005 -- carrier phase / L1 wavelength = 0.001m/0.190m cycles ctol_L2 = 0.004 -- carrier phase / L2 wavelength = 0.001m/0.250m cycles- forM_ (obs' ^. msgObs_obs) $ \packed ->+ forM_ (obs' ^. msgObsDepC_obs) $ \packed -> case () of _ | isL1 packed -> assertObs testObs_L1 packed ptol ctol_L1 l1CSidCode | isL2 packed -> assertObs testObs_L2 packed ptol ctol_L2 l2PSidCode@@ -111,7 +111,7 @@ assertMsgObs _ = assertFailure "Invalid message type!" assertMsgObsLength :: SBPMsg -> Int -> Assertion-assertMsgObsLength (SBPMsgObs obs' _) len = length (obs' ^. msgObs_obs) @?= len+assertMsgObsLength (SBPMsgObsDepC obs' _) len = length (obs' ^. msgObsDepC_obs) @?= len assertMsgObsLength _ _ = assertFailure "Invalid message type!" -- | L1 observations: PRN => Pseudorange, Carrier Phase, SNR@@ -155,41 +155,41 @@ assertExpectedBase (msgs !! 0) expectedBasePos assertExpectedBase (msgs !! 5) expectedBasePos -- Message 1- assertObsHeader (msgs !! 1) ObservationHeader {- _observationHeader_t = GpsTime 86354000 1906- , _observationHeader_n_obs = 32+ assertObsHeader (msgs !! 1) ObservationHeaderDep {+ _observationHeaderDep_t = GpsTime 86354000 1906+ , _observationHeaderDep_n_obs = 32 } assertMsgObsLength (msgs !! 1) 15 assertMsgObs (msgs !! 1) -- Message 2- assertObsHeader (msgs !! 2) ObservationHeader {- _observationHeader_t = GpsTime 86354000 1906- , _observationHeader_n_obs = 33+ assertObsHeader (msgs !! 2) ObservationHeaderDep {+ _observationHeaderDep_t = GpsTime 86354000 1906+ , _observationHeaderDep_n_obs = 33 } assertMsgObs (msgs !! 2) assertMsgObsLength (msgs !! 2) 1 -- Message 3- assertObsHeader (msgs !! 3) ObservationHeader {- _observationHeader_t = GpsTime 86355000 1906- , _observationHeader_n_obs = 32+ assertObsHeader (msgs !! 3) ObservationHeaderDep {+ _observationHeaderDep_t = GpsTime 86355000 1906+ , _observationHeaderDep_n_obs = 32 } assertMsgObsLength (msgs !! 3) 15 -- Message 4- assertObsHeader (msgs !! 4) ObservationHeader {- _observationHeader_t = GpsTime 86355000 1906- , _observationHeader_n_obs = 33+ assertObsHeader (msgs !! 4) ObservationHeaderDep {+ _observationHeaderDep_t = GpsTime 86355000 1906+ , _observationHeaderDep_n_obs = 33 } assertMsgObsLength (msgs !! 4) 1 -- Message 6- assertObsHeader (msgs !! 6) ObservationHeader {- _observationHeader_t = GpsTime 86356000 1906- , _observationHeader_n_obs = 32+ assertObsHeader (msgs !! 6) ObservationHeaderDep {+ _observationHeaderDep_t = GpsTime 86356000 1906+ , _observationHeaderDep_n_obs = 32 } assertMsgObsLength (msgs !! 6) 15 -- Message 7- assertObsHeader (msgs !! 7) ObservationHeader {- _observationHeader_t = GpsTime 86356000 1906- , _observationHeader_n_obs = 33+ assertObsHeader (msgs !! 7) ObservationHeaderDep {+ _observationHeaderDep_t = GpsTime 86356000 1906+ , _observationHeaderDep_n_obs = 33 } assertMsgObsLength (msgs !! 7) 1 ]