From d01309cccfeeacaed0da25241a9f3fc24ecb69ed Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 5 Feb 2024 15:04:29 +0100 Subject: [PATCH] extended time writer trait --- CHANGELOG.md | 6 ++++++ Cargo.toml | 2 +- src/time/cds.rs | 26 ++++++++++++++++++++++++++ src/time/cuc.rs | 13 +++++++++++++ src/time/mod.rs | 9 +++++++++ 5 files changed, 55 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 50d6826..d3c18e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,12 @@ and this project adheres to [Semantic Versioning](http://semver.org/). # [unreleased] +# [v0.8.0] 2024-02-05 + +## Added + +- Added `len_written` and `to_vec` methods to the `TimeWriter` trait. + # [v0.7.0] 2024-02-01 # [v0.7.0-beta.4] 2024-01-23 diff --git a/Cargo.toml b/Cargo.toml index af6a67c..e7046ab 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "spacepackets" -version = "0.7.0" +version = "0.8.0" edition = "2021" rust-version = "1.61" authors = ["Robin Mueller "] diff --git a/src/time/cds.rs b/src/time/cds.rs index 3442819..b1cd2e8 100644 --- a/src/time/cds.rs +++ b/src/time/cds.rs @@ -1201,6 +1201,10 @@ impl TimeWriter for TimeProvider { } Ok(self.len_as_bytes()) } + + fn len_written(&self) -> usize { + self.len_as_bytes() + } } impl TimeWriter for TimeProvider { @@ -1221,6 +1225,10 @@ impl TimeWriter for TimeProvider { } Ok(self.len_as_bytes()) } + + fn len_written(&self) -> usize { + self.len_as_bytes() + } } impl PartialEq for TimeProvider { @@ -2270,4 +2278,22 @@ mod tests { assert_eq!(first, second); } } + + #[test] + fn test_stamp_to_vec_u16() { + let stamp = TimeProvider::new_with_u16_days(1, 1); + let stamp_vec = stamp.to_vec().unwrap(); + let mut buf: [u8; 7] = [0; 7]; + stamp.write_to_bytes(&mut buf).unwrap(); + assert_eq!(stamp_vec, buf); + } + + #[test] + fn test_stamp_to_vec_u24() { + let stamp = TimeProvider::new_with_u24_days(1, 1).unwrap(); + let stamp_vec = stamp.to_vec().unwrap(); + let mut buf: [u8; 10] = [0; 10]; + stamp.write_to_bytes(&mut buf).unwrap(); + assert_eq!(stamp_vec, buf[..stamp.len_written()]); + } } diff --git a/src/time/cuc.rs b/src/time/cuc.rs index b5dd95b..f7e449a 100644 --- a/src/time/cuc.rs +++ b/src/time/cuc.rs @@ -587,6 +587,10 @@ impl TimeWriter for TimeProviderCcsdsEpoch { } Ok(current_idx) } + + fn len_written(&self) -> usize { + self.len_as_bytes() + } } impl CcsdsTimeProvider for TimeProviderCcsdsEpoch { @@ -1226,4 +1230,13 @@ mod tests { panic!("unexpected error: {}", cuc_error); } } + + #[test] + fn test_stamp_to_vec() { + let stamp = TimeProviderCcsdsEpoch::new_u16_counter(100); + let stamp_vec = stamp.to_vec().unwrap(); + let mut buf: [u8; 16] = [0; 16]; + stamp.write_to_bytes(&mut buf).unwrap(); + assert_eq!(stamp_vec, buf[..stamp.len_written()]); + } } diff --git a/src/time/mod.rs b/src/time/mod.rs index 3376677..a90dc37 100644 --- a/src/time/mod.rs +++ b/src/time/mod.rs @@ -189,9 +189,18 @@ pub fn ms_of_day(seconds_since_epoch: f64) -> u32 { } pub trait TimeWriter { + fn len_written(&self) -> usize; + /// Generic function to convert write a timestamp into a raw buffer. /// Returns the number of written bytes on success. fn write_to_bytes(&self, bytes: &mut [u8]) -> Result; + + #[cfg(feature = "alloc")] + fn to_vec(&self) -> Result, TimestampError> { + let mut vec = alloc::vec![0; self.len_written()]; + self.write_to_bytes(&mut vec)?; + Ok(vec) + } } pub trait TimeReader {