gnss-converters (empty) → 0.1.0
raw patch · 8 files changed
+300/−0 lines, 8 filesdep +basedep +basic-preludedep +binary-conduitsetup-changed
Dependencies added: base, basic-prelude, binary-conduit, conduit, conduit-extra, criterion, gnss-converters, lens, resourcet, rtcm, sbp, tasty, tasty-hunit
Files
- Setup.hs +2/−0
- bench/Bench.hs +7/−0
- gnss-converters.cabal +85/−0
- main/RTCM32SBP.hs +26/−0
- main/SBP2RTCM3.hs +14/−0
- src/Data/RTCM3/SBP.hs +136/−0
- src/SwiftNav/SBP/RTCM3.hs +20/−0
- test/Test.hs +10/−0
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ bench/Bench.hs view
@@ -0,0 +1,7 @@+import BasicPrelude+import Criterion.Main++main :: IO ()+main = defaultMain+ [+ ]
+ gnss-converters.cabal view
@@ -0,0 +1,85 @@+name: gnss-converters+version: 0.1.0+synopsis: GNSS Converters.+description: Haskell bindings for GNSS converters.+homepage: http://github.com/swift-nav/gnss-converters+license: BSD3+author: Swift Navigation Inc.+maintainer: Mark Fine <dev@swiftnav.com>+copyright: Copyright (C) 2015 Swift Navigation, Inc.+category: Network+build-type: Simple+cabal-version: >= 1.10++source-repository head+ type: git+ location: https://github.com/swift-nav/gnss-converters++library+ hs-source-dirs: src+ exposed-modules: Data.RTCM3.SBP+ , SwiftNav.SBP.RTCM3+ ghc-options: -Wall+ build-depends: base >= 4.7 && < 5+ , basic-prelude+ , conduit-extra+ , lens+ , rtcm+ , sbp+ default-language: Haskell2010+ default-extensions: NoImplicitPrelude+ OverloadedStrings++executable sbp2rtcm3+ hs-source-dirs: main+ main-is: SBP2RTCM3.hs+ ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall+ build-depends: base+ , basic-prelude+ , gnss-converters+ default-language: Haskell2010+ default-extensions: NoImplicitPrelude+ OverloadedStrings++executable rtcm32sbp+ hs-source-dirs: main+ main-is: RTCM32SBP.hs+ ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall+ build-depends: base+ , basic-prelude+ , binary-conduit+ , conduit+ , conduit-extra+ , gnss-converters+ , resourcet+ default-language: Haskell2010+ default-extensions: NoImplicitPrelude+ OverloadedStrings++test-suite test+ type: exitcode-stdio-1.0+ hs-source-dirs: test+ main-is: Test.hs+ build-depends: base+ , basic-prelude+ , tasty+ , tasty-hunit+ , gnss-converters+ ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall+ default-language: Haskell2010+ default-extensions: NoImplicitPrelude+ OverloadedStrings++benchmark bench+ type: exitcode-stdio-1.0+ hs-source-dirs: bench+ main-is: Bench.hs+ build-depends: base+ , basic-prelude+ , criterion+ , gnss-converters+ ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall+ default-language: Haskell2010+ default-extensions: NoImplicitPrelude+ OverloadedStrings+
+ main/RTCM32SBP.hs view
@@ -0,0 +1,26 @@+-- |+-- Module: RTCM32SBP+-- Copyright: (c) 2015 Mark Fine+-- License: BSD3+-- Maintainer: Mark Fine <mark.fine@gmail.com>+-- Stability: experimental+-- Portability: portable+--+-- RTCM3 to SBP tool.++import BasicPrelude+import Control.Monad.Trans.Resource+import Data.Conduit+import Data.Conduit.Binary+import qualified Data.Conduit.List as CL+import Data.Conduit.Serialization.Binary+import Data.RTCM3.SBP+import System.IO++main :: IO ()+main = runResourceT $+ sourceHandle stdin =$=+ conduitDecode =$=+ CL.mapMaybe convert =$=+ conduitEncode $$+ sinkHandle stdout
+ main/SBP2RTCM3.hs view
@@ -0,0 +1,14 @@+-- |+-- Module: SBP2RTCM3+-- Copyright: (c) 2015 Mark Fine+-- License: BSD3+-- Maintainer: Mark Fine <mark.fine@gmail.com>+-- Stability: experimental+-- Portability: portable+--+-- SBP to RTCM3 tool.++import BasicPrelude++main :: IO ()+main = undefined
+ src/Data/RTCM3/SBP.hs view
@@ -0,0 +1,136 @@+{-# LANGUAGE LambdaCase #-}++-- |+-- Module: Data.RTCM3.SBP+-- Copyright: Copyright (C) 2015 Swift Navigation, Inc.+-- License: LGPL-3+-- Maintainer: Mark Fine <dev@swiftnav.com>+-- Stability: experimental+-- Portability: portable+--+-- RTCMv3 to SBP Conversions.++module Data.RTCM3.SBP+ ( convert+ ) where++import BasicPrelude+import Control.Lens+import Data.Bits+import Data.Word+import Data.RTCM3+import SwiftNav.SBP++fromEcefVal :: Int64 -> Double+fromEcefVal x = fromIntegral x / 10000++toGPSTime :: GpsObservationHeader -> ObsGPSTime+toGPSTime hdr = ObsGPSTime+ { _obsGPSTime_tow = hdr ^. gpsObservationHeader_tow+ , _obsGPSTime_wn = 1874+ }++fromGpsObservationHeader :: GpsObservationHeader -> ObservationHeader+fromGpsObservationHeader hdr = ObservationHeader+ { _observationHeader_t = toGPSTime hdr+ , _observationHeader_n_obs = fromIntegral $ hdr ^. gpsObservationHeader_n+ }++toP :: GpsL1Observation -> GpsL1ExtObservation -> Word32+toP l1 l1e = round $ p * 100 where+ p = 0.02 * fromIntegral (l1 ^. gpsL1Observation_pseudorange) ++ 299792.458 * fromIntegral (l1e ^. gpsL1ExtObservation_ambiguity)++toL :: GpsL1Observation -> GpsL1ExtObservation -> CarrierPhase+toL l1 l1e = CarrierPhase+ { _carrierPhase_i = fromIntegral $ iint `shiftR` 8+ , _carrierPhase_f = fromIntegral $ iint .&. 0xFF+ } where+ p = 0.02 * fromIntegral (l1 ^. gpsL1Observation_pseudorange) ++ 299792.458 * fromIntegral (l1e ^. gpsL1ExtObservation_ambiguity)+ lm :: Double+ lm = p + 0.0005 * fromIntegral (l1 ^. gpsL1Observation_carrierMinusCode)+ l = (lm - 22e6) / 0.190293673+ iint :: Int64+ iint = - round (l * 255.0)++toCn0 :: GpsL1ExtObservation -> Word8+toCn0 = (^. gpsL1ExtObservation_cnr)++toLock :: GpsL1Observation -> Word16+toLock _l1 = 0++toSid :: Word8 -> SBPGnssSignal+toSid sat = SBPGnssSignal+ { _sBPGnssSignal_sat = fromIntegral $ sat - 1+ , _sBPGnssSignal_band = 0+ , _sBPGnssSignal_constellation = 0+ }++fromObservation1002 :: Observation1002 -> PackedObsContent+fromObservation1002 obs = PackedObsContent+ { _packedObsContent_P = toP l1 l1e+ , _packedObsContent_L = toL l1 l1e+ , _packedObsContent_cn0 = toCn0 l1e+ , _packedObsContent_lock = toLock l1+ , _packedObsContent_sid = toSid sat+ } where+ sat = obs ^. observation1002_sat+ l1 = obs ^. observation1002_l1+ l1e = obs ^. observation1002_l1e++fromObservation1004 :: Observation1004 -> PackedObsContent+fromObservation1004 obs = PackedObsContent+ { _packedObsContent_P = toP l1 l1e+ , _packedObsContent_L = toL l1 l1e+ , _packedObsContent_cn0 = toCn0 l1e+ , _packedObsContent_lock = toLock l1+ , _packedObsContent_sid = toSid sat+ } where+ sat = obs ^. observation1004_sat+ 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+ }++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+ }++fromMsg1002 :: Msg1002 -> MsgObs+fromMsg1002 msg = MsgObs+ { _msgObs_header = fromGpsObservationHeader $ msg ^. msg1002_header+ , _msgObs_obs = map fromObservation1002 $ msg ^. msg1002_observations+ }++fromMsg1004 :: Msg1004 -> MsgObs+fromMsg1004 msg = MsgObs+ { _msgObs_header = fromGpsObservationHeader $ msg ^. msg1004_header+ , _msgObs_obs = map fromObservation1004 $ msg ^. msg1004_observations+ }++convert :: RTCM3Msg -> 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++
@@ -0,0 +1,20 @@+-- |+-- Module: SwiftNav.SBP.RTCM3+-- Copyright: Copyright (C) 2015 Swift Navigation, Inc.+-- License: LGPL-3+-- Maintainer: Mark Fine <dev@swiftnav.com>+-- Stability: experimental+-- Portability: portable+--+-- SBP to RTCMv3 Conversions.++module SwiftNav.SBP.RTCM3+ ( convert+ ) where++import BasicPrelude+import Data.RTCM3+import SwiftNav.SBP++convert :: SBPMsg -> Maybe RTCM3Msg+convert = undefined
+ test/Test.hs view
@@ -0,0 +1,10 @@+import BasicPrelude+import Test.Tasty++tests :: TestTree+tests = testGroup "Tests"+ [+ ]++main :: IO ()+main = defaultMain tests