ross_protocol/event/
button.rs1use 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;
8
9#[derive(Debug, Eq, PartialEq, Ord, PartialOrd)]
10pub struct ButtonPressedEvent {
11 pub receiver_address: u16,
12 pub button_address: u16,
13 pub index: u8,
14}
15
16impl ConvertPacket<ButtonPressedEvent> for ButtonPressedEvent {
17 fn try_from_packet(packet: &Packet) -> Result<Self, ConvertPacketError> {
18 if packet.data.len() != 5 {
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()) != BUTTON_PRESSED_EVENT_CODE {
27 return Err(ConvertPacketError::Event(EventError::WrongEventType));
28 }
29
30 let receiver_address = packet.device_address;
31 let button_address = u16::from_be_bytes(packet.data[2..=3].try_into().unwrap());
32 let index = packet.data[4];
33
34 Ok(ButtonPressedEvent {
35 receiver_address,
36 button_address,
37 index,
38 })
39 }
40
41 fn to_packet(&self) -> Packet {
42 let mut data = vec![];
43
44 for byte in u16::to_be_bytes(BUTTON_PRESSED_EVENT_CODE).iter() {
45 data.push(*byte);
46 }
47
48 for byte in u16::to_be_bytes(self.button_address).iter() {
49 data.push(*byte);
50 }
51
52 data.push(self.index);
53
54 Packet {
55 is_error: false,
56 device_address: self.receiver_address,
57 data,
58 }
59 }
60}
61
62#[derive(Debug, Eq, PartialEq, Ord, PartialOrd)]
63pub struct ButtonReleasedEvent {
64 pub receiver_address: u16,
65 pub button_address: u16,
66 pub index: u8,
67}
68
69impl ConvertPacket<ButtonReleasedEvent> for ButtonReleasedEvent {
70 fn try_from_packet(packet: &Packet) -> Result<Self, ConvertPacketError> {
71 if packet.data.len() != 5 {
72 return Err(ConvertPacketError::WrongSize);
73 }
74
75 if packet.is_error {
76 return Err(ConvertPacketError::WrongType);
77 }
78
79 if u16::from_be_bytes(packet.data[0..=1].try_into().unwrap()) != BUTTON_RELEASED_EVENT_CODE
80 {
81 return Err(ConvertPacketError::Event(EventError::WrongEventType));
82 }
83
84 let receiver_address = packet.device_address;
85 let button_address = u16::from_be_bytes(packet.data[2..=3].try_into().unwrap());
86 let index = packet.data[4];
87
88 Ok(ButtonReleasedEvent {
89 receiver_address,
90 button_address,
91 index,
92 })
93 }
94
95 fn to_packet(&self) -> Packet {
96 let mut data = vec![];
97
98 for byte in u16::to_be_bytes(BUTTON_RELEASED_EVENT_CODE).iter() {
99 data.push(*byte);
100 }
101
102 for byte in u16::to_be_bytes(self.button_address).iter() {
103 data.push(*byte);
104 }
105
106 data.push(self.index);
107
108 Packet {
109 is_error: false,
110 device_address: self.receiver_address,
111 data,
112 }
113 }
114}
115
116#[cfg(test)]
117mod tests {
118 use super::*;
119
120 const EVENT_PACKET: Packet = Packet {
121 is_error: false,
122 device_address: 0xabab,
123 data: vec![],
124 };
125
126 #[test]
127 fn pressed_try_from_packet_test() {
128 let mut packet = EVENT_PACKET;
129 packet.data = vec![
130 ((BUTTON_PRESSED_EVENT_CODE >> 8) & 0xff) as u8, ((BUTTON_PRESSED_EVENT_CODE >> 0) & 0xff) as u8, 0x01, 0x23, 0x45, ];
136
137 let event = ButtonPressedEvent::try_from_packet(&packet).unwrap();
138
139 assert_eq!(event.receiver_address, 0xabab);
140 assert_eq!(event.button_address, 0x0123);
141 assert_eq!(event.index, 0x45);
142 }
143
144 #[test]
145 fn pressed_to_packet_test() {
146 let event = ButtonPressedEvent {
147 receiver_address: 0xabab,
148 button_address: 0x0123,
149 index: 0x45,
150 };
151
152 let mut packet = EVENT_PACKET;
153 packet.data = vec![
154 ((BUTTON_PRESSED_EVENT_CODE >> 8) & 0xff) as u8, ((BUTTON_PRESSED_EVENT_CODE >> 0) & 0xff) as u8, 0x01, 0x23, 0x45, ];
160
161 assert_eq!(event.to_packet(), packet);
162 }
163
164 #[test]
165 fn released_try_from_test() {
166 let mut packet = EVENT_PACKET;
167 packet.data = vec![
168 ((BUTTON_RELEASED_EVENT_CODE >> 8) & 0xff) as u8, ((BUTTON_RELEASED_EVENT_CODE >> 0) & 0xff) as u8, 0x01, 0x23, 0x45, ];
174
175 let event = ButtonReleasedEvent::try_from_packet(&packet).unwrap();
176
177 assert_eq!(event.receiver_address, 0xabab);
178 assert_eq!(event.button_address, 0x0123);
179 assert_eq!(event.index, 0x45);
180 }
181
182 #[test]
183 fn released_to_packet_test() {
184 let event = ButtonReleasedEvent {
185 receiver_address: 0xabab,
186 button_address: 0x0123,
187 index: 0x45,
188 };
189
190 let mut packet = EVENT_PACKET;
191 packet.data = vec![
192 ((BUTTON_RELEASED_EVENT_CODE >> 8) & 0xff) as u8, ((BUTTON_RELEASED_EVENT_CODE >> 0) & 0xff) as u8, 0x01, 0x23, 0x45, ];
198
199 assert_eq!(event.to_packet(), packet);
200 }
201}