@v5x/serial 0.5.0 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Vex.d.ts +235 -0
- package/dist/VexCRC.d.ts +19 -0
- package/dist/VexConnection.d.ts +45 -0
- package/dist/VexDevice.d.ts +177 -0
- package/dist/VexEvent.d.ts +16 -0
- package/dist/VexFirmwareVersion.d.ts +55 -0
- package/dist/VexIniConfig.d.ts +27 -0
- package/dist/VexPacket.d.ts +512 -0
- package/dist/VexPacketView.d.ts +18 -0
- package/dist/index.d.ts +9 -0
- package/dist/v5-serial-protocol.cjs.js +4516 -0
- package/dist/v5-serial-protocol.cjs.js.map +1 -0
- package/dist/v5-serial-protocol.es.js +4401 -0
- package/dist/v5-serial-protocol.es.js.map +1 -0
- package/dts/Vex.d.ts +235 -0
- package/dts/Vex.js +189 -0
- package/dts/Vex.js.map +1 -0
- package/dts/VexCRC.d.ts +19 -0
- package/dts/VexCRC.js +89 -0
- package/dts/VexCRC.js.map +1 -0
- package/dts/VexConnection.d.ts +45 -0
- package/dts/VexConnection.js +500 -0
- package/dts/VexConnection.js.map +1 -0
- package/dts/VexDevice.d.ts +177 -0
- package/dts/VexDevice.js +944 -0
- package/dts/VexDevice.js.map +1 -0
- package/dts/VexEvent.d.ts +16 -0
- package/dts/VexEvent.js +47 -0
- package/dts/VexEvent.js.map +1 -0
- package/dts/VexFirmwareVersion.d.ts +55 -0
- package/dts/VexFirmwareVersion.js +104 -0
- package/dts/VexFirmwareVersion.js.map +1 -0
- package/dts/VexIniConfig.d.ts +27 -0
- package/dts/VexIniConfig.js +122 -0
- package/dts/VexIniConfig.js.map +1 -0
- package/dts/VexPacket.d.ts +512 -0
- package/dts/VexPacket.js +1036 -0
- package/dts/VexPacket.js.map +1 -0
- package/dts/VexPacketView.d.ts +18 -0
- package/dts/VexPacketView.js +84 -0
- package/dts/VexPacketView.js.map +1 -0
- package/dts/index.d.ts +9 -0
- package/dts/index.js +10 -0
- package/dts/index.js.map +1 -0
- package/index.d.ts +1098 -0
- package/package.json +5 -4
package/dts/VexPacket.js
ADDED
|
@@ -0,0 +1,1036 @@
|
|
|
1
|
+
import { PacketView } from "./VexPacketView";
|
|
2
|
+
import { CrcGenerator } from "./VexCRC";
|
|
3
|
+
import * as AllPackets from "./VexPacket";
|
|
4
|
+
import { AckType, FileInitAction, } from "./Vex";
|
|
5
|
+
import { VexFirmwareVersion } from "./VexFirmwareVersion";
|
|
6
|
+
export class PacketEncoder {
|
|
7
|
+
static getInstance() {
|
|
8
|
+
if (Packet.ENCODER === undefined) {
|
|
9
|
+
Packet.ENCODER = new PacketEncoder();
|
|
10
|
+
}
|
|
11
|
+
return Packet.ENCODER;
|
|
12
|
+
}
|
|
13
|
+
constructor() {
|
|
14
|
+
this.allPacketsTable = {};
|
|
15
|
+
this.vexVersion = 0;
|
|
16
|
+
this.crcgen = new CrcGenerator();
|
|
17
|
+
Object.values(AllPackets).forEach((packet) => {
|
|
18
|
+
if (packet.prototype instanceof HostBoundPacket) {
|
|
19
|
+
this.allPacketsTable[
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
21
|
+
packet.COMMAND_ID + " " + packet.COMMAND_EXTENDED_ID] = packet;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Create the vex CDC header
|
|
27
|
+
* @param buf the bytes to send
|
|
28
|
+
*/
|
|
29
|
+
createHeader(buf) {
|
|
30
|
+
// create a buffer if is is not defined
|
|
31
|
+
if (buf === undefined || buf.byteLength < PacketEncoder.HEADERS_LENGTH) {
|
|
32
|
+
buf = new ArrayBuffer(PacketEncoder.HEADERS_LENGTH);
|
|
33
|
+
}
|
|
34
|
+
const h = new Uint8Array(buf);
|
|
35
|
+
h.set(PacketEncoder.HEADER_TO_DEVICE);
|
|
36
|
+
return h;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Create the vex CDC simple message
|
|
40
|
+
* @param cmd the CDC command byte
|
|
41
|
+
*/
|
|
42
|
+
cdcCommand(cmd) {
|
|
43
|
+
const buf = new ArrayBuffer(PacketEncoder.HEADERS_LENGTH + 1);
|
|
44
|
+
const h = this.createHeader(buf);
|
|
45
|
+
h.set([cmd], PacketEncoder.HEADERS_LENGTH);
|
|
46
|
+
return h;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Create the vex CDC simple message
|
|
50
|
+
* @param cmd the CDC command byte
|
|
51
|
+
* @param data the data to send
|
|
52
|
+
*/
|
|
53
|
+
cdcCommandWithData(cmd, data) {
|
|
54
|
+
const buf = new ArrayBuffer(PacketEncoder.HEADERS_LENGTH + 2 + data.length);
|
|
55
|
+
const h = this.createHeader(buf);
|
|
56
|
+
// add command and length bytes
|
|
57
|
+
h.set([cmd, data.length], PacketEncoder.HEADERS_LENGTH);
|
|
58
|
+
// add the message data
|
|
59
|
+
h.set(data, PacketEncoder.HEADERS_LENGTH + 2);
|
|
60
|
+
return h;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Create the vex CDC extended message
|
|
64
|
+
* @param cmd the CDC command byte
|
|
65
|
+
* @param ext the CDC extended command byte
|
|
66
|
+
* @return a message
|
|
67
|
+
*/
|
|
68
|
+
cdc2Command(cmd, ext) {
|
|
69
|
+
const buf = new ArrayBuffer(PacketEncoder.HEADERS_LENGTH + 5);
|
|
70
|
+
const h = this.createHeader(buf);
|
|
71
|
+
h.set([cmd, ext, 0], PacketEncoder.HEADERS_LENGTH);
|
|
72
|
+
// Add CRC
|
|
73
|
+
const crc = this.crcgen.crc16(h.subarray(0, buf.byteLength - 2), 0) >>> 0;
|
|
74
|
+
h.set([crc >>> 8, crc & 0xff], buf.byteLength - 2);
|
|
75
|
+
return h;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Calculate buffer length for new CDC extended command
|
|
79
|
+
* @param data the CDC extended command payload
|
|
80
|
+
* @returns the required buffer length of the command message
|
|
81
|
+
*/
|
|
82
|
+
cdc2CommandBufferLength(data) {
|
|
83
|
+
// New command use header + 1 byte command
|
|
84
|
+
// + 1 byte function
|
|
85
|
+
// + 1 byte data length
|
|
86
|
+
let length = PacketEncoder.HEADERS_LENGTH + data.length + 3 + 2;
|
|
87
|
+
// If data length is > 127 bytes then an additional data length byte is added
|
|
88
|
+
if (data.length > 127)
|
|
89
|
+
length += 1;
|
|
90
|
+
return length;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Create the vex CDC extended message with some data
|
|
94
|
+
* @param cmd the CDC command byte
|
|
95
|
+
* @param ext the CDC extended command byte
|
|
96
|
+
* @param data the CDC extended command payload
|
|
97
|
+
* @return a message
|
|
98
|
+
*/
|
|
99
|
+
cdc2CommandWithData(cmd, ext, data) {
|
|
100
|
+
const buf = new ArrayBuffer(this.cdc2CommandBufferLength(data));
|
|
101
|
+
const h = this.createHeader(buf);
|
|
102
|
+
// add command and length bytes
|
|
103
|
+
if (data.length < 128) {
|
|
104
|
+
h.set([cmd, ext, data.length], PacketEncoder.HEADERS_LENGTH);
|
|
105
|
+
// add the message data
|
|
106
|
+
h.set(data, PacketEncoder.HEADERS_LENGTH + 3);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
const lengthMsb = ((data.length >>> 8) | 0x80) >>> 0;
|
|
110
|
+
const lengthLsb = (data.length & 0xff) >>> 0;
|
|
111
|
+
h.set([cmd, ext, lengthMsb, lengthLsb], PacketEncoder.HEADERS_LENGTH);
|
|
112
|
+
// add the message data
|
|
113
|
+
h.set(data, PacketEncoder.HEADERS_LENGTH + 4);
|
|
114
|
+
}
|
|
115
|
+
// Add CRC (little endian)
|
|
116
|
+
const crc = this.crcgen.crc16(h.subarray(0, buf.byteLength - 2), 0);
|
|
117
|
+
h.set([crc >>> 8, crc & 0xff], buf.byteLength - 2);
|
|
118
|
+
return h;
|
|
119
|
+
}
|
|
120
|
+
validateHeader(data) {
|
|
121
|
+
return !(data[0] !== PacketEncoder.HEADER_TO_HOST[0] ||
|
|
122
|
+
data[1] !== PacketEncoder.HEADER_TO_HOST[1]);
|
|
123
|
+
}
|
|
124
|
+
validateMessageCdc(data) {
|
|
125
|
+
const message = data.subarray(0, data.byteLength - 2);
|
|
126
|
+
const lastTwoBytes = (data[data.byteLength - 2] << 8) + data[data.byteLength - 1];
|
|
127
|
+
return this.crcgen.crc16(message, 0) === lastTwoBytes;
|
|
128
|
+
}
|
|
129
|
+
getPayloadSize(data) {
|
|
130
|
+
let t = 0;
|
|
131
|
+
let a = data[3];
|
|
132
|
+
if ((128 & a) !== 0) {
|
|
133
|
+
t = 127 & a;
|
|
134
|
+
a = data[4];
|
|
135
|
+
}
|
|
136
|
+
return (t << 8) + a;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
PacketEncoder.HEADERS_LENGTH = 4;
|
|
140
|
+
PacketEncoder.HEADER_TO_DEVICE = [201, 54, 184, 71];
|
|
141
|
+
PacketEncoder.HEADER_TO_HOST = [170, 85];
|
|
142
|
+
PacketEncoder.J2000_EPOCH = 946684800;
|
|
143
|
+
export class Packet {
|
|
144
|
+
constructor(rawData) {
|
|
145
|
+
this.data =
|
|
146
|
+
rawData instanceof ArrayBuffer ? new Uint8Array(rawData) : rawData;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
export class DeviceBoundPacket extends Packet {
|
|
150
|
+
constructor(payload) {
|
|
151
|
+
super(new Uint8Array());
|
|
152
|
+
// eslint-disable-next-line no-proto, @typescript-eslint/no-explicit-any
|
|
153
|
+
const me = this.__proto__.constructor;
|
|
154
|
+
if (me.COMMAND_EXTENDED_ID === undefined) {
|
|
155
|
+
if (payload === undefined) {
|
|
156
|
+
this.data = Packet.ENCODER.cdcCommand(me.COMMAND_ID);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
this.data = Packet.ENCODER.cdcCommandWithData(me.COMMAND_ID, payload);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
if (payload === undefined) {
|
|
164
|
+
this.data = Packet.ENCODER.cdc2Command(me.COMMAND_ID, me.COMMAND_EXTENDED_ID);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
this.data = Packet.ENCODER.cdc2CommandWithData(me.COMMAND_ID, me.COMMAND_EXTENDED_ID, payload);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
export class Query1H2DPacket extends DeviceBoundPacket {
|
|
173
|
+
constructor() {
|
|
174
|
+
super(undefined);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
Query1H2DPacket.COMMAND_ID = 33;
|
|
178
|
+
Query1H2DPacket.COMMAND_EXTENDED_ID = undefined;
|
|
179
|
+
export class SystemVersionH2DPacket extends DeviceBoundPacket {
|
|
180
|
+
constructor() {
|
|
181
|
+
super(undefined);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
SystemVersionH2DPacket.COMMAND_ID = 164;
|
|
185
|
+
SystemVersionH2DPacket.COMMAND_EXTENDED_ID = undefined;
|
|
186
|
+
export class UpdateMatchModeH2DPacket extends DeviceBoundPacket {
|
|
187
|
+
constructor(mode, matchClock) {
|
|
188
|
+
let bit1;
|
|
189
|
+
switch (mode) {
|
|
190
|
+
case "autonomous":
|
|
191
|
+
bit1 = 10;
|
|
192
|
+
break;
|
|
193
|
+
case "driver":
|
|
194
|
+
bit1 = 8;
|
|
195
|
+
break;
|
|
196
|
+
case "disabled":
|
|
197
|
+
bit1 = 11;
|
|
198
|
+
}
|
|
199
|
+
const payload = new Uint8Array(5);
|
|
200
|
+
const view = new DataView(payload.buffer);
|
|
201
|
+
payload[0] = (15 & bit1) >>> 0;
|
|
202
|
+
view.setUint32(1, matchClock, true);
|
|
203
|
+
super(payload);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
UpdateMatchModeH2DPacket.COMMAND_ID = 88;
|
|
207
|
+
UpdateMatchModeH2DPacket.COMMAND_EXTENDED_ID = 193;
|
|
208
|
+
export class GetMatchStatusH2DPacket extends DeviceBoundPacket {
|
|
209
|
+
constructor() {
|
|
210
|
+
super(undefined);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
GetMatchStatusH2DPacket.COMMAND_ID = 88;
|
|
214
|
+
GetMatchStatusH2DPacket.COMMAND_EXTENDED_ID = 194;
|
|
215
|
+
export class GetRadioModeH2DPacket extends DeviceBoundPacket {
|
|
216
|
+
constructor(mode) {
|
|
217
|
+
const payload = new Uint8Array(1);
|
|
218
|
+
payload[0] = mode;
|
|
219
|
+
super(payload);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
GetRadioModeH2DPacket.COMMAND_ID = 88;
|
|
223
|
+
GetRadioModeH2DPacket.COMMAND_EXTENDED_ID = 65;
|
|
224
|
+
export class FileControlH2DPacket extends DeviceBoundPacket {
|
|
225
|
+
constructor(a, b) {
|
|
226
|
+
const payload = new Uint8Array(2);
|
|
227
|
+
payload.set([a, b], 0);
|
|
228
|
+
super(payload);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
FileControlH2DPacket.COMMAND_ID = 86;
|
|
232
|
+
FileControlH2DPacket.COMMAND_EXTENDED_ID = 16;
|
|
233
|
+
export class InitFileTransferH2DPacket extends DeviceBoundPacket {
|
|
234
|
+
constructor(operation, target, vendor, options, binary, addr, name, type, version = new VexFirmwareVersion(1, 0, 0, 0)) {
|
|
235
|
+
const payload = new Uint8Array(52);
|
|
236
|
+
const view = new DataView(payload.buffer);
|
|
237
|
+
view.setUint8(0, operation);
|
|
238
|
+
view.setUint8(1, target);
|
|
239
|
+
view.setUint8(2, vendor);
|
|
240
|
+
view.setUint8(3, options);
|
|
241
|
+
view.setUint32(4, binary.length, true);
|
|
242
|
+
view.setUint32(8, addr, true);
|
|
243
|
+
view.setUint32(12, operation === FileInitAction.WRITE
|
|
244
|
+
? Packet.ENCODER.crcgen.crc32(binary, 0)
|
|
245
|
+
: 0, true);
|
|
246
|
+
const re = /(?:\.([^.]+))?$/;
|
|
247
|
+
const reResult = re.exec(name);
|
|
248
|
+
let ext = reResult != null ? reResult[1] : undefined;
|
|
249
|
+
ext !== null && ext !== void 0 ? ext : (ext = "");
|
|
250
|
+
// files with gz extension are also type bin
|
|
251
|
+
ext = ext === "gz" ? "bin" : ext;
|
|
252
|
+
payload.set(new TextEncoder().encode(type !== null && type !== void 0 ? type : ext), 16);
|
|
253
|
+
const timestamp = ((Date.now() / 1000) >>> 0) - PacketEncoder.J2000_EPOCH;
|
|
254
|
+
view.setUint32(20, timestamp, true);
|
|
255
|
+
payload.set(version.toUint8Array(), 24);
|
|
256
|
+
// filename
|
|
257
|
+
const nameEncoded = new TextEncoder().encode(name);
|
|
258
|
+
let offset = nameEncoded.length - 23;
|
|
259
|
+
if (offset < 0)
|
|
260
|
+
offset = 0;
|
|
261
|
+
payload.set(nameEncoded.subarray(offset, offset + 23), 28);
|
|
262
|
+
view.setUint8(51, 0);
|
|
263
|
+
super(payload);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
InitFileTransferH2DPacket.COMMAND_ID = 86;
|
|
267
|
+
InitFileTransferH2DPacket.COMMAND_EXTENDED_ID = 17;
|
|
268
|
+
export class ExitFileTransferH2DPacket extends DeviceBoundPacket {
|
|
269
|
+
constructor(action) {
|
|
270
|
+
const payload = new Uint8Array(1);
|
|
271
|
+
payload[0] = action;
|
|
272
|
+
super(payload);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
ExitFileTransferH2DPacket.COMMAND_ID = 86;
|
|
276
|
+
ExitFileTransferH2DPacket.COMMAND_EXTENDED_ID = 18;
|
|
277
|
+
export class WriteFileH2DPacket extends DeviceBoundPacket {
|
|
278
|
+
constructor(addr, buf) {
|
|
279
|
+
const payload = new Uint8Array(4 + buf.length);
|
|
280
|
+
const view = new DataView(payload.buffer);
|
|
281
|
+
view.setUint32(0, addr, true);
|
|
282
|
+
payload.set(buf, 4);
|
|
283
|
+
super(payload);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
WriteFileH2DPacket.COMMAND_ID = 86;
|
|
287
|
+
WriteFileH2DPacket.COMMAND_EXTENDED_ID = 19;
|
|
288
|
+
export class ReadFileH2DPacket extends DeviceBoundPacket {
|
|
289
|
+
constructor(addr, size) {
|
|
290
|
+
const payload = new Uint8Array(6);
|
|
291
|
+
const view = new DataView(payload.buffer);
|
|
292
|
+
view.setUint32(0, addr, true);
|
|
293
|
+
view.setUint16(4, size, true);
|
|
294
|
+
super(payload);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
ReadFileH2DPacket.COMMAND_ID = 86;
|
|
298
|
+
ReadFileH2DPacket.COMMAND_EXTENDED_ID = 20;
|
|
299
|
+
export class LinkFileH2DPacket extends DeviceBoundPacket {
|
|
300
|
+
constructor(vendor, fileName, options) {
|
|
301
|
+
const str = new TextEncoder().encode(fileName);
|
|
302
|
+
const payload = new Uint8Array(26);
|
|
303
|
+
payload.set([vendor, options], 0);
|
|
304
|
+
payload.set(str.subarray(0, 23), 2);
|
|
305
|
+
super(payload);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
LinkFileH2DPacket.COMMAND_ID = 86;
|
|
309
|
+
LinkFileH2DPacket.COMMAND_EXTENDED_ID = 21;
|
|
310
|
+
export class GetDirectoryFileCountH2DPacket extends DeviceBoundPacket {
|
|
311
|
+
constructor(vendor) {
|
|
312
|
+
const payload = new Uint8Array(2);
|
|
313
|
+
payload.set([vendor, 0], 0);
|
|
314
|
+
super(payload);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
GetDirectoryFileCountH2DPacket.COMMAND_ID = 86;
|
|
318
|
+
GetDirectoryFileCountH2DPacket.COMMAND_EXTENDED_ID = 22;
|
|
319
|
+
export class GetDirectoryEntryH2DPacket extends DeviceBoundPacket {
|
|
320
|
+
constructor(index) {
|
|
321
|
+
const payload = new Uint8Array(2);
|
|
322
|
+
payload.set([index, 0], 0);
|
|
323
|
+
super(payload);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
GetDirectoryEntryH2DPacket.COMMAND_ID = 86;
|
|
327
|
+
GetDirectoryEntryH2DPacket.COMMAND_EXTENDED_ID = 23;
|
|
328
|
+
export class LoadFileActionH2DPacket extends DeviceBoundPacket {
|
|
329
|
+
constructor(vendor, actionId, fileNameOrSlotNumber) {
|
|
330
|
+
let fileName;
|
|
331
|
+
if (typeof fileNameOrSlotNumber === "string") {
|
|
332
|
+
fileName = fileNameOrSlotNumber;
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
fileName = "___s_" + (fileNameOrSlotNumber - 1) + ".bin";
|
|
336
|
+
}
|
|
337
|
+
const encodedName = new TextEncoder().encode(fileName);
|
|
338
|
+
const payload = new Uint8Array(26);
|
|
339
|
+
payload.set([vendor, actionId], 0);
|
|
340
|
+
payload.set(encodedName.subarray(0, 23), 2);
|
|
341
|
+
super(payload);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
LoadFileActionH2DPacket.COMMAND_ID = 86;
|
|
345
|
+
LoadFileActionH2DPacket.COMMAND_EXTENDED_ID = 24;
|
|
346
|
+
export class GetFileMetadataH2DPacket extends DeviceBoundPacket {
|
|
347
|
+
constructor(vendor, fileName, options) {
|
|
348
|
+
const encodedName = new TextEncoder().encode(fileName);
|
|
349
|
+
const payload = new Uint8Array(26);
|
|
350
|
+
payload.set([vendor, options], 0);
|
|
351
|
+
payload.set(encodedName.subarray(0, 23), 2);
|
|
352
|
+
super(payload);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
GetFileMetadataH2DPacket.COMMAND_ID = 86;
|
|
356
|
+
GetFileMetadataH2DPacket.COMMAND_EXTENDED_ID = 25;
|
|
357
|
+
export class SetFileMetadataH2DPacket extends DeviceBoundPacket {
|
|
358
|
+
constructor(vendor, fileName, fileInfo, options) {
|
|
359
|
+
const encodedName = new TextEncoder().encode(fileName);
|
|
360
|
+
const encodedType = new TextEncoder().encode(fileInfo.type);
|
|
361
|
+
const payload = new Uint8Array(42);
|
|
362
|
+
const view = new DataView(payload.buffer);
|
|
363
|
+
view.setUint8(0, vendor);
|
|
364
|
+
view.setUint8(1, options);
|
|
365
|
+
view.setUint32(2, fileInfo.loadAddress, true);
|
|
366
|
+
payload.set(encodedType.subarray(0, 4), 6);
|
|
367
|
+
const timestamp = fileInfo.timestamp - PacketEncoder.J2000_EPOCH + 100; // XXX: + 100 TEST ONLY
|
|
368
|
+
view.setUint32(10, timestamp, true);
|
|
369
|
+
payload.set(fileInfo.version.toUint8Array(), 14);
|
|
370
|
+
payload.set(encodedName.subarray(0, 23), 18);
|
|
371
|
+
super(payload);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
// DOES NOT WORK
|
|
375
|
+
SetFileMetadataH2DPacket.COMMAND_ID = 86;
|
|
376
|
+
SetFileMetadataH2DPacket.COMMAND_EXTENDED_ID = 26;
|
|
377
|
+
export class EraseFileH2DPacket extends DeviceBoundPacket {
|
|
378
|
+
constructor(vendor, fileName) {
|
|
379
|
+
const encodedName = new TextEncoder().encode(fileName);
|
|
380
|
+
const payload = new Uint8Array(26);
|
|
381
|
+
payload.set([vendor, 128], 0);
|
|
382
|
+
payload.set(encodedName.subarray(0, 23), 2);
|
|
383
|
+
super(payload);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
EraseFileH2DPacket.COMMAND_ID = 86;
|
|
387
|
+
EraseFileH2DPacket.COMMAND_EXTENDED_ID = 27;
|
|
388
|
+
export class GetProgramSlotInfoH2DPacket extends DeviceBoundPacket {
|
|
389
|
+
constructor(vendor, fileName) {
|
|
390
|
+
const encodedName = new TextEncoder().encode(fileName);
|
|
391
|
+
const payload = new Uint8Array(26);
|
|
392
|
+
payload.set([vendor, 0], 0);
|
|
393
|
+
payload.set(encodedName.subarray(0, 23), 2);
|
|
394
|
+
super(payload);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
GetProgramSlotInfoH2DPacket.COMMAND_ID = 86;
|
|
398
|
+
GetProgramSlotInfoH2DPacket.COMMAND_EXTENDED_ID = 28;
|
|
399
|
+
export class FileClearUpH2DPacket extends DeviceBoundPacket {
|
|
400
|
+
constructor(vendor) {
|
|
401
|
+
const payload = new Uint8Array(2);
|
|
402
|
+
payload.set([vendor, 0], 0);
|
|
403
|
+
super(payload);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
FileClearUpH2DPacket.COMMAND_ID = 86;
|
|
407
|
+
FileClearUpH2DPacket.COMMAND_EXTENDED_ID = 30;
|
|
408
|
+
export class FileFormatH2DPacket extends DeviceBoundPacket {
|
|
409
|
+
constructor() {
|
|
410
|
+
const payload = new Uint8Array(4);
|
|
411
|
+
payload.set([68, 67, 66, 65], 0);
|
|
412
|
+
super(payload);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
FileFormatH2DPacket.COMMAND_ID = 86;
|
|
416
|
+
FileFormatH2DPacket.COMMAND_EXTENDED_ID = 31;
|
|
417
|
+
export class GetSystemFlagsH2DPacket extends DeviceBoundPacket {
|
|
418
|
+
}
|
|
419
|
+
GetSystemFlagsH2DPacket.COMMAND_ID = 86;
|
|
420
|
+
GetSystemFlagsH2DPacket.COMMAND_EXTENDED_ID = 32;
|
|
421
|
+
export class GetDeviceStatusH2DPacket extends DeviceBoundPacket {
|
|
422
|
+
constructor() {
|
|
423
|
+
super(undefined);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
GetDeviceStatusH2DPacket.COMMAND_ID = 86;
|
|
427
|
+
GetDeviceStatusH2DPacket.COMMAND_EXTENDED_ID = 33;
|
|
428
|
+
export class GetSystemStatusH2DPacket extends DeviceBoundPacket {
|
|
429
|
+
constructor() {
|
|
430
|
+
super(undefined);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
GetSystemStatusH2DPacket.COMMAND_ID = 86;
|
|
434
|
+
GetSystemStatusH2DPacket.COMMAND_EXTENDED_ID = 34;
|
|
435
|
+
export class GetFdtStatusH2DPacket extends DeviceBoundPacket {
|
|
436
|
+
constructor() {
|
|
437
|
+
super(undefined);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
GetFdtStatusH2DPacket.COMMAND_ID = 86;
|
|
441
|
+
GetFdtStatusH2DPacket.COMMAND_EXTENDED_ID = 35;
|
|
442
|
+
export class GetLogCountH2DPacket extends DeviceBoundPacket {
|
|
443
|
+
constructor() {
|
|
444
|
+
super(undefined);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
GetLogCountH2DPacket.COMMAND_ID = 86;
|
|
448
|
+
GetLogCountH2DPacket.COMMAND_EXTENDED_ID = 36;
|
|
449
|
+
export class ReadLogPageH2DPacket extends DeviceBoundPacket {
|
|
450
|
+
constructor(offset, count) {
|
|
451
|
+
const payload = new Uint8Array(8);
|
|
452
|
+
const view = new DataView(payload.buffer);
|
|
453
|
+
view.setUint32(0, offset, true);
|
|
454
|
+
view.setUint32(4, count, true);
|
|
455
|
+
super(payload);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
ReadLogPageH2DPacket.COMMAND_ID = 86;
|
|
459
|
+
ReadLogPageH2DPacket.COMMAND_EXTENDED_ID = 37;
|
|
460
|
+
export class GetRadioStatusH2DPacket extends DeviceBoundPacket {
|
|
461
|
+
constructor() {
|
|
462
|
+
super(undefined);
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
GetRadioStatusH2DPacket.COMMAND_ID = 86;
|
|
466
|
+
GetRadioStatusH2DPacket.COMMAND_EXTENDED_ID = 38;
|
|
467
|
+
export class GetUserDataH2DPacket extends DeviceBoundPacket {
|
|
468
|
+
constructor(e) {
|
|
469
|
+
var _a;
|
|
470
|
+
const input = (_a = e === null || e === void 0 ? void 0 : e.slice(0, 224)) !== null && _a !== void 0 ? _a : new Uint8Array(0);
|
|
471
|
+
const payload = new Uint8Array(2 + input.length);
|
|
472
|
+
payload[0] = 1; // stdio channel
|
|
473
|
+
payload[1] = input.length;
|
|
474
|
+
payload.set(input, 2);
|
|
475
|
+
super(payload);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
// UNCONFIRMED
|
|
479
|
+
GetUserDataH2DPacket.COMMAND_ID = 86;
|
|
480
|
+
GetUserDataH2DPacket.COMMAND_EXTENDED_ID = 39;
|
|
481
|
+
export class ScreenCaptureH2DPacket extends DeviceBoundPacket {
|
|
482
|
+
constructor(e) {
|
|
483
|
+
const payload = new Uint8Array(1);
|
|
484
|
+
payload[0] = e;
|
|
485
|
+
super(payload);
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
ScreenCaptureH2DPacket.COMMAND_ID = 86;
|
|
489
|
+
ScreenCaptureH2DPacket.COMMAND_EXTENDED_ID = 40;
|
|
490
|
+
export class SendDashTouchH2DPacket extends DeviceBoundPacket {
|
|
491
|
+
constructor(x, y, press) {
|
|
492
|
+
const payload = new Uint8Array(6);
|
|
493
|
+
const view = new DataView(payload.buffer);
|
|
494
|
+
view.setUint16(0, x, true);
|
|
495
|
+
view.setUint16(2, y, true);
|
|
496
|
+
view.setUint16(4, press ? 1 : 0, true);
|
|
497
|
+
super(payload);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
SendDashTouchH2DPacket.COMMAND_ID = 86;
|
|
501
|
+
SendDashTouchH2DPacket.COMMAND_EXTENDED_ID = 42;
|
|
502
|
+
export class SelectDashH2DPacket extends DeviceBoundPacket {
|
|
503
|
+
/** @param port untested */
|
|
504
|
+
constructor(screen, port) {
|
|
505
|
+
const payload = new Uint8Array(2);
|
|
506
|
+
payload[0] = screen;
|
|
507
|
+
payload[1] = port;
|
|
508
|
+
super(payload);
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
// UNSURE
|
|
512
|
+
SelectDashH2DPacket.COMMAND_ID = 86;
|
|
513
|
+
SelectDashH2DPacket.COMMAND_EXTENDED_ID = 43;
|
|
514
|
+
export class EnableDashH2DPacket extends DeviceBoundPacket {
|
|
515
|
+
constructor(unknown1) {
|
|
516
|
+
if (unknown1 === undefined) {
|
|
517
|
+
super(undefined);
|
|
518
|
+
}
|
|
519
|
+
else {
|
|
520
|
+
const payload = new Uint8Array(1);
|
|
521
|
+
payload[0] = unknown1;
|
|
522
|
+
super(payload);
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
// UNSURE
|
|
527
|
+
EnableDashH2DPacket.COMMAND_ID = 86;
|
|
528
|
+
EnableDashH2DPacket.COMMAND_EXTENDED_ID = 44;
|
|
529
|
+
export class DisableDashH2DPacket extends DeviceBoundPacket {
|
|
530
|
+
constructor() {
|
|
531
|
+
super(undefined);
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
// UNSURE
|
|
535
|
+
DisableDashH2DPacket.COMMAND_ID = 86;
|
|
536
|
+
DisableDashH2DPacket.COMMAND_EXTENDED_ID = 45;
|
|
537
|
+
export class ReadKeyValueH2DPacket extends DeviceBoundPacket {
|
|
538
|
+
constructor(key) {
|
|
539
|
+
const payload = new Uint8Array(32);
|
|
540
|
+
payload.set(new TextEncoder().encode(key), 0);
|
|
541
|
+
super(payload);
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
// UNSURE
|
|
545
|
+
ReadKeyValueH2DPacket.COMMAND_ID = 86;
|
|
546
|
+
ReadKeyValueH2DPacket.COMMAND_EXTENDED_ID = 46;
|
|
547
|
+
export class WriteKeyValueH2DPacket extends DeviceBoundPacket {
|
|
548
|
+
constructor(key, value) {
|
|
549
|
+
let strk = new TextEncoder().encode(key);
|
|
550
|
+
const strv = new TextEncoder().encode(value);
|
|
551
|
+
if (strk.byteLength > 31)
|
|
552
|
+
strk = strk.subarray(0, 31);
|
|
553
|
+
const payload = new Uint8Array(strk.length + strv.length + 20);
|
|
554
|
+
payload.set(strk, 0);
|
|
555
|
+
payload.set(strv, strk.length + 1);
|
|
556
|
+
super(payload);
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
// UNSURE
|
|
560
|
+
WriteKeyValueH2DPacket.COMMAND_ID = 86;
|
|
561
|
+
WriteKeyValueH2DPacket.COMMAND_EXTENDED_ID = 47;
|
|
562
|
+
export class GetSlot1to4InfoH2DPacket extends DeviceBoundPacket {
|
|
563
|
+
constructor() {
|
|
564
|
+
super(undefined);
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
GetSlot1to4InfoH2DPacket.COMMAND_ID = 86;
|
|
568
|
+
GetSlot1to4InfoH2DPacket.COMMAND_EXTENDED_ID = 49;
|
|
569
|
+
export class GetSlot5to8InfoH2DPacket extends DeviceBoundPacket {
|
|
570
|
+
constructor() {
|
|
571
|
+
super(undefined);
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
GetSlot5to8InfoH2DPacket.COMMAND_ID = 86;
|
|
575
|
+
GetSlot5to8InfoH2DPacket.COMMAND_EXTENDED_ID = 50;
|
|
576
|
+
export class FactoryStatusH2DPacket extends DeviceBoundPacket {
|
|
577
|
+
}
|
|
578
|
+
FactoryStatusH2DPacket.COMMAND_ID = 86;
|
|
579
|
+
FactoryStatusH2DPacket.COMMAND_EXTENDED_ID = 241;
|
|
580
|
+
export class FactoryEnableH2DPacket extends DeviceBoundPacket {
|
|
581
|
+
constructor() {
|
|
582
|
+
const payload = new Uint8Array(4);
|
|
583
|
+
payload.set([77, 76, 75, 74], 0);
|
|
584
|
+
super(payload);
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
FactoryEnableH2DPacket.COMMAND_ID = 86;
|
|
588
|
+
FactoryEnableH2DPacket.COMMAND_EXTENDED_ID = 255;
|
|
589
|
+
export class HostBoundPacket extends Packet {
|
|
590
|
+
constructor(data) {
|
|
591
|
+
super(data);
|
|
592
|
+
this.ack = AckType.CDC2_NACK;
|
|
593
|
+
this.payloadSize = Packet.ENCODER.getPayloadSize(this.data);
|
|
594
|
+
const n = this.payloadSize > 128 ? 5 : 4;
|
|
595
|
+
// skip command id check
|
|
596
|
+
this.ack = this.data[(this.ackIndex = n + 1)];
|
|
597
|
+
}
|
|
598
|
+
static isValidPacket(data, n) {
|
|
599
|
+
const ack = data[n + 1];
|
|
600
|
+
return ack === AckType.CDC2_ACK || ack === 167; // XXX: got 167 from MatchStatusReplyD2HPacket
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
export class Query1ReplyD2HPacket extends HostBoundPacket {
|
|
604
|
+
constructor(data) {
|
|
605
|
+
super(data);
|
|
606
|
+
this.joystickFlag1 = this.data[4];
|
|
607
|
+
this.joystickFlag2 = this.data[5];
|
|
608
|
+
this.brainFlag1 = this.data[6]; // a.k.a vex version
|
|
609
|
+
this.brainFlag2 = this.data[7];
|
|
610
|
+
this.bootloadFlag1 = this.data[10];
|
|
611
|
+
this.bootloadFlag2 = this.data[11];
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
Query1ReplyD2HPacket.COMMAND_ID = 33;
|
|
615
|
+
Query1ReplyD2HPacket.COMMAND_EXTENDED_ID = undefined;
|
|
616
|
+
export class SystemVersionReplyD2HPacket extends HostBoundPacket {
|
|
617
|
+
constructor(data) {
|
|
618
|
+
super(data);
|
|
619
|
+
this.version = new VexFirmwareVersion(this.data[4], this.data[5], this.data[6], this.data[8]);
|
|
620
|
+
this.hardware = this.data[7];
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
SystemVersionReplyD2HPacket.COMMAND_ID = 164;
|
|
624
|
+
SystemVersionReplyD2HPacket.COMMAND_EXTENDED_ID = undefined;
|
|
625
|
+
export class MatchModeReplyD2HPacket extends HostBoundPacket {
|
|
626
|
+
constructor(data) {
|
|
627
|
+
super(data);
|
|
628
|
+
const dataView = PacketView.fromPacket(this);
|
|
629
|
+
this.modebit = dataView.nextUint8();
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
MatchModeReplyD2HPacket.COMMAND_ID = 88;
|
|
633
|
+
MatchModeReplyD2HPacket.COMMAND_EXTENDED_ID = 193;
|
|
634
|
+
export class MatchStatusReplyD2HPacket extends HostBoundPacket {
|
|
635
|
+
constructor(data) {
|
|
636
|
+
super(data);
|
|
637
|
+
const dataView = PacketView.fromPacket(this);
|
|
638
|
+
const n = this.ackIndex;
|
|
639
|
+
this.rssi = dataView.nextInt8();
|
|
640
|
+
this.systemStatusBits = dataView.nextUint16();
|
|
641
|
+
this.radioStatusBits = dataView.nextUint16();
|
|
642
|
+
this.fieldStatusBits = dataView.nextUint8();
|
|
643
|
+
this.matchClock = dataView.nextUint8();
|
|
644
|
+
this.brainBatteryPercent = dataView.nextUint8();
|
|
645
|
+
this.controllerBatteryPercent = dataView.nextUint8();
|
|
646
|
+
this.partnerControllerBatteryPercent = dataView.nextUint8();
|
|
647
|
+
this.pad = dataView.nextUint8();
|
|
648
|
+
this.buttons = dataView.nextUint16();
|
|
649
|
+
this.activeProgram = dataView.nextUint8();
|
|
650
|
+
this.radioType = dataView.nextUint8();
|
|
651
|
+
this.radioChannel = dataView.nextUint8();
|
|
652
|
+
this.radioSlot = dataView.nextUint8();
|
|
653
|
+
this.robotName = dataView.nextNTBS(10);
|
|
654
|
+
this.controllerFlags = dataView.getUint8(n + 28);
|
|
655
|
+
this.rxSignalQuality = dataView.getUint8(n + 29);
|
|
656
|
+
let rawStr = new TextDecoder("UTF-8").decode(data.slice(n + 18, n + this.payloadSize + 28));
|
|
657
|
+
const endIdx = rawStr.indexOf("\0");
|
|
658
|
+
if (endIdx > -1) {
|
|
659
|
+
rawStr = rawStr.substr(0, endIdx);
|
|
660
|
+
}
|
|
661
|
+
this.robotName = rawStr;
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
MatchStatusReplyD2HPacket.COMMAND_ID = 88;
|
|
665
|
+
MatchStatusReplyD2HPacket.COMMAND_EXTENDED_ID = 194;
|
|
666
|
+
export class FileControlReplyD2HPacket extends HostBoundPacket {
|
|
667
|
+
}
|
|
668
|
+
FileControlReplyD2HPacket.COMMAND_ID = 86;
|
|
669
|
+
FileControlReplyD2HPacket.COMMAND_EXTENDED_ID = 16;
|
|
670
|
+
export class InitFileTransferReplyD2HPacket extends HostBoundPacket {
|
|
671
|
+
constructor(data) {
|
|
672
|
+
super(data);
|
|
673
|
+
const dataView = PacketView.fromPacket(this);
|
|
674
|
+
this.windowSize = dataView.nextUint16();
|
|
675
|
+
this.fileSize = dataView.nextUint32();
|
|
676
|
+
this.crc32 = dataView.nextUint32();
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
InitFileTransferReplyD2HPacket.COMMAND_ID = 86;
|
|
680
|
+
InitFileTransferReplyD2HPacket.COMMAND_EXTENDED_ID = 17;
|
|
681
|
+
export class ExitFileTransferReplyD2HPacket extends HostBoundPacket {
|
|
682
|
+
}
|
|
683
|
+
ExitFileTransferReplyD2HPacket.COMMAND_ID = 86;
|
|
684
|
+
ExitFileTransferReplyD2HPacket.COMMAND_EXTENDED_ID = 18;
|
|
685
|
+
export class WriteFileReplyD2HPacket extends HostBoundPacket {
|
|
686
|
+
}
|
|
687
|
+
WriteFileReplyD2HPacket.COMMAND_ID = 86;
|
|
688
|
+
WriteFileReplyD2HPacket.COMMAND_EXTENDED_ID = 19;
|
|
689
|
+
export class ReadFileReplyD2HPacket extends HostBoundPacket {
|
|
690
|
+
constructor(data) {
|
|
691
|
+
super(data);
|
|
692
|
+
const dataView = PacketView.fromPacket(this);
|
|
693
|
+
const n = this.ackIndex;
|
|
694
|
+
this.addr = dataView.getUint32(n, true);
|
|
695
|
+
this.length = this.payloadSize - 7;
|
|
696
|
+
this.buf = data.slice(n + 4, n + 4 + this.length);
|
|
697
|
+
}
|
|
698
|
+
static isValidPacket(data, n) {
|
|
699
|
+
return data[4] === 4 ? data[n + 1] === AckType.CDC2_ACK : true;
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
ReadFileReplyD2HPacket.COMMAND_ID = 86;
|
|
703
|
+
ReadFileReplyD2HPacket.COMMAND_EXTENDED_ID = 20;
|
|
704
|
+
export class LinkFileReplyD2HPacket extends HostBoundPacket {
|
|
705
|
+
}
|
|
706
|
+
LinkFileReplyD2HPacket.COMMAND_ID = 86;
|
|
707
|
+
LinkFileReplyD2HPacket.COMMAND_EXTENDED_ID = 21;
|
|
708
|
+
export class GetDirectoryFileCountReplyD2HPacket extends HostBoundPacket {
|
|
709
|
+
constructor(data) {
|
|
710
|
+
super(data);
|
|
711
|
+
const dataView = PacketView.fromPacket(this);
|
|
712
|
+
this.count = dataView.nextUint16();
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
GetDirectoryFileCountReplyD2HPacket.COMMAND_ID = 86;
|
|
716
|
+
GetDirectoryFileCountReplyD2HPacket.COMMAND_EXTENDED_ID = 22;
|
|
717
|
+
export class GetDirectoryEntryReplyD2HPacket extends HostBoundPacket {
|
|
718
|
+
constructor(data) {
|
|
719
|
+
super(data);
|
|
720
|
+
const dataView = PacketView.fromPacket(this);
|
|
721
|
+
if (this.payloadSize > 4) {
|
|
722
|
+
this.file = {
|
|
723
|
+
index: dataView.nextUint8(),
|
|
724
|
+
size: dataView.nextUint32(),
|
|
725
|
+
loadAddress: dataView.nextUint32(),
|
|
726
|
+
crc32: dataView.nextUint32(),
|
|
727
|
+
type: dataView.nextString(4),
|
|
728
|
+
timestamp: dataView.nextUint32() + PacketEncoder.J2000_EPOCH,
|
|
729
|
+
version: dataView.nextVersion(),
|
|
730
|
+
filename: dataView.nextNTBS(32),
|
|
731
|
+
};
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
GetDirectoryEntryReplyD2HPacket.COMMAND_ID = 86;
|
|
736
|
+
GetDirectoryEntryReplyD2HPacket.COMMAND_EXTENDED_ID = 23;
|
|
737
|
+
export class LoadFileActionReplyD2HPacket extends HostBoundPacket {
|
|
738
|
+
}
|
|
739
|
+
LoadFileActionReplyD2HPacket.COMMAND_ID = 86;
|
|
740
|
+
LoadFileActionReplyD2HPacket.COMMAND_EXTENDED_ID = 24;
|
|
741
|
+
export class GetFileMetadataReplyD2HPacket extends HostBoundPacket {
|
|
742
|
+
constructor(data) {
|
|
743
|
+
super(data);
|
|
744
|
+
const dataView = PacketView.fromPacket(this);
|
|
745
|
+
dataView.nextUint8();
|
|
746
|
+
if (this.payloadSize > 4) {
|
|
747
|
+
this.file = {
|
|
748
|
+
size: dataView.nextUint32(),
|
|
749
|
+
loadAddress: dataView.nextUint32(),
|
|
750
|
+
crc32: dataView.nextUint32(),
|
|
751
|
+
type: dataView.nextString(4),
|
|
752
|
+
timestamp: dataView.nextUint32() + PacketEncoder.J2000_EPOCH,
|
|
753
|
+
version: dataView.nextVersion(),
|
|
754
|
+
};
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
GetFileMetadataReplyD2HPacket.COMMAND_ID = 86;
|
|
759
|
+
GetFileMetadataReplyD2HPacket.COMMAND_EXTENDED_ID = 25;
|
|
760
|
+
export class SetFileMetadataReplyD2HPacket extends HostBoundPacket {
|
|
761
|
+
}
|
|
762
|
+
SetFileMetadataReplyD2HPacket.COMMAND_ID = 86;
|
|
763
|
+
SetFileMetadataReplyD2HPacket.COMMAND_EXTENDED_ID = 26;
|
|
764
|
+
export class EraseFileReplyD2HPacket extends HostBoundPacket {
|
|
765
|
+
}
|
|
766
|
+
EraseFileReplyD2HPacket.COMMAND_ID = 86;
|
|
767
|
+
EraseFileReplyD2HPacket.COMMAND_EXTENDED_ID = 27;
|
|
768
|
+
export class GetProgramSlotInfoReplyD2HPacket extends HostBoundPacket {
|
|
769
|
+
constructor(data) {
|
|
770
|
+
super(data);
|
|
771
|
+
const dataView = PacketView.fromPacket(this);
|
|
772
|
+
this.slot = dataView.nextUint8();
|
|
773
|
+
this.requestedSlot = dataView.nextUint8();
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
GetProgramSlotInfoReplyD2HPacket.COMMAND_ID = 86;
|
|
777
|
+
GetProgramSlotInfoReplyD2HPacket.COMMAND_EXTENDED_ID = 28;
|
|
778
|
+
export class FileClearUpReplyD2HPacket extends HostBoundPacket {
|
|
779
|
+
}
|
|
780
|
+
FileClearUpReplyD2HPacket.COMMAND_ID = 86;
|
|
781
|
+
FileClearUpReplyD2HPacket.COMMAND_EXTENDED_ID = 30;
|
|
782
|
+
export class FileFormatReplyD2HPacket extends HostBoundPacket {
|
|
783
|
+
}
|
|
784
|
+
FileFormatReplyD2HPacket.COMMAND_ID = 86;
|
|
785
|
+
FileFormatReplyD2HPacket.COMMAND_EXTENDED_ID = 31;
|
|
786
|
+
export class GetSystemFlagsReplyD2HPacket extends HostBoundPacket {
|
|
787
|
+
constructor(data) {
|
|
788
|
+
super(data);
|
|
789
|
+
const dataView = PacketView.fromPacket(this);
|
|
790
|
+
this.radioSearching = false;
|
|
791
|
+
this.currentProgram = 0;
|
|
792
|
+
this.flags = dataView.nextUint32();
|
|
793
|
+
const hasPartner = (8192 & this.flags) !== 0;
|
|
794
|
+
const hasRadio = (1536 & this.flags) === 1536;
|
|
795
|
+
const byte1 = dataView.nextUint8();
|
|
796
|
+
const byte2 = dataView.nextUint8();
|
|
797
|
+
if (this.payloadSize === 11) {
|
|
798
|
+
this.battery = 8 * (byte1 & 0x0f);
|
|
799
|
+
if ((this.flags & 0x100) !== 0 || hasRadio)
|
|
800
|
+
this.controllerBatteryPercent = 8 * ((byte1 >> 4) & 0x0f);
|
|
801
|
+
if (hasRadio)
|
|
802
|
+
this.radioQuality = 8 * (byte2 & 0x0f);
|
|
803
|
+
this.radioSearching = (this.flags & 0x600) === 0x200;
|
|
804
|
+
if (hasPartner)
|
|
805
|
+
this.partnerControllerBatteryPercent = 8 * ((byte2 >> 4) & 0x0f);
|
|
806
|
+
this.currentProgram = dataView.nextUint8();
|
|
807
|
+
if (this.battery != null && this.battery > 100)
|
|
808
|
+
this.battery = 100;
|
|
809
|
+
if (this.controllerBatteryPercent != null &&
|
|
810
|
+
this.controllerBatteryPercent > 100)
|
|
811
|
+
this.controllerBatteryPercent = 100;
|
|
812
|
+
if (this.radioQuality != null && this.radioQuality > 100)
|
|
813
|
+
this.radioQuality = 100;
|
|
814
|
+
if (this.partnerControllerBatteryPercent != null &&
|
|
815
|
+
this.partnerControllerBatteryPercent > 100)
|
|
816
|
+
this.partnerControllerBatteryPercent = 100;
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
GetSystemFlagsReplyD2HPacket.COMMAND_ID = 86;
|
|
821
|
+
GetSystemFlagsReplyD2HPacket.COMMAND_EXTENDED_ID = 32;
|
|
822
|
+
export class GetDeviceStatusReplyD2HPacket extends HostBoundPacket {
|
|
823
|
+
constructor(data) {
|
|
824
|
+
super(data);
|
|
825
|
+
const dataView = PacketView.fromPacket(this);
|
|
826
|
+
this.count = dataView.nextUint8();
|
|
827
|
+
this.devices = [];
|
|
828
|
+
for (let i = 0; i < this.count; i++) {
|
|
829
|
+
this.devices.push({
|
|
830
|
+
port: dataView.nextUint8(),
|
|
831
|
+
type: dataView.nextUint8(),
|
|
832
|
+
status: dataView.nextUint8(),
|
|
833
|
+
betaversion: dataView.nextUint8(),
|
|
834
|
+
version: dataView.nextUint16(),
|
|
835
|
+
bootversion: dataView.nextUint16(),
|
|
836
|
+
});
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
GetDeviceStatusReplyD2HPacket.COMMAND_ID = 86;
|
|
841
|
+
GetDeviceStatusReplyD2HPacket.COMMAND_EXTENDED_ID = 33;
|
|
842
|
+
export class GetSystemStatusReplyD2HPacket extends HostBoundPacket {
|
|
843
|
+
constructor(data) {
|
|
844
|
+
super(data);
|
|
845
|
+
const dataView = PacketView.fromPacket(this);
|
|
846
|
+
dataView.nextUint8();
|
|
847
|
+
this.systemVersion = dataView.nextVersion();
|
|
848
|
+
this.cpu0Version = dataView.nextVersion();
|
|
849
|
+
this.cpu1Version = dataView.nextVersion();
|
|
850
|
+
this.touchVersion = dataView.nextVersion(true);
|
|
851
|
+
this.uniqueId = 1234;
|
|
852
|
+
this.sysflags = [0, 0, 0, 0, 0, 0, 0];
|
|
853
|
+
this.goldenVersion = VexFirmwareVersion.allZero();
|
|
854
|
+
this.nxpVersion = VexFirmwareVersion.allZero();
|
|
855
|
+
this.eventBrain = false;
|
|
856
|
+
this.romBootloaderActive = false;
|
|
857
|
+
this.ramBootloaderActive = false;
|
|
858
|
+
if (this.payloadSize > 25) {
|
|
859
|
+
this.uniqueId = dataView.nextUint32();
|
|
860
|
+
this.sysflags = [
|
|
861
|
+
dataView.nextUint8(),
|
|
862
|
+
dataView.nextUint8(),
|
|
863
|
+
dataView.nextUint8(),
|
|
864
|
+
dataView.nextUint8(),
|
|
865
|
+
dataView.nextUint8(),
|
|
866
|
+
0,
|
|
867
|
+
dataView.nextUint8(),
|
|
868
|
+
];
|
|
869
|
+
this.eventBrain = (1 & this.sysflags[6]) !== 0;
|
|
870
|
+
this.romBootloaderActive = (2 & this.sysflags[6]) !== 0;
|
|
871
|
+
this.ramBootloaderActive = (4 & this.sysflags[6]) !== 0;
|
|
872
|
+
dataView.nextUint16();
|
|
873
|
+
this.goldenVersion = dataView.nextVersion();
|
|
874
|
+
}
|
|
875
|
+
if (this.payloadSize > 37) {
|
|
876
|
+
this.nxpVersion = dataView.nextVersion();
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
GetSystemStatusReplyD2HPacket.COMMAND_ID = 86;
|
|
881
|
+
GetSystemStatusReplyD2HPacket.COMMAND_EXTENDED_ID = 34;
|
|
882
|
+
export class GetFdtStatusReplyD2HPacket extends HostBoundPacket {
|
|
883
|
+
constructor(data) {
|
|
884
|
+
super(data);
|
|
885
|
+
const dataView = PacketView.fromPacket(this);
|
|
886
|
+
this.count = dataView.nextUint8();
|
|
887
|
+
this.status = [];
|
|
888
|
+
for (let i = 0; i < this.count; i++) {
|
|
889
|
+
this.status.push({
|
|
890
|
+
index: dataView.nextUint8(),
|
|
891
|
+
type: dataView.nextUint8(),
|
|
892
|
+
status: dataView.nextUint8(),
|
|
893
|
+
betaversion: dataView.nextUint8(),
|
|
894
|
+
version: dataView.nextUint16(),
|
|
895
|
+
bootversion: dataView.nextUint16(),
|
|
896
|
+
});
|
|
897
|
+
}
|
|
898
|
+
}
|
|
899
|
+
}
|
|
900
|
+
GetFdtStatusReplyD2HPacket.COMMAND_ID = 86;
|
|
901
|
+
GetFdtStatusReplyD2HPacket.COMMAND_EXTENDED_ID = 35;
|
|
902
|
+
export class GetLogCountReplyD2HPacket extends HostBoundPacket {
|
|
903
|
+
constructor(data) {
|
|
904
|
+
super(data);
|
|
905
|
+
const dataView = PacketView.fromPacket(this);
|
|
906
|
+
dataView.nextUint8();
|
|
907
|
+
this.count = dataView.nextUint32();
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
GetLogCountReplyD2HPacket.COMMAND_ID = 86;
|
|
911
|
+
GetLogCountReplyD2HPacket.COMMAND_EXTENDED_ID = 36;
|
|
912
|
+
export class ReadLogPageReplyD2HPacket extends HostBoundPacket {
|
|
913
|
+
constructor(data) {
|
|
914
|
+
super(data);
|
|
915
|
+
const dataView = PacketView.fromPacket(this);
|
|
916
|
+
const n = this.ackIndex;
|
|
917
|
+
const size = dataView.nextUint8();
|
|
918
|
+
this.offset = dataView.nextUint32();
|
|
919
|
+
this.count = dataView.nextUint16();
|
|
920
|
+
this.entries = [];
|
|
921
|
+
let j = n + 8;
|
|
922
|
+
for (let i = 0; i < this.count; i++) {
|
|
923
|
+
this.entries.push({
|
|
924
|
+
code: dataView.getUint8(j),
|
|
925
|
+
type: dataView.getUint8(j + 1),
|
|
926
|
+
desc: dataView.getUint8(j + 2),
|
|
927
|
+
spare: dataView.getUint8(j + 3),
|
|
928
|
+
time: dataView.getUint32(j + 4, true),
|
|
929
|
+
});
|
|
930
|
+
j += size;
|
|
931
|
+
}
|
|
932
|
+
}
|
|
933
|
+
}
|
|
934
|
+
ReadLogPageReplyD2HPacket.COMMAND_ID = 86;
|
|
935
|
+
ReadLogPageReplyD2HPacket.COMMAND_EXTENDED_ID = 37;
|
|
936
|
+
export class GetRadioStatusReplyD2HPacket extends HostBoundPacket {
|
|
937
|
+
constructor(data) {
|
|
938
|
+
super(data);
|
|
939
|
+
const dataView = PacketView.fromPacket(this);
|
|
940
|
+
const n = this.ackIndex;
|
|
941
|
+
this.device = dataView.nextUint8();
|
|
942
|
+
this.quality = dataView.nextUint16();
|
|
943
|
+
this.strength = dataView.nextInt16();
|
|
944
|
+
this.channel = this.data[n + 6];
|
|
945
|
+
this.timeslot = this.data[n + 7];
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
GetRadioStatusReplyD2HPacket.COMMAND_ID = 86;
|
|
949
|
+
GetRadioStatusReplyD2HPacket.COMMAND_EXTENDED_ID = 38;
|
|
950
|
+
export class GetUserDataReplyD2HPacket extends HostBoundPacket {
|
|
951
|
+
}
|
|
952
|
+
GetUserDataReplyD2HPacket.COMMAND_ID = 86;
|
|
953
|
+
GetUserDataReplyD2HPacket.COMMAND_EXTENDED_ID = 39;
|
|
954
|
+
export class ScreenCaptureReplyD2HPacket extends HostBoundPacket {
|
|
955
|
+
}
|
|
956
|
+
ScreenCaptureReplyD2HPacket.COMMAND_ID = 86;
|
|
957
|
+
ScreenCaptureReplyD2HPacket.COMMAND_EXTENDED_ID = 40;
|
|
958
|
+
// export class UserProgramControlReplyD2HPacket extends HostBoundPacket {
|
|
959
|
+
// static COMMAND_ID = 86;
|
|
960
|
+
// static COMMAND_EXTENDED_ID = 41;
|
|
961
|
+
// }
|
|
962
|
+
export class SendDashTouchReplyD2HPacket extends HostBoundPacket {
|
|
963
|
+
}
|
|
964
|
+
SendDashTouchReplyD2HPacket.COMMAND_ID = 86;
|
|
965
|
+
SendDashTouchReplyD2HPacket.COMMAND_EXTENDED_ID = 42;
|
|
966
|
+
export class SelectDashReplyD2HPacket extends HostBoundPacket {
|
|
967
|
+
}
|
|
968
|
+
SelectDashReplyD2HPacket.COMMAND_ID = 86;
|
|
969
|
+
SelectDashReplyD2HPacket.COMMAND_EXTENDED_ID = 43;
|
|
970
|
+
export class EnableDashReplyD2HPacket extends HostBoundPacket {
|
|
971
|
+
}
|
|
972
|
+
EnableDashReplyD2HPacket.COMMAND_ID = 86;
|
|
973
|
+
EnableDashReplyD2HPacket.COMMAND_EXTENDED_ID = 44;
|
|
974
|
+
export class DisableDashReplyD2HPacket extends HostBoundPacket {
|
|
975
|
+
}
|
|
976
|
+
DisableDashReplyD2HPacket.COMMAND_ID = 86;
|
|
977
|
+
DisableDashReplyD2HPacket.COMMAND_EXTENDED_ID = 45;
|
|
978
|
+
export class ReadKeyValueReplyD2HPacket extends HostBoundPacket {
|
|
979
|
+
constructor(data) {
|
|
980
|
+
super(data);
|
|
981
|
+
const dataView = PacketView.fromPacket(this);
|
|
982
|
+
this.value = dataView.nextVarNTBS(255);
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
ReadKeyValueReplyD2HPacket.COMMAND_ID = 86;
|
|
986
|
+
ReadKeyValueReplyD2HPacket.COMMAND_EXTENDED_ID = 46;
|
|
987
|
+
export class WriteKeyValueReplyD2HPacket extends HostBoundPacket {
|
|
988
|
+
}
|
|
989
|
+
WriteKeyValueReplyD2HPacket.COMMAND_ID = 86;
|
|
990
|
+
WriteKeyValueReplyD2HPacket.COMMAND_EXTENDED_ID = 47;
|
|
991
|
+
export class GetSlot1to4InfoReplyD2HPacket extends HostBoundPacket {
|
|
992
|
+
constructor(data, start = 1) {
|
|
993
|
+
super(data);
|
|
994
|
+
const dataView = PacketView.fromPacket(this);
|
|
995
|
+
this.slotFlags = dataView.nextUint8();
|
|
996
|
+
this.slots = [];
|
|
997
|
+
for (let i = 0; i < 4; i++) {
|
|
998
|
+
const hasData = (this.slotFlags & Math.pow(2, start - 1 + i)) !== 0;
|
|
999
|
+
if (!hasData)
|
|
1000
|
+
continue;
|
|
1001
|
+
const iconNum = dataView.nextUint16();
|
|
1002
|
+
const nameLen = dataView.nextUint8();
|
|
1003
|
+
const name = dataView.nextString(nameLen);
|
|
1004
|
+
this.slots.push({
|
|
1005
|
+
slot: start + i,
|
|
1006
|
+
icon: iconNum,
|
|
1007
|
+
name,
|
|
1008
|
+
});
|
|
1009
|
+
}
|
|
1010
|
+
}
|
|
1011
|
+
}
|
|
1012
|
+
GetSlot1to4InfoReplyD2HPacket.COMMAND_ID = 86;
|
|
1013
|
+
GetSlot1to4InfoReplyD2HPacket.COMMAND_EXTENDED_ID = 49;
|
|
1014
|
+
export class GetSlot5to8InfoReplyD2HPacket extends GetSlot1to4InfoReplyD2HPacket {
|
|
1015
|
+
constructor(data) {
|
|
1016
|
+
super(data, 5);
|
|
1017
|
+
this.slotStartIndex = 5;
|
|
1018
|
+
}
|
|
1019
|
+
}
|
|
1020
|
+
GetSlot5to8InfoReplyD2HPacket.COMMAND_ID = 86;
|
|
1021
|
+
GetSlot5to8InfoReplyD2HPacket.COMMAND_EXTENDED_ID = 50;
|
|
1022
|
+
export class FactoryStatusReplyD2HPacket extends HostBoundPacket {
|
|
1023
|
+
constructor(data) {
|
|
1024
|
+
super(data);
|
|
1025
|
+
const dataView = PacketView.fromPacket(this);
|
|
1026
|
+
this.status = dataView.nextUint8();
|
|
1027
|
+
this.percent = dataView.nextUint8();
|
|
1028
|
+
}
|
|
1029
|
+
}
|
|
1030
|
+
FactoryStatusReplyD2HPacket.COMMAND_ID = 86;
|
|
1031
|
+
FactoryStatusReplyD2HPacket.COMMAND_EXTENDED_ID = 241;
|
|
1032
|
+
export class FactoryEnableReplyD2HPacket extends HostBoundPacket {
|
|
1033
|
+
}
|
|
1034
|
+
FactoryEnableReplyD2HPacket.COMMAND_ID = 86;
|
|
1035
|
+
FactoryEnableReplyD2HPacket.COMMAND_EXTENDED_ID = 255;
|
|
1036
|
+
//# sourceMappingURL=VexPacket.js.map
|