diff --git a/src/time/cuc.rs b/src/time/cuc.rs index 6671327..856dfad 100644 --- a/src/time/cuc.rs +++ b/src/time/cuc.rs @@ -143,9 +143,11 @@ impl Display for CucError { #[cfg(feature = "std")] impl Error for CucError {} +/// Tuple object where the first value is the width of the counter and the second value +/// is the counter value. #[derive(Copy, Clone, PartialEq, Eq, Debug)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -pub struct WidthCounterPair(u8, u32); +pub struct WidthCounterPair(pub u8, pub u32); #[derive(Copy, Clone, PartialEq, Eq, Debug)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] @@ -437,13 +439,25 @@ impl CucTime { Self::new_generic(WidthCounterPair(4, counter as u32), fractions).map_err(|e| e.into()) } - pub fn new_u16_counter(counter: u16) -> Self { - // These values are definitely valid, so it is okay to unwrap here. - Self::new_generic( - WidthCounterPair(2, counter as u32), - FractionalPart::new_with_seconds_resolution(), - ) - .unwrap() + /// Most generic constructor which allows full configurability for the counter and for the + /// fractions. + pub fn new_generic( + width_and_counter: WidthCounterPair, + fractions: FractionalPart, + ) -> Result { + Self::verify_counter_width(width_and_counter.0)?; + if width_and_counter.1 > (2u64.pow(width_and_counter.0 as u32 * 8) - 1) as u32 { + return Err(CucError::InvalidCounter { + width: width_and_counter.0, + counter: width_and_counter.1.into(), + }); + } + Self::verify_fractions_value(fractions)?; + Ok(Self { + pfield: Self::build_p_field(width_and_counter.0, fractions.resolution), + counter: width_and_counter, + fractions, + }) } pub fn ccsds_time_code(&self) -> CcsdsTimeCode { @@ -454,7 +468,7 @@ impl CucTime { self.counter } - pub fn width(&self) -> u8 { + pub fn counter_width(&self) -> u8 { self.counter.0 } @@ -489,25 +503,6 @@ impl CucTime { } } - pub fn new_generic( - counter: WidthCounterPair, - fractions: FractionalPart, - ) -> Result { - Self::verify_counter_width(counter.0)?; - if counter.1 > (2u64.pow(counter.0 as u32 * 8) - 1) as u32 { - return Err(CucError::InvalidCounter { - width: counter.0, - counter: counter.1.into(), - }); - } - Self::verify_fractions_value(fractions)?; - Ok(Self { - pfield: Self::build_p_field(counter.0, fractions.resolution), - counter, - fractions, - }) - } - fn build_p_field(counter_width: u8, resolution: FractionalResolution) -> u8 { let mut pfield = P_FIELD_BASE; if !(1..=4).contains(&counter_width) { @@ -856,7 +851,7 @@ mod tests { // Do not include leap second corrections, which do not apply to dates before 1972. let zero_cuc = CucTime::new(0); assert_eq!(zero_cuc.len_as_bytes(), 5); - assert_eq!(zero_cuc.width(), zero_cuc.width_counter_pair().0); + assert_eq!(zero_cuc.counter_width(), zero_cuc.width_counter_pair().0); assert_eq!(zero_cuc.counter(), zero_cuc.width_counter_pair().1); let ccsds_cuc = zero_cuc.to_leap_sec_helper(0); assert_eq!(ccsds_cuc.ccdsd_time_code(), CcsdsTimeCode::CucCcsdsEpoch); @@ -1370,13 +1365,6 @@ mod tests { assert_eq!(cuc.counter(), dt.timestamp() as u32 + LEAP_SECONDS); } - #[test] - fn test_new_u16_width() { - let cuc = CucTime::new_u16_counter(0); - assert_eq!(cuc.width(), 2); - assert_eq!(cuc.counter(), 0); - } - #[test] fn from_unix_stamp() { let unix_stamp = UnixTime::new(0, 0); @@ -1405,7 +1393,7 @@ mod tests { #[test] fn test_stamp_to_vec() { - let stamp = CucTime::new_u16_counter(100); + let stamp = CucTime::new(100); let stamp_vec = stamp.to_vec().unwrap(); let mut buf: [u8; 16] = [0; 16]; stamp.write_to_bytes(&mut buf).unwrap();