add PUS A support

This commit is contained in:
Robin Mueller
2025-07-29 20:26:37 +02:00
committed by Robin Mueller
parent 6e2c35e0c0
commit 3d344c11cc
11 changed files with 3385 additions and 56 deletions

View File

@@ -79,7 +79,7 @@ pub const ACK_ALL: u8 = AckOpts::Acceptance as u8
| AckOpts::Completion as u8;
pub trait GenericPusTcSecondaryHeader {
fn pus_version(&self) -> PusVersion;
fn pus_version(&self) -> Result<PusVersion, u8>;
fn ack_flags(&self) -> u8;
fn service(&self) -> u8;
fn subservice(&self) -> u8;
@@ -104,7 +104,7 @@ pub mod zc {
type Error = PusError;
fn try_from(value: crate::ecss::tc::PusTcSecondaryHeader) -> Result<Self, Self::Error> {
if value.version != PusVersion::PusC {
return Err(PusError::VersionNotSupported(value.version));
return Err(PusError::VersionNotSupported(value.version as u8));
}
Ok(PusTcSecondaryHeader {
version_ack: ((value.version as u8) << 4) | value.ack,
@@ -117,8 +117,8 @@ pub mod zc {
impl GenericPusTcSecondaryHeader for PusTcSecondaryHeader {
#[inline]
fn pus_version(&self) -> PusVersion {
PusVersion::try_from((self.version_ack >> 4) & 0b1111).unwrap_or(PusVersion::Invalid)
fn pus_version(&self) -> Result<PusVersion, u8> {
PusVersion::try_from((self.version_ack >> 4) & 0b1111)
}
#[inline]
@@ -156,8 +156,8 @@ pub struct PusTcSecondaryHeader {
impl GenericPusTcSecondaryHeader for PusTcSecondaryHeader {
#[inline]
fn pus_version(&self) -> PusVersion {
self.version
fn pus_version(&self) -> Result<PusVersion, u8> {
Ok(self.version)
}
#[inline]
@@ -444,7 +444,7 @@ impl CcsdsPacket for PusTcCreator<'_> {
impl PusPacket for PusTcCreator<'_> {
delegate!(to self.sec_header {
#[inline]
fn pus_version(&self) -> PusVersion;
fn pus_version(&self) -> Result<PusVersion, u8>;
#[inline]
fn service(&self) -> u8;
#[inline]
@@ -465,7 +465,7 @@ impl PusPacket for PusTcCreator<'_> {
impl GenericPusTcSecondaryHeader for PusTcCreator<'_> {
delegate!(to self.sec_header {
#[inline]
fn pus_version(&self) -> PusVersion;
fn pus_version(&self) -> Result<PusVersion, u8>;
#[inline]
fn service(&self) -> u8;
#[inline]
@@ -730,7 +730,7 @@ impl CcsdsPacket for PusTcReader<'_> {
impl PusPacket for PusTcReader<'_> {
delegate!(to self.sec_header {
#[inline]
fn pus_version(&self) -> PusVersion;
fn pus_version(&self) -> Result<PusVersion, u8>;
#[inline]
fn service(&self) -> u8;
#[inline]
@@ -751,7 +751,7 @@ impl PusPacket for PusTcReader<'_> {
impl GenericPusTcSecondaryHeader for PusTcReader<'_> {
delegate!(to self.sec_header {
#[inline]
fn pus_version(&self) -> PusVersion;
fn pus_version(&self) -> Result<PusVersion, u8>;
#[inline]
fn service(&self) -> u8;
#[inline]
@@ -1157,14 +1157,14 @@ mod tests {
assert_eq!(PusPacket::subservice(tc), 1);
assert_eq!(GenericPusTcSecondaryHeader::subservice(tc), 1);
assert!(tc.sec_header_flag());
assert_eq!(PusPacket::pus_version(tc), PusC);
assert_eq!(PusPacket::pus_version(tc).unwrap(), PusC);
assert_eq!(tc.seq_count(), 0x34);
assert_eq!(tc.source_id(), 0);
assert_eq!(tc.apid(), 0x02);
assert_eq!(tc.ack_flags(), ACK_ALL);
assert_eq!(PusPacket::pus_version(tc), PusVersion::PusC);
assert_eq!(PusPacket::pus_version(tc).unwrap(), PusVersion::PusC);
assert_eq!(
GenericPusTcSecondaryHeader::pus_version(tc),
GenericPusTcSecondaryHeader::pus_version(tc).unwrap(),
PusVersion::PusC
);
}