use deku::bitvec::{BitVec, Msb0};
use deku::prelude::*;
pub mod types;
mod custom_read_write;
mod modifier;
mod fourty_eight;
pub use fourty_eight::Cat48;
mod thirty_four;
pub use thirty_four::Cat34;
pub mod data_item;
mod fspec;
const ASTERIX_HEADER_SIZE: u16 = 3;
const FSPEC_IDENT: u8 = 0b0000_0001;
#[derive(Debug, Default, PartialEq, DekuRead, DekuWrite)]
#[deku(endian = "big")]
pub struct AsterixPacket {
pub category: u8,
#[deku(update = "Self::update_len(&mut self.messages)")]
pub length: u16,
#[deku(bytes_read = "length - ASTERIX_HEADER_SIZE", ctx = "*category")]
pub messages: Vec<AsterixMessage>,
}
impl AsterixPacket {
pub fn finalize(&mut self) -> Result<(), DekuError> {
for message in &mut self.messages {
message.update_fspec();
}
self.update()
}
fn update_len(messages: &mut [AsterixMessage]) -> u16 {
let mut len: u16 = 0;
for message in messages.iter_mut() {
let mut bits: BitVec<u8, Msb0> = BitVec::new();
message.write(&mut bits, (deku::ctx::Endian::Big, 0)).unwrap();
len += (bits.len() / 8) as u16 + ASTERIX_HEADER_SIZE
}
len
}
}
#[derive(Debug, PartialEq, DekuRead, DekuWrite)]
#[deku(id = "category", ctx = "_: deku::ctx::Endian, category: u8")]
pub enum AsterixMessage {
#[deku(id = "34")]
Cat34(Cat34),
#[deku(id = "48")]
Cat48(Cat48),
}
impl AsterixMessage {
pub fn update_fspec(&mut self) {
match self {
Self::Cat34(c) => c.update_fspec(),
Self::Cat48(c) => c.update_fspec(),
}
}
}