use hifitime::Epoch;
use super::{Apid, Packet, PrimaryHeader};
use crate::prelude::*;
use std::collections::HashMap;
use crate::timecode::{decode as decode_timecode, Format};
pub struct TimecodeDecoder {
formats: HashMap<Apid, Format>,
default: Format,
}
impl TimecodeDecoder {
pub fn new(default: Format) -> Self {
Self {
formats: HashMap::default(),
default,
}
}
pub fn register(&mut self, format: Format, apids: &[Apid]) {
apids.iter().for_each(|a| {
self.formats.insert(*a, format.clone());
});
}
pub fn decode(&self, packet: &Packet) -> Result<Epoch> {
let fmt = self
.formats
.get(&packet.header.apid)
.unwrap_or(&self.default);
decode_timecode(fmt, &packet.data[PrimaryHeader::LEN..])
}
}
#[cfg(test)]
mod tests {
use crate::spacepacket::PrimaryHeader;
use super::*;
#[test]
fn test_cds() {
let dat: Vec<u8> = vec![
0x0b, 0x20, 0x52, 0xc4, 0x00, 0xad, 0x5c, 0xbd, 0x03, 0xc4, 0x1a, 0x6e, 0x03, 0xc9,
];
let packet = Packet {
header: PrimaryHeader::decode(&dat).unwrap(),
data: dat,
offset: 0,
};
let decoder = TimecodeDecoder::new(Format::Cds {
num_day: 2,
num_submillis: 2,
});
let timecode = decoder.decode(&packet).unwrap();
assert_eq!(timecode.to_string(), "2023-01-01T17:33:03.470969000 UTC");
}
}