1
- import { USBDeviceFound , USBRequestDeviceOptions , ParseUSBDevice } from "./USBTypes" ;
1
+ import { USBDeviceFound , USBRequestDeviceOptions , ParseUSBDevice , USBConfiguration , USBInterface } from "./USBTypes" ;
2
2
3
3
type DotNetReferenceType = {
4
4
invokeMethod < T > ( methodIdentifier : string , ...args : any [ ] ) : T ,
5
5
invokeMethodAsync < T > ( methodIdentifier : string , ...args : any [ ] ) : Promise < T >
6
6
}
7
7
8
8
export class USBManager {
9
- private usb : any = ( < any > navigator ) . usb ;
10
- private _onConnectCallbackMap : Map < string , ( event ) => Promise < { } > > = new Map < string , ( event ) => Promise < { } > > ( ) ;
9
+ private usb : any = ( < any > navigator ) . usb ; // The WebUSB API root object
10
+ private _foundDevices : any [ ] = [ ] ; // All devices found on the last request
11
11
12
12
public GetDevices = async ( ) : Promise < USBDeviceFound [ ] > => {
13
13
let devices = await this . usb . getDevices ( ) ;
14
14
let found : USBDeviceFound [ ] = [ ] ;
15
- devices . forEach ( d => {
16
- found . push ( ParseUSBDevice ( d ) ) ;
17
- } ) ;
15
+ if ( devices ) {
16
+ devices . forEach ( d => {
17
+ found . push ( ParseUSBDevice ( d ) ) ;
18
+ this . _foundDevices . push ( d ) ;
19
+ } ) ;
20
+ }
18
21
return found ;
19
22
}
20
23
@@ -54,25 +57,72 @@ export class USBManager {
54
57
return new Promise ( ( resolve , reject ) => {
55
58
this . usb . requestDevice ( reqOptions )
56
59
. then ( d => {
57
- console . log ( d ) ;
58
- resolve ( ParseUSBDevice ( d ) ) ;
60
+ let usbDevice = ParseUSBDevice ( d ) ;
61
+ this . _foundDevices . push ( d ) ;
62
+ resolve ( usbDevice ) ;
63
+ } )
64
+ . catch ( err => reject ( err ) ) ;
65
+ } ) ;
66
+ }
67
+
68
+ public OpenDevice = ( device : USBDeviceFound ) : Promise < USBDeviceFound > => {
69
+ let usbDevice = this . GetUSBDevice ( device ) ;
70
+ return new Promise < USBDeviceFound > ( ( resolve , reject ) => {
71
+ if ( ! usbDevice ) return reject ( "Device not connected" ) ;
72
+ usbDevice . open ( )
73
+ . then ( ( ) => {
74
+ resolve ( ParseUSBDevice ( usbDevice ) ) ;
59
75
} )
60
76
. catch ( err => reject ( err ) ) ;
61
77
} ) ;
62
78
}
63
79
64
- public AddOnConnectHandler = ( callback : DotNetReferenceType ) => {
65
- // TODO: Fix me
66
- const id = callback . invokeMethod < string > ( "Id" ) ;
67
- let localCallback = ( event ) => callback . invokeMethodAsync ( event . device ) ;
68
- this . _onConnectCallbackMap . set ( id , localCallback ) ;
69
- this . usb . addEventListener ( "connect" , localCallback ) ;
80
+ public SelectConfiguration = ( device : USBDeviceFound , config : USBConfiguration ) : Promise < USBDeviceFound > => {
81
+ let usbDevice = this . GetUSBDevice ( device ) ;
82
+ return new Promise < USBDeviceFound > ( ( resolve , reject ) => {
83
+ if ( ! usbDevice ) return reject ( "Device not connected" ) ;
84
+ usbDevice . selectConfiguration ( config . configurationValue )
85
+ . then ( ( ) => {
86
+ resolve ( ParseUSBDevice ( usbDevice ) ) ;
87
+ } )
88
+ . catch ( err => reject ( err ) ) ;
89
+ } ) ;
90
+ }
91
+
92
+ public ClaimInterface = ( device : USBDeviceFound , usbInterface : USBInterface ) : Promise < USBDeviceFound > => {
93
+ let usbDevice = this . GetUSBDevice ( device ) ;
94
+ return new Promise < USBDeviceFound > ( ( resolve , reject ) => {
95
+ if ( ! usbDevice ) return reject ( "Device not connected" ) ;
96
+
97
+ usbDevice . claimInterface ( usbInterface . interfaceNumber )
98
+ . then ( ( ) => {
99
+ resolve ( ParseUSBDevice ( usbDevice ) ) ;
100
+ } )
101
+ . catch ( err => reject ( err ) ) ;
102
+ } ) ;
103
+ }
104
+
105
+ private GetUSBDevice = ( device : USBDeviceFound ) : any => {
106
+ return this . _foundDevices . find (
107
+ d => d . vendorId == device . vendorId &&
108
+ d . productId == device . productId &&
109
+ d . deviceClass == device . deviceClass &&
110
+ d . serialNumber == device . serialNumber ) ;
111
+ }
112
+
113
+ private FireUSBDeviceEvent = ( event : string , eventPayload : any , usb : DotNetReferenceType ) => {
114
+ let device = ParseUSBDevice ( eventPayload . device ) ;
115
+ return usb . invokeMethodAsync ( event , device ) ;
116
+ }
117
+
118
+ public RegisterUSBEvents = ( usb : DotNetReferenceType ) => {
119
+ //TODO: Check why this event is not consistently being fired.
120
+ this . usb . addEventListener ( "connect" , ( event ) => this . FireUSBDeviceEvent ( "OnConnect" , event , usb ) ) ;
121
+ this . usb . addEventListener ( "disconnect" , ( event ) => this . FireUSBDeviceEvent ( "OnDisconnect" , event , usb ) ) ;
70
122
}
71
123
72
- public RemoveOnConnectHandler = ( callback : DotNetReferenceType ) => {
73
- const id = callback . invokeMethod < string > ( "Id" ) ;
74
- console . log ( "Removed " + id ) ;
75
- // TODO: Fix me
76
- //Remove from callback collection
124
+ public RemoveUSBEvents = ( usb : DotNetReferenceType ) => {
125
+ this . usb . removeEventListener ( "connect" , ( event ) => this . FireUSBDeviceEvent ( "OnConnect" , event , usb ) ) ;
126
+ this . usb . removeEventListener ( "disconnect" , ( event ) => this . FireUSBDeviceEvent ( "OnDisconnect" , event , usb ) ) ;
77
127
}
78
128
}
0 commit comments