2024-02-20 14:33:21 +01:00
|
|
|
use std::collections::HashMap;
|
|
|
|
use std::sync::mpsc;
|
|
|
|
|
2023-08-15 08:49:54 +02:00
|
|
|
use derive_new::new;
|
2024-02-20 14:33:21 +01:00
|
|
|
use satrs::action::ActionRequest;
|
2024-02-12 15:51:37 +01:00
|
|
|
use satrs::hk::HkRequest;
|
|
|
|
use satrs::mode::ModeRequest;
|
2024-02-20 14:33:21 +01:00
|
|
|
use satrs::pus::action::PusActionRequestRouter;
|
|
|
|
use satrs::pus::hk::PusHkRequestRouter;
|
2024-02-12 15:51:37 +01:00
|
|
|
use satrs::pus::verification::{TcStateAccepted, VerificationToken};
|
2024-02-20 14:33:21 +01:00
|
|
|
use satrs::pus::GenericRoutingError;
|
|
|
|
use satrs::queue::GenericSendError;
|
|
|
|
use satrs::TargetId;
|
2023-07-05 21:08:04 +02:00
|
|
|
|
|
|
|
#[allow(dead_code)]
|
|
|
|
#[derive(Clone, Eq, PartialEq, Debug)]
|
2023-02-15 11:19:23 +01:00
|
|
|
#[non_exhaustive]
|
2022-12-19 17:03:26 +01:00
|
|
|
pub enum Request {
|
2023-07-05 21:08:04 +02:00
|
|
|
Hk(HkRequest),
|
|
|
|
Mode(ModeRequest),
|
|
|
|
Action(ActionRequest),
|
2022-12-19 17:03:26 +01:00
|
|
|
}
|
2022-12-21 10:15:41 +01:00
|
|
|
|
2023-08-15 08:49:54 +02:00
|
|
|
#[derive(Clone, Eq, PartialEq, Debug, new)]
|
2023-02-27 13:44:24 +01:00
|
|
|
pub struct TargetedRequest {
|
2024-02-20 14:33:21 +01:00
|
|
|
pub(crate) target_id: TargetId,
|
2023-02-27 13:44:24 +01:00
|
|
|
pub(crate) request: Request,
|
|
|
|
}
|
|
|
|
|
2023-07-05 21:08:04 +02:00
|
|
|
#[derive(Clone, Eq, PartialEq, Debug)]
|
2023-02-27 13:44:24 +01:00
|
|
|
pub struct RequestWithToken {
|
|
|
|
pub(crate) targeted_request: TargetedRequest,
|
|
|
|
pub(crate) token: VerificationToken<TcStateAccepted>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl RequestWithToken {
|
|
|
|
pub fn new(
|
2024-02-20 14:33:21 +01:00
|
|
|
target_id: TargetId,
|
2023-02-27 13:44:24 +01:00
|
|
|
request: Request,
|
|
|
|
token: VerificationToken<TcStateAccepted>,
|
|
|
|
) -> Self {
|
|
|
|
Self {
|
|
|
|
targeted_request: TargetedRequest::new(target_id, request),
|
|
|
|
token,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2024-02-20 14:33:21 +01:00
|
|
|
|
|
|
|
#[derive(Default, Clone)]
|
|
|
|
pub struct GenericRequestRouter(pub HashMap<TargetId, mpsc::Sender<RequestWithToken>>);
|
|
|
|
|
|
|
|
impl PusHkRequestRouter for GenericRequestRouter {
|
|
|
|
type Error = GenericRoutingError;
|
|
|
|
|
|
|
|
fn route(
|
|
|
|
&self,
|
|
|
|
target_id: TargetId,
|
|
|
|
hk_request: HkRequest,
|
|
|
|
token: VerificationToken<TcStateAccepted>,
|
|
|
|
) -> Result<(), Self::Error> {
|
|
|
|
if let Some(sender) = self.0.get(&target_id) {
|
|
|
|
sender
|
|
|
|
.send(RequestWithToken::new(
|
|
|
|
target_id,
|
|
|
|
Request::Hk(hk_request),
|
|
|
|
token,
|
|
|
|
))
|
|
|
|
.map_err(|_| GenericRoutingError::SendError(GenericSendError::RxDisconnected))?;
|
|
|
|
}
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl PusActionRequestRouter for GenericRequestRouter {
|
|
|
|
type Error = GenericRoutingError;
|
|
|
|
|
|
|
|
fn route(
|
|
|
|
&self,
|
|
|
|
target_id: TargetId,
|
|
|
|
action_request: ActionRequest,
|
|
|
|
token: VerificationToken<TcStateAccepted>,
|
|
|
|
) -> Result<(), Self::Error> {
|
|
|
|
if let Some(sender) = self.0.get(&target_id) {
|
|
|
|
sender
|
|
|
|
.send(RequestWithToken::new(
|
|
|
|
target_id,
|
|
|
|
Request::Action(action_request),
|
|
|
|
token,
|
|
|
|
))
|
|
|
|
.map_err(|_| GenericRoutingError::SendError(GenericSendError::RxDisconnected))?;
|
|
|
|
}
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|