use crate::nmea::field::{FieldReader, FieldWriter, NmeaEncodable};
#[derive(Debug, Clone, PartialEq)]
pub struct Ttd {
pub num_frags: Option<String>,
pub frag_num: Option<String>,
pub msg_id: Option<u8>,
pub payload: Option<String>,
pub fill_bits: Option<u8>,
}
impl Ttd {
pub fn parse(fields: &[&str]) -> Option<Self> {
let mut r = FieldReader::new(fields);
let num_frags = r.string();
let frag_num = r.string();
let msg_id = r.u8();
let payload = r.string();
let fill_bits = r.u8();
Some(Self {
num_frags,
frag_num,
msg_id,
payload,
fill_bits,
})
}
}
impl NmeaEncodable for Ttd {
const SENTENCE_TYPE: &str = "TTD";
fn encode(&self) -> Vec<String> {
let mut w = FieldWriter::new();
w.string(self.num_frags.as_deref());
w.string(self.frag_num.as_deref());
w.u8(self.msg_id);
w.string(self.payload.as_deref());
w.u8(self.fill_bits);
w.finish()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::parse_frame;
#[test]
fn ttd_empty() {
let s = Ttd {
num_frags: None,
frag_num: None,
msg_id: None,
payload: None,
fill_bits: None,
}
.to_sentence("RA");
let f = parse_frame(s.trim()).expect("valid");
let t = Ttd::parse(&f.fields).expect("parse");
assert!(t.num_frags.is_none());
assert!(t.payload.is_none());
assert!(t.fill_bits.is_none());
}
#[test]
fn ttd_encode_roundtrip() {
let original = Ttd {
num_frags: Some("01".to_string()),
frag_num: Some("01".to_string()),
msg_id: Some(1),
payload: Some("testpayload".to_string()),
fill_bits: Some(0),
};
let sentence = original.to_sentence("RA");
let frame = parse_frame(sentence.trim()).expect("re-parse");
let parsed = Ttd::parse(&frame.fields).expect("parse");
assert_eq!(original, parsed);
}
#[test]
fn ttd_rattd_gonmea() {
let original = Ttd {
num_frags: Some("1A".to_string()),
frag_num: Some("01".to_string()),
msg_id: Some(1),
payload: Some("trackdata".to_string()),
fill_bits: Some(0),
};
let sentence = original.to_sentence("RA");
let frame = parse_frame(sentence.trim()).expect("re-parse");
let t = Ttd::parse(&frame.fields).expect("parse TTD");
assert_eq!(t.num_frags, Some("1A".to_string()));
assert_eq!(t.frag_num, Some("01".to_string()));
assert_eq!(t.msg_id, Some(1));
assert_eq!(t.payload, Some("trackdata".to_string()));
assert_eq!(t.fill_bits, Some(0));
}
}