From 28ba4f887d25f074bfe3016e65a19ed82cea6b8f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 13 Sep 2022 09:52:59 +0200 Subject: [PATCH] added some auto-conversion --- src/ecss.rs | 8 +++++++- src/tc.rs | 25 ++++++++++--------------- src/tm.rs | 27 +++++++++++---------------- 3 files changed, 28 insertions(+), 32 deletions(-) diff --git a/src/ecss.rs b/src/ecss.rs index 5eec1d0..c7140d9 100644 --- a/src/ecss.rs +++ b/src/ecss.rs @@ -41,7 +41,13 @@ pub enum PusError { NoRawData, /// CRC16 needs to be calculated first CrcCalculationMissing, - PacketError(ByteConversionError), + ByteConversionError(ByteConversionError), +} + +impl From for PusError { + fn from(e: ByteConversionError) -> Self { + PusError::ByteConversionError(e) + } } pub trait PusPacket: CcsdsPacket { diff --git a/src/tc.rs b/src/tc.rs index 722627c..5708a38 100644 --- a/src/tc.rs +++ b/src/tc.rs @@ -336,22 +336,21 @@ impl<'slice> PusTc<'slice> { let tc_header_len = size_of::(); let total_size = self.len_packed(); if total_size > slice.len() { - return Err(PusError::PacketError(ByteConversionError::ToSliceTooSmall( - SizeMissmatch { - found: slice.len(), - expected: total_size, - }, - ))); + return Err(ByteConversionError::ToSliceTooSmall(SizeMissmatch { + found: slice.len(), + expected: total_size, + }) + .into()); } sph_zc .to_bytes(&mut slice[curr_idx..curr_idx + CCSDS_HEADER_LEN]) - .ok_or(PusError::PacketError(ByteConversionError::ZeroCopyToError))?; + .ok_or(ByteConversionError::ZeroCopyToError)?; curr_idx += CCSDS_HEADER_LEN; let sec_header = zc::PusTcSecondaryHeader::try_from(self.sec_header).unwrap(); sec_header .write_to_bytes(&mut slice[curr_idx..curr_idx + tc_header_len]) - .ok_or(PusError::PacketError(ByteConversionError::ZeroCopyToError))?; + .ok_or(ByteConversionError::ZeroCopyToError)?; curr_idx += tc_header_len; if let Some(app_data) = self.app_data { @@ -410,9 +409,7 @@ impl<'slice> PusTc<'slice> { let mut current_idx = 0; let sph = crate::zc::SpHeader::from_bytes(&slice[current_idx..current_idx + CCSDS_HEADER_LEN]) - .ok_or(PusError::PacketError( - ByteConversionError::ZeroCopyFromError, - ))?; + .ok_or(ByteConversionError::ZeroCopyFromError)?; current_idx += CCSDS_HEADER_LEN; let total_len = sph.total_len(); if raw_data_len < total_len || total_len < PUS_TC_MIN_LEN_WITHOUT_APP_DATA { @@ -421,9 +418,7 @@ impl<'slice> PusTc<'slice> { let sec_header = zc::PusTcSecondaryHeader::from_bytes( &slice[current_idx..current_idx + PUC_TC_SECONDARY_HEADER_LEN], ) - .ok_or(PusError::PacketError( - ByteConversionError::ZeroCopyFromError, - ))?; + .ok_or(ByteConversionError::ZeroCopyFromError)?; current_idx += PUC_TC_SECONDARY_HEADER_LEN; let raw_data = &slice[0..total_len]; let pus_tc = PusTc { @@ -636,7 +631,7 @@ mod tests { assert!(res.is_err()); let err = res.unwrap_err(); match err { - PusError::PacketError(err) => match err { + PusError::ByteConversionError(err) => match err { ByteConversionError::ToSliceTooSmall(missmatch) => { assert_eq!(missmatch.expected, pus_tc.len_packed()); assert_eq!(missmatch.found, 12); diff --git a/src/tm.rs b/src/tm.rs index debc676..a56337a 100644 --- a/src/tm.rs +++ b/src/tm.rs @@ -314,23 +314,22 @@ impl<'slice> PusTm<'slice> { let sph_zc = crate::zc::SpHeader::from(self.sp_header); let total_size = self.len_packed(); if total_size > slice.len() { - return Err(PusError::PacketError(ByteConversionError::ToSliceTooSmall( - SizeMissmatch { - found: slice.len(), - expected: total_size, - }, - ))); + return Err(ByteConversionError::ToSliceTooSmall(SizeMissmatch { + found: slice.len(), + expected: total_size, + }) + .into()); } sph_zc .to_bytes(&mut slice[curr_idx..curr_idx + CCSDS_HEADER_LEN]) - .ok_or(PusError::PacketError(ByteConversionError::ZeroCopyToError))?; + .ok_or(ByteConversionError::ZeroCopyToError)?; curr_idx += CCSDS_HEADER_LEN; let sec_header_len = size_of::(); let sec_header = zc::PusTmSecHeaderWithoutTimestamp::try_from(self.sec_header).unwrap(); sec_header .write_to_bytes(&mut slice[curr_idx..curr_idx + sec_header_len]) - .ok_or(PusError::PacketError(ByteConversionError::ZeroCopyToError))?; + .ok_or(ByteConversionError::ZeroCopyToError)?; curr_idx += sec_header_len; let timestamp_len = self.sec_header.time_stamp.len(); slice[curr_idx..curr_idx + timestamp_len].copy_from_slice(self.sec_header.time_stamp); @@ -399,9 +398,7 @@ impl<'slice> PusTm<'slice> { let mut current_idx = 0; let sph = crate::zc::SpHeader::from_bytes(&slice[current_idx..current_idx + CCSDS_HEADER_LEN]) - .ok_or(PusError::PacketError( - ByteConversionError::ZeroCopyFromError, - ))?; + .ok_or(ByteConversionError::ZeroCopyFromError)?; current_idx += 6; let total_len = sph.total_len(); if raw_data_len < total_len || total_len < PUS_TM_MIN_LEN_WITHOUT_SOURCE_DATA { @@ -410,9 +407,7 @@ impl<'slice> PusTm<'slice> { let sec_header_zc = zc::PusTmSecHeaderWithoutTimestamp::from_bytes( &slice[current_idx..current_idx + PUC_TM_MIN_SEC_HEADER_LEN], ) - .ok_or(PusError::PacketError( - ByteConversionError::ZeroCopyFromError, - ))?; + .ok_or(ByteConversionError::ZeroCopyFromError)?; current_idx += PUC_TM_MIN_SEC_HEADER_LEN; let zc_sec_header_wrapper = zc::PusTmSecHeader { zc_header: sec_header_zc, @@ -580,9 +575,9 @@ mod tests { let res = pus_tm.write_to_bytes(&mut buf); assert!(res.is_err()); let error = res.unwrap_err(); - assert!(matches!(error, PusError::PacketError { .. })); + assert!(matches!(error, PusError::ByteConversionError { .. })); match error { - PusError::PacketError(err) => match err { + PusError::ByteConversionError(err) => match err { ByteConversionError::ToSliceTooSmall(size_missmatch) => { assert_eq!(size_missmatch.expected, 22); assert_eq!(size_missmatch.found, 16);