diff --git a/satrs-core/src/hal/std/tcp_cobs_server.rs b/satrs-core/src/hal/std/tcp_cobs_server.rs index 4a22a8a..cd99f47 100644 --- a/satrs-core/src/hal/std/tcp_cobs_server.rs +++ b/satrs-core/src/hal/std/tcp_cobs_server.rs @@ -1,4 +1,3 @@ -use alloc::boxed::Box; use alloc::vec; use cobs::encode; use delegate::delegate; @@ -111,11 +110,23 @@ impl TcpTmSender for CobsTmSender { /// /// The [TCP integration tests](https://egit.irs.uni-stuttgart.de/rust/sat-rs/src/branch/main/satrs-core/tests/tcp_servers.rs) /// test also serves as the example application for this module. -pub struct TcpTmtcInCobsServer { - generic_server: TcpTmtcGenericServer, +pub struct TcpTmtcInCobsServer< + TmError, + TcError: 'static, + TmSource: TmPacketSource, + TcReceiver: ReceivesTc, +> { + generic_server: + TcpTmtcGenericServer, } -impl TcpTmtcInCobsServer { +impl< + TmError: 'static, + TcError: 'static, + TmSource: TmPacketSource, + TcReceiver: ReceivesTc, + > TcpTmtcInCobsServer +{ /// Create a new TCP TMTC server which exchanges TMTC packets encoded with /// [COBS protocol](https://en.wikipedia.org/wiki/Consistent_Overhead_Byte_Stuffing). /// @@ -128,8 +139,8 @@ impl TcpTmtcInCobsServer { /// forwarded to this TC receiver. pub fn new( cfg: ServerConfig, - tm_source: Box>, - tc_receiver: Box>, + tm_source: TmSource, + tc_receiver: TcReceiver, ) -> Result> { Ok(Self { generic_server: TcpTmtcGenericServer::new( @@ -177,7 +188,7 @@ mod tests { ServerConfig, }, }; - use alloc::{boxed::Box, sync::Arc}; + use alloc::sync::Arc; use cobs::encode; use super::TcpTmtcInCobsServer; @@ -202,11 +213,11 @@ mod tests { addr: &SocketAddr, tc_receiver: SyncTcCacher, tm_source: SyncTmSource, - ) -> TcpTmtcInCobsServer<(), ()> { + ) -> TcpTmtcInCobsServer<(), (), SyncTmSource, SyncTcCacher> { TcpTmtcInCobsServer::new( ServerConfig::new(*addr, Duration::from_millis(2), 1024, 1024), - Box::new(tm_source), - Box::new(tc_receiver), + tm_source, + tc_receiver, ) .expect("TCP server generation failed") } diff --git a/satrs-core/src/hal/std/tcp_server.rs b/satrs-core/src/hal/std/tcp_server.rs index cc721bd..0b5359d 100644 --- a/satrs-core/src/hal/std/tcp_server.rs +++ b/satrs-core/src/hal/std/tcp_server.rs @@ -1,6 +1,6 @@ //! Generic TCP TMTC servers with different TMTC format flavours. use alloc::vec; -use alloc::{boxed::Box, vec::Vec}; +use alloc::vec::Vec; use core::time::Duration; use socket2::{Domain, Socket, Type}; use std::io::Read; @@ -134,26 +134,30 @@ pub trait TcpTmSender { pub struct TcpTmtcGenericServer< TmError, TcError, - TmHandler: TcpTmSender, - TcHandler: TcpTcParser, + TmSource: TmPacketSource, + TcReceiver: ReceivesTc, + TmSender: TcpTmSender, + TcParser: TcpTcParser, > { // base: TcpTmtcServerBase, pub(crate) listener: TcpListener, pub(crate) inner_loop_delay: Duration, - pub(crate) tm_source: Box>, + pub(crate) tm_source: TmSource, pub(crate) tm_buffer: Vec, - pub(crate) tc_receiver: Box>, + pub(crate) tc_receiver: TcReceiver, pub(crate) tc_buffer: Vec, - tc_handler: TcHandler, - tm_handler: TmHandler, + tc_handler: TcParser, + tm_handler: TmSender, } impl< TmError: 'static, TcError: 'static, + TmSource: TmPacketSource, + TcReceiver: ReceivesTc, TmSender: TcpTmSender, TcParser: TcpTcParser, - > TcpTmtcGenericServer + > TcpTmtcGenericServer { /// Create a new generic TMTC server instance. /// @@ -171,9 +175,9 @@ impl< cfg: ServerConfig, tc_parser: TcParser, tm_sender: TmSender, - tm_source: Box>, - tc_receiver: Box>, - ) -> Result, std::io::Error> { + tm_source: TmSource, + tc_receiver: TcReceiver, + ) -> Result { // Create a TCP listener bound to two addresses. let socket = Socket::new(Domain::IPV4, Type::STREAM, None)?; socket.set_reuse_address(cfg.reuse_addr)?; @@ -236,7 +240,7 @@ impl< if current_write_idx > 0 { self.tc_handler.handle_tc_parsing( &mut self.tc_buffer, - self.tc_receiver.as_mut(), + &mut self.tc_receiver, &mut connection_result, current_write_idx, &mut next_write_idx, @@ -250,7 +254,7 @@ impl< if current_write_idx == self.tc_buffer.capacity() { self.tc_handler.handle_tc_parsing( &mut self.tc_buffer, - self.tc_receiver.as_mut(), + &mut self.tc_receiver, &mut connection_result, current_write_idx, &mut next_write_idx, @@ -264,7 +268,7 @@ impl< std::io::ErrorKind::WouldBlock | std::io::ErrorKind::TimedOut => { self.tc_handler.handle_tc_parsing( &mut self.tc_buffer, - self.tc_receiver.as_mut(), + &mut self.tc_receiver, &mut connection_result, current_write_idx, &mut next_write_idx, @@ -273,7 +277,7 @@ impl< if !self.tm_handler.handle_tm_sending( &mut self.tm_buffer, - self.tm_source.as_mut(), + &mut self.tm_source, &mut connection_result, &mut stream, )? { @@ -290,7 +294,7 @@ impl< } self.tm_handler.handle_tm_sending( &mut self.tm_buffer, - self.tm_source.as_mut(), + &mut self.tm_source, &mut connection_result, &mut stream, )?; diff --git a/satrs-core/src/hal/std/tcp_spacepackets_server.rs b/satrs-core/src/hal/std/tcp_spacepackets_server.rs index 42c61e9..23c8466 100644 --- a/satrs-core/src/hal/std/tcp_spacepackets_server.rs +++ b/satrs-core/src/hal/std/tcp_spacepackets_server.rs @@ -88,16 +88,31 @@ impl TcpTmSender for SpacepacketsTmSender { /// [spacepackets::PacketId]s as part of the server configuration for that purpose. /// /// ## Example -/// /// The [TCP server integration tests](https://egit.irs.uni-stuttgart.de/rust/sat-rs/src/branch/main/satrs-core/tests/tcp_servers.rs) /// also serves as the example application for this module. -pub struct TcpSpacepacketsServer { - generic_server: - TcpTmtcGenericServer, +pub struct TcpSpacepacketsServer< + TmError, + TcError: 'static, + TmSource: TmPacketSource, + TcReceiver: ReceivesTc, +> { + generic_server: TcpTmtcGenericServer< + TmError, + TcError, + TmSource, + TcReceiver, + SpacepacketsTmSender, + SpacepacketsTcParser, + >, } -impl TcpSpacepacketsServer { - /// Create a new TCP TMTC server which exchanges CCSDS space packets. +impl< + TmError: 'static, + TcError: 'static, + TmSource: TmPacketSource, + TcReceiver: ReceivesTc, + > TcpSpacepacketsServer +{ /// /// ## Parameter /// @@ -110,8 +125,8 @@ impl TcpSpacepacketsServer /// parsing. This mechanism is used to have a start marker for finding CCSDS packets. pub fn new( cfg: ServerConfig, - tm_source: Box>, - tc_receiver: Box>, + tm_source: TmSource, + tc_receiver: TcReceiver, packet_id_lookup: Box, ) -> Result> { Ok(Self { @@ -179,11 +194,11 @@ mod tests { tc_receiver: SyncTcCacher, tm_source: SyncTmSource, packet_id_lookup: HashSet, - ) -> TcpSpacepacketsServer<(), ()> { + ) -> TcpSpacepacketsServer<(), (), SyncTmSource, SyncTcCacher> { TcpSpacepacketsServer::new( ServerConfig::new(*addr, Duration::from_millis(2), 1024, 1024), - Box::new(tm_source), - Box::new(tc_receiver), + tm_source, + tc_receiver, Box::new(packet_id_lookup), ) .expect("TCP server generation failed") diff --git a/satrs-core/tests/tcp_servers.rs b/satrs-core/tests/tcp_servers.rs index d66c1fb..251eead 100644 --- a/satrs-core/tests/tcp_servers.rs +++ b/satrs-core/tests/tcp_servers.rs @@ -94,8 +94,8 @@ fn test_cobs_server() { tm_source.add_tm(&INVERTED_PACKET); let mut tcp_server = TcpTmtcInCobsServer::new( ServerConfig::new(AUTO_PORT_ADDR, Duration::from_millis(2), 1024, 1024), - Box::new(tm_source), - Box::new(tc_receiver.clone()), + tm_source, + tc_receiver.clone(), ) .expect("TCP server generation failed"); let dest_addr = tcp_server @@ -176,8 +176,8 @@ fn test_ccsds_server() { packet_id_lookup.insert(TEST_PACKET_ID_0); let mut tcp_server = TcpSpacepacketsServer::new( ServerConfig::new(AUTO_PORT_ADDR, Duration::from_millis(2), 1024, 1024), - Box::new(tm_source), - Box::new(tc_receiver.clone()), + tm_source, + tc_receiver.clone(), Box::new(packet_id_lookup), ) .expect("TCP server generation failed");