packages feed

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

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

-- |
-- Module:      SwiftNav.SBP.Vehicle
-- Copyright:   Copyright (C) 2015-2021 Swift Navigation, Inc.
-- License:     MIT
-- Contact:     https://support.swiftnav.com
-- Stability:   experimental
-- Portability: portable
--
-- \< Messages from a vehicle. \>

module SwiftNav.SBP.Vehicle
  ( module SwiftNav.SBP.Vehicle
  ) 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

{-# ANN module ("HLint: ignore Use camelCase"::String) #-}
{-# ANN module ("HLint: ignore Redundant do"::String) #-}
{-# ANN module ("HLint: ignore Use newtype instead of data"::String) #-}


msgOdometry :: Word16
msgOdometry = 0x0903

-- | SBP class for message MSG_ODOMETRY (0x0903).
--
-- Message representing the x component of vehicle velocity in the user frame
-- at the odometry reference point(s) specified by the user. The offset for
-- the odometry reference point and the definition and origin of the user
-- frame are defined through the device settings interface. There are 4
-- possible user-defined sources of this message which are labeled arbitrarily
-- source 0 through 3.
-- If using "processor time" time tags, the receiving end will expect either
-- `MSG_GNSS_TIME_OFFSET` or `MSG_PPS_TIME` to sync incoming odometry data to
-- GNSS time.  Processor time shall roll over to zero after one week.
data MsgOdometry = MsgOdometry
  { _msgOdometry_tow    :: !Word32
    -- ^ Time field representing either milliseconds in the GPS Week or local
    -- CPU time from the producing system in milliseconds.  See the tow_source
    -- flag for the exact source of this timestamp.
  , _msgOdometry_velocity :: !Int32
    -- ^ The signed forward component of vehicle velocity.
  , _msgOdometry_flags  :: !Word8
    -- ^ Status flags
  } deriving ( Show, Read, Eq )

instance Binary MsgOdometry where
  get = do
    _msgOdometry_tow <- getWord32le
    _msgOdometry_velocity <- (fromIntegral <$> getWord32le)
    _msgOdometry_flags <- getWord8
    pure MsgOdometry {..}

  put MsgOdometry {..} = do
    putWord32le _msgOdometry_tow
    (putWord32le . fromIntegral) _msgOdometry_velocity
    putWord8 _msgOdometry_flags

$(makeSBP 'msgOdometry ''MsgOdometry)
$(makeJSON "_msgOdometry_" ''MsgOdometry)
$(makeLenses ''MsgOdometry)

msgWheeltick :: Word16
msgWheeltick = 0x0904

-- | SBP class for message MSG_WHEELTICK (0x0904).
--
-- Message containing the accumulated distance travelled by a wheel located at
-- an odometry reference point defined by the user. The offset for the
-- odometry reference point and the definition and origin of the user frame
-- are defined through the device settings interface. The source of this
-- message is identified by the source field, which is an integer ranging from
-- 0 to 255. The timestamp associated with this message should represent the
-- time when the accumulated tick count reached the value given by the
-- contents of this message as accurately as possible. If using "local CPU
-- time" time tags, the receiving end will also expect either
-- `MSG_GNSS_TIME_OFFSET` or `MSG_PPS_TIME` to sync incoming wheeltick data to
-- GNSS time.
-- Local CPU time shall roll over to zero after one week.
data MsgWheeltick = MsgWheeltick
  { _msgWheeltick_time :: !Word64
    -- ^ Time field representing either microseconds since the last PPS,
    -- microseconds in the GPS Week or local CPU time from the producing
    -- system in microseconds. See the synch_type field for the exact meaning
    -- of this timestamp.
  , _msgWheeltick_flags :: !Word8
    -- ^ Field indicating the type of timestamp contained in the time field.
  , _msgWheeltick_source :: !Word8
    -- ^ ID of the sensor producing this message
  , _msgWheeltick_ticks :: !Int32
    -- ^ Free-running counter of the accumulated distance for this sensor. The
    -- counter should be incrementing if travelling into one direction and
    -- decrementing when travelling in the opposite direction.
  } deriving ( Show, Read, Eq )

instance Binary MsgWheeltick where
  get = do
    _msgWheeltick_time <- getWord64le
    _msgWheeltick_flags <- getWord8
    _msgWheeltick_source <- getWord8
    _msgWheeltick_ticks <- (fromIntegral <$> getWord32le)
    pure MsgWheeltick {..}

  put MsgWheeltick {..} = do
    putWord64le _msgWheeltick_time
    putWord8 _msgWheeltick_flags
    putWord8 _msgWheeltick_source
    (putWord32le . fromIntegral) _msgWheeltick_ticks

$(makeSBP 'msgWheeltick ''MsgWheeltick)
$(makeJSON "_msgWheeltick_" ''MsgWheeltick)
$(makeLenses ''MsgWheeltick)