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

-- |
-- Module:      SwiftNav.SBP.Ndb
-- Copyright:   Copyright (C) 2015-2021 Swift Navigation, Inc.
-- License:     MIT
-- Contact:     https://support.swiftnav.com
-- Stability:   experimental
-- Portability: portable
--
-- \< Messages for logging NDB events. \>

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


msgNdbEvent :: Word16
msgNdbEvent :: Word16
msgNdbEvent = Word16
0x0400

-- | SBP class for message MSG_NDB_EVENT (0x0400).
--
-- This message is sent out when an object is stored into NDB. If needed
-- message could also be sent out when fetching an object from NDB.
data MsgNdbEvent = MsgNdbEvent
  { MsgNdbEvent -> Word64
_msgNdbEvent_recv_time     :: !Word64
    -- ^ HW time in milliseconds.
  , MsgNdbEvent -> Word8
_msgNdbEvent_event         :: !Word8
    -- ^ Event type.
  , MsgNdbEvent -> Word8
_msgNdbEvent_object_type   :: !Word8
    -- ^ Event object type.
  , MsgNdbEvent -> Word8
_msgNdbEvent_result        :: !Word8
    -- ^ Event result.
  , MsgNdbEvent -> Word8
_msgNdbEvent_data_source   :: !Word8
    -- ^ Data source for STORE event, reserved for other events.
  , MsgNdbEvent -> GnssSignal
_msgNdbEvent_object_sid    :: !GnssSignal
    -- ^ GNSS signal identifier, If object_type is Ephemeris OR Almanac, sid
    -- indicates for which signal the object belongs to. Reserved in other
    -- cases.
  , MsgNdbEvent -> GnssSignal
_msgNdbEvent_src_sid       :: !GnssSignal
    -- ^ GNSS signal identifier, If object_type is Almanac, Almanac WN, Iono OR
    -- L2C capabilities AND data_source is NDB_DS_RECEIVER sid indicates from
    -- which SV data was decoded. Reserved in other cases.
  , MsgNdbEvent -> Word16
_msgNdbEvent_original_sender :: !Word16
    -- ^ A unique identifier of the sending hardware. For v1.0, set to the 2
    -- least significant bytes of the device serial number, valid only if
    -- data_source is NDB_DS_SBP. Reserved in case of other data_source.
  } deriving ( Int -> MsgNdbEvent -> ShowS
[MsgNdbEvent] -> ShowS
MsgNdbEvent -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MsgNdbEvent] -> ShowS
$cshowList :: [MsgNdbEvent] -> ShowS
show :: MsgNdbEvent -> String
$cshow :: MsgNdbEvent -> String
showsPrec :: Int -> MsgNdbEvent -> ShowS
$cshowsPrec :: Int -> MsgNdbEvent -> ShowS
Show, ReadPrec [MsgNdbEvent]
ReadPrec MsgNdbEvent
Int -> ReadS MsgNdbEvent
ReadS [MsgNdbEvent]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [MsgNdbEvent]
$creadListPrec :: ReadPrec [MsgNdbEvent]
readPrec :: ReadPrec MsgNdbEvent
$creadPrec :: ReadPrec MsgNdbEvent
readList :: ReadS [MsgNdbEvent]
$creadList :: ReadS [MsgNdbEvent]
readsPrec :: Int -> ReadS MsgNdbEvent
$creadsPrec :: Int -> ReadS MsgNdbEvent
Read, MsgNdbEvent -> MsgNdbEvent -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MsgNdbEvent -> MsgNdbEvent -> Bool
$c/= :: MsgNdbEvent -> MsgNdbEvent -> Bool
== :: MsgNdbEvent -> MsgNdbEvent -> Bool
$c== :: MsgNdbEvent -> MsgNdbEvent -> Bool
Eq )

instance Binary MsgNdbEvent where
  get :: Get MsgNdbEvent
get = do
    Word64
_msgNdbEvent_recv_time <- Get Word64
getWord64le
    Word8
_msgNdbEvent_event <- Get Word8
getWord8
    Word8
_msgNdbEvent_object_type <- Get Word8
getWord8
    Word8
_msgNdbEvent_result <- Get Word8
getWord8
    Word8
_msgNdbEvent_data_source <- Get Word8
getWord8
    GnssSignal
_msgNdbEvent_object_sid <- forall t. Binary t => Get t
get
    GnssSignal
_msgNdbEvent_src_sid <- forall t. Binary t => Get t
get
    Word16
_msgNdbEvent_original_sender <- Get Word16
getWord16le
    forall (f :: * -> *) a. Applicative f => a -> f a
pure MsgNdbEvent {Word8
Word16
Word64
GnssSignal
_msgNdbEvent_original_sender :: Word16
_msgNdbEvent_src_sid :: GnssSignal
_msgNdbEvent_object_sid :: GnssSignal
_msgNdbEvent_data_source :: Word8
_msgNdbEvent_result :: Word8
_msgNdbEvent_object_type :: Word8
_msgNdbEvent_event :: Word8
_msgNdbEvent_recv_time :: Word64
_msgNdbEvent_original_sender :: Word16
_msgNdbEvent_src_sid :: GnssSignal
_msgNdbEvent_object_sid :: GnssSignal
_msgNdbEvent_data_source :: Word8
_msgNdbEvent_result :: Word8
_msgNdbEvent_object_type :: Word8
_msgNdbEvent_event :: Word8
_msgNdbEvent_recv_time :: Word64
..}

  put :: MsgNdbEvent -> Put
put MsgNdbEvent {Word8
Word16
Word64
GnssSignal
_msgNdbEvent_original_sender :: Word16
_msgNdbEvent_src_sid :: GnssSignal
_msgNdbEvent_object_sid :: GnssSignal
_msgNdbEvent_data_source :: Word8
_msgNdbEvent_result :: Word8
_msgNdbEvent_object_type :: Word8
_msgNdbEvent_event :: Word8
_msgNdbEvent_recv_time :: Word64
_msgNdbEvent_original_sender :: MsgNdbEvent -> Word16
_msgNdbEvent_src_sid :: MsgNdbEvent -> GnssSignal
_msgNdbEvent_object_sid :: MsgNdbEvent -> GnssSignal
_msgNdbEvent_data_source :: MsgNdbEvent -> Word8
_msgNdbEvent_result :: MsgNdbEvent -> Word8
_msgNdbEvent_object_type :: MsgNdbEvent -> Word8
_msgNdbEvent_event :: MsgNdbEvent -> Word8
_msgNdbEvent_recv_time :: MsgNdbEvent -> Word64
..} = do
    Word64 -> Put
putWord64le Word64
_msgNdbEvent_recv_time
    Word8 -> Put
putWord8 Word8
_msgNdbEvent_event
    Word8 -> Put
putWord8 Word8
_msgNdbEvent_object_type
    Word8 -> Put
putWord8 Word8
_msgNdbEvent_result
    Word8 -> Put
putWord8 Word8
_msgNdbEvent_data_source
    forall t. Binary t => t -> Put
put GnssSignal
_msgNdbEvent_object_sid
    forall t. Binary t => t -> Put
put GnssSignal
_msgNdbEvent_src_sid
    Word16 -> Put
putWord16le Word16
_msgNdbEvent_original_sender

$(makeSBP 'msgNdbEvent ''MsgNdbEvent)
$(makeJSON "_msgNdbEvent_" ''MsgNdbEvent)
$(makeLenses ''MsgNdbEvent)