-
-
Notifications
You must be signed in to change notification settings - Fork 3
/
mod.ts
210 lines (175 loc) · 3.99 KB
/
mod.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
import {
claim_interface,
clear_halt,
close,
control_transfer_in,
control_transfer_out,
Direction,
get_devices,
open,
release_interface,
reset,
select_alternate_interface,
select_configuration,
transfer_in,
transfer_out,
UsbControlTransferParameters,
} from "./bindings/bindings.ts";
export * from "./bindings/bindings.ts";
export class UsbDevice {
#inner;
constructor(raw) {
this.#inner = { device: raw };
}
get raw() {
return this.#inner.device;
}
get configurations() {
return this.#inner.device.configurations;
}
get configuration() {
return this.#inner.device.configuration;
}
get deviceClass() {
return this.#inner.device.deviceClass;
}
get deviceSubclass() {
return this.#inner.device.deviceSubclass;
}
get deviceProtocol() {
return this.#inner.device.deviceProtocol;
}
get deviceVersionMajor() {
return this.#inner.device.deviceVersionMajor;
}
get deviceVersionMinor() {
return this.#inner.device.deviceVersionMinor;
}
get deviceVersionSubminor() {
return this.#inner.device.deviceVersionSubminor;
}
get manufacturerName() {
return this.#inner.device.manufacturerName;
}
get productId() {
return this.#inner.device.productId;
}
get productName() {
return this.#inner.device.productName;
}
get serialNumber() {
return this.#inner.device.serialNumber;
}
get usbVersionMajor() {
return this.#inner.device.usbVersionMajor;
}
get usbVersionMinor() {
return this.#inner.device.usbVersionMinor;
}
get usbVersionSubminor() {
return this.#inner.device.usbVersionSubminor;
}
get vendorId() {
return this.#inner.device.vendorId;
}
get opened() {
return this.#inner.opened;
}
get url() {
return this.#inner.url;
}
async open() {
this.#inner = await open(this.#inner);
}
async reset() {
this.#inner = await reset(this.#inner);
}
async close() {
this.#inner = await close(this.#inner);
}
async transferIn(endpointNumber: number, length: number) {
const pointer = await transfer_in(
this.#inner,
endpointNumber,
length,
);
const view = new Deno.UnsafePointerView(pointer);
const u8 = new Uint8Array(length);
view.copyInto(u8);
return u8;
}
async transferOut(endpointNumber: number, data: Uint8Array) {
await transfer_out(this.#inner, endpointNumber, data);
}
async controlTransferIn(
setup: UsbControlTransferParameters,
length: number,
): Promise<Uint8Array> {
const ptr = await control_transfer_in(
this.#inner,
{ inner: setup },
);
const view = new Deno.UnsafePointerView(ptr);
const u8 = new Uint8Array(length);
view.copyInto(u8);
return u8;
}
controlTransferOut(
setup: UsbControlTransferParameters,
data?: Uint8Array,
): Promise<number> {
return control_transfer_out(
this.#inner,
{ inner: setup },
data || new Uint8Array(),
);
}
async clearHalt(
direction: Direction,
endpointNumber: number,
) {
await clear_halt(
this.#inner,
{ inner: direction },
endpointNumber,
);
}
async selectAlternateInterface(
interfaceNumber: number,
alternateSetting: number,
) {
this.#inner = await select_alternate_interface(
this.#inner,
interfaceNumber,
alternateSetting,
);
}
async selectConfiguration(configurationValue: number) {
this.#inner = await select_configuration(this.#inner, configurationValue);
}
async releaseInterface(
interfaceNumber: number,
) {
this.#inner = await release_interface(
this.#inner,
interfaceNumber,
);
}
async claimInterface(
interfaceNumber: number,
) {
this.#inner = await claim_interface(
this.#inner,
interfaceNumber,
);
}
}
class Usb {
async getDevices() {
const { devices } = await get_devices();
return devices.map((dev) => new UsbDevice(dev));
}
}
const usb = new Usb();
navigator.usb = usb;
export default usb;