use crate::data::MomentData;
use std::fmt::Debug;
#[cfg(feature = "chrono")]
use chrono::{DateTime, Utc};
#[cfg(feature = "uom")]
use uom::si::{angle::degree, f32::Angle};
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Radial {
collection_timestamp: i64,
azimuth_number: u16,
azimuth_angle_degrees: f32,
azimuth_spacing_degrees: f32,
radial_status: RadialStatus,
elevation_number: u8,
elevation_angle_degrees: f32,
reflectivity: Option<MomentData>,
velocity: Option<MomentData>,
spectrum_width: Option<MomentData>,
differential_reflectivity: Option<MomentData>,
differential_phase: Option<MomentData>,
correlation_coefficient: Option<MomentData>,
specific_differential_phase: Option<MomentData>,
}
impl Radial {
pub fn new(
collection_timestamp: i64,
azimuth_number: u16,
azimuth_angle_degrees: f32,
azimuth_spacing_degrees: f32,
radial_status: RadialStatus,
elevation_number: u8,
elevation_angle_degrees: f32,
reflectivity: Option<MomentData>,
velocity: Option<MomentData>,
spectrum_width: Option<MomentData>,
differential_reflectivity: Option<MomentData>,
differential_phase: Option<MomentData>,
correlation_coefficient: Option<MomentData>,
specific_differential_phase: Option<MomentData>,
) -> Self {
Self {
collection_timestamp,
azimuth_number,
azimuth_angle_degrees,
azimuth_spacing_degrees,
radial_status,
elevation_number,
elevation_angle_degrees,
reflectivity,
velocity,
spectrum_width,
differential_reflectivity,
differential_phase,
correlation_coefficient,
specific_differential_phase,
}
}
pub fn collection_timestamp(&self) -> i64 {
self.collection_timestamp
}
#[cfg(feature = "chrono")]
pub fn collection_time(&self) -> Option<DateTime<Utc>> {
DateTime::from_timestamp_millis(self.collection_timestamp)
}
pub fn azimuth_number(&self) -> u16 {
self.azimuth_number
}
pub fn azimuth_angle_degrees(&self) -> f32 {
self.azimuth_angle_degrees
}
#[cfg(feature = "uom")]
pub fn azimuth(&self) -> Angle {
Angle::new::<degree>(self.azimuth_angle_degrees)
}
pub fn azimuth_spacing_degrees(&self) -> f32 {
self.azimuth_spacing_degrees
}
#[cfg(feature = "uom")]
pub fn azimuth_spacing(&self) -> Angle {
Angle::new::<degree>(self.azimuth_spacing_degrees)
}
pub fn radial_status(&self) -> RadialStatus {
self.radial_status
}
pub fn elevation_number(&self) -> u8 {
self.elevation_number
}
pub fn elevation_angle_degrees(&self) -> f32 {
self.elevation_angle_degrees
}
#[cfg(feature = "uom")]
pub fn elevation_angle(&self) -> Angle {
Angle::new::<degree>(self.elevation_angle_degrees)
}
pub fn reflectivity(&self) -> Option<&MomentData> {
self.reflectivity.as_ref()
}
pub fn velocity(&self) -> Option<&MomentData> {
self.velocity.as_ref()
}
pub fn spectrum_width(&self) -> Option<&MomentData> {
self.spectrum_width.as_ref()
}
pub fn differential_reflectivity(&self) -> Option<&MomentData> {
self.differential_reflectivity.as_ref()
}
pub fn differential_phase(&self) -> Option<&MomentData> {
self.differential_phase.as_ref()
}
pub fn correlation_coefficient(&self) -> Option<&MomentData> {
self.correlation_coefficient.as_ref()
}
pub fn specific_differential_phase(&self) -> Option<&MomentData> {
self.specific_differential_phase.as_ref()
}
}
impl Debug for Radial {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let mut debug = f.debug_struct("Radial");
debug.field("collection_timestamp", &self.collection_timestamp());
#[cfg(feature = "chrono")]
debug.field("collection_time", &self.collection_time());
debug.field("azimuth_number", &self.azimuth_number());
debug.field("azimuth_angle_degrees", &self.azimuth_angle_degrees());
#[cfg(feature = "uom")]
debug.field("azimuth_angle", &self.azimuth());
debug.field("azimuth_spacing_degrees", &self.azimuth_spacing_degrees());
#[cfg(feature = "uom")]
debug.field("azimuth_spacing", &self.azimuth_spacing());
debug.field("radial_status", &self.radial_status());
debug.field("elevation_number", &self.elevation_number());
debug.field("elevation_angle_degrees", &self.elevation_angle_degrees());
#[cfg(feature = "uom")]
debug.field("elevation_angle", &self.elevation_angle());
debug.field("reflectivity", &self.reflectivity());
debug.field("velocity", &self.velocity());
debug.field("spectrum_width", &self.spectrum_width());
debug.field(
"differential_reflectivity",
&self.differential_reflectivity(),
);
debug.field("differential_phase", &self.differential_phase());
debug.field("correlation_coefficient", &self.correlation_coefficient());
debug.field(
"specific_differential_phase",
&self.specific_differential_phase(),
);
debug.finish()
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum RadialStatus {
ElevationStart,
IntermediateRadialData,
ElevationEnd,
VolumeScanStart,
VolumeScanEnd,
ElevationStartVCPFinal,
}