diff --git a/satrs/src/mode_tree.rs b/satrs/src/mode_tree.rs index 80d8b2c..e088981 100644 --- a/satrs/src/mode_tree.rs +++ b/satrs/src/mode_tree.rs @@ -7,8 +7,9 @@ use crate::{ mode::{Mode, ModeAndSubmode, ModeReply, ModeRequest, Submode}, queue::GenericTargetedMessagingError, request::{ - MessageWithSenderId, MpscMessageReceiverWithIds, MpscMessageSenderAndReceiver, - MpscMessageSenderMap, MpscMessageSenderWithId, MpscRequestAndReplySenderAndReceiver, + MessageReceiver, MessageReceiverWithId, MessageSender, MessageSenderAndReceiver, + MessageSenderMap, MessageSenderMapWithId, MessageWithSenderId, + RequestAndReplySenderAndReceiver, }, ChannelId, }; @@ -71,7 +72,7 @@ pub trait ModeReplyReceiver { ) -> Result>, GenericTargetedMessagingError>; } -impl MpscMessageSenderMap { +impl> MessageSenderMap { pub fn send_mode_request( &self, local_id: ChannelId, @@ -81,16 +82,12 @@ impl MpscMessageSenderMap { self.send_message(local_id, target_id, request) } - pub fn add_request_target( - &mut self, - target_id: ChannelId, - request_sender: mpsc::Sender>, - ) { + pub fn add_request_target(&mut self, target_id: ChannelId, request_sender: S) { self.add_message_target(target_id, request_sender) } } -impl MpscMessageSenderMap { +impl> MessageSenderMap { pub fn send_mode_reply( &self, local_id: ChannelId, @@ -100,16 +97,12 @@ impl MpscMessageSenderMap { self.send_message(local_id, target_id, request) } - pub fn add_reply_target( - &mut self, - target_id: ChannelId, - request_sender: mpsc::Sender>, - ) { + pub fn add_reply_target(&mut self, target_id: ChannelId, request_sender: S) { self.add_message_target(target_id, request_sender) } } -impl ModeReplySender for MpscMessageSenderWithId { +impl> ModeReplySender for MessageSenderMapWithId { fn send_mode_reply( &self, target_channel_id: ChannelId, @@ -123,7 +116,7 @@ impl ModeReplySender for MpscMessageSenderWithId { } } -impl ModeRequestSender for MpscMessageSenderWithId { +impl> ModeRequestSender for MessageSenderMapWithId { fn local_channel_id(&self) -> ChannelId { self.local_channel_id } @@ -137,14 +130,16 @@ impl ModeRequestSender for MpscMessageSenderWithId { } } -impl ModeReplyReceiver for MpscMessageReceiverWithIds { +impl> ModeReplyReceiver for MessageReceiverWithId { fn try_recv_mode_reply( &self, ) -> Result>, GenericTargetedMessagingError> { self.try_recv_message() } } -impl ModeRequestReceiver for MpscMessageReceiverWithIds { +impl> ModeRequestReceiver + for MessageReceiverWithId +{ fn try_recv_mode_request( &self, ) -> Result>, GenericTargetedMessagingError> { @@ -152,7 +147,9 @@ impl ModeRequestReceiver for MpscMessageReceiverWithIds { } } -impl ModeRequestSender for MpscMessageSenderAndReceiver { +impl, R: MessageReceiver> ModeRequestSender + for MessageSenderAndReceiver +{ fn local_channel_id(&self) -> ChannelId { self.local_channel_id_generic() } @@ -167,7 +164,9 @@ impl ModeRequestSender for MpscMessageSenderAndReceiver } } -impl ModeReplySender for MpscMessageSenderAndReceiver { +impl, R: MessageReceiver> ModeReplySender + for MessageSenderAndReceiver +{ fn local_channel_id(&self) -> ChannelId { self.local_channel_id_generic() } @@ -182,7 +181,9 @@ impl ModeReplySender for MpscMessageSenderAndReceiver { } } -impl ModeReplyReceiver for MpscMessageSenderAndReceiver { +impl, R: MessageReceiver> ModeReplyReceiver + for MessageSenderAndReceiver +{ fn try_recv_mode_reply( &self, ) -> Result>, GenericTargetedMessagingError> { @@ -190,7 +191,9 @@ impl ModeReplyReceiver for MpscMessageSenderAndReceiver { .try_recv_message(self.local_channel_id_generic()) } } -impl ModeRequestReceiver for MpscMessageSenderAndReceiver { +impl, R: MessageReceiver> ModeRequestReceiver + for MessageSenderAndReceiver +{ fn try_recv_mode_request( &self, ) -> Result>, GenericTargetedMessagingError> { @@ -199,33 +202,63 @@ impl ModeRequestReceiver for MpscMessageSenderAndReceiver { } } -pub type MpscModeRequestHandlerConnector = MpscMessageSenderAndReceiver; -pub type MpscModeRequestorConnector = MpscMessageSenderAndReceiver; -pub type MpscModeConnector = MpscRequestAndReplySenderAndReceiver; +pub type ModeRequestHandlerConnector = MessageSenderAndReceiver; +pub type MpscModeRequestHandlerConnector = ModeRequestHandlerConnector< + mpsc::Sender>, + mpsc::Receiver>, +>; -impl MpscRequestAndReplySenderAndReceiver { - pub fn add_request_target( - &mut self, - target_id: ChannelId, - request_sender: mpsc::Sender>, - ) { +pub type ModeRequestorConnector = MessageSenderAndReceiver; +pub type MpscModeRequestorConnector = ModeRequestorConnector< + mpsc::Sender>, + mpsc::Receiver>, +>; + +pub type ModeConnector = + RequestAndReplySenderAndReceiver; +pub type MpscModeConnector = ModeConnector< + mpsc::Sender>, + mpsc::Receiver>, + mpsc::Sender>, + mpsc::Receiver>, +>; + +impl< + REPLY, + S0: MessageSender, + R0: MessageReceiver, + S1: MessageSender, + R1: MessageReceiver, + > RequestAndReplySenderAndReceiver +{ + pub fn add_request_target(&mut self, target_id: ChannelId, request_sender: S0) { self.request_sender_map .add_message_target(target_id, request_sender) } } -impl MpscRequestAndReplySenderAndReceiver { - pub fn add_reply_target( - &mut self, - target_id: ChannelId, - reply_sender: mpsc::Sender>, - ) { +impl< + REQUEST, + S0: MessageSender, + R0: MessageReceiver, + S1: MessageSender, + R1: MessageReceiver, + > RequestAndReplySenderAndReceiver +{ + pub fn add_reply_target(&mut self, target_id: ChannelId, reply_sender: S1) { self.reply_sender_map .add_message_target(target_id, reply_sender) } } -impl ModeRequestSender for MpscRequestAndReplySenderAndReceiver { +impl< + REPLY, + S0: MessageSender, + R0: MessageReceiver, + S1: MessageSender, + R1: MessageReceiver, + > ModeRequestSender for RequestAndReplySenderAndReceiver +{ fn local_channel_id(&self) -> ChannelId { self.local_channel_id_generic() } @@ -240,7 +273,14 @@ impl ModeRequestSender for MpscRequestAndReplySenderAndReceiver ModeReplySender for MpscRequestAndReplySenderAndReceiver { +impl< + REQUEST, + S0: MessageSender, + R0: MessageReceiver, + S1: MessageSender, + R1: MessageReceiver, + > ModeReplySender for RequestAndReplySenderAndReceiver +{ fn local_channel_id(&self) -> ChannelId { self.local_channel_id_generic() } @@ -255,7 +295,14 @@ impl ModeReplySender for MpscRequestAndReplySenderAndReceiver ModeReplyReceiver for MpscRequestAndReplySenderAndReceiver { +impl< + REQUEST, + S0: MessageSender, + R0: MessageReceiver, + S1: MessageSender, + R1: MessageReceiver, + > ModeReplyReceiver for RequestAndReplySenderAndReceiver +{ fn try_recv_mode_reply( &self, ) -> Result>, GenericTargetedMessagingError> { @@ -264,7 +311,14 @@ impl ModeReplyReceiver for MpscRequestAndReplySenderAndReceiver ModeRequestReceiver for MpscRequestAndReplySenderAndReceiver { +impl< + REPLY, + S0: MessageSender, + R0: MessageReceiver, + S1: MessageSender, + R1: MessageReceiver, + > ModeRequestReceiver for RequestAndReplySenderAndReceiver +{ fn try_recv_mode_request( &self, ) -> Result>, GenericTargetedMessagingError> { diff --git a/satrs/src/request.rs b/satrs/src/request.rs index 4ef482c..2cb174c 100644 --- a/satrs/src/request.rs +++ b/satrs/src/request.rs @@ -11,7 +11,7 @@ use spacepackets::{ ByteConversionError, CcsdsPacket, }; -use crate::{ChannelId, TargetId}; +use crate::{queue::GenericTargetedMessagingError, ChannelId, TargetId}; pub type Apid = u16; @@ -113,20 +113,31 @@ impl fmt::Display for TargetAndApidId { } } -pub struct MessageWithSenderId { +pub struct MessageWithSenderId { pub sender_id: ChannelId, - pub message: MESSAGE, + pub message: MSG, } -impl MessageWithSenderId { - pub fn new(sender_id: ChannelId, message: MESSAGE) -> Self { +impl MessageWithSenderId { + pub fn new(sender_id: ChannelId, message: MSG) -> Self { Self { sender_id, message } } } +/// Generic trait for objects which can send targeted messages. +pub trait MessageSender: Send { + fn send(&self, message: MessageWithSenderId) -> Result<(), GenericTargetedMessagingError>; +} + +// Generic trait for objects which can receive targeted messages. +pub trait MessageReceiver { + fn try_recv(&self) -> Result>, GenericTargetedMessagingError>; +} + #[cfg(feature = "std")] #[cfg_attr(doc_cfg, doc(cfg(feature = "std")))] mod std_mod { + use core::marker::PhantomData; use std::sync::mpsc; use hashbrown::HashMap; @@ -136,24 +147,59 @@ mod std_mod { ChannelId, }; - use super::MessageWithSenderId; + use super::{MessageReceiver, MessageSender, MessageWithSenderId}; - pub struct MpscMessageSenderMap( - pub HashMap>>, - ); - - impl Default for MpscMessageSenderMap { - fn default() -> Self { - Self(Default::default()) + impl MessageSender for mpsc::Sender> { + fn send( + &self, + message: MessageWithSenderId, + ) -> Result<(), GenericTargetedMessagingError> { + self.send(message) + .map_err(|_| GenericSendError::RxDisconnected)?; + Ok(()) + } + } + impl MessageSender for mpsc::SyncSender> { + fn send( + &self, + message: MessageWithSenderId, + ) -> Result<(), GenericTargetedMessagingError> { + if let Err(e) = self.try_send(message) { + match e { + mpsc::TrySendError::Full(_) => { + return Err(GenericSendError::QueueFull(None).into()); + } + mpsc::TrySendError::Disconnected(_) => todo!(), + } + } + Ok(()) } } - impl MpscMessageSenderMap { + pub struct MessageSenderMap>( + pub HashMap, + PhantomData, + ); + + pub type MpscSenderMap = MessageReceiverWithId>; + pub type MpscBoundedSenderMap = MessageReceiverWithId>; + + impl> Default for MessageSenderMap { + fn default() -> Self { + Self(Default::default(), PhantomData) + } + } + + impl> MessageSenderMap { + pub fn add_message_target(&mut self, target_id: ChannelId, message_sender: S) { + self.0.insert(target_id, message_sender); + } + pub fn send_message( &self, local_channel_id: ChannelId, target_channel_id: ChannelId, - message: MESSAGE, + message: MSG, ) -> Result<(), GenericTargetedMessagingError> { if self.0.contains_key(&target_channel_id) { self.0 @@ -167,22 +213,14 @@ mod std_mod { target_channel_id, )) } - - pub fn add_message_target( - &mut self, - target_id: ChannelId, - message_sender: mpsc::Sender>, - ) { - self.0.insert(target_id, message_sender); - } } - pub struct MpscMessageSenderWithId { + pub struct MessageSenderMapWithId> { pub local_channel_id: ChannelId, - pub message_sender_map: MpscMessageSenderMap, + pub message_sender_map: MessageSenderMap, } - impl MpscMessageSenderWithId { + impl> MessageSenderMapWithId { pub fn new(local_channel_id: ChannelId) -> Self { Self { local_channel_id, @@ -193,62 +231,62 @@ mod std_mod { pub fn send_message( &self, target_channel_id: ChannelId, - message: MESSAGE, + message: MSG, ) -> Result<(), GenericTargetedMessagingError> { self.message_sender_map .send_message(self.local_channel_id, target_channel_id, message) } - pub fn add_message_target( - &mut self, - target_id: ChannelId, - message_sender: mpsc::Sender>, - ) { + pub fn add_message_target(&mut self, target_id: ChannelId, message_sender: S) { self.message_sender_map .add_message_target(target_id, message_sender) } } - pub struct MpscMessageWithSenderReceiver( - pub mpsc::Receiver>, - ); - - impl From>> - for MpscMessageWithSenderReceiver - { - fn from(value: mpsc::Receiver>) -> Self { - Self(value) + impl MessageReceiver for mpsc::Receiver> { + fn try_recv( + &self, + ) -> Result>, GenericTargetedMessagingError> { + match self.try_recv() { + Ok(msg) => Ok(Some(msg)), + Err(e) => match e { + mpsc::TryRecvError::Empty => Ok(None), + mpsc::TryRecvError::Disconnected => { + Err(GenericReceiveError::TxDisconnected(None).into()) + } + }, + } } } - impl MpscMessageWithSenderReceiver { + pub struct MessageWithSenderIdReceiver>(pub R, PhantomData); + + impl> From for MessageWithSenderIdReceiver { + fn from(receiver: R) -> Self { + MessageWithSenderIdReceiver(receiver, PhantomData) + } + } + + impl> MessageWithSenderIdReceiver { pub fn try_recv_message( &self, - local_id: ChannelId, - ) -> Result>, GenericTargetedMessagingError> { - match self.0.try_recv() { - Ok(reply) => { - return Ok(Some(reply)); - } - Err(e) => { - if e == mpsc::TryRecvError::Disconnected { - return Err(GenericReceiveError::TxDisconnected(Some(local_id)).into()); - } - } - } - Ok(None) + _local_id: ChannelId, + ) -> Result>, GenericTargetedMessagingError> { + self.0.try_recv() } } - pub struct MpscMessageReceiverWithIds { + pub struct MessageReceiverWithId> { local_channel_id: ChannelId, - reply_receiver: MpscMessageWithSenderReceiver, + reply_receiver: MessageWithSenderIdReceiver, } - impl MpscMessageReceiverWithIds { + pub type MpscMessageReceiverWithId = MessageReceiverWithId>; + + impl> MessageReceiverWithId { pub fn new( local_channel_id: ChannelId, - reply_receiver: MpscMessageWithSenderReceiver, + reply_receiver: MessageWithSenderIdReceiver, ) -> Self { Self { local_channel_id, @@ -259,50 +297,34 @@ mod std_mod { pub fn local_channel_id(&self) -> ChannelId { self.local_channel_id } + } + impl> MessageReceiverWithId { pub fn try_recv_message( &self, - ) -> Result>, GenericTargetedMessagingError> { - match self.reply_receiver.0.try_recv() { - Ok(reply) => { - return Ok(Some(reply)); - } - Err(e) => { - if e == mpsc::TryRecvError::Disconnected { - return Err(GenericReceiveError::TxDisconnected(Some( - self.local_channel_id(), - )) - .into()); - } - } - } - Ok(None) + ) -> Result>, GenericTargetedMessagingError> { + self.reply_receiver.0.try_recv() } } - pub struct MpscMessageSenderAndReceiver { + pub struct MessageSenderAndReceiver, R: MessageReceiver> { pub local_channel_id: ChannelId, - pub message_sender_map: MpscMessageSenderMap, - pub message_receiver: MpscMessageWithSenderReceiver, + pub message_sender_map: MessageSenderMap, + pub message_receiver: MessageWithSenderIdReceiver, } - impl MpscMessageSenderAndReceiver { - pub fn new( - local_channel_id: ChannelId, - message_receiver: mpsc::Receiver>, - ) -> Self { + impl, R: MessageReceiver> + MessageSenderAndReceiver + { + pub fn new(local_channel_id: ChannelId, message_receiver: R) -> Self { Self { local_channel_id, message_sender_map: Default::default(), - message_receiver: MpscMessageWithSenderReceiver::from(message_receiver), + message_receiver: MessageWithSenderIdReceiver::from(message_receiver), } } - pub fn add_message_target( - &mut self, - target_id: ChannelId, - message_sender: mpsc::Sender>, - ) { + pub fn add_message_target(&mut self, target_id: ChannelId, message_sender: S) { self.message_sender_map .add_message_target(target_id, message_sender) } @@ -312,22 +334,33 @@ mod std_mod { } } - pub struct MpscRequestAndReplySenderAndReceiver { + pub struct RequestAndReplySenderAndReceiver< + REQUEST, + REPLY, + S0: MessageSender, + R0: MessageReceiver, + S1: MessageSender, + R1: MessageReceiver, + > { pub local_channel_id: ChannelId, // These 2 are a functional group. - pub request_sender_map: MpscMessageSenderMap, - pub reply_receiver: MpscMessageWithSenderReceiver, + pub request_sender_map: MessageSenderMap, + pub reply_receiver: MessageWithSenderIdReceiver, // These 2 are a functional group. - pub request_receiver: MpscMessageWithSenderReceiver, - pub reply_sender_map: MpscMessageSenderMap, + pub request_receiver: MessageWithSenderIdReceiver, + pub reply_sender_map: MessageSenderMap, } - impl MpscRequestAndReplySenderAndReceiver { - pub fn new( - local_channel_id: ChannelId, - request_receiver: mpsc::Receiver>, - reply_receiver: mpsc::Receiver>, - ) -> Self { + impl< + REQUEST, + REPLY, + S0: MessageSender, + R0: MessageReceiver, + S1: MessageSender, + R1: MessageReceiver, + > RequestAndReplySenderAndReceiver + { + pub fn new(local_channel_id: ChannelId, request_receiver: R1, reply_receiver: R0) -> Self { Self { local_channel_id, request_receiver: request_receiver.into(),