add PUS A support
This commit is contained in:
+26
-20
@@ -75,7 +75,7 @@ pub const PUS_TM_MIN_LEN_WITHOUT_SOURCE_DATA: usize =
|
||||
CCSDS_HEADER_LEN + PUS_TM_MIN_SEC_HEADER_LEN + size_of::<CrcType>();
|
||||
|
||||
pub trait GenericPusTmSecondaryHeader {
|
||||
fn pus_version(&self) -> PusVersion;
|
||||
fn pus_version(&self) -> Result<PusVersion, u8>;
|
||||
fn sc_time_ref_status(&self) -> u8;
|
||||
fn service(&self) -> u8;
|
||||
fn subservice(&self) -> u8;
|
||||
@@ -107,7 +107,7 @@ pub mod zc {
|
||||
type Error = PusError;
|
||||
fn try_from(header: crate::ecss::tm::PusTmSecondaryHeader) -> Result<Self, Self::Error> {
|
||||
if header.pus_version != PusVersion::PusC {
|
||||
return Err(PusError::VersionNotSupported(header.pus_version));
|
||||
return Err(PusError::VersionNotSupported(header.pus_version as u8));
|
||||
}
|
||||
Ok(PusTmSecHeaderWithoutTimestamp {
|
||||
pus_version_and_sc_time_ref_status: ((header.pus_version as u8) << 4)
|
||||
@@ -122,9 +122,8 @@ pub mod zc {
|
||||
|
||||
impl GenericPusTmSecondaryHeader for PusTmSecHeaderWithoutTimestamp {
|
||||
#[inline]
|
||||
fn pus_version(&self) -> PusVersion {
|
||||
fn pus_version(&self) -> Result<PusVersion, u8> {
|
||||
PusVersion::try_from((self.pus_version_and_sc_time_ref_status >> 4) & 0b1111)
|
||||
.unwrap_or(PusVersion::Invalid)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
@@ -201,8 +200,8 @@ impl<'stamp> PusTmSecondaryHeader<'stamp> {
|
||||
|
||||
impl GenericPusTmSecondaryHeader for PusTmSecondaryHeader<'_> {
|
||||
#[inline]
|
||||
fn pus_version(&self) -> PusVersion {
|
||||
self.pus_version
|
||||
fn pus_version(&self) -> Result<PusVersion, u8> {
|
||||
Ok(self.pus_version)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
@@ -232,12 +231,16 @@ impl GenericPusTmSecondaryHeader for PusTmSecondaryHeader<'_> {
|
||||
}
|
||||
|
||||
impl<'slice> TryFrom<zc::PusTmSecHeader<'slice>> for PusTmSecondaryHeader<'slice> {
|
||||
type Error = ();
|
||||
type Error = PusError;
|
||||
|
||||
#[inline]
|
||||
fn try_from(sec_header: zc::PusTmSecHeader<'slice>) -> Result<Self, Self::Error> {
|
||||
let version = sec_header.zc_header.pus_version();
|
||||
if let Err(e) = version {
|
||||
return Err(PusError::VersionNotSupported(e));
|
||||
}
|
||||
Ok(PusTmSecondaryHeader {
|
||||
pus_version: sec_header.zc_header.pus_version(),
|
||||
pus_version: version.unwrap(),
|
||||
sc_time_ref_status: sec_header.zc_header.sc_time_ref_status(),
|
||||
service: sec_header.zc_header.service(),
|
||||
subservice: sec_header.zc_header.subservice(),
|
||||
@@ -488,9 +491,12 @@ impl CcsdsPacket for PusTmCreator<'_, '_> {
|
||||
}
|
||||
|
||||
impl PusPacket for PusTmCreator<'_, '_> {
|
||||
#[inline]
|
||||
fn pus_version(&self) -> Result<PusVersion, u8> {
|
||||
Ok(self.sec_header.pus_version)
|
||||
}
|
||||
|
||||
delegate!(to self.sec_header {
|
||||
#[inline]
|
||||
fn pus_version(&self) -> PusVersion;
|
||||
#[inline]
|
||||
fn service(&self) -> u8;
|
||||
#[inline]
|
||||
@@ -511,7 +517,7 @@ impl PusPacket for PusTmCreator<'_, '_> {
|
||||
impl GenericPusTmSecondaryHeader for PusTmCreator<'_, '_> {
|
||||
delegate!(to self.sec_header {
|
||||
#[inline]
|
||||
fn pus_version(&self) -> PusVersion;
|
||||
fn pus_version(&self) -> Result<PusVersion, u8>;
|
||||
#[inline]
|
||||
fn service(&self) -> u8;
|
||||
#[inline]
|
||||
@@ -797,7 +803,7 @@ impl CcsdsPacket for PusTmReader<'_> {
|
||||
impl PusPacket for PusTmReader<'_> {
|
||||
delegate!(to self.sec_header {
|
||||
#[inline]
|
||||
fn pus_version(&self) -> PusVersion;
|
||||
fn pus_version(&self) -> Result<PusVersion, u8>;
|
||||
#[inline]
|
||||
fn service(&self) -> u8;
|
||||
#[inline]
|
||||
@@ -818,7 +824,7 @@ impl PusPacket for PusTmReader<'_> {
|
||||
impl GenericPusTmSecondaryHeader for PusTmReader<'_> {
|
||||
delegate!(to self.sec_header {
|
||||
#[inline]
|
||||
fn pus_version(&self) -> PusVersion;
|
||||
fn pus_version(&self) -> Result<PusVersion, u8>;
|
||||
#[inline]
|
||||
fn service(&self) -> u8;
|
||||
#[inline]
|
||||
@@ -977,7 +983,7 @@ impl CcsdsPacket for PusTmZeroCopyWriter<'_> {
|
||||
|
||||
impl PusPacket for PusTmZeroCopyWriter<'_> {
|
||||
#[inline]
|
||||
fn pus_version(&self) -> PusVersion {
|
||||
fn pus_version(&self) -> Result<PusVersion, u8> {
|
||||
self.sec_header_without_timestamp().pus_version()
|
||||
}
|
||||
|
||||
@@ -1011,7 +1017,7 @@ impl GenericPusTmSecondaryHeader for PusTmZeroCopyWriter<'_> {
|
||||
delegate! {
|
||||
to self.sec_header_without_timestamp() {
|
||||
#[inline]
|
||||
fn pus_version(&self) -> PusVersion;
|
||||
fn pus_version(&self) -> Result<PusVersion, u8>;
|
||||
#[inline]
|
||||
fn sc_time_ref_status(&self) -> u8;
|
||||
#[inline]
|
||||
@@ -1047,12 +1053,12 @@ mod tests {
|
||||
|
||||
const DUMMY_DATA: &[u8] = &[0, 1, 2];
|
||||
|
||||
fn base_ping_reply_full_ctor(timestamp: &[u8]) -> PusTmCreator {
|
||||
fn base_ping_reply_full_ctor<'a, 'b>(timestamp: &'a [u8]) -> PusTmCreator<'a, 'b> {
|
||||
let sph = SpHeader::new_for_unseg_tm_checked(0x123, 0x234, 0).unwrap();
|
||||
let tm_header = PusTmSecondaryHeader::new_simple(17, 2, timestamp);
|
||||
PusTmCreator::new_no_source_data(sph, tm_header, true)
|
||||
}
|
||||
fn ping_reply_with_data(timestamp: &[u8]) -> PusTmCreator {
|
||||
fn ping_reply_with_data<'a, 'b>(timestamp: &'a [u8]) -> PusTmCreator<'a, 'b> {
|
||||
let sph = SpHeader::new_for_unseg_tm_checked(0x123, 0x234, 0).unwrap();
|
||||
let tm_header = PusTmSecondaryHeader::new_simple(17, 2, timestamp);
|
||||
PusTmCreator::new(sph, tm_header, DUMMY_DATA, true)
|
||||
@@ -1442,12 +1448,12 @@ mod tests {
|
||||
if has_user_data {
|
||||
assert!(!tm.user_data().is_empty());
|
||||
}
|
||||
assert_eq!(PusPacket::pus_version(tm), PusC);
|
||||
assert_eq!(PusPacket::pus_version(tm).unwrap(), PusC);
|
||||
assert_eq!(tm.apid(), 0x123);
|
||||
assert_eq!(tm.seq_count(), 0x234);
|
||||
assert_eq!(PusPacket::pus_version(tm), PusVersion::PusC);
|
||||
assert_eq!(PusPacket::pus_version(tm).unwrap(), PusVersion::PusC);
|
||||
assert_eq!(
|
||||
GenericPusTmSecondaryHeader::pus_version(tm),
|
||||
GenericPusTmSecondaryHeader::pus_version(tm).unwrap(),
|
||||
PusVersion::PusC
|
||||
);
|
||||
assert_eq!(tm.data_len(), exp_full_len as u16 - 7);
|
||||
|
||||
Reference in New Issue
Block a user