1use crate::bus::SimBus;
4use crate::clock::{Duration, Instant};
5use crate::io::NodeAddress;
6use acex_core::Vec;
7
8pub trait SimNode<const MAX_FRAME: usize, const MAX_OUTBOX: usize> {
20 type Error: core::fmt::Debug;
21
22 fn address(&self) -> &NodeAddress;
24
25 fn handle(&mut self, src: &NodeAddress, data: &[u8], now: Instant) -> Result<(), Self::Error>;
27
28 fn tick(&mut self, now: Instant) -> Result<(), Self::Error>;
33
34 fn drain_outbox(
39 &mut self,
40 out: &mut Vec<(NodeAddress, Vec<u8, MAX_FRAME>), MAX_OUTBOX>,
41 ) -> usize;
42}
43
44pub trait SimNodeErased<const MAX_FRAME: usize, const MAX_OUTBOX: usize> {
49 fn address(&self) -> &NodeAddress;
50 fn handle(&mut self, src: &NodeAddress, data: &[u8], now: Instant);
51 fn tick(&mut self, now: Instant);
52 fn drain_outbox(
53 &mut self,
54 out: &mut Vec<(NodeAddress, Vec<u8, MAX_FRAME>), MAX_OUTBOX>,
55 ) -> usize;
56}
57
58impl<const MAX_FRAME: usize, const MAX_OUTBOX: usize, T> SimNodeErased<MAX_FRAME, MAX_OUTBOX> for T
60where
61 T: SimNode<MAX_FRAME, MAX_OUTBOX>,
62 T::Error: core::fmt::Debug,
63{
64 fn address(&self) -> &NodeAddress {
65 SimNode::address(self)
66 }
67
68 fn handle(&mut self, src: &NodeAddress, data: &[u8], now: Instant) {
69 if let Err(e) = SimNode::handle(self, src, data, now) {
70 let _ = e;
74 }
75 }
76
77 fn tick(&mut self, now: Instant) {
78 if let Err(e) = SimNode::tick(self, now) {
79 let _ = e;
80 }
81 }
82
83 fn drain_outbox(
84 &mut self,
85 out: &mut Vec<(NodeAddress, Vec<u8, MAX_FRAME>), MAX_OUTBOX>,
86 ) -> usize {
87 SimNode::drain_outbox(self, out)
88 }
89}
90
91#[cfg_attr(all(feature = "defmt", not(feature = "alloc")), derive(defmt::Format))]
101pub struct SimRunner<const N: usize, const Q: usize> {
102 bus: SimBus<N, Q>,
103}
104
105impl<const N: usize, const Q: usize> SimRunner<N, Q> {
106 pub fn new(bus: SimBus<N, Q>) -> Self {
107 Self { bus }
108 }
109
110 pub fn tick(
115 &mut self,
116 nodes: &mut [&mut dyn SimNodeErased<N, Q>],
117 duration: Duration,
118 ) -> usize {
119 let delivered = self.bus.tick(duration);
120 let now = self.bus.now();
121 let mut count = 0;
122
123 for envelope in &delivered {
124 for node in nodes.iter_mut() {
125 if *node.address() == envelope.dst {
126 let _ = node.handle(&envelope.src, &envelope.data, now);
127 count += 1;
128 }
129 }
130 }
131
132 for node in nodes.iter_mut() {
133 let _ = node.tick(now);
134 }
135
136 let mut outbox = Vec::new();
137
138 for node in nodes.iter_mut() {
139 outbox.clear();
140 node.drain_outbox(&mut outbox);
141
142 let src = node.address().clone();
143 for (dst, data) in outbox.iter() {
144 self.bus.send(src.clone(), dst.clone(), data);
145 }
146 }
147
148 count
149 }
150
151 pub fn bus(&mut self) -> &mut SimBus<N, Q> {
152 &mut self.bus
153 }
154}
155
156