From c53bb7394a20e180e2ac7e81cc468025018bd1da Mon Sep 17 00:00:00 2001 From: alexmoon Date: Mon, 28 Mar 2022 20:10:13 -0400 Subject: [PATCH] Switch to ControlHandler owned bufs for control_in() --- embassy-usb/src/control.rs | 7 +++---- embassy-usb/src/lib.rs | 11 ++++------- examples/nrf/src/bin/usb/cdc_acm.rs | 14 ++++++++------ 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/embassy-usb/src/control.rs b/embassy-usb/src/control.rs index cdae2d97..195b218d 100644 --- a/embassy-usb/src/control.rs +++ b/embassy-usb/src/control.rs @@ -133,8 +133,8 @@ pub enum OutResponse { #[derive(Copy, Clone, Eq, PartialEq, Debug)] #[cfg_attr(feature = "defmt", derive(defmt::Format))] -pub enum InResponse { - Accepted(usize), +pub enum InResponse<'a> { + Accepted(&'a [u8]), Rejected, } @@ -164,8 +164,7 @@ pub trait ControlHandler { /// # Arguments /// /// * `req` - The request from the SETUP packet. - /// * `resp` - The buffer for you to write the response. - fn control_in(&mut self, req: Request, resp: &mut [u8]) -> InResponse { + fn control_in(&mut self, req: Request) -> InResponse<'_> { InResponse::Rejected } } diff --git a/embassy-usb/src/lib.rs b/embassy-usb/src/lib.rs index 9ac55db7..5a82f5ca 100644 --- a/embassy-usb/src/lib.rs +++ b/embassy-usb/src/lib.rs @@ -284,13 +284,10 @@ impl<'d, D: Driver<'d>> UsbDevice<'d, D> { .find(|(i, _)| req.index == *i as _) .map(|(_, h)| h); match handler { - Some(handler) => { - let mut buf = [0; 128]; - match handler.control_in(req, &mut buf) { - InResponse::Accepted(len) => self.control.accept_in(&buf[..len]).await, - InResponse::Rejected => self.control.reject(), - } - } + Some(handler) => match handler.control_in(req) { + InResponse::Accepted(data) => self.control.accept_in(data).await, + InResponse::Rejected => self.control.reject(), + }, None => self.control.reject(), } } diff --git a/examples/nrf/src/bin/usb/cdc_acm.rs b/examples/nrf/src/bin/usb/cdc_acm.rs index 4b492593..2a78324f 100644 --- a/examples/nrf/src/bin/usb/cdc_acm.rs +++ b/examples/nrf/src/bin/usb/cdc_acm.rs @@ -66,6 +66,7 @@ pub struct CdcAcmClass<'d, D: Driver<'d>> { struct Control<'a> { shared: &'a ControlShared, + buf: [u8; 7], } /// Shared data between Control and CdcAcmClass @@ -138,17 +139,17 @@ impl<'a> ControlHandler for Control<'a> { } } - fn control_in(&mut self, req: Request, resp: &mut [u8]) -> InResponse { + fn control_in(&mut self, req: Request) -> InResponse<'_> { match req.request { // REQ_GET_ENCAPSULATED_COMMAND is not really supported - it will be rejected below. REQ_GET_LINE_CODING if req.length == 7 => { info!("Sending line coding"); let coding = self.shared().line_coding.lock(|x| x.get()); - resp[0..4].copy_from_slice(&coding.data_rate.to_le_bytes()); - resp[4] = coding.stop_bits as u8; - resp[5] = coding.parity_type as u8; - resp[6] = coding.data_bits; - InResponse::Accepted(7) + self.buf[0..4].copy_from_slice(&coding.data_rate.to_le_bytes()); + self.buf[4] = coding.stop_bits as u8; + self.buf[5] = coding.parity_type as u8; + self.buf[6] = coding.data_bits; + InResponse::Accepted(&self.buf) } _ => InResponse::Rejected, } @@ -165,6 +166,7 @@ impl<'d, D: Driver<'d>> CdcAcmClass<'d, D> { ) -> Self { let control = state.control.write(Control { shared: &state.shared, + buf: [0; 7], }); let control_shared = &state.shared;