use crate::types;
use deku::prelude::*;
#[derive(Eq, Debug, PartialEq, Clone, DekuRead, DekuWrite)]
pub struct PrimaryHeader {
#[deku(bits = "3")]
pub version: u8,
pub packet_type: types::PacketType,
pub sec_header_flag: types::SecondaryHeaderFlag,
#[deku(bits = "11", endian = "big")]
pub app_proc_id: u16,
pub sequence_flags: types::SeqFlag,
#[deku(bits = "14", endian = "big")]
pub sequence_count: u16,
#[deku(endian = "big")]
pub data_length: u16,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parse_python_spacepacket_primary_header() {
let raw = b"\x00\x00\xc0\x00\x00\x40\xff\xff";
let expected = PrimaryHeader {
version: 0,
packet_type: types::PacketType::Data,
sec_header_flag: types::SecondaryHeaderFlag::NotPresent,
app_proc_id: 0,
sequence_flags: types::SeqFlag::Unsegmented,
sequence_count: 0,
data_length: 64,
};
let (rest, parsed) = PrimaryHeader::from_bytes((raw, 0)).expect("failed to parse header");
assert_eq!(parsed, expected);
assert_eq!(rest.0, [255,255])
}
#[test]
fn parse_incomplete_primary_header() {
let raw_short = b"\x00\x00\xc0\x00\x00";
let expected = PrimaryHeader {
version: 0,
packet_type: types::PacketType::Data,
sec_header_flag: types::SecondaryHeaderFlag::NotPresent,
app_proc_id: 0,
sequence_flags: types::SeqFlag::Unsegmented,
sequence_count: 0,
data_length: 64,
};
let inc = PrimaryHeader::from_bytes((raw_short, 0));
assert_eq!(inc.is_err(), true);
let raw = b"\x00\x00\xc0\x00\x00\x40";
let (rest, parsed) = PrimaryHeader::from_bytes((raw, 0)).expect("failed to parse header");
assert_eq!(parsed, expected);
}
}