{-# 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 -> Word8
_telemetrySV_az                 :: !Word8
    -- ^ Azimuth angle (range 0..179)
  , TelemetrySV -> Int8
_telemetrySV_el                 :: !Int8
    -- ^ Elevation angle (range -90..90)
  , TelemetrySV -> Word8
_telemetrySV_availability_flags :: !Word8
    -- ^ Observation availability at filter update
  , TelemetrySV -> Int16
_telemetrySV_pseudorange_residual :: !Int16
    -- ^ Pseudorange observation residual
  , TelemetrySV -> Int16
_telemetrySV_phase_residual     :: !Int16
    -- ^ Carrier-phase or carrier-phase-derived observation residual
  , TelemetrySV -> Word8
_telemetrySV_outlier_flags      :: !Word8
    -- ^ Reports if observation is marked as an outlier and is excluded from the
    -- update
  , TelemetrySV -> Word8
_telemetrySV_ephemeris_flags    :: !Word8
    -- ^ Ephemeris metadata
  , TelemetrySV -> Word8
_telemetrySV_correction_flags   :: !Word8
    -- ^ Reserved
  , TelemetrySV -> GnssSignal
_telemetrySV_sid                :: !GnssSignal
    -- ^ GNSS signal identifier (16 bit)
  } deriving ( Int -> TelemetrySV -> ShowS
[TelemetrySV] -> ShowS
TelemetrySV -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TelemetrySV] -> ShowS
$cshowList :: [TelemetrySV] -> ShowS
show :: TelemetrySV -> String
$cshow :: TelemetrySV -> String
showsPrec :: Int -> TelemetrySV -> ShowS
$cshowsPrec :: Int -> TelemetrySV -> ShowS
Show, ReadPrec [TelemetrySV]
ReadPrec TelemetrySV
Int -> ReadS TelemetrySV
ReadS [TelemetrySV]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [TelemetrySV]
$creadListPrec :: ReadPrec [TelemetrySV]
readPrec :: ReadPrec TelemetrySV
$creadPrec :: ReadPrec TelemetrySV
readList :: ReadS [TelemetrySV]
$creadList :: ReadS [TelemetrySV]
readsPrec :: Int -> ReadS TelemetrySV
$creadsPrec :: Int -> ReadS TelemetrySV
Read, TelemetrySV -> TelemetrySV -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: TelemetrySV -> TelemetrySV -> Bool
$c/= :: TelemetrySV -> TelemetrySV -> Bool
== :: TelemetrySV -> TelemetrySV -> Bool
$c== :: TelemetrySV -> TelemetrySV -> Bool
Eq )

instance Binary TelemetrySV where
  get :: Get TelemetrySV
get = do
    Word8
_telemetrySV_az <- Get Word8
getWord8
    Int8
_telemetrySV_el <- (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get Word8
getWord8)
    Word8
_telemetrySV_availability_flags <- Get Word8
getWord8
    Int16
_telemetrySV_pseudorange_residual <- (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get Word16
getWord16le)
    Int16
_telemetrySV_phase_residual <- (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get Word16
getWord16le)
    Word8
_telemetrySV_outlier_flags <- Get Word8
getWord8
    Word8
_telemetrySV_ephemeris_flags <- Get Word8
getWord8
    Word8
_telemetrySV_correction_flags <- Get Word8
getWord8
    GnssSignal
_telemetrySV_sid <- forall t. Binary t => Get t
get
    forall (f :: * -> *) a. Applicative f => a -> f a
pure TelemetrySV {Int8
Int16
Word8
GnssSignal
_telemetrySV_sid :: GnssSignal
_telemetrySV_correction_flags :: Word8
_telemetrySV_ephemeris_flags :: Word8
_telemetrySV_outlier_flags :: Word8
_telemetrySV_phase_residual :: Int16
_telemetrySV_pseudorange_residual :: Int16
_telemetrySV_availability_flags :: Word8
_telemetrySV_el :: Int8
_telemetrySV_az :: Word8
_telemetrySV_sid :: GnssSignal
_telemetrySV_correction_flags :: Word8
_telemetrySV_ephemeris_flags :: Word8
_telemetrySV_outlier_flags :: Word8
_telemetrySV_phase_residual :: Int16
_telemetrySV_pseudorange_residual :: Int16
_telemetrySV_availability_flags :: Word8
_telemetrySV_el :: Int8
_telemetrySV_az :: Word8
..}

  put :: TelemetrySV -> Put
put TelemetrySV {Int8
Int16
Word8
GnssSignal
_telemetrySV_sid :: GnssSignal
_telemetrySV_correction_flags :: Word8
_telemetrySV_ephemeris_flags :: Word8
_telemetrySV_outlier_flags :: Word8
_telemetrySV_phase_residual :: Int16
_telemetrySV_pseudorange_residual :: Int16
_telemetrySV_availability_flags :: Word8
_telemetrySV_el :: Int8
_telemetrySV_az :: Word8
_telemetrySV_sid :: TelemetrySV -> GnssSignal
_telemetrySV_correction_flags :: TelemetrySV -> Word8
_telemetrySV_ephemeris_flags :: TelemetrySV -> Word8
_telemetrySV_outlier_flags :: TelemetrySV -> Word8
_telemetrySV_phase_residual :: TelemetrySV -> Int16
_telemetrySV_pseudorange_residual :: TelemetrySV -> Int16
_telemetrySV_availability_flags :: TelemetrySV -> Word8
_telemetrySV_el :: TelemetrySV -> Int8
_telemetrySV_az :: TelemetrySV -> Word8
..} = do
    Word8 -> Put
