{-# LANGUAGE LambdaCase        #-}
{-# LANGUAGE NoImplicitPrelude #-}

-- |
-- Module:      Data.RTCM3.SBP
-- Copyright:   Copyright (C) 2016 Swift Navigation, Inc.
-- License:     LGPL-3
-- Maintainer:  Swift Navigation <dev@swiftnav.com>
-- Stability:   experimental
-- Portability: portable
--
-- RTCMv3 to SBP Conversions.

module Data.RTCM3.SBP
  ( converter
  , newStore
  ) where

import           BasicPrelude
import           Data.Conduit
import           Data.IORef
import           Data.RTCM3
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.Types
import           SwiftNav.SBP

-- | Convert an RTCM message into possibly multiple SBP messages.
--
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
  _rtcm3Msg               -> mempty

-- | Setup new storage for converter.
--
newStore :: MonadIO m => m Store
newStore = liftIO $ Store <$> newIORef mempty <*> newIORef mempty