@v5x/serial 0.5.3 → 0.5.5

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.
Files changed (54) hide show
  1. package/README.md +72 -6
  2. package/dist/Vex.d.ts +4 -4
  3. package/dist/VexCRC.d.ts +0 -1
  4. package/dist/VexConnection.d.ts +81 -23
  5. package/dist/VexDevice.d.ts +41 -155
  6. package/{dts/VexDevice.d.ts → dist/VexDeviceState.d.ts} +63 -55
  7. package/dist/VexError.d.ts +47 -0
  8. package/dist/VexFirmware.d.ts +45 -0
  9. package/dist/VexIniConfig.d.ts +1 -1
  10. package/dist/VexPacket.d.ts +3 -512
  11. package/dist/VexPacketBase.d.ts +21 -0
  12. package/dist/VexPacketEncoder.d.ts +55 -0
  13. package/{dts/VexPacket.d.ts → dist/VexPacketModels.d.ts} +3 -107
  14. package/dist/VexPacketView.d.ts +3 -3
  15. package/dist/VexTransfers.d.ts +20 -0
  16. package/dist/index.cjs +4541 -0
  17. package/dist/index.cjs.map +25 -0
  18. package/dist/index.d.ts +9 -9
  19. package/dist/index.js +4460 -0
  20. package/dist/index.js.map +25 -0
  21. package/package.json +40 -72
  22. package/dist/v5-serial-protocol.cjs.js +0 -4516
  23. package/dist/v5-serial-protocol.cjs.js.map +0 -1
  24. package/dist/v5-serial-protocol.es.js +0 -4401
  25. package/dist/v5-serial-protocol.es.js.map +0 -1
  26. package/dts/Vex.d.ts +0 -235
  27. package/dts/Vex.js +0 -189
  28. package/dts/Vex.js.map +0 -1
  29. package/dts/VexCRC.d.ts +0 -19
  30. package/dts/VexCRC.js +0 -89
  31. package/dts/VexCRC.js.map +0 -1
  32. package/dts/VexConnection.d.ts +0 -45
  33. package/dts/VexConnection.js +0 -500
  34. package/dts/VexConnection.js.map +0 -1
  35. package/dts/VexDevice.js +0 -944
  36. package/dts/VexDevice.js.map +0 -1
  37. package/dts/VexEvent.d.ts +0 -16
  38. package/dts/VexEvent.js +0 -47
  39. package/dts/VexEvent.js.map +0 -1
  40. package/dts/VexFirmwareVersion.d.ts +0 -55
  41. package/dts/VexFirmwareVersion.js +0 -104
  42. package/dts/VexFirmwareVersion.js.map +0 -1
  43. package/dts/VexIniConfig.d.ts +0 -27
  44. package/dts/VexIniConfig.js +0 -122
  45. package/dts/VexIniConfig.js.map +0 -1
  46. package/dts/VexPacket.js +0 -1036
  47. package/dts/VexPacket.js.map +0 -1
  48. package/dts/VexPacketView.d.ts +0 -18
  49. package/dts/VexPacketView.js +0 -84
  50. package/dts/VexPacketView.js.map +0 -1
  51. package/dts/index.d.ts +0 -9
  52. package/dts/index.js +0 -10
  53. package/dts/index.js.map +0 -1
  54. package/index.d.ts +0 -1098
