Compilable version
This commit is contained in:
parent
510d910669
commit
4eac78708b
2 changed files with 32 additions and 46 deletions
14
src/main.rs
14
src/main.rs
|
@ -42,9 +42,9 @@ async fn main(_spawner: Spawner) {
|
|||
)
|
||||
.await;
|
||||
|
||||
// let usb_fut = mouse_hid.run();
|
||||
let usb_fut = MouseHID::run_usb().await;
|
||||
|
||||
const PIXEL: i8 = 2;
|
||||
const PIXEL: i8 = 100;
|
||||
const WAIT_TIME: Duration = Duration::from_secs(1);
|
||||
|
||||
// Do stuff with the class!
|
||||
|
@ -56,14 +56,12 @@ async fn main(_spawner: Spawner) {
|
|||
}
|
||||
};
|
||||
|
||||
// // Run everything concurrently.
|
||||
// // If we had made everything `'static` above instead, we could do this using separate tasks instead.
|
||||
// join(usb_fut, hid_fut).await;
|
||||
|
||||
hid_fut.await;
|
||||
// Run everything concurrently.
|
||||
// If we had made everything `'static` above instead, we could do this using separate tasks instead.
|
||||
join(hid_fut, usb_fut).await;
|
||||
}
|
||||
|
||||
async fn mouse_move(mouse_hid: &mut MouseHID<'_>, duration: Duration, v: i8) {
|
||||
async fn mouse_move(mouse_hid: &mut MouseHID<'static>, duration: Duration, v: i8) {
|
||||
Timer::after(duration).await;
|
||||
|
||||
let report = MouseReport {
|
||||
|
|
|
@ -9,6 +9,14 @@ use embassy_usb::{Builder, Config, UsbDevice};
|
|||
|
||||
use usbd_hid::descriptor::{MouseReport, SerializedDescriptor};
|
||||
|
||||
static mut DEVICE_DESCRIPTOR_BUFFER: [u8; 256] = [0; 256];
|
||||
static mut CONFIG_DESCRIPTOR_BUFFER: [u8; 256] = [0; 256];
|
||||
static mut BOS_DESCRIPTOR_BUFFER: [u8; 256] = [0; 256];
|
||||
static mut CONTROL_BUFFER: [u8; 64] = [0; 64];
|
||||
static mut STATE: Option<State<'static>> = None;
|
||||
static mut USB: Option<UsbDevice<'static, Driver<'static, USB>>> = None;
|
||||
static REQUEST_HANDLER: MyRequestHandler = MyRequestHandler {};
|
||||
|
||||
pub struct MouseConfig<'a> {
|
||||
pub vendor_id: u16,
|
||||
pub product_id: u16,
|
||||
|
@ -19,18 +27,10 @@ pub struct MouseConfig<'a> {
|
|||
|
||||
pub struct MouseHID<'d> {
|
||||
writer: HidWriter<'d, Driver<'d, USB>, 5>,
|
||||
usb: UsbDevice<'d, Driver<'d, USB>>,
|
||||
|
||||
state: State<'d>,
|
||||
|
||||
device_descriptor: [u8; 256],
|
||||
config_descriptor: [u8; 256],
|
||||
bos_descriptor: [u8; 256],
|
||||
control_buf: [u8; 64],
|
||||
}
|
||||
|
||||
impl<'d> MouseHID<'d> {
|
||||
pub async fn new(usb: USB, mouse_config: MouseConfig<'_>) -> MouseHID<'d> {
|
||||
impl MouseHID<'static> {
|
||||
pub async fn new(usb: USB, mouse_config: MouseConfig<'static>) -> MouseHID<'static> {
|
||||
// Create the driver, from the HAL.
|
||||
let irq = interrupt::take!(USBCTRL_IRQ);
|
||||
let driver = Driver::new(usb, irq);
|
||||
|
@ -42,52 +42,40 @@ impl<'d> MouseHID<'d> {
|
|||
config.device_class = 0;
|
||||
config.device_protocol = 2;
|
||||
|
||||
let mut device_descriptor = [0; 256];
|
||||
let mut config_descriptor = [0; 256];
|
||||
let mut bos_descriptor = [0; 256];
|
||||
let mut control_buf = [0; 64];
|
||||
|
||||
let request_handler = MyRequestHandler {};
|
||||
|
||||
let mut state = State::new();
|
||||
unsafe {
|
||||
STATE = Some(State::new());
|
||||
}
|
||||
|
||||
let mut builder = Builder::new(
|
||||
driver,
|
||||
config,
|
||||
&mut device_descriptor,
|
||||
&mut config_descriptor,
|
||||
&mut bos_descriptor,
|
||||
&mut control_buf,
|
||||
unsafe { &mut DEVICE_DESCRIPTOR_BUFFER },
|
||||
unsafe { &mut CONFIG_DESCRIPTOR_BUFFER },
|
||||
unsafe { &mut BOS_DESCRIPTOR_BUFFER },
|
||||
unsafe { &mut CONTROL_BUFFER },
|
||||
);
|
||||
|
||||
// Create classes on the builder.
|
||||
let config = embassy_usb::class::hid::Config {
|
||||
report_descriptor: MouseReport::desc(),
|
||||
request_handler: Some(&request_handler),
|
||||
request_handler: Some(&REQUEST_HANDLER),
|
||||
poll_ms: 60,
|
||||
max_packet_size: 8,
|
||||
};
|
||||
|
||||
let writer = HidWriter::<_, 5>::new(&mut builder, &mut state, config);
|
||||
let writer =
|
||||
HidWriter::<_, 5>::new(&mut builder, unsafe { STATE.as_mut().unwrap() }, config);
|
||||
|
||||
// Build the builder.
|
||||
let usb = builder.build();
|
||||
unsafe {
|
||||
USB = Some(builder.build());
|
||||
};
|
||||
|
||||
MouseHID {
|
||||
writer,
|
||||
usb,
|
||||
|
||||
state,
|
||||
|
||||
device_descriptor,
|
||||
config_descriptor,
|
||||
bos_descriptor,
|
||||
control_buf,
|
||||
}
|
||||
MouseHID { writer }
|
||||
}
|
||||
|
||||
pub async fn run(&'d mut self) -> impl Future<Output = !> + 'd {
|
||||
self.usb.run()
|
||||
pub async fn run_usb() -> impl Future<Output = !> {
|
||||
unsafe { USB.as_mut().unwrap().run() }
|
||||
}
|
||||
|
||||
pub async fn mouse_report(&mut self, report: MouseReport) {
|
||||
|
|
Loading…
Reference in a new issue