1
- import { USBDeviceFound , USBRequestDeviceOptions , ParseUSBDevice , USBConfiguration , USBInterface } from "./USBTypes" ;
1
+ import { USBDeviceFound , USBRequestDeviceOptions , ParseUSBDevice , USBConfiguration , USBInterface , USBDirection , USBInTransferResult , USBOutTransferResult , USBTransferStatus } from "./USBTypes" ;
2
2
3
3
type DotNetReferenceType = {
4
4
invokeMethod < T > ( methodIdentifier : string , ...args : any [ ] ) : T ,
@@ -7,7 +7,10 @@ type DotNetReferenceType = {
7
7
8
8
export class USBManager {
9
9
private usb : any = ( < any > navigator ) . usb ; // The WebUSB API root object
10
- private _foundDevices : any [ ] = [ ] ; // All devices found on the last request
10
+ // All devices found on the last request
11
+ // We keep a list of the most recent object because we can't serialize the "real" USBDevice to send back to C#
12
+ // TODO: Find a better way to maintain it and keep consistent with the C# side...
13
+ private _foundDevices : any [ ] = [ ] ;
11
14
12
15
public GetDevices = async ( ) : Promise < USBDeviceFound [ ] > => {
13
16
let devices = await this . usb . getDevices ( ) ;
@@ -77,31 +80,114 @@ export class USBManager {
77
80
} ) ;
78
81
}
79
82
80
- public SelectConfiguration = ( device : USBDeviceFound , config : USBConfiguration ) : Promise < USBDeviceFound > => {
83
+ public CloseDevice = ( device : USBDeviceFound ) : Promise < USBDeviceFound > => {
81
84
let usbDevice = this . GetUSBDevice ( device ) ;
82
85
return new Promise < USBDeviceFound > ( ( resolve , reject ) => {
83
86
if ( ! usbDevice ) return reject ( "Device not connected" ) ;
84
- usbDevice . selectConfiguration ( config . configurationValue )
87
+ usbDevice . close ( )
85
88
. then ( ( ) => {
86
89
resolve ( ParseUSBDevice ( usbDevice ) ) ;
87
90
} )
88
91
. catch ( err => reject ( err ) ) ;
89
92
} ) ;
90
93
}
91
94
92
- public ClaimInterface = ( device : USBDeviceFound , usbInterface : USBInterface ) : Promise < USBDeviceFound > => {
95
+ public ResetDevice = ( device : USBDeviceFound ) : Promise < USBDeviceFound > => {
93
96
let usbDevice = this . GetUSBDevice ( device ) ;
94
97
return new Promise < USBDeviceFound > ( ( resolve , reject ) => {
95
98
if ( ! usbDevice ) return reject ( "Device not connected" ) ;
99
+ usbDevice . reset ( )
100
+ . then ( ( ) => {
101
+ resolve ( ParseUSBDevice ( usbDevice ) ) ;
102
+ } )
103
+ . catch ( err => reject ( err ) ) ;
104
+ } ) ;
105
+ }
106
+
107
+ public SelectConfiguration = ( device : USBDeviceFound , configurationValue : number ) : Promise < USBDeviceFound > => {
108
+ let usbDevice = this . GetUSBDevice ( device ) ;
109
+ return new Promise < USBDeviceFound > ( ( resolve , reject ) => {
110
+ if ( ! usbDevice ) return reject ( "Device not connected" ) ;
111
+ usbDevice . selectConfiguration ( configurationValue )
112
+ . then ( ( ) => {
113
+ resolve ( ParseUSBDevice ( usbDevice ) ) ;
114
+ } )
115
+ . catch ( err => reject ( err ) ) ;
116
+ } ) ;
117
+ }
96
118
97
- usbDevice . claimInterface ( usbInterface . interfaceNumber )
119
+ public ClaimInterface = ( device : USBDeviceFound , interfaceNumber : number ) : Promise < USBDeviceFound > => {
120
+ let usbDevice = this . GetUSBDevice ( device ) ;
121
+ return new Promise < USBDeviceFound > ( ( resolve , reject ) => {
122
+ if ( ! usbDevice ) return reject ( "Device not connected" ) ;
123
+
124
+ usbDevice . claimInterface ( interfaceNumber )
125
+ . then ( ( ) => {
126
+ resolve ( ParseUSBDevice ( usbDevice ) ) ;
127
+ } )
128
+ . catch ( err => reject ( err ) ) ;
129
+ } ) ;
130
+ }
131
+
132
+ public ReleaseInterface = ( device : USBDeviceFound , interfaceNumber : number ) : Promise < USBDeviceFound > => {
133
+ let usbDevice = this . GetUSBDevice ( device ) ;
134
+ return new Promise < USBDeviceFound > ( ( resolve , reject ) => {
135
+ if ( ! usbDevice ) return reject ( "Device not connected" ) ;
136
+
137
+ usbDevice . releaseInterface ( interfaceNumber )
98
138
. then ( ( ) => {
99
139
resolve ( ParseUSBDevice ( usbDevice ) ) ;
100
140
} )
101
141
. catch ( err => reject ( err ) ) ;
102
142
} ) ;
103
143
}
104
144
145
+ public SelectAlternateInterface = ( device : USBDeviceFound , interfaceNumber : number , alternateSetting : number ) : Promise < USBDeviceFound > => {
146
+ let usbDevice = this . GetUSBDevice ( device ) ;
147
+ return new Promise < USBDeviceFound > ( ( resolve , reject ) => {
148
+ if ( ! usbDevice ) return reject ( "Device not connected" ) ;
149
+
150
+ usbDevice . selectAlternateInterface ( interfaceNumber , alternateSetting )
151
+ . then ( ( ) => {
152
+ resolve ( ParseUSBDevice ( usbDevice ) ) ;
153
+ } )
154
+ . catch ( err => reject ( err ) ) ;
155
+ } ) ;
156
+ }
157
+
158
+ public ClearHalt = ( device : USBDeviceFound , direction : USBDirection , endpointNumber : number ) : Promise < USBDeviceFound > => {
159
+ let usbDevice = this . GetUSBDevice ( device ) ;
160
+ return new Promise < USBDeviceFound > ( ( resolve , reject ) => {
161
+ if ( ! usbDevice ) return reject ( "Device not connected" ) ;
162
+
163
+ usbDevice . clearHalt ( direction , endpointNumber )
164
+ . then ( ( ) => {
165
+ resolve ( ParseUSBDevice ( usbDevice ) ) ;
166
+ } )
167
+ . catch ( err => reject ( err ) ) ;
168
+ } ) ;
169
+ }
170
+
171
+ public TransferIn = ( device : USBDeviceFound , endpointNumber : number , length : number ) : Promise < USBInTransferResult > => {
172
+ return new Promise < USBInTransferResult > ( ( resolve , reject ) => {
173
+ reject ( "Not implemented" ) ;
174
+ } ) ;
175
+ }
176
+
177
+ public TransferOut = ( device : USBDeviceFound , endpointNumber : number , data : ArrayBuffer ) : Promise < USBOutTransferResult > => {
178
+ let usbDevice = this . GetUSBDevice ( device ) ;
179
+ return new Promise < USBOutTransferResult > ( ( resolve , reject ) => {
180
+ if ( ! usbDevice ) return reject ( "Device not connected" ) ;
181
+ console . log ( data ) ;
182
+ usbDevice . transferOut ( endpointNumber , data )
183
+ . then ( out => {
184
+ console . log ( out ) ;
185
+ resolve ( { bytesWritten : out . bytesWritten , status : out . status } ) ;
186
+ } )
187
+ . catch ( err => reject ( err ) ) ;
188
+ } ) ;
189
+ }
190
+
105
191
private GetUSBDevice = ( device : USBDeviceFound ) : any => {
106
192
return this . _foundDevices . find (
107
193
d => d . vendorId == device . vendorId &&
0 commit comments