use crate::carrier::Carrier;
#[derive(Debug, Clone, PartialEq, PartialOrd)]
#[cfg_attr(feature = "serde", derive(Serialize))]
pub enum Pattern {
NonAzimuthDependent(Vec<f64>),
AzimuthDependent((f64, Vec<f64>)),
}
impl Default for Pattern {
fn default() -> Self {
Self::NonAzimuthDependent(Vec::new())
}
}
impl Pattern {
pub fn is_azimuth_dependent(&self) -> bool {
matches!(self, Self::AzimuthDependent(_))
}
pub fn pattern(&self) -> Vec<f64> {
match self {
Self::AzimuthDependent((_, values)) => values.clone(),
Self::NonAzimuthDependent(values) => values.clone(),
}
}
pub fn azimuth_pattern(&self) -> Option<(f64, Vec<f64>)> {
match self {
Self::AzimuthDependent((angle, values)) => Some((*angle, values.clone())),
_ => None,
}
}
}
#[derive(Debug, Clone, PartialEq, PartialOrd)]
#[cfg_attr(feature = "serde", derive(Serialize))]
pub struct Frequency {
pub carrier: Carrier,
pub north: f64,
pub east: f64,
pub up: f64,
pub patterns: Vec<Pattern>,
}
impl Default for Frequency {
fn default() -> Self {
Self {
carrier: Carrier::default(),
north: 0.0_f64,
east: 0.0_f64,
up: 0.0_f64,
patterns: Vec::new(),
}
}
}
impl Frequency {
pub fn with_carrier(&self, carrier: Carrier) -> Self {
let mut f = self.clone();
f.carrier = carrier;
f
}
pub fn with_northern_eccentricity(&self, north: f64) -> Self {
let mut f = self.clone();
f.north = north;
f
}
pub fn with_eastern_eccentricity(&self, east: f64) -> Self {
let mut f = self.clone();
f.east = east;
f
}
pub fn with_upper_eccentricity(&self, up: f64) -> Self {
let mut f = self.clone();
f.up = up;
f
}
pub fn add_pattern(&self, p: Pattern) -> Self {
let mut f = self.clone();
f.patterns.push(p.clone());
f
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_pattern() {
let default = Pattern::default();
assert_eq!(default, Pattern::NonAzimuthDependent(Vec::new()));
assert!(!default.is_azimuth_dependent());
}
#[test]
fn test_frequency() {
let default = Frequency::default();
assert_eq!(default.carrier, Carrier::default());
assert_eq!(default.north, 0.0_f64);
assert_eq!(default.east, 0.0_f64);
assert_eq!(default.up, 0.0_f64);
}
}