1use postcard;
2use serde::{Deserialize, Serialize};
3
4use crate::input;
5
6pub const BUFFER_SIZE: usize = 4;
8
9#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq, Eq)]
11pub struct Message {
12 pub input_event: input::Event,
14}
15
16impl Message {
17 pub fn new(input_event: input::Event) -> Self {
19 Self { input_event }
20 }
21
22 pub fn serialize(&self) -> [u8; BUFFER_SIZE] {
24 let mut buf = [0u8; BUFFER_SIZE];
25 let _ = postcard::to_slice_cobs(self, &mut buf);
26 buf
27 }
28
29 pub fn deserialize(bytes: &[u8]) -> postcard::Result<Message> {
31 let mut buf = [0u8; BUFFER_SIZE];
32 buf[..BUFFER_SIZE].copy_from_slice(&bytes[..BUFFER_SIZE]);
33 postcard::from_bytes_cobs(&mut buf)
34 }
35}
36
37pub fn receive_byte(buf: &mut [u8; BUFFER_SIZE], byte: u8) -> postcard::Result<Message> {
40 buf.rotate_left(1);
41 buf[BUFFER_SIZE - 1] = byte;
42 Message::deserialize(buf)
43}
44
45#[cfg(test)]
46#[allow(clippy::unwrap_used, clippy::expect_used)]
47mod tests {
48 use super::*;
49
50 #[test]
51 fn test_ser_press() {
52 let input_event = input::Event::Press { keymap_index: 4 };
54 let msg = Message { input_event };
55
56 let actual_ser = msg.serialize();
58
59 assert_eq!(&actual_ser, &[0x01, 0x02, 0x04, 0x00]);
61 }
62
63 #[test]
64 fn test_ser_release() {
65 let input_event = input::Event::Release { keymap_index: 4 };
67 let msg = Message { input_event };
68
69 let actual_ser = msg.serialize();
71
72 assert_eq!(&actual_ser, &[0x03, 0x01, 0x04, 0x00]);
74 }
75
76 #[test]
77 fn test_deser_press() {
78 let ser = &[0x01, 0x02, 0x04, 0x00];
80
81 let actual_msg = Message::deserialize(ser).unwrap();
83
84 let input_event = input::Event::Press { keymap_index: 4 };
86 let expected_msg = Message { input_event };
87
88 assert_eq!(&actual_msg, &expected_msg);
89 }
90
91 #[test]
92 fn test_buf_receive_byte() {
93 let input_messages = &[
95 Message::new(input::Event::Press { keymap_index: 4 }),
96 Message::new(input::Event::Release { keymap_index: 5 }),
97 ];
98 let mut buf: [u8; BUFFER_SIZE] = [0; BUFFER_SIZE];
99
100 let mut actual_messages: Vec<Message> = Vec::new();
102 for msg in input_messages {
103 let ser = msg.serialize();
104 for &byte in ser.iter() {
105 if let Ok(msg) = receive_byte(&mut buf, byte) {
106 actual_messages.push(msg);
107 }
108 }
109 }
110
111 assert_eq!(input_messages, &actual_messages.as_slice());
113 }
114}