sbp-2.3.13: src/SwiftNav/SBP/Acquisition.hs
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE RecordWildCards #-}
-- |
-- Module: SwiftNav.SBP.Acquisition
-- Copyright: Copyright (C) 2015-2018 Swift Navigation, Inc.
-- License: LGPL-3
-- Maintainer: Swift Navigation <dev@swiftnav.com>
-- Stability: experimental
-- Portability: portable
--
-- Satellite acquisition messages from the device.
module SwiftNav.SBP.Acquisition
( module SwiftNav.SBP.Acquisition
) 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
import SwiftNav.SBP.Gnss
{-# ANN module ("HLint: ignore Use camelCase"::String) #-}
{-# ANN module ("HLint: ignore Redundant do"::String) #-}
{-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}
msgAcqResult :: Word16
msgAcqResult = 0x002F
-- | SBP class for message MSG_ACQ_RESULT (0x002F).
--
-- This message describes the results from an attempted GPS signal acquisition
-- search for a satellite PRN over a code phase/carrier frequency range. It
-- contains the parameters of the point in the acquisition search space with
-- the best carrier-to-noise (CN/0) ratio.
data MsgAcqResult = MsgAcqResult
{ _msgAcqResult_cn0 :: !Float
-- ^ CN/0 of best point
, _msgAcqResult_cp :: !Float
-- ^ Code phase of best point
, _msgAcqResult_cf :: !Float
-- ^ Carrier frequency of best point
, _msgAcqResult_sid :: !GnssSignal
-- ^ GNSS signal for which acquisition was attempted
} deriving ( Show, Read, Eq )
instance Binary MsgAcqResult where
get = do
_msgAcqResult_cn0 <- getFloat32le
_msgAcqResult_cp <- getFloat32le
_msgAcqResult_cf <- getFloat32le
_msgAcqResult_sid <- get
pure MsgAcqResult {..}
put MsgAcqResult {..} = do
putFloat32le _msgAcqResult_cn0
putFloat32le _msgAcqResult_cp
putFloat32le _msgAcqResult_cf
put _msgAcqResult_sid
$(makeSBP 'msgAcqResult ''MsgAcqResult)
$(makeJSON "_msgAcqResult_" ''MsgAcqResult)
$(makeLenses ''MsgAcqResult)
msgAcqResultDepC :: Word16
msgAcqResultDepC = 0x001F
-- | SBP class for message MSG_ACQ_RESULT_DEP_C (0x001F).
--
-- Deprecated.
data MsgAcqResultDepC = MsgAcqResultDepC
{ _msgAcqResultDepC_cn0 :: !Float
-- ^ CN/0 of best point
, _msgAcqResultDepC_cp :: !Float
-- ^ Code phase of best point
, _msgAcqResultDepC_cf :: !Float
-- ^ Carrier frequency of best point
, _msgAcqResultDepC_sid :: !GnssSignalDep
-- ^ GNSS signal for which acquisition was attempted
} deriving ( Show, Read, Eq )
instance Binary MsgAcqResultDepC where
get = do
_msgAcqResultDepC_cn0 <- getFloat32le
_msgAcqResultDepC_cp <- getFloat32le
_msgAcqResultDepC_cf <- getFloat32le
_msgAcqResultDepC_sid <- get
pure MsgAcqResultDepC {..}
put MsgAcqResultDepC {..} = do
putFloat32le _msgAcqResultDepC_cn0
putFloat32le _msgAcqResultDepC_cp
putFloat32le _msgAcqResultDepC_cf
put _msgAcqResultDepC_sid
$(makeSBP 'msgAcqResultDepC ''MsgAcqResultDepC)
$(makeJSON "_msgAcqResultDepC_" ''MsgAcqResultDepC)
$(makeLenses ''MsgAcqResultDepC)
msgAcqResultDepB :: Word16
msgAcqResultDepB = 0x0014
-- | SBP class for message MSG_ACQ_RESULT_DEP_B (0x0014).
--
-- Deprecated.
data MsgAcqResultDepB = MsgAcqResultDepB
{ _msgAcqResultDepB_snr :: !Float
-- ^ SNR of best point. Currently in arbitrary SNR points, but will be in
-- units of dB Hz in a later revision of this message.
, _msgAcqResultDepB_cp :: !Float
-- ^ Code phase of best point
, _msgAcqResultDepB_cf :: !Float
-- ^ Carrier frequency of best point
, _msgAcqResultDepB_sid :: !GnssSignalDep
-- ^ GNSS signal for which acquisition was attempted
} deriving ( Show, Read, Eq )
instance Binary MsgAcqResultDepB where
get = do
_msgAcqResultDepB_snr <- getFloat32le
_msgAcqResultDepB_cp <- getFloat32le
_msgAcqResultDepB_cf <- getFloat32le
_msgAcqResultDepB_sid <- get
pure MsgAcqResultDepB {..}
put MsgAcqResultDepB {..} = do
putFloat32le _msgAcqResultDepB_snr
putFloat32le _msgAcqResultDepB_cp
putFloat32le _msgAcqResultDepB_cf
put _msgAcqResultDepB_sid
$(makeSBP 'msgAcqResultDepB ''MsgAcqResultDepB)
$(makeJSON "_msgAcqResultDepB_" ''MsgAcqResultDepB)
$(makeLenses ''MsgAcqResultDepB)
msgAcqResultDepA :: Word16
msgAcqResultDepA = 0x0015
-- | SBP class for message MSG_ACQ_RESULT_DEP_A (0x0015).
--
-- Deprecated.
data MsgAcqResultDepA = MsgAcqResultDepA
{ _msgAcqResultDepA_snr :: !Float
-- ^ SNR of best point. Currently dimensonless, but will have units of dB Hz
-- in the revision of this message.
, _msgAcqResultDepA_cp :: !Float
-- ^ Code phase of best point
, _msgAcqResultDepA_cf :: !Float
-- ^ Carrier frequency of best point
, _msgAcqResultDepA_prn :: !Word8
-- ^ PRN-1 identifier of the satellite signal for which acquisition was
-- attempted
} deriving ( Show, Read, Eq )
instance Binary MsgAcqResultDepA where
get = do
_msgAcqResultDepA_snr <- getFloat32le
_msgAcqResultDepA_cp <- getFloat32le
_msgAcqResultDepA_cf <- getFloat32le
_msgAcqResultDepA_prn <- getWord8
pure MsgAcqResultDepA {..}
put MsgAcqResultDepA {..} = do
putFloat32le _msgAcqResultDepA_snr
putFloat32le _msgAcqResultDepA_cp
putFloat32le _msgAcqResultDepA_cf
putWord8 _msgAcqResultDepA_prn
$(makeSBP 'msgAcqResultDepA ''MsgAcqResultDepA)
$(makeJSON "_msgAcqResultDepA_" ''MsgAcqResultDepA)
$(makeLenses ''MsgAcqResultDepA)
-- | AcqSvProfile.
--
-- Profile for a specific SV for debugging purposes The message describes SV
-- profile during acquisition time. The message is used to debug and measure
-- the performance.
data AcqSvProfile = AcqSvProfile
{ _acqSvProfile_job_type :: !Word8
-- ^ SV search job type (deep, fallback, etc)
, _acqSvProfile_status :: !Word8
-- ^ Acquisition status 1 is Success, 0 is Failure
, _acqSvProfile_cn0 :: !Word16
-- ^ CN0 value. Only valid if status is '1'
, _acqSvProfile_int_time :: !Word8
-- ^ Acquisition integration time
, _acqSvProfile_sid :: !GnssSignal
-- ^ GNSS signal for which acquisition was attempted
, _acqSvProfile_bin_width :: !Word16
-- ^ Acq frequency bin width
, _acqSvProfile_timestamp :: !Word32
-- ^ Timestamp of the job complete event
, _acqSvProfile_time_spent :: !Word32
-- ^ Time spent to search for sid.code
, _acqSvProfile_cf_min :: !Int32
-- ^ Doppler range lowest frequency
, _acqSvProfile_cf_max :: !Int32
-- ^ Doppler range highest frequency
, _acqSvProfile_cf :: !Int32
-- ^ Doppler value of detected peak. Only valid if status is '1'
, _acqSvProfile_cp :: !Word32
-- ^ Codephase of detected peak. Only valid if status is '1'
} deriving ( Show, Read, Eq )
instance Binary AcqSvProfile where
get = do
_acqSvProfile_job_type <- getWord8
_acqSvProfile_status <- getWord8
_acqSvProfile_cn0 <- getWord16le
_acqSvProfile_int_time <- getWord8
_acqSvProfile_sid <- get
_acqSvProfile_bin_width <- getWord16le
_acqSvProfile_timestamp <- getWord32le
_acqSvProfile_time_spent <- getWord32le
_acqSvProfile_cf_min <- fromIntegral <$> getWord32le
_acqSvProfile_cf_max <- fromIntegral <$> getWord32le
_acqSvProfile_cf <- fromIntegral <$> getWord32le
_acqSvProfile_cp <- getWord32le
pure AcqSvProfile {..}
put AcqSvProfile {..} = do
putWord8 _acqSvProfile_job_type
putWord8 _acqSvProfile_status
putWord16le _acqSvProfile_cn0
putWord8 _acqSvProfile_int_time
put _acqSvProfile_sid
putWord16le _acqSvProfile_bin_width
putWord32le _acqSvProfile_timestamp
putWord32le _acqSvProfile_time_spent
putWord32le $ fromIntegral _acqSvProfile_cf_min
putWord32le $ fromIntegral _acqSvProfile_cf_max
putWord32le $ fromIntegral _acqSvProfile_cf
putWord32le _acqSvProfile_cp
$(makeJSON "_acqSvProfile_" ''AcqSvProfile)
$(makeLenses ''AcqSvProfile)
-- | AcqSvProfileDep.
--
-- Deprecated.
data AcqSvProfileDep = AcqSvProfileDep
{ _acqSvProfileDep_job_type :: !Word8
-- ^ SV search job type (deep, fallback, etc)
, _acqSvProfileDep_status :: !Word8
-- ^ Acquisition status 1 is Success, 0 is Failure
, _acqSvProfileDep_cn0 :: !Word16
-- ^ CN0 value. Only valid if status is '1'
, _acqSvProfileDep_int_time :: !Word8
-- ^ Acquisition integration time
, _acqSvProfileDep_sid :: !GnssSignalDep
-- ^ GNSS signal for which acquisition was attempted
, _acqSvProfileDep_bin_width :: !Word16
-- ^ Acq frequency bin width
, _acqSvProfileDep_timestamp :: !Word32
-- ^ Timestamp of the job complete event
, _acqSvProfileDep_time_spent :: !Word32
-- ^ Time spent to search for sid.code
, _acqSvProfileDep_cf_min :: !Int32
-- ^ Doppler range lowest frequency
, _acqSvProfileDep_cf_max :: !Int32
-- ^ Doppler range highest frequency
, _acqSvProfileDep_cf :: !Int32
-- ^ Doppler value of detected peak. Only valid if status is '1'
, _acqSvProfileDep_cp :: !Word32
-- ^ Codephase of detected peak. Only valid if status is '1'
} deriving ( Show, Read, Eq )
instance Binary AcqSvProfileDep where
get = do
_acqSvProfileDep_job_type <- getWord8
_acqSvProfileDep_status <- getWord8
_acqSvProfileDep_cn0 <- getWord16le
_acqSvProfileDep_int_time <- getWord8
_acqSvProfileDep_sid <- get
_acqSvProfileDep_bin_width <- getWord16le
_acqSvProfileDep_timestamp <- getWord32le
_acqSvProfileDep_time_spent <- getWord32le
_acqSvProfileDep_cf_min <- fromIntegral <$> getWord32le
_acqSvProfileDep_cf_max <- fromIntegral <$> getWord32le
_acqSvProfileDep_cf <- fromIntegral <$> getWord32le
_acqSvProfileDep_cp <- getWord32le
pure AcqSvProfileDep {..}
put AcqSvProfileDep {..} = do
putWord8 _acqSvProfileDep_job_type
putWord8 _acqSvProfileDep_status
putWord16le _acqSvProfileDep_cn0
putWord8 _acqSvProfileDep_int_time
put _acqSvProfileDep_sid
putWord16le _acqSvProfileDep_bin_width
putWord32le _acqSvProfileDep_timestamp
putWord32le _acqSvProfileDep_time_spent
putWord32le $ fromIntegral _acqSvProfileDep_cf_min
putWord32le $ fromIntegral _acqSvProfileDep_cf_max
putWord32le $ fromIntegral _acqSvProfileDep_cf
putWord32le _acqSvProfileDep_cp
$(makeJSON "_acqSvProfileDep_" ''AcqSvProfileDep)
$(makeLenses ''AcqSvProfileDep)
msgAcqSvProfile :: Word16
msgAcqSvProfile = 0x002E
-- | SBP class for message MSG_ACQ_SV_PROFILE (0x002E).
--
-- The message describes all SV profiles during acquisition time. The message
-- is used to debug and measure the performance.
data MsgAcqSvProfile = MsgAcqSvProfile
{ _msgAcqSvProfile_acq_sv_profile :: ![AcqSvProfile]
-- ^ SV profiles during acquisition time
} deriving ( Show, Read, Eq )
instance Binary MsgAcqSvProfile where
get = do
_msgAcqSvProfile_acq_sv_profile <- whileM (not <$> isEmpty) get
pure MsgAcqSvProfile {..}
put MsgAcqSvProfile {..} = do
mapM_ put _msgAcqSvProfile_acq_sv_profile
$(makeSBP 'msgAcqSvProfile ''MsgAcqSvProfile)
$(makeJSON "_msgAcqSvProfile_" ''MsgAcqSvProfile)
$(makeLenses ''MsgAcqSvProfile)
msgAcqSvProfileDep :: Word16
msgAcqSvProfileDep = 0x001E
-- | SBP class for message MSG_ACQ_SV_PROFILE_DEP (0x001E).
--
-- Deprecated.
data MsgAcqSvProfileDep = MsgAcqSvProfileDep
{ _msgAcqSvProfileDep_acq_sv_profile :: ![AcqSvProfileDep]
-- ^ SV profiles during acquisition time
} deriving ( Show, Read, Eq )
instance Binary MsgAcqSvProfileDep where
get = do
_msgAcqSvProfileDep_acq_sv_profile <- whileM (not <$> isEmpty) get
pure MsgAcqSvProfileDep {..}
put MsgAcqSvProfileDep {..} = do
mapM_ put _msgAcqSvProfileDep_acq_sv_profile
$(makeSBP 'msgAcqSvProfileDep ''MsgAcqSvProfileDep)
$(makeJSON "_msgAcqSvProfileDep_" ''MsgAcqSvProfileDep)
$(makeLenses ''MsgAcqSvProfileDep)