use crate::ais::armor::extract_u32;
#[derive(Debug, Clone, PartialEq)]
pub struct AckEntry {
pub mmsi: u32,
pub sequence: u8,
}
#[derive(Debug, Clone, PartialEq)]
pub struct BinaryAck {
pub msg_type: u8,
pub repeat_indicator: u8,
pub mmsi: u32,
pub acks: Vec<AckEntry>,
}
impl BinaryAck {
pub(crate) fn decode(bits: &[u8]) -> Option<Self> {
if bits.len() < 72 {
return None;
}
let msg_type = extract_u32(bits, 0, 6)? as u8;
let repeat_indicator = extract_u32(bits, 6, 2)? as u8;
let mmsi = extract_u32(bits, 8, 30)?;
let mut acks = Vec::new();
let mut offset = 40;
while offset + 32 <= bits.len() && acks.len() < 4 {
let ack_mmsi = extract_u32(bits, offset, 30)?;
let seq = extract_u32(bits, offset + 30, 2)? as u8;
acks.push(AckEntry {
mmsi: ack_mmsi,
sequence: seq,
});
offset += 32;
}
Some(Self {
msg_type,
repeat_indicator,
mmsi,
acks,
})
}
}