{-# OPTIONS_GHC -fno-warn-unused-imports #-} {-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE RecordWildCards #-} -- | -- Module: SwiftNav.SBP.Gnss -- Copyright: Copyright (C) 2015-2021 Swift Navigation, Inc. -- License: MIT -- Contact: https://support.swiftnav.com -- Stability: experimental -- Portability: portable -- -- \< Various structs shared between modules \> module SwiftNav.SBP.Gnss ( module SwiftNav.SBP.Gnss ) where import BasicPrelude import Control.Lens import Control.Monad.Loops import Data.Binary import Data.Binary.Get import Data.Binary.IEEE754 import Data.Binary.Put import Data.ByteString.Lazy hiding (ByteString) import Data.Int import Data.Word import SwiftNav.SBP.TH import SwiftNav.SBP.Types {-# ANN module ("HLint: ignore Use camelCase"::String) #-} {-# ANN module ("HLint: ignore Redundant do"::String) #-} {-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-} -- | GnssSignal. -- -- Signal identifier containing constellation, band, and satellite identifier. data GnssSignal = GnssSignal { _gnssSignal_sat :: !Word8 -- ^ Constellation-specific satellite id. For GLO can either be (100+FCN) -- where FCN is in [-7,+6] or the Slot ID in [1,28]. , _gnssSignal_code :: !Word8 -- ^ Signal constellation, band and code } deriving ( Show, Read, Eq ) instance Binary GnssSignal where get = do _gnssSignal_sat <- getWord8 _gnssSignal_code <- getWord8 pure GnssSignal {..} put GnssSignal {..} = do putWord8 _gnssSignal_sat putWord8 _gnssSignal_code $(makeJSON "_gnssSignal_" ''GnssSignal) $(makeLenses ''GnssSignal) -- | SvId. -- -- A (Constellation ID, satellite ID) tuple that uniquely identifies a space -- vehicle. data SvId = SvId { _svId_satId :: !Word8 -- ^ Constellation-specific satellite id. For GLO can either be (100+FCN) -- where FCN is in [-7,+6] or the Slot ID in [1,28]. , _svId_constellation :: !Word8 -- ^ Constellation ID to which the SV belongs } deriving ( Show, Read, Eq ) instance Binary SvId where get = do _svId_satId <- getWord8 _svId_constellation <- getWord8 pure SvId {..} put SvId {..} = do putWord8 _svId_satId putWord8 _svId_constellation $(makeJSON "_svId_" ''SvId) $(makeLenses ''SvId) -- | GnssSignalDep. -- -- Deprecated. data GnssSignalDep = GnssSignalDep { _gnssSignalDep_sat :: !Word16 -- ^ Constellation-specific satellite identifier. -- -- Note: unlike GnssSignal, GPS satellites are encoded as (PRN - 1). Other -- constellations do not have this offset. , _gnssSignalDep_code :: !Word8 -- ^ Signal constellation, band and code , _gnssSignalDep_reserved :: !Word8 -- ^ Reserved } deriving ( Show, Read, Eq ) instance Binary GnssSignalDep where get = do _gnssSignalDep_sat <- getWord16le _gnssSignalDep_code <- getWord8 _gnssSignalDep_reserved <- getWord8 pure GnssSignalDep {..} put GnssSignalDep {..} = do putWord16le _gnssSignalDep_sat putWord8 _gnssSignalDep_code putWord8 _gnssSignalDep_reserved $(makeJSON "_gnssSignalDep_" ''GnssSignalDep) $(makeLenses ''GnssSignalDep) -- | GPSTimeDep. -- -- A wire-appropriate GPS time, defined as the number of milliseconds since -- beginning of the week on the Saturday/Sunday transition. data GpsTimeDep = GpsTimeDep { _gpsTimeDep_tow :: !Word32 -- ^ Milliseconds since start of GPS week , _gpsTimeDep_wn :: !Word16 -- ^ GPS week number } deriving ( Show, Read, Eq ) instance Binary GpsTimeDep where get = do _gpsTimeDep_tow <- getWord32le _gpsTimeDep_wn <- getWord16le pure GpsTimeDep {..} put GpsTimeDep {..} = do putWord32le _gpsTimeDep_tow putWord16le _gpsTimeDep_wn $(makeJSON "_gpsTimeDep_" ''GpsTimeDep) $(makeLenses ''GpsTimeDep) -- | GPSTimeSec. -- -- A GPS time, defined as the number of seconds since beginning of the week on -- the Saturday/Sunday transition. data GpsTimeSec = GpsTimeSec { _gpsTimeSec_tow :: !Word32 -- ^ Seconds since start of GPS week , _gpsTimeSec_wn :: !Word16 -- ^ GPS week number } deriving ( Show, Read, Eq ) instance Binary GpsTimeSec where get = do _gpsTimeSec_tow <- getWord32le _gpsTimeSec_wn <- getWord16le pure GpsTimeSec {..} put GpsTimeSec {..} = do putWord32le _gpsTimeSec_tow putWord16le _gpsTimeSec_wn $(makeJSON "_gpsTimeSec_" ''GpsTimeSec) $(makeLenses ''GpsTimeSec) -- | GPSTime. -- -- A wire-appropriate receiver clock time, defined as the time since the -- beginning of the week on the Saturday/Sunday transition. In most cases, -- observations are epoch aligned so ns field will be 0. data GpsTime = GpsTime { _gpsTime_tow :: !Word32 -- ^ Milliseconds since start of GPS week , _gpsTime_ns_residual :: !Int32 -- ^ Nanosecond residual of millisecond-rounded TOW (ranges from -500000 to -- 500000) , _gpsTime_wn :: !Word16 -- ^ GPS week number } deriving ( Show, Read, Eq ) instance Binary GpsTime where get = do _gpsTime_tow <- getWord32le _gpsTime_ns_residual <- (fromIntegral <$> getWord32le) _gpsTime_wn <- getWord16le pure GpsTime {..} put GpsTime {..} = do putWord32le _gpsTime_tow (putWord32le . fromIntegral) _gpsTime_ns_residual putWord16le _gpsTime_wn $(makeJSON "_gpsTime_" ''GpsTime) $(makeLenses ''GpsTime) -- | CarrierPhase. -- -- Carrier phase measurement in cycles represented as a 40-bit fixed point -- number with Q32.8 layout, i.e. 32-bits of whole cycles and 8-bits of -- fractional cycles. This phase has the same sign as the pseudorange. data CarrierPhase = CarrierPhase { _carrierPhase_i :: !Int32 -- ^ Carrier phase whole cycles , _carrierPhase_f :: !Word8 -- ^ Carrier phase fractional part } deriving ( Show, Read, Eq ) instance Binary CarrierPhase where get = do _carrierPhase_i <- (fromIntegral <$> getWord32le) _carrierPhase_f <- getWord8 pure CarrierPhase {..} put CarrierPhase {..} = do (putWord32le . fromIntegral) _carrierPhase_i putWord8 _carrierPhase_f $(makeJSON "_carrierPhase_" ''CarrierPhase) $(makeLenses ''CarrierPhase)