use serde::Serialize;
mod atomic;
mod cband_generic;
mod centispace;
mod iridium;
mod starlink;
mod xona_pulsar;
#[cfg(kshana_celeste)]
use crate::celeste_iod::navmsg as celeste_iod;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum SourceKind {
Public,
Workshop,
Representative,
}
#[derive(Clone, Copy, Debug, Serialize)]
pub struct MessageDefaults {
pub model: &'static str,
pub rac_degrees: [usize; 3],
pub poly_degree: usize,
pub fit_interval_s: f64,
pub update_period_s: f64,
pub zero_clock: bool,
pub steered_sigma_m: f64,
}
#[derive(Clone, Copy, Debug, Serialize)]
pub struct Preset {
pub key: &'static str,
pub name: &'static str,
pub source: SourceKind,
pub source_urls: &'static [&'static str],
pub altitude_km: f64,
pub inclination_deg: f64,
pub carrier_hz: f64,
pub carrier_label: &'static str,
pub message: Option<MessageDefaults>,
pub notes: &'static str,
}
pub fn all() -> Vec<Preset> {
vec![
xona_pulsar::PULSAR,
xona_pulsar::PULSAR_0,
iridium::IRIDIUM,
starlink::STARLINK,
centispace::CENTISPACE,
cband_generic::CBAND,
atomic::ATOMIC,
#[cfg(kshana_celeste)]
celeste_iod::CELESTE_IOD,
]
}
pub fn by_key(key: &str) -> Option<Preset> {
all().into_iter().find(|p| p.key == key)
}
pub fn csv_schema(name: &str) -> Option<crate::leo_navmsg::text::CsvSchema> {
match name {
#[cfg(kshana_celeste)]
"celeste-iod" => Some(celeste_iod::csv_schema()),
_ => None,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn every_preset_names_its_source() {
let all = all();
let mut keys: Vec<&str> = all.iter().map(|p| p.key).collect();
keys.sort_unstable();
keys.dedup();
assert_eq!(keys.len(), all.len(), "duplicate preset key");
for p in &all {
match p.source {
SourceKind::Public => assert!(
p.source_urls.iter().all(|u| u.starts_with("https://"))
&& !p.source_urls.is_empty(),
"{} is PUBLIC and must cite a URL",
p.key
),
SourceKind::Workshop | SourceKind::Representative => {
assert!(!p.notes.is_empty(), "{} must explain its numbers", p.key)
}
}
assert!(p.altitude_km > 150.0 && p.altitude_km < 2500.0, "{}", p.key);
assert!(p.carrier_hz > 1e8, "{}", p.key);
}
}
}