rktk/drivers/interface/
dongle.rs1use 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);