smart_keymap/
split.rs

1use postcard;
2use serde::{Deserialize, Serialize};
3
4use crate::input;
5
6/// Size of message buffer for serializing and deserializing messages.
7pub const BUFFER_SIZE: usize = 4;
8
9/// Message sent from one split keyboard half to the other.
10#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq, Eq)]
11pub struct Message {
12    /// The input event.
13    pub input_event: input::Event,
14}
15
16impl Message {
17    /// Create a new message.
18    pub fn new(input_event: input::Event) -> Self {
19        Self { input_event }
20    }
21
22    /// Serialize the message into a bytes.
23    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    /// Serialize the message into a bytes.
30    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
37/// Receives bytes from split transport, deserializes into messages.
38/// Adds byte to the buffer and tries to deserialize a message.
39pub 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        // Assemble
52        let input_event = input::Event::Press { keymap_index: 4 };
53        let msg = Message { input_event };
54
55        // Act
56        let actual_ser = msg.serialize();
57
58        // Assert
59        assert_eq!(&actual_ser, &[0x01, 0x02, 0x04, 0x00]);
60    }
61
62    #[test]
63    fn test_ser_release() {
64        // Assemble
65        let input_event = input::Event::Release { keymap_index: 4 };
66        let msg = Message { input_event };
67
68        // Act
69        let actual_ser = msg.serialize();
70
71        // Assert
72        assert_eq!(&actual_ser, &[0x03, 0x01, 0x04, 0x00]);
73    }
74
75    #[test]
76    fn test_deser_press() {
77        // Assemble
78        let ser = &[0x01, 0x02, 0x04, 0x00];
79
80        // Act
81        let actual_msg = Message::deserialize(ser).unwrap();
82
83        // Assert
84        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        // Assemble
93        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        // Act
100        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
111        assert_eq!(input_messages, &actual_messages.as_slice());
112    }
113}