use serde::Serialize;
use super::*;
#[derive(Clone, Debug, PartialEq, Serialize)]
pub struct AlmData {
pub source: NavigationSystem,
pub prn: Option<u8>,
pub week_number: Option<u16>,
pub health_bits: Option<u8>,
pub eccentricity: Option<u16>,
pub reference_time: Option<u8>,
pub sigma: Option<u16>,
pub omega_dot: Option<u16>,
pub root_a: Option<u32>,
pub omega: Option<u32>,
pub omega_o: Option<u32>,
pub mo: Option<u32>,
pub af0: Option<u16>,
pub af1: Option<u16>,
}
pub(crate) fn handle(
sentence: &str,
nav_system: NavigationSystem,
) -> Result<ParsedMessage, ParseError> {
let split: Vec<&str> = sentence.split(',').collect();
Ok(ParsedMessage::Alm(AlmData {
source: nav_system,
prn: pick_hex_field(&split, 3)?,
week_number: { pick_hex_field::<u16>(&split, 4)?.map(|wk| wk & 0x3ff) },
health_bits: pick_hex_field(&split, 5)?,
eccentricity: pick_hex_field(&split, 6)?,
reference_time: pick_hex_field(&split, 7)?,
sigma: pick_hex_field(&split, 8)?,
omega_dot: pick_hex_field(&split, 9)?,
root_a: pick_hex_field(&split, 10)?,
omega: pick_hex_field(&split, 11)?,
omega_o: pick_hex_field(&split, 12)?,
mo: pick_hex_field(&split, 13)?,
af0: pick_hex_field(&split, 14)?,
af1: pick_hex_field(&split, 15)?,
}))
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_parse_cpalm() {
match NmeaParser::new().parse_sentence(
"$GPALM,31,1,02,1617,00,50F6,0F,FD98,FD39,A10CF3,81389B,423632,BD913C,148,001*",
) {
Ok(ps) => match ps {
ParsedMessage::Alm(alm) => {
assert_eq!(alm.source, NavigationSystem::Gps);
assert_eq!(alm.prn, Some(2));
assert_eq!(alm.week_number, Some(535));
assert_eq!(alm.health_bits, Some(0));
assert_eq!(alm.eccentricity, Some(0x50F6));
assert_eq!(alm.reference_time, Some(0x0f));
assert_eq!(alm.sigma, Some(0xfd98));
assert_eq!(alm.omega_dot, Some(0xfd39));
assert_eq!(alm.root_a, Some(0xa10cf3));
assert_eq!(alm.omega, Some(0x81389b));
assert_eq!(alm.omega_o, Some(0x423632));
assert_eq!(alm.mo, Some(0xbd913c));
assert_eq!(alm.af0, Some(0x148));
assert_eq!(alm.af1, Some(0x001));
}
ParsedMessage::Incomplete => {
assert!(false);
}
_ => {
assert!(false);
}
},
Err(e) => {
assert_eq!(e.to_string(), "OK");
}
}
}
}