1use crate::{
11 can_bus::{CanEvent, CanSimBus},
12 clock::{Duration, Instant},
13 io::NodeAddress,
14 node::SimNodeErased,
15};
16use acex_core::Vec;
17
18pub trait CanEventHandler {
27 fn on_can_event(&mut self, event: &CanEvent, now: Instant);
28}
29
30#[cfg_attr(all(feature = "defmt", not(feature = "alloc")), derive(defmt::Format))]
39pub struct CanSimRunner<const N: usize, const Q: usize> {
40 bus: CanSimBus<N, Q>,
41}
42
43impl<const MAX_FRAME: usize, const MAX_OUTBOX: usize> CanSimRunner<MAX_FRAME, MAX_OUTBOX> {
44 pub fn new(bus: CanSimBus<MAX_FRAME, MAX_OUTBOX>) -> Self {
45 Self { bus }
46 }
47
48 pub fn bus(&mut self) -> &mut CanSimBus<MAX_FRAME, MAX_OUTBOX> {
49 &mut self.bus
50 }
51
52 pub fn now(&self) -> Instant {
53 self.bus.now()
54 }
55
56 pub fn tick(
67 &mut self,
68 nodes: &mut [&mut dyn SimNodeErased<MAX_FRAME, MAX_OUTBOX>],
69 can_event_nodes: &mut [&mut dyn CanEventHandler],
70 duration: Duration,
71 ) -> usize {
72 let delivered = self.bus.tick(duration);
73 let now = self.bus.now();
74 let mut count = 0;
75
76 for envelope in &delivered {
77 for node in nodes.iter_mut() {
78 if *node.address() == envelope.dst {
79 node.handle(&envelope.src, &envelope.data, now);
80 count += 1;
81 }
82 }
83 }
84
85 let can_events: Vec<CanEvent, 16> = self.bus.drain_events().collect();
86 for event in &can_events {
87 for handler in can_event_nodes.iter_mut() {
88 handler.on_can_event(event, now);
89 }
90 }
91
92 for node in nodes.iter_mut() {
93 node.tick(now);
94 }
95
96 let mut outbox: Vec<(NodeAddress, Vec<u8, MAX_FRAME>), MAX_OUTBOX> = Vec::new();
97 for node in nodes.iter_mut() {
98 outbox.clear();
99 node.drain_outbox(&mut outbox);
100
101 let src = node.address().clone();
102 for (dst, data) in outbox.iter() {
103 self.bus.send(src.clone(), dst.clone(), data);
104 }
105 }
106
107 count
108 }
109}
110
111