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

-- |
-- Module:      SwiftNav.SBP.Profiling
-- Copyright:   Copyright (C) 2015-2021 Swift Navigation, Inc.
-- License:     MIT
-- Contact:     https://support.swiftnav.com
-- Stability:   experimental
-- Portability: portable
--
-- \< Standardized profiling messages from Swift Navigation devices. \>

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


msgMeasurementPoint :: Word16
msgMeasurementPoint :: Word16
msgMeasurementPoint = Word16
0xCF00

-- | SBP class for message MSG_MEASUREMENT_POINT (0xCF00).
--
-- Tracks execution time of certain code paths in specially built products.
-- This message should only be expected and processed on the direction of
-- Swift's engineering teams.
data MsgMeasurementPoint = MsgMeasurementPoint
  { MsgMeasurementPoint -> Word32
_msgMeasurementPoint_total_time   :: !Word32
    -- ^ Total time spent in measurement point (microseconds)
  , MsgMeasurementPoint -> Word16
_msgMeasurementPoint_num_executions :: !Word16
    -- ^ Number of times measurement point has executed
  , MsgMeasurementPoint -> Word32
_msgMeasurementPoint_min          :: !Word32
    -- ^ Minimum execution time (microseconds)
  , MsgMeasurementPoint -> Word32
_msgMeasurementPoint_max          :: !Word32
    -- ^ Maximum execution time (microseconds)
  , MsgMeasurementPoint -> Word64
_msgMeasurementPoint_return_addr  :: !Word64
    -- ^ Return address
  , MsgMeasurementPoint -> Word64
_msgMeasurementPoint_id           :: !Word64
    -- ^ Unique ID
  , MsgMeasurementPoint -> Word64
_msgMeasurementPoint_slice_time   :: !Word64
    -- ^ CPU slice time (milliseconds)
  , MsgMeasurementPoint -> Word16
_msgMeasurementPoint_line         :: !Word16
    -- ^ Line number
  , MsgMeasurementPoint -> Text
_msgMeasurementPoint_func         :: !Text
    -- ^ Function name
  } deriving ( Int -> MsgMeasurementPoint -> ShowS
[MsgMeasurementPoint] -> ShowS
MsgMeasurementPoint -> String
(Int -> MsgMeasurementPoint -> ShowS)
-> (MsgMeasurementPoint -> String)
-> ([MsgMeasurementPoint] -> ShowS)
-> Show MsgMeasurementPoint
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MsgMeasurementPoint -> ShowS
showsPrec :: Int -> MsgMeasurementPoint -> ShowS
$cshow :: MsgMeasurementPoint -> String
show :: MsgMeasurementPoint -> String
$cshowList :: [MsgMeasurementPoint] -> ShowS
showList :: [MsgMeasurementPoint] -> ShowS
Show, ReadPrec [MsgMeasurementPoint]
ReadPrec MsgMeasurementPoint
Int -> ReadS MsgMeasurementPoint
ReadS [MsgMeasurementPoint]
(Int -> ReadS MsgMeasurementPoint)
-> ReadS [MsgMeasurementPoint]
-> ReadPrec MsgMeasurementPoint
-> ReadPrec [MsgMeasurementPoint]
-> Read MsgMeasurementPoint
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS MsgMeasurementPoint
readsPrec :: Int -> ReadS MsgMeasurementPoint
$creadList :: ReadS [MsgMeasurementPoint]
readList :: ReadS [MsgMeasurementPoint]
$creadPrec :: ReadPrec MsgMeasurementPoint
readPrec :: ReadPrec MsgMeasurementPoint
$creadListPrec :: ReadPrec [MsgMeasurementPoint]
readListPrec :: ReadPrec [MsgMeasurementPoint]
Read, MsgMeasurementPoint -> MsgMeasurementPoint -> Bool
(MsgMeasurementPoint -> MsgMeasurementPoint -> Bool)
-> (MsgMeasurementPoint -> MsgMeasurementPoint -> Bool)
-> Eq MsgMeasurementPoint
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MsgMeasurementPoint -> MsgMeasurementPoint -> Bool
== :: MsgMeasurementPoint -> MsgMeasurementPoint -> Bool
$c/= :: MsgMeasurementPoint -> MsgMeasurementPoint -> Bool
/= :: MsgMeasurementPoint -> MsgMeasurementPoint -> Bool
Eq )

instance Binary MsgMeasurementPoint where
  get :: Get MsgMeasurementPoint
get = do
    Word32
_msgMeasurementPoint_total_time <- Get Word32
getWord32le
    Word16
