1use alloc::boxed::Box;
2use alloc::vec::Vec;
3
4use crate::backend::BackendOp;
5use crate::backend::ty::*;
6use crate::err::Result;
7
8#[cfg(kmod)]
9pub use super::backend::kmod::*;
10
11#[cfg(umod)]
12pub use super::backend::umod::*;
13
14pub use crate::device::{Device, DeviceInfo};
15
16pub struct USBHost {
18 pub(crate) backend: Box<dyn BackendOp>,
19}
20
21impl USBHost {
22 pub async fn init(&mut self) -> Result<()> {
24 self.backend.init().await?;
25 Ok(())
26 }
27
28 pub async fn probe_devices(&mut self) -> Result<Vec<DeviceInfo>> {
29 let device_infos = self.backend.device_list().await?;
30 let mut devices = Vec::new();
31 for dev in device_infos {
32 let dev_info = DeviceInfo { inner: dev };
33 devices.push(dev_info);
34 }
35 Ok(devices)
36 }
37
38 #[cfg(kmod)]
39 pub fn create_event_handler(&mut self) -> EventHandler {
40 let handler = self.backend.create_event_handler();
41 EventHandler { handler }
42 }
43
44 pub async fn open_device(&mut self, dev: &DeviceInfo) -> Result<Device> {
45 let device = self.backend.open_device(dev.inner.as_ref()).await?;
46 let mut device: Device = device.into();
47 device.init().await?;
48 Ok(device)
49 }
50}
51
52pub struct EventHandler {
53 handler: Box<dyn EventHandlerOp>,
54}
55
56impl EventHandler {
57 pub fn handle_event(&self) -> Event {
59 self.handler.handle_event()
60 }
61}