use alloc::boxed::Box;
#[cfg(any(kmod, umod))]
use alloc::vec::Vec;
use core::any::Any;
use futures::future::{BoxFuture, LocalBoxFuture};
use usb_if::err::USBError;
#[cfg(any(kmod, umod))]
use crate::backend::ty::ProbedDeviceInfoOp;
use crate::backend::ty::{DeviceInfoOp, DeviceOp};
#[cfg(umod)]
pub mod umod;
#[cfg(kmod)]
pub mod kmod;
pub(crate) mod ty;
define_int_type!(Dci, u8);
define_int_type!(PortId, usize);
define_int_type!(DeviceId, u32);
impl Dci {
pub const CTRL: Self = Self(1);
pub fn as_u8(&self) -> u8 {
self.0
}
pub fn as_usize(&self) -> usize {
self.0 as usize
}
}
pub(crate) trait BackendOp: Send + Any + 'static {
fn init<'a>(&'a mut self) -> BoxFuture<'a, Result<(), USBError>>;
#[cfg(any(kmod, umod))]
fn device_list<'a>(&'a mut self) -> BoxFuture<'a, Result<Vec<ProbedDeviceInfoOp>, USBError>>;
fn open_device<'a>(
&'a mut self,
dev: &'a dyn DeviceInfoOp,
) -> LocalBoxFuture<'a, Result<Box<dyn DeviceOp>, USBError>>;
#[cfg(kmod)]
fn create_event_handler(&mut self) -> Box<dyn crate::backend::ty::EventHandlerOp>;
fn enable_irq(&mut self) -> Result<(), USBError> {
Err(USBError::NotSupported)
}
fn disable_irq(&mut self) -> Result<(), USBError> {
Err(USBError::NotSupported)
}
}