11#![ allow( dead_code) ]
2+ use std:: collections:: VecDeque ;
23use std:: net:: { SocketAddr , UdpSocket } ;
3- use std:: sync:: mpsc;
4+ use std:: sync:: { mpsc, Arc , Mutex } ;
45
56use log:: { info, warn} ;
67use satrs:: hal:: std:: udp_server:: { ReceiveResult , UdpTcServer } ;
78use satrs:: pus:: HandlingStatus ;
89use satrs:: queue:: GenericSendError ;
9- use satrs:: tmtc:: PacketAsVec ;
1010
11- use satrs:: pool:: { PoolProviderWithGuards , SharedStaticMemoryPool } ;
12- use satrs:: tmtc:: PacketInPool ;
11+ use satrs_example:: CcsdsTmPacketOwned ;
1312
1413use crate :: tmtc:: sender:: TmTcSender ;
1514
16- pub trait UdpTmHandler {
15+ pub trait UdpTmHandlerProvider {
1716 fn send_tm_to_udp_client ( & mut self , socket : & UdpSocket , recv_addr : & SocketAddr ) ;
1817}
1918
19+ /*
2020pub struct StaticUdpTmHandler {
2121 pub tm_rx: mpsc::Receiver<PacketInPool>,
2222 pub tm_store: SharedStaticMemoryPool,
@@ -45,35 +45,67 @@ impl UdpTmHandler for StaticUdpTmHandler {
4545 }
4646 }
4747}
48+ */
4849
49- pub struct DynamicUdpTmHandler {
50- pub tm_rx : mpsc:: Receiver < PacketAsVec > ,
50+ pub struct UdpTmHandlerWithChannel {
51+ pub tm_rx : mpsc:: Receiver < CcsdsTmPacketOwned > ,
5152}
5253
53- impl UdpTmHandler for DynamicUdpTmHandler {
54+ impl UdpTmHandlerProvider for UdpTmHandlerWithChannel {
5455 fn send_tm_to_udp_client ( & mut self , socket : & UdpSocket , recv_addr : & SocketAddr ) {
5556 while let Ok ( tm) = self . tm_rx . try_recv ( ) {
56- if tm. packet . len ( ) > 9 {
57- let service = tm. packet [ 7 ] ;
58- let subservice = tm. packet [ 8 ] ;
59- info ! ( "Sending PUS TM[{service},{subservice}]" )
60- } else {
61- info ! ( "Sending PUS TM" ) ;
62- }
63- let result = socket. send_to ( & tm. packet , recv_addr) ;
57+ info ! ( "Sending PUS TM with header {:?}" , tm. tm_header) ;
58+ let result = socket. send_to ( & tm. to_vec ( ) , recv_addr) ;
6459 if let Err ( e) = result {
6560 warn ! ( "Sending TM with UDP socket failed: {e}" )
6661 }
6762 }
6863 }
6964}
7065
71- pub struct UdpTmtcServer < TmHandler : UdpTmHandler > {
66+ #[ derive( Default , Debug , Clone ) ]
67+ pub struct TestTmHandler {
68+ addrs_to_send_to : Arc < Mutex < VecDeque < SocketAddr > > > ,
69+ }
70+
71+ impl UdpTmHandlerProvider for TestTmHandler {
72+ fn send_tm_to_udp_client ( & mut self , _socket : & UdpSocket , recv_addr : & SocketAddr ) {
73+ self . addrs_to_send_to . lock ( ) . unwrap ( ) . push_back ( * recv_addr) ;
74+ }
75+ }
76+
77+ pub enum UdpTmHandler {
78+ Normal ( UdpTmHandlerWithChannel ) ,
79+ Test ( TestTmHandler ) ,
80+ }
81+
82+ impl From < UdpTmHandlerWithChannel > for UdpTmHandler {
83+ fn from ( handler : UdpTmHandlerWithChannel ) -> Self {
84+ UdpTmHandler :: Normal ( handler)
85+ }
86+ }
87+
88+ impl From < TestTmHandler > for UdpTmHandler {
89+ fn from ( handler : TestTmHandler ) -> Self {
90+ UdpTmHandler :: Test ( handler)
91+ }
92+ }
93+
94+ impl UdpTmHandlerProvider for UdpTmHandler {
95+ fn send_tm_to_udp_client ( & mut self , socket : & UdpSocket , recv_addr : & SocketAddr ) {
96+ match self {
97+ UdpTmHandler :: Normal ( handler) => handler. send_tm_to_udp_client ( socket, recv_addr) ,
98+ UdpTmHandler :: Test ( handler) => handler. send_tm_to_udp_client ( socket, recv_addr) ,
99+ }
100+ }
101+ }
102+
103+ pub struct UdpTmtcServer {
72104 pub udp_tc_server : UdpTcServer < TmTcSender , GenericSendError > ,
73- pub tm_handler : TmHandler ,
105+ pub tm_handler : UdpTmHandler ,
74106}
75107
76- impl < TmHandler : UdpTmHandler > UdpTmtcServer < TmHandler > {
108+ impl UdpTmtcServer {
77109 pub fn periodic_operation ( & mut self ) {
78110 loop {
79111 if self . poll_tc_server ( ) == HandlingStatus :: Empty {
@@ -107,12 +139,8 @@ impl<TmHandler: UdpTmHandler> UdpTmtcServer<TmHandler> {
107139
108140#[ cfg( test) ]
109141mod tests {
142+ use std:: net:: IpAddr ;
110143 use std:: net:: Ipv4Addr ;
111- use std:: {
112- collections:: VecDeque ,
113- net:: IpAddr ,
114- sync:: { Arc , Mutex } ,
115- } ;
116144
117145 use arbitrary_int:: traits:: Integer as _;
118146 use arbitrary_int:: u14;
@@ -127,23 +155,12 @@ mod tests {
127155 use satrs_example:: config:: OBSW_SERVER_ADDR ;
128156 use satrs_example:: ids;
129157
130- use crate :: tmtc:: sender:: { MockSender , TmTcSender } ;
158+ use crate :: tmtc:: sender:: MockSender ;
131159
132160 use super :: * ;
133161
134162 const UDP_SERVER_ID : ComponentId = 0x05 ;
135163
136- #[ derive( Default , Debug , Clone ) ]
137- pub struct TestTmHandler {
138- addrs_to_send_to : Arc < Mutex < VecDeque < SocketAddr > > > ,
139- }
140-
141- impl UdpTmHandler for TestTmHandler {
142- fn send_tm_to_udp_client ( & mut self , _socket : & UdpSocket , recv_addr : & SocketAddr ) {
143- self . addrs_to_send_to . lock ( ) . unwrap ( ) . push_back ( * recv_addr) ;
144- }
145- }
146-
147164 #[ test]
148165 fn test_basic ( ) {
149166 let sock_addr = SocketAddr :: new ( IpAddr :: V4 ( OBSW_SERVER_ADDR ) , 0 ) ;
@@ -154,7 +171,7 @@ mod tests {
154171 let tm_handler_calls = tm_handler. addrs_to_send_to . clone ( ) ;
155172 let mut udp_dyn_server = UdpTmtcServer {
156173 udp_tc_server,
157- tm_handler,
174+ tm_handler : tm_handler . into ( ) ,
158175 } ;
159176 udp_dyn_server. periodic_operation ( ) ;
160177 let queue = udp_dyn_server
@@ -179,7 +196,7 @@ mod tests {
179196 let tm_handler_calls = tm_handler. addrs_to_send_to . clone ( ) ;
180197 let mut udp_dyn_server = UdpTmtcServer {
181198 udp_tc_server,
182- tm_handler,
199+ tm_handler : tm_handler . into ( ) ,
183200 } ;
184201 let sph = SpHeader :: new_for_unseg_tc ( ids:: Apid :: GenericPus . raw_value ( ) , u14:: ZERO , 0 ) ;
185202 let ping_tc = PusTcCreator :: new_simple (
0 commit comments