pub(crate) mod libusb;
use std::future::Future;
#[cfg(unix)]
use std::os::fd::RawFd;
use std::pin::Pin;
use std::sync::{Arc};
use std::time::Duration;
use crate::define::*;
pub(crate) use crate::error::*;
pub(crate) struct RequestParamControlTransfer{
pub(crate) recipient: UsbControlRecipient,
pub(crate) transfer_type: UsbControlTransferType,
pub(crate) request: u8,
pub(crate) value: u16,
pub(crate) index: u16,
pub(crate) timeout: Duration,
}
#[derive(Copy, Clone)]
pub enum EndpointDirection<'a>{
In{capacity: usize},
Out{ src: &'a [u8]}
}
pub trait IRequest {
fn data(&mut self)->&mut[u8];
}
pub(crate) type ResultFuture<T> = Pin<Box<dyn Future<Output=Result<T>> + Send>>;
pub(crate) trait IManager{}
pub trait IInterface<R: IRequest>: Send {
fn bulk_request(
&self,
endpoint: EndpointDescriptor,
data: Vec<u8>,
timeout: Duration)-> Result<R>;
fn interrupt_request(
&self,
endpoint: EndpointDescriptor,
data: Vec<u8>,
timeout: Duration)-> Result<R>;
}
pub(crate) trait CtxDevice<R: IRequest, I: IInterface<R>>: Send {
fn pid(&self)->u16;
fn vid(&self)->u16;
fn serial_number(self: &Arc<Self>)-> ResultFuture<String>;
fn speed(self: &Arc<Self>)->Result<Speed>;
fn bcd_usb(&self)->u16;
fn device_class(&self)-> DeviceClass;
fn device_subclass(&self)-> DeviceClass;
fn device_protocol(&self)-> DeviceClass;
fn max_packet_size_0(&self)->usize;
fn bcd_device(&self)->u16;
fn manufacturer(self: &Arc<Self>)-> Result<String>;
fn product(self: &Arc<Self>)-> Result<String>;
fn control_request(self: &Arc<Self>,
param:RequestParamControlTransfer,
direction: EndpointDirection
)-> Result<R>;
fn claim_interface(self: &Arc<Self>, num: usize) ->Result<I>;
fn get_config(self: &Arc<Self>) ->Result<ConfigDescriptor>;
fn set_config(self: &Arc<Self>, config_value: u8)->Result<()>;
fn config_list(self: &Arc<Self>) ->Result<Vec<ConfigDescriptor>>;
}
pub(crate) trait CtxManager<
R: IRequest,
I: IInterface<R>,
D: CtxDevice<R, I>>: Send {
fn device_list(&self)-> ResultFuture<Vec<D>>;
#[cfg(unix)]
fn open_device_with_fd(&self, fd: RawFd)->Result<D>;
}