use serde::Deserialize;
use std::fmt::Debug;
use crate::messages::primitive_aliases::{Code1, Code2, Integer1, Integer2, Integer4};
use crate::messages::volume_coverage_pattern::definitions::*;
#[cfg(feature = "uom")]
use uom::si::{f64::Velocity, velocity::meter_per_second};
#[derive(Clone, PartialEq, Deserialize)]
pub struct Header {
pub message_size: Integer2,
pub pattern_type: Code2,
pub pattern_number: Integer2,
pub number_of_elevation_cuts: Integer2,
pub version: Integer1,
pub clutter_map_group_number: Integer1,
pub doppler_velocity_resolution: Code1,
pub pulse_width: Code1,
pub reserved_1: Integer4,
pub vcp_sequencing: Code2,
pub vcp_supplemental_data: Code2,
pub reserved_2: Integer2,
}
impl Header {
pub fn pattern_type(&self) -> PatternType {
match self.pattern_type {
2 => PatternType::Constant,
_ => PatternType::Unknown,
}
}
#[cfg(feature = "uom")]
pub fn doppler_velocity_resolution(&self) -> Option<Velocity> {
match self.doppler_velocity_resolution {
2 => Some(Velocity::new::<meter_per_second>(0.5)),
4 => Some(Velocity::new::<meter_per_second>(1.0)),
_ => None,
}
}
pub fn doppler_velocity_resolution_meters_per_second(&self) -> Option<f64> {
match self.doppler_velocity_resolution {
2 => Some(0.5),
4 => Some(1.0),
_ => None,
}
}
pub fn pulse_width(&self) -> PulseWidth {
match self.pulse_width {
2 => PulseWidth::Short,
4 => PulseWidth::Long,
_ => PulseWidth::Unknown,
}
}
pub fn vcp_sequencing_number_of_elevations(&self) -> u8 {
(self.vcp_sequencing & 0x001F) as u8
}
pub fn vcp_sequencing_maximum_sails_cuts(&self) -> u8 {
((self.vcp_sequencing & 0x0060) >> 5) as u8
}
pub fn vcp_sequencing_sequence_active(&self) -> bool {
((self.vcp_sequencing & 0x2000) >> 13) == 1
}
pub fn vcp_sequencing_truncated_vcp(&self) -> bool {
((self.vcp_sequencing & 0x4000) >> 14) == 1
}
pub fn vcp_supplemental_data_sails_vcp(&self) -> bool {
(self.vcp_supplemental_data & 0x0001) == 1
}
pub fn vcp_supplemental_data_number_sails_cuts(&self) -> u8 {
((self.vcp_supplemental_data & 0x000E) >> 1) as u8
}
pub fn vcp_supplemental_data_mrle_vcp(&self) -> bool {
((self.vcp_supplemental_data & 0x0010) >> 4) == 1
}
pub fn vcp_supplemental_data_number_mrle_cuts(&self) -> u8 {
((self.vcp_supplemental_data & 0x00E0) >> 5) as u8
}
pub fn vcp_supplemental_data_mpda_vcp(&self) -> bool {
((self.vcp_supplemental_data & 0x0800) >> 11) == 1
}
pub fn vcp_supplemental_data_base_tilt_vcp(&self) -> bool {
((self.vcp_supplemental_data & 0x1000) >> 12) == 1
}
pub fn vcp_supplemental_data_base_tilts(&self) -> u8 {
((self.vcp_supplemental_data & 0xE000) >> 13) as u8
}
}
impl Debug for Header {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let mut debug = f.debug_struct("Header");
debug.field("message_size", &self.message_size);
debug.field("pattern_type", &self.pattern_type());
debug.field("pattern_number", &self.pattern_number);
debug.field("number_of_elevation_cuts", &self.number_of_elevation_cuts);
debug.field("version", &self.version);
debug.field("clutter_map_group_number", &self.clutter_map_group_number);
#[cfg(feature = "uom")]
debug.field(
"doppler_velocity_resolution",
&self.doppler_velocity_resolution(),
);
#[cfg(not(feature = "uom"))]
debug.field(
"doppler_velocity_resolution",
&self.doppler_velocity_resolution_meters_per_second(),
);
debug.field("pulse_width", &self.pulse_width());
debug.field("reserved_1", &self.reserved_1);
debug.field("vcp_sequencing_raw", &self.vcp_sequencing);
debug.field(
"vcp_sequencing_number_of_elevations",
&self.vcp_sequencing_number_of_elevations(),
);
debug.field(
"vcp_sequencing_maximum_sails_cuts",
&self.vcp_sequencing_maximum_sails_cuts(),
);
debug.field(
"vcp_sequencing_sequence_active",
&self.vcp_sequencing_sequence_active(),
);
debug.field(
"vcp_sequencing_truncated_vcp",
&self.vcp_sequencing_truncated_vcp(),
);
debug.field("vcp_supplemental_data_raw", &self.vcp_supplemental_data);
debug.field(
"vcp_supplemental_data_sails_vcp",
&self.vcp_supplemental_data_sails_vcp(),
);
debug.field(
"vcp_supplemental_data_number_sails_cuts",
&self.vcp_supplemental_data_number_sails_cuts(),
);
debug.field(
"vcp_supplemental_data_mrle_vcp",
&self.vcp_supplemental_data_mrle_vcp(),
);
debug.field(
"vcp_supplemental_data_number_mrle_cuts",
&self.vcp_supplemental_data_number_mrle_cuts(),
);
debug.field(
"vcp_supplemental_data_mpda_vcp",
&self.vcp_supplemental_data_mpda_vcp(),
);
debug.field(
"vcp_supplemental_data_base_tilt_vcp",
&self.vcp_supplemental_data_base_tilt_vcp(),
);
debug.field(
"vcp_supplemental_data_base_tilts",
&self.vcp_supplemental_data_base_tilts(),
);
debug.field("reserved_2", &self.reserved_2);
debug.finish()
}
}