2023-07-05 14:25:51 +02:00
|
|
|
use crate::events::EventU32;
|
|
|
|
use crate::pool::{SharedPool, StoreAddr};
|
|
|
|
use crate::pus::event_man::{EventRequest, EventRequestWithToken};
|
|
|
|
use crate::pus::verification::{
|
|
|
|
StdVerifReporterWithSender, TcStateAccepted, TcStateToken, VerificationToken,
|
|
|
|
};
|
|
|
|
use crate::pus::{
|
2023-07-09 13:32:59 +02:00
|
|
|
AcceptedTc, EcssTmSender, PartialPusHandlingError, PusPacketHandlerResult,
|
|
|
|
PusPacketHandlingError, PusServiceBase, PusServiceHandler,
|
2023-07-05 14:25:51 +02:00
|
|
|
};
|
|
|
|
use spacepackets::ecss::event::Subservice;
|
|
|
|
use spacepackets::ecss::PusPacket;
|
|
|
|
use spacepackets::tc::PusTc;
|
2023-07-09 13:32:59 +02:00
|
|
|
use std::boxed::Box;
|
2023-07-05 14:25:51 +02:00
|
|
|
use std::sync::mpsc::{Receiver, Sender};
|
|
|
|
|
|
|
|
pub struct PusService5EventHandler {
|
|
|
|
psb: PusServiceBase,
|
|
|
|
event_request_tx: Sender<EventRequestWithToken>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl PusService5EventHandler {
|
|
|
|
pub fn new(
|
|
|
|
receiver: Receiver<AcceptedTc>,
|
|
|
|
tc_pool: 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 {
|
2023-07-09 13:32:59 +02:00
|
|
|
psb: PusServiceBase::new(receiver, tc_pool, tm_sender, tm_apid, verification_handler),
|
2023-07-05 14:25:51 +02:00
|
|
|
event_request_tx,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl PusServiceHandler for PusService5EventHandler {
|
|
|
|
fn psb_mut(&mut self) -> &mut PusServiceBase {
|
|
|
|
&mut self.psb
|
|
|
|
}
|
|
|
|
fn psb(&self) -> &PusServiceBase {
|
|
|
|
&self.psb
|
|
|
|
}
|
|
|
|
|
|
|
|
fn handle_one_tc(
|
|
|
|
&mut self,
|
|
|
|
addr: StoreAddr,
|
|
|
|
token: VerificationToken<TcStateAccepted>,
|
|
|
|
) -> Result<PusPacketHandlerResult, PusPacketHandlingError> {
|
2023-07-05 21:08:04 +02:00
|
|
|
self.copy_tc_to_buf(addr)?;
|
2023-07-05 14:25:51 +02:00
|
|
|
let (tc, _) = PusTc::from_bytes(&self.psb.pus_buf).unwrap();
|
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(),
|
|
|
|
token,
|
|
|
|
));
|
|
|
|
}
|
2023-07-06 00:49:18 +02:00
|
|
|
let handle_enable_disable_request = |enable: bool, stamp: [u8; 7]| {
|
2023-07-05 14:25:51 +02:00
|
|
|
if tc.user_data().is_none() || tc.user_data().unwrap().len() < 4 {
|
|
|
|
return Err(PusPacketHandlingError::NotEnoughAppData(
|
|
|
|
"At least 4 bytes event ID expected".into(),
|
|
|
|
));
|
|
|
|
}
|
|
|
|
let user_data = tc.user_data().unwrap();
|
|
|
|
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-05 21:08:04 +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(|_| {
|
|
|
|
PusPacketHandlingError::SendError("Forwarding event request failed".into())
|
|
|
|
})?;
|
|
|
|
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;
|
|
|
|
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-05 21:08:04 +02:00
|
|
|
subservice, token,
|
2023-07-05 14:25:51 +02:00
|
|
|
));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(PusPacketHandlerResult::RequestHandled)
|
|
|
|
}
|
|
|
|
}
|