libsbf 0.18.0

A no_std rust crate to parse Septentrio SBF Messages.
use crate::binrw_util;
use alloc::vec::Vec;
use binrw::binrw;
use bitflags::bitflags;

// External Sensor Measurement Block 4050
#[binrw]
#[derive(Clone, Debug)]
pub struct ExtSensorMeas {
    #[br(map = binrw_util::map_u4)]
    #[bw(map = binrw_util::unmap_u4)]
    pub tow: Option<u32>,
    #[br(map = binrw_util::map_u2)]
    #[bw(map = binrw_util::unmap_u2)]
    pub wnc: Option<u16>,
    pub n: u8,
    pub sb_length: u8,
    #[br(args { count: usize::from(n), inner: (usize::from(sb_length),) }, map = binrw_util::unwrap_subblocks)]
    #[bw(args_raw = (usize::from(*sb_length),), map = binrw_util::wrap_subblocks)]
    pub ext_sensor_meas_set: Vec<ExtSensorMeasSet>,
}

#[repr(u8)]
pub enum ExtSensorMeasSetType {
    Acceleration = 0,
    AngularRate = 1,
    _Reserved = 2,
    Info = 3,
    Velocity = 4,
    ZeroVelocityFlag = 20,
}

bitflags! {
    /// ObsInfo bit field of an [`ExtSensorMeasSet`] sub-block.
    #[derive(Debug, Clone, Copy, PartialEq, Eq)]
    pub struct ExtSensorMeasObsInfo: u8 {
        /// Bit 0: measurements are temperature compensated.
        const TEMP_COMPENSATED = 1 << 0;
        /// Bit 1: sensor is saturated.
        const SATURATED = 1 << 1;
        /// Bit 2: measurements are scrambled since the "Measurement
        /// Availability" permission is not granted.
        const SCRAMBLED = 1 << 2;
        /// Bits 3-4: proprietary.
        const PROPRIETARY = (1 << 3) | (1 << 4);
        /// Bit 5: sensor data did not pass the internal sanity check.
        const SANITY_CHECK_FAILED = 1 << 5;
    }
}

#[binrw]
#[derive(Clone, Debug)]
pub struct ExtSensorMeasSet {
    pub source: u8,
    pub sensor_model: u8,
    pub type_: u8,
    #[br(map = |x: u8| ExtSensorMeasObsInfo::from_bits_retain(x))]
    #[bw(map = |x: &ExtSensorMeasObsInfo| x.bits())]
    pub obs_info: ExtSensorMeasObsInfo,

    #[br(if(type_ == ExtSensorMeasSetType::Acceleration as u8))]
    pub acc: Option<ExtSensorMeasAcceleration>,
    #[br(if(type_ == ExtSensorMeasSetType::AngularRate as u8))]
    pub ang_rate: Option<ExtSensorMeasAngularRate>,
    #[br(if(type_ == ExtSensorMeasSetType::Info as u8))]
    pub info: Option<ExtSensorMeasInfo>,
    #[br(if(type_ == ExtSensorMeasSetType::Velocity as u8))]
    pub vel: Option<ExtSensorMeasVelocity>,
    #[br(if(type_ == ExtSensorMeasSetType::ZeroVelocityFlag as u8))]
    pub zero_vel_flag: Option<ExtSensorMeasZeroVelocityFlag>,
}

#[binrw]
#[derive(Clone, Debug)]
pub struct ExtSensorMeasAcceleration {
    #[br(map = binrw_util::map_f8)]
    #[bw(map = binrw_util::unmap_f8)]
    pub ax: Option<f64>,
    #[br(map = binrw_util::map_f8)]
    #[bw(map = binrw_util::unmap_f8)]
    pub ay: Option<f64>,
    #[br(map = binrw_util::map_f8)]
    #[bw(map = binrw_util::unmap_f8)]
    pub az: Option<f64>,
}

#[binrw]
#[derive(Clone, Debug)]
pub struct ExtSensorMeasAngularRate {
    #[br(map = binrw_util::map_f8)]
    #[bw(map = binrw_util::unmap_f8)]
    pub wx: Option<f64>,
    #[br(map = binrw_util::map_f8)]
    #[bw(map = binrw_util::unmap_f8)]
    pub wy: Option<f64>,
    #[br(map = binrw_util::map_f8)]
    #[bw(map = binrw_util::unmap_f8)]
    pub wz: Option<f64>,
}

#[binrw]
#[derive(Clone, Debug)]
pub struct ExtSensorMeasVelocity {
    #[br(map = binrw_util::map_f4)]
    #[bw(map = binrw_util::unmap_f4)]
    pub vx: Option<f32>,
    #[br(map = binrw_util::map_f4)]
    #[bw(map = binrw_util::unmap_f4)]
    pub vy: Option<f32>,
    #[br(map = binrw_util::map_f4)]
    #[bw(map = binrw_util::unmap_f4)]
    pub vz: Option<f32>,
    #[br(map = binrw_util::map_f4)]
    #[bw(map = binrw_util::unmap_f4)]
    pub stdx: Option<f32>,
    #[br(map = binrw_util::map_f4)]
    #[bw(map = binrw_util::unmap_f4)]
    pub stdy: Option<f32>,
    #[br(map = binrw_util::map_f4)]
    #[bw(map = binrw_util::unmap_f4)]
    pub stdz: Option<f32>,
}

#[binrw]
#[derive(Clone, Debug)]
pub struct ExtSensorMeasInfo {
    #[br(map = binrw_util::map_i2)]
    #[bw(map = binrw_util::unmap_i2)]
    pub sensor_temp: Option<i16>,
    pub _reserved: [u8; 22],
}

#[binrw]
#[derive(Clone, Debug)]
pub struct ExtSensorMeasZeroVelocityFlag {
    pub zero_v_flag: f64,
    pub _reserved: [u8; 16],
}