RKTK API Docs RKTK Home Repo

rktk/drivers/interface/
dongle.rs

1use postcard::experimental::max_size::MaxSize;
2use serde::{Deserialize, Serialize};
3use usbd_hid::descriptor;
4
5#[derive(Debug, Serialize, Deserialize, MaxSize)]
6#[cfg_attr(feature = "defmt", derive(defmt::Format))]
7pub struct KeyboardReport {
8    pub modifier: u8,
9    pub keycodes: heapless::Vec<u8, 6>,
10}
11
12#[derive(Debug, Serialize, Deserialize, MaxSize)]
13#[cfg_attr(feature = "defmt", derive(defmt::Format))]
14pub struct MouseReport {
15    pub buttons: u8,
16    pub x: i8,
17    pub y: i8,
18    pub wheel: i8,
19    pub pan: i8,
20}
21
22#[derive(Debug, Serialize, Deserialize, MaxSize)]
23#[cfg_attr(feature = "defmt", derive(defmt::Format))]
24pub struct MediaKeyboardReport {
25    pub usage_id: u16,
26}
27
28impl From<KeyboardReport> for descriptor::KeyboardReport {
29    fn from(value: KeyboardReport) -> Self {
30        let mut keycodes = value.keycodes;
31        keycodes.resize_default(6).unwrap();
32
33        Self {
34            modifier: value.modifier,
35            reserved: 0,
36            leds: 0,
37            keycodes: keycodes.into_array().unwrap(),
38        }
39    }
40}
41impl From<descriptor::KeyboardReport> for KeyboardReport {
42    fn from(value: descriptor::KeyboardReport) -> Self {
43        Self {
44            modifier: value.modifier,
45            keycodes: heapless::Vec::from_slice(&value.keycodes).unwrap(),
46        }
47    }
48}
49
50impl From<MouseReport> for descriptor::MouseReport {
51    fn from(value: MouseReport) -> Self {
52        Self {
53            buttons: value.buttons,
54            x: value.x,
55            y: value.y,
56            wheel: value.wheel,
57            pan: value.pan,
58        }
59    }
60}
61impl From<descriptor::MouseReport> for MouseReport {
62    fn from(value: descriptor::MouseReport) -> Self {
63        Self {
64            buttons: value.buttons,
65            x: value.x,
66            y: value.y,
67            wheel: value.wheel,
68            pan: value.pan,
69        }
70    }
71}
72
73impl From<MediaKeyboardReport> for descriptor::MediaKeyboardReport {
74    fn from(value: MediaKeyboardReport) -> Self {
75        Self {
76            usage_id: value.usage_id,
77        }
78    }
79}
80impl From<descriptor::MediaKeyboardReport> for MediaKeyboardReport {
81    fn from(value: descriptor::MediaKeyboardReport) -> Self {
82        Self {
83            usage_id: value.usage_id,
84        }
85    }
86}
87
88#[derive(Debug, Serialize, Deserialize, MaxSize)]
89#[cfg_attr(feature = "defmt", derive(defmt::Format))]
90pub enum DongleData {
91    Keyboard(KeyboardReport),
92    Mouse(MouseReport),
93    MediaKeyboard(MediaKeyboardReport),
94}
95
96pub trait DongleDriver {
97    type Error: super::Error;
98
99    async fn recv(&mut self) -> Result<DongleData, Self::Error>;
100}
101
102super::generate_builder!(DongleDriver);