Skip to main content

crab_usb/
host.rs

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
16/// USB 主机控制器
17pub struct USBHost {
18    pub(crate) backend: Box<dyn BackendOp>,
19}
20
21impl USBHost {
22    /// 初始化主机控制器
23    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    /// 处理事件
58    pub fn handle_event(&self) -> Event {
59        self.handler.handle_event()
60    }
61}