use super::data::{self, Payload};
use super::{Error, Format};
use std::convert::TryFrom;
const MAGIC_WORD: [u8; 2] = [0x7b, 0x05];
const HEADER_SIZE: usize = 8;
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct Header {
pub format: Format,
pub batches: u8,
pub seq: u32,
}
impl Header {
fn parse(header: &[u8; HEADER_SIZE]) -> Result<Self, Error> {
if header[..2] != MAGIC_WORD {
return Err(Error::InvalidHeader);
}
let format = Format::try_from(header[2]).or(Err(Error::UnknownFormat))?;
let batches = header[3];
let seq = u32::from_le_bytes(header[4..8].try_into().unwrap());
Ok(Self {
format,
batches,
seq,
})
}
}
pub struct Frame {
pub header: Header,
pub data: Box<dyn Payload + Send>,
}
impl Frame {
pub fn from_bytes(input: &[u8]) -> Result<Self, Error> {
let header = Header::parse(&input[..HEADER_SIZE].try_into().unwrap())?;
let data = &input[HEADER_SIZE..];
let data: Box<dyn Payload + Send> = match header.format {
Format::AdcDac => Box::new(data::AdcDac::new(header.batches as _, data)?),
Format::Fls => Box::new(data::Fls::new(header.batches as _, data)?),
};
Ok(Self { header, data })
}
}