1use alloc::vec;
2use core::convert::TryInto;
3
4use crate::convert_packet::{ConvertPacket, ConvertPacketError};
5use crate::event::event_code::*;
6use crate::event::EventError;
7use crate::packet::Packet;
8use crate::protocol::BROADCAST_ADDRESS;
9
10#[derive(Debug, Eq, PartialEq, Ord, PartialOrd)]
11pub struct ProgrammerHelloEvent {
12 pub programmer_address: u16,
13}
14
15impl ConvertPacket<ProgrammerHelloEvent> for ProgrammerHelloEvent {
16 fn try_from_packet(packet: &Packet) -> Result<Self, ConvertPacketError> {
17 if packet.data.len() != 4 {
18 return Err(ConvertPacketError::WrongSize);
19 }
20
21 if packet.is_error {
22 return Err(ConvertPacketError::WrongType);
23 }
24
25 if u16::from_be_bytes(packet.data[0..=1].try_into().unwrap()) != PROGRAMMER_HELLO_EVENT_CODE
26 {
27 return Err(ConvertPacketError::Event(EventError::WrongEventType));
28 }
29
30 let programmer_address = u16::from_be_bytes(packet.data[2..=3].try_into().unwrap());
31
32 Ok(ProgrammerHelloEvent { programmer_address })
33 }
34
35 fn to_packet(&self) -> Packet {
36 let mut data = vec![];
37
38 for byte in u16::to_be_bytes(PROGRAMMER_HELLO_EVENT_CODE).iter() {
39 data.push(*byte);
40 }
41
42 for byte in u16::to_be_bytes(self.programmer_address).iter() {
43 data.push(*byte);
44 }
45
46 Packet {
47 is_error: false,
48 device_address: BROADCAST_ADDRESS,
49 data,
50 }
51 }
52}
53
54#[derive(Debug, Eq, PartialEq, Ord, PartialOrd)]
55pub struct ProgrammerStartFirmwareUpgradeEvent {
56 pub receiver_address: u16,
57 pub programmer_address: u16,
58 pub firmware_size: u32,
59}
60
61impl ConvertPacket<ProgrammerStartFirmwareUpgradeEvent> for ProgrammerStartFirmwareUpgradeEvent {
62 fn try_from_packet(packet: &Packet) -> Result<Self, ConvertPacketError> {
63 if packet.data.len() != 8 {
64 return Err(ConvertPacketError::WrongSize);
65 }
66
67 if packet.is_error {
68 return Err(ConvertPacketError::WrongType);
69 }
70
71 if u16::from_be_bytes(packet.data[0..=1].try_into().unwrap())
72 != PROGRAMMER_START_FIRMWARE_UPGRADE_EVENT_CODE
73 {
74 return Err(ConvertPacketError::Event(EventError::WrongEventType));
75 }
76
77 let receiver_address = packet.device_address;
78 let programmer_address = u16::from_be_bytes(packet.data[2..=3].try_into().unwrap());
79 let firmware_size = u32::from_be_bytes(packet.data[4..=7].try_into().unwrap());
80
81 Ok(ProgrammerStartFirmwareUpgradeEvent {
82 receiver_address,
83 programmer_address,
84 firmware_size,
85 })
86 }
87
88 fn to_packet(&self) -> Packet {
89 let mut data = vec![];
90
91 for byte in u16::to_be_bytes(PROGRAMMER_START_FIRMWARE_UPGRADE_EVENT_CODE).iter() {
92 data.push(*byte);
93 }
94
95 for byte in u16::to_be_bytes(self.programmer_address).iter() {
96 data.push(*byte);
97 }
98
99 for byte in u32::to_be_bytes(self.firmware_size).iter() {
100 data.push(*byte);
101 }
102
103 Packet {
104 is_error: false,
105 device_address: self.receiver_address,
106 data,
107 }
108 }
109}
110
111#[derive(Debug, Eq, PartialEq, Ord, PartialOrd)]
112pub struct ProgrammerStartConfigUpgradeEvent {
113 pub receiver_address: u16,
114 pub programmer_address: u16,
115 pub config_size: u32,
116}
117
118impl ConvertPacket<ProgrammerStartConfigUpgradeEvent> for ProgrammerStartConfigUpgradeEvent {
119 fn try_from_packet(packet: &Packet) -> Result<Self, ConvertPacketError> {
120 if packet.data.len() != 8 {
121 return Err(ConvertPacketError::WrongSize);
122 }
123
124 if packet.is_error {
125 return Err(ConvertPacketError::WrongType);
126 }
127
128 if u16::from_be_bytes(packet.data[0..=1].try_into().unwrap())
129 != PROGRAMMER_START_CONFIG_UPGRADE_EVENT_CODE
130 {
131 return Err(ConvertPacketError::Event(EventError::WrongEventType));
132 }
133
134 let receiver_address = packet.device_address;
135 let programmer_address = u16::from_be_bytes(packet.data[2..=3].try_into().unwrap());
136 let config_size = u32::from_be_bytes(packet.data[4..=7].try_into().unwrap());
137
138 Ok(ProgrammerStartConfigUpgradeEvent {
139 receiver_address,
140 programmer_address,
141 config_size,
142 })
143 }
144
145 fn to_packet(&self) -> Packet {
146 let mut data = vec![];
147
148 for byte in u16::to_be_bytes(PROGRAMMER_START_CONFIG_UPGRADE_EVENT_CODE).iter() {
149 data.push(*byte);
150 }
151
152 for byte in u16::to_be_bytes(self.programmer_address).iter() {
153 data.push(*byte);
154 }
155
156 for byte in u32::to_be_bytes(self.config_size).iter() {
157 data.push(*byte);
158 }
159
160 Packet {
161 is_error: false,
162 device_address: self.receiver_address,
163 data,
164 }
165 }
166}
167
168#[derive(Debug, Eq, PartialEq, Ord, PartialOrd)]
169pub struct ProgrammerSetDeviceAddressEvent {
170 pub receiver_address: u16,
171 pub programmer_address: u16,
172 pub new_address: u16,
173}
174
175impl ConvertPacket<ProgrammerSetDeviceAddressEvent> for ProgrammerSetDeviceAddressEvent {
176 fn try_from_packet(packet: &Packet) -> Result<Self, ConvertPacketError> {
177 if packet.data.len() != 6 {
178 return Err(ConvertPacketError::WrongSize);
179 }
180
181 if packet.is_error {
182 return Err(ConvertPacketError::WrongType);
183 }
184
185 if u16::from_be_bytes(packet.data[0..=1].try_into().unwrap())
186 != PROGRAMMER_SET_DEVICE_ADDRESS_EVENT_CODE
187 {
188 return Err(ConvertPacketError::Event(EventError::WrongEventType));
189 }
190
191 let receiver_address = packet.device_address;
192 let programmer_address = u16::from_be_bytes(packet.data[2..=3].try_into().unwrap());
193 let new_address = u16::from_be_bytes(packet.data[4..=5].try_into().unwrap());
194
195 Ok(ProgrammerSetDeviceAddressEvent {
196 receiver_address,
197 programmer_address,
198 new_address,
199 })
200 }
201
202 fn to_packet(&self) -> Packet {
203 let mut data = vec![];
204
205 for byte in u16::to_be_bytes(PROGRAMMER_SET_DEVICE_ADDRESS_EVENT_CODE).iter() {
206 data.push(*byte);
207 }
208
209 for byte in u16::to_be_bytes(self.programmer_address).iter() {
210 data.push(*byte);
211 }
212
213 for byte in u16::to_be_bytes(self.new_address).iter() {
214 data.push(*byte);
215 }
216
217 Packet {
218 is_error: false,
219 device_address: self.receiver_address,
220 data,
221 }
222 }
223}
224
225#[cfg(test)]
226mod tests {
227 use super::*;
228
229 const EVENT_PACKET: Packet = Packet {
230 is_error: false,
231 device_address: 0xabab,
232 data: vec![],
233 };
234
235 #[test]
236 fn hello_try_from_packet_test() {
237 let mut packet = EVENT_PACKET;
238
239 packet.data = vec![
240 ((PROGRAMMER_HELLO_EVENT_CODE >> 8) & 0xff) as u8, ((PROGRAMMER_HELLO_EVENT_CODE >> 0) & 0xff) as u8, 0x01, 0x23, ];
245
246 let event = ProgrammerHelloEvent::try_from_packet(&packet).unwrap();
247
248 assert_eq!(event.programmer_address, 0x0123);
249 }
250
251 #[test]
252 #[should_panic]
253 fn hello_try_from_packet_wrong_size_test() {
254 let mut packet = EVENT_PACKET;
255 packet.data = vec![
256 ((PROGRAMMER_HELLO_EVENT_CODE >> 8) & 0xff) as u8, ((PROGRAMMER_HELLO_EVENT_CODE >> 0) & 0xff) as u8, 0x01, 0x34, 0x00, ];
262
263 ProgrammerHelloEvent::try_from_packet(&packet).unwrap();
264 }
265
266 #[test]
267 #[should_panic]
268 fn hello_try_from_packet_wrong_type_test() {
269 let mut packet = EVENT_PACKET;
270 packet.data = vec![
271 ((PROGRAMMER_HELLO_EVENT_CODE >> 8) & 0xff) as u8, ((PROGRAMMER_HELLO_EVENT_CODE >> 0) & 0xff) as u8, 0x01, 0x34, ];
276 packet.is_error = true;
277
278 ProgrammerHelloEvent::try_from_packet(&packet).unwrap();
279 }
280
281 #[test]
282 #[should_panic]
283 fn hello_try_from_packet_wrong_event_type_test() {
284 let mut packet = EVENT_PACKET;
285 packet.data = vec![
286 ((BOOTLOADER_HELLO_EVENT_CODE >> 8) & 0xff) as u8, ((BOOTLOADER_HELLO_EVENT_CODE >> 0) & 0xff) as u8, 0x01, 0x23, ];
291
292 ProgrammerHelloEvent::try_from_packet(&packet).unwrap();
293 }
294
295 #[test]
296 fn hello_to_packet_test() {
297 let event = ProgrammerHelloEvent {
298 programmer_address: 0x0123,
299 };
300
301 let mut packet = EVENT_PACKET;
302 packet.device_address = BROADCAST_ADDRESS;
303 packet.data = vec![
304 ((PROGRAMMER_HELLO_EVENT_CODE >> 8) & 0xff) as u8, ((PROGRAMMER_HELLO_EVENT_CODE >> 0) & 0xff) as u8, 0x01, 0x23, ];
309
310 assert_eq!(event.to_packet(), packet);
311 }
312
313 #[test]
314 fn start_firmware_upgrade_try_from_packet_test() {
315 let mut packet = EVENT_PACKET;
316 packet.data = vec![
317 ((PROGRAMMER_START_FIRMWARE_UPGRADE_EVENT_CODE >> 8) & 0xff) as u8, ((PROGRAMMER_START_FIRMWARE_UPGRADE_EVENT_CODE >> 0) & 0xff) as u8, 0x01, 0x23, 0x01, 0x23, 0x45, 0x67, ];
326
327 let event = ProgrammerStartFirmwareUpgradeEvent::try_from_packet(&packet).unwrap();
328
329 assert_eq!(event.receiver_address, 0xabab);
330 assert_eq!(event.programmer_address, 0x0123);
331 assert_eq!(event.firmware_size, 0x01234567);
332 }
333
334 #[test]
335 fn start_firmware_upgrade_to_packet_test() {
336 let event = ProgrammerStartFirmwareUpgradeEvent {
337 receiver_address: 0xabab,
338 programmer_address: 0x0123,
339 firmware_size: 0x01234567,
340 };
341
342 let mut packet = EVENT_PACKET;
343 packet.data = vec![
344 ((PROGRAMMER_START_FIRMWARE_UPGRADE_EVENT_CODE >> 8) & 0xff) as u8, ((PROGRAMMER_START_FIRMWARE_UPGRADE_EVENT_CODE >> 0) & 0xff) as u8, 0x01, 0x23, 0x01, 0x23, 0x45, 0x67, ];
353
354 assert_eq!(event.to_packet(), packet);
355 }
356
357 #[test]
358 fn start_config_upgrade_try_from_packet_test() {
359 let mut packet = EVENT_PACKET;
360 packet.data = vec![
361 ((PROGRAMMER_START_CONFIG_UPGRADE_EVENT_CODE >> 8) & 0xff) as u8, ((PROGRAMMER_START_CONFIG_UPGRADE_EVENT_CODE >> 0) & 0xff) as u8, 0x01, 0x23, 0x01, 0x23, 0x45, 0x67, ];
370
371 let event = ProgrammerStartConfigUpgradeEvent::try_from_packet(&packet).unwrap();
372
373 assert_eq!(event.receiver_address, 0xabab);
374 assert_eq!(event.programmer_address, 0x0123);
375 assert_eq!(event.config_size, 0x01234567);
376 }
377
378 #[test]
379 fn start_config_upgrade_to_packet_test() {
380 let event = ProgrammerStartConfigUpgradeEvent {
381 receiver_address: 0xabab,
382 programmer_address: 0x0123,
383 config_size: 0x01234567,
384 };
385
386 let mut packet = EVENT_PACKET;
387 packet.data = vec![
388 ((PROGRAMMER_START_CONFIG_UPGRADE_EVENT_CODE >> 8) & 0xff) as u8, ((PROGRAMMER_START_CONFIG_UPGRADE_EVENT_CODE >> 0) & 0xff) as u8, 0x01, 0x23, 0x01, 0x23, 0x45, 0x67, ];
397
398 assert_eq!(event.to_packet(), packet);
399 }
400
401 #[test]
402 fn set_device_address_try_from_packet_test() {
403 let mut packet = EVENT_PACKET;
404 packet.data = vec![
405 ((PROGRAMMER_SET_DEVICE_ADDRESS_EVENT_CODE >> 8) & 0xff) as u8, ((PROGRAMMER_SET_DEVICE_ADDRESS_EVENT_CODE >> 0) & 0xff) as u8, 0x01, 0x23, 0x01, 0x23, ];
412
413 let event = ProgrammerSetDeviceAddressEvent::try_from_packet(&packet).unwrap();
414
415 assert_eq!(event.receiver_address, 0xabab);
416 assert_eq!(event.programmer_address, 0x0123);
417 assert_eq!(event.new_address, 0x0123);
418 }
419
420 #[test]
421 fn set_device_address_to_packet_test() {
422 let event = ProgrammerSetDeviceAddressEvent {
423 receiver_address: 0xabab,
424 programmer_address: 0x0123,
425 new_address: 0x0123,
426 };
427
428 let mut packet = EVENT_PACKET;
429 packet.data = vec![
430 ((PROGRAMMER_SET_DEVICE_ADDRESS_EVENT_CODE >> 8) & 0xff) as u8, ((PROGRAMMER_SET_DEVICE_ADDRESS_EVENT_CODE >> 0) & 0xff) as u8, 0x01, 0x23, 0x01, 0x23, ];
437
438 assert_eq!(event.to_packet(), packet);
439 }
440}