use crate::messages::digital_radar_data::{DataBlockId, ProcessingStatus, VolumeCoveragePattern};
use crate::messages::primitive_aliases::{Integer1, Integer2, Real4, SInteger2};
use serde::Deserialize;
use std::fmt::Debug;
#[cfg(feature = "uom")]
use uom::si::f64::{Angle, Energy, Information, Length};
#[derive(Clone, PartialEq, Deserialize)]
pub struct VolumeDataBlock {
pub data_block_id: DataBlockId,
pub lrtup: Integer2,
pub major_version_number: Integer1,
pub minor_version_number: Integer1,
pub latitude: Real4,
pub longitude: Real4,
pub site_height: SInteger2,
pub feedhorn_height: Integer2,
pub calibration_constant: Real4,
pub horizontal_shv_tx_power: Real4,
pub vertical_shv_tx_power: Real4,
pub system_differential_reflectivity: Real4,
pub initial_system_differential_phase: Real4,
pub volume_coverage_pattern_number: Integer2,
pub processing_status: Integer2,
pub zdr_bias_estimate_weighted_mean: Integer2,
pub spare: [u8; 6],
}
impl VolumeDataBlock {
#[cfg(feature = "uom")]
pub fn lrtup(&self) -> Information {
Information::new::<uom::si::information::byte>(self.lrtup as f64)
}
#[cfg(feature = "uom")]
pub fn latitude(&self) -> Angle {
Angle::new::<uom::si::angle::degree>(self.latitude as f64)
}
#[cfg(feature = "uom")]
pub fn longitude(&self) -> Angle {
Angle::new::<uom::si::angle::degree>(self.longitude as f64)
}
#[cfg(feature = "uom")]
pub fn site_height(&self) -> Length {
Length::new::<uom::si::length::meter>(self.site_height as f64)
}
#[cfg(feature = "uom")]
pub fn feedhorn_height(&self) -> Length {
Length::new::<uom::si::length::meter>(self.feedhorn_height as f64)
}
#[cfg(feature = "uom")]
pub fn horizontal_shv_tx_power(&self) -> Energy {
Energy::new::<uom::si::energy::kilojoule>(self.horizontal_shv_tx_power as f64)
}
#[cfg(feature = "uom")]
pub fn vertical_shv_tx_power(&self) -> Energy {
Energy::new::<uom::si::energy::kilojoule>(self.vertical_shv_tx_power as f64)
}
#[cfg(feature = "uom")]
pub fn initial_system_differential_phase(&self) -> Angle {
Angle::new::<uom::si::angle::degree>(self.initial_system_differential_phase as f64)
}
pub fn volume_coverage_pattern(&self) -> VolumeCoveragePattern {
match self.volume_coverage_pattern_number {
12 => VolumeCoveragePattern::VCP12,
31 => VolumeCoveragePattern::VCP31,
35 => VolumeCoveragePattern::VCP35,
112 => VolumeCoveragePattern::VCP112,
212 => VolumeCoveragePattern::VCP212,
215 => VolumeCoveragePattern::VCP215,
_ => panic!(
"Invalid volume coverage pattern number: {}",
self.volume_coverage_pattern_number
),
}
}
pub fn processing_status(&self) -> ProcessingStatus {
match self.processing_status {
0 => ProcessingStatus::RxRNoise,
1 => ProcessingStatus::CBT,
_ => ProcessingStatus::Other(self.processing_status),
}
}
}
#[cfg(not(feature = "uom"))]
impl Debug for VolumeDataBlock {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("VolumeDataBlock")
.field("data_block_id", &self.data_block_id)
.field("lrtup", &self.lrtup)
.field("major_version_number", &self.major_version_number)
.field("minor_version_number", &self.minor_version_number)
.field("latitude", &self.latitude)
.field("longitude", &self.longitude)
.field("site_height", &self.site_height)
.field("feedhorn_height", &self.feedhorn_height)
.field("calibration_constant", &self.calibration_constant)
.field("horizontal_shv_tx_power", &self.horizontal_shv_tx_power)
.field("vertical_shv_tx_power", &self.vertical_shv_tx_power)
.field(
"system_differential_reflectivity",
&self.system_differential_reflectivity,
)
.field(
"initial_system_differential_phase",
&self.initial_system_differential_phase,
)
.field(
"volume_coverage_pattern_number",
&self.volume_coverage_pattern_number,
)
.field("processing_status", &self.processing_status())
.field(
"zdr_bias_estimate_weighted_mean",
&self.zdr_bias_estimate_weighted_mean,
)
.field("spare", &self.spare)
.finish()
}
}
#[cfg(feature = "uom")]
impl Debug for VolumeDataBlock {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("VolumeDataBlock")
.field("data_block_id", &self.data_block_id)
.field("lrtup", &self.lrtup())
.field("major_version_number", &self.major_version_number)
.field("minor_version_number", &self.minor_version_number)
.field("latitude", &self.latitude())
.field("longitude", &self.longitude())
.field("site_height", &self.site_height())
.field("feedhorn_height", &self.feedhorn_height())
.field("calibration_constant", &self.calibration_constant)
.field("horizontal_shv_tx_power", &self.horizontal_shv_tx_power())
.field("vertical_shv_tx_power", &self.vertical_shv_tx_power())
.field(
"system_differential_reflectivity",
&self.system_differential_reflectivity,
)
.field(
"initial_system_differential_phase",
&self.initial_system_differential_phase(),
)
.field(
"volume_coverage_pattern_number",
&self.volume_coverage_pattern_number,
)
.field("processing_status", &self.processing_status())
.field(
"zdr_bias_estimate_weighted_mean",
&self.zdr_bias_estimate_weighted_mean,
)
.field("spare", &self.spare)
.finish()
}
}