package/dist/index.js ADDED
@@ -0,0 +1,4460 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __returnValue = (v) => v;
3
+ function __exportSetter(name, newValue) {
4
+ this[name] = __returnValue.bind(null, newValue);
5
+ }
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, {
9
+ get: all[name],
10
+ enumerable: true,
11
+ configurable: true,
12
+ set: __exportSetter.bind(all, name)
13
+ });
14
+ };
15
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
16
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
17
+ }) : x)(function(x) {
18
+ if (typeof require !== "undefined")
19
+ return require.apply(this, arguments);
20
+ throw Error('Dynamic require of "' + x + '" is not supported');
21
+ });
22
+
23
+ // src/Vex.ts
24
+ var USER_PROG_CHUNK_SIZE = 4096;
25
+ var USER_FLASH_START = 50331648;
26
+ var USER_FLASH_SYS_CODE_START = 54525952;
27
+ var USER_FLASH_USR_CODE_START = 58720256;
28
+ var USER_FLASH_END = 134217728;
29
+ var USER_FLASH_MAX_FILE_SIZE = 2097152;
30
+ var USER_FLASH_START_B = 270532608;
31
+ var USER_FLASH_END_B = 272629760;
32
+ var USER_FLASH_START_C = 807403520;
33
+ var USER_FLASH_END_C = 822083584;
34
+ var FileVendor;
35
+ ((FileVendor2) => {
36
+ FileVendor2[FileVendor2["USER"] = 1] = "USER";
37
+ FileVendor2[FileVendor2["SYS"] = 15] = "SYS";
38
+ FileVendor2[FileVendor2["DEV1"] = 16] = "DEV1";
39
+ FileVendor2[FileVendor2["DEV2"] = 24] = "DEV2";
40
+ FileVendor2[FileVendor2["DEV3"] = 32] = "DEV3";
41
+ FileVendor2[FileVendor2["DEV4"] = 40] = "DEV4";
42
+ FileVendor2[FileVendor2["DEV5"] = 48] = "DEV5";
43
+ FileVendor2[FileVendor2["DEV6"] = 56] = "DEV6";
44
+ FileVendor2[FileVendor2["VEXVM"] = 64] = "VEXVM";
45
+ FileVendor2[FileVendor2["VEX"] = 240] = "VEX";
46
+ FileVendor2[FileVendor2["UNDEFINED"] = 241] = "UNDEFINED";
47
+ })(FileVendor ||= {});
48
+ var FileDownloadTarget;
49
+ ((FileDownloadTarget2) => {
50
+ FileDownloadTarget2[FileDownloadTarget2["FILE_TARGET_DDR"] = 0] = "FILE_TARGET_DDR";
51
+ FileDownloadTarget2[FileDownloadTarget2["FILE_TARGET_QSPI"] = 1] = "FILE_TARGET_QSPI";
52
+ FileDownloadTarget2[FileDownloadTarget2["FILE_TARGET_CBUF"] = 2] = "FILE_TARGET_CBUF";
53
+ FileDownloadTarget2[FileDownloadTarget2["FILE_TARGET_VBUF"] = 3] = "FILE_TARGET_VBUF";
54
+ FileDownloadTarget2[FileDownloadTarget2["FILE_TARGET_DDRC"] = 4] = "FILE_TARGET_DDRC";
55
+ FileDownloadTarget2[FileDownloadTarget2["FILE_TARGET_DDRE"] = 5] = "FILE_TARGET_DDRE";
56
+ FileDownloadTarget2[FileDownloadTarget2["FILE_TARGET_FLASH"] = 6] = "FILE_TARGET_FLASH";
57
+ FileDownloadTarget2[FileDownloadTarget2["FILE_TARGET_RADIO"] = 7] = "FILE_TARGET_RADIO";
58
+ FileDownloadTarget2[FileDownloadTarget2["FILE_TARGET_A1"] = 13] = "FILE_TARGET_A1";
59
+ FileDownloadTarget2[FileDownloadTarget2["FILE_TARGET_B1"] = 14] = "FILE_TARGET_B1";
60
+ FileDownloadTarget2[FileDownloadTarget2["FILE_TARGET_B2"] = 15] = "FILE_TARGET_B2";
61
+ })(FileDownloadTarget ||= {});
62
+ var FileInitAction;
63
+ ((FileInitAction2) => {
64
+ FileInitAction2[FileInitAction2["WRITE"] = 1] = "WRITE";
65
+ FileInitAction2[FileInitAction2["READ"] = 2] = "READ";
66
+ })(FileInitAction ||= {});
67
+ var FileInitOption;
68
+ ((FileInitOption2) => {
69
+ FileInitOption2[FileInitOption2["NONE"] = 0] = "NONE";
70
+ FileInitOption2[FileInitOption2["OVERWRITE"] = 1] = "OVERWRITE";
71
+ })(FileInitOption ||= {});
72
+ var FileLoadAction;
73
+ ((FileLoadAction2) => {
74
+ FileLoadAction2[FileLoadAction2["RUN"] = 0] = "RUN";
75
+ FileLoadAction2[FileLoadAction2["STOP"] = 128] = "STOP";
76
+ })(FileLoadAction ||= {});
77
+ var FileExitAction;
78
+ ((FileExitAction2) => {
79
+ FileExitAction2[FileExitAction2["EXIT_NONE"] = 0] = "EXIT_NONE";
80
+ FileExitAction2[FileExitAction2["EXIT_RUN"] = 1] = "EXIT_RUN";
81
+ FileExitAction2[FileExitAction2["EXIT_HALT"] = 3] = "EXIT_HALT";
82
+ })(FileExitAction ||= {});
83
+ var RadioChannelType;
84
+ ((RadioChannelType2) => {
85
+ RadioChannelType2[RadioChannelType2["PIT"] = 0] = "PIT";
86
+ RadioChannelType2[RadioChannelType2["DOWNLOAD"] = 1] = "DOWNLOAD";
87
+ })(RadioChannelType ||= {});
88
+ var AckType;
89
+ ((AckType2) => {
90
+ AckType2[AckType2["CDC2_ACK"] = 118] = "CDC2_ACK";
91
+ AckType2[AckType2["CDC2_NACK"] = 255] = "CDC2_NACK";
92
+ AckType2[AckType2["CDC2_NACK_PACKET_CRC"] = 206] = "CDC2_NACK_PACKET_CRC";
93
+ AckType2[AckType2["CDC2_NACK_CMD_LENGTH"] = 208] = "CDC2_NACK_CMD_LENGTH";
94
+ AckType2[AckType2["CDC2_NACK_SIZE"] = 209] = "CDC2_NACK_SIZE";
95
+ AckType2[AckType2["CDC2_NACK_CRC"] = 210] = "CDC2_NACK_CRC";
96
+ AckType2[AckType2["CDC2_NACK_FILE"] = 211] = "CDC2_NACK_FILE";
97
+ AckType2[AckType2["CDC2_NACK_INIT"] = 212] = "CDC2_NACK_INIT";
98
+ AckType2[AckType2["CDC2_NACK_FUNC"] = 213] = "CDC2_NACK_FUNC";
99
+ AckType2[AckType2["CDC2_NACK_ALIGN"] = 214] = "CDC2_NACK_ALIGN";
100
+ AckType2[AckType2["CDC2_NACK_ADDR"] = 215] = "CDC2_NACK_ADDR";
101
+ AckType2[AckType2["CDC2_NACK_INCOMPLETE"] = 216] = "CDC2_NACK_INCOMPLETE";
102
+ AckType2[AckType2["CDC2_NACK_DIR_INDEX"] = 217] = "CDC2_NACK_DIR_INDEX";
103
+ AckType2[AckType2["CDC2_NACK_MAX_USER_FILES"] = 218] = "CDC2_NACK_MAX_USER_FILES";
104
+ AckType2[AckType2["CDC2_NACK_FILE_EXISTS"] = 219] = "CDC2_NACK_FILE_EXISTS";
105
+ AckType2[AckType2["CDC2_NACK_FILE_SYS_FULL"] = 220] = "CDC2_NACK_FILE_SYS_FULL";
106
+ AckType2[AckType2["TIMEOUT"] = 256] = "TIMEOUT";
107
+ AckType2[AckType2["WRITE_ERROR"] = 257] = "WRITE_ERROR";
108
+ })(AckType ||= {});
109
+ var SmartDeviceType;
110
+ ((SmartDeviceType2) => {
111
+ SmartDeviceType2[SmartDeviceType2["EMPTY"] = 0] = "EMPTY";
112
+ SmartDeviceType2[SmartDeviceType2["V5_POWER"] = 1] = "V5_POWER";
113
+ SmartDeviceType2[SmartDeviceType2["MOTOR"] = 2] = "MOTOR";
114
+ SmartDeviceType2[SmartDeviceType2["LED"] = 3] = "LED";
115
+ SmartDeviceType2[SmartDeviceType2["ABS_ENCODER_SENSOR"] = 4] = "ABS_ENCODER_SENSOR";
116
+ SmartDeviceType2[SmartDeviceType2["CR_MOTOR"] = 5] = "CR_MOTOR";
117
+ SmartDeviceType2[SmartDeviceType2["IMU_SENSOR"] = 6] = "IMU_SENSOR";
118
+ SmartDeviceType2[SmartDeviceType2["DISTANCE_SENSOR"] = 7] = "DISTANCE_SENSOR";
119
+ SmartDeviceType2[SmartDeviceType2["RADIO_SENSOR"] = 8] = "RADIO_SENSOR";
120
+ SmartDeviceType2[SmartDeviceType2["CONTROLLER"] = 9] = "CONTROLLER";
121
+ SmartDeviceType2[SmartDeviceType2["BRAIN"] = 10] = "BRAIN";
122
+ SmartDeviceType2[SmartDeviceType2["VISION_SENSOR"] = 11] = "VISION_SENSOR";
123
+ SmartDeviceType2[SmartDeviceType2["ADI"] = 12] = "ADI";
124
+ SmartDeviceType2[SmartDeviceType2["PARTNER_CONTROLLER"] = 13] = "PARTNER_CONTROLLER";
125
+ SmartDeviceType2[SmartDeviceType2["BATTERY"] = 14] = "BATTERY";
126
+ SmartDeviceType2[SmartDeviceType2["SOL"] = 15] = "SOL";
127
+ SmartDeviceType2[SmartDeviceType2["OPTICAL_SENSOR"] = 16] = "OPTICAL_SENSOR";
128
+ SmartDeviceType2[SmartDeviceType2["MAGNET"] = 17] = "MAGNET";
129
+ SmartDeviceType2[SmartDeviceType2["GPS_SENSOR"] = 20] = "GPS_SENSOR";
130
+ SmartDeviceType2[SmartDeviceType2["UNDEFINED_SENSOR"] = 255] = "UNDEFINED_SENSOR";
131
+ })(SmartDeviceType ||= {});
132
+ var SerialDeviceType;
133
+ ((SerialDeviceType2) => {
134
+ SerialDeviceType2[SerialDeviceType2["V5_BRAIN"] = 1281] = "V5_BRAIN";
135
+ SerialDeviceType2[SerialDeviceType2["V5_BRAIN_DFU"] = 1282] = "V5_BRAIN_DFU";
136
+ SerialDeviceType2[SerialDeviceType2["V5_CONTROLLER"] = 1283] = "V5_CONTROLLER";
137
+ SerialDeviceType2[SerialDeviceType2["XILINX"] = 256] = "XILINX";
138
+ SerialDeviceType2[SerialDeviceType2["IQ_BRAIN"] = 2] = "IQ_BRAIN";
139
+ SerialDeviceType2[SerialDeviceType2["IQ_BRAIN2"] = 3] = "IQ_BRAIN2";
140
+ SerialDeviceType2[SerialDeviceType2["IQ_BRAIN_DFU"] = 255] = "IQ_BRAIN_DFU";
141
+ SerialDeviceType2[SerialDeviceType2["IQ2_BRAIN"] = 512] = "IQ2_BRAIN";
142
+ SerialDeviceType2[SerialDeviceType2["IQ2_BRAIN_DFU"] = 527] = "IQ2_BRAIN_DFU";
143
+ SerialDeviceType2[SerialDeviceType2["IQ2_CONTROLLER"] = 528] = "IQ2_CONTROLLER";
144
+ SerialDeviceType2[SerialDeviceType2["IQ2_CONTROLLER_DFU"] = 543] = "IQ2_CONTROLLER_DFU";
145
+ SerialDeviceType2[SerialDeviceType2["EXP_BRAIN"] = 1536] = "EXP_BRAIN";
146
+ SerialDeviceType2[SerialDeviceType2["EXP_BRAIN_DFU"] = 1551] = "EXP_BRAIN_DFU";
147
+ SerialDeviceType2[SerialDeviceType2["EXP_CONTROLLER"] = 1552] = "EXP_CONTROLLER";
148
+ SerialDeviceType2[SerialDeviceType2["EXP_CONTROLLER_DFU"] = 1567] = "EXP_CONTROLLER_DFU";
149
+ SerialDeviceType2[SerialDeviceType2["PIXY"] = 61440] = "PIXY";
150
+ SerialDeviceType2[SerialDeviceType2["PIXY_DFU"] = 12] = "PIXY_DFU";
151
+ SerialDeviceType2[SerialDeviceType2["VEXCAM"] = 1287] = "VEXCAM";
152
+ SerialDeviceType2[SerialDeviceType2["VEXCAM_DFU"] = 1288] = "VEXCAM_DFU";
153
+ SerialDeviceType2[SerialDeviceType2["SENSOR_TEST"] = 1535] = "SENSOR_TEST";
154
+ SerialDeviceType2[SerialDeviceType2["CORTEX_PROGCBL"] = 10] = "CORTEX_PROGCBL";
155
+ SerialDeviceType2[SerialDeviceType2["CORTEX_BRAIN"] = 11] = "CORTEX_BRAIN";
156
+ SerialDeviceType2[SerialDeviceType2["CORTEX_JOYSTK"] = 12] = "CORTEX_JOYSTK";
157
+ SerialDeviceType2[SerialDeviceType2["VEXNET_KEY_20"] = 7] = "VEXNET_KEY_20";
158
+ SerialDeviceType2[SerialDeviceType2["VEXNET_KEY_10"] = 9587] = "VEXNET_KEY_10";
159
+ SerialDeviceType2[SerialDeviceType2["PROLIFIC"] = 8963] = "PROLIFIC";
160
+ })(SerialDeviceType ||= {});
161
+ var SelectDashScreen;
162
+ ((SelectDashScreen2) => {
163
+ SelectDashScreen2[SelectDashScreen2["HOME"] = 0] = "HOME";
164
+ SelectDashScreen2[SelectDashScreen2["BATTERY"] = 1] = "BATTERY";
165
+ SelectDashScreen2[SelectDashScreen2["LED"] = 3] = "LED";
166
+ SelectDashScreen2[SelectDashScreen2["MATCH_CONFIG"] = 4] = "MATCH_CONFIG";
167
+ SelectDashScreen2[SelectDashScreen2["MATCH_CONFIG_MORE"] = 5] = "MATCH_CONFIG_MORE";
168
+ SelectDashScreen2[SelectDashScreen2["WIRING"] = 6] = "WIRING";
169
+ SelectDashScreen2[SelectDashScreen2["RADIO"] = 8] = "RADIO";
170
+ SelectDashScreen2[SelectDashScreen2["BRAIN"] = 10] = "BRAIN";
171
+ SelectDashScreen2[SelectDashScreen2["RUN_PROGRAM"] = 13] = "RUN_PROGRAM";
172
+ SelectDashScreen2[SelectDashScreen2["DRIVE_PROGRAM_CONTROL_LEFT_MAPPING"] = 14] = "DRIVE_PROGRAM_CONTROL_LEFT_MAPPING";
173
+ SelectDashScreen2[SelectDashScreen2["DRIVE_PROGRAM_MENU"] = 15] = "DRIVE_PROGRAM_MENU";
174
+ SelectDashScreen2[SelectDashScreen2["DEVICES"] = 16] = "DEVICES";
175
+ SelectDashScreen2[SelectDashScreen2["USER_PROGRAM_FOLDER"] = 17] = "USER_PROGRAM_FOLDER";
176
+ SelectDashScreen2[SelectDashScreen2["VEX_PROGRAM_FOLDER"] = 18] = "VEX_PROGRAM_FOLDER";
177
+ SelectDashScreen2[SelectDashScreen2["SETTINGS"] = 19] = "SETTINGS";
178
+ SelectDashScreen2[SelectDashScreen2["SCARY_CONFIGURATION"] = 20] = "SCARY_CONFIGURATION";
179
+ SelectDashScreen2[SelectDashScreen2["LANGUAGE"] = 21] = "LANGUAGE";
180
+ SelectDashScreen2[SelectDashScreen2["DRIVE_MOTOR_CONFIG"] = 22] = "DRIVE_MOTOR_CONFIG";
181
+ SelectDashScreen2[SelectDashScreen2["PROGRAM_MENU"] = 24] = "PROGRAM_MENU";
182
+ SelectDashScreen2[SelectDashScreen2["SHUTDOWN"] = 25] = "SHUTDOWN";
183
+ SelectDashScreen2[SelectDashScreen2["CONTROLLER_2_MAPPING"] = 26] = "CONTROLLER_2_MAPPING";
184
+ SelectDashScreen2[SelectDashScreen2["SCARY_CONFIGURATION_MORE"] = 27] = "SCARY_CONFIGURATION_MORE";
185
+ SelectDashScreen2[SelectDashScreen2["CONFIRM_XX"] = 28] = "CONFIRM_XX";
186
+ SelectDashScreen2[SelectDashScreen2["CONTROLLER_1_MAPPING"] = 29] = "CONTROLLER_1_MAPPING";
187
+ SelectDashScreen2[SelectDashScreen2["DRIVE_PROGRAM_CONTROL_DUAL_MAPPING"] = 30] = "DRIVE_PROGRAM_CONTROL_DUAL_MAPPING";
188
+ SelectDashScreen2[SelectDashScreen2["DRIVE_PROGRAM_CONTROL_SPLIT_MAPPING"] = 31] = "DRIVE_PROGRAM_CONTROL_SPLIT_MAPPING";
189
+ SelectDashScreen2[SelectDashScreen2["DRIVE_PROGRAM_CONTROL_RIGHT_MAPPING"] = 32] = "DRIVE_PROGRAM_CONTROL_RIGHT_MAPPING";
190
+ SelectDashScreen2[SelectDashScreen2["MATCH_2_4_PLAYERS"] = 33] = "MATCH_2_4_PLAYERS";
191
+ SelectDashScreen2[SelectDashScreen2["EVENT_LOG"] = 34] = "EVENT_LOG";
192
+ SelectDashScreen2[SelectDashScreen2["USER_PROGRAM_WIRING"] = 40] = "USER_PROGRAM_WIRING";
193
+ SelectDashScreen2[SelectDashScreen2["CLAWBOT_PROGRAM_MENU"] = 41] = "CLAWBOT_PROGRAM_MENU";
194
+ SelectDashScreen2[SelectDashScreen2["ABOUT"] = 42] = "ABOUT";
195
+ SelectDashScreen2[SelectDashScreen2["LANGUAGE_MORE"] = 43] = "LANGUAGE_MORE";
196
+ SelectDashScreen2[SelectDashScreen2["OBJECT_COLOR"] = 45] = "OBJECT_COLOR";
197
+ SelectDashScreen2[SelectDashScreen2["SIGNATURE_ID"] = 46] = "SIGNATURE_ID";
198
+ SelectDashScreen2[SelectDashScreen2["LOG_DATA"] = 47] = "LOG_DATA";
199
+ })(SelectDashScreen ||= {});
200
+ // src/VexError.ts
201
+ class VexSerialError extends Error {
202
+ kind;
203
+ constructor(kind, message) {
204
+ super(message);
205
+ this.name = "VexSerialError";
206
+ this.kind = kind;
207
+ }
208
+ }
209
+
210
+ class VexNotConnectedError extends VexSerialError {
211
+ constructor(message = "no connection to a V5 device") {
212
+ super("not-connected", message);
213
+ this.name = "VexNotConnectedError";
214
+ }
215
+ }
216
+
217
+ class VexInvalidArgumentError extends VexSerialError {
218
+ constructor(message) {
219
+ super("invalid-argument", message);
220
+ this.name = "VexInvalidArgumentError";
221
+ }
222
+ }
223
+
224
+ class VexProtocolError extends VexSerialError {
225
+ constructor(message) {
226
+ super("protocol", message);
227
+ this.name = "VexProtocolError";
228
+ }
229
+ }
230
+
231
+ class VexTransferError extends VexSerialError {
232
+ constructor(message) {
233
+ super("transfer", message);
234
+ this.name = "VexTransferError";
235
+ }
236
+ }
237
+
238
+ class VexDownloadError extends VexSerialError {
239
+ constructor(message) {
240
+ super("download", message);
241
+ this.name = "VexDownloadError";
242
+ }
243
+ }
244
+
245
+ class VexFirmwareError extends VexSerialError {
246
+ constructor(message) {
247
+ super("firmware", message);
248
+ this.name = "VexFirmwareError";
249
+ }
250
+ }
251
+
252
+ class VexIoError extends VexSerialError {
253
+ constructor(message) {
254
+ super("io", message);
255
+ this.name = "VexIoError";
256
+ }
257
+ }
258
+ function toVexSerialError(error, fallback = "io") {
259
+ if (error instanceof VexSerialError)
260
+ return error;
261
+ const message = error instanceof Error ? error.message : String(error);
262
+ return new VexSerialError(fallback, message);
263
+ }
264
+
265
+ // src/VexEvent.ts
266
+ class VexEventEmitter {
267
+ handlerMap;
268
+ constructor() {
269
+ this.handlerMap = new Map;
270
+ }
271
+ on(eventName, listener) {
272
+ let listeners = this.handlerMap.get(eventName);
273
+ listeners ??= [];
274
+ listeners.push(listener);
275
+ this.handlerMap.set(eventName, listeners);
276
+ }
277
+ remove(eventName, listener) {
278
+ let listeners = this.handlerMap.get(eventName);
279
+ listeners ??= [];
280
+ const index = listeners.indexOf(listener);
281
+ if (index > -1) {
282
+ listeners.splice(index, 1);
283
+ }
284
+ this.handlerMap.set(eventName, listeners);
285
+ }
286
+ emit(eventName, data) {
287
+ (this.handlerMap.get(eventName) ?? []).forEach((callback) => {
288
+ callback(data);
289
+ });
290
+ }
291
+ clearListeners() {
292
+ this.handlerMap.clear();
293
+ }
294
+ }
295
+
296
+ class VexEventTarget {
297
+ emitter;
298
+ constructor() {
299
+ this.emitter = new VexEventEmitter;
300
+ }
301
+ emit(eventName, data) {
302
+ this.emitter.emit(String(eventName), data);
303
+ }
304
+ on(eventName, listener) {
305
+ this.emitter.on(String(eventName), listener);
306
+ }
307
+ remove(eventName, listener) {
308
+ this.emitter.remove(String(eventName), listener);
309
+ }
310
+ clearListeners() {
311
+ this.emitter.clearListeners();
312
+ }
313
+ }
314
+
315
+ // ../../node_modules/.bun/neverthrow@8.2.0/node_modules/neverthrow/dist/index.es.js
316
+ var defaultErrorConfig = {
317
+ withStackTrace: false
318
+ };
319
+ var createNeverThrowError = (message, result, config = defaultErrorConfig) => {
320
+ const data = result.isOk() ? { type: "Ok", value: result.value } : { type: "Err", value: result.error };
321
+ const maybeStack = config.withStackTrace ? new Error().stack : undefined;
322
+ return {
323
+ data,
324
+ message,
325
+ stack: maybeStack
326
+ };
327
+ };
328
+ function __awaiter(thisArg, _arguments, P, generator) {
329
+ function adopt(value) {
330
+ return value instanceof P ? value : new P(function(resolve) {
331
+ resolve(value);
332
+ });
333
+ }
334
+ return new (P || (P = Promise))(function(resolve, reject) {
335
+ function fulfilled(value) {
336
+ try {
337
+ step(generator.next(value));
338
+ } catch (e) {
339
+ reject(e);
340
+ }
341
+ }
342
+ function rejected(value) {
343
+ try {
344
+ step(generator["throw"](value));
345
+ } catch (e) {
346
+ reject(e);
347
+ }
348
+ }
349
+ function step(result) {
350
+ result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
351
+ }
352
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
353
+ });
354
+ }
355
+ function __values(o) {
356
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
357
+ if (m)
358
+ return m.call(o);
359
+ if (o && typeof o.length === "number")
360
+ return {
361
+ next: function() {
362
+ if (o && i >= o.length)
363
+ o = undefined;
364
+ return { value: o && o[i++], done: !o };
365
+ }
366
+ };
367
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
368
+ }
369
+ function __await(v) {
370
+ return this instanceof __await ? (this.v = v, this) : new __await(v);
371
+ }
372
+ function __asyncGenerator(thisArg, _arguments, generator) {
373
+ if (!Symbol.asyncIterator)
374
+ throw new TypeError("Symbol.asyncIterator is not defined.");
375
+ var g = generator.apply(thisArg, _arguments || []), i, q = [];
376
+ return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function() {
377
+ return this;
378
+ }, i;
379
+ function awaitReturn(f) {
380
+ return function(v) {
381
+ return Promise.resolve(v).then(f, reject);
382
+ };
383
+ }
384
+ function verb(n, f) {
385
+ if (g[n]) {
386
+ i[n] = function(v) {
387
+ return new Promise(function(a, b) {
388
+ q.push([n, v, a, b]) > 1 || resume(n, v);
389
+ });
390
+ };
391
+ if (f)
392
+ i[n] = f(i[n]);
393
+ }
394
+ }
395
+ function resume(n, v) {
396
+ try {
397
+ step(g[n](v));
398
+ } catch (e) {
399
+ settle(q[0][3], e);
400
+ }
401
+ }
402
+ function step(r) {
403
+ r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r);
404
+ }
405
+ function fulfill(value) {
406
+ resume("next", value);
407
+ }
408
+ function reject(value) {
409
+ resume("throw", value);
410
+ }
411
+ function settle(f, v) {
412
+ if (f(v), q.shift(), q.length)
413
+ resume(q[0][0], q[0][1]);
414
+ }
415
+ }
416
+ function __asyncDelegator(o) {
417
+ var i, p;
418
+ return i = {}, verb("next"), verb("throw", function(e) {
419
+ throw e;
420
+ }), verb("return"), i[Symbol.iterator] = function() {
421
+ return this;
422
+ }, i;
423
+ function verb(n, f) {
424
+ i[n] = o[n] ? function(v) {
425
+ return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v;
426
+ } : f;
427
+ }
428
+ }
429
+ function __asyncValues(o) {
430
+ if (!Symbol.asyncIterator)
431
+ throw new TypeError("Symbol.asyncIterator is not defined.");
432
+ var m = o[Symbol.asyncIterator], i;
433
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() {
434
+ return this;
435
+ }, i);
436
+ function verb(n) {
437
+ i[n] = o[n] && function(v) {
438
+ return new Promise(function(resolve, reject) {
439
+ v = o[n](v), settle(resolve, reject, v.done, v.value);
440
+ });
441
+ };
442
+ }
443
+ function settle(resolve, reject, d, v) {
444
+ Promise.resolve(v).then(function(v2) {
445
+ resolve({ value: v2, done: d });
446
+ }, reject);
447
+ }
448
+ }
449
+ class ResultAsync {
450
+ constructor(res) {
451
+ this._promise = res;
452
+ }
453
+ static fromSafePromise(promise) {
454
+ const newPromise = promise.then((value) => new Ok(value));
455
+ return new ResultAsync(newPromise);
456
+ }
457
+ static fromPromise(promise, errorFn) {
458
+ const newPromise = promise.then((value) => new Ok(value)).catch((e) => new Err(errorFn(e)));
459
+ return new ResultAsync(newPromise);
460
+ }
461
+ static fromThrowable(fn, errorFn) {
462
+ return (...args) => {
463
+ return new ResultAsync((() => __awaiter(this, undefined, undefined, function* () {
464
+ try {
465
+ return new Ok(yield fn(...args));
466
+ } catch (error) {
467
+ return new Err(errorFn ? errorFn(error) : error);
468
+ }
469
+ }))());
470
+ };
471
+ }
472
+ static combine(asyncResultList) {
473
+ return combineResultAsyncList(asyncResultList);
474
+ }
475
+ static combineWithAllErrors(asyncResultList) {
476
+ return combineResultAsyncListWithAllErrors(asyncResultList);
477
+ }
478
+ map(f) {
479
+ return new ResultAsync(this._promise.then((res) => __awaiter(this, undefined, undefined, function* () {
480
+ if (res.isErr()) {
481
+ return new Err(res.error);
482
+ }
483
+ return new Ok(yield f(res.value));
484
+ })));
485
+ }
486
+ andThrough(f) {
487
+ return new ResultAsync(this._promise.then((res) => __awaiter(this, undefined, undefined, function* () {
488
+ if (res.isErr()) {
489
+ return new Err(res.error);
490
+ }
491
+ const newRes = yield f(res.value);
492
+ if (newRes.isErr()) {
493
+ return new Err(newRes.error);
494
+ }
495
+ return new Ok(res.value);
496
+ })));
497
+ }
498
+ andTee(f) {
499
+ return new ResultAsync(this._promise.then((res) => __awaiter(this, undefined, undefined, function* () {
500
+ if (res.isErr()) {
501
+ return new Err(res.error);
502
+ }
503
+ try {
504
+ yield f(res.value);
505
+ } catch (e) {}
506
+ return new Ok(res.value);
507
+ })));
508
+ }
509
+ orTee(f) {
510
+ return new ResultAsync(this._promise.then((res) => __awaiter(this, undefined, undefined, function* () {
511
+ if (res.isOk()) {
512
+ return new Ok(res.value);
513
+ }
514
+ try {
515
+ yield f(res.error);
516
+ } catch (e) {}
517
+ return new Err(res.error);
518
+ })));
519
+ }
520
+ mapErr(f) {
521
+ return new ResultAsync(this._promise.then((res) => __awaiter(this, undefined, undefined, function* () {
522
+ if (res.isOk()) {
523
+ return new Ok(res.value);
524
+ }
525
+ return new Err(yield f(res.error));
526
+ })));
527
+ }
528
+ andThen(f) {
529
+ return new ResultAsync(this._promise.then((res) => {
530
+ if (res.isErr()) {
531
+ return new Err(res.error);
532
+ }
533
+ const newValue = f(res.value);
534
+ return newValue instanceof ResultAsync ? newValue._promise : newValue;
535
+ }));
536
+ }
537
+ orElse(f) {
538
+ return new ResultAsync(this._promise.then((res) => __awaiter(this, undefined, undefined, function* () {
539
+ if (res.isErr()) {
540
+ return f(res.error);
541
+ }
542
+ return new Ok(res.value);
543
+ })));
544
+ }
545
+ match(ok, _err) {
546
+ return this._promise.then((res) => res.match(ok, _err));
547
+ }
548
+ unwrapOr(t) {
549
+ return this._promise.then((res) => res.unwrapOr(t));
550
+ }
551
+ safeUnwrap() {
552
+ return __asyncGenerator(this, arguments, function* safeUnwrap_1() {
553
+ return yield __await(yield __await(yield* __asyncDelegator(__asyncValues(yield __await(this._promise.then((res) => res.safeUnwrap()))))));
554
+ });
555
+ }
556
+ then(successCallback, failureCallback) {
557
+ return this._promise.then(successCallback, failureCallback);
558
+ }
559
+ [Symbol.asyncIterator]() {
560
+ return __asyncGenerator(this, arguments, function* _a() {
561
+ const result = yield __await(this._promise);
562
+ if (result.isErr()) {
563
+ yield yield __await(errAsync(result.error));
564
+ }
565
+ return yield __await(result.value);
566
+ });
567
+ }
568
+ }
569
+ function errAsync(err) {
570
+ return new ResultAsync(Promise.resolve(new Err(err)));
571
+ }
572
+ var fromPromise = ResultAsync.fromPromise;
573
+ var fromSafePromise = ResultAsync.fromSafePromise;
574
+ var fromAsyncThrowable = ResultAsync.fromThrowable;
575
+ var combineResultList = (resultList) => {
576
+ let acc = ok([]);
577
+ for (const result of resultList) {
578
+ if (result.isErr()) {
579
+ acc = err(result.error);
580
+ break;
581
+ } else {
582
+ acc.map((list) => list.push(result.value));
583
+ }
584
+ }
585
+ return acc;
586
+ };
587
+ var combineResultAsyncList = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultList);
588
+ var combineResultListWithAllErrors = (resultList) => {
589
+ let acc = ok([]);
590
+ for (const result of resultList) {
591
+ if (result.isErr() && acc.isErr()) {
592
+ acc.error.push(result.error);
593
+ } else if (result.isErr() && acc.isOk()) {
594
+ acc = err([result.error]);
595
+ } else if (result.isOk() && acc.isOk()) {
596
+ acc.value.push(result.value);
597
+ }
598
+ }
599
+ return acc;
600
+ };
601
+ var combineResultAsyncListWithAllErrors = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultListWithAllErrors);
602
+ var Result;
603
+ (function(Result2) {
604
+ function fromThrowable(fn, errorFn) {
605
+ return (...args) => {
606
+ try {
607
+ const result = fn(...args);
608
+ return ok(result);
609
+ } catch (e) {
610
+ return err(errorFn ? errorFn(e) : e);
611
+ }
612
+ };
613
+ }
614
+ Result2.fromThrowable = fromThrowable;
615
+ function combine(resultList) {
616
+ return combineResultList(resultList);
617
+ }
618
+ Result2.combine = combine;
619
+ function combineWithAllErrors(resultList) {
620
+ return combineResultListWithAllErrors(resultList);
621
+ }
622
+ Result2.combineWithAllErrors = combineWithAllErrors;
623
+ })(Result || (Result = {}));
624
+ function ok(value) {
625
+ return new Ok(value);
626
+ }
627
+ function err(err2) {
628
+ return new Err(err2);
629
+ }
630
+ class Ok {
631
+ constructor(value) {
632
+ this.value = value;
633
+ }
634
+ isOk() {
635
+ return true;
636
+ }
637
+ isErr() {
638
+ return !this.isOk();
639
+ }
640
+ map(f) {
641
+ return ok(f(this.value));
642
+ }
643
+ mapErr(_f) {
644
+ return ok(this.value);
645
+ }
646
+ andThen(f) {
647
+ return f(this.value);
648
+ }
649
+ andThrough(f) {
650
+ return f(this.value).map((_value) => this.value);
651
+ }
652
+ andTee(f) {
653
+ try {
654
+ f(this.value);
655
+ } catch (e) {}
656
+ return ok(this.value);
657
+ }
658
+ orTee(_f) {
659
+ return ok(this.value);
660
+ }
661
+ orElse(_f) {
662
+ return ok(this.value);
663
+ }
664
+ asyncAndThen(f) {
665
+ return f(this.value);
666
+ }
667
+ asyncAndThrough(f) {
668
+ return f(this.value).map(() => this.value);
669
+ }
670
+ asyncMap(f) {
671
+ return ResultAsync.fromSafePromise(f(this.value));
672
+ }
673
+ unwrapOr(_v) {
674
+ return this.value;
675
+ }
676
+ match(ok2, _err) {
677
+ return ok2(this.value);
678
+ }
679
+ safeUnwrap() {
680
+ const value = this.value;
681
+ return function* () {
682
+ return value;
683
+ }();
684
+ }
685
+ _unsafeUnwrap(_) {
686
+ return this.value;
687
+ }
688
+ _unsafeUnwrapErr(config) {
689
+ throw createNeverThrowError("Called `_unsafeUnwrapErr` on an Ok", this, config);
690
+ }
691
+ *[Symbol.iterator]() {
692
+ return this.value;
693
+ }
694
+ }
695
+
696
+ class Err {
697
+ constructor(error) {
698
+ this.error = error;
699
+ }
700
+ isOk() {
701
+ return false;
702
+ }
703
+ isErr() {
704
+ return !this.isOk();
705
+ }
706
+ map(_f) {
707
+ return err(this.error);
708
+ }
709
+ mapErr(f) {
710
+ return err(f(this.error));
711
+ }
712
+ andThrough(_f) {
713
+ return err(this.error);
714
+ }
715
+ andTee(_f) {
716
+ return err(this.error);
717
+ }
718
+ orTee(f) {
719
+ try {
720
+ f(this.error);
721
+ } catch (e) {}
722
+ return err(this.error);
723
+ }
724
+ andThen(_f) {
725
+ return err(this.error);
726
+ }
727
+ orElse(f) {
728
+ return f(this.error);
729
+ }
730
+ asyncAndThen(_f) {
731
+ return errAsync(this.error);
732
+ }
733
+ asyncAndThrough(_f) {
734
+ return errAsync(this.error);
735
+ }
736
+ asyncMap(_f) {
737
+ return errAsync(this.error);
738
+ }
739
+ unwrapOr(v) {
740
+ return v;
741
+ }
742
+ match(_ok, err2) {
743
+ return err2(this.error);
744
+ }
745
+ safeUnwrap() {
746
+ const error = this.error;
747
+ return function* () {
748
+ yield err(error);
749
+ throw new Error("Do not use this generator out of `safeTry`");
750
+ }();
751
+ }
752
+ _unsafeUnwrap(config) {
753
+ throw createNeverThrowError("Called `_unsafeUnwrap` on an Err", this, config);
754
+ }
755
+ _unsafeUnwrapErr(_) {
756
+ return this.error;
757
+ }
758
+ *[Symbol.iterator]() {
759
+ const self = this;
760
+ yield self;
761
+ return self;
762
+ }
763
+ }
764
+ var fromThrowable = Result.fromThrowable;
765
+
766
+ // src/VexPacketBase.ts
767
+ var MATCH_STATUS_ALT_ACK = 167;
768
+
769
+ class Packet {
770
+ data;
771
+ static ENCODER;
772
+ constructor(rawData) {
773
+ this.data = rawData instanceof ArrayBuffer ? new Uint8Array(rawData) : rawData;
774
+ }
775
+ }
776
+
777
+ class DeviceBoundPacket extends Packet {
778
+ get commandId() {
779
+ return this.constructor.COMMAND_ID;
780
+ }
781
+ get commandExtendedId() {
782
+ return this.constructor.COMMAND_EXTENDED_ID;
783
+ }
784
+ static COMMAND_ID;
785
+ static COMMAND_EXTENDED_ID;
786
+ constructor(payload) {
787
+ super(new Uint8Array);
788
+ const me = this.constructor;
789
+ if (me.COMMAND_EXTENDED_ID === undefined) {
790
+ if (payload === undefined) {
791
+ this.data = Packet.ENCODER.cdcCommand(me.COMMAND_ID);
792
+ } else {
793
+ this.data = Packet.ENCODER.cdcCommandWithData(me.COMMAND_ID, payload);
794
+ }
795
+ } else {
796
+ if (payload === undefined) {
797
+ this.data = Packet.ENCODER.cdc2Command(me.COMMAND_ID, me.COMMAND_EXTENDED_ID);
798
+ } else {
799
+ this.data = Packet.ENCODER.cdc2CommandWithData(me.COMMAND_ID, me.COMMAND_EXTENDED_ID, payload);
800
+ }
801
+ }
802
+ }
803
+ }
804
+
805
+ class HostBoundPacket extends Packet {
806
+ ack = 255 /* CDC2_NACK */;
807
+ payloadSize;
808
+ ackIndex;
809
+ constructor(data) {
810
+ super(data);
811
+ this.payloadSize = Packet.ENCODER.getPayloadSize(this.data);
812
+ const n = Packet.ENCODER.getHostHeaderLength(this.data);
813
+ this.ack = this.data[this.ackIndex = n + 1];
814
+ }
815
+ static isValidPacket(data, n) {
816
+ const ack = data[n + 1];
817
+ return ack === 118 /* CDC2_ACK */ || ack === MATCH_STATUS_ALT_ACK;
818
+ }
819
+ }
820
+
821
+ // src/VexCRC.ts
822
+ var CRC16TABLE = [
823
+ 0,
824
+ 4129,
825
+ 8258,
826
+ 12387,
827
+ 16516,
828
+ 20645,
829
+ 24774,
830
+ 28903,
831
+ 33032,
832
+ 37161,
833
+ 41290,
834
+ 45419,
835
+ 49548,
836
+ 53677,
837
+ 57806,
838
+ 61935,
839
+ 4657,
840
+ 528,
841
+ 12915,
842
+ 8786,
843
+ 21173,
844
+ 17044,
845
+ 29431,
846
+ 25302,
847
+ 37689,
848
+ 33560,
849
+ 45947,
850
+ 41818,
851
+ 54205,
852
+ 50076,
853
+ 62463,
854
+ 58334,
855
+ 9314,
856
+ 13379,
857
+ 1056,
858
+ 5121,
859
+ 25830,
860
+ 29895,
861
+ 17572,
862
+ 21637,
863
+ 42346,
864
+ 46411,
865
+ 34088,
866
+ 38153,
867
+ 58862,
868
+ 62927,
869
+ 50604,
870
+ 54669,
871
+ 13907,
872
+ 9842,
873
+ 5649,
874
+ 1584,
875
+ 30423,
876
+ 26358,
877
+ 22165,
878
+ 18100,
879
+ 46939,
880
+ 42874,
881
+ 38681,
882
+ 34616,
883
+ 63455,
884
+ 59390,
885
+ 55197,
886
+ 51132,
887
+ 18628,
888
+ 22757,
889
+ 26758,
890
+ 30887,
891
+ 2112,
892
+ 6241,
893
+ 10242,
894
+ 14371,
895
+ 51660,
896
+ 55789,
897
+ 59790,
898
+ 63919,
899
+ 35144,
900
+ 39273,
901
+ 43274,
902
+ 47403,
903
+ 23285,
904
+ 19156,
905
+ 31415,
906
+ 27286,
907
+ 6769,
908
+ 2640,
909
+ 14899,
910
+ 10770,
911
+ 56317,
912
+ 52188,
913
+ 64447,
914
+ 60318,
915
+ 39801,
916
+ 35672,
917
+ 47931,
918
+ 43802,
919
+ 27814,
920
+ 31879,
921
+ 19684,
922
+ 23749,
923
+ 11298,
924
+ 15363,
925
+ 3168,
926
+ 7233,
927
+ 60846,
928
+ 64911,
929
+ 52716,
930
+ 56781,
931
+ 44330,
932
+ 48395,
933
+ 36200,
934
+ 40265,
935
+ 32407,
936
+ 28342,
937
+ 24277,
938
+ 20212,
939
+ 15891,
940
+ 11826,
941
+ 7761,
942
+ 3696,
943
+ 65439,
944
+ 61374,
945
+ 57309,
946
+ 53244,
947
+ 48923,
948
+ 44858,
949
+ 40793,
950
+ 36728,
951
+ 37256,
952
+ 33193,
953
+ 45514,
954
+ 41451,
955
+ 53516,
956
+ 49453,
957
+ 61774,
958
+ 57711,
959
+ 4224,
960
+ 161,
961
+ 12482,
962
+ 8419,
963
+ 20484,
964
+ 16421,
965
+ 28742,
966
+ 24679,
967
+ 33721,
968
+ 37784,
969
+ 41979,
970
+ 46042,
971
+ 49981,
972
+ 54044,
973
+ 58239,
974
+ 62302,
975
+ 689,
976
+ 4752,
977
+ 8947,
978
+ 13010,
979
+ 16949,
980
+ 21012,
981
+ 25207,
982
+ 29270,
983
+ 46570,
984
+ 42443,
985
+ 38312,
986
+ 34185,
987
+ 62830,
988
+ 58703,
989
+ 54572,
990
+ 50445,
991
+ 13538,
992
+ 9411,
993
+ 5280,
994
+ 1153,
995
+ 29798,
996
+ 25671,
997
+ 21540,
998
+ 17413,
999
+ 42971,
1000
+ 47098,
1001
+ 34713,
1002
+ 38840,
1003
+ 59231,
1004
+ 63358,
1005
+ 50973,
1006
+ 55100,
1007
+ 9939,
1008
+ 14066,
1009
+ 1681,
1010
+ 5808,
1011
+ 26199,
1012
+ 30326,
1013
+ 17941,
1014
+ 22068,
1015
+ 55628,
1016
+ 51565,
1017
+ 63758,
1018
+ 59695,
1019
+ 39368,
1020
+ 35305,
1021
+ 47498,
1022
+ 43435,
1023
+ 22596,
1024
+ 18533,
1025
+ 30726,
1026
+ 26663,
1027
+ 6336,
1028
+ 2273,
1029
+ 14466,
1030
+ 10403,
1031
+ 52093,
1032
+ 56156,
1033
+ 60223,
1034
+ 64286,
1035
+ 35833,
1036
+ 39896,
1037
+ 43963,
1038
+ 48026,
1039
+ 19061,
1040
+ 23124,
1041
+ 27191,
1042
+ 31254,
1043
+ 2801,
1044
+ 6864,
1045
+ 10931,
1046
+ 14994,
1047
+ 64814,
1048
+ 60687,
1049
+ 56684,
1050
+ 52557,
1051
+ 48554,
1052
+ 44427,
1053
+ 40424,
1054
+ 36297,
1055
+ 31782,
1056
+ 27655,
1057
+ 23652,
1058
+ 19525,
1059
+ 15522,
1060
+ 11395,
1061
+ 7392,
1062
+ 3265,
1063
+ 61215,
1064
+ 65342,
1065
+ 53085,
1066
+ 57212,
1067
+ 44955,
1068
+ 49082,
1069
+ 36825,
1070
+ 40952,
1071
+ 28183,
1072
+ 32310,
1073
+ 20053,
1074
+ 24180,
1075
+ 11923,
1076
+ 16050,
1077
+ 3793,
1078
+ 7920
1079
+ ];
1080
+
1081
+ class CrcGenerator {
1082
+ crc32Table;
1083
+ static POLYNOMIAL_CRC32 = 79764919;
1084
+ static POLYNOMIAL_CRC16 = 4129;
1085
+ constructor() {
1086
+ this.crc32Table = new Uint32Array(256);
1087
+ this.crc32GenTable();
1088
+ }
1089
+ crc16(buf, initValue) {
1090
+ const numberOfBytes = buf.byteLength;
1091
+ let accumulator = initValue;
1092
+ let i;
1093
+ let j;
1094
+ for (j = 0;j < numberOfBytes; j++) {
1095
+ i = (accumulator >>> 8 ^ buf[j]) & 255;
1096
+ accumulator = (accumulator << 8 ^ CRC16TABLE[i]) >>> 0;
1097
+ }
1098
+ return (accumulator & 65535) >>> 0;
1099
+ }
1100
+ crc32GenTable() {
1101
+ let i;
1102
+ let j;
1103
+ let crcAccumulator;
1104
+ for (i = 0;i < 256; i++) {
1105
+ crcAccumulator = i << 24;
1106
+ for (j = 0;j < 8; j++) {
1107
+ if ((crcAccumulator & 2147483648) !== 0)
1108
+ crcAccumulator = crcAccumulator << 1 ^ CrcGenerator.POLYNOMIAL_CRC32;
1109
+ else
1110
+ crcAccumulator = crcAccumulator << 1;
1111
+ }
1112
+ this.crc32Table[i] = crcAccumulator;
1113
+ }
1114
+ }
1115
+ crc32(buf, initValue) {
1116
+ const numberOfBytes = buf.byteLength;
1117
+ let crcAccumulator = initValue;
1118
+ let i;
1119
+ let j;
1120
+ for (j = 0;j < numberOfBytes; j++) {
1121
+ i = (crcAccumulator >>> 24 ^ buf[j]) & 255;
1122
+ crcAccumulator = (crcAccumulator << 8 ^ this.crc32Table[i]) >>> 0;
1123
+ }
1124
+ return (crcAccumulator & 4294967295) >>> 0;
1125
+ }
1126
+ }
1127
+
1128
+ // src/VexPacketModels.ts
1129
+ var exports_VexPacketModels = {};
1130
+ __export(exports_VexPacketModels, {
1131
+ WriteKeyValueReplyD2HPacket: () => WriteKeyValueReplyD2HPacket,
1132
+ WriteKeyValueH2DPacket: () => WriteKeyValueH2DPacket,
1133
+ WriteFileReplyD2HPacket: () => WriteFileReplyD2HPacket,
1134
+ WriteFileH2DPacket: () => WriteFileH2DPacket,
1135
+ UpdateMatchModeH2DPacket: () => UpdateMatchModeH2DPacket,
1136
+ SystemVersionReplyD2HPacket: () => SystemVersionReplyD2HPacket,
1137
+ SystemVersionH2DPacket: () => SystemVersionH2DPacket,
1138
+ SendDashTouchReplyD2HPacket: () => SendDashTouchReplyD2HPacket,
1139
+ SendDashTouchH2DPacket: () => SendDashTouchH2DPacket,
1140
+ SelectDashReplyD2HPacket: () => SelectDashReplyD2HPacket,
1141
+ SelectDashH2DPacket: () => SelectDashH2DPacket,
1142
+ ScreenCaptureReplyD2HPacket: () => ScreenCaptureReplyD2HPacket,
1143
+ ScreenCaptureH2DPacket: () => ScreenCaptureH2DPacket,
1144
+ ReadLogPageReplyD2HPacket: () => ReadLogPageReplyD2HPacket,
1145
+ ReadLogPageH2DPacket: () => ReadLogPageH2DPacket,
1146
+ ReadKeyValueReplyD2HPacket: () => ReadKeyValueReplyD2HPacket,
1147
+ ReadKeyValueH2DPacket: () => ReadKeyValueH2DPacket,
1148
+ ReadFileReplyD2HPacket: () => ReadFileReplyD2HPacket,
1149
+ ReadFileH2DPacket: () => ReadFileH2DPacket,
1150
+ Query1ReplyD2HPacket: () => Query1ReplyD2HPacket,
1151
+ Query1H2DPacket: () => Query1H2DPacket,
1152
+ MatchStatusReplyD2HPacket: () => MatchStatusReplyD2HPacket,
1153
+ MatchModeReplyD2HPacket: () => MatchModeReplyD2HPacket,
1154
+ LoadFileActionReplyD2HPacket: () => LoadFileActionReplyD2HPacket,
1155
+ LoadFileActionH2DPacket: () => LoadFileActionH2DPacket,
1156
+ LinkFileReplyD2HPacket: () => LinkFileReplyD2HPacket,
1157
+ LinkFileH2DPacket: () => LinkFileH2DPacket,
1158
+ InitFileTransferReplyD2HPacket: () => InitFileTransferReplyD2HPacket,
1159
+ InitFileTransferH2DPacket: () => InitFileTransferH2DPacket,
1160
+ GetSystemStatusReplyD2HPacket: () => GetSystemStatusReplyD2HPacket,
1161
+ GetSystemStatusH2DPacket: () => GetSystemStatusH2DPacket,
1162
+ GetSystemFlagsReplyD2HPacket: () => GetSystemFlagsReplyD2HPacket,
1163
+ GetSystemFlagsH2DPacket: () => GetSystemFlagsH2DPacket,
1164
+ GetSlot5to8InfoReplyD2HPacket: () => GetSlot5to8InfoReplyD2HPacket,
1165
+ GetSlot5to8InfoH2DPacket: () => GetSlot5to8InfoH2DPacket,
1166
+ GetSlot1to4InfoReplyD2HPacket: () => GetSlot1to4InfoReplyD2HPacket,
1167
+ GetSlot1to4InfoH2DPacket: () => GetSlot1to4InfoH2DPacket,
1168
+ GetRadioStatusReplyD2HPacket: () => GetRadioStatusReplyD2HPacket,
1169
+ GetRadioStatusH2DPacket: () => GetRadioStatusH2DPacket,
1170
+ GetRadioModeH2DPacket: () => GetRadioModeH2DPacket,
1171
+ GetProgramSlotInfoReplyD2HPacket: () => GetProgramSlotInfoReplyD2HPacket,
1172
+ GetProgramSlotInfoH2DPacket: () => GetProgramSlotInfoH2DPacket,
1173
+ GetMatchStatusH2DPacket: () => GetMatchStatusH2DPacket,
1174
+ GetLogCountReplyD2HPacket: () => GetLogCountReplyD2HPacket,
1175
+ GetLogCountH2DPacket: () => GetLogCountH2DPacket,
1176
+ GetFileMetadataReplyD2HPacket: () => GetFileMetadataReplyD2HPacket,
1177
+ GetFileMetadataH2DPacket: () => GetFileMetadataH2DPacket,
1178
+ GetFdtStatusReplyD2HPacket: () => GetFdtStatusReplyD2HPacket,
1179
+ GetFdtStatusH2DPacket: () => GetFdtStatusH2DPacket,
1180
+ GetDirectoryFileCountReplyD2HPacket: () => GetDirectoryFileCountReplyD2HPacket,
1181
+ GetDirectoryFileCountH2DPacket: () => GetDirectoryFileCountH2DPacket,
1182
+ GetDirectoryEntryReplyD2HPacket: () => GetDirectoryEntryReplyD2HPacket,
1183
+ GetDirectoryEntryH2DPacket: () => GetDirectoryEntryH2DPacket,
1184
+ GetDeviceStatusReplyD2HPacket: () => GetDeviceStatusReplyD2HPacket,
1185
+ GetDeviceStatusH2DPacket: () => GetDeviceStatusH2DPacket,
1186
+ FileFormatReplyD2HPacket: () => FileFormatReplyD2HPacket,
1187
+ FileFormatH2DPacket: () => FileFormatH2DPacket,
1188
+ FileControlReplyD2HPacket: () => FileControlReplyD2HPacket,
1189
+ FileControlH2DPacket: () => FileControlH2DPacket,
1190
+ FileClearUpReplyD2HPacket: () => FileClearUpReplyD2HPacket,
1191
+ FileClearUpH2DPacket: () => FileClearUpH2DPacket,
1192
+ FactoryStatusReplyD2HPacket: () => FactoryStatusReplyD2HPacket,
1193
+ FactoryStatusH2DPacket: () => FactoryStatusH2DPacket,
1194
+ FactoryEnableReplyD2HPacket: () => FactoryEnableReplyD2HPacket,
1195
+ FactoryEnableH2DPacket: () => FactoryEnableH2DPacket,
1196
+ ExitFileTransferReplyD2HPacket: () => ExitFileTransferReplyD2HPacket,
1197
+ ExitFileTransferH2DPacket: () => ExitFileTransferH2DPacket,
1198
+ EraseFileReplyD2HPacket: () => EraseFileReplyD2HPacket,
1199
+ EraseFileH2DPacket: () => EraseFileH2DPacket
1200
+ });
1201
+
1202
+ // src/VexFirmwareVersion.ts
1203
+ class VexFirmwareVersion {
1204
+ major;
1205
+ minor;
1206
+ build;
1207
+ beta;
1208
+ constructor(major, minor, build, beta) {
1209
+ this.major = major;
1210
+ this.minor = minor;
1211
+ this.build = build;
1212
+ this.beta = beta;
1213
+ }
1214
+ static fromString(version) {
1215
+ const parts = version.toLowerCase().replace(/b/g, "").split(".").map((x) => parseInt(x, 10));
1216
+ while (parts.length < 4) {
1217
+ parts.push(0);
1218
+ }
1219
+ return new VexFirmwareVersion(parts[0], parts[1], parts[2], parts[3]);
1220
+ }
1221
+ static fromUint8Array(data, offset = 0, reverse = false) {
1222
+ return new VexFirmwareVersion(data[offset + (reverse ? 3 : 0)], data[offset + (reverse ? 2 : 1)], data[offset + (reverse ? 1 : 2)], data[offset + (reverse ? 0 : 3)]);
1223
+ }
1224
+ static allZero() {
1225
+ return new VexFirmwareVersion(0, 0, 0, 0);
1226
+ }
1227
+ static fromCatalogString(version) {
1228
+ return VexFirmwareVersion.fromString(version.replace(/_/g, "."));
1229
+ }
1230
+ isBeta() {
1231
+ return this.beta !== 0;
1232
+ }
1233
+ toUint8Array(reverse = false) {
1234
+ const data = new Uint8Array(4);
1235
+ data[reverse ? 3 : 0] = this.major;
1236
+ data[reverse ? 2 : 1] = this.minor;
1237
+ data[reverse ? 1 : 2] = this.build;
1238
+ data[reverse ? 0 : 3] = this.beta;
1239
+ return data;
1240
+ }
1241
+ toUserString() {
1242
+ return `${this.major}.${this.minor}.${this.build}`;
1243
+ }
1244
+ toInternalString() {
1245
+ return `${this.toUserString()}.b${this.beta}`;
1246
+ }
1247
+ compare(that) {
1248
+ const majorComp = this.major - that.major;
1249
+ const minorComp = this.minor - that.minor;
1250
+ const buildComp = this.build - that.build;
1251
+ const betaComp = this.beta - that.beta;
1252
+ if (majorComp !== 0) {
1253
+ return majorComp;
1254
+ } else if (minorComp !== 0) {
1255
+ return minorComp;
1256
+ } else if (buildComp !== 0) {
1257
+ return buildComp;
1258
+ } else if (betaComp !== 0) {
1259
+ return betaComp;
1260
+ }
1261
+ return 0;
1262
+ }
1263
+ }
1264
+
1265
+ // src/VexPacketView.ts
1266
+ class PacketView extends DataView {
1267
+ position = 0;
1268
+ littleEndianDefault = true;
1269
+ constructor(buffer, offset = 0, length = buffer.byteLength - offset) {
1270
+ super(buffer, offset, length);
1271
+ }
1272
+ static fromPacket(packet) {
1273
+ const view = new PacketView(packet.data.buffer, packet.data.byteOffset);
1274
+ view.position = packet.ackIndex + 1;
1275
+ return view;
1276
+ }
1277
+ nextInt8() {
1278
+ const result = this.getInt8(this.position);
1279
+ this.position += 1;
1280
+ return result;
1281
+ }
1282
+ nextUint8() {
1283
+ const result = this.getUint8(this.position);
1284
+ this.position += 1;
1285
+ return result;
1286
+ }
1287
+ nextInt16(littleEndian = this.littleEndianDefault) {
1288
+ const result = this.getInt16(this.position, littleEndian);
1289
+ this.position += 2;
1290
+ return result;
1291
+ }
1292
+ nextUint16(littleEndian = this.littleEndianDefault) {
1293
+ const result = this.getUint16(this.position, littleEndian);
1294
+ this.position += 2;
1295
+ return result;
1296
+ }
1297
+ nextInt32(littleEndian = this.littleEndianDefault) {
1298
+ const result = this.getInt32(this.position, littleEndian);
1299
+ this.position += 4;
1300
+ return result;
1301
+ }
1302
+ nextUint32(littleEndian = this.littleEndianDefault) {
1303
+ const result = this.getUint32(this.position, littleEndian);
1304
+ this.position += 4;
1305
+ return result;
1306
+ }
1307
+ nextString(length) {
1308
+ let result = "";
1309
+ for (let i = 0;i < length; i++) {
1310
+ result += String.fromCharCode(this.nextUint8());
1311
+ }
1312
+ return result;
1313
+ }
1314
+ nextNTBS(length) {
1315
+ let result = "";
1316
+ const lastPosition = this.position;
1317
+ for (let i = 0;i < length; i++) {
1318
+ if (this.byteLength <= this.position)
1319
+ break;
1320
+ const g = this.nextUint8();
1321
+ if (g === 0)
1322
+ break;
1323
+ result += String.fromCharCode(g);
1324
+ }
1325
+ this.position = lastPosition + length;
1326
+ return result;
1327
+ }
1328
+ nextVarNTBS(length) {
1329
+ let result = "";
1330
+ for (let i = 0;i < length; i++) {
1331
+ if (this.byteLength <= this.position)
1332
+ break;
1333
+ const g = this.nextUint8();
1334
+ if (g === 0)
1335
+ break;
1336
+ result += String.fromCharCode(g);
1337
+ }
1338
+ return result;
1339
+ }
1340
+ nextVersion(reverse = false) {
1341
+ const result = VexFirmwareVersion.fromUint8Array(new Uint8Array(this.buffer, this.byteOffset, this.byteLength), this.position, reverse);
1342
+ this.position += 4;
1343
+ return result;
1344
+ }
1345
+ }
1346
+
1347
+ // src/VexPacketModels.ts
1348
+ var textEncoder = new TextEncoder;
1349
+
1350
+ class Query1H2DPacket extends DeviceBoundPacket {
1351
+ static COMMAND_ID = 33;
1352
+ static COMMAND_EXTENDED_ID = undefined;
1353
+ constructor() {
1354
+ super(undefined);
1355
+ }
1356
+ }
1357
+
1358
+ class SystemVersionH2DPacket extends DeviceBoundPacket {
1359
+ static COMMAND_ID = 164;
1360
+ static COMMAND_EXTENDED_ID = undefined;
1361
+ constructor() {
1362
+ super(undefined);
1363
+ }
1364
+ }
1365
+
1366
+ class UpdateMatchModeH2DPacket extends DeviceBoundPacket {
1367
+ static COMMAND_ID = 88;
1368
+ static COMMAND_EXTENDED_ID = 193;
1369
+ constructor(mode, matchClock) {
1370
+ let bit1;
1371
+ switch (mode) {
1372
+ case "autonomous":
1373
+ bit1 = 10;
1374
+ break;
1375
+ case "driver":
1376
+ bit1 = 8;
1377
+ break;
1378
+ case "disabled":
1379
+ bit1 = 11;
1380
+ }
1381
+ const payload = new Uint8Array(5);
1382
+ const view = new DataView(payload.buffer);
1383
+ payload[0] = (15 & bit1) >>> 0;
1384
+ view.setUint32(1, matchClock, true);
1385
+ super(payload);
1386
+ }
1387
+ }
1388
+
1389
+ class GetMatchStatusH2DPacket extends DeviceBoundPacket {
1390
+ static COMMAND_ID = 88;
1391
+ static COMMAND_EXTENDED_ID = 194;
1392
+ constructor() {
1393
+ super(undefined);
1394
+ }
1395
+ }
1396
+
1397
+ class GetRadioModeH2DPacket extends DeviceBoundPacket {
1398
+ static COMMAND_ID = 88;
1399
+ static COMMAND_EXTENDED_ID = 65;
1400
+ constructor(mode) {
1401
+ const payload = new Uint8Array(1);
1402
+ payload[0] = mode;
1403
+ super(payload);
1404
+ }
1405
+ }
1406
+
1407
+ class FileControlH2DPacket extends DeviceBoundPacket {
1408
+ static COMMAND_ID = 86;
1409
+ static COMMAND_EXTENDED_ID = 16;
1410
+ constructor(a, b) {
1411
+ const payload = new Uint8Array(2);
1412
+ payload.set([a, b], 0);
1413
+ super(payload);
1414
+ }
1415
+ }
1416
+
1417
+ class InitFileTransferH2DPacket extends DeviceBoundPacket {
1418
+ static COMMAND_ID = 86;
1419
+ static COMMAND_EXTENDED_ID = 17;
1420
+ constructor(operation, target, vendor, options, binary, addr, name, type, version = new VexFirmwareVersion(1, 0, 0, 0)) {
1421
+ const payload = new Uint8Array(52);
1422
+ const view = new DataView(payload.buffer);
1423
+ view.setUint8(0, operation);
1424
+ view.setUint8(1, target);
1425
+ view.setUint8(2, vendor);
1426
+ view.setUint8(3, options);
1427
+ view.setUint32(4, binary.length, true);
1428
+ view.setUint32(8, addr, true);
1429
+ view.setUint32(12, operation === 1 /* WRITE */ ? Packet.ENCODER.crcgen.crc32(binary, 0) : 0, true);
1430
+ const re = /(?:\.([^.]+))?$/;
1431
+ const reResult = re.exec(name);
1432
+ let ext = reResult != null ? reResult[1] : undefined;
1433
+ ext ??= "";
1434
+ ext = ext === "gz" ? "bin" : ext;
1435
+ payload.set(encodeFixedText(type ?? ext, "File type", 4), 16);
1436
+ const timestamp = (Date.now() / 1000 >>> 0) - PacketEncoder.J2000_EPOCH;
1437
+ view.setUint32(20, timestamp, true);
1438
+ payload.set(version.toUint8Array(), 24);
1439
+ const nameEncoded = encodeFixedText(name, "Filename", 23);
1440
+ payload.set(nameEncoded, 28);
1441
+ view.setUint8(51, 0);
1442
+ super(payload);
1443
+ }
1444
+ }
1445
+
1446
+ class ExitFileTransferH2DPacket extends DeviceBoundPacket {
1447
+ static COMMAND_ID = 86;
1448
+ static COMMAND_EXTENDED_ID = 18;
1449
+ constructor(action) {
1450
+ const payload = new Uint8Array(1);
1451
+ payload[0] = action;
1452
+ super(payload);
1453
+ }
1454
+ }
1455
+
1456
+ class WriteFileH2DPacket extends DeviceBoundPacket {
1457
+ static COMMAND_ID = 86;
1458
+ static COMMAND_EXTENDED_ID = 19;
1459
+ constructor(addr, buf) {
1460
+ const payload = new Uint8Array(4 + buf.length);
1461
+ const view = new DataView(payload.buffer);
1462
+ view.setUint32(0, addr, true);
1463
+ payload.set(buf, 4);
1464
+ super(payload);
1465
+ }
1466
+ }
1467
+
1468
+ class ReadFileH2DPacket extends DeviceBoundPacket {
1469
+ static COMMAND_ID = 86;
1470
+ static COMMAND_EXTENDED_ID = 20;
1471
+ constructor(addr, size) {
1472
+ const payload = new Uint8Array(6);
1473
+ const view = new DataView(payload.buffer);
1474
+ view.setUint32(0, addr, true);
1475
+ view.setUint16(4, size, true);
1476
+ super(payload);
1477
+ }
1478
+ }
1479
+
1480
+ class LinkFileH2DPacket extends DeviceBoundPacket {
1481
+ static COMMAND_ID = 86;
1482
+ static COMMAND_EXTENDED_ID = 21;
1483
+ constructor(vendor, fileName, options) {
1484
+ const str = encodeFixedText(fileName, "Filename", 23);
1485
+ const payload = new Uint8Array(26);
1486
+ payload.set([vendor, options], 0);
1487
+ payload.set(str, 2);
1488
+ super(payload);
1489
+ }
1490
+ }
1491
+
1492
+ class GetDirectoryFileCountH2DPacket extends DeviceBoundPacket {
1493
+ static COMMAND_ID = 86;
1494
+ static COMMAND_EXTENDED_ID = 22;
1495
+ constructor(vendor) {
1496
+ const payload = new Uint8Array(2);
1497
+ payload.set([vendor, 0], 0);
1498
+ super(payload);
1499
+ }
1500
+ }
1501
+
1502
+ class GetDirectoryEntryH2DPacket extends DeviceBoundPacket {
1503
+ static COMMAND_ID = 86;
1504
+ static COMMAND_EXTENDED_ID = 23;
1505
+ constructor(index) {
1506
+ const payload = new Uint8Array(2);
1507
+ payload.set([index, 0], 0);
1508
+ super(payload);
1509
+ }
1510
+ }
1511
+
1512
+ class LoadFileActionH2DPacket extends DeviceBoundPacket {
1513
+ static COMMAND_ID = 86;
1514
+ static COMMAND_EXTENDED_ID = 24;
1515
+ constructor(vendor, actionId, fileNameOrSlotNumber) {
1516
+ let fileName;
1517
+ if (typeof fileNameOrSlotNumber === "string") {
1518
+ fileName = fileNameOrSlotNumber;
1519
+ } else {
1520
+ fileName = "___s_" + (fileNameOrSlotNumber - 1) + ".bin";
1521
+ }
1522
+ const encodedName = encodeFixedText(fileName, "Filename", 23);
1523
+ const payload = new Uint8Array(26);
1524
+ payload.set([vendor, actionId], 0);
1525
+ payload.set(encodedName, 2);
1526
+ super(payload);
1527
+ }
1528
+ }
1529
+
1530
+ class GetFileMetadataH2DPacket extends DeviceBoundPacket {
1531
+ static COMMAND_ID = 86;
1532
+ static COMMAND_EXTENDED_ID = 25;
1533
+ constructor(vendor, fileName, options) {
1534
+ const encodedName = encodeFixedText(fileName, "Filename", 23);
1535
+ const payload = new Uint8Array(26);
1536
+ payload.set([vendor, options], 0);
1537
+ payload.set(encodedName, 2);
1538
+ super(payload);
1539
+ }
1540
+ }
1541
+
1542
+ class EraseFileH2DPacket extends DeviceBoundPacket {
1543
+ static COMMAND_ID = 86;
1544
+ static COMMAND_EXTENDED_ID = 27;
1545
+ constructor(vendor, fileName) {
1546
+ const encodedName = encodeFixedText(fileName, "Filename", 23);
1547
+ const payload = new Uint8Array(26);
1548
+ payload.set([vendor, 128], 0);
1549
+ payload.set(encodedName, 2);
1550
+ super(payload);
1551
+ }
1552
+ }
1553
+
1554
+ class GetProgramSlotInfoH2DPacket extends DeviceBoundPacket {
1555
+ static COMMAND_ID = 86;
1556
+ static COMMAND_EXTENDED_ID = 28;
1557
+ constructor(vendor, fileName) {
1558
+ const encodedName = encodeFixedText(fileName, "Filename", 23);
1559
+ const payload = new Uint8Array(26);
1560
+ payload.set([vendor, 0], 0);
1561
+ payload.set(encodedName, 2);
1562
+ super(payload);
1563
+ }
1564
+ }
1565
+
1566
+ class FileClearUpH2DPacket extends DeviceBoundPacket {
1567
+ static COMMAND_ID = 86;
1568
+ static COMMAND_EXTENDED_ID = 30;
1569
+ constructor(vendor) {
1570
+ const payload = new Uint8Array(2);
1571
+ payload.set([vendor, 0], 0);
1572
+ super(payload);
1573
+ }
1574
+ }
1575
+
1576
+ class FileFormatH2DPacket extends DeviceBoundPacket {
1577
+ static COMMAND_ID = 86;
1578
+ static COMMAND_EXTENDED_ID = 31;
1579
+ constructor() {
1580
+ const payload = new Uint8Array(4);
1581
+ payload.set([68, 67, 66, 65], 0);
1582
+ super(payload);
1583
+ }
1584
+ }
1585
+
1586
+ class GetSystemFlagsH2DPacket extends DeviceBoundPacket {
1587
+ static COMMAND_ID = 86;
1588
+ static COMMAND_EXTENDED_ID = 32;
1589
+ }
1590
+
1591
+ class GetDeviceStatusH2DPacket extends DeviceBoundPacket {
1592
+ static COMMAND_ID = 86;
1593
+ static COMMAND_EXTENDED_ID = 33;
1594
+ constructor() {
1595
+ super(undefined);
1596
+ }
1597
+ }
1598
+
1599
+ class GetSystemStatusH2DPacket extends DeviceBoundPacket {
1600
+ static COMMAND_ID = 86;
1601
+ static COMMAND_EXTENDED_ID = 34;
1602
+ constructor() {
1603
+ super(undefined);
1604
+ }
1605
+ }
1606
+
1607
+ class GetFdtStatusH2DPacket extends DeviceBoundPacket {
1608
+ static COMMAND_ID = 86;
1609
+ static COMMAND_EXTENDED_ID = 35;
1610
+ constructor() {
1611
+ super(undefined);
1612
+ }
1613
+ }
1614
+
1615
+ class GetLogCountH2DPacket extends DeviceBoundPacket {
1616
+ static COMMAND_ID = 86;
1617
+ static COMMAND_EXTENDED_ID = 36;
1618
+ constructor() {
1619
+ super(undefined);
1620
+ }
1621
+ }
1622
+
1623
+ class ReadLogPageH2DPacket extends DeviceBoundPacket {
1624
+ static COMMAND_ID = 86;
1625
+ static COMMAND_EXTENDED_ID = 37;
1626
+ constructor(offset, count) {
1627
+ const payload = new Uint8Array(8);
1628
+ const view = new DataView(payload.buffer);
1629
+ view.setUint32(0, offset, true);
1630
+ view.setUint32(4, count, true);
1631
+ super(payload);
1632
+ }
1633
+ }
1634
+
1635
+ class GetRadioStatusH2DPacket extends DeviceBoundPacket {
1636
+ static COMMAND_ID = 86;
1637
+ static COMMAND_EXTENDED_ID = 38;
1638
+ constructor() {
1639
+ super(undefined);
1640
+ }
1641
+ }
1642
+
1643
+ class ScreenCaptureH2DPacket extends DeviceBoundPacket {
1644
+ static COMMAND_ID = 86;
1645
+ static COMMAND_EXTENDED_ID = 40;
1646
+ constructor(e) {
1647
+ const payload = new Uint8Array(1);
1648
+ payload[0] = e;
1649
+ super(payload);
1650
+ }
1651
+ }
1652
+
1653
+ class SendDashTouchH2DPacket extends DeviceBoundPacket {
1654
+ static COMMAND_ID = 86;
1655
+ static COMMAND_EXTENDED_ID = 42;
1656
+ constructor(x, y, press) {
1657
+ const payload = new Uint8Array(6);
1658
+ const view = new DataView(payload.buffer);
1659
+ view.setUint16(0, x, true);
1660
+ view.setUint16(2, y, true);
1661
+ view.setUint16(4, press ? 1 : 0, true);
1662
+ super(payload);
1663
+ }
1664
+ }
1665
+
1666
+ class SelectDashH2DPacket extends DeviceBoundPacket {
1667
+ static COMMAND_ID = 86;
1668
+ static COMMAND_EXTENDED_ID = 43;
1669
+ constructor(screen, port) {
1670
+ const payload = new Uint8Array(2);
1671
+ payload[0] = screen;
1672
+ payload[1] = port;
1673
+ super(payload);
1674
+ }
1675
+ }
1676
+
1677
+ class ReadKeyValueH2DPacket extends DeviceBoundPacket {
1678
+ static COMMAND_ID = 86;
1679
+ static COMMAND_EXTENDED_ID = 46;
1680
+ constructor(key) {
1681
+ const encodedKey = encodeFixedText(key, "Key", 31);
1682
+ const payload = new Uint8Array(32);
1683
+ payload.set(encodedKey, 0);
1684
+ super(payload);
1685
+ }
1686
+ }
1687
+
1688
+ class WriteKeyValueH2DPacket extends DeviceBoundPacket {
1689
+ static COMMAND_ID = 86;
1690
+ static COMMAND_EXTENDED_ID = 47;
1691
+ constructor(key, value) {
1692
+ const strk = encodeFixedText(key, "Key", 31);
1693
+ const strv = textEncoder.encode(value);
1694
+ if (strk.byteLength + strv.byteLength + 20 > 32767) {
1695
+ throw new RangeError("Key and value are too large for a protocol packet");
1696
+ }
1697
+ const payload = new Uint8Array(strk.length + strv.length + 20);
1698
+ payload.set(strk, 0);
1699
+ payload.set(strv, strk.length + 1);
1700
+ super(payload);
1701
+ }
1702
+ }
1703
+
1704
+ class GetSlot1to4InfoH2DPacket extends DeviceBoundPacket {
1705
+ static COMMAND_ID = 86;
1706
+ static COMMAND_EXTENDED_ID = 49;
1707
+ constructor() {
1708
+ super(undefined);
1709
+ }
1710
+ }
1711
+
1712
+ class GetSlot5to8InfoH2DPacket extends DeviceBoundPacket {
1713
+ static COMMAND_ID = 86;
1714
+ static COMMAND_EXTENDED_ID = 50;
1715
+ constructor() {
1716
+ super(undefined);
1717
+ }
1718
+ }
1719
+
1720
+ class FactoryStatusH2DPacket extends DeviceBoundPacket {
1721
+ static COMMAND_ID = 86;
1722
+ static COMMAND_EXTENDED_ID = 241;
1723
+ }
1724
+
1725
+ class FactoryEnableH2DPacket extends DeviceBoundPacket {
1726
+ static COMMAND_ID = 86;
1727
+ static COMMAND_EXTENDED_ID = 255;
1728
+ constructor() {
1729
+ const payload = new Uint8Array(4);
1730
+ payload.set([77, 76, 75, 74], 0);
1731
+ super(payload);
1732
+ }
1733
+ }
1734
+
1735
+ class Query1ReplyD2HPacket extends HostBoundPacket {
1736
+ static COMMAND_ID = 33;
1737
+ static COMMAND_EXTENDED_ID = undefined;
1738
+ joystickFlag1;
1739
+ joystickFlag2;
1740
+ brainFlag1;
1741
+ brainFlag2;
1742
+ bootloadFlag1;
1743
+ bootloadFlag2;
1744
+ constructor(data) {
1745
+ super(data);
1746
+ this.joystickFlag1 = this.data[4];
1747
+ this.joystickFlag2 = this.data[5];
1748
+ this.brainFlag1 = this.data[6];
1749
+ this.brainFlag2 = this.data[7];
1750
+ this.bootloadFlag1 = this.data[10];
1751
+ this.bootloadFlag2 = this.data[11];
1752
+ }
1753
+ }
1754
+
1755
+ class SystemVersionReplyD2HPacket extends HostBoundPacket {
1756
+ static COMMAND_ID = 164;
1757
+ static COMMAND_EXTENDED_ID = undefined;
1758
+ version;
1759
+ hardware;
1760
+ constructor(data) {
1761
+ super(data);
1762
+ this.version = new VexFirmwareVersion(this.data[4], this.data[5], this.data[6], this.data[8]);
1763
+ this.hardware = this.data[7];
1764
+ }
1765
+ }
1766
+
1767
+ class MatchModeReplyD2HPacket extends HostBoundPacket {
1768
+ static COMMAND_ID = 88;
1769
+ static COMMAND_EXTENDED_ID = 193;
1770
+ modebit;
1771
+ constructor(data) {
1772
+ super(data);
1773
+ const dataView = PacketView.fromPacket(this);
1774
+ this.modebit = dataView.nextUint8();
1775
+ }
1776
+ }
1777
+
1778
+ class MatchStatusReplyD2HPacket extends HostBoundPacket {
1779
+ static COMMAND_ID = 88;
1780
+ static COMMAND_EXTENDED_ID = 194;
1781
+ rssi;
1782
+ systemStatusBits;
1783
+ radioStatusBits;
1784
+ fieldStatusBits;
1785
+ matchClock;
1786
+ brainBatteryPercent;
1787
+ controllerBatteryPercent;
1788
+ partnerControllerBatteryPercent;
1789
+ pad;
1790
+ buttons;
1791
+ activeProgram;
1792
+ radioType;
1793
+ radioChannel;
1794
+ radioSlot;
1795
+ robotName;
1796
+ controllerFlags;
1797
+ rxSignalQuality;
1798
+ constructor(data) {
1799
+ super(data);
1800
+ const dataView = PacketView.fromPacket(this);
1801
+ const n = this.ackIndex;
1802
+ this.rssi = dataView.nextInt8();
1803
+ this.systemStatusBits = dataView.nextUint16();
1804
+ this.radioStatusBits = dataView.nextUint16();
1805
+ this.fieldStatusBits = dataView.nextUint8();
1806
+ this.matchClock = dataView.nextUint8();
1807
+ this.brainBatteryPercent = dataView.nextUint8();
1808
+ this.controllerBatteryPercent = dataView.nextUint8();
1809
+ this.partnerControllerBatteryPercent = dataView.nextUint8();
1810
+ this.pad = dataView.nextUint8();
1811
+ this.buttons = dataView.nextUint16();
1812
+ this.activeProgram = dataView.nextUint8();
1813
+ this.radioType = dataView.nextUint8();
1814
+ this.radioChannel = dataView.nextUint8();
1815
+ this.radioSlot = dataView.nextUint8();
1816
+ this.robotName = dataView.nextNTBS(10);
1817
+ this.controllerFlags = dataView.getUint8(n + 28);
1818
+ this.rxSignalQuality = dataView.getUint8(n + 29);
1819
+ let rawStr = new TextDecoder("UTF-8").decode(data.slice(n + 18, n + this.payloadSize + 28));
1820
+ const endIdx = rawStr.indexOf("\x00");
1821
+ if (endIdx > -1) {
1822
+ rawStr = rawStr.substr(0, endIdx);
1823
+ }
1824
+ this.robotName = rawStr;
1825
+ }
1826
+ }
1827
+
1828
+ class FileControlReplyD2HPacket extends HostBoundPacket {
1829
+ static COMMAND_ID = 86;
1830
+ static COMMAND_EXTENDED_ID = 16;
1831
+ }
1832
+
1833
+ class InitFileTransferReplyD2HPacket extends HostBoundPacket {
1834
+ static COMMAND_ID = 86;
1835
+ static COMMAND_EXTENDED_ID = 17;
1836
+ windowSize;
1837
+ fileSize;
1838
+ crc32;
1839
+ constructor(data) {
1840
+ super(data);
1841
+ const dataView = PacketView.fromPacket(this);
1842
+ this.windowSize = dataView.nextUint16();
1843
+ this.fileSize = dataView.nextUint32();
1844
+ this.crc32 = dataView.nextUint32();
1845
+ }
1846
+ }
1847
+
1848
+ class ExitFileTransferReplyD2HPacket extends HostBoundPacket {
1849
+ static COMMAND_ID = 86;
1850
+ static COMMAND_EXTENDED_ID = 18;
1851
+ }
1852
+
1853
+ class WriteFileReplyD2HPacket extends HostBoundPacket {
1854
+ static COMMAND_ID = 86;
1855
+ static COMMAND_EXTENDED_ID = 19;
1856
+ }
1857
+
1858
+ class ReadFileReplyD2HPacket extends HostBoundPacket {
1859
+ static COMMAND_ID = 86;
1860
+ static COMMAND_EXTENDED_ID = 20;
1861
+ addr;
1862
+ length;
1863
+ buf;
1864
+ constructor(data) {
1865
+ super(data);
1866
+ const dataView = PacketView.fromPacket(this);
1867
+ this.addr = dataView.nextUint32();
1868
+ this.length = this.payloadSize - 8;
1869
+ this.buf = this.data.slice(dataView.position, dataView.position + this.length).buffer;
1870
+ }
1871
+ static isValidPacket(data, n) {
1872
+ return super.isValidPacket(data, n);
1873
+ }
1874
+ }
1875
+
1876
+ class LinkFileReplyD2HPacket extends HostBoundPacket {
1877
+ static COMMAND_ID = 86;
1878
+ static COMMAND_EXTENDED_ID = 21;
1879
+ }
1880
+
1881
+ class GetDirectoryFileCountReplyD2HPacket extends HostBoundPacket {
1882
+ static COMMAND_ID = 86;
1883
+ static COMMAND_EXTENDED_ID = 22;
1884
+ count;
1885
+ constructor(data) {
1886
+ super(data);
1887
+ const dataView = PacketView.fromPacket(this);
1888
+ this.count = dataView.nextUint16();
1889
+ }
1890
+ }
1891
+
1892
+ class GetDirectoryEntryReplyD2HPacket extends HostBoundPacket {
1893
+ static COMMAND_ID = 86;
1894
+ static COMMAND_EXTENDED_ID = 23;
1895
+ file;
1896
+ constructor(data) {
1897
+ super(data);
1898
+ const dataView = PacketView.fromPacket(this);
1899
+ if (this.payloadSize > 4) {
1900
+ this.file = {
1901
+ index: dataView.nextUint8(),
1902
+ size: dataView.nextUint32(),
1903
+ loadAddress: dataView.nextUint32(),
1904
+ crc32: dataView.nextUint32(),
1905
+ type: dataView.nextString(4),
1906
+ timestamp: dataView.nextUint32() + PacketEncoder.J2000_EPOCH,
1907
+ version: dataView.nextVersion(),
1908
+ filename: dataView.nextNTBS(32)
1909
+ };
1910
+ }
1911
+ }
1912
+ }
1913
+
1914
+ class LoadFileActionReplyD2HPacket extends HostBoundPacket {
1915
+ static COMMAND_ID = 86;
1916
+ static COMMAND_EXTENDED_ID = 24;
1917
+ }
1918
+
1919
+ class GetFileMetadataReplyD2HPacket extends HostBoundPacket {
1920
+ static COMMAND_ID = 86;
1921
+ static COMMAND_EXTENDED_ID = 25;
1922
+ file;
1923
+ constructor(data) {
1924
+ super(data);
1925
+ const dataView = PacketView.fromPacket(this);
1926
+ dataView.nextUint8();
1927
+ if (this.payloadSize > 4) {
1928
+ this.file = {
1929
+ size: dataView.nextUint32(),
1930
+ loadAddress: dataView.nextUint32(),
1931
+ crc32: dataView.nextUint32(),
1932
+ type: dataView.nextString(4),
1933
+ timestamp: dataView.nextUint32() + PacketEncoder.J2000_EPOCH,
1934
+ version: dataView.nextVersion()
1935
+ };
1936
+ }
1937
+ }
1938
+ }
1939
+
1940
+ class EraseFileReplyD2HPacket extends HostBoundPacket {
1941
+ static COMMAND_ID = 86;
1942
+ static COMMAND_EXTENDED_ID = 27;
1943
+ }
1944
+
1945
+ class GetProgramSlotInfoReplyD2HPacket extends HostBoundPacket {
1946
+ static COMMAND_ID = 86;
1947
+ static COMMAND_EXTENDED_ID = 28;
1948
+ requestedSlot;
1949
+ slot;
1950
+ constructor(data) {
1951
+ super(data);
1952
+ const dataView = PacketView.fromPacket(this);
1953
+ this.slot = dataView.nextUint8();
1954
+ this.requestedSlot = dataView.nextUint8();
1955
+ }
1956
+ }
1957
+
1958
+ class FileClearUpReplyD2HPacket extends HostBoundPacket {
1959
+ static COMMAND_ID = 86;
1960
+ static COMMAND_EXTENDED_ID = 30;
1961
+ }
1962
+
1963
+ class FileFormatReplyD2HPacket extends HostBoundPacket {
1964
+ static COMMAND_ID = 86;
1965
+ static COMMAND_EXTENDED_ID = 31;
1966
+ }
1967
+
1968
+ class GetSystemFlagsReplyD2HPacket extends HostBoundPacket {
1969
+ static COMMAND_ID = 86;
1970
+ static COMMAND_EXTENDED_ID = 32;
1971
+ flags;
1972
+ radioSearching;
1973
+ radioQuality;
1974
+ controllerBatteryPercent;
1975
+ partnerControllerBatteryPercent;
1976
+ battery;
1977
+ currentProgram;
1978
+ constructor(data) {
1979
+ super(data);
1980
+ const dataView = PacketView.fromPacket(this);
1981
+ this.radioSearching = false;
1982
+ this.currentProgram = 0;
1983
+ this.flags = dataView.nextUint32();
1984
+ const hasPartner = (8192 & this.flags) !== 0;
1985
+ const hasRadio = (1536 & this.flags) === 1536;
1986
+ const byte1 = dataView.nextUint8();
1987
+ const byte2 = dataView.nextUint8();
1988
+ if (this.payloadSize === 11) {
1989
+ this.battery = 8 * (byte1 & 15);
1990
+ if ((this.flags & 256) !== 0 || hasRadio)
1991
+ this.controllerBatteryPercent = 8 * (byte1 >> 4 & 15);
1992
+ if (hasRadio)
1993
+ this.radioQuality = 8 * (byte2 & 15);
1994
+ this.radioSearching = (this.flags & 1536) === 512;
1995
+ if (hasPartner)
1996
+ this.partnerControllerBatteryPercent = 8 * (byte2 >> 4 & 15);
1997
+ this.currentProgram = dataView.nextUint8();
1998
+ if (this.battery != null && this.battery > 100)
1999
+ this.battery = 100;
2000
+ if (this.controllerBatteryPercent != null && this.controllerBatteryPercent > 100)
2001
+ this.controllerBatteryPercent = 100;
2002
+ if (this.radioQuality != null && this.radioQuality > 100)
2003
+ this.radioQuality = 100;
2004
+ if (this.partnerControllerBatteryPercent != null && this.partnerControllerBatteryPercent > 100)
2005
+ this.partnerControllerBatteryPercent = 100;
2006
+ }
2007
+ }
2008
+ }
2009
+
2010
+ class GetDeviceStatusReplyD2HPacket extends HostBoundPacket {
2011
+ static COMMAND_ID = 86;
2012
+ static COMMAND_EXTENDED_ID = 33;
2013
+ count;
2014
+ devices;
2015
+ constructor(data) {
2016
+ super(data);
2017
+ const dataView = PacketView.fromPacket(this);
2018
+ this.count = dataView.nextUint8();
2019
+ this.devices = [];
2020
+ for (let i = 0;i < this.count; i++) {
2021
+ this.devices.push({
2022
+ port: dataView.nextUint8(),
2023
+ type: dataView.nextUint8(),
2024
+ status: dataView.nextUint8(),
2025
+ betaversion: dataView.nextUint8(),
2026
+ version: dataView.nextUint16(),
2027
+ bootversion: dataView.nextUint16()
2028
+ });
2029
+ }
2030
+ }
2031
+ }
2032
+
2033
+ class GetSystemStatusReplyD2HPacket extends HostBoundPacket {
2034
+ static COMMAND_ID = 86;
2035
+ static COMMAND_EXTENDED_ID = 34;
2036
+ systemVersion;
2037
+ cpu0Version;
2038
+ cpu1Version;
2039
+ nxpVersion;
2040
+ touchVersion;
2041
+ uniqueId;
2042
+ sysflags;
2043
+ eventBrain;
2044
+ romBootloaderActive;
2045
+ ramBootloaderActive;
2046
+ goldenVersion;
2047
+ constructor(data) {
2048
+ super(data);
2049
+ const dataView = PacketView.fromPacket(this);
2050
+ dataView.nextUint8();
2051
+ this.systemVersion = dataView.nextVersion();
2052
+ this.cpu0Version = dataView.nextVersion();
2053
+ this.cpu1Version = dataView.nextVersion();
2054
+ this.touchVersion = dataView.nextVersion(true);
2055
+ this.uniqueId = 1234;
2056
+ this.sysflags = [0, 0, 0, 0, 0, 0, 0];
2057
+ this.goldenVersion = VexFirmwareVersion.allZero();
2058
+ this.nxpVersion = VexFirmwareVersion.allZero();
2059
+ this.eventBrain = false;
2060
+ this.romBootloaderActive = false;
2061
+ this.ramBootloaderActive = false;
2062
+ if (this.payloadSize > 25) {
2063
+ this.uniqueId = dataView.nextUint32();
2064
+ this.sysflags = [
2065
+ dataView.nextUint8(),
2066
+ dataView.nextUint8(),
2067
+ dataView.nextUint8(),
2068
+ dataView.nextUint8(),
2069
+ dataView.nextUint8(),
2070
+ 0,
2071
+ dataView.nextUint8()
2072
+ ];
2073
+ this.eventBrain = (1 & this.sysflags[6]) !== 0;
2074
+ this.romBootloaderActive = (2 & this.sysflags[6]) !== 0;
2075
+ this.ramBootloaderActive = (4 & this.sysflags[6]) !== 0;
2076
+ dataView.nextUint16();
2077
+ this.goldenVersion = dataView.nextVersion();
2078
+ }
2079
+ if (this.payloadSize > 37) {
2080
+ this.nxpVersion = dataView.nextVersion();
2081
+ }
2082
+ }
2083
+ }
2084
+
2085
+ class GetFdtStatusReplyD2HPacket extends HostBoundPacket {
2086
+ static COMMAND_ID = 86;
2087
+ static COMMAND_EXTENDED_ID = 35;
2088
+ count;
2089
+ status;
2090
+ constructor(data) {
2091
+ super(data);
2092
+ const dataView = PacketView.fromPacket(this);
2093
+ this.count = dataView.nextUint8();
2094
+ this.status = [];
2095
+ for (let i = 0;i < this.count; i++) {
2096
+ this.status.push({
2097
+ index: dataView.nextUint8(),
2098
+ type: dataView.nextUint8(),
2099
+ status: dataView.nextUint8(),
2100
+ betaversion: dataView.nextUint8(),
2101
+ version: dataView.nextUint16(),
2102
+ bootversion: dataView.nextUint16()
2103
+ });
2104
+ }
2105
+ }
2106
+ }
2107
+
2108
+ class GetLogCountReplyD2HPacket extends HostBoundPacket {
2109
+ static COMMAND_ID = 86;
2110
+ static COMMAND_EXTENDED_ID = 36;
2111
+ count;
2112
+ constructor(data) {
2113
+ super(data);
2114
+ const dataView = PacketView.fromPacket(this);
2115
+ dataView.nextUint8();
2116
+ this.count = dataView.nextUint32();
2117
+ }
2118
+ }
2119
+
2120
+ class ReadLogPageReplyD2HPacket extends HostBoundPacket {
2121
+ static COMMAND_ID = 86;
2122
+ static COMMAND_EXTENDED_ID = 37;
2123
+ offset;
2124
+ count;
2125
+ entries;
2126
+ constructor(data) {
2127
+ super(data);
2128
+ const dataView = PacketView.fromPacket(this);
2129
+ const n = this.ackIndex;
2130
+ const size = dataView.nextUint8();
2131
+ this.offset = dataView.nextUint32();
2132
+ this.count = dataView.nextUint16();
2133
+ this.entries = [];
2134
+ let j = n + 8;
2135
+ for (let i = 0;i < this.count; i++) {
2136
+ this.entries.push({
2137
+ code: dataView.getUint8(j),
2138
+ type: dataView.getUint8(j + 1),
2139
+ desc: dataView.getUint8(j + 2),
2140
+ spare: dataView.getUint8(j + 3),
2141
+ time: dataView.getUint32(j + 4, true)
2142
+ });
2143
+ j += size;
2144
+ }
2145
+ }
2146
+ }
2147
+
2148
+ class GetRadioStatusReplyD2HPacket extends HostBoundPacket {
2149
+ static COMMAND_ID = 86;
2150
+ static COMMAND_EXTENDED_ID = 38;
2151
+ device;
2152
+ quality;
2153
+ strength;
2154
+ channel;
2155
+ timeslot;
2156
+ constructor(data) {
2157
+ super(data);
2158
+ const dataView = PacketView.fromPacket(this);
2159
+ const n = this.ackIndex;
2160
+ this.device = dataView.nextUint8();
2161
+ this.quality = dataView.nextUint16();
2162
+ this.strength = dataView.nextInt16();
2163
+ this.channel = this.data[n + 6];
2164
+ this.timeslot = this.data[n + 7];
2165
+ }
2166
+ }
2167
+
2168
+ class ScreenCaptureReplyD2HPacket extends HostBoundPacket {
2169
+ static COMMAND_ID = 86;
2170
+ static COMMAND_EXTENDED_ID = 40;
2171
+ }
2172
+
2173
+ class SendDashTouchReplyD2HPacket extends HostBoundPacket {
2174
+ static COMMAND_ID = 86;
2175
+ static COMMAND_EXTENDED_ID = 42;
2176
+ }
2177
+
2178
+ class SelectDashReplyD2HPacket extends HostBoundPacket {
2179
+ static COMMAND_ID = 86;
2180
+ static COMMAND_EXTENDED_ID = 43;
2181
+ }
2182
+
2183
+ class ReadKeyValueReplyD2HPacket extends HostBoundPacket {
2184
+ static COMMAND_ID = 86;
2185
+ static COMMAND_EXTENDED_ID = 46;
2186
+ value;
2187
+ constructor(data) {
2188
+ super(data);
2189
+ const dataView = PacketView.fromPacket(this);
2190
+ this.value = dataView.nextVarNTBS(255);
2191
+ }
2192
+ }
2193
+
2194
+ class WriteKeyValueReplyD2HPacket extends HostBoundPacket {
2195
+ static COMMAND_ID = 86;
2196
+ static COMMAND_EXTENDED_ID = 47;
2197
+ }
2198
+
2199
+ class GetSlot1to4InfoReplyD2HPacket extends HostBoundPacket {
2200
+ static COMMAND_ID = 86;
2201
+ static COMMAND_EXTENDED_ID = 49;
2202
+ slotFlags;
2203
+ slots;
2204
+ constructor(data, start = 1) {
2205
+ super(data);
2206
+ const dataView = PacketView.fromPacket(this);
2207
+ this.slotFlags = dataView.nextUint8();
2208
+ this.slots = [];
2209
+ for (let i = 0;i < 4; i++) {
2210
+ const hasData = (this.slotFlags & 2 ** (start - 1 + i)) !== 0;
2211
+ if (!hasData)
2212
+ continue;
2213
+ const iconNum = dataView.nextUint16();
2214
+ const nameLen = dataView.nextUint8();
2215
+ const name = dataView.nextString(nameLen);
2216
+ this.slots.push({
2217
+ slot: start + i,
2218
+ icon: iconNum,
2219
+ name
2220
+ });
2221
+ }
2222
+ }
2223
+ }
2224
+
2225
+ class GetSlot5to8InfoReplyD2HPacket extends GetSlot1to4InfoReplyD2HPacket {
2226
+ static COMMAND_ID = 86;
2227
+ static COMMAND_EXTENDED_ID = 50;
2228
+ slotStartIndex = 5;
2229
+ constructor(data) {
2230
+ super(data, 5);
2231
+ }
2232
+ }
2233
+
2234
+ class FactoryStatusReplyD2HPacket extends HostBoundPacket {
2235
+ static COMMAND_ID = 86;
2236
+ static COMMAND_EXTENDED_ID = 241;
2237
+ status;
2238
+ percent;
2239
+ constructor(data) {
2240
+ super(data);
2241
+ const dataView = PacketView.fromPacket(this);
2242
+ this.status = dataView.nextUint8();
2243
+ this.percent = dataView.nextUint8();
2244
+ }
2245
+ }
2246
+
2247
+ class FactoryEnableReplyD2HPacket extends HostBoundPacket {
2248
+ static COMMAND_ID = 86;
2249
+ static COMMAND_EXTENDED_ID = 255;
2250
+ }
2251
+
2252
+ // src/VexPacketEncoder.ts
2253
+ var textEncoder2 = new TextEncoder;
2254
+ function encodeFixedText(value, field, maxBytes) {
2255
+ const encoded = textEncoder2.encode(value);
2256
+ if (encoded.byteLength > maxBytes) {
2257
+ throw new RangeError(`${field} must be at most ${maxBytes} UTF-8 bytes`);
2258
+ }
2259
+ return encoded;
2260
+ }
2261
+
2262
+ class PacketEncoder {
2263
+ static HEADERS_LENGTH = 4;
2264
+ static HEADER_TO_DEVICE = [201, 54, 184, 71];
2265
+ static HEADER_TO_HOST = [170, 85];
2266
+ static J2000_EPOCH = 946684800;
2267
+ vexVersion;
2268
+ crcgen;
2269
+ allPacketsTable = {};
2270
+ static getInstance() {
2271
+ if (Packet.ENCODER === undefined) {
2272
+ Packet.ENCODER = new PacketEncoder;
2273
+ }
2274
+ return Packet.ENCODER;
2275
+ }
2276
+ constructor() {
2277
+ this.vexVersion = 0;
2278
+ this.crcgen = new CrcGenerator;
2279
+ Object.values(exports_VexPacketModels).forEach((packet) => {
2280
+ if (typeof packet === "function" && packet.prototype instanceof HostBoundPacket) {
2281
+ const packetType = packet;
2282
+ this.allPacketsTable[packetType.COMMAND_ID + " " + packetType.COMMAND_EXTENDED_ID] = packetType;
2283
+ }
2284
+ });
2285
+ }
2286
+ createHeader(buf) {
2287
+ if (buf === undefined || buf.byteLength < PacketEncoder.HEADERS_LENGTH) {
2288
+ buf = new ArrayBuffer(PacketEncoder.HEADERS_LENGTH);
2289
+ }
2290
+ const h = new Uint8Array(buf);
2291
+ h.set(PacketEncoder.HEADER_TO_DEVICE);
2292
+ return h;
2293
+ }
2294
+ cdcCommand(cmd) {
2295
+ const buf = new ArrayBuffer(PacketEncoder.HEADERS_LENGTH + 1);
2296
+ const h = this.createHeader(buf);
2297
+ h.set([cmd], PacketEncoder.HEADERS_LENGTH);
2298
+ return h;
2299
+ }
2300
+ cdcCommandWithData(cmd, data) {
2301
+ const buf = new ArrayBuffer(PacketEncoder.HEADERS_LENGTH + 2 + data.length);
2302
+ const h = this.createHeader(buf);
2303
+ h.set([cmd, data.length], PacketEncoder.HEADERS_LENGTH);
2304
+ h.set(data, PacketEncoder.HEADERS_LENGTH + 2);
2305
+ return h;
2306
+ }
2307
+ cdc2Command(cmd, ext) {
2308
+ const buf = new ArrayBuffer(PacketEncoder.HEADERS_LENGTH + 5);
2309
+ const h = this.createHeader(buf);
2310
+ h.set([cmd, ext, 0], PacketEncoder.HEADERS_LENGTH);
2311
+ const crc = this.crcgen.crc16(h.subarray(0, buf.byteLength - 2), 0) >>> 0;
2312
+ h.set([crc >>> 8, crc & 255], buf.byteLength - 2);
2313
+ return h;
2314
+ }
2315
+ cdc2CommandBufferLength(data) {
2316
+ let length = PacketEncoder.HEADERS_LENGTH + data.length + 3 + 2;
2317
+ if (data.length > 127)
2318
+ length += 1;
2319
+ return length;
2320
+ }
2321
+ cdc2CommandWithData(cmd, ext, data) {
2322
+ const buf = new ArrayBuffer(this.cdc2CommandBufferLength(data));
2323
+ const h = this.createHeader(buf);
2324
+ if (data.length < 128) {
2325
+ h.set([cmd, ext, data.length], PacketEncoder.HEADERS_LENGTH);
2326
+ h.set(data, PacketEncoder.HEADERS_LENGTH + 3);
2327
+ } else {
2328
+ const lengthMsb = (data.length >>> 8 | 128) >>> 0;
2329
+ const lengthLsb = (data.length & 255) >>> 0;
2330
+ h.set([cmd, ext, lengthMsb, lengthLsb], PacketEncoder.HEADERS_LENGTH);
2331
+ h.set(data, PacketEncoder.HEADERS_LENGTH + 4);
2332
+ }
2333
+ const crc = this.crcgen.crc16(h.subarray(0, buf.byteLength - 2), 0);
2334
+ h.set([crc >>> 8, crc & 255], buf.byteLength - 2);
2335
+ return h;
2336
+ }
2337
+ validateHeader(data) {
2338
+ return !(data[0] !== PacketEncoder.HEADER_TO_HOST[0] || data[1] !== PacketEncoder.HEADER_TO_HOST[1]);
2339
+ }
2340
+ validateMessageCdc(data) {
2341
+ const message = data.subarray(0, data.byteLength - 2);
2342
+ const lastTwoBytes = (data[data.byteLength - 2] << 8) + data[data.byteLength - 1];
2343
+ return this.crcgen.crc16(message, 0) === lastTwoBytes;
2344
+ }
2345
+ getPayloadSize(data) {
2346
+ let t = 0;
2347
+ let a = data[3];
2348
+ if ((128 & a) !== 0) {
2349
+ t = 127 & a;
2350
+ a = data[4];
2351
+ }
2352
+ return (t << 8) + a;
2353
+ }
2354
+ getHostHeaderLength(data) {
2355
+ return (data[3] & 128) === 0 ? 4 : 5;
2356
+ }
2357
+ }
2358
+
2359
+ // src/VexConnection.ts
2360
+ var thePacketEncoder = PacketEncoder.getInstance();
2361
+ var SCREEN_CAPTURE_HEIGHT = 272;
2362
+ var SCREEN_CAPTURE_WIDTH = 480;
2363
+ var SCREEN_CAPTURE_CHANNELS = 3;
2364
+ var SCREEN_CAPTURE_MESSAGE_WIDTH = 512;
2365
+ var SCREEN_CAPTURE_MESSAGE_CHANNELS = 4;
2366
+
2367
+ class VexSerialConnection extends VexEventTarget {
2368
+ filters = [{ usbVendorId: 10376 }];
2369
+ writer;
2370
+ reader;
2371
+ port;
2372
+ serial;
2373
+ callbacksQueue = [];
2374
+ _onPortDisconnect = null;
2375
+ _closePromise = null;
2376
+ _wasConnected = false;
2377
+ fileTransferTail = Promise.resolve();
2378
+ fileTransferDepth = 0;
2379
+ get isConnected() {
2380
+ return this.port !== undefined && this.reader !== undefined && this.writer !== undefined;
2381
+ }
2382
+ get isFileTransferring() {
2383
+ return this.fileTransferDepth > 0;
2384
+ }
2385
+ constructor(serial) {
2386
+ super();
2387
+ this.serial = serial;
2388
+ }
2389
+ async close() {
2390
+ if (this._closePromise)
2391
+ return this._closePromise;
2392
+ if (!this._hasOpenResources())
2393
+ return;
2394
+ this._closePromise = this._doClose();
2395
+ try {
2396
+ await this._closePromise;
2397
+ } finally {
2398
+ this._closePromise = null;
2399
+ }
2400
+ }
2401
+ _hasOpenResources() {
2402
+ return this.port !== undefined || this.reader !== undefined || this.writer !== undefined || this._onPortDisconnect !== null || this.callbacksQueue.length > 0;
2403
+ }
2404
+ async _doClose() {
2405
+ for (const callback of this.callbacksQueue.splice(0)) {
2406
+ clearTimeout(callback.timeout);
2407
+ callback.callback(255 /* CDC2_NACK */);
2408
+ }
2409
+ const onDisconnect = this._onPortDisconnect;
2410
+ this._onPortDisconnect = null;
2411
+ if (onDisconnect !== null) {
2412
+ try {
2413
+ this.port?.removeEventListener("disconnect", onDisconnect);
2414
+ } catch {}
2415
+ }
2416
+ const writer = this.writer;
2417
+ this.writer = undefined;
2418
+ if (writer !== undefined) {
2419
+ try {
2420
+ await writer.close();
2421
+ } catch {} finally {
2422
+ try {
2423
+ writer.releaseLock();
2424
+ } catch {}
2425
+ }
2426
+ }
2427
+ const reader = this.reader;
2428
+ this.reader = undefined;
2429
+ if (reader !== undefined) {
2430
+ try {
2431
+ await reader.cancel();
2432
+ } catch {}
2433
+ try {
2434
+ while (true) {
2435
+ const { done } = await reader.read();
2436
+ if (done)
2437
+ break;
2438
+ }
2439
+ } catch {} finally {
2440
+ try {
2441
+ reader.releaseLock();
2442
+ } catch {}
2443
+ }
2444
+ }
2445
+ const port = this.port;
2446
+ this.port = undefined;
2447
+ if (port !== undefined) {
2448
+ try {
2449
+ await port.close();
2450
+ } catch (e) {
2451
+ console.warn("Close port error.", e);
2452
+ }
2453
+ }
2454
+ if (this._wasConnected) {
2455
+ this._wasConnected = false;
2456
+ this.emit("disconnected", undefined);
2457
+ }
2458
+ }
2459
+ open(use = 0, askUser = true) {
2460
+ if (this.port !== undefined) {
2461
+ return errAsyncVex(new VexIoError("Already connected."));
2462
+ }
2463
+ return new ResultAsync(this._open(use, askUser));
2464
+ }
2465
+ async _open(use, askUser) {
2466
+ let port;
2467
+ if (use !== undefined) {
2468
+ const ports = (await this.serial.getPorts()).filter((p) => {
2469
+ const info = p.getInfo();
2470
+ return this.filters.find((f) => (f.usbVendorId === undefined || f.usbVendorId === info.usbVendorId) && (f.usbProductId === undefined || f.usbProductId === info.usbProductId));
2471
+ }).filter((candidate) => candidate.readable === null);
2472
+ port = ports[use];
2473
+ }
2474
+ if (port == null && askUser) {
2475
+ try {
2476
+ port = await this.serial.requestPort({ filters: this.filters });
2477
+ } catch {}
2478
+ }
2479
+ if (port == null)
2480
+ return ok(undefined);
2481
+ if (port.readable != null)
2482
+ return ok(false);
2483
+ try {
2484
+ this.port = port;
2485
+ await port.open({ baudRate: 115200 });
2486
+ this._onPortDisconnect = () => {
2487
+ this.close();
2488
+ };
2489
+ this.port.addEventListener("disconnect", this._onPortDisconnect);
2490
+ this.writer = this.port.writable.getWriter();
2491
+ this.reader = this.port.readable.getReader();
2492
+ this.startReader();
2493
+ this._wasConnected = true;
2494
+ this.emit("connected", undefined);
2495
+ return ok(true);
2496
+ } catch {
2497
+ await this.close();
2498
+ return ok(false);
2499
+ }
2500
+ }
2501
+ writeData(rawData, resolve, timeout = 1000) {
2502
+ this.writeDataAsync(rawData, timeout).then(resolve);
2503
+ }
2504
+ async writeDataAsync(rawData, timeout = 1000) {
2505
+ return new Promise((resolve) => {
2506
+ if (this.writer === undefined) {
2507
+ resolve(255 /* CDC2_NACK */);
2508
+ return;
2509
+ }
2510
+ const data = rawData instanceof DeviceBoundPacket ? rawData.data : rawData;
2511
+ const cb = {
2512
+ callback: resolve,
2513
+ timeout: setTimeout(() => {
2514
+ const index = this.callbacksQueue.indexOf(cb);
2515
+ if (index === -1)
2516
+ return;
2517
+ this.callbacksQueue.splice(index, 1);
2518
+ cb.callback(256 /* TIMEOUT */);
2519
+ }, timeout),
2520
+ wantedCommandId: rawData instanceof DeviceBoundPacket ? rawData.commandId : undefined,
2521
+ wantedCommandExId: rawData instanceof DeviceBoundPacket ? rawData.commandExtendedId : undefined
2522
+ };
2523
+ this.callbacksQueue.push(cb);
2524
+ this.writer.write(data).catch(() => {
2525
+ const index = this.callbacksQueue.indexOf(cb);
2526
+ if (index === -1)
2527
+ return;
2528
+ this.callbacksQueue.splice(index, 1);
2529
+ clearTimeout(cb.timeout);
2530
+ resolve(257 /* WRITE_ERROR */);
2531
+ });
2532
+ });
2533
+ }
2534
+ async readData(cache, expectedSize) {
2535
+ if (this.reader == null)
2536
+ throw new Error("No reader");
2537
+ while (cache.byteLength < expectedSize) {
2538
+ const { value: readData, done: isDone } = await this.reader.read();
2539
+ if (isDone)
2540
+ throw new Error("No data");
2541
+ cache = binaryArrayJoin(cache, readData);
2542
+ }
2543
+ return cache;
2544
+ }
2545
+ async startReader() {
2546
+ let cache = new Uint8Array([]);
2547
+ let sliceIdx = 0;
2548
+ for (;; )
2549
+ try {
2550
+ cache = await this.readData(cache, 5);
2551
+ sliceIdx = 0;
2552
+ while (!thePacketEncoder.validateHeader(cache)) {
2553
+ const nextHeader = cache.findIndex((byte, index) => index > 0 && byte === PacketEncoder.HEADER_TO_HOST[0] && cache[index + 1] === PacketEncoder.HEADER_TO_HOST[1]);
2554
+ if (nextHeader >= 0) {
2555
+ cache = cache.slice(nextHeader);
2556
+ } else {
2557
+ cache = cache.slice(cache.at(-1) === PacketEncoder.HEADER_TO_HOST[0] ? -1 : cache.length);
2558
+ }
2559
+ cache = await this.readData(cache, 5);
2560
+ }
2561
+ const payloadExpectedSize = thePacketEncoder.getPayloadSize(cache);
2562
+ const n = thePacketEncoder.getHostHeaderLength(cache);
2563
+ const totalSize = n + payloadExpectedSize;
2564
+ cache = await this.readData(cache, totalSize);
2565
+ sliceIdx = totalSize;
2566
+ const cmdId = cache[2];
2567
+ const hasExtId = cmdId === 88 || cmdId === 86;
2568
+ const cmdExId = hasExtId ? cache[n] : undefined;
2569
+ const ack = cache[n + 1];
2570
+ if (hasExtId) {
2571
+ if (!thePacketEncoder.validateMessageCdc(cache))
2572
+ throw new Error("Invalid message CDC");
2573
+ }
2574
+ let callbackInfo;
2575
+ let wantedCmdId;
2576
+ let wantedCmdExId;
2577
+ let tryIdx = 0;
2578
+ while ((callbackInfo = this.callbacksQueue[tryIdx++]) !== undefined) {
2579
+ wantedCmdId = callbackInfo?.wantedCommandId;
2580
+ wantedCmdExId = callbackInfo?.wantedCommandExId;
2581
+ if (wantedCmdId !== undefined && wantedCmdId !== cmdId || wantedCmdExId !== undefined && wantedCmdExId !== cmdExId) {
2582
+ continue;
2583
+ }
2584
+ break;
2585
+ }
2586
+ if (callbackInfo === undefined) {
2587
+ console.warn("Unexpected command", cmdId, cmdExId, ack);
2588
+ continue;
2589
+ }
2590
+ const data = cache.slice(0, sliceIdx);
2591
+ const PackageType = thePacketEncoder.allPacketsTable[wantedCmdId + " " + wantedCmdExId];
2592
+ if (wantedCmdId === undefined && wantedCmdExId === undefined || PackageType === undefined) {
2593
+ callbackInfo.callback(data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength));
2594
+ } else {
2595
+ if (!hasExtId || PackageType.isValidPacket(data, n)) {
2596
+ callbackInfo.callback(new PackageType(data));
2597
+ } else {
2598
+ console.warn("ack", ack);
2599
+ callbackInfo.callback(ack);
2600
+ }
2601
+ }
2602
+ clearTimeout(callbackInfo.timeout);
2603
+ this.callbacksQueue.splice(tryIdx - 1, 1);
2604
+ } catch (e) {
2605
+ if (!(e instanceof Error && e.message === "No data")) {
2606
+ console.warn("Read error.", e, cache);
2607
+ }
2608
+ await this.close();
2609
+ break;
2610
+ } finally {
2611
+ cache = cache.slice(sliceIdx);
2612
+ }
2613
+ }
2614
+ query1() {
2615
+ return new ResultAsync((async () => {
2616
+ const result = await this.writeDataAsync(new Query1H2DPacket, 100);
2617
+ return result instanceof Query1ReplyD2HPacket ? ok(result) : err(new VexProtocolError("query1 was not acknowledged"));
2618
+ })());
2619
+ }
2620
+ getSystemVersion() {
2621
+ return new ResultAsync((async () => {
2622
+ const result = await this.writeDataAsync(new SystemVersionH2DPacket);
2623
+ if (result instanceof SystemVersionReplyD2HPacket) {
2624
+ return ok(result.version);
2625
+ }
2626
+ return err(new VexProtocolError("system version was not acknowledged"));
2627
+ })());
2628
+ }
2629
+ }
2630
+
2631
+ class V5SerialConnection extends VexSerialConnection {
2632
+ filters = [
2633
+ { usbVendorId: 10376, usbProductId: 1281 /* V5_BRAIN */ },
2634
+ { usbVendorId: 10376, usbProductId: 1282 /* V5_BRAIN_DFU */ },
2635
+ { usbVendorId: 10376, usbProductId: 1283 /* V5_CONTROLLER */ }
2636
+ ];
2637
+ async withFileTransfer(operation) {
2638
+ const previous = this.fileTransferTail;
2639
+ let release = () => {};
2640
+ const current = new Promise((resolve) => {
2641
+ release = resolve;
2642
+ });
2643
+ this.fileTransferTail = previous.then(() => current);
2644
+ this.fileTransferDepth++;
2645
+ try {
2646
+ await previous;
2647
+ return await operation();
2648
+ } finally {
2649
+ this.fileTransferDepth--;
2650
+ release();
2651
+ }
2652
+ }
2653
+ getDeviceStatus() {
2654
+ return new ResultAsync((async () => {
2655
+ const result = await this.writeDataAsync(new GetDeviceStatusH2DPacket);
2656
+ return result instanceof GetDeviceStatusReplyD2HPacket ? ok(result) : err(new VexProtocolError("device status was not acknowledged"));
2657
+ })());
2658
+ }
2659
+ getRadioStatus() {
2660
+ return new ResultAsync((async () => {
2661
+ const result = await this.writeDataAsync(new GetRadioStatusH2DPacket);
2662
+ return result instanceof GetRadioStatusReplyD2HPacket ? ok(result) : err(new VexProtocolError("radio status was not acknowledged"));
2663
+ })());
2664
+ }
2665
+ getSystemFlags() {
2666
+ return new ResultAsync((async () => {
2667
+ const result = await this.writeDataAsync(new GetSystemFlagsH2DPacket);
2668
+ return result instanceof GetSystemFlagsReplyD2HPacket ? ok(result) : err(new VexProtocolError("system flags were not acknowledged"));
2669
+ })());
2670
+ }
2671
+ getSystemStatus(timeout = 1000) {
2672
+ return new ResultAsync((async () => {
2673
+ const result = await this.writeDataAsync(new GetSystemStatusH2DPacket, timeout);
2674
+ return result instanceof GetSystemStatusReplyD2HPacket ? ok(result) : err(new VexProtocolError("system status was not acknowledged"));
2675
+ })());
2676
+ }
2677
+ getMatchStatus() {
2678
+ return new ResultAsync((async () => {
2679
+ const result = await this.writeDataAsync(new GetMatchStatusH2DPacket);
2680
+ return result instanceof MatchStatusReplyD2HPacket ? ok(result) : err(new VexProtocolError("match status was not acknowledged"));
2681
+ })());
2682
+ }
2683
+ uploadProgramToDevice(iniConfig, binFileBuf, coldFileBuf, progressCallback) {
2684
+ return wrapTransfer(this, () => this._uploadProgramToDevice(iniConfig, binFileBuf, coldFileBuf, progressCallback));
2685
+ }
2686
+ async _uploadProgramToDevice(iniConfig, binFileBuf, coldFileBuf, progressCallback) {
2687
+ const iniFileBuffer = new TextEncoder().encode(iniConfig.createIni());
2688
+ const basename = iniConfig.baseName;
2689
+ const iniRequest = {
2690
+ filename: basename + ".ini",
2691
+ buf: iniFileBuffer,
2692
+ downloadTarget: 1 /* FILE_TARGET_QSPI */,
2693
+ vendor: 1 /* USER */,
2694
+ autoRun: false
2695
+ };
2696
+ const r1 = await this.uploadFileToDeviceUnlocked(iniRequest, (current, total) => {
2697
+ progressCallback("INI", current, total);
2698
+ });
2699
+ if (r1.isErr())
2700
+ return err(r1.error);
2701
+ if (!r1.value)
2702
+ return ok(false);
2703
+ const coldRequest = coldFileBuf !== undefined ? {
2704
+ filename: basename + "_lib.bin",
2705
+ buf: coldFileBuf,
2706
+ downloadTarget: 1 /* FILE_TARGET_QSPI */,
2707
+ vendor: 24 /* DEV2 */,
2708
+ autoRun: false
2709
+ } : undefined;
2710
+ if (coldRequest != null) {
2711
+ const r2 = await this.uploadFileToDeviceUnlocked(coldRequest, (current, total) => {
2712
+ progressCallback("COLD", current, total);
2713
+ });
2714
+ if (r2.isErr())
2715
+ return err(r2.error);
2716
+ if (!r2.value)
2717
+ return ok(false);
2718
+ }
2719
+ const binRequest = {
2720
+ filename: basename + ".bin",
2721
+ buf: binFileBuf,
2722
+ downloadTarget: 1 /* FILE_TARGET_QSPI */,
2723
+ vendor: 1 /* USER */,
2724
+ loadAddress: coldFileBuf != null ? 125829120 : undefined,
2725
+ autoRun: iniConfig.autorun,
2726
+ linkedFile: coldRequest
2727
+ };
2728
+ const r3 = await this.uploadFileToDeviceUnlocked(binRequest, (current, total) => {
2729
+ progressCallback("BIN", current, total);
2730
+ });
2731
+ return r3;
2732
+ }
2733
+ downloadFileToHost(request, downloadTarget = 1 /* FILE_TARGET_QSPI */, progressCallback) {
2734
+ return wrapTransfer(this, () => this.downloadFileToHostUnlocked(request, downloadTarget, progressCallback));
2735
+ }
2736
+ downloadFileToHostUnlocked(request, downloadTarget = 1 /* FILE_TARGET_QSPI */, progressCallback) {
2737
+ return new ResultAsync(this._downloadFileToHostUnlocked(request, downloadTarget, progressCallback));
2738
+ }
2739
+ async _downloadFileToHostUnlocked(request, downloadTarget, progressCallback) {
2740
+ const { filename, vendor, loadAddress, size } = request;
2741
+ let nextAddress = loadAddress ?? USER_FLASH_USR_CODE_START;
2742
+ const p1 = await this.writeDataAsync(new InitFileTransferH2DPacket(2 /* READ */, downloadTarget, vendor, 0 /* NONE */, new Uint8Array, nextAddress, filename, ""));
2743
+ if (!(p1 instanceof InitFileTransferReplyD2HPacket)) {
2744
+ return err(new VexTransferError("InitFileTransferH2DPacket failed"));
2745
+ }
2746
+ let transferFailed = true;
2747
+ let result = ok(new Uint8Array);
2748
+ try {
2749
+ const fileSize = size ?? p1.fileSize;
2750
+ const bufferChunkSize = getTransferChunkSize(p1.windowSize);
2751
+ let bufferOffset = 0;
2752
+ const fileBuf = new Uint8Array(fileSize);
2753
+ while (bufferOffset < fileSize) {
2754
+ const requestedSize = Math.min(bufferChunkSize, fileSize - bufferOffset);
2755
+ const p2 = await this.writeDataAsync(new ReadFileH2DPacket(nextAddress, requestedSize), 3000);
2756
+ if (!(p2 instanceof ReadFileReplyD2HPacket)) {
2757
+ throw new VexTransferError("ReadFileReplyD2HPacket failed");
2758
+ }
2759
+ if (p2.addr !== nextAddress) {
2760
+ throw new VexTransferError(`ReadFileReplyD2HPacket returned address ${p2.addr}, expected ${nextAddress}`);
2761
+ }
2762
+ if (p2.length <= 0 || p2.length > requestedSize || p2.buf.byteLength !== p2.length) {
2763
+ throw new VexTransferError(`ReadFileReplyD2HPacket returned invalid length ${p2.length}`);
2764
+ }
2765
+ fileBuf.set(new Uint8Array(p2.buf), bufferOffset);
2766
+ bufferOffset += p2.length;
2767
+ nextAddress += p2.length;
2768
+ progressCallback?.(bufferOffset, fileSize);
2769
+ }
2770
+ transferFailed = false;
2771
+ result = ok(fileBuf);
2772
+ } catch (e) {
2773
+ result = err(e instanceof VexSerialError ? e : toVexSerialError(e, "transfer"));
2774
+ } finally {
2775
+ try {
2776
+ await this.writeDataAsync(new ExitFileTransferH2DPacket(3 /* EXIT_HALT */), 30000);
2777
+ } catch (cleanupError) {
2778
+ if (!transferFailed) {
2779
+ result = err(toVexSerialError(cleanupError, "io"));
2780
+ }
2781
+ }
2782
+ }
2783
+ return result;
2784
+ }
2785
+ uploadFileToDevice(request, progressCallback) {
2786
+ return wrapTransfer(this, () => this.uploadFileToDeviceUnlocked(request, progressCallback));
2787
+ }
2788
+ async uploadFileToDeviceUnlocked(request, progressCallback) {
2789
+ let {
2790
+ filename,
2791
+ buf,
2792
+ downloadTarget,
2793
+ vendor,
2794
+ loadAddress,
2795
+ exttype,
2796
+ autoRun,
2797
+ linkedFile
2798
+ } = request;
2799
+ if (buf === undefined) {
2800
+ return err(new VexTransferError("no buffer provided for upload"));
2801
+ }
2802
+ downloadTarget = downloadTarget ?? 1 /* FILE_TARGET_QSPI */;
2803
+ vendor = vendor ?? 1 /* USER */;
2804
+ let nextAddress = loadAddress ?? USER_FLASH_USR_CODE_START;
2805
+ const p1 = await this.writeDataAsync(new InitFileTransferH2DPacket(1 /* WRITE */, downloadTarget, vendor, 1 /* OVERWRITE */, buf, nextAddress, filename, exttype));
2806
+ if (!(p1 instanceof InitFileTransferReplyD2HPacket)) {
2807
+ return err(new VexTransferError("InitFileTransferH2DPacket failed"));
2808
+ }
2809
+ const bufferChunkSize = getTransferChunkSize(p1.windowSize);
2810
+ let bufferOffset = 0;
2811
+ let lastBlock = false;
2812
+ let transferFailed = true;
2813
+ let exitReply;
2814
+ let result = ok(false);
2815
+ try {
2816
+ if (linkedFile !== undefined) {
2817
+ const p3 = await this.writeDataAsync(new LinkFileH2DPacket(linkedFile.vendor ?? 1 /* USER */, linkedFile.filename, 0), 1e4);
2818
+ if (!(p3 instanceof LinkFileReplyD2HPacket)) {
2819
+ throw new VexTransferError("LinkFileH2DPacket failed");
2820
+ }
2821
+ }
2822
+ while (!lastBlock) {
2823
+ let tmpbuf;
2824
+ if (buf.byteLength - bufferOffset > bufferChunkSize) {
2825
+ tmpbuf = buf.subarray(bufferOffset, bufferOffset + bufferChunkSize);
2826
+ } else {
2827
+ const length = (buf.byteLength - bufferOffset + 3) / 4 >>> 0;
2828
+ tmpbuf = new Uint8Array(length * 4);
2829
+ tmpbuf.set(buf.subarray(bufferOffset, buf.byteLength));
2830
+ lastBlock = true;
2831
+ }
2832
+ const p2 = await this.writeDataAsync(new WriteFileH2DPacket(nextAddress, tmpbuf), 3000);
2833
+ if (!(p2 instanceof WriteFileReplyD2HPacket))
2834
+ throw new VexTransferError("WriteFileReplyD2DPacket failed");
2835
+ if (progressCallback != null)
2836
+ progressCallback(bufferOffset, buf.byteLength);
2837
+ bufferOffset += bufferChunkSize;
2838
+ nextAddress += bufferChunkSize;
2839
+ }
2840
+ progressCallback?.(buf.byteLength, buf.byteLength);
2841
+ transferFailed = false;
2842
+ } catch (e) {
2843
+ result = err(e instanceof VexSerialError ? e : toVexSerialError(e, "transfer"));
2844
+ } finally {
2845
+ try {
2846
+ exitReply = await this.writeDataAsync(new ExitFileTransferH2DPacket(transferFailed ? 3 /* EXIT_HALT */ : autoRun ? 1 /* EXIT_RUN */ : 3 /* EXIT_HALT */), 30000);
2847
+ if (!transferFailed) {
2848
+ result = ok(exitReply !== undefined && exitReply instanceof ExitFileTransferReplyD2HPacket);
2849
+ }
2850
+ } catch (cleanupError) {
2851
+ if (!transferFailed) {
2852
+ result = err(toVexSerialError(cleanupError, "io"));
2853
+ }
2854
+ }
2855
+ }
2856
+ return result;
2857
+ }
2858
+ removeFile(request) {
2859
+ return new ResultAsync(this.withFileTransfer(async () => {
2860
+ let vendor, filename;
2861
+ if (typeof request === "string") {
2862
+ vendor = 1 /* USER */;
2863
+ filename = request;
2864
+ } else {
2865
+ vendor = request.vendor;
2866
+ filename = request.filename;
2867
+ }
2868
+ let result;
2869
+ try {
2870
+ const ack = await this.writeDataAsync(new EraseFileH2DPacket(vendor, filename));
2871
+ result = ack instanceof EraseFileReplyD2HPacket ? ok(undefined) : err(new VexProtocolError("removeFile was not acknowledged"));
2872
+ } catch (e) {
2873
+ result = err(toVexSerialError(e, "io"));
2874
+ } finally {
2875
+ try {
2876
+ await this.writeDataAsync(new ExitFileTransferH2DPacket(3 /* EXIT_HALT */));
2877
+ } catch {}
2878
+ }
2879
+ return result;
2880
+ }));
2881
+ }
2882
+ removeAllFiles() {
2883
+ return new ResultAsync(this.withFileTransfer(async () => {
2884
+ let result;
2885
+ try {
2886
+ const ack = await this.writeDataAsync(new FileClearUpH2DPacket(1 /* USER */), 30000);
2887
+ result = ack instanceof FileClearUpReplyD2HPacket ? ok(undefined) : err(new VexProtocolError("removeAllFiles was not acknowledged"));
2888
+ } catch (e) {
2889
+ result = err(toVexSerialError(e, "io"));
2890
+ } finally {
2891
+ try {
2892
+ await this.writeDataAsync(new ExitFileTransferH2DPacket(3 /* EXIT_HALT */));
2893
+ } catch {}
2894
+ }
2895
+ return result;
2896
+ }));
2897
+ }
2898
+ captureScreenSetup() {
2899
+ return new ResultAsync((async () => {
2900
+ const result = await this.writeDataAsync(new ScreenCaptureH2DPacket(0));
2901
+ return result instanceof ScreenCaptureReplyD2HPacket ? ok(result) : err(new VexProtocolError("screen capture was rejected"));
2902
+ })());
2903
+ }
2904
+ captureScreen(progressCallback) {
2905
+ return wrapTransfer(this, () => this._captureScreen(progressCallback));
2906
+ }
2907
+ async _captureScreen(progressCallback) {
2908
+ const response = await this.captureScreenSetup();
2909
+ if (response.isErr()) {
2910
+ return err(response.error);
2911
+ }
2912
+ const framebuffer = await this.downloadFileToHostUnlocked({
2913
+ filename: "screen",
2914
+ vendor: 15 /* SYS */,
2915
+ loadAddress: 0,
2916
+ size: SCREEN_CAPTURE_MESSAGE_WIDTH * SCREEN_CAPTURE_HEIGHT * SCREEN_CAPTURE_MESSAGE_CHANNELS
2917
+ }, 2 /* FILE_TARGET_CBUF */, progressCallback);
2918
+ if (framebuffer.isErr())
2919
+ return err(framebuffer.error);
2920
+ return ok(convertScreenCapture(framebuffer.value));
2921
+ }
2922
+ setMatchMode(mode) {
2923
+ return new ResultAsync((async () => {
2924
+ const result = await this.writeDataAsync(new UpdateMatchModeH2DPacket(mode, 0));
2925
+ return result instanceof MatchModeReplyD2HPacket ? ok(result) : err(new VexProtocolError("setMatchMode was not acknowledged"));
2926
+ })());
2927
+ }
2928
+ runProgram(value) {
2929
+ return this.loadProgram(value);
2930
+ }
2931
+ loadProgram(value) {
2932
+ return new ResultAsync((async () => {
2933
+ const result = await this.writeDataAsync(new LoadFileActionH2DPacket(1 /* USER */, 0 /* RUN */, value));
2934
+ return result instanceof LoadFileActionReplyD2HPacket ? ok(result) : err(new VexProtocolError("loadProgram was not acknowledged"));
2935
+ })());
2936
+ }
2937
+ stopProgram() {
2938
+ return new ResultAsync((async () => {
2939
+ const result = await this.writeDataAsync(new LoadFileActionH2DPacket(1 /* USER */, 128 /* STOP */, ""));
2940
+ return result instanceof LoadFileActionReplyD2HPacket ? ok(result) : err(new VexProtocolError("stopProgram was not acknowledged"));
2941
+ })());
2942
+ }
2943
+ mockTouch(x, y, press) {
2944
+ return new ResultAsync((async () => {
2945
+ const result = await this.writeDataAsync(new SendDashTouchH2DPacket(x, y, press));
2946
+ return result instanceof SendDashTouchReplyD2HPacket ? ok(result) : err(new VexProtocolError("mockTouch was not acknowledged"));
2947
+ })());
2948
+ }
2949
+ openScreen(screen, port) {
2950
+ return new ResultAsync((async () => {
2951
+ const result = await this.writeDataAsync(new SelectDashH2DPacket(screen, port));
2952
+ return result instanceof SelectDashReplyD2HPacket ? ok(result) : err(new VexProtocolError("openScreen was not acknowledged"));
2953
+ })());
2954
+ }
2955
+ }
2956
+ function binaryArrayJoin(left, right) {
2957
+ const leftSize = left != null ? left.byteLength : 0;
2958
+ const rightSize = right != null ? right.byteLength : 0;
2959
+ const all = new Uint8Array(leftSize + rightSize);
2960
+ if (all.length === 0)
2961
+ return new Uint8Array;
2962
+ if (left != null)
2963
+ all.set(new Uint8Array(left), 0);
2964
+ if (right != null)
2965
+ all.set(new Uint8Array(right), leftSize);
2966
+ return all;
2967
+ }
2968
+ function getTransferChunkSize(windowSize) {
2969
+ return windowSize > 0 && windowSize <= USER_PROG_CHUNK_SIZE ? windowSize : USER_PROG_CHUNK_SIZE;
2970
+ }
2971
+ function convertScreenCapture(framebuffer) {
2972
+ const pixels = new Uint8Array(SCREEN_CAPTURE_WIDTH * SCREEN_CAPTURE_HEIGHT * SCREEN_CAPTURE_CHANNELS);
2973
+ for (let row = 0;row < SCREEN_CAPTURE_HEIGHT; row++) {
2974
+ for (let column = 0;column < SCREEN_CAPTURE_WIDTH; column++) {
2975
+ const source = (row * SCREEN_CAPTURE_MESSAGE_WIDTH + column) * SCREEN_CAPTURE_MESSAGE_CHANNELS;
2976
+ const target = (row * SCREEN_CAPTURE_WIDTH + column) * SCREEN_CAPTURE_CHANNELS;
2977
+ pixels[target] = framebuffer[source + 2] ?? 0;
2978
+ pixels[target + 1] = framebuffer[source + 1] ?? 0;
2979
+ pixels[target + 2] = framebuffer[source] ?? 0;
2980
+ }
2981
+ }
2982
+ return pixels;
2983
+ }
2984
+ function wrapTransfer(conn, operation) {
2985
+ return new ResultAsync(conn.withFileTransfer(async () => {
2986
+ try {
2987
+ return await operation();
2988
+ } catch (e) {
2989
+ if (e instanceof VexSerialError)
2990
+ return err(e);
2991
+ return err(toVexSerialError(e, "io"));
2992
+ }
2993
+ }));
2994
+ }
2995
+ function errAsyncVex(error) {
2996
+ return new ResultAsync(Promise.resolve(err(error)));
2997
+ }
2998
+ // src/VexFirmware.ts
2999
+ var MAX_CATALOG_BYTES = 4 * 1024;
3000
+ var MAX_VEXOS_BYTES = 64 * 1024 * 1024;
3001
+ var MAX_FIRMWARE_IMAGE_BYTES = 32 * 1024 * 1024;
3002
+ var MAX_AGGREGATE_IMAGE_BYTES = 48 * 1024 * 1024;
3003
+ function fromAsyncFn(fn) {
3004
+ return new ResultAsync(fn());
3005
+ }
3006
+ function downloadFileFromInternet(link, options = {}) {
3007
+ const { maxBytes = Number.POSITIVE_INFINITY, timeout = 30000 } = options;
3008
+ if (maxBytes <= 0) {
3009
+ return errAsync(new VexInvalidArgumentError("maxBytes must be positive"));
3010
+ }
3011
+ if (timeout < 0) {
3012
+ return errAsync(new VexInvalidArgumentError("timeout must be non-negative"));
3013
+ }
3014
+ return fromAsyncFn(() => runDownload(link, maxBytes, timeout));
3015
+ }
3016
+ async function runDownload(link, maxBytes, timeout) {
3017
+ const controller = new AbortController;
3018
+ const timer = setTimeout(() => controller.abort(), timeout);
3019
+ try {
3020
+ let response;
3021
+ try {
3022
+ response = await fetch(link, { signal: controller.signal });
3023
+ } catch (e) {
3024
+ return err(new VexDownloadError(`failed to download ${link} (${e instanceof Error ? e.message : String(e)})`));
3025
+ }
3026
+ if (!response.ok) {
3027
+ return err(new VexDownloadError(`failed to download ${link} (${response.status})`));
3028
+ }
3029
+ const declaredLength = response.headers.get("content-length");
3030
+ if (declaredLength !== null) {
3031
+ const declared = Number.parseInt(declaredLength, 10);
3032
+ if (!Number.isNaN(declared) && declared > 0 && declared > maxBytes) {
3033
+ return err(new VexDownloadError(`declared content length ${declared} exceeds limit ${maxBytes} for ${link}`));
3034
+ }
3035
+ }
3036
+ if (response.body == null) {
3037
+ return err(new VexDownloadError(`no response body for ${link}`));
3038
+ }
3039
+ const reader = response.body.getReader();
3040
+ const chunks = [];
3041
+ let total = 0;
3042
+ try {
3043
+ for (;; ) {
3044
+ const { value, done } = await reader.read();
3045
+ if (done)
3046
+ break;
3047
+ if (value === undefined)
3048
+ continue;
3049
+ total += value.byteLength;
3050
+ if (total > maxBytes) {
3051
+ try {
3052
+ await reader.cancel();
3053
+ } catch {}
3054
+ return err(new VexDownloadError(`downloaded body exceeds limit ${maxBytes} for ${link}`));
3055
+ }
3056
+ chunks.push(value);
3057
+ }
3058
+ } finally {
3059
+ try {
3060
+ reader.releaseLock();
3061
+ } catch {}
3062
+ }
3063
+ const result = new Uint8Array(total);
3064
+ let offset = 0;
3065
+ for (const chunk of chunks) {
3066
+ result.set(chunk, offset);
3067
+ offset += chunk.byteLength;
3068
+ }
3069
+ return ok(result.buffer);
3070
+ } finally {
3071
+ clearTimeout(timer);
3072
+ }
3073
+ }
3074
+ function sleepUntilAsync(f, timeout, interval = 20) {
3075
+ if (timeout < 0) {
3076
+ return errAsync(new VexInvalidArgumentError("timeout must be non-negative"));
3077
+ }
3078
+ if (interval <= 0) {
3079
+ return errAsync(new VexInvalidArgumentError("interval must be positive"));
3080
+ }
3081
+ return fromAsyncFn(() => runSleepUntilAsync(f, timeout, interval));
3082
+ }
3083
+ async function runSleepUntilAsync(f, timeout, interval) {
3084
+ const deadline = Date.now() + timeout;
3085
+ while (Date.now() <= deadline) {
3086
+ try {
3087
+ if (await f())
3088
+ return ok(true);
3089
+ } catch (e) {
3090
+ return err(toVexSerialError(e, "io"));
3091
+ }
3092
+ const remaining = deadline - Date.now();
3093
+ if (remaining <= 0)
3094
+ break;
3095
+ await sleepInner(Math.min(interval, remaining));
3096
+ }
3097
+ return ok(false);
3098
+ }
3099
+ function sleepUntil(f, timeout, interval = 20) {
3100
+ if (timeout < 0) {
3101
+ return errAsync(new VexInvalidArgumentError("timeout must be non-negative"));
3102
+ }
3103
+ if (interval <= 0) {
3104
+ return errAsync(new VexInvalidArgumentError("interval must be positive"));
3105
+ }
3106
+ return fromAsyncFn(() => runSleepUntil(f, timeout, interval));
3107
+ }
3108
+ async function runSleepUntil(f, timeout, interval) {
3109
+ const deadline = Date.now() + timeout;
3110
+ while (Date.now() <= deadline) {
3111
+ try {
3112
+ if (f())
3113
+ return ok(true);
3114
+ } catch (e) {
3115
+ return err(toVexSerialError(e, "io"));
3116
+ }
3117
+ const remaining = deadline - Date.now();
3118
+ if (remaining <= 0)
3119
+ break;
3120
+ await sleepInner(Math.min(interval, remaining));
3121
+ }
3122
+ return ok(false);
3123
+ }
3124
+ function sleep(ms) {
3125
+ if (ms < 0) {
3126
+ return errAsync(new VexInvalidArgumentError("ms must be non-negative"));
3127
+ }
3128
+ return ResultAsync.fromSafePromise(sleepInner(ms));
3129
+ }
3130
+ async function sleepInner(ms) {
3131
+ return new Promise((resolve) => setTimeout(resolve, ms));
3132
+ }
3133
+ async function extractFirmwareImages(usingVersion, vexos) {
3134
+ const { unzip } = await import("unzipit");
3135
+ const { entries } = await unzip(vexos);
3136
+ const expectedPaths = new Set([
3137
+ `${usingVersion}/BOOT.bin`,
3138
+ `${usingVersion}/assets.bin`
3139
+ ]);
3140
+ const unexpected = [];
3141
+ for (const name of Object.keys(entries)) {
3142
+ if (!expectedPaths.has(name))
3143
+ unexpected.push(name);
3144
+ }
3145
+ if (unexpected.length > 0) {
3146
+ throw new VexFirmwareError(`VEXos archive contains unexpected entries: ${unexpected.join(", ")}`);
3147
+ }
3148
+ const ordered = [];
3149
+ let aggregate = 0;
3150
+ for (const name of expectedPaths) {
3151
+ const entry = entries[name];
3152
+ if (entry === undefined) {
3153
+ throw new VexFirmwareError(`VEXos archive is missing ${name}`);
3154
+ }
3155
+ if (entry.encrypted) {
3156
+ throw new VexFirmwareError(`VEXos entry ${name} is encrypted`);
3157
+ }
3158
+ if (entry.size <= 0) {
3159
+ throw new VexFirmwareError(`VEXos entry ${name} is empty`);
3160
+ }
3161
+ if (entry.size > MAX_FIRMWARE_IMAGE_BYTES) {
3162
+ throw new VexFirmwareError(`VEXos entry ${name} (${entry.size} bytes) exceeds per-entry limit ${MAX_FIRMWARE_IMAGE_BYTES}`);
3163
+ }
3164
+ aggregate += entry.size;
3165
+ if (aggregate > MAX_AGGREGATE_IMAGE_BYTES) {
3166
+ throw new VexFirmwareError(`VEXos aggregate extracted size exceeds limit ${MAX_AGGREGATE_IMAGE_BYTES}`);
3167
+ }
3168
+ const buf = new Uint8Array(await entry.arrayBuffer());
3169
+ if (buf.byteLength === 0) {
3170
+ throw new VexFirmwareError(`VEXos entry ${name} is empty`);
3171
+ }
3172
+ if (buf.byteLength !== entry.size) {
3173
+ throw new VexFirmwareError(`VEXos entry ${name} size does not match its metadata (${buf.byteLength} vs ${entry.size})`);
3174
+ }
3175
+ ordered.push({ name, buf });
3176
+ }
3177
+ return ordered;
3178
+ }
3179
+ function uploadFirmware(state, publicUrl = "https://content.vexrobotics.com/vexos/public/V5/", usingVersion, progressCallback) {
3180
+ return fromAsyncFn(() => runUploadFirmware(state, publicUrl, usingVersion, progressCallback));
3181
+ }
3182
+ async function runUploadFirmware(state, publicUrl, usingVersion, progressCallback) {
3183
+ const device = state._instance;
3184
+ const conn = device.connection;
3185
+ if (conn == null || !conn.isConnected) {
3186
+ return err(new VexNotConnectedError);
3187
+ }
3188
+ const pcb = progressCallback ?? (() => {});
3189
+ let version = usingVersion;
3190
+ if (version === undefined) {
3191
+ pcb("FETCH CATALOG", 0, 1);
3192
+ const catalog = await downloadFileFromInternet(publicUrl + "catalog.txt", {
3193
+ maxBytes: MAX_CATALOG_BYTES
3194
+ });
3195
+ if (catalog.isErr())
3196
+ return err(catalog.error);
3197
+ version = new TextDecoder().decode(catalog.value).trim();
3198
+ pcb("FETCH CATALOG", 1, 1);
3199
+ }
3200
+ if (!/^[A-Za-z0-9._-]+$/.test(version)) {
3201
+ return err(new VexFirmwareError(`invalid VEXos version: ${version}`));
3202
+ }
3203
+ pcb("FETCH VEXOS", 0, 1);
3204
+ const vexosResult = await downloadFileFromInternet(publicUrl + version + ".vexos", { maxBytes: MAX_VEXOS_BYTES });
3205
+ if (vexosResult.isErr())
3206
+ return err(vexosResult.error);
3207
+ const vexos = vexosResult.value;
3208
+ if (vexos.byteLength === 0) {
3209
+ return err(new VexFirmwareError("VEXos archive is empty"));
3210
+ }
3211
+ pcb("FETCH VEXOS", 1, 1);
3212
+ pcb("UNZIP VEXOS", 0, 1);
3213
+ let images;
3214
+ try {
3215
+ images = await extractFirmwareImages(version, vexos);
3216
+ } catch (e) {
3217
+ if (e instanceof VexSerialError)
3218
+ return err(e);
3219
+ return err(toVexSerialError(e, "firmware"));
3220
+ }
3221
+ pcb("UNZIP VEXOS", 1, 1);
3222
+ return state.withFileTransfer(async () => {
3223
+ pcb("FACTORY ENB BOOT", 0, 0);
3224
+ const result = await conn.writeDataAsync(new FactoryEnableH2DPacket);
3225
+ if (!(result instanceof FactoryEnableReplyD2HPacket)) {
3226
+ return err(new VexProtocolError("FactoryEnableH2DPacket failed"));
3227
+ }
3228
+ const boot = images.find((image) => image.name.endsWith("BOOT.bin"));
3229
+ if (boot === undefined) {
3230
+ return err(new VexFirmwareError("VEXos archive is missing BOOT.bin"));
3231
+ }
3232
+ const assertImage = images.find((image) => image.name.endsWith("assets.bin"));
3233
+ if (assertImage === undefined) {
3234
+ return err(new VexFirmwareError("VEXos archive is missing assets.bin"));
3235
+ }
3236
+ const bootWriteRequest = {
3237
+ filename: "null.bin",
3238
+ vendor: 1 /* USER */,
3239
+ loadAddress: USER_FLASH_USR_CODE_START,
3240
+ buf: boot.buf,
3241
+ downloadTarget: 14 /* FILE_TARGET_B1 */,
3242
+ exttype: "bin",
3243
+ autoRun: true,
3244
+ linkedFile: undefined
3245
+ };
3246
+ const bootUpload = await conn.uploadFileToDevice(bootWriteRequest, (c, t) => {
3247
+ pcb("UPLOAD BOOT", c, t);
3248
+ });
3249
+ if (bootUpload.isErr())
3250
+ return err(bootUpload.error);
3251
+ if (!bootUpload.value)
3252
+ return ok(false);
3253
+ const bootDeadline = Date.now() + 120000;
3254
+ let bootComplete = false;
3255
+ while (Date.now() < bootDeadline) {
3256
+ const result3 = await conn.writeDataAsync(new FactoryStatusH2DPacket, 1e4);
3257
+ if (result3 instanceof FactoryStatusReplyD2HPacket) {
3258
+ switch (result3.status) {
3259
+ case 2:
3260
+ pcb("ERASE BOOT", result3.percent, 100);
3261
+ break;
3262
+ case 3:
3263
+ pcb("WRITE BOOT", result3.percent, 100);
3264
+ break;
3265
+ case 4:
3266
+ pcb("VERIFY BOOT", result3.percent, 100);
3267
+ break;
3268
+ case 8:
3269
+ pcb("FINISHING BOOT", result3.percent, 100);
3270
+ break;
3271
+ }
3272
+ if (result3.status === 0 && result3.percent === 100) {
3273
+ bootComplete = true;
3274
+ break;
3275
+ }
3276
+ } else {
3277
+ return ok(false);
3278
+ }
3279
+ await sleepInner(500);
3280
+ }
3281
+ if (!bootComplete)
3282
+ return ok(false);
3283
+ pcb("FACTORY ENB ASSERT", 0, 0);
3284
+ const result5 = await conn.writeDataAsync(new FactoryEnableH2DPacket);
3285
+ if (!(result5 instanceof FactoryEnableReplyD2HPacket)) {
3286
+ return err(new VexProtocolError("FactoryEnableH2DPacket failed"));
3287
+ }
3288
+ const assertWriteRequest = {
3289
+ filename: "null.bin",
3290
+ vendor: 1 /* USER */,
3291
+ loadAddress: USER_FLASH_USR_CODE_START,
3292
+ buf: assertImage.buf,
3293
+ downloadTarget: 13 /* FILE_TARGET_A1 */,
3294
+ exttype: "bin",
3295
+ autoRun: true,
3296
+ linkedFile: undefined
3297
+ };
3298
+ const assertUpload = await conn.uploadFileToDevice(assertWriteRequest, (c, t) => {
3299
+ pcb("UPLOAD ASSERT", c, t);
3300
+ });
3301
+ if (assertUpload.isErr())
3302
+ return err(assertUpload.error);
3303
+ if (!assertUpload.value)
3304
+ return ok(false);
3305
+ const assertDeadline = Date.now() + 120000;
3306
+ let assertComplete = false;
3307
+ while (Date.now() < assertDeadline) {
3308
+ const result7 = await conn.writeDataAsync(new FactoryStatusH2DPacket, 1e4);
3309
+ if (result7 instanceof FactoryStatusReplyD2HPacket) {
3310
+ switch (result7.status) {
3311
+ case 2:
3312
+ pcb("ERASE ASSERT", result7.percent, 100);
3313
+ break;
3314
+ case 3:
3315
+ pcb("WRITE ASSERT", result7.percent, 100);
3316
+ break;
3317
+ case 4:
3318
+ pcb("VERIFY ASSERT", result7.percent, 100);
3319
+ break;
3320
+ case 8:
3321
+ pcb("FINISHING ASSERT", result7.percent, 100);
3322
+ break;
3323
+ }
3324
+ if (result7.status === 0 && result7.percent === 100) {
3325
+ assertComplete = true;
3326
+ break;
3327
+ }
3328
+ } else {
3329
+ return ok(false);
3330
+ }
3331
+ await sleepInner(500);
3332
+ }
3333
+ if (!assertComplete)
3334
+ return ok(false);
3335
+ return ok(true);
3336
+ });
3337
+ }
3338
+
3339
+ // src/VexTransfers.ts
3340
+ function getValue(state, key) {
3341
+ return new ResultAsync((async () => {
3342
+ const conn = state._instance.connection;
3343
+ if (conn == null || !conn.isConnected) {
3344
+ return err(new VexNotConnectedError);
3345
+ }
3346
+ const result = await conn.writeDataAsync(new ReadKeyValueH2DPacket(key));
3347
+ return result instanceof ReadKeyValueReplyD2HPacket ? ok(result.value) : err(new VexProtocolError("getValue was not acknowledged"));
3348
+ })());
3349
+ }
3350
+ function setValue(state, key, value) {
3351
+ return new ResultAsync((async () => {
3352
+ const conn = state._instance.connection;
3353
+ if (conn == null || !conn.isConnected) {
3354
+ return err(new VexNotConnectedError);
3355
+ }
3356
+ const result = await conn.writeDataAsync(new WriteKeyValueH2DPacket(key, value));
3357
+ return result instanceof WriteKeyValueReplyD2HPacket ? ok(undefined) : err(new VexProtocolError("setValue was not acknowledged"));
3358
+ })());
3359
+ }
3360
+ function listFiles(state, vendor = 1 /* USER */) {
3361
+ return new ResultAsync((async () => {
3362
+ const conn = state._instance.connection;
3363
+ if (conn == null || !conn.isConnected) {
3364
+ return err(new VexNotConnectedError);
3365
+ }
3366
+ const result = await conn.writeDataAsync(new GetDirectoryFileCountH2DPacket(vendor));
3367
+ if (!(result instanceof GetDirectoryFileCountReplyD2HPacket)) {
3368
+ return err(new VexProtocolError("directory file count was not acknowledged"));
3369
+ }
3370
+ const files = [];
3371
+ for (let i = 0;i < result.count; i++) {
3372
+ const result2 = await conn.writeDataAsync(new GetDirectoryEntryH2DPacket(i));
3373
+ if (!(result2 instanceof GetDirectoryEntryReplyD2HPacket)) {
3374
+ return err(new VexProtocolError("directory entry was not acknowledged"));
3375
+ }
3376
+ if (result2.file != null) {
3377
+ files.push({
3378
+ filename: result2.file.filename,
3379
+ vendor,
3380
+ loadAddress: result2.file.loadAddress,
3381
+ size: result2.file.size,
3382
+ crc32: result2.file.crc32,
3383
+ type: result2.file.type,
3384
+ timestamp: result2.file.timestamp,
3385
+ version: result2.file.version
3386
+ });
3387
+ }
3388
+ }
3389
+ return ok(files);
3390
+ })());
3391
+ }
3392
+ function listProgram(state) {
3393
+ return new ResultAsync((async () => {
3394
+ const conn = state._instance.connection;
3395
+ if (conn == null || !conn.isConnected) {
3396
+ return err(new VexNotConnectedError);
3397
+ }
3398
+ const files = await listFiles(state, 1 /* USER */);
3399
+ if (files.isErr())
3400
+ return err(files.error);
3401
+ const programList = [];
3402
+ const iniFiles = files.value.filter((file) => file.filename.endsWith(".ini"));
3403
+ for (let i = 0;i < iniFiles.length; i++) {
3404
+ const ini = iniFiles[i];
3405
+ if (ini.size === 0)
3406
+ continue;
3407
+ const programName = /(.+?)(\.[^.]*$|$)/.exec(ini.filename)?.[1] ?? "";
3408
+ const bin = files.value.find((file) => file.filename === programName + ".bin");
3409
+ if (bin == null || bin.timestamp === 0 || bin.size === 0)
3410
+ continue;
3411
+ const n = new Date;
3412
+ n.setTime(1000 * bin.timestamp);
3413
+ const program = {
3414
+ name: programName,
3415
+ binfile: bin.filename,
3416
+ size: ini.size + bin.size,
3417
+ slot: -1,
3418
+ time: n,
3419
+ requestedSlot: -1
3420
+ };
3421
+ const result2 = await conn.writeDataAsync(new GetProgramSlotInfoH2DPacket(1 /* USER */, program.binfile));
3422
+ if (result2 instanceof GetProgramSlotInfoReplyD2HPacket) {
3423
+ program.slot = result2.slot;
3424
+ program.requestedSlot = result2.requestedSlot;
3425
+ }
3426
+ programList.push(program);
3427
+ }
3428
+ return ok(programList);
3429
+ })());
3430
+ }
3431
+ function readFile(state, request, downloadTarget = 1 /* FILE_TARGET_QSPI */, progressCallback) {
3432
+ return new ResultAsync((async () => {
3433
+ const conn = state._instance.connection;
3434
+ if (conn == null || !conn.isConnected) {
3435
+ return err(new VexNotConnectedError);
3436
+ }
3437
+ let handle;
3438
+ if (typeof request === "string") {
3439
+ handle = { filename: request, vendor: 1 /* USER */ };
3440
+ } else {
3441
+ handle = request;
3442
+ }
3443
+ return state.withFileTransfer(() => conn.downloadFileToHost(handle, downloadTarget, progressCallback));
3444
+ })());
3445
+ }
3446
+ function removeFile(state, request) {
3447
+ return new ResultAsync((async () => {
3448
+ const conn = state._instance.connection;
3449
+ if (conn == null || !conn.isConnected) {
3450
+ return err(new VexNotConnectedError);
3451
+ }
3452
+ return state.withFileTransfer(() => conn.removeFile(request));
3453
+ })());
3454
+ }
3455
+ function removeAllFiles(state) {
3456
+ return new ResultAsync((async () => {
3457
+ const conn = state._instance.connection;
3458
+ if (conn == null || !conn.isConnected) {
3459
+ return err(new VexNotConnectedError);
3460
+ }
3461
+ return state.withFileTransfer(() => conn.removeAllFiles());
3462
+ })());
3463
+ }
3464
+ function uploadProgram(state, iniConfig, binFileBuf, coldFileBuf, progressCallback) {
3465
+ return new ResultAsync(runUploadProgram(state, iniConfig, binFileBuf, coldFileBuf, progressCallback));
3466
+ }
3467
+ async function runUploadProgram(state, iniConfig, binFileBuf, coldFileBuf, progressCallback) {
3468
+ const device = state._instance;
3469
+ const conn = device.connection;
3470
+ if (conn == null || !conn.isConnected) {
3471
+ return err(new VexNotConnectedError);
3472
+ }
3473
+ let switchedToDownload = false;
3474
+ return state.withFileTransfer(async () => {
3475
+ try {
3476
+ if (device.isV5Controller) {
3477
+ await sleep(250);
3478
+ const refreshed = await device.refresh();
3479
+ if (refreshed.isErr() || !refreshed.value) {
3480
+ return err(new VexProtocolError("device is unavailable"));
3481
+ }
3482
+ progressCallback("CHANNEL", 0, 1);
3483
+ const p1 = await device.radio.changeChannel(1 /* DOWNLOAD */);
3484
+ if (p1.isErr())
3485
+ return err(p1.error);
3486
+ switchedToDownload = true;
3487
+ await sleep(250);
3488
+ const transferred = await sleepUntilAsync(async () => (await conn?.getSystemStatus(150))?.isOk() ?? false, 1e4, 200);
3489
+ if (transferred.isErr())
3490
+ return err(transferred.error);
3491
+ if (!transferred.value) {
3492
+ return err(new VexProtocolError("channel switch timed out"));
3493
+ }
3494
+ progressCallback("CHANNEL", 1, 1);
3495
+ }
3496
+ const p2 = await conn.uploadProgramToDevice(iniConfig, binFileBuf, coldFileBuf, progressCallback);
3497
+ if (p2.isErr())
3498
+ return err(p2.error);
3499
+ if (!p2.value)
3500
+ return err(new VexProtocolError("program upload rejected"));
3501
+ if (device.isV5Controller) {
3502
+ if (!device.brain.isAvailable) {
3503
+ return err(new VexProtocolError("brain unavailable after upload"));
3504
+ }
3505
+ progressCallback("CHANNEL", 0, 1);
3506
+ const p3 = await device.radio.changeChannel(0 /* PIT */);
3507
+ if (p3.isErr())
3508
+ return err(p3.error);
3509
+ switchedToDownload = false;
3510
+ await sleep(250);
3511
+ const transferred = await sleepUntilAsync(async () => (await conn?.getSystemStatus(150))?.isOk() ?? false, 1e4, 200);
3512
+ if (transferred.isErr())
3513
+ return err(transferred.error);
3514
+ if (!transferred.value) {
3515
+ return err(new VexProtocolError("channel switch timed out"));
3516
+ }
3517
+ progressCallback("CHANNEL", 1, 1);
3518
+ }
3519
+ return ok(true);
3520
+ } finally {
3521
+ if (switchedToDownload) {
3522
+ await device.radio.changeChannel(0 /* PIT */);
3523
+ }
3524
+ }
3525
+ });
3526
+ }
3527
+ function writeFile(state, request, progressCallback) {
3528
+ return new ResultAsync((async () => {
3529
+ const conn = state._instance.connection;
3530
+ if (conn == null || !conn.isConnected) {
3531
+ return err(new VexNotConnectedError);
3532
+ }
3533
+ return state.withFileTransfer(() => conn.uploadFileToDevice(request, progressCallback));
3534
+ })());
3535
+ }
3536
+ function captureScreen(state, progressCallback) {
3537
+ return new ResultAsync((async () => {
3538
+ const conn = state._instance.connection;
3539
+ if (conn == null || !conn.isConnected) {
3540
+ return err(new VexNotConnectedError);
3541
+ }
3542
+ return state.withFileTransfer(() => conn.captureScreen(progressCallback));
3543
+ })());
3544
+ }
3545
+
3546
+ // src/VexDeviceState.ts
3547
+ class VexSerialDevice extends VexEventTarget {
3548
+ connection;
3549
+ defaultSerial;
3550
+ get isConnected() {
3551
+ return this.connection != null ? this.connection.isConnected : false;
3552
+ }
3553
+ get deviceType() {
3554
+ return this.isConnected ? this.connection?.port?.getInfo().usbProductId : undefined;
3555
+ }
3556
+ constructor(defaultSerial) {
3557
+ super();
3558
+ this.defaultSerial = defaultSerial;
3559
+ }
3560
+ }
3561
+
3562
+ class V5SerialDeviceState {
3563
+ _instance;
3564
+ refreshPauseDepth = 0;
3565
+ get isFileTransferring() {
3566
+ return this.refreshPauseDepth > 0;
3567
+ }
3568
+ async withFileTransfer(operation) {
3569
+ this.refreshPauseDepth++;
3570
+ try {
3571
+ return await operation();
3572
+ } finally {
3573
+ this.refreshPauseDepth--;
3574
+ }
3575
+ }
3576
+ brain = {
3577
+ activeProgram: 0,
3578
+ battery: {
3579
+ batteryPercent: 0,
3580
+ isCharging: false
3581
+ },
3582
+ button: {
3583
+ isPressed: false,
3584
+ isDoublePressed: false
3585
+ },
3586
+ cpu0Version: VexFirmwareVersion.allZero(),
3587
+ cpu1Version: VexFirmwareVersion.allZero(),
3588
+ isAvailable: false,
3589
+ settings: {
3590
+ isScreenReversed: false,
3591
+ isWhiteTheme: false,
3592
+ usingLanguage: 0
3593
+ },
3594
+ systemVersion: VexFirmwareVersion.allZero(),
3595
+ uniqueId: 0
3596
+ };
3597
+ controllers = [
3598
+ {
3599
+ battery: 0,
3600
+ isAvailable: false,
3601
+ isCharging: false
3602
+ },
3603
+ {
3604
+ battery: 0,
3605
+ isAvailable: false
3606
+ }
3607
+ ];
3608
+ devices = [];
3609
+ isFieldControllerConnected = false;
3610
+ matchMode = "disabled";
3611
+ radio = {
3612
+ channel: 0,
3613
+ isAvailable: false,
3614
+ isConnected: false,
3615
+ isVexNet: false,
3616
+ isRadioData: false,
3617
+ latency: 0,
3618
+ signalQuality: 0,
3619
+ signalStrength: 0
3620
+ };
3621
+ constructor(instance) {
3622
+ this._instance = instance;
3623
+ }
3624
+ }
3625
+
3626
+ class V5Brain {
3627
+ state;
3628
+ constructor(state) {
3629
+ this.state = state;
3630
+ }
3631
+ get isRunningProgram() {
3632
+ return this.activeProgram !== 0;
3633
+ }
3634
+ get activeProgram() {
3635
+ return this.state.brain.activeProgram;
3636
+ }
3637
+ set activeProgram(value) {
3638
+ this.setActiveProgram(value).mapErr(() => {});
3639
+ }
3640
+ setActiveProgram(value) {
3641
+ return new ResultAsync((async () => {
3642
+ if (this.state.brain.activeProgram === value)
3643
+ return ok(undefined);
3644
+ const conn = this.state._instance.connection;
3645
+ if (conn == null)
3646
+ return err(new VexNotConnectedError);
3647
+ const result = value === 0 ? await conn.stopProgram() : await conn.loadProgram(value);
3648
+ if (result.isErr())
3649
+ return err(result.error);
3650
+ this.state.brain.activeProgram = value;
3651
+ return ok(undefined);
3652
+ })());
3653
+ }
3654
+ runProgram(slot) {
3655
+ return new ResultAsync((async () => {
3656
+ const conn = this.state._instance.connection;
3657
+ if (conn == null)
3658
+ return err(new VexNotConnectedError);
3659
+ const reply = await conn.runProgram(slot);
3660
+ if (reply.isErr())
3661
+ return err(reply.error);
3662
+ const slotNumber = typeof slot === "string" ? Number.parseInt(slot, 10) : slot;
3663
+ if (Number.isFinite(slotNumber))
3664
+ this.state.brain.activeProgram = slotNumber;
3665
+ return ok(undefined);
3666
+ })());
3667
+ }
3668
+ stopProgram() {
3669
+ return new ResultAsync((async () => {
3670
+ const conn = this.state._instance.connection;
3671
+ if (conn == null)
3672
+ return err(new VexNotConnectedError);
3673
+ const reply = await conn.stopProgram();
3674
+ if (reply.isErr())
3675
+ return err(reply.error);
3676
+ this.state.brain.activeProgram = 0;
3677
+ return ok(undefined);
3678
+ })());
3679
+ }
3680
+ get battery() {
3681
+ return new V5Battery(this.state);
3682
+ }
3683
+ get button() {
3684
+ return new V5BrainButton(this.state);
3685
+ }
3686
+ get cpu0Version() {
3687
+ return this.state.brain.cpu0Version;
3688
+ }
3689
+ get cpu1Version() {
3690
+ return this.state.brain.cpu1Version;
3691
+ }
3692
+ get isAvailable() {
3693
+ return this.state.brain.isAvailable;
3694
+ }
3695
+ get settings() {
3696
+ return new V5BrainSettings(this.state);
3697
+ }
3698
+ get systemVersion() {
3699
+ return this.state.brain.systemVersion;
3700
+ }
3701
+ get uniqueId() {
3702
+ return this.state.brain.uniqueId;
3703
+ }
3704
+ getValue(key) {
3705
+ return getValue(this.state, key);
3706
+ }
3707
+ setValue(key, value) {
3708
+ return setValue(this.state, key, value);
3709
+ }
3710
+ listFiles(vendor = 1 /* USER */) {
3711
+ return listFiles(this.state, vendor);
3712
+ }
3713
+ listProgram() {
3714
+ return listProgram(this.state);
3715
+ }
3716
+ readFile(request, downloadTarget = 1 /* FILE_TARGET_QSPI */, progressCallback) {
3717
+ return readFile(this.state, request, downloadTarget, progressCallback);
3718
+ }
3719
+ removeFile(request) {
3720
+ return removeFile(this.state, request);
3721
+ }
3722
+ removeAllFiles() {
3723
+ return removeAllFiles(this.state);
3724
+ }
3725
+ uploadFirmware(publicUrl = "https://content.vexrobotics.com/vexos/public/V5/", usingVersion, progressCallback) {
3726
+ return uploadFirmware(this.state, publicUrl, usingVersion, progressCallback);
3727
+ }
3728
+ uploadProgram(iniConfig, binFileBuf, coldFileBuf, progressCallback) {
3729
+ return uploadProgram(this.state, iniConfig, binFileBuf, coldFileBuf, progressCallback);
3730
+ }
3731
+ writeFile(request, progressCallback) {
3732
+ return writeFile(this.state, request, progressCallback);
3733
+ }
3734
+ captureScreen(progressCallback) {
3735
+ return captureScreen(this.state, progressCallback);
3736
+ }
3737
+ }
3738
+
3739
+ class V5Battery {
3740
+ state;
3741
+ constructor(state) {
3742
+ this.state = state;
3743
+ }
3744
+ get batteryPercent() {
3745
+ return this.state.brain.battery.batteryPercent;
3746
+ }
3747
+ get isCharging() {
3748
+ return this.state.brain.battery.isCharging;
3749
+ }
3750
+ }
3751
+
3752
+ class V5BrainButton {
3753
+ state;
3754
+ constructor(state) {
3755
+ this.state = state;
3756
+ }
3757
+ get isPressed() {
3758
+ return this.state.brain.button.isPressed;
3759
+ }
3760
+ get isDoublePressed() {
3761
+ return this.state.brain.button.isDoublePressed;
3762
+ }
3763
+ }
3764
+
3765
+ class V5BrainSettings {
3766
+ state;
3767
+ constructor(state) {
3768
+ this.state = state;
3769
+ }
3770
+ get isScreenReversed() {
3771
+ return this.state.brain.settings.isScreenReversed;
3772
+ }
3773
+ get isWhiteTheme() {
3774
+ return this.state.brain.settings.isWhiteTheme;
3775
+ }
3776
+ get usingLanguage() {
3777
+ return this.state.brain.settings.usingLanguage;
3778
+ }
3779
+ }
3780
+
3781
+ class V5Controller {
3782
+ state;
3783
+ controllerIndex;
3784
+ constructor(state, controllerIndex) {
3785
+ this.state = state;
3786
+ this.controllerIndex = controllerIndex;
3787
+ }
3788
+ get batteryPercent() {
3789
+ return this.state.controllers[this.controllerIndex].battery;
3790
+ }
3791
+ get isMasterController() {
3792
+ return this.controllerIndex === 0;
3793
+ }
3794
+ get isAvailable() {
3795
+ return this.state.controllers[this.controllerIndex].isAvailable;
3796
+ }
3797
+ get isCharging() {
3798
+ return this.state.controllers[this.controllerIndex].isCharging;
3799
+ }
3800
+ }
3801
+
3802
+ class V5SmartDevice {
3803
+ state;
3804
+ deviceIndex;
3805
+ constructor(state, index) {
3806
+ this.state = state;
3807
+ this.deviceIndex = index;
3808
+ }
3809
+ getDeviceInfo() {
3810
+ return this.state.devices[this.deviceIndex];
3811
+ }
3812
+ get isAvailable() {
3813
+ return this.getDeviceInfo() !== undefined;
3814
+ }
3815
+ get port() {
3816
+ return this.deviceIndex;
3817
+ }
3818
+ get type() {
3819
+ return this.getDeviceInfo()?.type ?? 0 /* EMPTY */;
3820
+ }
3821
+ get version() {
3822
+ return this.getDeviceInfo()?.version ?? 0;
3823
+ }
3824
+ }
3825
+
3826
+ class V5Radio {
3827
+ state;
3828
+ constructor(state) {
3829
+ this.state = state;
3830
+ }
3831
+ get channel() {
3832
+ return this.state.radio.channel;
3833
+ }
3834
+ get isAvailable() {
3835
+ return this.state.radio.isAvailable;
3836
+ }
3837
+ get isConnected() {
3838
+ return this.state.radio.isConnected;
3839
+ }
3840
+ get isVexNet() {
3841
+ return this.state.radio.isVexNet;
3842
+ }
3843
+ get isRadioData() {
3844
+ return this.state.radio.isRadioData;
3845
+ }
3846
+ get latency() {
3847
+ return this.state.radio.latency;
3848
+ }
3849
+ changeChannel(channel) {
3850
+ return new ResultAsync((async () => {
3851
+ const result = await this.state._instance.connection?.writeDataAsync(new FileControlH2DPacket(1, channel));
3852
+ return result instanceof FileControlReplyD2HPacket ? ok(undefined) : err(new VexProtocolError("changeChannel was not acknowledged"));
3853
+ })());
3854
+ }
3855
+ }
3856
+
3857
+ // src/VexDevice.ts
3858
+ class V5SerialDevice extends VexSerialDevice {
3859
+ autoReconnect = true;
3860
+ autoRefresh = true;
3861
+ pauseRefreshOnFileTransfer = true;
3862
+ _isReconnecting = false;
3863
+ _isDisconnecting = false;
3864
+ _refreshInterval;
3865
+ state = new V5SerialDeviceState(this);
3866
+ _disposed = false;
3867
+ _refreshGeneration = 0;
3868
+ constructor(defaultSerial) {
3869
+ super(defaultSerial);
3870
+ let isLastRefreshComplete = true;
3871
+ this._refreshInterval = setInterval(() => {
3872
+ if (this._disposed)
3873
+ return;
3874
+ if (this.autoRefresh && isLastRefreshComplete) {
3875
+ if (!this.isConnected) {
3876
+ this.state.brain.isAvailable = false;
3877
+ return;
3878
+ }
3879
+ if (!this.pauseRefreshOnFileTransfer || !this.state.isFileTransferring) {
3880
+ isLastRefreshComplete = false;
3881
+ (async () => {
3882
+ try {
3883
+ const r = await this.refresh();
3884
+ if (r.isErr())
3885
+ this.emit("error", r.error);
3886
+ } catch (error) {
3887
+ this.emit("error", error);
3888
+ } finally {
3889
+ isLastRefreshComplete = true;
3890
+ }
3891
+ })();
3892
+ }
3893
+ }
3894
+ }, 200);
3895
+ }
3896
+ get isV5Controller() {
3897
+ return this.deviceType === 1283 /* V5_CONTROLLER */;
3898
+ }
3899
+ get brain() {
3900
+ return new V5Brain(this.state);
3901
+ }
3902
+ get controllers() {
3903
+ return [new V5Controller(this.state, 0), new V5Controller(this.state, 1)];
3904
+ }
3905
+ get devices() {
3906
+ const rtn = [];
3907
+ for (let i = 1;i <= this.state.devices.length; i++) {
3908
+ if (this.state.devices[i] != null)
3909
+ rtn.push(new V5SmartDevice(this.state, i));
3910
+ }
3911
+ return rtn;
3912
+ }
3913
+ get isFieldControllerConnected() {
3914
+ return this.state.isFieldControllerConnected;
3915
+ }
3916
+ get matchMode() {
3917
+ return this.state.matchMode;
3918
+ }
3919
+ set matchMode(value) {
3920
+ this.setMatchMode(value).mapErr(() => {});
3921
+ }
3922
+ setMatchMode(mode) {
3923
+ return new ResultAsync((async () => {
3924
+ const reply = await this.connection?.setMatchMode(mode);
3925
+ if (reply === undefined)
3926
+ return err(new VexNotConnectedError);
3927
+ if (reply.isErr())
3928
+ return err(reply.error);
3929
+ this.state.matchMode = mode;
3930
+ return ok(undefined);
3931
+ })());
3932
+ }
3933
+ get radio() {
3934
+ return new V5Radio(this.state);
3935
+ }
3936
+ mockTouch(x, y, press) {
3937
+ return new ResultAsync((async () => {
3938
+ const reply = await this.connection?.mockTouch(x, y, press);
3939
+ if (reply === undefined)
3940
+ return err(new VexNotConnectedError);
3941
+ if (reply.isErr())
3942
+ return err(reply.error);
3943
+ return ok(undefined);
3944
+ })());
3945
+ }
3946
+ connect(conn) {
3947
+ return new ResultAsync(this._connect(conn));
3948
+ }
3949
+ async _connect(conn) {
3950
+ if (this.isConnected)
3951
+ return ok(undefined);
3952
+ if (conn != null) {
3953
+ if (!conn.isConnected) {
3954
+ const opened = await conn.open();
3955
+ if (opened.isErr() || opened.value !== true) {
3956
+ return err(new VexIoError("failed to open the supplied connection"));
3957
+ }
3958
+ }
3959
+ const q = await conn.query1();
3960
+ if (q.isErr()) {
3961
+ await conn.close();
3962
+ return err(q.error);
3963
+ }
3964
+ this.connection = conn;
3965
+ } else {
3966
+ let tryIdx = 0;
3967
+ while (true) {
3968
+ const c = new V5SerialConnection(this.defaultSerial);
3969
+ const result = await c.open(tryIdx++, true);
3970
+ if (result.isErr()) {
3971
+ await c.close();
3972
+ return err(result.error);
3973
+ }
3974
+ if (result.value === undefined) {
3975
+ return err(new VexNotConnectedError("no V5 device was found"));
3976
+ }
3977
+ if (!result.value) {
3978
+ await c.close();
3979
+ continue;
3980
+ }
3981
+ const q = await c.query1();
3982
+ if (q.isErr()) {
3983
+ await c.close();
3984
+ continue;
3985
+ }
3986
+ this.connection = c;
3987
+ break;
3988
+ }
3989
+ }
3990
+ if (!this.isConnected)
3991
+ return err(new VexNotConnectedError);
3992
+ await this.doAfterConnect();
3993
+ return ok(undefined);
3994
+ }
3995
+ async disconnect() {
3996
+ this._isDisconnecting = true;
3997
+ const connection = this.connection;
3998
+ this.connection = undefined;
3999
+ try {
4000
+ await connection?.close();
4001
+ } finally {
4002
+ this._isDisconnecting = false;
4003
+ }
4004
+ }
4005
+ async dispose() {
4006
+ this.autoReconnect = false;
4007
+ this.autoRefresh = false;
4008
+ this._disposed = true;
4009
+ if (this._refreshInterval !== undefined) {
4010
+ clearInterval(this._refreshInterval);
4011
+ this._refreshInterval = undefined;
4012
+ }
4013
+ await this.disconnect();
4014
+ }
4015
+ reconnect(timeout = 0) {
4016
+ return new ResultAsync(this._reconnect(timeout));
4017
+ }
4018
+ async _reconnect(timeout) {
4019
+ if (this.isConnected)
4020
+ return ok(undefined);
4021
+ if (timeout < 0) {
4022
+ return err(new VexInvalidArgumentError("timeout must be non-negative"));
4023
+ }
4024
+ const endTime = Date.now() + timeout;
4025
+ if (this._isReconnecting) {
4026
+ if (timeout === 0) {
4027
+ await this.waitForReconnectToFinish();
4028
+ } else {
4029
+ const waited = await sleepUntil(() => !this._isReconnecting, timeout);
4030
+ if (waited.isErr() || !waited.value) {
4031
+ return err(new VexNotConnectedError);
4032
+ }
4033
+ }
4034
+ if (this.isConnected)
4035
+ return ok(undefined);
4036
+ }
4037
+ this._isReconnecting = true;
4038
+ try {
4039
+ while (timeout === 0 || Date.now() < endTime) {
4040
+ let tryIdx = 0;
4041
+ while (true) {
4042
+ const c = new V5SerialConnection(this.defaultSerial);
4043
+ const result = await c.open(tryIdx++, false);
4044
+ if (result.isErr()) {
4045
+ await c.close();
4046
+ return err(result.error);
4047
+ }
4048
+ if (result.value === undefined)
4049
+ break;
4050
+ if (!result.value) {
4051
+ await c.close();
4052
+ continue;
4053
+ }
4054
+ const status = await c.getSystemStatus(200);
4055
+ if (status.isErr()) {
4056
+ await c.close();
4057
+ continue;
4058
+ }
4059
+ if (this.brain.uniqueId !== 0 && status.value.uniqueId !== this.brain.uniqueId) {
4060
+ await c.close();
4061
+ continue;
4062
+ }
4063
+ this.connection = c;
4064
+ break;
4065
+ }
4066
+ if (this.isConnected)
4067
+ break;
4068
+ const getPortCount = async () => (await this.defaultSerial.getPorts()).length;
4069
+ const portsCount = await getPortCount();
4070
+ await sleepUntilAsync(async () => await getPortCount() !== portsCount, 1000);
4071
+ }
4072
+ } catch (e) {
4073
+ return err(toVexSerialError(e));
4074
+ } finally {
4075
+ this._isReconnecting = false;
4076
+ }
4077
+ if (!this.isConnected)
4078
+ return err(new VexNotConnectedError);
4079
+ await this.doAfterConnect();
4080
+ return ok(undefined);
4081
+ }
4082
+ async waitForReconnectToFinish() {
4083
+ while (this._isReconnecting) {
4084
+ const r = await sleepUntil(() => !this._isReconnecting, 1000);
4085
+ if (r.isOk() && r.value)
4086
+ return;
4087
+ }
4088
+ }
4089
+ async doAfterConnect() {
4090
+ if (this.connection == null)
4091
+ return;
4092
+ this.connection.on("disconnected", (_data) => {
4093
+ if (this.autoReconnect && !this._isDisconnecting) {
4094
+ this.reconnect().mapErr((e) => this.emit("error", e));
4095
+ }
4096
+ });
4097
+ await this.refresh();
4098
+ }
4099
+ refresh() {
4100
+ return new ResultAsync(this._refresh());
4101
+ }
4102
+ async _refresh() {
4103
+ if (this._disposed)
4104
+ return ok(false);
4105
+ const generation = ++this._refreshGeneration;
4106
+ const conn = this.connection;
4107
+ if (conn == null || !conn.isConnected) {
4108
+ this._applySnapshotIfCurrent(generation, { isAvailable: false });
4109
+ return ok(false);
4110
+ }
4111
+ const ssPacket = await conn.getSystemStatus();
4112
+ if (generation !== this._refreshGeneration || this._disposed)
4113
+ return ok(false);
4114
+ if (ssPacket.isErr()) {
4115
+ this._applySnapshotIfCurrent(generation, { isAvailable: false });
4116
+ return ok(false);
4117
+ }
4118
+ const sfPacket = await conn.getSystemFlags();
4119
+ if (generation !== this._refreshGeneration || this._disposed)
4120
+ return ok(false);
4121
+ if (sfPacket.isErr()) {
4122
+ this._applySnapshotIfCurrent(generation, { isAvailable: false });
4123
+ return ok(false);
4124
+ }
4125
+ const rdPacket = await conn.getRadioStatus();
4126
+ if (generation !== this._refreshGeneration || this._disposed)
4127
+ return ok(false);
4128
+ if (rdPacket.isErr()) {
4129
+ this._applySnapshotIfCurrent(generation, { isAvailable: false });
4130
+ return ok(false);
4131
+ }
4132
+ const dsPacket = await conn.getDeviceStatus();
4133
+ if (generation !== this._refreshGeneration || this._disposed)
4134
+ return ok(false);
4135
+ if (dsPacket.isErr()) {
4136
+ this._applySnapshotIfCurrent(generation, { isAvailable: false });
4137
+ return ok(false);
4138
+ }
4139
+ const snapshot = this._buildSnapshot(ssPacket.value, sfPacket.value, rdPacket.value, dsPacket.value);
4140
+ return ok(this._applySnapshotIfCurrent(generation, snapshot));
4141
+ }
4142
+ _buildSnapshot(ssPacket, sfPacket, rdPacket, dsPacket) {
4143
+ const flags2 = ssPacket.sysflags[2];
4144
+ const matchMode = (flags2 & 32) !== 0 ? "disabled" : (flags2 & 64) !== 0 ? "autonomous" : "driver";
4145
+ const isFieldControllerConnected = (flags2 & 16) !== 0;
4146
+ const flags4 = ssPacket.sysflags[4];
4147
+ const usingLanguage = (flags4 & 240) >> 4;
4148
+ const isWhiteTheme = (flags4 & 4) !== 0;
4149
+ const isScreenReversed = (flags4 & 1) === 0;
4150
+ const flags5 = sfPacket.flags;
4151
+ const hasFlag = (bit) => (flags5 & 2 ** (32 - bit)) !== 0;
4152
+ const isRadioData = hasFlag(12);
4153
+ const isDoublePressed = hasFlag(14);
4154
+ const isCharging = hasFlag(15);
4155
+ const isPressed = hasFlag(17);
4156
+ const isVexNet = hasFlag(18);
4157
+ const controller1Available = hasFlag(19);
4158
+ const radioConnected = hasFlag(22);
4159
+ const radioAvailable = hasFlag(23);
4160
+ const batteryPercent = sfPacket.battery ?? 0;
4161
+ const controller0Available = radioConnected || sfPacket.controllerBatteryPercent !== undefined;
4162
+ const controller0Battery = sfPacket.controllerBatteryPercent ?? 0;
4163
+ const controller1Battery = sfPacket.partnerControllerBatteryPercent ?? 0;
4164
+ const activeProgram = sfPacket.currentProgram;
4165
+ const isAvailable = !this.isV5Controller || radioConnected;
4166
+ const devices = dsPacket.devices.map((d) => ({ ...d }));
4167
+ return {
4168
+ isAvailable: true,
4169
+ matchMode,
4170
+ isFieldControllerConnected,
4171
+ brain: {
4172
+ ...this.state.brain,
4173
+ activeProgram,
4174
+ battery: { batteryPercent, isCharging },
4175
+ button: { isPressed, isDoublePressed },
4176
+ cpu0Version: ssPacket.cpu0Version,
4177
+ cpu1Version: ssPacket.cpu1Version,
4178
+ isAvailable,
4179
+ settings: { isScreenReversed, isWhiteTheme, usingLanguage },
4180
+ systemVersion: ssPacket.systemVersion,
4181
+ uniqueId: ssPacket.uniqueId
4182
+ },
4183
+ controllers: [
4184
+ {
4185
+ battery: controller0Battery,
4186
+ isAvailable: controller0Available,
4187
+ isCharging: (flags2 & 128) !== 0
4188
+ },
4189
+ {
4190
+ battery: controller1Battery,
4191
+ isAvailable: controller1Available
4192
+ }
4193
+ ],
4194
+ radio: {
4195
+ channel: rdPacket.channel,
4196
+ latency: rdPacket.timeslot,
4197
+ signalQuality: rdPacket.quality,
4198
+ signalStrength: rdPacket.strength,
4199
+ isRadioData,
4200
+ isVexNet,
4201
+ isConnected: radioConnected,
4202
+ isAvailable: radioAvailable
4203
+ },
4204
+ devices
4205
+ };
4206
+ }
4207
+ _applySnapshotIfCurrent(generation, snapshot) {
4208
+ if (this._disposed)
4209
+ return false;
4210
+ if (generation !== this._refreshGeneration)
4211
+ return false;
4212
+ if (snapshot.isAvailable === false) {
4213
+ this.state.brain.isAvailable = false;
4214
+ return false;
4215
+ }
4216
+ this.state.matchMode = snapshot.matchMode;
4217
+ this.state.isFieldControllerConnected = snapshot.isFieldControllerConnected;
4218
+ Object.assign(this.state.brain, snapshot.brain);
4219
+ Object.assign(this.state.controllers[0], snapshot.controllers[0]);
4220
+ Object.assign(this.state.controllers[1], snapshot.controllers[1]);
4221
+ Object.assign(this.state.radio, snapshot.radio);
4222
+ const next = [];
4223
+ for (const device of snapshot.devices) {
4224
+ if (device != null)
4225
+ next[device.port] = device;
4226
+ }
4227
+ this.state.devices = next;
4228
+ return true;
4229
+ }
4230
+ }
4231
+ // src/VexIniConfig.ts
4232
+ class BaseIniBuilder {
4233
+ str = "";
4234
+ addLine(line) {
4235
+ this.str += line + `
4236
+ `;
4237
+ }
4238
+ addComment(comment) {
4239
+ this.addLine("; " + comment);
4240
+ return this;
4241
+ }
4242
+ getContent() {
4243
+ return this.str;
4244
+ }
4245
+ }
4246
+
4247
+ class IniSectionBuilder extends BaseIniBuilder {
4248
+ name;
4249
+ object;
4250
+ keyTransform;
4251
+ constructor(name, object, keyTransform = (k) => k.toString()) {
4252
+ super();
4253
+ this.name = name;
4254
+ this.object = object;
4255
+ this.keyTransform = keyTransform;
4256
+ }
4257
+ addSingleObjProperty(key, maxValueLength) {
4258
+ if (this.object[key] == null || this.object[key].toString().length === 0)
4259
+ return;
4260
+ const formattedKey = this.keyTransform(key).padEnd(12).slice(0, 12);
4261
+ const trimmedVal = this.object[key].toString().slice(0, maxValueLength);
4262
+ const escapedVal = trimmedVal.replace(/["\\\u0000-\u001f\u007f]/g, (character) => `\\x${character.charCodeAt(0).toString(16).padStart(2, "0")}`);
4263
+ this.addLine(`${formattedKey} = "${escapedVal}"`);
4264
+ }
4265
+ addObjProperty(key, maxValueLength) {
4266
+ const keys = Array.isArray(key) ? key : [key];
4267
+ for (const k of keys) {
4268
+ this.addSingleObjProperty(k, maxValueLength);
4269
+ }
4270
+ return this;
4271
+ }
4272
+ addAllObjProps(maxValueLength) {
4273
+ const keys = Object.keys(this.object);
4274
+ for (const k of keys) {
4275
+ this.addSingleObjProperty(k, maxValueLength);
4276
+ }
4277
+ return this;
4278
+ }
4279
+ }
4280
+
4281
+ class IniFileBuilder extends BaseIniBuilder {
4282
+ addSection(section) {
4283
+ this.addLine(`[${section.name}]`);
4284
+ this.str += section.getContent();
4285
+ return this;
4286
+ }
4287
+ }
4288
+
4289
+ class ProgramIniConfig {
4290
+ baseName = "slot_1";
4291
+ autorun = false;
4292
+ project = { version: "1", ide: "Unknown", file: "none" };
4293
+ program = {
4294
+ version: "1",
4295
+ name: "program",
4296
+ slot: 0,
4297
+ icon: "default.bmp",
4298
+ iconalt: "",
4299
+ description: "",
4300
+ date: "",
4301
+ timezone: "0"
4302
+ };
4303
+ config = {};
4304
+ controller1 = {};
4305
+ controller2 = {};
4306
+ constructor() {
4307
+ this.config = {
4308
+ 22: "adi"
4309
+ };
4310
+ }
4311
+ setProgramDate(date) {
4312
+ const d = date;
4313
+ this.program.date = d.toISOString();
4314
+ const tzo = Math.abs(d.getTimezoneOffset());
4315
+ const tzh = tzo / 60 >>> 0;
4316
+ const tzm = tzo - tzh * 60;
4317
+ this.program.timezone = (d.getTimezoneOffset() > 0 ? "-" : "+") + this.dec2(tzh) + ":" + this.dec2(tzm);
4318
+ }
4319
+ createIni() {
4320
+ if (this.program.date.length === 0) {
4321
+ this.setProgramDate(new Date);
4322
+ }
4323
+ return new IniFileBuilder().addComment("").addComment("VEX program ini file").addComment("Generated by Vex V5 Serial Protocol Library").addComment("").addSection(new IniSectionBuilder("project", this.project).addObjProperty("ide", 16)).addComment("").addSection(new IniSectionBuilder("program", this.program).addObjProperty("name", 32).addObjProperty("description", 256).addObjProperty("icon", 16).addObjProperty("iconalt", 16).addObjProperty("slot", 16)).addComment("").addSection(new IniSectionBuilder("config", this.config, (k) => "port_" + this.dec2(k)).addAllObjProps()).addComment("").addSection(new IniSectionBuilder("controller_1", this.controller1).addAllObjProps()).addComment("").addSection(new IniSectionBuilder("controller_2", this.controller2).addAllObjProps()).getContent();
4324
+ }
4325
+ dec2(value) {
4326
+ const str = ("00" + value.toString(10)).substr(-2, 2);
4327
+ return str.toUpperCase();
4328
+ }
4329
+ }
4330
+ export {
4331
+ uploadFirmware,
4332
+ toVexSerialError,
4333
+ sleepUntilAsync,
4334
+ sleepUntil,
4335
+ sleep,
4336
+ encodeFixedText,
4337
+ downloadFileFromInternet,
4338
+ WriteKeyValueReplyD2HPacket,
4339
+ WriteKeyValueH2DPacket,
4340
+ WriteFileReplyD2HPacket,
4341
+ WriteFileH2DPacket,
4342
+ VexTransferError,
4343
+ VexSerialError,
4344
+ VexSerialDevice,
4345
+ VexSerialConnection,
4346
+ VexProtocolError,
4347
+ VexNotConnectedError,
4348
+ VexIoError,
4349
+ VexInvalidArgumentError,
4350
+ VexFirmwareVersion,
4351
+ VexFirmwareError,
4352
+ VexEventTarget,
4353
+ VexEventEmitter,
4354
+ VexDownloadError,
4355
+ V5SmartDevice,
4356
+ V5SerialDeviceState,
4357
+ V5SerialDevice,
4358
+ V5SerialConnection,
4359
+ V5Radio,
4360
+ V5Controller,
4361
+ V5BrainSettings,
4362
+ V5BrainButton,
4363
+ V5Brain,
4364
+ V5Battery,
4365
+ UpdateMatchModeH2DPacket,
4366
+ USER_PROG_CHUNK_SIZE,
4367
+ USER_FLASH_USR_CODE_START,
4368
+ USER_FLASH_SYS_CODE_START,
4369
+ USER_FLASH_START_C,
4370
+ USER_FLASH_START_B,
4371
+ USER_FLASH_START,
4372
+ USER_FLASH_MAX_FILE_SIZE,
4373
+ USER_FLASH_END_C,
4374
+ USER_FLASH_END_B,
4375
+ USER_FLASH_END,
4376
+ SystemVersionReplyD2HPacket,
4377
+ SystemVersionH2DPacket,
4378
+ SmartDeviceType,
4379
+ SerialDeviceType,
4380
+ SendDashTouchReplyD2HPacket,
4381
+ SendDashTouchH2DPacket,
4382
+ SelectDashScreen,
4383
+ SelectDashReplyD2HPacket,
4384
+ SelectDashH2DPacket,
4385
+ ScreenCaptureReplyD2HPacket,
4386
+ ScreenCaptureH2DPacket,
4387
+ ReadLogPageReplyD2HPacket,
4388
+ ReadLogPageH2DPacket,
4389
+ ReadKeyValueReplyD2HPacket,
4390
+ ReadKeyValueH2DPacket,
4391
+ ReadFileReplyD2HPacket,
4392
+ ReadFileH2DPacket,
4393
+ RadioChannelType,
4394
+ Query1ReplyD2HPacket,
4395
+ Query1H2DPacket,
4396
+ ProgramIniConfig,
4397
+ PacketView,
4398
+ PacketEncoder,
4399
+ Packet,
4400
+ MatchStatusReplyD2HPacket,
4401
+ MatchModeReplyD2HPacket,
4402
+ LoadFileActionReplyD2HPacket,
4403
+ LoadFileActionH2DPacket,
4404
+ LinkFileReplyD2HPacket,
4405
+ LinkFileH2DPacket,
4406
+ InitFileTransferReplyD2HPacket,
4407
+ InitFileTransferH2DPacket,
4408
+ HostBoundPacket,
4409
+ GetSystemStatusReplyD2HPacket,
4410
+ GetSystemStatusH2DPacket,
4411
+ GetSystemFlagsReplyD2HPacket,
4412
+ GetSystemFlagsH2DPacket,
4413
+ GetSlot5to8InfoReplyD2HPacket,
4414
+ GetSlot5to8InfoH2DPacket,
4415
+ GetSlot1to4InfoReplyD2HPacket,
4416
+ GetSlot1to4InfoH2DPacket,
4417
+ GetRadioStatusReplyD2HPacket,
4418
+ GetRadioStatusH2DPacket,
4419
+ GetRadioModeH2DPacket,
4420
+ GetProgramSlotInfoReplyD2HPacket,
4421
+ GetProgramSlotInfoH2DPacket,
4422
+ GetMatchStatusH2DPacket,
4423
+ GetLogCountReplyD2HPacket,
4424
+ GetLogCountH2DPacket,
4425
+ GetFileMetadataReplyD2HPacket,
4426
+ GetFileMetadataH2DPacket,
4427
+ GetFdtStatusReplyD2HPacket,
4428
+ GetFdtStatusH2DPacket,
4429
+ GetDirectoryFileCountReplyD2HPacket,
4430
+ GetDirectoryFileCountH2DPacket,
4431
+ GetDirectoryEntryReplyD2HPacket,
4432
+ GetDirectoryEntryH2DPacket,
4433
+ GetDeviceStatusReplyD2HPacket,
4434
+ GetDeviceStatusH2DPacket,
4435
+ FileVendor,
4436
+ FileLoadAction,
4437
+ FileInitOption,
4438
+ FileInitAction,
4439
+ FileFormatReplyD2HPacket,
4440
+ FileFormatH2DPacket,
4441
+ FileExitAction,
4442
+ FileDownloadTarget,
4443
+ FileControlReplyD2HPacket,
4444
+ FileControlH2DPacket,
4445
+ FileClearUpReplyD2HPacket,
4446
+ FileClearUpH2DPacket,
4447
+ FactoryStatusReplyD2HPacket,
4448
+ FactoryStatusH2DPacket,
4449
+ FactoryEnableReplyD2HPacket,
4450
+ FactoryEnableH2DPacket,
4451
+ ExitFileTransferReplyD2HPacket,
4452
+ ExitFileTransferH2DPacket,
4453
+ EraseFileReplyD2HPacket,
4454
+ EraseFileH2DPacket,
4455
+ DeviceBoundPacket,
4456
+ AckType
4457
+ };
4458
+
4459
+ //# debugId=AEA86FF140C3172464756E2164756E21
4460
+ //# sourceMappingURL=index.js.map