sbp-0.50.3: src/SwiftNav/SBP/Piksi.hs
-- |
-- Module: SwiftNav.SBP.Piksi
-- Copyright: Copyright (C) 2015 Swift Navigation, Inc.
-- License: LGPL-3
-- Maintainer: Mark Fine <dev@swiftnav.com>
-- Stability: experimental
-- Portability: portable
--
-- System health, configuration, and diagnostic messages specific to the Piksi
-- L1 receiver, including a variety of legacy messages that may no longer be
-- used. These messages are in the implementation-defined range
-- (0x0000-0x00FF), and largely intended for internal-use only.
module SwiftNav.SBP.Piksi where
import Control.Monad
import Control.Monad.Loops
import Data.Binary
import Data.Binary.Get
import Data.Binary.IEEE754
import Data.Binary.Put
import Data.ByteString
import Data.ByteString.Lazy hiding ( ByteString )
import Data.Int
import Data.Word
msgAlmanac :: Word16
msgAlmanac = 0x0069
-- | SBP class for message MSG_ALMANAC (0x0069).
--
-- This is a legacy message for sending and loading a satellite alamanac onto
-- the Piksi's flash memory from the host.
data MsgAlmanac = MsgAlmanac
deriving ( Show, Read, Eq )
instance Binary MsgAlmanac where
get =
return MsgAlmanac
put MsgAlmanac =
return ()
msgSetTime :: Word16
msgSetTime = 0x0068
-- | SBP class for message MSG_SET_TIME (0x0068).
--
-- This message sets up timing functionality using a coarse GPS time estimate
-- sent by the host.
data MsgSetTime = MsgSetTime
deriving ( Show, Read, Eq )
instance Binary MsgSetTime where
get =
return MsgSetTime
put MsgSetTime =
return ()
msgReset :: Word16
msgReset = 0x00B2
-- | SBP class for message MSG_RESET (0x00B2).
--
-- This message from the host resets the Piksi back into the bootloader.
data MsgReset = MsgReset
deriving ( Show, Read, Eq )
instance Binary MsgReset where
get =
return MsgReset
put MsgReset =
return ()
msgCwResults :: Word16
msgCwResults = 0x00C0
-- | SBP class for message MSG_CW_RESULTS (0x00C0).
--
-- This is an unused legacy message for result reporting from the CW
-- interference channel on the SwiftNAP. This message will be removed in a
-- future release.
data MsgCwResults = MsgCwResults
deriving ( Show, Read, Eq )
instance Binary MsgCwResults where
get =
return MsgCwResults
put MsgCwResults =
return ()
msgCwStart :: Word16
msgCwStart = 0x00C1
-- | SBP class for message MSG_CW_START (0x00C1).
--
-- This is an unused legacy message from those host for starting the CW
-- interference channel on the SwiftNAP. This message will be removed in a
-- future release.
data MsgCwStart = MsgCwStart
deriving ( Show, Read, Eq )
instance Binary MsgCwStart where
get =
return MsgCwStart
put MsgCwStart =
return ()
msgResetFilters :: Word16
msgResetFilters = 0x0022
-- | SBP class for message MSG_RESET_FILTERS (0x0022).
--
-- This message resets either the DGNSS Kalman filters or Integer Ambiguity
-- Resolution (IAR) process.
data MsgResetFilters = MsgResetFilters
{ msgResetFiltersFilter :: Word8
-- ^ Filter flags
} deriving ( Show, Read, Eq )
instance Binary MsgResetFilters where
get = do
msgResetFiltersFilter <- getWord8
return MsgResetFilters {..}
put MsgResetFilters {..} = do
putWord8 msgResetFiltersFilter
msgInitBase :: Word16
msgInitBase = 0x0023
-- | SBP class for message MSG_INIT_BASE (0x0023).
--
-- This message initializes the integer ambiguity resolution (IAR) process on
-- the Piksi to use an assumed baseline position between the base station and
-- rover receivers. Warns via MSG_PRINT if there aren't a shared minimum number
-- (4) of satellite observations between the two.
data MsgInitBase = MsgInitBase
deriving ( Show, Read, Eq )
instance Binary MsgInitBase where
get =
return MsgInitBase
put MsgInitBase =
return ()
msgThreadState :: Word16
msgThreadState = 0x0017
-- | SBP class for message MSG_THREAD_STATE (0x0017).
--
-- The thread usage message from the device reports real-time operating system
-- (RTOS) thread usage statistics for the named thread. The reported percentage
-- values require to be normalized.
data MsgThreadState = MsgThreadState
{ msgThreadStateName :: ByteString
-- ^ Thread name (NULL terminated)
, msgThreadStateCpu :: Word16
-- ^ Percentage cpu use for this thread. Values range from 0 - 1000 and needs
-- to be renormalized to 100
, msgThreadStateStackFree :: Word32
-- ^ Free stack space for this thread
} deriving ( Show, Read, Eq )
instance Binary MsgThreadState where
get = do
msgThreadStateName <- getByteString 20
msgThreadStateCpu <- getWord16le
msgThreadStateStackFree <- getWord32le
return MsgThreadState {..}
put MsgThreadState {..} = do
putByteString msgThreadStateName
putWord16le msgThreadStateCpu
putWord32le msgThreadStateStackFree
-- | UARTChannel.
--
-- Throughput, utilization, and error counts on the RX/TX buffers of this UART
-- channel. The reported percentage values require to be normalized.
data UARTChannel = UARTChannel
{ uARTChannelTxThroughput :: Float
-- ^ UART transmit throughput
, uARTChannelRxThroughput :: Float
-- ^ UART receive throughput
, uARTChannelCrcErrorCount :: Word16
-- ^ UART CRC error count
, uARTChannelIoErrorCount :: Word16
-- ^ UART IO error count
, uARTChannelTxBufferLevel :: Word8
-- ^ UART transmit buffer percentage utilization (ranges from 0 - 255)
, uARTChannelRxBufferLevel :: Word8
-- ^ UART receive buffer percentage utilization (ranges from 0 to 255)
} deriving ( Show, Read, Eq )
instance Binary UARTChannel where
get = do
uARTChannelTxThroughput <- getFloat32le
uARTChannelRxThroughput <- getFloat32le
uARTChannelCrcErrorCount <- getWord16le
uARTChannelIoErrorCount <- getWord16le
uARTChannelTxBufferLevel <- getWord8
uARTChannelRxBufferLevel <- getWord8
return UARTChannel {..}
put UARTChannel {..} = do
putFloat32le uARTChannelTxThroughput
putFloat32le uARTChannelRxThroughput
putWord16le uARTChannelCrcErrorCount
putWord16le uARTChannelIoErrorCount
putWord8 uARTChannelTxBufferLevel
putWord8 uARTChannelRxBufferLevel
-- | Latency.
--
-- Statistics on the latency of observations received from the base station. As
-- observation packets are received their GPS time is compared to the current
-- GPS time calculated locally by the receiver to give a precise measurement of
-- the end-to-end communication latency in the system.
data Latency = Latency
{ latencyAvg :: Int32
-- ^ Average latency
, latencyLmin :: Int32
-- ^ Minimum latency
, latencyLmax :: Int32
-- ^ Maximum latency
, latencyCurrent :: Int32
-- ^ Smoothed estimate of the current latency
} deriving ( Show, Read, Eq )
instance Binary Latency where
get = do
latencyAvg <- liftM fromIntegral getWord32le
latencyLmin <- liftM fromIntegral getWord32le
latencyLmax <- liftM fromIntegral getWord32le
latencyCurrent <- liftM fromIntegral getWord32le
return Latency {..}
put Latency {..} = do
putWord32le $ fromIntegral latencyAvg
putWord32le $ fromIntegral latencyLmin
putWord32le $ fromIntegral latencyLmax
putWord32le $ fromIntegral latencyCurrent
msgUartState :: Word16
msgUartState = 0x0018
-- | SBP class for message MSG_UART_STATE (0x0018).
--
-- The UART message reports data latency and throughput of the UART channels
-- providing SBP I/O. On the default Piksi configuration, UARTs A and B are
-- used for telemetry radios, but can also be host access ports for embedded
-- hosts, or other interfaces in future. The reported percentage values require
-- to be normalized.
data MsgUartState = MsgUartState
{ msgUartStateUartA :: UARTChannel
-- ^ State of UART A
, msgUartStateUartB :: UARTChannel
-- ^ State of UART B
, msgUartStateUartFtdi :: UARTChannel
-- ^ State of UART FTDI (USB logger)
, msgUartStateLatency :: Latency
-- ^ UART communication latency
} deriving ( Show, Read, Eq )
instance Binary MsgUartState where
get = do
msgUartStateUartA <- get
msgUartStateUartB <- get
msgUartStateUartFtdi <- get
msgUartStateLatency <- get
return MsgUartState {..}
put MsgUartState {..} = do
put msgUartStateUartA
put msgUartStateUartB
put msgUartStateUartFtdi
put msgUartStateLatency
msgIarState :: Word16
msgIarState = 0x0019
-- | SBP class for message MSG_IAR_STATE (0x0019).
--
-- This message reports the state of the Integer Ambiguity Resolution (IAR)
-- process, which resolves unknown integer ambiguities from double-differenced
-- carrier-phase measurements from satellite observations.
data MsgIarState = MsgIarState
{ msgIarStateNumHyps :: Word32
-- ^ Number of integer ambiguity hypotheses remaining
} deriving ( Show, Read, Eq )
instance Binary MsgIarState where
get = do
msgIarStateNumHyps <- getWord32le
return MsgIarState {..}
put MsgIarState {..} = do
putWord32le msgIarStateNumHyps
msgMaskSatellite :: Word16
msgMaskSatellite = 0x001B
-- | SBP class for message MSG_MASK_SATELLITE (0x001B).
--
-- This message allows setting a mask to prevent a particular satellite from
-- being used in various Piksi subsystems.
data MsgMaskSatellite = MsgMaskSatellite
{ msgMaskSatelliteMask :: Word8
-- ^ Mask of systems that should ignore this satellite.
, msgMaskSatelliteSid :: Word32
-- ^ Signal identifier for which the mask is applied
} deriving ( Show, Read, Eq )
instance Binary MsgMaskSatellite where
get = do
msgMaskSatelliteMask <- getWord8
msgMaskSatelliteSid <- getWord32le
return MsgMaskSatellite {..}
put MsgMaskSatellite {..} = do
putWord8 msgMaskSatelliteMask
putWord32le msgMaskSatelliteSid