ross_protocol/
protocol.rs1#![allow(mutable_transmutes)]
2use alloc::boxed::Box;
3use alloc::collections::BTreeMap;
4use alloc::vec;
5use alloc::vec::Vec;
6use core::mem::transmute;
7
8use crate::convert_packet::ConvertPacket;
9use crate::interface::*;
10use crate::packet::Packet;
11
12pub const BROADCAST_ADDRESS: u16 = 0xffff;
13
14#[derive(Debug)]
15pub enum ProtocolError {
16 InterfaceError(InterfaceError),
17 NoSuchHandler,
18 PacketTimeout,
19}
20
21pub struct Protocol<'a> {
22 device_address: u16,
23 interface: Box<dyn Interface>,
24 #[cfg(not(feature = "send"))]
25 handlers: BTreeMap<u32, (Box<dyn FnMut(&Packet, &mut Self) + 'a>, bool)>,
26 #[cfg(feature = "send")]
27 handlers: BTreeMap<u32, (Box<dyn FnMut(&Packet, &mut Self) + Send + 'a>, bool)>,
28}
29
30impl<'a> Protocol<'a> {
31 pub fn new(device_address: u16, interface: Box<dyn Interface>) -> Self {
32 Protocol {
33 device_address,
34 interface,
35 handlers: BTreeMap::new(),
36 }
37 }
38
39 pub fn tick(&mut self) -> Result<(), ProtocolError> {
40 match self.interface.try_get_packet() {
41 Ok(packet) => {
42 if packet.device_address == self.device_address
43 || packet.device_address == BROADCAST_ADDRESS
44 {
45 self.handle_packet(&packet, true);
46 } else {
47 self.handle_packet(&packet, false);
48 }
49
50 Ok(())
51 }
52 Err(err) => match err {
53 InterfaceError::NoPacketReceived => Ok(()),
54 _ => Err(ProtocolError::InterfaceError(err)),
55 },
56 }
57 }
58
59 pub fn send_packet(&mut self, packet: &Packet) -> Result<(), ProtocolError> {
60 if packet.device_address == self.device_address {
61 self.handle_packet(&packet, true);
62
63 if self.device_address != BROADCAST_ADDRESS {
64 return Ok(());
65 }
66 }
67
68 match self.interface.try_send_packet(packet) {
69 Ok(_) => Ok(()),
70 Err(err) => Err(ProtocolError::InterfaceError(err)),
71 }
72 }
73
74 pub fn add_packet_handler<'s>(
75 &'s mut self,
76 #[cfg(not(feature = "send"))] handler: Box<dyn FnMut(&Packet, &mut Self) + 'a>,
77 #[cfg(feature = "send")] handler: Box<dyn FnMut(&Packet, &mut Self) + Send + 'a>,
78 capture_all_addresses: bool,
79 ) -> Result<u32, ProtocolError> {
80 let id = self.get_next_handler_id();
81
82 self.handlers.insert(id, (handler, capture_all_addresses));
83
84 Ok(id)
85 }
86
87 pub fn remove_packet_handler(&mut self, id: u32) -> Result<(), ProtocolError> {
88 match self.handlers.remove(&id) {
89 None => Err(ProtocolError::NoSuchHandler),
90 Some(_) => Ok(()),
91 }
92 }
93
94 pub fn exchange_packet<F: Fn(), R: ConvertPacket<R>>(
95 &mut self,
96 packet: Packet,
97 capture_all_addresses: bool,
98 wait_closure: F,
99 ) -> Result<R, ProtocolError> {
100 self.send_packet(&packet)?;
101
102 wait_closure();
103
104 loop {
105 match self.interface.try_get_packet() {
106 Ok(received_packet) => {
107 if capture_all_addresses
108 || received_packet.device_address == self.device_address
109 || received_packet.device_address == BROADCAST_ADDRESS
110 {
111 if let Ok(received_event) = R::try_from_packet(&received_packet) {
112 return Ok(received_event);
113 }
114 }
115 }
116 Err(err) => match err {
117 InterfaceError::NoPacketReceived => break,
118 _ => return Err(ProtocolError::InterfaceError(err)),
119 },
120 }
121 }
122
123 Err(ProtocolError::PacketTimeout)
124 }
125
126 pub fn exchange_packets<F: Fn(), R: ConvertPacket<R>>(
127 &mut self,
128 packet: Packet,
129 capture_all_addresses: bool,
130 wait_closure: F,
131 ) -> Result<Vec<R>, ProtocolError> {
132 let mut events = vec![];
133
134 self.send_packet(&packet)?;
135
136 wait_closure();
137
138 loop {
139 match self.interface.try_get_packet() {
140 Ok(received_packet) => {
141 if capture_all_addresses
142 || received_packet.device_address == self.device_address
143 || received_packet.device_address == BROADCAST_ADDRESS
144 {
145 if let Ok(received_event) = R::try_from_packet(&received_packet) {
146 events.push(received_event);
147 }
148 }
149 }
150 Err(err) => match err {
151 InterfaceError::NoPacketReceived => break,
152 _ => return Err(ProtocolError::InterfaceError(err)),
153 },
154 }
155 }
156
157 return Ok(events);
158 }
159
160 fn handle_packet(&self, packet: &Packet, owned_address: bool) {
161 unsafe {
162 for handler in transmute::<&Self, &mut Self>(self).handlers.values_mut() {
163 if owned_address || handler.1 {
164 handler.0(packet, transmute(self));
165 }
166 }
167 }
168 }
169
170 fn get_next_handler_id(&self) -> u32 {
171 let mut first_available_id = 0;
172
173 for id in self.handlers.keys() {
174 if first_available_id == *id {
175 first_available_id += 1;
176 }
177 }
178
179 return first_available_id;
180 }
181}