diff options
| -rw-r--r-- | embassy-usb/src/class/hid.rs | 18 |
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 { | |||
| 411 | struct Control<'d> { | 411 | struct 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) { |
