diff --git a/CHANGELOG.md b/CHANGELOG.md index 11fe4b0..36540f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,18 @@ and this project adheres to [Semantic Versioning](http://semver.org/). # [unreleased] +# [v0.11.1] 2024-04-20 + +## Fixed + +- The default data length for for `SpHeader` constructors where the data field length is not + specified is now 0. +- The `SpHeader::new_from_fields` is public now. + +## Added + +- `SpHeader::to_vec` method. + # [v0.11.0] 2024-04-16 ## Changed diff --git a/Cargo.toml b/Cargo.toml index f951cb5..8601dd9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "spacepackets" -version = "0.11.0" +version = "0.11.1" edition = "2021" rust-version = "1.65" authors = ["Robin Mueller "] diff --git a/src/lib.rs b/src/lib.rs index 5208da2..72f8cb3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -505,8 +505,8 @@ pub struct SpHeader { pub type SpacePacketHeader = SpHeader; impl Default for SpHeader { - /// The default function sets the sequence flag field to [SequenceFlags::Unsegmented]. The data - /// length field is set to 1, which denotes an empty space packets. + /// The default function sets the sequence flag field to [SequenceFlags::Unsegmented] and the + /// data length to 0. #[inline] fn default() -> Self { SpHeader { @@ -516,7 +516,7 @@ impl Default for SpHeader { seq_flags: SequenceFlags::Unsegmented, seq_count: 0, }, - data_len: 1, + data_len: 0, } } } @@ -532,8 +532,8 @@ impl SpHeader { } } - /// This constructor sets the sequence flag field to [SequenceFlags::Unsegmented]. The data - /// length field is set to 1, which denotes an empty space packets. + /// This constructor sets the sequence flag field to [SequenceFlags::Unsegmented] and the data + /// length to 0. /// /// This constructor will panic if the APID exceeds [MAX_APID]. #[inline] @@ -545,7 +545,7 @@ impl SpHeader { seq_flags: SequenceFlags::Unsegmented, seq_count: 0, }, - data_len: 1, + data_len: 0, } } @@ -559,7 +559,7 @@ impl SpHeader { seq_flags: SequenceFlags::Unsegmented, seq_count: 0, }, - data_len: 1, + data_len: 0, }) } @@ -568,7 +568,7 @@ impl SpHeader { /// /// The checked constructor variants can be used to avoid panics. #[inline] - const fn new_from_fields( + pub const fn new_from_fields( ptype: PacketType, sec_header: bool, apid: u16, @@ -755,6 +755,15 @@ impl SpHeader { .ok_or(ByteConversionError::ZeroCopyToError)?; Ok(&mut buf[CCSDS_HEADER_LEN..]) } + + /// Create a vector containing the CCSDS header. + #[cfg(feature = "alloc")] + pub fn to_vec(&self) -> alloc::vec::Vec { + let mut vec = alloc::vec![0; CCSDS_HEADER_LEN]; + // This can not fail. + self.write_to_be_bytes(&mut vec[..]).unwrap(); + vec + } } impl CcsdsPacket for SpHeader { @@ -1260,12 +1269,14 @@ pub(crate) mod tests { fn sp_header_from_apid() { let sp_header = SpHeader::new_from_apid(0x03); assert_eq!(sp_header.apid(), 0x03); + assert_eq!(sp_header.data_len(), 0); } #[test] fn sp_header_from_apid_checked() { let sp_header = SpHeader::new_from_apid_checked(0x03).unwrap(); assert_eq!(sp_header.apid(), 0x03); + assert_eq!(sp_header.data_len(), 0); } #[cfg(feature = "defmt")] @@ -1279,4 +1290,14 @@ pub(crate) mod tests { expected: 2, }); } + + #[test] + fn test_sp_header_as_vec() { + let sp_header = SpHeader::new_for_unseg_tc(0x42, 25, 1); + let sp_header_as_vec = sp_header.to_vec(); + let sp_header_read_back = SpHeader::from_be_bytes(&sp_header_as_vec) + .expect("Error reading back SP header") + .0; + assert_eq!(sp_header, sp_header_read_back); + } }