From 3b2102b4d85cbef9c48527a0943fa368e6a20a42 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 17 Feb 2024 00:16:38 +0100 Subject: [PATCH] seems to work well --- CHANGELOG.md | 5 +++++ src/cfdp/pdu/finished.rs | 2 +- src/ecss/mod.rs | 20 +++++++++++++++----- src/util.rs | 21 +++++++++++++-------- 4 files changed, 34 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8148ae3..28eadcb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/). # [unreleased] +## Added + +- Added `value` and `to_vec` methods for the `UnsignedEnum` trait. The value is returned as + as `u64`. + # [v0.9.0] 2024-02-07 ## Added diff --git a/src/cfdp/pdu/finished.rs b/src/cfdp/pdu/finished.rs index 529984c..6dd1d0a 100644 --- a/src/cfdp/pdu/finished.rs +++ b/src/cfdp/pdu/finished.rs @@ -581,7 +581,7 @@ mod tests { assert_eq!(finished_pdu_vec.len(), 12); assert_eq!(finished_pdu_vec[9], TlvType::EntityId.into()); assert_eq!(finished_pdu_vec[10], 1); - assert_eq!(finished_pdu_vec[11], TEST_DEST_ID.value()); + assert_eq!(finished_pdu_vec[11], TEST_DEST_ID.value_typed()); assert_eq!( finished_pdu.fault_location().unwrap().entity_id(), &TEST_DEST_ID.into() diff --git a/src/ecss/mod.rs b/src/ecss/mod.rs index 19d44a6..7134e8b 100644 --- a/src/ecss/mod.rs +++ b/src/ecss/mod.rs @@ -315,11 +315,11 @@ pub trait EcssEnumerationExt: EcssEnumeration + Debug + Copy + Clone + PartialEq #[derive(Debug, Copy, Clone, Eq, PartialEq)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -pub struct GenericEcssEnumWrapper { +pub struct GenericEcssEnumWrapper> { field: GenericUnsignedByteField, } -impl GenericEcssEnumWrapper { +impl> GenericEcssEnumWrapper { pub const fn ptc() -> PacketTypeCodes { PacketTypeCodes::Enumerated } @@ -331,7 +331,7 @@ impl GenericEcssEnumWrapper { } } -impl UnsignedEnum for GenericEcssEnumWrapper { +impl> UnsignedEnum for GenericEcssEnumWrapper { fn size(&self) -> usize { (self.pfc() / 8) as usize } @@ -339,15 +339,25 @@ impl UnsignedEnum for GenericEcssEnumWrapper { fn write_to_be_bytes(&self, buf: &mut [u8]) -> Result { self.field.write_to_be_bytes(buf) } + + fn value(&self) -> u64 { + self.field.value() + } + + fn to_vec(&self) -> alloc::vec::Vec { + let mut buf = alloc::vec![0; self.size()]; + self.write_to_be_bytes(&mut buf).unwrap(); + buf + } } -impl EcssEnumeration for GenericEcssEnumWrapper { +impl> EcssEnumeration for GenericEcssEnumWrapper { fn pfc(&self) -> u8 { size_of::() as u8 * 8_u8 } } -impl EcssEnumerationExt +impl> EcssEnumerationExt for GenericEcssEnumWrapper { } diff --git a/src/util.rs b/src/util.rs index 17a99de..424568b 100644 --- a/src/util.rs +++ b/src/util.rs @@ -73,6 +73,7 @@ pub trait UnsignedEnum { fn size(&self) -> usize; /// Write the unsigned enumeration to a raw buffer. Returns the written size on success. fn write_to_be_bytes(&self, buf: &mut [u8]) -> Result; + fn value(&self) -> u64; #[cfg(feature = "alloc")] fn to_vec(&self) -> alloc::vec::Vec { @@ -139,10 +140,6 @@ impl UnsignedByteField { Self { width, value } } - pub fn value(&self) -> u64 { - self.value - } - pub fn new_from_be_bytes(width: usize, buf: &[u8]) -> Result { if width > buf.len() { return Err(ByteConversionError::FromSliceTooSmall { @@ -179,6 +176,10 @@ impl UnsignedEnum for UnsignedByteField { self.width } + fn value(&self) -> u64 { + self.value + } + fn write_to_be_bytes(&self, buf: &mut [u8]) -> Result { if buf.len() < self.size() { return Err(ByteConversionError::ToSliceTooSmall { @@ -214,21 +215,21 @@ impl UnsignedEnum for UnsignedByteField { #[derive(Debug, Copy, Clone, Eq, PartialEq)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -pub struct GenericUnsignedByteField { +pub struct GenericUnsignedByteField> { value: TYPE, } -impl GenericUnsignedByteField { +impl> GenericUnsignedByteField { pub const fn new(val: TYPE) -> Self { Self { value: val } } - pub const fn value(&self) -> TYPE { + pub const fn value_typed(&self) -> TYPE { self.value } } -impl UnsignedEnum for GenericUnsignedByteField { +impl> UnsignedEnum for GenericUnsignedByteField { fn size(&self) -> usize { self.value.written_len() } @@ -243,6 +244,10 @@ impl UnsignedEnum for GenericUnsignedByteField { buf[0..self.size()].copy_from_slice(self.value.to_be_bytes().as_ref()); Ok(self.value.written_len()) } + + fn value(&self) -> u64 { + self.value_typed().into() + } } pub type UnsignedByteFieldEmpty = GenericUnsignedByteField<()>;