@@ -89,7 +89,7 @@ export interface Adapter {
89
89
getConnected ( handle : string ) : boolean ;
90
90
getOpened ( handle : string ) : boolean ;
91
91
92
- listUSBDevices ( ) : Promise < Array < USBDevice > > ;
92
+ listUSBDevices ( filters : Array < USBDeviceFilter > ) : Promise < Array < USBDevice > > ;
93
93
open ( handle : string ) : Promise < void > ;
94
94
close ( handle : string ) : Promise < void > ;
95
95
selectConfiguration ( handle : string , id : number ) : Promise < void > ;
@@ -234,13 +234,38 @@ export class USBAdapter extends EventEmitter implements Adapter {
234
234
} ) ;
235
235
}
236
236
237
- private loadDevices ( ) : Promise < Array < Device > > {
237
+ private loadDevices ( filters : Array < USBDeviceFilter > ) : Promise < Array < Device > > {
238
238
// Reset device cache
239
239
this . devices = { } ;
240
- const devices = getDeviceList ( ) ;
240
+ let devices = getDeviceList ( ) ;
241
+
242
+ // Pre-filter devices
243
+ devices = this . filterDevices ( devices , filters ) ;
241
244
return this . serialPromises ( this . loadDevice , devices ) ;
242
245
}
243
246
247
+ private filterDevices ( devices : Array < Device > , filters : Array < USBDeviceFilter > ) : Array < Device > {
248
+ return devices . filter ( device => filters . some ( filter => {
249
+ // Vendor
250
+ if ( filter . vendorId && filter . vendorId !== device . deviceDescriptor . idVendor ) return false ;
251
+
252
+ // Product
253
+ if ( filter . productId && filter . productId !== device . deviceDescriptor . idProduct ) return false ;
254
+
255
+ // Class
256
+ if ( filter . classCode && filter . classCode !== device . deviceDescriptor . bDeviceClass ) return false ;
257
+
258
+ // Subclass
259
+ if ( filter . subclassCode && filter . subclassCode !== device . deviceDescriptor . bDeviceSubClass ) return false ;
260
+
261
+ // Protocol
262
+ if ( filter . protocolCode && filter . protocolCode !== device . deviceDescriptor . bDeviceProtocol ) return false ;
263
+
264
+ // Ignore serial number for node-usb as it requires device connection
265
+ return true ;
266
+ } ) ) ;
267
+ }
268
+
244
269
private loadDevice ( device : Device , retries : number = 0 ) : Promise < Device > {
245
270
246
271
// Early guard against unsupported USB devices
@@ -590,8 +615,8 @@ export class USBAdapter extends EventEmitter implements Adapter {
590
615
return ( device . interfaces !== null ) ;
591
616
}
592
617
593
- public listUSBDevices ( ) : Promise < Array < USBDevice > > {
594
- return this . loadDevices ( )
618
+ public listUSBDevices ( filters : Array < USBDeviceFilter > ) : Promise < Array < USBDevice > > {
619
+ return this . loadDevices ( filters )
595
620
. then ( ( ) => {
596
621
return this . serialPromises ( this . devicetoUSBDevice , Object . keys ( this . devices ) ) ;
597
622
} ) ;
0 commit comments