Skip to main content
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 { 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);