_msgMeasurementPoint_num_executions <- Get Word16
getWord16le
    Word32
_msgMeasurementPoint_min <- Get Word32
getWord32le
    Word32
_msgMeasurementPoint_max <- Get Word32
getWord32le
    Word64
_msgMeasurementPoint_return_addr <- Get Word64
getWord64le
    Word64
_msgMeasurementPoint_id <- Get Word64
getWord64le
    Word64
_msgMeasurementPoint_slice_time <- Get Word64
getWord64le
    Word16
_msgMeasurementPoint_line <- Get Word16
getWord16le
    Text
_msgMeasurementPoint_func <- ByteString -> Text
decodeUtf8 (ByteString -> Text)
-> (ByteString -> ByteString) -> ByteString -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. ByteString -> ByteString
toStrict (ByteString -> Text) -> Get ByteString -> Get Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get ByteString
getRemainingLazyByteString
    MsgMeasurementPoint -> Get MsgMeasurementPoint
forall a. a -> Get a
forall (f :: * -> *) a. Applicative f => a -> f a
pure MsgMeasurementPoint {Word16
Word32
Word64
Text
_msgMeasurementPoint_total_time :: Word32
_msgMeasurementPoint_num_executions :: Word16
_msgMeasurementPoint_min :: Word32
_msgMeasurementPoint_max :: Word32
_msgMeasurementPoint_return_addr :: Word64
_msgMeasurementPoint_id :: Word64
_msgMeasurementPoint_slice_time :: Word64
_msgMeasurementPoint_line :: Word16
_msgMeasurementPoint_func :: Text
_msgMeasurementPoint_total_time :: Word32
_msgMeasurementPoint_num_executions :: Word16
_msgMeasurementPoint_min :: Word32
_msgMeasurementPoint_max :: Word32
_msgMeasurementPoint_return_addr :: Word64
_msgMeasurementPoint_id :: Word64
_msgMeasurementPoint_slice_time :: Word64
_msgMeasurementPoint_line :: Word16
_msgMeasurementPoint_func :: Text
..}

  put :: MsgMeasurementPoint -> Put
put MsgMeasurementPoint {Word16
Word32
Word64
Text
_msgMeasurementPoint_total_time :: MsgMeasurementPoint -> Word32
_msgMeasurementPoint_num_executions :: MsgMeasurementPoint -> Word16
_msgMeasurementPoint_min :: MsgMeasurementPoint -> Word32
_msgMeasurementPoint_max :: MsgMeasurementPoint -> Word32
_msgMeasurementPoint_return_addr :: MsgMeasurementPoint -> Word64
_msgMeasurementPoint_id :: MsgMeasurementPoint -> Word64
_msgMeasurementPoint_slice_time :: MsgMeasurementPoint -> Word64
_msgMeasurementPoint_line :: MsgMeasurementPoint -> Word16
_msgMeasurementPoint_func :: MsgMeasurementPoint -> Text
_msgMeasurementPoint_total_time :: Word32
_msgMeasurementPoint_num_executions :: Word16
_msgMeasurementPoint_min :: Word32
_msgMeasurementPoint_max :: Word32
_msgMeasurementPoint_return_addr :: Word64
_msgMeasurementPoint_id :: Word64
_msgMeasurementPoint_slice_time :: Word64
_msgMeasurementPoint_line :: Word16
_msgMeasurementPoint_func :: Text
..} = do
    Word32 -> Put
putWord32le Word32
_msgMeasurementPoint_total_time
    Word16 -> Put
putWord16le Word16
_msgMeasurementPoint_num_executions
    Word32 -> Put
putWord32le Word32
_msgMeasurementPoint_min
    Word32 -> Put
putWord32le Word32
_msgMeasurementPoint_max
    Word64 -> Put
putWord64le Word64
_msgMeasurementPoint_return_addr
    Word64 -> Put
putWord64le Word64
_msgMeasurementPoint_id
    Word64 -> Put
putWord64le Word64
_msgMeasurementPoint_slice_time
    Word16 -> Put
putWord16le Word16
_msgMeasurementPoint_line
    ByteString -> Put
putByteString (ByteString -> Put) -> ByteString -> Put
forall a b. (a -> b) -> a -> b
$ Text -> ByteString
encodeUtf8 Text
_msgMeasurementPoint_func

$(makeSBP 'msgMeasurementPoint ''MsgMeasurementPoint)
$(makeJSON "_msgMeasurementPoint_" ''MsgMeasurementPoint)
$(makeLenses ''MsgMeasurementPoint)