aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Faure <[email protected]>2024-04-14 15:46:19 +0200
committerBoris Faure <[email protected]>2024-04-15 19:57:18 +0200
commit41415fae0de4eade937f36c908d5cacdc06588bd (patch)
treee684ff5b6e2bab13c326dc241d3699017e7ed314
parent3f4e326ec5ec081742e9f30cb7b0bc936e74009c (diff)
usb/hid: make RequestHandler::set_report(&mut self,…)
That way, it is possible to change some fields in the RequestHandler based on outside report.
-rw-r--r--embassy-usb/src/class/hid.rs18
1 files changed, 9 insertions, 9 deletions
diff --git a/embassy-usb/src/class/hid.rs b/embassy-usb/src/class/hid.rs
index 0000b5b2b..7d27c2578 100644
--- a/embassy-usb/src/class/hid.rs
+++ b/embassy-usb/src/class/hid.rs
@@ -37,7 +37,7 @@ pub struct Config<'d> {
37 pub report_descriptor: &'d [u8], 37 pub report_descriptor: &'d [u8],
38 38
39 /// Handler for control requests. 39 /// Handler for control requests.
40 pub request_handler: Option<&'d dyn RequestHandler>, 40 pub request_handler: Option<&'d mut dyn RequestHandler>,
41 41
42 /// Configures how frequently the host should poll for reading/writing HID reports. 42 /// Configures how frequently the host should poll for reading/writing HID reports.
43 /// 43 ///
@@ -299,7 +299,7 @@ impl<'d, D: Driver<'d>, const N: usize> HidReader<'d, D, N> {
299 /// 299 ///
300 /// If `use_report_ids` is true, the first byte of the report will be used as 300 /// If `use_report_ids` is true, the first byte of the report will be used as
301 /// the `ReportId` value. Otherwise the `ReportId` value will be 0. 301 /// the `ReportId` value. Otherwise the `ReportId` value will be 0.
302 pub async fn run<T: RequestHandler>(mut self, use_report_ids: bool, handler: &T) -> ! { 302 pub async fn run<T: RequestHandler>(mut self, use_report_ids: bool, handler: &mut T) -> ! {
303 let offset = self.offset.load(Ordering::Acquire); 303 let offset = self.offset.load(Ordering::Acquire);
304 assert!(offset == 0); 304 assert!(offset == 0);
305 let mut buf = [0; N]; 305 let mut buf = [0; N];
@@ -384,7 +384,7 @@ pub trait RequestHandler {
384 } 384 }
385 385
386 /// Sets the value of report `id` to `data`. 386 /// Sets the value of report `id` to `data`.
387 fn set_report(&self, id: ReportId, data: &[u8]) -> OutResponse { 387 fn set_report(&mut self, id: ReportId, data: &[u8]) -> OutResponse {
388 let _ = (id, data); 388 let _ = (id, data);
389 OutResponse::Rejected 389 OutResponse::Rejected
390 } 390 }
@@ -411,7 +411,7 @@ pub trait RequestHandler {
411struct Control<'d> { 411struct Control<'d> {
412 if_num: InterfaceNumber, 412 if_num: InterfaceNumber,
413 report_descriptor: &'d [u8], 413 report_descriptor: &'d [u8],
414 request_handler: Option<&'d dyn RequestHandler>, 414 request_handler: Option<&'d mut dyn RequestHandler>,
415 out_report_offset: &'d AtomicUsize, 415 out_report_offset: &'d AtomicUsize,
416 hid_descriptor: [u8; 9], 416 hid_descriptor: [u8; 9],
417} 417}
@@ -420,7 +420,7 @@ impl<'d> Control<'d> {
420 fn new( 420 fn new(
421 if_num: InterfaceNumber, 421 if_num: InterfaceNumber,
422 report_descriptor: &'d [u8], 422 report_descriptor: &'d [u8],
423 request_handler: Option<&'d dyn RequestHandler>, 423 request_handler: Option<&'d mut dyn RequestHandler>,
424 out_report_offset: &'d AtomicUsize, 424 out_report_offset: &'d AtomicUsize,
425 ) -> Self { 425 ) -> Self {
426 Control { 426 Control {
@@ -468,7 +468,7 @@ impl<'d> Handler for Control<'d> {
468 trace!("HID control_out {:?} {=[u8]:x}", req, data); 468 trace!("HID control_out {:?} {=[u8]:x}", req, data);
469 match req.request { 469 match req.request {
470 HID_REQ_SET_IDLE => { 470 HID_REQ_SET_IDLE => {
471 if let Some(handler) = self.request_handler { 471 if let Some(handler) = self.request_handler.as_mut() {
472 let id = req.value as u8; 472 let id = req.value as u8;
473 let id = (id != 0).then_some(ReportId::In(id)); 473 let id = (id != 0).then_some(ReportId::In(id));
474 let dur = u32::from(req.value >> 8); 474 let dur = u32::from(req.value >> 8);
@@ -477,7 +477,7 @@ impl<'d> Handler for Control<'d> {
477 } 477 }
478 Some(OutResponse::Accepted) 478 Some(OutResponse::Accepted)
479 } 479 }
480 HID_REQ_SET_REPORT => match (ReportId::try_from(req.value), self.request_handler) { 480 HID_REQ_SET_REPORT => match (ReportId::try_from(req.value), self.request_handler.as_mut()) {
481 (Ok(id), Some(handler)) => Some(handler.set_report(id, data)), 481 (Ok(id), Some(handler)) => Some(handler.set_report(id, data)),
482 _ => Some(OutResponse::Rejected), 482 _ => Some(OutResponse::Rejected),
483 }, 483 },
@@ -513,7 +513,7 @@ impl<'d> Handler for Control<'d> {
513 match req.request { 513 match req.request {
514 HID_REQ_GET_REPORT => { 514 HID_REQ_GET_REPORT => {
515 let size = match ReportId::try_from(req.value) { 515 let size = match ReportId::try_from(req.value) {
516 Ok(id) => self.request_handler.and_then(|x| x.get_report(id, buf)), 516 Ok(id) => self.request_handler.as_mut().and_then(|x| x.get_report(id, buf)),
517 Err(_) => None, 517 Err(_) => None,
518 }; 518 };
519 519
@@ -524,7 +524,7 @@ impl<'d> Handler for Control<'d> {
524 } 524 }
525 } 525 }
526 HID_REQ_GET_IDLE => { 526 HID_REQ_GET_IDLE => {
527 if let Some(handler) = self.request_handler { 527 if let Some(handler) = self.request_handler.as_mut() {
528 let id = req.value as u8; 528 let id = req.value as u8;
529 let id = (id != 0).then_some(ReportId::In(id)); 529 let id = (id != 0).then_some(ReportId::In(id));
530 if let Some(dur) = handler.get_idle_ms(id) { 530 if let Some(dur) = handler.get_idle_ms(id) {