Skip to main content

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        let _ = postcard::to_slice_cobs(self, &mut buf);
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)]
46#[allow(clippy::unwrap_used, clippy::expect_used)]
47mod tests {
48    use super::*;
49
50    #[test]
51    fn test_ser_press() {
52        // Assemble
53        let input_event = input::Event::Press { keymap_index: 4 };
54        let msg = Message { input_event };
55
56        // Act
57        let actual_ser = msg.serialize();
58
59        // Assert
60        assert_eq!(&actual_ser, &[0x01, 0x02, 0x04, 0x00]);
61    }
62
63    #[test]
64    fn test_ser_release() {
65        // Assemble
66        let input_event = input::Event::Release { keymap_index: 4 };
67        let msg = Message { input_event };
68
69        // Act
70        let actual_ser = msg.serialize();
71
72        // Assert
73        assert_eq!(&actual_ser, &[0x03, 0x01, 0x04, 0x00]);
74    }
75
76    #[test]
77    fn test_deser_press() {
78        // Assemble
79        let ser = &[0x01, 0x02, 0x04, 0x00];
80
81        // Act
82        let actual_msg = Message::deserialize(ser).unwrap();
83
84        // Assert
85        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        // Assemble
94        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        // Act
101        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
112        assert_eq!(input_messages, &actual_messages.as_slice());
113    }
114}