use super::{block_enum, parse_blocks};
use crate::error::Result;
use binrw::BinRead;
use serde::Serialize;
use std::io::Cursor;
block_enum! {
pub enum NavigationBlock {
0 => AttitudeHeading(AttitudeHeading, 12),
1 => AttitudeHeadingStdDev(AttitudeHeadingStdDev, 12),
2 => HeaveSurgeSway(HeaveSurgeSway, 16),
3 => SmartHeave(SmartHeave, 8),
4 => HeadingRollPitchRate(HeadingRollPitchRate, 12),
5 => RotationRateVesselFrame(RotationRateVesselFrame, 12),
6 => AccelerationVesselFrame(AccelerationVesselFrame, 12),
7 => Position(Position, 21),
8 => PositionStdDev(PositionStdDev, 16),
9 => SpeedGeographic(SpeedGeographic, 12),
10 => SpeedStdDev(SpeedStdDev, 12),
11 => CurrentGeographic(CurrentGeographic, 8),
12 => CurrentStdDev(CurrentStdDev, 8),
13 => SystemDate(SystemDate, 4),
14 => SensorStatus(SensorStatus, 8),
15 if version >= 6 => InsAlgorithmStatusV6(InsAlgorithmStatusV6, 24),
15 => InsAlgorithmStatusV5(InsAlgorithmStatusV5, 16),
16 => InsSystemStatus(InsSystemStatus, 12),
17 => InsUserStatus(InsUserStatus, 4),
18 => AhrsAlgorithmStatus(AhrsAlgorithmStatus, 4),
19 => AhrsSystemStatus(AhrsSystemStatus, 12),
20 => AhrsUserStatus(AhrsUserStatus, 4),
21 => HeaveSurgeSwaySpeed(HeaveSurgeSwaySpeed, 12),
22 => SpeedVesselFrame(SpeedVesselFrame, 12),
23 => AccelerationGeographic(AccelerationGeographic, 12),
24 => CourseSpeedOverGround(CourseSpeedOverGround, 8),
25 => Temperatures(Temperatures, 12),
26 => AttitudeQuaternion(AttitudeQuaternion, 16),
27 => AttitudeQuaternionStdDev(AttitudeQuaternionStdDev, 12),
28 => RawAccelerationVesselFrame(RawAccelerationVesselFrame, 12),
29 => AccelerationStdDev(AccelerationStdDev, 12),
30 => RotationRateStdDev(RotationRateStdDev, 12),
}
read_fn(version: u8);
}
pub fn parse_navigation_blocks(
bitmask: u32,
version: u8,
cursor: &mut Cursor<&[u8]>,
) -> Result<Vec<NavigationBlock>> {
parse_blocks(bitmask, 31, |bit| {
NavigationBlock::read(bit, version, cursor).map(Some)
})
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct AttitudeHeading {
pub heading: f32,
pub roll: f32,
pub pitch: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct AttitudeHeadingStdDev {
pub heading_std_dev: f32,
pub roll_std_dev: f32,
pub pitch_std_dev: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct HeaveSurgeSway {
pub heave: f32,
pub heave_at_lever_arm: f32,
pub surge: f32,
pub sway: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct SmartHeave {
pub validity_time: u32,
pub heave: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct HeadingRollPitchRate {
pub heading_rate: f32,
pub roll_rate: f32,
pub pitch_rate: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct RotationRateVesselFrame {
pub xv1: f32,
pub xv2: f32,
pub xv3: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct AccelerationVesselFrame {
pub xv1: f32,
pub xv2: f32,
pub xv3: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct Position {
pub latitude: f64,
pub longitude: f64,
pub altitude_reference: u8,
pub altitude: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct PositionStdDev {
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 SpeedGeographic {
pub north: f32,
pub east: f32,
pub up: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct SpeedStdDev {
pub north_std_dev: f32,
pub east_std_dev: f32,
pub up_std_dev: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct CurrentGeographic {
pub north: f32,
pub east: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct CurrentStdDev {
pub north_std_dev: f32,
pub east_std_dev: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct SystemDate {
pub day: u8,
pub month: u8,
pub year: u16,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct SensorStatus {
pub status1: u32,
pub status2: u32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct InsAlgorithmStatusV5 {
pub status1: u32,
pub status2: u32,
pub status3: u32,
pub status4: u32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct InsAlgorithmStatusV6 {
pub status1: u32,
pub status2: u32,
pub status3: u32,
pub status4: u32,
pub status5: u32,
pub status6: u32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct InsSystemStatus {
pub status1: u32,
pub status2: u32,
pub status3: u32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct InsUserStatus {
pub status: u32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct AhrsAlgorithmStatus {
pub status: u32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct AhrsSystemStatus {
pub status1: u32,
pub status2: u32,
pub status3: u32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct AhrsUserStatus {
pub status: u32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct HeaveSurgeSwaySpeed {
pub heave_speed: f32,
pub surge_speed: f32,
pub sway_speed: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct SpeedVesselFrame {
pub xv1: f32,
pub xv2: f32,
pub xv3: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct AccelerationGeographic {
pub north: f32,
pub east: f32,
pub up: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct CourseSpeedOverGround {
pub course: f32,
pub speed: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct Temperatures {
pub fog: f32,
pub acc: f32,
pub board: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct AttitudeQuaternion {
pub q0: f32,
pub q1: f32,
pub q2: f32,
pub q3: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct AttitudeQuaternionStdDev {
pub e1: f32,
pub e2: f32,
pub e3: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct RawAccelerationVesselFrame {
pub xv1: f32,
pub xv2: f32,
pub xv3: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct AccelerationStdDev {
pub xv1: f32,
pub xv2: f32,
pub xv3: f32,
}
#[derive(Debug, Clone, BinRead, Serialize)]
#[brw(big)]
pub struct RotationRateStdDev {
pub xv1: f32,
pub xv2: f32,
pub xv3: f32,
}