sat-rs/satrs-core/src/pus/event_srv.rs

124 lines
4.6 KiB
Rust
Raw Normal View History

2023-07-05 14:25:51 +02:00
use crate::events::EventU32;
2024-01-30 01:18:48 +01:00
use crate::pool::SharedPool;
2023-07-05 14:25:51 +02:00
use crate::pus::event_man::{EventRequest, EventRequestWithToken};
2024-01-30 01:18:48 +01:00
use crate::pus::verification::{StdVerifReporterWithSender, TcStateToken};
2023-07-05 14:25:51 +02:00
use crate::pus::{
2023-07-10 00:29:31 +02:00
EcssTcReceiver, EcssTmSender, PartialPusHandlingError, PusPacketHandlerResult,
2024-01-30 01:18:48 +01:00
PusPacketHandlingError, PusServiceBaseWithStore,
2023-07-05 14:25:51 +02:00
};
2023-07-12 13:48:59 +02:00
use alloc::boxed::Box;
2023-07-05 14:25:51 +02:00
use spacepackets::ecss::event::Subservice;
2023-07-11 00:44:48 +02:00
use spacepackets::ecss::tc::PusTcReader;
2023-07-05 14:25:51 +02:00
use spacepackets::ecss::PusPacket;
2023-07-10 00:29:31 +02:00
use std::sync::mpsc::Sender;
2023-07-05 14:25:51 +02:00
pub struct PusService5EventHandler {
2024-01-30 01:18:48 +01:00
psb: PusServiceBaseWithStore,
2023-07-05 14:25:51 +02:00
event_request_tx: Sender<EventRequestWithToken>,
}
impl PusService5EventHandler {
pub fn new(
2023-07-09 20:05:45 +02:00
tc_receiver: Box<dyn EcssTcReceiver>,
2023-07-10 00:29:31 +02:00
shared_tc_store: SharedPool,
2023-07-09 13:32:59 +02:00
tm_sender: Box<dyn EcssTmSender>,
2023-07-05 14:25:51 +02:00
tm_apid: u16,
verification_handler: StdVerifReporterWithSender,
event_request_tx: Sender<EventRequestWithToken>,
) -> Self {
Self {
2024-01-30 01:18:48 +01:00
psb: PusServiceBaseWithStore::new(
2023-07-10 00:29:31 +02:00
tc_receiver,
shared_tc_store,
tm_sender,
tm_apid,
verification_handler,
),
2023-07-05 14:25:51 +02:00
event_request_tx,
}
}
2024-01-30 01:18:48 +01:00
pub fn handle_one_tc(&mut self) -> Result<PusPacketHandlerResult, PusPacketHandlingError> {
2024-01-30 09:59:45 +01:00
let possible_packet = self.psb.retrieve_and_accept_next_packet()?;
2024-01-30 01:18:48 +01:00
if possible_packet.is_none() {
return Ok(PusPacketHandlerResult::Empty);
}
let (addr, token) = possible_packet.unwrap();
self.psb.copy_tc_to_buf(addr)?;
2023-07-11 00:44:48 +02:00
let (tc, _) = PusTcReader::new(&self.psb.pus_buf)?;
2023-07-05 21:08:04 +02:00
let subservice = tc.subservice();
let srv = Subservice::try_from(subservice);
2023-07-05 14:25:51 +02:00
if srv.is_err() {
return Ok(PusPacketHandlerResult::CustomSubservice(
tc.subservice(),
2023-07-10 00:29:31 +02:00
token,
2023-07-05 14:25:51 +02:00
));
}
2023-07-06 00:49:18 +02:00
let handle_enable_disable_request = |enable: bool, stamp: [u8; 7]| {
2023-07-11 00:28:28 +02:00
if tc.user_data().len() < 4 {
2023-07-05 14:25:51 +02:00
return Err(PusPacketHandlingError::NotEnoughAppData(
"At least 4 bytes event ID expected".into(),
));
}
2023-07-11 00:28:28 +02:00
let user_data = tc.user_data();
2023-07-05 14:25:51 +02:00
let event_u32 = EventU32::from(u32::from_be_bytes(user_data[0..4].try_into().unwrap()));
let start_token = self
.psb
.verification_handler
2023-07-06 00:49:18 +02:00
.borrow_mut()
2023-07-09 20:19:53 +02:00
.start_success(token, Some(&stamp))
2023-07-08 13:37:27 +02:00
.map_err(|_| PartialPusHandlingError::Verification);
2023-07-05 14:25:51 +02:00
let partial_error = start_token.clone().err();
let mut token: TcStateToken = token.into();
if let Ok(start_token) = start_token {
token = start_token.into();
}
let event_req_with_token = if enable {
EventRequestWithToken {
request: EventRequest::Enable(event_u32),
token,
}
} else {
EventRequestWithToken {
request: EventRequest::Disable(event_u32),
token,
}
};
self.event_request_tx
.send(event_req_with_token)
.map_err(|_| {
2023-07-09 20:05:45 +02:00
PusPacketHandlingError::Other("Forwarding event request failed".into())
2023-07-05 14:25:51 +02:00
})?;
if let Some(partial_error) = partial_error {
return Ok(PusPacketHandlerResult::RequestHandledPartialSuccess(
partial_error,
));
}
Ok(PusPacketHandlerResult::RequestHandled)
};
2023-07-06 00:49:18 +02:00
let mut partial_error = None;
2024-01-30 01:18:48 +01:00
let time_stamp = self.psb.get_current_timestamp(&mut partial_error);
2023-07-05 14:25:51 +02:00
match srv.unwrap() {
Subservice::TmInfoReport
| Subservice::TmLowSeverityReport
| Subservice::TmMediumSeverityReport
| Subservice::TmHighSeverityReport => {
return Err(PusPacketHandlingError::InvalidSubservice(tc.subservice()))
}
Subservice::TcEnableEventGeneration => {
2023-07-05 21:08:04 +02:00
handle_enable_disable_request(true, time_stamp)?;
2023-07-05 14:25:51 +02:00
}
Subservice::TcDisableEventGeneration => {
2023-07-05 21:08:04 +02:00
handle_enable_disable_request(false, time_stamp)?;
2023-07-05 14:25:51 +02:00
}
Subservice::TcReportDisabledList | Subservice::TmDisabledEventsReport => {
return Ok(PusPacketHandlerResult::SubserviceNotImplemented(
2023-07-10 00:29:31 +02:00
subservice, token,
2023-07-05 14:25:51 +02:00
));
}
}
Ok(PusPacketHandlerResult::RequestHandled)
}
}