11use heapless:: Vec ;
22
3+ use crate :: { Interface , STRING_INDEX_CUSTOM_START } ;
4+
35use super :: control:: ControlHandler ;
46use super :: descriptor:: { BosWriter , DescriptorWriter } ;
57use super :: driver:: { Driver , Endpoint } ;
@@ -121,11 +123,10 @@ impl<'a> Config<'a> {
121123pub struct Builder < ' d , D : Driver < ' d > > {
122124 config : Config < ' d > ,
123125 handler : Option < & ' d dyn DeviceStateHandler > ,
124- interfaces : Vec < ( u8 , & ' d mut dyn ControlHandler ) , MAX_INTERFACE_COUNT > ,
126+ interfaces : Vec < Interface < ' d > , MAX_INTERFACE_COUNT > ,
125127 control_buf : & ' d mut [ u8 ] ,
126128
127129 driver : D ,
128- next_interface_number : u8 ,
129130 next_string_index : u8 ,
130131
131132 device_descriptor : DescriptorWriter < ' d > ,
@@ -180,8 +181,7 @@ impl<'d, D: Driver<'d>> Builder<'d, D> {
180181 config,
181182 interfaces : Vec :: new ( ) ,
182183 control_buf,
183- next_interface_number : 0 ,
184- next_string_index : 4 ,
184+ next_string_index : STRING_INDEX_CUSTOM_START ,
185185
186186 device_descriptor,
187187 config_descriptor,
@@ -212,14 +212,6 @@ impl<'d, D: Driver<'d>> Builder<'d, D> {
212212 self . control_buf . len ( )
213213 }
214214
215- /// Allocates a new string index.
216- pub fn alloc_string ( & mut self ) -> StringIndex {
217- let index = self . next_string_index ;
218- self . next_string_index += 1 ;
219-
220- StringIndex :: new ( index)
221- }
222-
223215 /// Add an USB function.
224216 ///
225217 /// If [`Config::composite_with_iads`] is set, this will add an IAD descriptor
@@ -234,7 +226,7 @@ impl<'d, D: Driver<'d>> Builder<'d, D> {
234226 ) -> FunctionBuilder < ' _ , ' d , D > {
235227 let iface_count_index = if self . config . composite_with_iads {
236228 self . config_descriptor . iad (
237- InterfaceNumber :: new ( self . next_interface_number ) ,
229+ InterfaceNumber :: new ( self . interfaces . len ( ) as _ ) ,
238230 0 ,
239231 class,
240232 subclass,
@@ -267,21 +259,21 @@ impl<'a, 'd, D: Driver<'d>> FunctionBuilder<'a, 'd, D> {
267259 /// Add an interface to the function.
268260 ///
269261 /// Interface numbers are guaranteed to be allocated consecutively, starting from 0.
270- pub fn interface (
271- & mut self ,
272- handler : Option < & ' d mut dyn ControlHandler > ,
273- ) -> InterfaceBuilder < ' _ , ' d , D > {
262+ pub fn interface ( & mut self ) -> InterfaceBuilder < ' _ , ' d , D > {
274263 if let Some ( i) = self . iface_count_index {
275264 self . builder . config_descriptor . buf [ i] += 1 ;
276265 }
277266
278- let number = self . builder . next_interface_number ;
279- self . builder . next_interface_number += 1 ;
267+ let number = self . builder . interfaces . len ( ) as _ ;
268+ let iface = Interface {
269+ handler : None ,
270+ current_alt_setting : 0 ,
271+ num_alt_settings : 0 ,
272+ num_strings : 0 ,
273+ } ;
280274
281- if let Some ( handler) = handler {
282- if self . builder . interfaces . push ( ( number, handler) ) . is_err ( ) {
283- panic ! ( "max interface count reached" )
284- }
275+ if self . builder . interfaces . push ( iface) . is_err ( ) {
276+ panic ! ( "max interface count reached" )
285277 }
286278
287279 InterfaceBuilder {
@@ -305,6 +297,19 @@ impl<'a, 'd, D: Driver<'d>> InterfaceBuilder<'a, 'd, D> {
305297 self . interface_number
306298 }
307299
300+ pub fn handler ( & mut self , handler : & ' d mut dyn ControlHandler ) {
301+ self . builder . interfaces [ self . interface_number . 0 as usize ] . handler = Some ( handler) ;
302+ }
303+
304+ /// Allocates a new string index.
305+ pub fn string ( & mut self ) -> StringIndex {
306+ let index = self . builder . next_string_index ;
307+ self . builder . next_string_index += 1 ;
308+ self . builder . interfaces [ self . interface_number . 0 as usize ] . num_strings += 1 ;
309+
310+ StringIndex :: new ( index)
311+ }
312+
308313 /// Add an alternate setting to the interface and write its descriptor.
309314 ///
310315 /// Alternate setting numbers are guaranteed to be allocated consecutively, starting from 0.
@@ -318,6 +323,7 @@ impl<'a, 'd, D: Driver<'d>> InterfaceBuilder<'a, 'd, D> {
318323 ) -> InterfaceAltBuilder < ' _ , ' d , D > {
319324 let number = self . next_alt_setting_number ;
320325 self . next_alt_setting_number += 1 ;
326+ self . builder . interfaces [ self . interface_number . 0 as usize ] . num_alt_settings += 1 ;
321327
322328 self . builder . config_descriptor . interface_alt (
323329 self . interface_number ,
0 commit comments