ross_protocol/event/
general.rs1use alloc::vec;
2use alloc::vec::Vec;
3use core::convert::TryInto;
4
5use crate::convert_packet::{ConvertPacket, ConvertPacketError};
6use crate::event::event_code::*;
7use crate::event::EventError;
8use crate::packet::Packet;
9
10#[derive(Debug, Eq, PartialEq, Ord, PartialOrd)]
11pub struct AckEvent {
12 pub receiver_address: u16,
13 pub transmitter_address: u16,
14}
15
16impl ConvertPacket<AckEvent> for AckEvent {
17 fn try_from_packet(packet: &Packet) -> Result<Self, ConvertPacketError> {
18 if packet.data.len() != 4 {
19 return Err(ConvertPacketError::WrongSize);
20 }
21
22 if packet.is_error {
23 return Err(ConvertPacketError::WrongType);
24 }
25
26 if u16::from_be_bytes(packet.data[0..=1].try_into().unwrap()) != ACK_EVENT_CODE {
27 return Err(ConvertPacketError::Event(EventError::WrongEventType));
28 }
29
30 let receiver_address = packet.device_address;
31 let transmitter_address = u16::from_be_bytes(packet.data[2..=3].try_into().unwrap());
32
33 Ok(AckEvent {
34 receiver_address,
35 transmitter_address,
36 })
37 }
38
39 fn to_packet(&self) -> Packet {
40 let mut data = vec![];
41
42 for byte in u16::to_be_bytes(ACK_EVENT_CODE).iter() {
43 data.push(*byte);
44 }
45
46 for byte in u16::to_be_bytes(self.transmitter_address).iter() {
47 data.push(*byte);
48 }
49
50 Packet {
51 is_error: false,
52 device_address: self.receiver_address,
53 data,
54 }
55 }
56}
57
58#[derive(Debug, Eq, PartialEq, Ord, PartialOrd)]
59pub struct DataEvent {
60 pub receiver_address: u16,
61 pub transmitter_address: u16,
62 pub data_len: u16,
63 pub data: Vec<u8>,
64}
65
66impl ConvertPacket<DataEvent> for DataEvent {
67 fn try_from_packet(packet: &Packet) -> Result<Self, ConvertPacketError> {
68 if packet.is_error {
69 return Err(ConvertPacketError::WrongType);
70 }
71
72 if u16::from_be_bytes(packet.data[0..=1].try_into().unwrap()) != DATA_EVENT_CODE {
73 return Err(ConvertPacketError::Event(EventError::WrongEventType));
74 }
75
76 let receiver_address = packet.device_address;
77 let transmitter_address = u16::from_be_bytes(packet.data[2..=3].try_into().unwrap());
78 let data_len = u16::from_be_bytes(packet.data[4..=5].try_into().unwrap());
79
80 if packet.data.len() != data_len as usize + 6 {
81 return Err(ConvertPacketError::WrongSize);
82 }
83
84 let mut data = vec![0; data_len as usize];
85
86 for i in 0..data_len as usize {
87 data[i] = packet.data[i + 6];
88 }
89
90 Ok(DataEvent {
91 receiver_address,
92 transmitter_address,
93 data_len,
94 data,
95 })
96 }
97
98 fn to_packet(&self) -> Packet {
99 let mut data = vec![];
100
101 for byte in u16::to_be_bytes(DATA_EVENT_CODE).iter() {
102 data.push(*byte);
103 }
104
105 for byte in u16::to_be_bytes(self.transmitter_address).iter() {
106 data.push(*byte);
107 }
108
109 for byte in u16::to_be_bytes(self.data_len).iter() {
110 data.push(*byte);
111 }
112
113 for byte in self.data.iter() {
114 data.push(*byte);
115 }
116
117 Packet {
118 is_error: false,
119 device_address: self.receiver_address,
120 data,
121 }
122 }
123}
124
125#[cfg(test)]
126mod tests {
127 use super::*;
128
129 const EVENT_PACKET: Packet = Packet {
130 is_error: false,
131 device_address: 0xabab,
132 data: vec![],
133 };
134
135 #[test]
136 fn ack_try_from_packet_test() {
137 let mut packet = EVENT_PACKET;
138 packet.data = vec![
139 ((ACK_EVENT_CODE >> 8) & 0xff) as u8, ((ACK_EVENT_CODE >> 0) & 0xff) as u8, 0x01, 0x23, ];
144
145 let event = AckEvent::try_from_packet(&packet).unwrap();
146
147 assert_eq!(event.receiver_address, 0xabab);
148 assert_eq!(event.transmitter_address, 0x0123);
149 }
150
151 #[test]
152 fn ack_to_packet_test() {
153 let event = AckEvent {
154 receiver_address: 0xabab,
155 transmitter_address: 0x0123,
156 };
157
158 let mut packet = EVENT_PACKET;
159 packet.data = vec![
160 ((ACK_EVENT_CODE >> 8) & 0xff) as u8, ((ACK_EVENT_CODE >> 0) & 0xff) as u8, 0x01, 0x23, ];
165
166 assert_eq!(event.to_packet(), packet);
167 }
168
169 #[test]
170 fn data_try_from_packet_test() {
171 let mut packet = EVENT_PACKET;
172 packet.data = vec![
173 ((DATA_EVENT_CODE >> 8) & 0xff) as u8, ((DATA_EVENT_CODE >> 0) & 0xff) as u8, 0x01, 0x23, 0x00, 0x05, 0x00, 0x01, 0x02, 0x03, 0x04, ];
185
186 let event = DataEvent::try_from_packet(&packet).unwrap();
187
188 assert_eq!(event.receiver_address, 0xabab);
189 assert_eq!(event.transmitter_address, 0x0123);
190 assert_eq!(event.data_len, 0x0005);
191 assert_eq!(event.data, vec!(0x00, 0x01, 0x02, 0x03, 0x04));
192 }
193
194 #[test]
195 fn data_to_packet_test() {
196 let event = DataEvent {
197 receiver_address: 0xabab,
198 transmitter_address: 0x0123,
199 data_len: 0x0005,
200 data: vec![0x00, 0x01, 0x02, 0x03, 0x04],
201 };
202
203 let mut packet = EVENT_PACKET;
204 packet.data = vec![
205 ((DATA_EVENT_CODE >> 8) & 0xff) as u8, ((DATA_EVENT_CODE >> 0) & 0xff) as u8, 0x01, 0x23, 0x00, 0x05, 0x00, 0x01, 0x02, 0x03, 0x04, ];
217
218 assert_eq!(event.to_packet(), packet);
219 }
220}