leodos_protocols/transport/srspp/api/cfs/
mod.rs1mod listener;
3mod node;
5mod receiver;
7mod sender;
9
10pub use listener::SrsppStream;
11pub use node::{SrsppNode, SrsppNodeDriver};
12pub use receiver::{DeliveryToken, SrsppReceiver, SrsppReceiverDriver, SrsppRxHandle};
13pub use sender::{
14 SimpleSender, SrsppSender, SrsppSenderDriver, SrsppTxHandle,
15};
16
17use leodos_libcfs::cfe::time::SysTime;
18
19use crate::network::spp::SequenceCount;
20use crate::transport::srspp::machine::receiver::ReceiverError;
21use crate::transport::srspp::machine::sender::SenderError;
22use crate::transport::srspp::packet;
23
24#[derive(Debug, Clone, thiserror::Error)]
26pub enum TransportError<E> {
27 #[error(transparent)]
29 Sender(#[from] SenderError),
30 #[error(transparent)]
32 Receiver(#[from] ReceiverError),
33 #[error("network error: {0}")]
35 Network(E),
36 #[error(transparent)]
38 Packet(#[from] packet::SrsppPacketError),
39}
40
41struct TimerSet<const N: usize> {
43 timers: [(SequenceCount, Option<SysTime>); N],
45}
46
47impl<const N: usize> TimerSet<N> {
48 fn new() -> Self {
50 Self {
51 timers: [(SequenceCount::new(), None); N],
52 }
53 }
54
55 fn start(&mut self, seq: SequenceCount, deadline: SysTime) {
57 for slot in &mut self.timers {
58 if slot.1.is_none() {
59 *slot = (seq, Some(deadline));
60 return;
61 }
62 }
63 }
64
65 fn stop(&mut self, seq: SequenceCount) {
67 for slot in &mut self.timers {
68 if slot.0 == seq && slot.1.is_some() {
69 slot.1 = None;
70 }
71 }
72 }
73
74 fn expired(&mut self, now: SysTime) -> impl Iterator<Item = SequenceCount> + '_ {
76 self.timers.iter_mut().filter_map(move |slot| {
77 if let Some(deadline) = slot.1 {
78 if now >= deadline {
79 slot.1 = None;
80 return Some(slot.0);
81 }
82 }
83 None
84 })
85 }
86
87 fn next_deadline(&self) -> Option<SysTime> {
89 self.timers
90 .iter()
91 .filter_map(|(_, deadline)| *deadline)
92 .min()
93 }
94}