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 { buttons: value.buttons, x: value.x, y: value.y, wheel: value.wheel, pan: value.pan }
53 }
54}
55impl From<descriptor::MouseReport> for MouseReport {
56 fn from(value: descriptor::MouseReport) -> Self {
57 Self { buttons: value.buttons, x: value.x, y: value.y, wheel: value.wheel, pan: value.pan }
58 }
59}
60
61impl From<MediaKeyboardReport> for descriptor::MediaKeyboardReport {
62 fn from(value: MediaKeyboardReport) -> Self {
63 Self { usage_id: value.usage_id }
64 }
65}
66impl From<descriptor::MediaKeyboardReport> for MediaKeyboardReport {
67 fn from(value: descriptor::MediaKeyboardReport) -> Self {
68 Self { usage_id: value.usage_id }
69 }
70}
71
72#[derive(Debug, Serialize, Deserialize, MaxSize)]
73#[cfg_attr(feature = "defmt", derive(defmt::Format))]
74pub enum DongleData {
75 Keyboard(KeyboardReport),
76 Mouse(MouseReport),
77 MediaKeyboard(MediaKeyboardReport),
78}
79
80pub trait DongleDriver {
81 type Error: super::Error;
82
83 async fn recv(&mut self) -> Result<DongleData, Self::Error>;
84}
85
86super::generate_builder!(DongleDriver);