packages feed

sbp-6.2.2: src/SwiftNav/SBP/Telemetry.hs

{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# LANGUAGE NoImplicitPrelude           #-}
{-# LANGUAGE TemplateHaskell             #-}
{-# LANGUAGE RecordWildCards             #-}

-- |
-- Module:      SwiftNav.SBP.Telemetry
-- Copyright:   Copyright (C) 2015-2021 Swift Navigation, Inc.
-- License:     MIT
-- Contact:     https://support.swiftnav.com
-- Stability:   experimental
-- Portability: portable
--
-- \< Telemetry messages reported by Starling engine. The messages include
-- various byproducts of state estimation and other logic across Starling and
-- are aimed at efficient issue diagnostics. \>

module SwiftNav.SBP.Telemetry
  ( module SwiftNav.SBP.Telemetry
  ) 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.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) #-}


data TelemetrySV = TelemetrySV
  { _telemetrySV_az                 :: !Word8
    -- ^ Azimuth angle (range 0..179)
  , _telemetrySV_el                 :: !Int8
    -- ^ Elevation angle (range -90..90)
  , _telemetrySV_availability_flags :: !Word8
    -- ^ Observation availability at filter update
  , _telemetrySV_pseudorange_residual :: !Int16
    -- ^ Pseudorange observation residual
  , _telemetrySV_phase_residual     :: !Int16
    -- ^ Carrier-phase or carrier-phase-derived observation residual
  , _telemetrySV_outlier_flags      :: !Word8
    -- ^ Reports if observation is marked as an outlier and is excluded from the
    -- update
  , _telemetrySV_ephemeris_flags    :: !Word8
    -- ^ Ephemeris metadata
  , _telemetrySV_correction_flags   :: !Word8
    -- ^ Reserved
  , _telemetrySV_sid                :: !GnssSignal
    -- ^ GNSS signal identifier (16 bit)
  } deriving ( Show, Read, Eq )

instance Binary TelemetrySV where
  get = do
    _telemetrySV_az <- getWord8
    _telemetrySV_el <- (fromIntegral <$> getWord8)
    _telemetrySV_availability_flags <- getWord8
    _telemetrySV_pseudorange_residual <- (fromIntegral <$> getWord16le)
    _telemetrySV_phase_residual <- (fromIntegral <$> getWord16le)
    _telemetrySV_outlier_flags <- getWord8
    _telemetrySV_ephemeris_flags <- getWord8
    _telemetrySV_correction_flags <- getWord8
    _telemetrySV_sid <- get
    pure TelemetrySV {..}

  put TelemetrySV {..} = do
    putWord8 _telemetrySV_az
    (putWord8 . fromIntegral) _telemetrySV_el
    putWord8 _telemetrySV_availability_flags
    (putWord16le . fromIntegral) _telemetrySV_pseudorange_residual
    (putWord16le . fromIntegral) _telemetrySV_phase_residual
    putWord8 _telemetrySV_outlier_flags
    putWord8 _telemetrySV_ephemeris_flags
    putWord8 _telemetrySV_correction_flags
    put _telemetrySV_sid

$(makeJSON "_telemetrySV_" ''TelemetrySV)
$(makeLenses ''TelemetrySV)

msgTelSv :: Word16
msgTelSv = 0x0120

-- | SBP class for message MSG_TEL_SV (0x0120).
--
-- This message includes telemetry pertinent to satellite signals available to
-- Starling.
data MsgTelSv = MsgTelSv
  { _msgTelSv_wn         :: !Word16
    -- ^ GPS week number
  , _msgTelSv_tow        :: !Word32
    -- ^ GPS Time of Week
  , _msgTelSv_n_obs      :: !Word8
    -- ^ Total number of observations. First nibble is the size of the sequence
    -- (n), second nibble is the zero-indexed counter (ith packet of n)
  , _msgTelSv_origin_flags :: !Word8
    -- ^ Flags to identify the filter type from which the telemetry is reported
    -- from
  , _msgTelSv_sv_tel     :: ![TelemetrySV]
    -- ^ Array of per-signal telemetry entries
  } deriving ( Show, Read, Eq )

instance Binary MsgTelSv where
  get = do
    _msgTelSv_wn <- getWord16le
    _msgTelSv_tow <- getWord32le
    _msgTelSv_n_obs <- getWord8
    _msgTelSv_origin_flags <- getWord8
    _msgTelSv_sv_tel <- whileM (not <$> isEmpty) get
    pure MsgTelSv {..}

  put MsgTelSv {..} = do
    putWord16le _msgTelSv_wn
    putWord32le _msgTelSv_tow
    putWord8 _msgTelSv_n_obs
    putWord8 _msgTelSv_origin_flags
    mapM_ put _msgTelSv_sv_tel

$(makeSBP 'msgTelSv ''MsgTelSv)
$(makeJSON "_msgTelSv_" ''MsgTelSv)
$(makeLenses ''MsgTelSv)