module Data.RTCM3.SBP
( converter
, newStore
, runConvertT
, runConverter
) where
import BasicPrelude
import Control.Monad.Reader
import Data.Conduit
import Data.IORef
import Data.RTCM3
import qualified Data.RTCM3.SBP.Biases as Biases
import qualified Data.RTCM3.SBP.Ephemerides as Ephemerides
import qualified Data.RTCM3.SBP.Observations as Observations
import qualified Data.RTCM3.SBP.Positions as Positions
import Data.RTCM3.SBP.Time
import Data.RTCM3.SBP.Types
import SwiftNav.SBP
converter :: MonadStore e m => RTCM3Msg -> Conduit i m [SBPMsg]
converter = \case
(RTCM3Msg1002 m _rtcm3) -> Observations.converter m
(RTCM3Msg1004 m _rtcm3) -> Observations.converter m
(RTCM3Msg1010 m _rtcm3) -> Observations.converter m
(RTCM3Msg1012 m _rtcm3) -> Observations.converter m
(RTCM3Msg1005 m _rtcm3) -> Positions.converter m
(RTCM3Msg1006 m _rtcm3) -> Positions.converter m
(RTCM3Msg1019 m _rtcm3) -> Ephemerides.converter m
(RTCM3Msg1230 m _rtcm3) -> Biases.converter m
_rtcm3Msg -> mempty
newStore :: MonadIO m => m Store
newStore = liftIO $ Store <$> pure currentGpsTime <*> newIORef mempty <*> newIORef mempty
runConvertT :: HasStore e => e -> ConvertT e m a -> m a
runConvertT e (ConvertT m) = runReaderT m e
runConverter :: MonadIO m => ConvertT Store m a -> m a
runConverter action = do
s <- newStore
runConvertT s action