diff --git a/satrs-core/src/pus/event_srv.rs b/satrs-core/src/pus/event_srv.rs index 83b7780..86da6b5 100644 --- a/satrs-core/src/pus/event_srv.rs +++ b/satrs-core/src/pus/event_srv.rs @@ -39,7 +39,7 @@ impl PusService5EventHandler { } pub fn handle_one_tc(&mut self) -> Result { - let possible_packet = self.psb.retrieve_next_packet()?; + let possible_packet = self.psb.retrieve_and_accept_next_packet()?; if possible_packet.is_none() { return Ok(PusPacketHandlerResult::Empty); } diff --git a/satrs-core/src/pus/mod.rs b/satrs-core/src/pus/mod.rs index 918b4d7..5d666a9 100644 --- a/satrs-core/src/pus/mod.rs +++ b/satrs-core/src/pus/mod.rs @@ -200,8 +200,15 @@ pub trait EcssTcSenderCore: EcssChannel { fn send_tc(&self, tc: PusTcCreator, token: Option) -> Result<(), EcssTmtcError>; } +#[non_exhaustive] +pub enum TcInMemory { + StoreAddr(StoreAddr), + #[cfg(feature = "alloc")] + Vec(alloc::vec::Vec), +} + pub struct ReceivedTcWrapper { - pub store_addr: StoreAddr, + pub store_addr: TcInMemory, pub token: Option, } @@ -335,6 +342,8 @@ pub mod std_mod { use std::sync::mpsc::TryRecvError; use thiserror::Error; + use super::TcInMemory; + impl From> for EcssTmtcError { fn from(_: mpsc::SendError) -> Self { Self::Send(GenericSendError::RxDisconnected) @@ -703,17 +712,25 @@ pub mod std_mod { pub fn retrieve_next_packet( &mut self, - ) -> Result)>, PusPacketHandlingError> + handle_acceptance: bool, + ) -> Result,PusPacketHandlingError> { match self.tc_receiver.recv_tc() { Ok(ReceivedTcWrapper { store_addr, token }) => { - if token.is_none() { - return Err(PusPacketHandlingError::InvalidVerificationToken); + let mut passed_token = token; + if handle_acceptance { + if token.is_none() { + return Err(PusPacketHandlingError::InvalidVerificationToken); + } + let token = token.unwrap(); + let accepted_token = VerificationToken::::try_from(token) + .map_err(|_| PusPacketHandlingError::InvalidVerificationToken)?; + passed_token = Some(accepted_token.into()); } - let token = token.unwrap(); - let accepted_token = VerificationToken::::try_from(token) - .map_err(|_| PusPacketHandlingError::InvalidVerificationToken)?; - Ok(Some((store_addr, accepted_token))) + Ok(Some(ReceivedTcWrapper { + store_addr, + token: passed_token + })) } Err(e) => match e { TryRecvTmtcError::Error(e) => Err(PusPacketHandlingError::EcssTmtc(e)), diff --git a/satrs-core/src/pus/scheduler_srv.rs b/satrs-core/src/pus/scheduler_srv.rs index 4bffd02..eee7df2 100644 --- a/satrs-core/src/pus/scheduler_srv.rs +++ b/satrs-core/src/pus/scheduler_srv.rs @@ -53,7 +53,7 @@ impl PusService11SchedHandler { } pub fn handle_one_tc(&mut self) -> Result { - let possible_packet = self.psb.retrieve_next_packet()?; + let possible_packet = self.psb.retrieve_and_accept_next_packet()?; if possible_packet.is_none() { return Ok(PusPacketHandlerResult::Empty); } diff --git a/satrs-core/src/pus/test.rs b/satrs-core/src/pus/test.rs index 26661e0..efdd415 100644 --- a/satrs-core/src/pus/test.rs +++ b/satrs-core/src/pus/test.rs @@ -36,7 +36,7 @@ impl PusService17TestHandler { } pub fn handle_one_tc(&mut self) -> Result { - let possible_packet = self.psb.retrieve_next_packet()?; + let possible_packet = self.psb.retrieve_and_accept_next_packet()?; if possible_packet.is_none() { return Ok(PusPacketHandlerResult::Empty); } diff --git a/satrs-example/src/pus/action.rs b/satrs-example/src/pus/action.rs index 78fdaa3..df74494 100644 --- a/satrs-example/src/pus/action.rs +++ b/satrs-example/src/pus/action.rs @@ -99,7 +99,7 @@ impl PusService8ActionHandler { } fn handle_one_tc(&mut self) -> Result { - let possible_packet = self.psb.retrieve_next_packet()?; + let possible_packet = self.psb.retrieve_and_accept_next_packet()?; if possible_packet.is_none() { return Ok(PusPacketHandlerResult::Empty); } diff --git a/satrs-example/src/pus/hk.rs b/satrs-example/src/pus/hk.rs index 9bb259b..460ab3b 100644 --- a/satrs-example/src/pus/hk.rs +++ b/satrs-example/src/pus/hk.rs @@ -41,7 +41,7 @@ impl PusService3HkHandler { } fn handle_one_tc(&mut self) -> Result { - let possible_packet = self.psb.retrieve_next_packet()?; + let possible_packet = self.psb.retrieve_and_accept_next_packet()?; if possible_packet.is_none() { return Ok(PusPacketHandlerResult::Empty); }