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 postcard::to_slice_cobs(self, &mut buf).unwrap();
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)]
46mod tests {
47 use super::*;
48
49 #[test]
50 fn test_ser_press() {
51 let input_event = input::Event::Press { keymap_index: 4 };
53 let msg = Message { input_event };
54
55 let actual_ser = msg.serialize();
57
58 assert_eq!(&actual_ser, &[0x01, 0x02, 0x04, 0x00]);
60 }
61
62 #[test]
63 fn test_ser_release() {
64 let input_event = input::Event::Release { keymap_index: 4 };
66 let msg = Message { input_event };
67
68 let actual_ser = msg.serialize();
70
71 assert_eq!(&actual_ser, &[0x03, 0x01, 0x04, 0x00]);
73 }
74
75 #[test]
76 fn test_deser_press() {
77 let ser = &[0x01, 0x02, 0x04, 0x00];
79
80 let actual_msg = Message::deserialize(ser).unwrap();
82
83 let input_event = input::Event::Press { keymap_index: 4 };
85 let expected_msg = Message { input_event };
86
87 assert_eq!(&actual_msg, &expected_msg);
88 }
89
90 #[test]
91 fn test_buf_receive_byte() {
92 let input_messages = &[
94 Message::new(input::Event::Press { keymap_index: 4 }),
95 Message::new(input::Event::Release { keymap_index: 5 }),
96 ];
97 let mut buf: [u8; BUFFER_SIZE] = [0; BUFFER_SIZE];
98
99 let mut actual_messages: Vec<Message> = Vec::new();
101 for msg in input_messages {
102 let ser = msg.serialize();
103 for &byte in ser.iter() {
104 if let Ok(msg) = receive_byte(&mut buf, byte) {
105 actual_messages.push(msg);
106 }
107 }
108 }
109
110 assert_eq!(input_messages, &actual_messages.as_slice());
112 }
113}