gnss-converters 0.1.2 → 0.1.3
raw patch · 2 files changed
+59/−49 lines, 2 filesdep +time
Dependencies added: time
Files
- gnss-converters.cabal +2/−1
- src/Data/RTCM3/SBP.hs +57/−48
gnss-converters.cabal view
@@ -1,5 +1,5 @@ name: gnss-converters-version: 0.1.2+version: 0.1.3 synopsis: GNSS Converters. description: Haskell bindings for GNSS converters. homepage: http://github.com/swift-nav/gnss-converters@@ -26,6 +26,7 @@ , lens , rtcm , sbp+ , time default-language: Haskell2010 default-extensions: NoImplicitPrelude OverloadedStrings
src/Data/RTCM3/SBP.hs view
@@ -17,6 +17,7 @@ import BasicPrelude import Control.Lens import Data.Bits+import Data.Time import Data.Word import Data.RTCM3 import SwiftNav.SBP@@ -24,17 +25,21 @@ fromEcefVal :: Int64 -> Double fromEcefVal x = fromIntegral x / 10000 -toGPSTime :: GpsObservationHeader -> ObsGPSTime-toGPSTime hdr = ObsGPSTime- { _obsGPSTime_tow = hdr ^. gpsObservationHeader_tow- , _obsGPSTime_wn = 1875- }+toGPSTime :: MonadIO m => GpsObservationHeader -> m ObsGPSTime+toGPSTime hdr = do+ today <- utctDay <$> liftIO getCurrentTime+ return ObsGPSTime+ { _obsGPSTime_tow = hdr ^. gpsObservationHeader_tow+ , _obsGPSTime_wn = fromIntegral $ div (diffDays today (fromGregorian 1980 1 6)) 7+ } -fromGpsObservationHeader :: GpsObservationHeader -> ObservationHeader-fromGpsObservationHeader hdr = ObservationHeader- { _observationHeader_t = toGPSTime hdr- , _observationHeader_n_obs = 0x10- }+fromGpsObservationHeader :: MonadIO m => GpsObservationHeader -> m ObservationHeader+fromGpsObservationHeader hdr = do+ t <- toGPSTime hdr+ return ObservationHeader+ { _observationHeader_t = t+ , _observationHeader_n_obs = fromIntegral $ hdr ^. gpsObservationHeader_n+ } toP :: GpsL1Observation -> GpsL1ExtObservation -> Word32 toP l1 l1e = round $ p * 100 where@@ -91,46 +96,50 @@ l1 = obs ^. observation1004_l1 l1e = obs ^. observation1004_l1e -fromMsg1005 :: Msg1005 -> MsgBasePosEcef-fromMsg1005 msg = MsgBasePosEcef- { _msgBasePosEcef_x = fromEcefVal $ msg ^. msg1005_reference ^. antennaReference_ecef_x- , _msgBasePosEcef_y = fromEcefVal $ msg ^. msg1005_reference ^. antennaReference_ecef_y- , _msgBasePosEcef_z = fromEcefVal $ msg ^. msg1005_reference ^. antennaReference_ecef_z- }+fromMsg1002 :: MonadIO m => Msg1002 -> m MsgObs+fromMsg1002 msg = do+ header <- fromGpsObservationHeader $ msg ^. msg1002_header+ return MsgObs+ { _msgObs_header = header+ , _msgObs_obs = map fromObservation1002 $ msg ^. msg1002_observations+ } -fromMsg1006 :: Msg1006 -> MsgBasePosEcef-fromMsg1006 msg = MsgBasePosEcef- { _msgBasePosEcef_x = fromEcefVal $ msg ^. msg1006_reference ^. antennaReference_ecef_x- , _msgBasePosEcef_y = fromEcefVal $ msg ^. msg1006_reference ^. antennaReference_ecef_y- , _msgBasePosEcef_z = fromEcefVal $ msg ^. msg1006_reference ^. antennaReference_ecef_z- }+fromMsg1004 :: MonadIO m => Msg1004 -> m MsgObs+fromMsg1004 msg = do+ header <- fromGpsObservationHeader $ msg ^. msg1004_header+ return MsgObs+ { _msgObs_header = header+ , _msgObs_obs = map fromObservation1004 $ msg ^. msg1004_observations+ } -fromMsg1002 :: Msg1002 -> MsgObs-fromMsg1002 msg = MsgObs- { _msgObs_header = fromGpsObservationHeader $ msg ^. msg1002_header- , _msgObs_obs = map fromObservation1002 $ msg ^. msg1002_observations- }+fromMsg1005 :: MonadIO m => Msg1005 -> m MsgBasePosEcef+fromMsg1005 msg =+ return MsgBasePosEcef+ { _msgBasePosEcef_x = fromEcefVal $ msg ^. msg1005_reference ^. antennaReference_ecef_x+ , _msgBasePosEcef_y = fromEcefVal $ msg ^. msg1005_reference ^. antennaReference_ecef_y+ , _msgBasePosEcef_z = fromEcefVal $ msg ^. msg1005_reference ^. antennaReference_ecef_z+ } -fromMsg1004 :: Msg1004 -> MsgObs-fromMsg1004 msg = MsgObs- { _msgObs_header = fromGpsObservationHeader $ msg ^. msg1004_header- , _msgObs_obs = map fromObservation1004 $ msg ^. msg1004_observations- }+fromMsg1006 :: MonadIO m => Msg1006 -> m MsgBasePosEcef+fromMsg1006 msg =+ return MsgBasePosEcef+ { _msgBasePosEcef_x = fromEcefVal $ msg ^. msg1006_reference ^. antennaReference_ecef_x+ , _msgBasePosEcef_y = fromEcefVal $ msg ^. msg1006_reference ^. antennaReference_ecef_y+ , _msgBasePosEcef_z = fromEcefVal $ msg ^. msg1006_reference ^. antennaReference_ecef_z+ } -convert :: RTCM3Msg -> Maybe SBPMsg+convert :: MonadIO m => RTCM3Msg -> m (Maybe SBPMsg) convert = \case- (RTCM3Msg1002 msg _rtcm3) -> Just $- SBPMsgObs msg' $ toSBP msg' defaultSender where- msg' = fromMsg1002 msg- (RTCM3Msg1004 msg _rtcm3) -> Just $- SBPMsgObs msg' $ toSBP msg' defaultSender where- msg' = fromMsg1004 msg- (RTCM3Msg1005 msg _rtcm3) -> Just $- SBPMsgBasePosEcef msg' $ toSBP msg' defaultSender where- msg' = fromMsg1005 msg- (RTCM3Msg1006 msg _rtcm3) -> Just $- SBPMsgBasePosEcef msg' $ toSBP msg' defaultSender where- msg' = fromMsg1006 msg- _rtcm3Msg -> Nothing--+ (RTCM3Msg1002 msg _rtcm3) -> do+ msg' <- fromMsg1002 msg+ return $ Just $ SBPMsgObs msg' $ toSBP msg' defaultSender+ (RTCM3Msg1004 msg _rtcm3) -> do+ msg' <- fromMsg1004 msg+ return $ Just $ SBPMsgObs msg' $ toSBP msg' defaultSender+ (RTCM3Msg1005 msg _rtcm3) -> do+ msg' <- fromMsg1005 msg+ return $ Just $ SBPMsgBasePosEcef msg' $ toSBP msg' defaultSender+ (RTCM3Msg1006 msg _rtcm3) -> do+ msg' <- fromMsg1006 msg+ return $ Just $ SBPMsgBasePosEcef msg' $ toSBP msg' defaultSender+ _rtcm3Msg -> return $ Nothing