{-# OPTIONS_GHC -fno-warn-unused-imports #-} {-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE RecordWildCards #-} -- | -- Module: SwiftNav.SBP.Orientation -- Copyright: Copyright (C) 2015-2021 Swift Navigation, Inc. -- License: MIT -- Contact: https://support.swiftnav.com -- Stability: experimental -- Portability: portable -- -- \< Orientation Messages \> module SwiftNav.SBP.Orientation ( module SwiftNav.SBP.Orientation ) 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) #-} msgBaselineHeading :: Word16 msgBaselineHeading = 0x020F -- | SBP class for message MSG_BASELINE_HEADING (0x020F). -- -- This message reports the baseline heading pointing from the base station to -- the rover relative to True North. The full GPS time is given by the -- preceding MSG_GPS_TIME with the matching time-of-week (tow). It is intended -- that time-matched RTK mode is used when the base station is moving. data MsgBaselineHeading = MsgBaselineHeading { _msgBaselineHeading_tow :: !Word32 -- ^ GPS Time of Week , _msgBaselineHeading_heading :: !Word32 -- ^ Heading , _msgBaselineHeading_n_sats :: !Word8 -- ^ Number of satellites used in solution , _msgBaselineHeading_flags :: !Word8 -- ^ Status flags } deriving ( Show, Read, Eq ) instance Binary MsgBaselineHeading where get = do _msgBaselineHeading_tow <- getWord32le _msgBaselineHeading_heading <- getWord32le _msgBaselineHeading_n_sats <- getWord8 _msgBaselineHeading_flags <- getWord8 pure MsgBaselineHeading {..} put MsgBaselineHeading {..} = do putWord32le _msgBaselineHeading_tow putWord32le _msgBaselineHeading_heading putWord8 _msgBaselineHeading_n_sats putWord8 _msgBaselineHeading_flags $(makeSBP 'msgBaselineHeading ''MsgBaselineHeading) $(makeJSON "_msgBaselineHeading_" ''MsgBaselineHeading) $(makeLenses ''MsgBaselineHeading) msgOrientQuat :: Word16 msgOrientQuat = 0x0220 -- | SBP class for message MSG_ORIENT_QUAT (0x0220). -- -- This message reports the quaternion vector describing the vehicle body -- frame's orientation with respect to a local-level NED frame. The components -- of the vector should sum to a unit vector assuming that the LSB of each -- component as a value of 2^-31. This message will only be available in -- future INS versions of Swift Products and is not produced by Piksi Multi or -- Duro. data MsgOrientQuat = MsgOrientQuat { _msgOrientQuat_tow :: !Word32 -- ^ GPS Time of Week , _msgOrientQuat_w :: !Int32 -- ^ Real component , _msgOrientQuat_x :: !Int32 -- ^ 1st imaginary component , _msgOrientQuat_y :: !Int32 -- ^ 2nd imaginary component , _msgOrientQuat_z :: !Int32 -- ^ 3rd imaginary component , _msgOrientQuat_w_accuracy :: !Float -- ^ Estimated standard deviation of w , _msgOrientQuat_x_accuracy :: !Float -- ^ Estimated standard deviation of x , _msgOrientQuat_y_accuracy :: !Float -- ^ Estimated standard deviation of y , _msgOrientQuat_z_accuracy :: !Float -- ^ Estimated standard deviation of z , _msgOrientQuat_flags :: !Word8 -- ^ Status flags } deriving ( Show, Read, Eq ) instance Binary MsgOrientQuat where get = do _msgOrientQuat_tow <- getWord32le _msgOrientQuat_w <- (fromIntegral <$> getWord32le) _msgOrientQuat_x <- (fromIntegral <$> getWord32le) _msgOrientQuat_y <- (fromIntegral <$> getWord32le) _msgOrientQuat_z <- (fromIntegral <$> getWord32le) _msgOrientQuat_w_accuracy <- getFloat32le _msgOrientQuat_x_accuracy <- getFloat32le _msgOrientQuat_y_accuracy <- getFloat32le _msgOrientQuat_z_accuracy <- getFloat32le _msgOrientQuat_flags <- getWord8 pure MsgOrientQuat {..} put MsgOrientQuat {..} = do putWord32le _msgOrientQuat_tow (putWord32le . fromIntegral) _msgOrientQuat_w (putWord32le . fromIntegral) _msgOrientQuat_x (putWord32le . fromIntegral) _msgOrientQuat_y (putWord32le . fromIntegral) _msgOrientQuat_z putFloat32le _msgOrientQuat_w_accuracy putFloat32le _msgOrientQuat_x_accuracy putFloat32le _msgOrientQuat_y_accuracy putFloat32le _msgOrientQuat_z_accuracy putWord8 _msgOrientQuat_flags $(makeSBP 'msgOrientQuat ''MsgOrientQuat) $(makeJSON "_msgOrientQuat_" ''MsgOrientQuat) $(makeLenses ''MsgOrientQuat) msgOrientEuler :: Word16 msgOrientEuler = 0x0221 -- | SBP class for message MSG_ORIENT_EULER (0x0221). -- -- This message reports the yaw, pitch, and roll angles of the vehicle body -- frame. The rotations should applied intrinsically in the order yaw, pitch, -- and roll in order to rotate the from a frame aligned with the local-level -- NED frame to the vehicle body frame. This message will only be available -- in future INS versions of Swift Products and is not produced by Piksi Multi -- or Duro. data MsgOrientEuler = MsgOrientEuler { _msgOrientEuler_tow :: !Word32 -- ^ GPS Time of Week , _msgOrientEuler_roll :: !Int32 -- ^ rotation about the forward axis of the vehicle , _msgOrientEuler_pitch :: !Int32 -- ^ rotation about the rightward axis of the vehicle , _msgOrientEuler_yaw :: !Int32 -- ^ rotation about the downward axis of the vehicle , _msgOrientEuler_roll_accuracy :: !Float -- ^ Estimated standard deviation of roll , _msgOrientEuler_pitch_accuracy :: !Float -- ^ Estimated standard deviation of pitch , _msgOrientEuler_yaw_accuracy :: !Float -- ^ Estimated standard deviation of yaw , _msgOrientEuler_flags :: !Word8 -- ^ Status flags } deriving ( Show, Read, Eq ) instance Binary MsgOrientEuler where get = do _msgOrientEuler_tow <- getWord32le _msgOrientEuler_roll <- (fromIntegral <$> getWord32le) _msgOrientEuler_pitch <- (fromIntegral <$> getWord32le) _msgOrientEuler_yaw <- (fromIntegral <$> getWord32le) _msgOrientEuler_roll_accuracy <- getFloat32le _msgOrientEuler_pitch_accuracy <- getFloat32le _msgOrientEuler_yaw_accuracy <- getFloat32le _msgOrientEuler_flags <- getWord8 pure MsgOrientEuler {..} put MsgOrientEuler {..} = do putWord32le _msgOrientEuler_tow (putWord32le . fromIntegral) _msgOrientEuler_roll (putWord32le . fromIntegral) _msgOrientEuler_pitch (putWord32le . fromIntegral) _msgOrientEuler_yaw putFloat32le _msgOrientEuler_roll_accuracy putFloat32le _msgOrientEuler_pitch_accuracy putFloat32le _msgOrientEuler_yaw_accuracy putWord8 _msgOrientEuler_flags $(makeSBP 'msgOrientEuler ''MsgOrientEuler) $(makeJSON "_msgOrientEuler_" ''MsgOrientEuler) $(makeLenses ''MsgOrientEuler) msgAngularRate :: Word16 msgAngularRate = 0x0222 -- | SBP class for message MSG_ANGULAR_RATE (0x0222). -- -- This message reports the orientation rates in the vehicle body frame. The -- values represent the measurements a strapped down gyroscope would make and -- are not equivalent to the time derivative of the Euler angles. The -- orientation and origin of the user frame is specified via device settings. -- By convention, the vehicle x-axis is expected to be aligned with the -- forward direction, while the vehicle y-axis is expected to be aligned with -- the right direction, and the vehicle z-axis should be aligned with the down -- direction. This message will only be available in future INS versions of -- Swift Products and is not produced by Piksi Multi or Duro. data MsgAngularRate = MsgAngularRate { _msgAngularRate_tow :: !Word32 -- ^ GPS Time of Week , _msgAngularRate_x :: !Int32 -- ^ angular rate about x axis , _msgAngularRate_y :: !Int32 -- ^ angular rate about y axis , _msgAngularRate_z :: !Int32 -- ^ angular rate about z axis , _msgAngularRate_flags :: !Word8 -- ^ Status flags } deriving ( Show, Read, Eq ) instance Binary MsgAngularRate where get = do _msgAngularRate_tow <- getWord32le _msgAngularRate_x <- (fromIntegral <$> getWord32le) _msgAngularRate_y <- (fromIntegral <$> getWord32le) _msgAngularRate_z <- (fromIntegral <$> getWord32le) _msgAngularRate_flags <- getWord8 pure MsgAngularRate {..} put MsgAngularRate {..} = do putWord32le _msgAngularRate_tow (putWord32le . fromIntegral) _msgAngularRate_x (putWord32le . fromIntegral) _msgAngularRate_y (putWord32le . fromIntegral) _msgAngularRate_z putWord8 _msgAngularRate_flags $(makeSBP 'msgAngularRate ''MsgAngularRate) $(makeJSON "_msgAngularRate_" ''MsgAngularRate) $(makeLenses ''MsgAngularRate)