use crate::bias;
use rinex::constellation::Constellation;
use std::collections::HashMap;
#[derive(Debug, Clone)]
pub struct Description {
pub sampling: Option<u32>,
pub spacing: Option<u32>,
pub method: Option<bias::DeterminationMethod>,
pub bias_mode: bias::header::BiasMode,
pub system: bias::TimeSystem,
pub rcvr_clock_ref: Option<Constellation>,
pub sat_clock_ref: HashMap<Constellation, Vec<String>>,
}
impl Default for Description {
fn default() -> Self {
Self {
sampling: None,
spacing: None,
method: None,
bias_mode: bias::header::BiasMode::default(),
system: bias::TimeSystem::default(),
rcvr_clock_ref: None,
sat_clock_ref: HashMap::new(),
}
}
}
impl Description {
pub fn with_sampling(&self, sampling: u32) -> Self {
Self {
sampling: Some(sampling),
spacing: self.spacing.clone(),
method: self.method.clone(),
bias_mode: self.bias_mode.clone(),
system: self.system.clone(),
rcvr_clock_ref: self.rcvr_clock_ref.clone(),
sat_clock_ref: self.sat_clock_ref.clone(),
}
}
pub fn with_spacing(&self, spacing: u32) -> Self {
Self {
sampling: self.sampling.clone(),
spacing: Some(spacing),
method: self.method.clone(),
bias_mode: self.bias_mode.clone(),
system: self.system.clone(),
rcvr_clock_ref: self.rcvr_clock_ref.clone(),
sat_clock_ref: self.sat_clock_ref.clone(),
}
}
pub fn with_method(&self, method: bias::DeterminationMethod) -> Self {
Self {
sampling: self.sampling.clone(),
spacing: self.spacing.clone(),
method: Some(method),
bias_mode: self.bias_mode.clone(),
system: self.system.clone(),
rcvr_clock_ref: self.rcvr_clock_ref.clone(),
sat_clock_ref: self.sat_clock_ref.clone(),
}
}
pub fn with_bias_mode(&self, mode: bias::header::BiasMode) -> Self {
Self {
sampling: self.sampling.clone(),
spacing: self.spacing.clone(),
method: self.method.clone(),
bias_mode: mode,
system: self.system.clone(),
rcvr_clock_ref: self.rcvr_clock_ref.clone(),
sat_clock_ref: self.sat_clock_ref.clone(),
}
}
pub fn with_time_system(&self, system: bias::TimeSystem) -> Self {
Self {
sampling: self.sampling.clone(),
spacing: self.spacing.clone(),
method: self.method.clone(),
bias_mode: self.bias_mode.clone(),
system,
rcvr_clock_ref: self.rcvr_clock_ref.clone(),
sat_clock_ref: self.sat_clock_ref.clone(),
}
}
pub fn with_rcvr_clock_ref(&self, clock_ref: Constellation) -> Self {
Self {
sampling: self.sampling.clone(),
spacing: self.spacing.clone(),
method: self.method.clone(),
bias_mode: self.bias_mode.clone(),
system: self.system.clone(),
rcvr_clock_ref: Some(clock_ref),
sat_clock_ref: self.sat_clock_ref.clone(),
}
}
pub fn with_sat_clock_ref(&self, c: Constellation, observable: &str) -> Self {
Self {
sampling: self.sampling.clone(),
spacing: self.spacing.clone(),
method: self.method.clone(),
bias_mode: self.bias_mode.clone(),
system: self.system.clone(),
rcvr_clock_ref: self.rcvr_clock_ref.clone(),
sat_clock_ref: {
let mut map = self.sat_clock_ref.clone();
if let Some(codes) = map.get_mut(&c) {
if !codes.contains(&observable.to_string()) {
codes.push(observable.to_string());
}
} else {
map.insert(c, vec![observable.to_string()]);
}
map
},
}
}
}