11use core:: { mem:: MaybeUninit , num:: NonZero } ;
22
3+ use futures:: FutureExt ;
34use libusb1_sys:: * ;
4- use usb_if:: descriptor:: DeviceDescriptor ;
5-
6- use crate :: IDevice ;
5+ use usb_if:: descriptor:: { ConfigurationDescriptor , DeviceDescriptor , InterfaceDescriptor , InterfaceDescriptors } ;
76
87pub struct DeviceInfo {
98 pub ( crate ) raw : * mut libusb_device ,
@@ -20,22 +19,6 @@ impl DeviceInfo {
2019 pub fn raw ( & self ) -> * mut libusb_device {
2120 self . raw
2221 }
23-
24- pub fn open ( & mut self ) -> crate :: err:: Result < Device > {
25- let mut handle = std:: ptr:: null_mut ( ) ;
26- usb ! ( libusb_open( self . raw, & mut handle) ) ?;
27- let desc = self . descriptor ( ) ?;
28- Ok ( Device :: new ( handle, desc) )
29- }
30-
31- pub fn descriptor ( & self ) -> crate :: err:: Result < DeviceDescriptor > {
32- let mut desc: MaybeUninit < libusb_device_descriptor > = MaybeUninit :: uninit ( ) ;
33- usb ! ( libusb_get_device_descriptor( self . raw, desc. as_mut_ptr( ) ) ) ?;
34- let desc = unsafe { desc. assume_init ( ) } ;
35- libusb_device_desc_to_desc ( & desc)
36- }
37-
38-
3922}
4023
4124impl Drop for DeviceInfo {
@@ -46,13 +29,88 @@ impl Drop for DeviceInfo {
4629 }
4730}
4831
49- impl IDevice for DeviceInfo { }
32+ impl usb_if:: host:: DeviceInfo for DeviceInfo {
33+ fn open (
34+ & mut self ,
35+ ) -> futures:: future:: LocalBoxFuture <
36+ ' _ ,
37+ Result < Box < dyn usb_if:: host:: Device > , usb_if:: host:: USBError > ,
38+ > {
39+ async move {
40+ let mut handle = std:: ptr:: null_mut ( ) ;
41+ usb ! ( libusb_open( self . raw, & mut handle) ) ?;
42+ let desc = self . descriptor ( ) . await ?;
43+ let device = Device :: new ( handle, desc) ;
44+
45+ Ok ( Box :: new ( device) as Box < dyn usb_if:: host:: Device > )
46+ }
47+ . boxed_local ( )
48+ }
49+
50+ fn descriptor (
51+ & self ,
52+ ) -> futures:: future:: LocalBoxFuture < ' _ , Result < DeviceDescriptor , usb_if:: host:: USBError > > {
53+ async move {
54+ let mut desc: MaybeUninit < libusb_device_descriptor > = MaybeUninit :: uninit ( ) ;
55+ usb ! ( libusb_get_device_descriptor( self . raw, desc. as_mut_ptr( ) ) ) ?;
56+ let desc = unsafe { desc. assume_init ( ) } ;
57+ libusb_device_desc_to_desc ( & desc)
58+ }
59+ . boxed_local ( )
60+ }
61+
62+ fn configuration_descriptor (
63+ & mut self ,
64+ index : u8 ,
65+ ) -> futures:: future:: LocalBoxFuture < ' _ , Result < ConfigurationDescriptor , usb_if:: host:: USBError > >
66+ {
67+ async move {
68+ let mut desc: MaybeUninit < * const libusb_config_descriptor > = MaybeUninit :: uninit ( ) ;
69+ usb ! ( libusb_get_config_descriptor(
70+ self . raw,
71+ index,
72+ desc. as_mut_ptr( )
73+ ) ) ?;
74+ let desc = unsafe { desc. assume_init ( ) } ;
75+
76+ if desc. is_null ( ) {
77+ return Err ( usb_if:: host:: USBError :: Other (
78+ "Failed to get configuration descriptor" . into ( ) ,
79+ ) ) ;
80+ }
81+
82+ let desc = unsafe { & * desc } ;
83+
84+ let interface_num = desc. bNumInterfaces as usize ;
85+ let mut interfaces = Vec :: with_capacity ( interface_num) ;
86+
87+ for iface_num in 0 ..interface_num {
88+
89+ }
90+
91+ let out = ConfigurationDescriptor {
92+ num_interfaces : desc. bNumInterfaces ,
93+ configuration_value : desc. bConfigurationValue ,
94+ attributes : desc. bmAttributes ,
95+ max_power : desc. bMaxPower ,
96+ string_index : NonZero :: new ( desc. iConfiguration ) ,
97+ string : None ,
98+ interfaces,
99+ } ;
100+ unsafe { libusb_free_config_descriptor ( desc) } ;
101+ Ok ( out)
102+ }
103+ . boxed_local ( )
104+ }
105+ }
50106
51107pub struct Device {
52108 raw : * mut libusb_device_handle ,
53109 desc : DeviceDescriptor ,
54110}
55111
112+ unsafe impl Send for Device { }
113+
56114impl Device {
57115 pub ( crate ) fn new ( raw : * mut libusb_device_handle , desc : DeviceDescriptor ) -> Self {
58116 Self { raw, desc }
@@ -75,6 +133,53 @@ impl Drop for Device {
75133 }
76134}
77135
136+ impl usb_if:: host:: Device for Device {
137+ fn set_configuration (
138+ & mut self ,
139+ configuration : u8 ,
140+ ) -> futures:: future:: LocalBoxFuture < ' _ , Result < ( ) , usb_if:: host:: USBError > > {
141+ todo ! ( )
142+ }
143+
144+ fn get_configuration (
145+ & mut self ,
146+ ) -> futures:: future:: LocalBoxFuture < ' _ , Result < u8 , usb_if:: host:: USBError > > {
147+ todo ! ( )
148+ }
149+
150+ fn claim_interface (
151+ & mut self ,
152+ interface : u8 ,
153+ alternate : u8 ,
154+ ) -> futures:: future:: LocalBoxFuture <
155+ ' _ ,
156+ Result < Box < dyn usb_if:: host:: Interface > , usb_if:: host:: USBError > ,
157+ > {
158+ todo ! ( )
159+ }
160+
161+ fn string_descriptor (
162+ & mut self ,
163+ index : u8 ,
164+ language_id : u16 ,
165+ ) -> futures:: future:: LocalBoxFuture < ' _ , Result < String , usb_if:: host:: USBError > > {
166+ async move {
167+ let mut buf = vec ! [ 0u8 ; 256 ] ;
168+ let len = usb ! ( libusb_get_string_descriptor_ascii(
169+ self . raw,
170+ index,
171+ buf. as_mut_ptr( ) ,
172+ buf. len( ) as _
173+ ) ) ?;
174+ buf. truncate ( len as usize ) ;
175+ String :: from_utf8 ( buf) . map_err ( |_| {
176+ usb_if:: host:: USBError :: Other ( "Failed to convert string descriptor to UTF-8" . into ( ) )
177+ } )
178+ }
179+ . boxed_local ( )
180+ }
181+ }
182+
78183fn libusb_device_desc_to_desc (
79184 desc : & libusb_device_descriptor ,
80185) -> crate :: err:: Result < DeviceDescriptor > {
@@ -91,8 +196,5 @@ fn libusb_device_desc_to_desc(
91196 usb_version : desc. bcdUSB ,
92197 max_packet_size_0 : desc. bMaxPacketSize0 ,
93198 device_version : desc. bcdDevice ,
94- manufacturer_string : None ,
95- product_string : None ,
96- serial_number_string : None ,
97199 } )
98200}
0 commit comments