aboutsummaryrefslogtreecommitdiff
path: root/examples/rp/src/bin/usb_hid_mouse.rs
diff options
context:
space:
mode:
authormatteo <email>2025-10-01 18:56:38 +0200
committermatteo <email>2025-10-01 18:56:38 +0200
commit176649e71ad442ca9856af6c11989b0b2f228c4b (patch)
treeb425294213a520f09c24dd215c00efadfad69149 /examples/rp/src/bin/usb_hid_mouse.rs
parentd79d433d02ab154e5f8570392fd0ca1ffdf9cac1 (diff)
update hid mouse and keyboard examples
Diffstat (limited to 'examples/rp/src/bin/usb_hid_mouse.rs')
-rwxr-xr-xexamples/rp/src/bin/usb_hid_mouse.rs54
1 files changed, 41 insertions, 13 deletions
diff --git a/examples/rp/src/bin/usb_hid_mouse.rs b/examples/rp/src/bin/usb_hid_mouse.rs
index 3e62e8891..dc331cbdd 100755
--- a/examples/rp/src/bin/usb_hid_mouse.rs
+++ b/examples/rp/src/bin/usb_hid_mouse.rs
@@ -1,7 +1,7 @@
1#![no_std] 1#![no_std]
2#![no_main] 2#![no_main]
3 3
4use core::sync::atomic::{AtomicBool, Ordering}; 4use core::sync::atomic::{AtomicBool, AtomicU8, Ordering};
5 5
6use defmt::*; 6use defmt::*;
7use embassy_executor::Spawner; 7use embassy_executor::Spawner;
@@ -11,7 +11,9 @@ use embassy_rp::clocks::RoscRng;
11use embassy_rp::peripherals::USB; 11use embassy_rp::peripherals::USB;
12use embassy_rp::usb::{Driver, InterruptHandler}; 12use embassy_rp::usb::{Driver, InterruptHandler};
13use embassy_time::Timer; 13use embassy_time::Timer;
14use embassy_usb::class::hid::{HidBootProtocol, HidReaderWriter, HidSubclass, ReportId, RequestHandler, State}; 14use embassy_usb::class::hid::{
15 HidBootProtocol, HidProtocolMode, HidReaderWriter, HidSubclass, ReportId, RequestHandler, State,
16};
15use embassy_usb::control::OutResponse; 17use embassy_usb::control::OutResponse;
16use embassy_usb::{Builder, Config, Handler}; 18use embassy_usb::{Builder, Config, Handler};
17use rand::Rng; 19use rand::Rng;
@@ -22,6 +24,8 @@ bind_interrupts!(struct Irqs {
22 USBCTRL_IRQ => InterruptHandler<USB>; 24 USBCTRL_IRQ => InterruptHandler<USB>;
23}); 25});
24 26
27static HID_PROTOCOL_MODE: AtomicU8 = AtomicU8::new(HidProtocolMode::Boot as u8);
28
25#[embassy_executor::main] 29#[embassy_executor::main]
26async fn main(_spawner: Spawner) { 30async fn main(_spawner: Spawner) {
27 let p = embassy_rp::init(Default::default()); 31 let p = embassy_rp::init(Default::default());
@@ -89,17 +93,29 @@ async fn main(_spawner: Spawner) {
89 loop { 93 loop {
90 // every 1 second 94 // every 1 second
91 _ = Timer::after_secs(1).await; 95 _ = Timer::after_secs(1).await;
92 let report = MouseReport { 96
93 buttons: 0, 97 let x = rng.random_range(-100..100); // random small x movement
94 x: rng.random_range(-100..100), // random small x movement 98 let y = rng.random_range(-100..100); // random small y movement
95 y: rng.random_range(-100..100), // random small y movement 99
96 wheel: 0, 100 if HID_PROTOCOL_MODE.load(Ordering::Relaxed) == HidProtocolMode::Boot as u8 {
97 pan: 0, 101 let buttons = 0u8;
98 }; 102 match writer.write(&[buttons, x as u8, y as u8]).await {
99 // Send the report. 103 Ok(()) => {}
100 match writer.write_serialize(&report).await { 104 Err(e) => warn!("Failed to send boot report: {:?}", e),
101 Ok(()) => {} 105 }
102 Err(e) => warn!("Failed to send report: {:?}", e), 106 } else {
107 let report = MouseReport {
108 buttons: 0,
109 x,
110 y,
111 wheel: 0,
112 pan: 0,
113 };
114 // Send the report.
115 match writer.write_serialize(&report).await {
116 Ok(()) => {}
117 Err(e) => warn!("Failed to send report: {:?}", e),
118 }
103 } 119 }
104 } 120 }
105 }; 121 };
@@ -126,6 +142,18 @@ impl RequestHandler for MyRequestHandler {
126 OutResponse::Accepted 142 OutResponse::Accepted
127 } 143 }
128 144
145 fn get_protocol(&self) -> HidProtocolMode {
146 let protocol = HidProtocolMode::from(HID_PROTOCOL_MODE.load(Ordering::Relaxed));
147 info!("The current HID protocol mode is: {}", protocol);
148 protocol
149 }
150
151 fn set_protocol(&mut self, protocol: HidProtocolMode) -> OutResponse {
152 info!("Switching to HID protocol mode: {}", protocol);
153 HID_PROTOCOL_MODE.store(protocol as u8, Ordering::Relaxed);
154 OutResponse::Accepted
155 }
156
129 fn set_idle_ms(&mut self, id: Option<ReportId>, dur: u32) { 157 fn set_idle_ms(&mut self, id: Option<ReportId>, dur: u32) {
130 info!("Set idle rate for {:?} to {:?}", id, dur); 158 info!("Set idle rate for {:?} to {:?}", id, dur);
131 } 159 }