putWord8 Word8
_telemetrySV_az
    (Word8 -> Put
putWord8 forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral) Int8
_telemetrySV_el
    Word8 -> Put
putWord8 Word8
_telemetrySV_availability_flags
    (Word16 -> Put
putWord16le forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral) Int16
_telemetrySV_pseudorange_residual
    (Word16 -> Put
putWord16le forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral) Int16
_telemetrySV_phase_residual
    Word8 -> Put
putWord8 Word8
_telemetrySV_outlier_flags
    Word8 -> Put
putWord8 Word8
_telemetrySV_ephemeris_flags
    Word8 -> Put
putWord8 Word8
_telemetrySV_correction_flags
    forall t. Binary t => t -> Put
put GnssSignal
_telemetrySV_sid

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

msgTelSv :: Word16
msgTelSv :: Word16
msgTelSv = Word16
0x0120

-- | SBP class for message MSG_TEL_SV (0x0120).
--
-- This message includes telemetry pertinent to satellite signals available to
-- Starling.
data MsgTelSv = MsgTelSv
  { MsgTelSv -> Word16
_msgTelSv_wn         :: !Word16
    -- ^ GPS week number
  , MsgTelSv -> Word32
_msgTelSv_tow        :: !Word32
    -- ^ GPS Time of Week
  , MsgTelSv -> Word8
_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 -> Word8
_msgTelSv_origin_flags :: !Word8
    -- ^ Flags to identify the filter type from which the telemetry is reported
    -- from
  , MsgTelSv -> [TelemetrySV]
_msgTelSv_sv_tel     :: ![TelemetrySV]
    -- ^ Array of per-signal telemetry entries
  } deriving ( Int -> MsgTelSv -> ShowS
[MsgTelSv] -> ShowS
MsgTelSv -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MsgTelSv] -> ShowS
$cshowList :: [MsgTelSv] -> ShowS
show :: MsgTelSv -> String
$cshow :: MsgTelSv -> String
showsPrec :: Int -> MsgTelSv -> ShowS
$cshowsPrec :: Int -> MsgTelSv -> ShowS
Show, ReadPrec [MsgTelSv]
ReadPrec MsgTelSv
Int -> ReadS MsgTelSv
ReadS [MsgTelSv]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [MsgTelSv]
$creadListPrec :: ReadPrec [MsgTelSv]
readPrec :: ReadPrec MsgTelSv
$creadPrec :: ReadPrec MsgTelSv
readList :: ReadS [MsgTelSv]
$creadList :: ReadS [MsgTelSv]
readsPrec :: Int -> ReadS MsgTelSv
$creadsPrec :: Int -> ReadS MsgTelSv
Read, MsgTelSv -> MsgTelSv -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MsgTelSv -> MsgTelSv -> Bool
$c/= :: MsgTelSv -> MsgTelSv -> Bool
== :: MsgTelSv -> MsgTelSv -> Bool
$c== :: MsgTelSv -> MsgTelSv -> Bool
Eq )

instance Binary MsgTelSv where
  get :: Get MsgTelSv
get = do
    Word16
_msgTelSv_wn <- Get Word16
getWord16le
    Word32
_msgTelSv_tow <- Get Word32
getWord32le
    Word8
_msgTelSv_n_obs <- Get Word8
getWord8
    Word8
_msgTelSv_origin_flags <- Get Word8
getWord8
    [TelemetrySV]
_msgTelSv_sv_tel <- forall (m :: * -> *) a. Monad m => m Bool -> m a -> m [a]
whileM (Bool -> Bool
not forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get Bool
isEmpty) forall t. Binary t => Get t
get
    forall (f :: * -> *) a. Applicative f => a -> f a
pure MsgTelSv {[TelemetrySV]
Word8
Word16
Word32
_msgTelSv_sv_tel :: [TelemetrySV]
_msgTelSv_origin_flags :: Word8
_msgTelSv_n_obs :: Word8
_msgTelSv_tow :: Word32
_msgTelSv_wn :: Word16
_msgTelSv_sv_tel :: [TelemetrySV]
_msgTelSv_origin_flags :: Word8
_msgTelSv_n_obs :: Word8
_msgTelSv_tow :: Word32
_msgTelSv_wn :: Word16
..}

  put :: MsgTelSv -> Put
put MsgTelSv {[TelemetrySV]
Word8
Word16
Word32
_msgTelSv_sv_tel :: [TelemetrySV]
_msgTelSv_origin_flags :: Word8
_msgTelSv_n_obs :: Word8
_msgTelSv_tow :: Word32
_msgTelSv_wn :: Word16
_msgTelSv_sv_tel :: MsgTelSv -> [TelemetrySV]
_msgTelSv_origin_flags :: MsgTelSv -> Word8
_msgTelSv_n_obs :: MsgTelSv -> Word8
_msgTelSv_tow :: MsgTelSv -> Word32
_msgTelSv_wn :: MsgTelSv -> Word16
..} = do
    Word16 -> Put
putWord16le Word16
_msgTelSv_wn
    Word32 -> Put
putWord32le Word32
_msgTelSv_tow
    Word8 -> Put
putWord8 Word8
_msgTelSv_n_obs
    Word8 -> Put
putWord8 Word8
_msgTelSv_origin_flags
    forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ forall t. Binary t => t -> Put
put [TelemetrySV]
_msgTelSv_sv_tel

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