@v5x/serial 0.5.4 → 0.5.6

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