use core::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum GnssSystem {
Gps,
Glonass,
Galileo,
BeiDou,
Qzss,
Navic,
Sbas,
}
impl GnssSystem {
pub const fn letter(self) -> char {
match self {
GnssSystem::Gps => 'G',
GnssSystem::Glonass => 'R',
GnssSystem::Galileo => 'E',
GnssSystem::BeiDou => 'C',
GnssSystem::Qzss => 'J',
GnssSystem::Navic => 'I',
GnssSystem::Sbas => 'S',
}
}
pub const fn from_letter(letter: char) -> Option<Self> {
match letter {
'G' => Some(GnssSystem::Gps),
'R' => Some(GnssSystem::Glonass),
'E' => Some(GnssSystem::Galileo),
'C' => Some(GnssSystem::BeiDou),
'J' => Some(GnssSystem::Qzss),
'I' => Some(GnssSystem::Navic),
'S' => Some(GnssSystem::Sbas),
_ => None,
}
}
}
impl fmt::Display for GnssSystem {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(match self {
GnssSystem::Gps => "GPS",
GnssSystem::Glonass => "GLO",
GnssSystem::Galileo => "GAL",
GnssSystem::BeiDou => "BDS",
GnssSystem::Qzss => "QZSS",
GnssSystem::Navic => "NavIC",
GnssSystem::Sbas => "SBAS",
})
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct GnssSatelliteId {
pub system: GnssSystem,
pub prn: u8,
}
impl GnssSatelliteId {
pub const fn new(system: GnssSystem, prn: u8) -> Self {
Self { system, prn }
}
}
impl fmt::Display for GnssSatelliteId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}{:02}", self.system.letter(), self.prn)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn letter_round_trips() {
for sys in [
GnssSystem::Gps,
GnssSystem::Glonass,
GnssSystem::Galileo,
GnssSystem::BeiDou,
GnssSystem::Qzss,
GnssSystem::Navic,
GnssSystem::Sbas,
] {
assert_eq!(GnssSystem::from_letter(sys.letter()), Some(sys));
}
assert_eq!(GnssSystem::from_letter('X'), None);
}
#[test]
fn satellite_token_formats_padded() {
let id = GnssSatelliteId::new(GnssSystem::Gps, 1);
assert_eq!(id.to_string(), "G01");
assert_eq!(
GnssSatelliteId::new(GnssSystem::BeiDou, 30).to_string(),
"C30"
);
}
}