use super::{block_enum, parse_blocks};
use crate::error::Result;
use binrw::BinRead;
use serde::Serialize;
use std::io::Cursor;
block_enum! {
pub enum ExtendedNavigationBlock {
0 => RotationAccelerationVesselFrame(RotationAccelerationVesselFrame, 12),
1 => RotationAccelerationStdDev(RotationAccelerationStdDev, 12),
2 => RawRotationRateVesselFrame(RawRotationRateVesselFrame, 12),
3 => VehicleAttitudeHeading(VehicleAttitudeHeading, 12),
4 => VehicleAttitudeHeadingStdDev(VehicleAttitudeHeadingStdDev, 12),
5 => VehiclePosition(VehiclePosition, 21),
6 => VehiclePositionStdDev(VehiclePositionStdDev, 16),
7 => SetAndDrift(SetAndDrift, 8),
}
read_fn();
}
pub fn parse_extended_navigation_blocks(
bitmask: u32,
cursor: &mut Cursor<&[u8]>,
) -> Result<Vec<ExtendedNavigationBlock>> {
parse_blocks(bitmask, 8, |bit| {
ExtendedNavigationBlock::read(bit, cursor).map(Some)
})
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct RotationAccelerationVesselFrame {
pub xv1: f32,
pub xv2: f32,
pub xv3: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct RotationAccelerationStdDev {
pub xv1: f32,
pub xv2: f32,
pub xv3: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct RawRotationRateVesselFrame {
pub xv1: f32,
pub xv2: f32,
pub xv3: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct VehicleAttitudeHeading {
pub heading: f32,
pub roll: f32,
pub pitch: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct VehicleAttitudeHeadingStdDev {
pub heading_std_dev: f32,
pub roll_std_dev: f32,
pub pitch_std_dev: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct VehiclePosition {
pub latitude: f64,
pub longitude: f64,
pub altitude_reference: u8,
pub altitude: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct VehiclePositionStdDev {
pub north_std_dev: f32,
pub east_std_dev: f32,
pub north_east_correlation: f32,
pub altitude_std_dev: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct SetAndDrift {
pub set: f32,
pub drift: f32,
}