@v5x/serial 0.5.4 → 0.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -6
- package/dist/Vex.d.ts +4 -4
- package/dist/VexCRC.d.ts +0 -1
- package/dist/VexConnection.d.ts +81 -23
- package/dist/VexDevice.d.ts +41 -155
- package/{dts/VexDevice.d.ts → dist/VexDeviceState.d.ts} +63 -55
- package/dist/VexError.d.ts +47 -0
- package/dist/VexFirmware.d.ts +45 -0
- package/dist/VexIniConfig.d.ts +1 -1
- package/dist/VexPacket.d.ts +3 -512
- package/dist/VexPacketBase.d.ts +21 -0
- package/dist/VexPacketEncoder.d.ts +55 -0
- package/{dts/VexPacket.d.ts → dist/VexPacketModels.d.ts} +3 -107
- package/dist/VexPacketView.d.ts +3 -3
- package/dist/VexTransfers.d.ts +20 -0
- package/dist/index.cjs +4541 -0
- package/dist/index.cjs.map +25 -0
- package/dist/index.d.ts +9 -9
- package/dist/index.js +4460 -0
- package/dist/index.js.map +25 -0
- package/package.json +39 -71
- package/dist/v5-serial-protocol.cjs.js +0 -4516
- package/dist/v5-serial-protocol.cjs.js.map +0 -1
- package/dist/v5-serial-protocol.es.js +0 -4401
- package/dist/v5-serial-protocol.es.js.map +0 -1
- package/dts/Vex.d.ts +0 -235
- package/dts/Vex.js +0 -189
- package/dts/Vex.js.map +0 -1
- package/dts/VexCRC.d.ts +0 -19
- package/dts/VexCRC.js +0 -89
- package/dts/VexCRC.js.map +0 -1
- package/dts/VexConnection.d.ts +0 -45
- package/dts/VexConnection.js +0 -500
- package/dts/VexConnection.js.map +0 -1
- package/dts/VexDevice.js +0 -944
- package/dts/VexDevice.js.map +0 -1
- package/dts/VexEvent.d.ts +0 -16
- package/dts/VexEvent.js +0 -47
- package/dts/VexEvent.js.map +0 -1
- package/dts/VexFirmwareVersion.d.ts +0 -55
- package/dts/VexFirmwareVersion.js +0 -104
- package/dts/VexFirmwareVersion.js.map +0 -1
- package/dts/VexIniConfig.d.ts +0 -27
- package/dts/VexIniConfig.js +0 -122
- package/dts/VexIniConfig.js.map +0 -1
- package/dts/VexPacket.js +0 -1036
- package/dts/VexPacket.js.map +0 -1
- package/dts/VexPacketView.d.ts +0 -18
- package/dts/VexPacketView.js +0 -84
- package/dts/VexPacketView.js.map +0 -1
- package/dts/index.d.ts +0 -9
- package/dts/index.js +0 -10
- package/dts/index.js.map +0 -1
- package/index.d.ts +0 -1098
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/Vex.ts", "../src/VexError.ts", "../src/VexEvent.ts", "../../../node_modules/.bun/neverthrow@8.2.0/node_modules/neverthrow/dist/index.es.js", "../src/VexPacketBase.ts", "../src/VexCRC.ts", "../src/VexFirmwareVersion.ts", "../src/VexPacketView.ts", "../src/VexPacketModels.ts", "../src/VexPacketEncoder.ts", "../src/VexConnection.ts", "../src/VexFirmware.ts", "../src/VexTransfers.ts", "../src/VexDeviceState.ts", "../src/VexDevice.ts", "../src/VexIniConfig.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { type VexFirmwareVersion } from \"./VexFirmwareVersion.js\";\nimport { type HostBoundPacket } from \"./VexPacket.js\";\n\nexport const USER_PROG_CHUNK_SIZE = 4096; // chunk size\nexport const USER_FLASH_START = 0x03000000; // start address of memory\nexport const USER_FLASH_SYS_CODE_START = 0x03400000; // start address of system code\nexport const USER_FLASH_USR_CODE_START = 0x03800000; // start address of user code\nexport const USER_FLASH_END = 0x08000000; // end address of memory\nexport const USER_FLASH_MAX_FILE_SIZE = 0x200000; // maximum file size for qspi\nexport const USER_FLASH_START_B = 0x10200000; // special app flash start\nexport const USER_FLASH_END_B = 0x10400000; // special app flash end\nexport const USER_FLASH_START_C = 0x30200000; // special app flash start\nexport const USER_FLASH_END_C = 0x31000000; // special app flash end\n\nexport interface ISmartDeviceInfo {\n port: number;\n type: SmartDeviceType;\n status: number;\n betaversion: number;\n version: number;\n bootversion: number;\n}\n\nexport interface IFileBasicInfo {\n filename: string;\n vendor: FileVendor;\n loadAddress?: number;\n size?: number;\n}\n\nexport interface IFileMetadata {\n loadAddress: number;\n size: number;\n crc32: number;\n type: string;\n timestamp: number;\n version: VexFirmwareVersion;\n}\n\nexport interface IFileHandle extends IFileBasicInfo, IFileMetadata {\n loadAddress: number;\n size: number;\n}\n\nexport interface IFileEntry extends IFileMetadata {\n index: number;\n filename: string;\n}\n\nexport interface IFileWriteRequest {\n filename: string;\n vendor?: FileVendor;\n loadAddress?: number;\n buf?: Uint8Array;\n downloadTarget: FileDownloadTarget;\n exttype?: string;\n autoRun: boolean;\n linkedFile?: IFileWriteRequest;\n}\n\nexport interface IProgramInfo {\n name: string;\n binfile: string;\n size: number;\n time: Date;\n slot: number;\n requestedSlot: number;\n}\n\nexport interface IPacketCallback {\n callback: (data: HostBoundPacket | ArrayBuffer | AckType) => void;\n timeout: ReturnType<typeof setTimeout>;\n wantedCommandId: number | undefined;\n wantedCommandExId: number | undefined;\n}\n\nexport type DataArray = ArrayBuffer | Uint8Array;\n\nexport type MatchMode = \"driver\" | \"autonomous\" | \"disabled\";\n\nexport enum FileVendor {\n // a.k.a vid\n USER = 1,\n SYS = 15,\n DEV1 = 16,\n DEV2 = 24,\n DEV3 = 32,\n DEV4 = 40,\n DEV5 = 48,\n DEV6 = 56,\n VEXVM = 64,\n VEX = 240,\n UNDEFINED = 241,\n}\n\nexport enum FileDownloadTarget {\n FILE_TARGET_DDR = 0,\n FILE_TARGET_QSPI = 1,\n FILE_TARGET_CBUF = 2,\n FILE_TARGET_VBUF = 3,\n FILE_TARGET_DDRC = 4,\n FILE_TARGET_DDRE = 5,\n FILE_TARGET_FLASH = 6, // for IQ2\n FILE_TARGET_RADIO = 7, // for IQ2\n FILE_TARGET_A1 = 13,\n FILE_TARGET_B1 = 14,\n FILE_TARGET_B2 = 15,\n}\n\nexport enum FileInitAction {\n WRITE = 1,\n READ = 2,\n}\n\nexport enum FileInitOption {\n NONE = 0,\n OVERWRITE = 1,\n}\n\nexport enum FileLoadAction {\n RUN = 0,\n STOP = 128,\n}\n\nexport enum FileExitAction {\n EXIT_NONE = 0,\n EXIT_RUN = 1,\n EXIT_HALT = 3,\n}\n\nexport enum RadioChannelType {\n PIT = 0,\n DOWNLOAD = 1,\n}\n\nexport type SlotNumber = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;\n\nexport type ZerobaseSlotNumber = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7;\n\nexport type PortNumber =\n | 1\n | 2\n | 3\n | 4\n | 5\n | 6\n | 7\n | 8\n | 9\n | 10\n | 11\n | 12\n | 13\n | 14\n | 15\n | 16\n | 17\n | 18\n | 19\n | 20\n | 21;\n\nexport enum AckType {\n CDC2_ACK = 118,\n CDC2_NACK = 255,\n CDC2_NACK_PACKET_CRC = 206,\n CDC2_NACK_CMD_LENGTH = 208,\n CDC2_NACK_SIZE = 209,\n CDC2_NACK_CRC = 210,\n CDC2_NACK_FILE = 211,\n CDC2_NACK_INIT = 212,\n CDC2_NACK_FUNC = 213,\n CDC2_NACK_ALIGN = 214,\n CDC2_NACK_ADDR = 215,\n CDC2_NACK_INCOMPLETE = 216,\n CDC2_NACK_DIR_INDEX = 217,\n CDC2_NACK_MAX_USER_FILES = 218,\n CDC2_NACK_FILE_EXISTS = 219,\n CDC2_NACK_FILE_SYS_FULL = 220,\n TIMEOUT = 256,\n WRITE_ERROR = 257,\n}\n\nexport enum SmartDeviceType {\n EMPTY = 0,\n V5_POWER = 1,\n MOTOR = 2,\n LED = 3,\n ABS_ENCODER_SENSOR = 4,\n CR_MOTOR = 5,\n IMU_SENSOR = 6,\n DISTANCE_SENSOR = 7,\n RADIO_SENSOR = 8,\n CONTROLLER = 9,\n BRAIN = 10,\n VISION_SENSOR = 11,\n ADI = 12,\n PARTNER_CONTROLLER = 13,\n BATTERY = 14,\n SOL = 15,\n OPTICAL_SENSOR = 16,\n MAGNET = 17,\n GPS_SENSOR = 20,\n UNDEFINED_SENSOR = 255,\n}\n\nexport enum SerialDeviceType {\n V5_BRAIN = 1281,\n V5_BRAIN_DFU = 1282,\n V5_CONTROLLER = 1283,\n\n XILINX = 256,\n\n IQ_BRAIN = 2,\n IQ_BRAIN2 = 3,\n IQ_BRAIN_DFU = 255,\n\n IQ2_BRAIN = 512,\n IQ2_BRAIN_DFU = 527,\n IQ2_CONTROLLER = 528,\n IQ2_CONTROLLER_DFU = 543,\n\n EXP_BRAIN = 1536,\n EXP_BRAIN_DFU = 1551,\n\n EXP_CONTROLLER = 1552,\n EXP_CONTROLLER_DFU = 1567,\n\n PIXY = 61440,\n PIXY_DFU = 12,\n\n VEXCAM = 1287,\n VEXCAM_DFU = 1288,\n\n SENSOR_TEST = 1535,\n\n CORTEX_PROGCBL = 10,\n CORTEX_BRAIN = 11,\n // Jerry says this was copied from the official source code ¯\\_(ツ)_/¯\n // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values\n CORTEX_JOYSTK = 12,\n\n VEXNET_KEY_20 = 7,\n VEXNET_KEY_10 = 9587,\n\n PROLIFIC = 8963,\n}\n\n/**\n * found from {@link https://gist.github.com/meisZWFLZ/9ebdd694060137b44959ff7ac80ff4e8 gist}\n * @see {@link https://drive.google.com/drive/folders/11pSNKakbXp7hOYBQ3HNwprFaLalnXOgR screen images}\n */\nexport enum SelectDashScreen {\n HOME = 0,\n BATTERY = 1,\n LED = 3,\n MATCH_CONFIG = 4,\n MATCH_CONFIG_MORE = 5,\n WIRING = 6,\n RADIO = 8,\n BRAIN = 10,\n RUN_PROGRAM = 13,\n DRIVE_PROGRAM_CONTROL_LEFT_MAPPING = 14,\n DRIVE_PROGRAM_MENU = 15,\n DEVICES = 16,\n USER_PROGRAM_FOLDER = 17,\n VEX_PROGRAM_FOLDER = 18,\n SETTINGS = 19,\n /** theres some scary looking stuff in here */\n SCARY_CONFIGURATION = 20,\n LANGUAGE = 21,\n DRIVE_MOTOR_CONFIG = 22,\n PROGRAM_MENU = 24,\n SHUTDOWN = 25,\n CONTROLLER_2_MAPPING = 26,\n /** theres some even more scary looking stuff in here */\n SCARY_CONFIGURATION_MORE = 27,\n /** maybe this is scarier.. */\n CONFIRM_XX = 28,\n CONTROLLER_1_MAPPING = 29,\n DRIVE_PROGRAM_CONTROL_DUAL_MAPPING = 30,\n DRIVE_PROGRAM_CONTROL_SPLIT_MAPPING = 31,\n DRIVE_PROGRAM_CONTROL_RIGHT_MAPPING = 32,\n /** thats such a bad name */\n MATCH_2_4_PLAYERS = 33,\n EVENT_LOG = 34,\n USER_PROGRAM_WIRING = 40,\n CLAWBOT_PROGRAM_MENU = 41,\n /** aka regulatory */\n ABOUT = 42,\n LANGUAGE_MORE = 43,\n OBJECT_COLOR = 45,\n SIGNATURE_ID = 46,\n LOG_DATA = 47,\n}\n",
|
|
6
|
+
"/**\n * Typed error hierarchy for the serial protocol package.\n *\n * Every public async API that can fail returns a {@link Result} (or\n * {@link ResultAsync}) whose error channel is a {@link VexSerialError}.\n * Each error carries a stable {@link VexSerialError.kind} discriminator\n * so callers can branch on the failure category without parsing messages.\n */\nexport type VexSerialErrorKind =\n | \"not-connected\"\n | \"invalid-argument\"\n | \"protocol\"\n | \"transfer\"\n | \"download\"\n | \"firmware\"\n | \"io\";\n\n/** Base class for every failure surfaced by the serial package. */\nexport class VexSerialError extends Error {\n readonly kind: VexSerialErrorKind;\n\n constructor(kind: VexSerialErrorKind, message: string) {\n super(message);\n this.name = \"VexSerialError\";\n this.kind = kind;\n }\n}\n\n/** No connection is currently open to a device. */\nexport class VexNotConnectedError extends VexSerialError {\n constructor(message = \"no connection to a V5 device\") {\n super(\"not-connected\", message);\n this.name = \"VexNotConnectedError\";\n }\n}\n\n/** A caller supplied an invalid argument value. */\nexport class VexInvalidArgumentError extends VexSerialError {\n constructor(message: string) {\n super(\"invalid-argument\", message);\n this.name = \"VexInvalidArgumentError\";\n }\n}\n\n/** The device refused, timed out, or replied unexpectedly to a command. */\nexport class VexProtocolError extends VexSerialError {\n constructor(message: string) {\n super(\"protocol\", message);\n this.name = \"VexProtocolError\";\n }\n}\n\n/** A file-transfer handshake, read, write, or exit failed. */\nexport class VexTransferError extends VexSerialError {\n constructor(message: string) {\n super(\"transfer\", message);\n this.name = \"VexTransferError\";\n }\n}\n\n/** A remote resource download (catalog/VEXos) failed. */\nexport class VexDownloadError extends VexSerialError {\n constructor(message: string) {\n super(\"download\", message);\n this.name = \"VexDownloadError\";\n }\n}\n\n/** A firmware archive was malformed, oversized, or incomplete. */\nexport class VexFirmwareError extends VexSerialError {\n constructor(message: string) {\n super(\"firmware\", message);\n this.name = \"VexFirmwareError\";\n }\n}\n\n/** An underlying transport (serial port, stream) error. */\nexport class VexIoError extends VexSerialError {\n constructor(message: string) {\n super(\"io\", message);\n this.name = \"VexIoError\";\n }\n}\n\n/**\n * Coerce an arbitrary thrown value into a {@link VexSerialError} so it\n * can be returned through the {@link Result} error channel.\n */\nexport function toVexSerialError(\n error: unknown,\n fallback: VexSerialErrorKind = \"io\",\n): VexSerialError {\n if (error instanceof VexSerialError) return error;\n const message = error instanceof Error ? error.message : String(error);\n return new VexSerialError(fallback, message);\n}\n",
|
|
7
|
+
"export class VexEventEmitter {\n handlerMap: Map<string | symbol, Array<(...args: unknown[]) => void>>;\n\n constructor() {\n this.handlerMap = new Map<string, Array<(...args: unknown[]) => void>>();\n }\n\n on(eventName: string | symbol, listener: (...args: unknown[]) => void): void {\n let listeners = this.handlerMap.get(eventName);\n listeners ??= [];\n\n listeners.push(listener);\n\n this.handlerMap.set(eventName, listeners);\n }\n\n remove(\n eventName: string | symbol,\n listener: (...args: unknown[]) => void,\n ): void {\n let listeners = this.handlerMap.get(eventName);\n listeners ??= [];\n\n const index = listeners.indexOf(listener);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n\n this.handlerMap.set(eventName, listeners);\n }\n\n emit(eventName: string | symbol, data: unknown): void {\n (this.handlerMap.get(eventName) ?? []).forEach((callback) => {\n callback(data);\n });\n }\n\n clearListeners(): void {\n this.handlerMap.clear();\n }\n}\n\nexport class VexEventTarget {\n emitter: VexEventEmitter;\n\n constructor() {\n this.emitter = new VexEventEmitter();\n }\n\n emit(eventName: string | symbol, data: unknown): void {\n this.emitter.emit(String(eventName), data);\n }\n\n on(eventName: string | symbol, listener: (...args: unknown[]) => void): void {\n this.emitter.on(String(eventName), listener);\n }\n\n remove(\n eventName: string | symbol,\n listener: (...args: unknown[]) => void,\n ): void {\n this.emitter.remove(String(eventName), listener);\n }\n\n clearListeners(): void {\n this.emitter.clearListeners();\n }\n}\n",
|
|
8
|
+
"const defaultErrorConfig = {\r\n withStackTrace: false,\r\n};\r\n// Custom error object\r\n// Context / discussion: https://github.com/supermacro/neverthrow/pull/215\r\nconst createNeverThrowError = (message, result, config = defaultErrorConfig) => {\r\n const data = result.isOk()\r\n ? { type: 'Ok', value: result.value }\r\n : { type: 'Err', value: result.error };\r\n const maybeStack = config.withStackTrace ? new Error().stack : undefined;\r\n return {\r\n data,\r\n message,\r\n stack: maybeStack,\r\n };\r\n};\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\n\r\nfunction __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nfunction __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nfunction __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nfunction __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nfunction __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nfunction __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n 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 () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\nclass ResultAsync {\r\n constructor(res) {\r\n this._promise = res;\r\n }\r\n static fromSafePromise(promise) {\r\n const newPromise = promise.then((value) => new Ok(value));\r\n return new ResultAsync(newPromise);\r\n }\r\n static fromPromise(promise, errorFn) {\r\n const newPromise = promise\r\n .then((value) => new Ok(value))\r\n .catch((e) => new Err(errorFn(e)));\r\n return new ResultAsync(newPromise);\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static fromThrowable(fn, errorFn) {\r\n return (...args) => {\r\n return new ResultAsync((() => __awaiter(this, void 0, void 0, function* () {\r\n try {\r\n return new Ok(yield fn(...args));\r\n }\r\n catch (error) {\r\n return new Err(errorFn ? errorFn(error) : error);\r\n }\r\n }))());\r\n };\r\n }\r\n static combine(asyncResultList) {\r\n return combineResultAsyncList(asyncResultList);\r\n }\r\n static combineWithAllErrors(asyncResultList) {\r\n return combineResultAsyncListWithAllErrors(asyncResultList);\r\n }\r\n map(f) {\r\n return new ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () {\r\n if (res.isErr()) {\r\n return new Err(res.error);\r\n }\r\n return new Ok(yield f(res.value));\r\n })));\r\n }\r\n andThrough(f) {\r\n return new ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () {\r\n if (res.isErr()) {\r\n return new Err(res.error);\r\n }\r\n const newRes = yield f(res.value);\r\n if (newRes.isErr()) {\r\n return new Err(newRes.error);\r\n }\r\n return new Ok(res.value);\r\n })));\r\n }\r\n andTee(f) {\r\n return new ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () {\r\n if (res.isErr()) {\r\n return new Err(res.error);\r\n }\r\n try {\r\n yield f(res.value);\r\n }\r\n catch (e) {\r\n // Tee does not care about the error\r\n }\r\n return new Ok(res.value);\r\n })));\r\n }\r\n orTee(f) {\r\n return new ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () {\r\n if (res.isOk()) {\r\n return new Ok(res.value);\r\n }\r\n try {\r\n yield f(res.error);\r\n }\r\n catch (e) {\r\n // Tee does not care about the error\r\n }\r\n return new Err(res.error);\r\n })));\r\n }\r\n mapErr(f) {\r\n return new ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () {\r\n if (res.isOk()) {\r\n return new Ok(res.value);\r\n }\r\n return new Err(yield f(res.error));\r\n })));\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\r\n andThen(f) {\r\n return new ResultAsync(this._promise.then((res) => {\r\n if (res.isErr()) {\r\n return new Err(res.error);\r\n }\r\n const newValue = f(res.value);\r\n return newValue instanceof ResultAsync ? newValue._promise : newValue;\r\n }));\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\r\n orElse(f) {\r\n return new ResultAsync(this._promise.then((res) => __awaiter(this, void 0, void 0, function* () {\r\n if (res.isErr()) {\r\n return f(res.error);\r\n }\r\n return new Ok(res.value);\r\n })));\r\n }\r\n match(ok, _err) {\r\n return this._promise.then((res) => res.match(ok, _err));\r\n }\r\n unwrapOr(t) {\r\n return this._promise.then((res) => res.unwrapOr(t));\r\n }\r\n /**\r\n * @deprecated will be removed in 9.0.0.\r\n *\r\n * You can use `safeTry` without this method.\r\n * @example\r\n * ```typescript\r\n * safeTry(async function* () {\r\n * const okValue = yield* yourResult\r\n * })\r\n * ```\r\n * Emulates Rust's `?` operator in `safeTry`'s body. See also `safeTry`.\r\n */\r\n safeUnwrap() {\r\n return __asyncGenerator(this, arguments, function* safeUnwrap_1() {\r\n return yield __await(yield __await(yield* __asyncDelegator(__asyncValues(yield __await(this._promise.then((res) => res.safeUnwrap()))))));\r\n });\r\n }\r\n // Makes ResultAsync implement PromiseLike<Result>\r\n then(successCallback, failureCallback) {\r\n return this._promise.then(successCallback, failureCallback);\r\n }\r\n [Symbol.asyncIterator]() {\r\n return __asyncGenerator(this, arguments, function* _a() {\r\n const result = yield __await(this._promise);\r\n if (result.isErr()) {\r\n // @ts-expect-error -- This is structurally equivalent and safe\r\n yield yield __await(errAsync(result.error));\r\n }\r\n // @ts-expect-error -- This is structurally equivalent and safe\r\n return yield __await(result.value);\r\n });\r\n }\r\n}\r\nfunction okAsync(value) {\r\n return new ResultAsync(Promise.resolve(new Ok(value)));\r\n}\r\nfunction errAsync(err) {\r\n return new ResultAsync(Promise.resolve(new Err(err)));\r\n}\r\nconst fromPromise = ResultAsync.fromPromise;\r\nconst fromSafePromise = ResultAsync.fromSafePromise;\r\nconst fromAsyncThrowable = ResultAsync.fromThrowable;\n\n/**\r\n * Short circuits on the FIRST Err value that we find\r\n */\r\nconst combineResultList = (resultList) => {\r\n let acc = ok([]);\r\n for (const result of resultList) {\r\n if (result.isErr()) {\r\n acc = err(result.error);\r\n break;\r\n }\r\n else {\r\n acc.map((list) => list.push(result.value));\r\n }\r\n }\r\n return acc;\r\n};\r\n/* This is the typesafe version of Promise.all\r\n *\r\n * Takes a list of ResultAsync<T, E> and success if all inner results are Ok values\r\n * or fails if one (or more) of the inner results are Err values\r\n */\r\nconst combineResultAsyncList = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultList);\r\n/**\r\n * Give a list of all the errors we find\r\n */\r\nconst combineResultListWithAllErrors = (resultList) => {\r\n let acc = ok([]);\r\n for (const result of resultList) {\r\n if (result.isErr() && acc.isErr()) {\r\n acc.error.push(result.error);\r\n }\r\n else if (result.isErr() && acc.isOk()) {\r\n acc = err([result.error]);\r\n }\r\n else if (result.isOk() && acc.isOk()) {\r\n acc.value.push(result.value);\r\n }\r\n // do nothing when result.isOk() && acc.isErr()\r\n }\r\n return acc;\r\n};\r\nconst combineResultAsyncListWithAllErrors = (asyncResultList) => ResultAsync.fromSafePromise(Promise.all(asyncResultList)).andThen(combineResultListWithAllErrors);\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\r\nvar Result;\r\n(function (Result) {\r\n /**\r\n * Wraps a function with a try catch, creating a new function with the same\r\n * arguments but returning `Ok` if successful, `Err` if the function throws\r\n *\r\n * @param fn function to wrap with ok on success or err on failure\r\n * @param errorFn when an error is thrown, this will wrap the error result if provided\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n function fromThrowable(fn, errorFn) {\r\n return (...args) => {\r\n try {\r\n const result = fn(...args);\r\n return ok(result);\r\n }\r\n catch (e) {\r\n return err(errorFn ? errorFn(e) : e);\r\n }\r\n };\r\n }\r\n Result.fromThrowable = fromThrowable;\r\n function combine(resultList) {\r\n return combineResultList(resultList);\r\n }\r\n Result.combine = combine;\r\n function combineWithAllErrors(resultList) {\r\n return combineResultListWithAllErrors(resultList);\r\n }\r\n Result.combineWithAllErrors = combineWithAllErrors;\r\n})(Result || (Result = {}));\r\nfunction ok(value) {\r\n return new Ok(value);\r\n}\r\nfunction err(err) {\r\n return new Err(err);\r\n}\r\nfunction safeTry(body) {\r\n const n = body().next();\r\n if (n instanceof Promise) {\r\n return new ResultAsync(n.then((r) => r.value));\r\n }\r\n return n.value;\r\n}\r\nclass Ok {\r\n constructor(value) {\r\n this.value = value;\r\n }\r\n isOk() {\r\n return true;\r\n }\r\n isErr() {\r\n return !this.isOk();\r\n }\r\n map(f) {\r\n return ok(f(this.value));\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n mapErr(_f) {\r\n return ok(this.value);\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\r\n andThen(f) {\r\n return f(this.value);\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\r\n andThrough(f) {\r\n return f(this.value).map((_value) => this.value);\r\n }\r\n andTee(f) {\r\n try {\r\n f(this.value);\r\n }\r\n catch (e) {\r\n // Tee doesn't care about the error\r\n }\r\n return ok(this.value);\r\n }\r\n orTee(_f) {\r\n return ok(this.value);\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\r\n orElse(_f) {\r\n return ok(this.value);\r\n }\r\n asyncAndThen(f) {\r\n return f(this.value);\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\r\n asyncAndThrough(f) {\r\n return f(this.value).map(() => this.value);\r\n }\r\n asyncMap(f) {\r\n return ResultAsync.fromSafePromise(f(this.value));\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n unwrapOr(_v) {\r\n return this.value;\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n match(ok, _err) {\r\n return ok(this.value);\r\n }\r\n safeUnwrap() {\r\n const value = this.value;\r\n /* eslint-disable-next-line require-yield */\r\n return (function* () {\r\n return value;\r\n })();\r\n }\r\n _unsafeUnwrap(_) {\r\n return this.value;\r\n }\r\n _unsafeUnwrapErr(config) {\r\n throw createNeverThrowError('Called `_unsafeUnwrapErr` on an Ok', this, config);\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias, require-yield\r\n *[Symbol.iterator]() {\r\n return this.value;\r\n }\r\n}\r\nclass Err {\r\n constructor(error) {\r\n this.error = error;\r\n }\r\n isOk() {\r\n return false;\r\n }\r\n isErr() {\r\n return !this.isOk();\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n map(_f) {\r\n return err(this.error);\r\n }\r\n mapErr(f) {\r\n return err(f(this.error));\r\n }\r\n andThrough(_f) {\r\n return err(this.error);\r\n }\r\n andTee(_f) {\r\n return err(this.error);\r\n }\r\n orTee(f) {\r\n try {\r\n f(this.error);\r\n }\r\n catch (e) {\r\n // Tee doesn't care about the error\r\n }\r\n return err(this.error);\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\r\n andThen(_f) {\r\n return err(this.error);\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\r\n orElse(f) {\r\n return f(this.error);\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n asyncAndThen(_f) {\r\n return errAsync(this.error);\r\n }\r\n asyncAndThrough(_f) {\r\n return errAsync(this.error);\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n asyncMap(_f) {\r\n return errAsync(this.error);\r\n }\r\n unwrapOr(v) {\r\n return v;\r\n }\r\n match(_ok, err) {\r\n return err(this.error);\r\n }\r\n safeUnwrap() {\r\n const error = this.error;\r\n return (function* () {\r\n yield err(error);\r\n throw new Error('Do not use this generator out of `safeTry`');\r\n })();\r\n }\r\n _unsafeUnwrap(config) {\r\n throw createNeverThrowError('Called `_unsafeUnwrap` on an Err', this, config);\r\n }\r\n _unsafeUnwrapErr(_) {\r\n return this.error;\r\n }\r\n *[Symbol.iterator]() {\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n const self = this;\r\n // @ts-expect-error -- This is structurally equivalent and safe\r\n yield self;\r\n // @ts-expect-error -- This is structurally equivalent and safe\r\n return self;\r\n }\r\n}\r\nconst fromThrowable = Result.fromThrowable;\r\n//#endregion\n\nexport { Err, Ok, Result, ResultAsync, err, errAsync, fromAsyncThrowable, fromPromise, fromSafePromise, fromThrowable, ok, okAsync, safeTry };\n",
|
|
9
|
+
"import { AckType, type DataArray } from \"./Vex.js\";\nimport type { PacketEncoder } from \"./VexPacketEncoder.js\";\n\nconst MATCH_STATUS_ALT_ACK = 167;\n\nexport abstract class Packet {\n data: Uint8Array; // the buffer sent to the device or received from the device\n\n static ENCODER: PacketEncoder;\n\n constructor(rawData: DataArray) {\n this.data =\n rawData instanceof ArrayBuffer ? new Uint8Array(rawData) : rawData;\n }\n}\n\nexport class DeviceBoundPacket extends Packet {\n get commandId(): number {\n return (this.constructor as typeof DeviceBoundPacket).COMMAND_ID;\n }\n\n get commandExtendedId(): number | undefined {\n return (this.constructor as typeof DeviceBoundPacket).COMMAND_EXTENDED_ID;\n }\n\n static COMMAND_ID: number;\n static COMMAND_EXTENDED_ID: number | undefined;\n\n constructor(payload?: Uint8Array) {\n super(new Uint8Array());\n const me = this.constructor as typeof DeviceBoundPacket;\n\n if (me.COMMAND_EXTENDED_ID === undefined) {\n if (payload === undefined) {\n this.data = Packet.ENCODER.cdcCommand(me.COMMAND_ID);\n } else {\n this.data = Packet.ENCODER.cdcCommandWithData(me.COMMAND_ID, payload);\n }\n } else {\n if (payload === undefined) {\n this.data = Packet.ENCODER.cdc2Command(\n me.COMMAND_ID,\n me.COMMAND_EXTENDED_ID,\n );\n } else {\n this.data = Packet.ENCODER.cdc2CommandWithData(\n me.COMMAND_ID,\n me.COMMAND_EXTENDED_ID,\n payload,\n );\n }\n }\n }\n}\n\nexport class HostBoundPacket extends Packet {\n ack: AckType = AckType.CDC2_NACK;\n payloadSize: number;\n ackIndex: number;\n\n constructor(data: DataArray) {\n super(data);\n\n this.payloadSize = Packet.ENCODER.getPayloadSize(this.data);\n const n = Packet.ENCODER.getHostHeaderLength(this.data);\n\n // skip command id check\n\n this.ack = this.data[(this.ackIndex = n + 1)]!;\n }\n\n static isValidPacket(data: Uint8Array, n: number): boolean {\n const ack = data[n + 1];\n return ack === AckType.CDC2_ACK || ack === MATCH_STATUS_ALT_ACK;\n }\n}\n",
|
|
10
|
+
"const CRC16TABLE = [\n 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108,\n 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b,\n 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee,\n 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d,\n 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5,\n 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4,\n 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13,\n 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e,\n 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1,\n 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0,\n 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657,\n 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882,\n 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e,\n 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d,\n 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,\n];\n\nexport class CrcGenerator {\n crc32Table: Uint32Array;\n static POLYNOMIAL_CRC32 = 79764919;\n static POLYNOMIAL_CRC16 = 4129;\n\n constructor() {\n this.crc32Table = new Uint32Array(256);\n this.crc32GenTable();\n }\n\n /**\n * Calculate CRC16 for buffer\n */\n crc16(buf: Uint8Array, initValue: number): number {\n const numberOfBytes = buf.byteLength;\n let accumulator = initValue;\n let i;\n let j;\n\n // now calculate CRC16\n for (j = 0; j < numberOfBytes; j++) {\n i = ((accumulator >>> 8) ^ buf[j]!) & 0xff;\n accumulator = ((accumulator << 8) ^ CRC16TABLE[i]!) >>> 0;\n }\n return (accumulator & 0xffff) >>> 0;\n }\n\n /**\n * Generate CRC32 reverse table\n */\n crc32GenTable(): void {\n let i;\n let j;\n let crcAccumulator;\n for (i = 0; i < 256; i++) {\n crcAccumulator = i << 24;\n for (j = 0; j < 8; j++) {\n if ((crcAccumulator & 0x80000000) !== 0)\n crcAccumulator =\n (crcAccumulator << 1) ^ CrcGenerator.POLYNOMIAL_CRC32;\n else crcAccumulator = crcAccumulator << 1;\n }\n this.crc32Table[i] = crcAccumulator;\n }\n }\n\n /**\n * Calculate CRC32 for buffer\n */\n crc32(buf: Uint8Array, initValue: number): number {\n const numberOfBytes = buf.byteLength;\n let crcAccumulator = initValue;\n let i;\n let j;\n\n // now calculate CRC32\n for (j = 0; j < numberOfBytes; j++) {\n i = ((crcAccumulator >>> 24) ^ buf[j]!) & 0xff;\n crcAccumulator = ((crcAccumulator << 8) ^ this.crc32Table[i]!) >>> 0;\n }\n return (crcAccumulator & 0xffffffff) >>> 0;\n }\n}\n",
|
|
11
|
+
"/**\n * This is a class to make it easier to handle passing the VEXos version\n * information around in the application. This provides ways to get any\n * form of the string representation and quickly compare versions.\n */\nexport class VexFirmwareVersion {\n major: number;\n minor: number;\n build: number;\n beta: number;\n\n constructor(major: number, minor: number, build: number, beta: number) {\n this.major = major;\n this.minor = minor;\n this.build = build;\n this.beta = beta;\n }\n\n /**\n * Take a a string of MAJOR.MINOR.BUILD.bBETA and converts it to a\n * VexFirmwareVersion instance\n * @param version the string to process\n * @returns a VexFirmwareVersion representing the provided string\n */\n static fromString(version: string): VexFirmwareVersion {\n const parts = version\n .toLowerCase()\n .replace(/b/g, \"\")\n .split(\".\")\n .map((x) => parseInt(x, 10));\n while (parts.length < 4) {\n parts.push(0);\n }\n return new VexFirmwareVersion(parts[0]!, parts[1]!, parts[2]!, parts[3]!);\n }\n\n /**\n * Take a a Uint8Array and converts it to a VexFirmwareVersion instance\n * @param data the array to process\n * @param offset the offset to start at\n * @returns a VexFirmwareVersion representing the provided string\n */\n static fromUint8Array(\n data: Uint8Array,\n offset: number = 0,\n reverse: boolean = false,\n ): VexFirmwareVersion {\n return new VexFirmwareVersion(\n data[offset + (reverse ? 3 : 0)]!,\n data[offset + (reverse ? 2 : 1)]!,\n data[offset + (reverse ? 1 : 2)]!,\n data[offset + (reverse ? 0 : 3)]!,\n );\n }\n\n static allZero(): VexFirmwareVersion {\n return new VexFirmwareVersion(0, 0, 0, 0);\n }\n\n /**\n * Take a a string of MAJOR_MINOR_BUILD_BETA and converts it to a\n * VexFirmwareVersion instance\n * @param version the string to process\n * @returns a VexFirmwareVersion representing the provided string\n */\n static fromCatalogString(version: string): VexFirmwareVersion {\n return VexFirmwareVersion.fromString(version.replace(/_/g, \".\"));\n }\n\n isBeta(): boolean {\n return this.beta !== 0;\n }\n\n /**\n * returns version as Uint Array\n */\n toUint8Array(reverse: boolean = false): Uint8Array {\n const data = new Uint8Array(4);\n data[reverse ? 3 : 0] = this.major;\n data[reverse ? 2 : 1] = this.minor;\n data[reverse ? 1 : 2] = this.build;\n data[reverse ? 0 : 3] = this.beta;\n return data;\n }\n\n /**\n * returns version as major.minor.build\n */\n toUserString(): string {\n return `${this.major}.${this.minor}.${this.build}`;\n }\n\n /**\n * returns version as ${major}.${minor}.{build}.b${beta}\n */\n toInternalString(): string {\n return `${this.toUserString()}.b${this.beta}`;\n }\n\n /**\n * compares this version to the provided version.\n * * if this < b: negative\n * * if this = b: 0\n * * if this > b: positive\n * @param that the version to compare again\n */\n compare(that: VexFirmwareVersion): number {\n const majorComp = this.major - that.major;\n const minorComp = this.minor - that.minor;\n const buildComp = this.build - that.build;\n const betaComp = this.beta - that.beta;\n\n if (majorComp !== 0) {\n return majorComp;\n } else if (minorComp !== 0) {\n return minorComp;\n } else if (buildComp !== 0) {\n return buildComp;\n } else if (betaComp !== 0) {\n return betaComp;\n }\n return 0;\n }\n}\n",
|
|
12
|
+
"import { VexFirmwareVersion } from \"./VexFirmwareVersion.js\";\nimport { type HostBoundPacket } from \"./VexPacket.js\";\n\nexport class PacketView extends DataView<ArrayBuffer> {\n position = 0;\n littleEndianDefault = true;\n\n constructor(\n buffer: ArrayBuffer,\n offset: number = 0,\n length: number = buffer.byteLength - offset,\n ) {\n super(buffer, offset, length);\n }\n\n static fromPacket(packet: HostBoundPacket): PacketView {\n const view = new PacketView(\n packet.data.buffer as ArrayBuffer,\n packet.data.byteOffset,\n );\n view.position = packet.ackIndex + 1;\n return view;\n }\n\n nextInt8(): number {\n const result = this.getInt8(this.position);\n this.position += 1;\n return result;\n }\n\n nextUint8(): number {\n const result = this.getUint8(this.position);\n this.position += 1;\n return result;\n }\n\n nextInt16(littleEndian = this.littleEndianDefault): number {\n const result = this.getInt16(this.position, littleEndian);\n this.position += 2;\n return result;\n }\n\n nextUint16(littleEndian = this.littleEndianDefault): number {\n const result = this.getUint16(this.position, littleEndian);\n this.position += 2;\n return result;\n }\n\n nextInt32(littleEndian = this.littleEndianDefault): number {\n const result = this.getInt32(this.position, littleEndian);\n this.position += 4;\n return result;\n }\n\n nextUint32(littleEndian = this.littleEndianDefault): number {\n const result = this.getUint32(this.position, littleEndian);\n this.position += 4;\n return result;\n }\n\n nextString(length: number): string {\n let result = \"\";\n for (let i = 0; i < length; i++) {\n result += String.fromCharCode(this.nextUint8());\n }\n return result;\n }\n\n nextNTBS(length: number): string {\n // this length is different from the document\n let result = \"\";\n const lastPosition = this.position;\n for (let i = 0; i < length; i++) {\n if (this.byteLength <= this.position) break;\n const g = this.nextUint8();\n if (g === 0) break;\n result += String.fromCharCode(g);\n }\n this.position = lastPosition + length;\n return result;\n }\n\n nextVarNTBS(length: number): string {\n // this length is different from the document\n let result = \"\";\n for (let i = 0; i < length; i++) {\n if (this.byteLength <= this.position) break;\n const g = this.nextUint8();\n if (g === 0) break;\n result += String.fromCharCode(g);\n }\n return result;\n }\n\n nextVersion(reverse = false): VexFirmwareVersion {\n const result = VexFirmwareVersion.fromUint8Array(\n new Uint8Array(this.buffer, this.byteOffset, this.byteLength),\n this.position,\n reverse,\n );\n this.position += 4;\n return result;\n }\n}\n",
|
|
13
|
+
"import { PacketView } from \"./VexPacketView.js\";\nimport {\n type DataArray,\n type FileDownloadTarget,\n type FileExitAction,\n FileInitAction,\n type FileInitOption,\n type FileLoadAction,\n type FileVendor,\n type IFileEntry,\n type IFileMetadata,\n type ISmartDeviceInfo,\n type MatchMode,\n type SlotNumber,\n type SelectDashScreen,\n} from \"./Vex.js\";\nimport { VexFirmwareVersion } from \"./VexFirmwareVersion.js\";\nimport { DeviceBoundPacket, HostBoundPacket, Packet } from \"./VexPacketBase.js\";\nimport { PacketEncoder, encodeFixedText } from \"./VexPacketEncoder.js\";\n\nconst textEncoder = new TextEncoder();\n\nexport class Query1H2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 33;\n static COMMAND_EXTENDED_ID = undefined;\n\n constructor() {\n super(undefined);\n }\n}\n\nexport class SystemVersionH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 164;\n static COMMAND_EXTENDED_ID = undefined;\n\n constructor() {\n super(undefined);\n }\n}\n\nexport class UpdateMatchModeH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 88;\n static COMMAND_EXTENDED_ID = 193;\n\n constructor(mode: MatchMode, matchClock: number) {\n let bit1;\n switch (mode) {\n case \"autonomous\":\n bit1 = 10;\n break;\n case \"driver\":\n bit1 = 8;\n break;\n case \"disabled\":\n bit1 = 11;\n }\n\n const payload = new Uint8Array(5);\n const view = new DataView(payload.buffer);\n payload[0] = (15 & bit1) >>> 0;\n\n view.setUint32(1, matchClock, true);\n\n super(payload);\n }\n}\n\nexport class GetMatchStatusH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 88;\n static COMMAND_EXTENDED_ID = 194;\n\n constructor() {\n super(undefined);\n }\n}\n\nexport class GetRadioModeH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 88;\n static COMMAND_EXTENDED_ID = 65;\n\n constructor(mode: number) {\n const payload = new Uint8Array(1);\n payload[0] = mode;\n\n super(payload);\n }\n}\n\nexport class FileControlH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 16;\n\n constructor(a: number, b: number) {\n const payload = new Uint8Array(2);\n payload.set([a, b], 0);\n\n super(payload);\n }\n}\n\nexport class InitFileTransferH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 17;\n\n constructor(\n operation: FileInitAction,\n target: FileDownloadTarget,\n vendor: FileVendor,\n options: FileInitOption,\n binary: Uint8Array,\n addr: number,\n name: string,\n type?: string,\n version: VexFirmwareVersion = new VexFirmwareVersion(1, 0, 0, 0),\n ) {\n const payload = new Uint8Array(52);\n const view = new DataView(payload.buffer);\n\n view.setUint8(0, operation);\n view.setUint8(1, target);\n view.setUint8(2, vendor);\n view.setUint8(3, options);\n view.setUint32(4, binary.length, true);\n view.setUint32(8, addr, true);\n view.setUint32(\n 12,\n operation === FileInitAction.WRITE\n ? Packet.ENCODER.crcgen.crc32(binary, 0)\n : 0,\n true,\n );\n\n const re = /(?:\\.([^.]+))?$/;\n const reResult = re.exec(name);\n let ext = reResult != null ? reResult[1] : undefined;\n ext ??= \"\";\n // files with gz extension are also type bin\n ext = ext === \"gz\" ? \"bin\" : ext;\n payload.set(encodeFixedText(type ?? ext, \"File type\", 4), 16);\n\n const timestamp = ((Date.now() / 1000) >>> 0) - PacketEncoder.J2000_EPOCH;\n view.setUint32(20, timestamp, true);\n\n payload.set(version.toUint8Array(), 24);\n\n // filename\n const nameEncoded = encodeFixedText(name, \"Filename\", 23);\n payload.set(nameEncoded, 28);\n view.setUint8(51, 0);\n\n super(payload);\n }\n}\n\nexport class ExitFileTransferH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 18;\n\n constructor(action: FileExitAction) {\n const payload = new Uint8Array(1);\n payload[0] = action;\n\n super(payload);\n }\n}\n\nexport class WriteFileH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 19;\n\n constructor(addr: number, buf: Uint8Array) {\n const payload = new Uint8Array(4 + buf.length);\n const view = new DataView(payload.buffer);\n view.setUint32(0, addr, true);\n payload.set(buf, 4);\n\n super(payload);\n }\n}\n\nexport class ReadFileH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 20;\n\n constructor(addr: number, size: number) {\n const payload = new Uint8Array(6);\n const view = new DataView(payload.buffer);\n view.setUint32(0, addr, true);\n view.setUint16(4, size, true);\n\n super(payload);\n }\n}\n\nexport class LinkFileH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 21;\n\n constructor(vendor: FileVendor, fileName: string, options: number) {\n const str = encodeFixedText(fileName, \"Filename\", 23);\n\n const payload = new Uint8Array(26);\n payload.set([vendor, options], 0);\n payload.set(str, 2);\n\n super(payload);\n }\n}\n\nexport class GetDirectoryFileCountH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 22;\n\n constructor(vendor: FileVendor) {\n const payload = new Uint8Array(2);\n payload.set([vendor, 0], 0);\n\n super(payload);\n }\n}\n\nexport class GetDirectoryEntryH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 23;\n\n constructor(index: number) {\n const payload = new Uint8Array(2);\n payload.set([index, 0], 0);\n\n super(payload);\n }\n}\n\nexport class LoadFileActionH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 24;\n\n constructor(\n vendor: FileVendor,\n actionId: FileLoadAction,\n fileNameOrSlotNumber: SlotNumber | string,\n ) {\n let fileName;\n if (typeof fileNameOrSlotNumber === \"string\") {\n fileName = fileNameOrSlotNumber;\n } else {\n fileName = \"___s_\" + (fileNameOrSlotNumber - 1) + \".bin\";\n }\n\n const encodedName = encodeFixedText(fileName, \"Filename\", 23);\n const payload = new Uint8Array(26);\n payload.set([vendor, actionId], 0);\n payload.set(encodedName, 2);\n\n super(payload);\n }\n}\n\nexport class GetFileMetadataH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 25;\n\n constructor(vendor: FileVendor, fileName: string, options: number) {\n const encodedName = encodeFixedText(fileName, \"Filename\", 23);\n\n const payload = new Uint8Array(26);\n payload.set([vendor, options], 0);\n payload.set(encodedName, 2);\n\n super(payload);\n }\n}\n\nexport class EraseFileH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 27;\n\n constructor(vendor: FileVendor, fileName: string) {\n const encodedName = encodeFixedText(fileName, \"Filename\", 23);\n\n const payload = new Uint8Array(26);\n payload.set([vendor, 128], 0);\n payload.set(encodedName, 2);\n\n super(payload);\n }\n}\n\nexport class GetProgramSlotInfoH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 28;\n\n constructor(vendor: FileVendor, fileName: string) {\n const encodedName = encodeFixedText(fileName, \"Filename\", 23);\n\n const payload = new Uint8Array(26);\n payload.set([vendor, 0], 0);\n payload.set(encodedName, 2);\n\n super(payload);\n }\n}\n\nexport class FileClearUpH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 30;\n\n constructor(vendor: FileVendor) {\n const payload = new Uint8Array(2);\n payload.set([vendor, 0], 0);\n\n super(payload);\n }\n}\n\nexport class FileFormatH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 31;\n\n constructor() {\n const payload = new Uint8Array(4);\n payload.set([68, 67, 66, 65], 0);\n\n super(payload);\n }\n}\n\nexport class GetSystemFlagsH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 32;\n}\n\nexport class GetDeviceStatusH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 33;\n\n constructor() {\n super(undefined);\n }\n}\n\nexport class GetSystemStatusH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 34;\n\n constructor() {\n super(undefined);\n }\n}\n\nexport class GetFdtStatusH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 35;\n\n constructor() {\n super(undefined);\n }\n}\n\nexport class GetLogCountH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 36;\n\n constructor() {\n super(undefined);\n }\n}\n\nexport class ReadLogPageH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 37;\n\n constructor(offset: number, count: number) {\n const payload = new Uint8Array(8);\n const view = new DataView(payload.buffer);\n view.setUint32(0, offset, true);\n view.setUint32(4, count, true);\n\n super(payload);\n }\n}\n\nexport class GetRadioStatusH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 38;\n\n constructor() {\n super(undefined);\n }\n}\n\nexport class ScreenCaptureH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 40;\n\n constructor(e: number) {\n const payload = new Uint8Array(1);\n payload[0] = e;\n\n super(payload);\n }\n}\n\nexport class SendDashTouchH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 42;\n\n constructor(x: number, y: number, press: boolean) {\n const payload = new Uint8Array(6);\n const view = new DataView(payload.buffer);\n view.setUint16(0, x, true);\n view.setUint16(2, y, true);\n view.setUint16(4, press ? 1 : 0, true);\n\n super(payload);\n }\n}\n\nexport class SelectDashH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 43;\n constructor(screen: number | SelectDashScreen, port: number) {\n const payload = new Uint8Array(2);\n payload[0] = screen;\n payload[1] = port;\n\n super(payload);\n }\n}\n\nexport class ReadKeyValueH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 46;\n\n constructor(key: string) {\n const encodedKey = encodeFixedText(key, \"Key\", 31);\n const payload = new Uint8Array(32);\n payload.set(encodedKey, 0);\n\n super(payload);\n }\n}\n\nexport class WriteKeyValueH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 47;\n\n constructor(key: string, value: string) {\n const strk = encodeFixedText(key, \"Key\", 31);\n const strv = textEncoder.encode(value);\n if (strk.byteLength + strv.byteLength + 20 > 0x7fff) {\n throw new RangeError(\"Key and value are too large for a protocol packet\");\n }\n\n const payload = new Uint8Array(strk.length + strv.length + 20);\n payload.set(strk, 0);\n payload.set(strv, strk.length + 1);\n\n super(payload);\n }\n}\n\nexport class GetSlot1to4InfoH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 49;\n\n constructor() {\n super(undefined);\n }\n}\n\nexport class GetSlot5to8InfoH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 50;\n\n constructor() {\n super(undefined);\n }\n}\n\nexport class FactoryStatusH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 241;\n}\n\nexport class FactoryEnableH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 255;\n\n constructor() {\n const payload = new Uint8Array(4);\n payload.set([77, 76, 75, 74], 0);\n\n super(payload);\n }\n}\n\nexport class Query1ReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 33;\n static COMMAND_EXTENDED_ID = undefined;\n joystickFlag1: number;\n joystickFlag2: number;\n brainFlag1: number;\n brainFlag2: number;\n bootloadFlag1: number;\n bootloadFlag2: number;\n\n constructor(data: DataArray) {\n super(data);\n\n this.joystickFlag1 = this.data[4]!;\n this.joystickFlag2 = this.data[5]!;\n this.brainFlag1 = this.data[6]!; // a.k.a vex version\n this.brainFlag2 = this.data[7]!;\n this.bootloadFlag1 = this.data[10]!;\n this.bootloadFlag2 = this.data[11]!;\n }\n}\n\nexport class SystemVersionReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 164;\n static COMMAND_EXTENDED_ID = undefined;\n version: VexFirmwareVersion;\n hardware: number;\n\n constructor(data: DataArray) {\n super(data);\n\n this.version = new VexFirmwareVersion(\n this.data[4]!,\n this.data[5]!,\n this.data[6]!,\n this.data[8]!,\n );\n this.hardware = this.data[7]!;\n }\n}\n\nexport class MatchModeReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 88;\n static COMMAND_EXTENDED_ID = 193;\n\n modebit: number;\n\n constructor(data: DataArray) {\n super(data);\n\n const dataView = PacketView.fromPacket(this);\n\n this.modebit = dataView.nextUint8();\n }\n}\n\nexport class MatchStatusReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 88;\n static COMMAND_EXTENDED_ID = 194;\n\n rssi: number; // a.k.a Signal Strength\n systemStatusBits: number;\n radioStatusBits: number; // a.k.a Data Quality\n fieldStatusBits: number;\n matchClock: number;\n brainBatteryPercent: number;\n controllerBatteryPercent: number;\n partnerControllerBatteryPercent: number;\n pad: number;\n buttons: number;\n activeProgram: number;\n radioType: number;\n radioChannel: number;\n radioSlot: number;\n robotName: string;\n controllerFlags: number;\n rxSignalQuality: number;\n\n constructor(data: DataArray) {\n super(data);\n\n const dataView = PacketView.fromPacket(this);\n const n = this.ackIndex;\n\n this.rssi = dataView.nextInt8();\n this.systemStatusBits = dataView.nextUint16();\n this.radioStatusBits = dataView.nextUint16();\n this.fieldStatusBits = dataView.nextUint8();\n this.matchClock = dataView.nextUint8();\n this.brainBatteryPercent = dataView.nextUint8();\n this.controllerBatteryPercent = dataView.nextUint8();\n this.partnerControllerBatteryPercent = dataView.nextUint8();\n this.pad = dataView.nextUint8();\n this.buttons = dataView.nextUint16();\n this.activeProgram = dataView.nextUint8();\n this.radioType = dataView.nextUint8();\n this.radioChannel = dataView.nextUint8();\n this.radioSlot = dataView.nextUint8();\n this.robotName = dataView.nextNTBS(10);\n this.controllerFlags = dataView.getUint8(n + 28);\n this.rxSignalQuality = dataView.getUint8(n + 29);\n\n let rawStr = new TextDecoder(\"UTF-8\").decode(\n data.slice(n + 18, n + this.payloadSize + 28),\n );\n const endIdx = rawStr.indexOf(\"\\0\");\n if (endIdx > -1) {\n rawStr = rawStr.substr(0, endIdx);\n }\n this.robotName = rawStr;\n }\n}\n\nexport class FileControlReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 16;\n}\n\nexport class InitFileTransferReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 17;\n windowSize: number;\n fileSize: number;\n crc32: number;\n\n constructor(data: DataArray) {\n super(data);\n\n const dataView = PacketView.fromPacket(this);\n\n this.windowSize = dataView.nextUint16();\n this.fileSize = dataView.nextUint32();\n this.crc32 = dataView.nextUint32();\n }\n}\n\nexport class ExitFileTransferReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 18;\n}\n\nexport class WriteFileReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 19;\n}\n\nexport class ReadFileReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 20;\n addr: number;\n length: number;\n buf: ArrayBuffer;\n\n constructor(data: DataArray) {\n super(data);\n\n const dataView = PacketView.fromPacket(this);\n\n this.addr = dataView.nextUint32();\n this.length = this.payloadSize - 8;\n this.buf = this.data.slice(\n dataView.position,\n dataView.position + this.length,\n ).buffer;\n }\n\n static isValidPacket(data: Uint8Array, n: number): boolean {\n return super.isValidPacket(data, n);\n }\n}\n\nexport class LinkFileReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 21;\n}\n\nexport class GetDirectoryFileCountReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 22;\n count: number;\n\n constructor(data: DataArray) {\n super(data);\n\n const dataView = PacketView.fromPacket(this);\n\n this.count = dataView.nextUint16();\n }\n}\n\nexport class GetDirectoryEntryReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 23;\n\n file?: IFileEntry;\n\n constructor(data: DataArray) {\n super(data);\n\n const dataView = PacketView.fromPacket(this);\n\n if (this.payloadSize > 4) {\n this.file = {\n index: dataView.nextUint8(),\n size: dataView.nextUint32(),\n loadAddress: dataView.nextUint32(),\n crc32: dataView.nextUint32(),\n type: dataView.nextString(4),\n timestamp: dataView.nextUint32() + PacketEncoder.J2000_EPOCH,\n version: dataView.nextVersion(),\n filename: dataView.nextNTBS(32),\n };\n }\n }\n}\n\nexport class LoadFileActionReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 24;\n}\n\nexport class GetFileMetadataReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 25;\n\n file?: IFileMetadata;\n\n constructor(data: DataArray) {\n super(data);\n\n const dataView = PacketView.fromPacket(this);\n dataView.nextUint8();\n\n if (this.payloadSize > 4) {\n this.file = {\n size: dataView.nextUint32(),\n loadAddress: dataView.nextUint32(),\n crc32: dataView.nextUint32(),\n type: dataView.nextString(4),\n timestamp: dataView.nextUint32() + PacketEncoder.J2000_EPOCH,\n version: dataView.nextVersion(),\n };\n }\n }\n}\n\nexport class EraseFileReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 27;\n}\n\nexport class GetProgramSlotInfoReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 28;\n requestedSlot: number;\n slot: number;\n\n constructor(data: DataArray) {\n super(data);\n\n const dataView = PacketView.fromPacket(this);\n\n this.slot = dataView.nextUint8();\n this.requestedSlot = dataView.nextUint8();\n }\n}\n\nexport class FileClearUpReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 30;\n}\n\nexport class FileFormatReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 31;\n}\n\nexport class GetSystemFlagsReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 32;\n flags: number;\n radioSearching: boolean;\n radioQuality?: number;\n controllerBatteryPercent?: number;\n partnerControllerBatteryPercent?: number;\n battery?: number;\n currentProgram: number;\n\n constructor(data: DataArray) {\n super(data);\n\n const dataView = PacketView.fromPacket(this);\n\n this.radioSearching = false;\n this.currentProgram = 0;\n\n this.flags = dataView.nextUint32();\n const hasPartner = (8192 & this.flags) !== 0;\n const hasRadio = (1536 & this.flags) === 1536;\n\n const byte1 = dataView.nextUint8();\n const byte2 = dataView.nextUint8();\n\n if (this.payloadSize === 11) {\n this.battery = 8 * (byte1 & 0x0f);\n if ((this.flags & 0x100) !== 0 || hasRadio)\n this.controllerBatteryPercent = 8 * ((byte1 >> 4) & 0x0f);\n if (hasRadio) this.radioQuality = 8 * (byte2 & 0x0f);\n this.radioSearching = (this.flags & 0x600) === 0x200;\n if (hasPartner)\n this.partnerControllerBatteryPercent = 8 * ((byte2 >> 4) & 0x0f);\n this.currentProgram = dataView.nextUint8();\n\n if (this.battery != null && this.battery > 100) this.battery = 100;\n if (\n this.controllerBatteryPercent != null &&\n this.controllerBatteryPercent > 100\n )\n this.controllerBatteryPercent = 100;\n if (this.radioQuality != null && this.radioQuality > 100)\n this.radioQuality = 100;\n if (\n this.partnerControllerBatteryPercent != null &&\n this.partnerControllerBatteryPercent > 100\n )\n this.partnerControllerBatteryPercent = 100;\n }\n }\n}\n\nexport class GetDeviceStatusReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 33;\n count: number;\n devices: ISmartDeviceInfo[];\n\n constructor(data: DataArray) {\n super(data);\n\n const dataView = PacketView.fromPacket(this);\n\n this.count = dataView.nextUint8();\n this.devices = [];\n for (let i = 0; i < this.count; i++) {\n this.devices.push({\n port: dataView.nextUint8(),\n type: dataView.nextUint8(),\n status: dataView.nextUint8(),\n betaversion: dataView.nextUint8(),\n version: dataView.nextUint16(),\n bootversion: dataView.nextUint16(),\n });\n }\n }\n}\n\nexport class GetSystemStatusReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 34;\n\n systemVersion: VexFirmwareVersion;\n cpu0Version: VexFirmwareVersion;\n cpu1Version: VexFirmwareVersion;\n nxpVersion: VexFirmwareVersion;\n touchVersion: VexFirmwareVersion;\n uniqueId: number;\n sysflags: number[];\n eventBrain: boolean;\n romBootloaderActive: boolean;\n ramBootloaderActive: boolean;\n goldenVersion: VexFirmwareVersion;\n\n constructor(data: DataArray) {\n super(data);\n\n const dataView = PacketView.fromPacket(this);\n\n dataView.nextUint8();\n\n this.systemVersion = dataView.nextVersion();\n this.cpu0Version = dataView.nextVersion();\n this.cpu1Version = dataView.nextVersion();\n this.touchVersion = dataView.nextVersion(true);\n\n this.uniqueId = 1234;\n this.sysflags = [0, 0, 0, 0, 0, 0, 0];\n this.goldenVersion = VexFirmwareVersion.allZero();\n this.nxpVersion = VexFirmwareVersion.allZero();\n this.eventBrain = false;\n this.romBootloaderActive = false;\n this.ramBootloaderActive = false;\n\n if (this.payloadSize > 25) {\n this.uniqueId = dataView.nextUint32();\n this.sysflags = [\n dataView.nextUint8(),\n dataView.nextUint8(),\n dataView.nextUint8(),\n dataView.nextUint8(),\n dataView.nextUint8(),\n 0,\n dataView.nextUint8(),\n ];\n this.eventBrain = (1 & this.sysflags[6]!) !== 0;\n this.romBootloaderActive = (2 & this.sysflags[6]!) !== 0;\n this.ramBootloaderActive = (4 & this.sysflags[6]!) !== 0;\n\n dataView.nextUint16();\n\n this.goldenVersion = dataView.nextVersion();\n }\n\n if (this.payloadSize > 37) {\n this.nxpVersion = dataView.nextVersion();\n }\n }\n}\n\nexport class GetFdtStatusReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 35;\n count: number;\n status: unknown[];\n\n constructor(data: DataArray) {\n super(data);\n\n const dataView = PacketView.fromPacket(this);\n\n this.count = dataView.nextUint8();\n this.status = [];\n for (let i = 0; i < this.count; i++) {\n this.status.push({\n index: dataView.nextUint8(),\n type: dataView.nextUint8(),\n status: dataView.nextUint8(),\n betaversion: dataView.nextUint8(),\n version: dataView.nextUint16(),\n bootversion: dataView.nextUint16(),\n });\n }\n }\n}\n\nexport class GetLogCountReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 36;\n count: number;\n\n constructor(data: DataArray) {\n super(data);\n\n const dataView = PacketView.fromPacket(this);\n\n dataView.nextUint8();\n\n this.count = dataView.nextUint32();\n }\n}\n\nexport class ReadLogPageReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 37;\n offset: number;\n count: number;\n entries: unknown[];\n\n constructor(data: DataArray) {\n super(data);\n\n const dataView = PacketView.fromPacket(this);\n const n = this.ackIndex;\n\n const size = dataView.nextUint8();\n this.offset = dataView.nextUint32();\n this.count = dataView.nextUint16();\n this.entries = [];\n\n let j = n + 8;\n for (let i = 0; i < this.count; i++) {\n this.entries.push({\n code: dataView.getUint8(j),\n type: dataView.getUint8(j + 1),\n desc: dataView.getUint8(j + 2),\n spare: dataView.getUint8(j + 3),\n time: dataView.getUint32(j + 4, true),\n });\n j += size;\n }\n }\n}\n\nexport class GetRadioStatusReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 38;\n device: number; // unsure\n quality: number;\n strength: number;\n channel: number;\n timeslot: number; // time delay?\n\n constructor(data: DataArray) {\n super(data);\n\n const dataView = PacketView.fromPacket(this);\n const n = this.ackIndex;\n\n this.device = dataView.nextUint8();\n this.quality = dataView.nextUint16();\n this.strength = dataView.nextInt16();\n this.channel = this.data[n + 6]!;\n this.timeslot = this.data[n + 7]!;\n }\n}\n\nexport class ScreenCaptureReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 40;\n}\n\n// export class UserProgramControlReplyD2HPacket extends HostBoundPacket {\n// static COMMAND_ID = 86;\n// static COMMAND_EXTENDED_ID = 41;\n// }\n\nexport class SendDashTouchReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 42;\n}\n\nexport class SelectDashReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 43;\n}\n\nexport class ReadKeyValueReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 46;\n value: string;\n\n constructor(data: DataArray) {\n super(data);\n\n const dataView = PacketView.fromPacket(this);\n\n this.value = dataView.nextVarNTBS(255);\n }\n}\n\nexport class WriteKeyValueReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 47;\n}\n\nexport class GetSlot1to4InfoReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 49;\n slotFlags: number;\n slots: unknown[];\n\n constructor(data: DataArray, start: number = 1) {\n super(data);\n\n const dataView = PacketView.fromPacket(this);\n\n this.slotFlags = dataView.nextUint8();\n this.slots = [];\n\n for (let i = 0; i < 4; i++) {\n const hasData = (this.slotFlags & (2 ** (start - 1 + i))) !== 0;\n\n if (!hasData) continue;\n\n const iconNum = dataView.nextUint16();\n const nameLen = dataView.nextUint8();\n const name = dataView.nextString(nameLen);\n\n this.slots.push({\n slot: start + i,\n icon: iconNum,\n name,\n });\n }\n }\n}\n\nexport class GetSlot5to8InfoReplyD2HPacket extends GetSlot1to4InfoReplyD2HPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 50;\n slotStartIndex = 5;\n\n constructor(data: DataArray) {\n super(data, 5);\n }\n}\n\nexport class FactoryStatusReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 241;\n status: number;\n percent: number;\n\n constructor(data: DataArray) {\n super(data);\n\n const dataView = PacketView.fromPacket(this);\n\n this.status = dataView.nextUint8();\n this.percent = dataView.nextUint8();\n }\n}\n\nexport class FactoryEnableReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 255;\n}\n",
|
|
14
|
+
"import { CrcGenerator } from \"./VexCRC.js\";\nimport { HostBoundPacket, Packet } from \"./VexPacketBase.js\";\nimport * as AllPackets from \"./VexPacketModels.js\";\n\nconst textEncoder = new TextEncoder();\n\nexport function encodeFixedText(\n value: string,\n field: string,\n maxBytes: number,\n): Uint8Array {\n const encoded = textEncoder.encode(value);\n if (encoded.byteLength > maxBytes) {\n throw new RangeError(`${field} must be at most ${maxBytes} UTF-8 bytes`);\n }\n return encoded;\n}\n\nexport class PacketEncoder {\n static HEADERS_LENGTH = 4;\n static HEADER_TO_DEVICE = [201, 54, 184, 71];\n static HEADER_TO_HOST = [170, 85];\n\n static J2000_EPOCH = 946684800;\n\n vexVersion: number;\n\n crcgen: CrcGenerator;\n allPacketsTable: Record<string, typeof HostBoundPacket> = {};\n\n static getInstance(): PacketEncoder {\n if (Packet.ENCODER === undefined) {\n Packet.ENCODER = new PacketEncoder();\n }\n return Packet.ENCODER;\n }\n\n private constructor() {\n this.vexVersion = 0;\n this.crcgen = new CrcGenerator();\n\n Object.values(AllPackets).forEach((packet) => {\n if (\n typeof packet === \"function\" &&\n packet.prototype instanceof HostBoundPacket\n ) {\n const packetType = packet as unknown as typeof HostBoundPacket & {\n COMMAND_ID: number;\n COMMAND_EXTENDED_ID: number | undefined;\n };\n this.allPacketsTable[\n packetType.COMMAND_ID + \" \" + packetType.COMMAND_EXTENDED_ID\n ] = packetType;\n }\n });\n }\n\n /**\n * Create the vex CDC header\n * @param buf the bytes to send\n */\n createHeader(buf: ArrayBuffer | undefined): Uint8Array {\n // create a buffer if is is not defined\n if (buf === undefined || buf.byteLength < PacketEncoder.HEADERS_LENGTH) {\n buf = new ArrayBuffer(PacketEncoder.HEADERS_LENGTH);\n }\n const h = new Uint8Array(buf);\n h.set(PacketEncoder.HEADER_TO_DEVICE);\n return h;\n }\n\n /**\n * Create the vex CDC simple message\n * @param cmd the CDC command byte\n */\n cdcCommand(cmd: number): Uint8Array {\n const buf = new ArrayBuffer(PacketEncoder.HEADERS_LENGTH + 1);\n const h = this.createHeader(buf);\n h.set([cmd], PacketEncoder.HEADERS_LENGTH);\n return h;\n }\n\n /**\n * Create the vex CDC simple message\n * @param cmd the CDC command byte\n * @param data the data to send\n */\n cdcCommandWithData(cmd: number, data: Uint8Array): Uint8Array {\n const buf = new ArrayBuffer(PacketEncoder.HEADERS_LENGTH + 2 + data.length);\n const h = this.createHeader(buf);\n // add command and length bytes\n h.set([cmd, data.length], PacketEncoder.HEADERS_LENGTH);\n // add the message data\n h.set(data, PacketEncoder.HEADERS_LENGTH + 2);\n return h;\n }\n\n /**\n * Create the vex CDC extended message\n * @param cmd the CDC command byte\n * @param ext the CDC extended command byte\n * @return a message\n */\n cdc2Command(cmd: number, ext: number): Uint8Array {\n const buf = new ArrayBuffer(PacketEncoder.HEADERS_LENGTH + 5);\n const h = this.createHeader(buf);\n h.set([cmd, ext, 0], PacketEncoder.HEADERS_LENGTH);\n // Add CRC\n const crc = this.crcgen.crc16(h.subarray(0, buf.byteLength - 2), 0) >>> 0;\n h.set([crc >>> 8, crc & 0xff], buf.byteLength - 2);\n return h;\n }\n\n /**\n * Calculate buffer length for new CDC extended command\n * @param data the CDC extended command payload\n * @returns the required buffer length of the command message\n */\n cdc2CommandBufferLength(data: Uint8Array): number {\n // New command use header + 1 byte command\n // + 1 byte function\n // + 1 byte data length\n let length = PacketEncoder.HEADERS_LENGTH + data.length + 3 + 2;\n // If data length is > 127 bytes then an additional data length byte is added\n if (data.length > 127) length += 1;\n return length;\n }\n\n /**\n * Create the vex CDC extended message with some data\n * @param cmd the CDC command byte\n * @param ext the CDC extended command byte\n * @param data the CDC extended command payload\n * @return a message\n */\n cdc2CommandWithData(cmd: number, ext: number, data: Uint8Array): Uint8Array {\n const buf = new ArrayBuffer(this.cdc2CommandBufferLength(data));\n const h = this.createHeader(buf);\n // add command and length bytes\n if (data.length < 128) {\n h.set([cmd, ext, data.length], PacketEncoder.HEADERS_LENGTH);\n // add the message data\n h.set(data, PacketEncoder.HEADERS_LENGTH + 3);\n } else {\n const lengthMsb = ((data.length >>> 8) | 0x80) >>> 0;\n const lengthLsb = (data.length & 0xff) >>> 0;\n h.set([cmd, ext, lengthMsb, lengthLsb], PacketEncoder.HEADERS_LENGTH);\n // add the message data\n h.set(data, PacketEncoder.HEADERS_LENGTH + 4);\n }\n // Add CRC (little endian)\n const crc = this.crcgen.crc16(h.subarray(0, buf.byteLength - 2), 0);\n h.set([crc >>> 8, crc & 0xff], buf.byteLength - 2);\n return h;\n }\n\n validateHeader(data: Uint8Array): boolean {\n return !(\n data[0] !== PacketEncoder.HEADER_TO_HOST[0] ||\n data[1] !== PacketEncoder.HEADER_TO_HOST[1]\n );\n }\n\n validateMessageCdc(data: Uint8Array): boolean {\n const message = data.subarray(0, data.byteLength - 2);\n const lastTwoBytes =\n (data[data.byteLength - 2]! << 8) + data[data.byteLength - 1]!;\n return this.crcgen.crc16(message, 0) === lastTwoBytes;\n }\n\n getPayloadSize(data: Uint8Array): number {\n let t = 0;\n let a = data[3]!;\n if ((128 & a) !== 0) {\n t = 127 & a;\n a = data[4]!;\n }\n return (t << 8) + a;\n }\n\n getHostHeaderLength(data: Uint8Array): number {\n return (data[3]! & 0x80) === 0 ? 4 : 5;\n }\n}\n",
|
|
15
|
+
"import {\n AckType,\n FileDownloadTarget,\n FileExitAction,\n FileInitAction,\n FileInitOption,\n FileLoadAction,\n FileVendor,\n type IFileBasicInfo,\n type IFileWriteRequest,\n type IPacketCallback,\n type MatchMode,\n SerialDeviceType,\n type SlotNumber,\n USER_FLASH_USR_CODE_START,\n USER_PROG_CHUNK_SIZE,\n type SelectDashScreen,\n} from \"./Vex.js\";\nimport {\n VexIoError,\n VexProtocolError,\n VexSerialError,\n VexTransferError,\n toVexSerialError,\n} from \"./VexError.js\";\nimport { VexEventTarget } from \"./VexEvent.js\";\nimport { type ProgramIniConfig } from \"./VexIniConfig.js\";\nimport { err, ok, Result, ResultAsync } from \"neverthrow\";\nimport {\n MatchStatusReplyD2HPacket,\n DeviceBoundPacket,\n GetMatchStatusH2DPacket,\n UpdateMatchModeH2DPacket,\n MatchModeReplyD2HPacket,\n GetSystemStatusReplyD2HPacket,\n GetSystemStatusH2DPacket,\n type HostBoundPacket,\n InitFileTransferH2DPacket,\n InitFileTransferReplyD2HPacket,\n LinkFileH2DPacket,\n ExitFileTransferH2DPacket,\n ExitFileTransferReplyD2HPacket,\n WriteFileReplyD2HPacket,\n WriteFileH2DPacket,\n LinkFileReplyD2HPacket,\n ReadFileH2DPacket,\n ReadFileReplyD2HPacket,\n PacketEncoder,\n SystemVersionH2DPacket,\n SystemVersionReplyD2HPacket,\n Query1H2DPacket,\n Query1ReplyD2HPacket,\n LoadFileActionH2DPacket,\n LoadFileActionReplyD2HPacket,\n GetSystemFlagsH2DPacket,\n GetSystemFlagsReplyD2HPacket,\n GetRadioStatusH2DPacket,\n GetRadioStatusReplyD2HPacket,\n GetDeviceStatusH2DPacket,\n GetDeviceStatusReplyD2HPacket,\n SendDashTouchH2DPacket,\n SendDashTouchReplyD2HPacket,\n SelectDashH2DPacket,\n SelectDashReplyD2HPacket,\n ScreenCaptureH2DPacket,\n ScreenCaptureReplyD2HPacket,\n EraseFileH2DPacket,\n EraseFileReplyD2HPacket,\n FileClearUpH2DPacket,\n FileClearUpReplyD2HPacket,\n} from \"./VexPacket.js\";\nimport { type VexFirmwareVersion } from \"./VexFirmwareVersion.js\";\n\nconst thePacketEncoder = PacketEncoder.getInstance();\nconst SCREEN_CAPTURE_HEIGHT = 272;\nconst SCREEN_CAPTURE_WIDTH = 480;\nconst SCREEN_CAPTURE_CHANNELS = 3;\nconst SCREEN_CAPTURE_MESSAGE_WIDTH = 512;\nconst SCREEN_CAPTURE_MESSAGE_CHANNELS = 4;\n\n/**\n * A connection to a V5 device.\n * Emit events: connected, disconnected\n */\nexport class VexSerialConnection extends VexEventTarget {\n filters: SerialPortFilter[] = [{ usbVendorId: 10376 }];\n\n writer: WritableStreamDefaultWriter<unknown> | undefined;\n reader: ReadableStreamDefaultReader<unknown> | undefined;\n port: SerialPort | undefined;\n serial: Serial;\n\n callbacksQueue: IPacketCallback[] = [];\n private _onPortDisconnect: (() => void) | null = null;\n private _closePromise: Promise<void> | null = null;\n private _wasConnected = false;\n protected fileTransferTail: Promise<unknown> = Promise.resolve();\n protected fileTransferDepth = 0;\n\n get isConnected(): boolean {\n return (\n this.port !== undefined &&\n this.reader !== undefined &&\n this.writer !== undefined\n );\n }\n\n get isFileTransferring(): boolean {\n return this.fileTransferDepth > 0;\n }\n\n constructor(serial: Serial) {\n super();\n this.serial = serial;\n }\n\n async close(): Promise<void> {\n if (this._closePromise) return this._closePromise;\n if (!this._hasOpenResources()) return;\n\n this._closePromise = this._doClose();\n try {\n await this._closePromise;\n } finally {\n this._closePromise = null;\n }\n }\n\n private _hasOpenResources(): boolean {\n return (\n this.port !== undefined ||\n this.reader !== undefined ||\n this.writer !== undefined ||\n this._onPortDisconnect !== null ||\n this.callbacksQueue.length > 0\n );\n }\n\n private async _doClose(): Promise<void> {\n // 1. Reject every pending callback so callers don't hang.\n for (const callback of this.callbacksQueue.splice(0)) {\n clearTimeout(callback.timeout);\n callback.callback(AckType.CDC2_NACK);\n }\n\n // 2. Remove the port's disconnect listener so a late event doesn't\n // re-enter close and so repeated open/close cycles don't grow\n // listener counts.\n const onDisconnect = this._onPortDisconnect;\n this._onPortDisconnect = null;\n if (onDisconnect !== null) {\n try {\n this.port?.removeEventListener(\"disconnect\", onDisconnect);\n } catch {\n // The port may already be gone or the implementation may not\n // support listener removal.\n }\n }\n\n // 3. Close the writer and release the lock. Errors are swallowed so\n // cleanup can continue; the original error (if any) is preserved\n // by awaiting inside try/finally rather than the catch arm.\n const writer = this.writer;\n this.writer = undefined;\n if (writer !== undefined) {\n try {\n await writer.close();\n } catch {\n // The stream may already be closed or errored.\n } finally {\n try {\n writer.releaseLock();\n } catch {\n // Some stream implementations do not support explicit release.\n }\n }\n }\n\n // 4. Cancel the reader, drain any remaining bytes, then release.\n const reader = this.reader;\n this.reader = undefined;\n if (reader !== undefined) {\n try {\n await reader.cancel();\n } catch {\n // The stream may already be closed or errored.\n }\n try {\n while (true) {\n const { done } = await reader.read();\n if (done) break;\n }\n } catch {\n // Cancellation may have left the reader in an errored state.\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // Some stream implementations do not support explicit release.\n }\n }\n }\n\n // 5. Close the underlying port. Releasing both locks above means the\n // streams are no longer holding handles, so the port can be\n // closed without the legacy one-millisecond lock-release delay.\n const port = this.port;\n this.port = undefined;\n if (port !== undefined) {\n try {\n await port.close();\n } catch (e) {\n console.warn(\"Close port error.\", e);\n }\n }\n\n // 6. Emit exactly one disconnected event per connected lifecycle so\n // that observers don't have to deduplicate.\n if (this._wasConnected) {\n this._wasConnected = false;\n this.emit(\"disconnected\", undefined);\n }\n }\n\n /**\n * Open a port. The result is `Err` only when a connection is already\n * open (programmer error); otherwise the underlying `boolean |\n * undefined` semantics are preserved: `true` = opened, `false` =\n * the port was busy, `undefined` = no matching port was selected.\n */\n open(\n use: number | undefined = 0,\n askUser: boolean = true,\n ): ResultAsync<boolean | undefined, VexSerialError> {\n if (this.port !== undefined) {\n return errAsyncVex(new VexIoError(\"Already connected.\"));\n }\n return new ResultAsync(this._open(use, askUser));\n }\n\n private async _open(\n use: number | undefined,\n askUser: boolean,\n ): Promise<Result<boolean | undefined, VexSerialError>> {\n let port: SerialPort | undefined;\n\n if (use !== undefined) {\n const ports = (await this.serial.getPorts())\n .filter((p) => {\n const info = p.getInfo();\n return this.filters.find(\n (f) =>\n (f.usbVendorId === undefined ||\n f.usbVendorId === info.usbVendorId) &&\n (f.usbProductId === undefined ||\n f.usbProductId === info.usbProductId),\n );\n })\n .filter((candidate) => candidate.readable === null);\n\n port = ports[use];\n }\n\n if (port == null && askUser) {\n try {\n port = await this.serial.requestPort({ filters: this.filters });\n } catch {\n // User canceled port selection or no matching port was available.\n }\n }\n\n if (port == null) return ok(undefined);\n\n if (port.readable != null) return ok(false);\n\n try {\n this.port = port;\n await port.open({ baudRate: 115200 });\n\n this._onPortDisconnect = () => {\n void this.close();\n };\n this.port.addEventListener(\"disconnect\", this._onPortDisconnect);\n\n this.writer = this.port.writable.getWriter();\n this.reader = this.port.readable.getReader();\n void this.startReader();\n this._wasConnected = true;\n this.emit(\"connected\", undefined);\n\n return ok(true);\n } catch {\n await this.close();\n return ok(false);\n }\n }\n\n writeData(\n rawData: DeviceBoundPacket | Uint8Array,\n resolve: (data: HostBoundPacket | ArrayBuffer | AckType) => void,\n timeout: number = 1000,\n ): void {\n void this.writeDataAsync(rawData, timeout).then(resolve);\n }\n\n async writeDataAsync(\n rawData: DeviceBoundPacket | Uint8Array,\n timeout: number = 1000,\n ): Promise<HostBoundPacket | ArrayBuffer | AckType> {\n return new Promise<HostBoundPacket | ArrayBuffer | AckType>((resolve) => {\n if (this.writer === undefined) {\n resolve(AckType.CDC2_NACK);\n return;\n }\n\n const data: Uint8Array =\n rawData instanceof DeviceBoundPacket ? rawData.data : rawData;\n const cb = {\n callback: resolve,\n timeout: setTimeout(() => {\n const index = this.callbacksQueue.indexOf(cb);\n if (index === -1) return;\n this.callbacksQueue.splice(index, 1);\n cb.callback(AckType.TIMEOUT);\n }, timeout),\n wantedCommandId:\n rawData instanceof DeviceBoundPacket ? rawData.commandId : undefined,\n wantedCommandExId:\n rawData instanceof DeviceBoundPacket\n ? rawData.commandExtendedId\n : undefined,\n };\n this.callbacksQueue.push(cb);\n\n this.writer.write(data).catch(() => {\n const index = this.callbacksQueue.indexOf(cb);\n if (index === -1) return;\n this.callbacksQueue.splice(index, 1);\n clearTimeout(cb.timeout);\n resolve(AckType.WRITE_ERROR);\n });\n });\n }\n\n protected async readData(\n cache: Uint8Array,\n expectedSize: number,\n ): Promise<Uint8Array> {\n if (this.reader == null) throw new Error(\"No reader\");\n\n while (cache.byteLength < expectedSize) {\n const { value: readData, done: isDone } = await this.reader.read();\n\n if (isDone) throw new Error(\"No data\");\n\n cache = binaryArrayJoin(cache, readData as Uint8Array);\n }\n\n return cache;\n }\n\n protected async startReader(): Promise<void> {\n let cache: Uint8Array = new Uint8Array([]);\n let sliceIdx = 0;\n for (;;)\n try {\n cache = await this.readData(cache, 5);\n sliceIdx = 0;\n\n while (!thePacketEncoder.validateHeader(cache)) {\n const nextHeader = cache.findIndex(\n (byte, index) =>\n index > 0 &&\n byte === PacketEncoder.HEADER_TO_HOST[0] &&\n cache[index + 1] === PacketEncoder.HEADER_TO_HOST[1],\n );\n if (nextHeader >= 0) {\n cache = cache.slice(nextHeader);\n } else {\n cache = cache.slice(\n cache.at(-1) === PacketEncoder.HEADER_TO_HOST[0]\n ? -1\n : cache.length,\n );\n }\n cache = await this.readData(cache, 5);\n }\n\n const payloadExpectedSize = thePacketEncoder.getPayloadSize(cache);\n const n = thePacketEncoder.getHostHeaderLength(cache);\n const totalSize = n + payloadExpectedSize;\n\n cache = await this.readData(cache, totalSize);\n sliceIdx = totalSize;\n\n const cmdId = cache[2];\n const hasExtId = cmdId === 88 || cmdId === 86;\n const cmdExId = hasExtId ? cache[n] : undefined;\n\n const ack = cache[n + 1];\n\n if (hasExtId) {\n if (!thePacketEncoder.validateMessageCdc(cache))\n throw new Error(\"Invalid message CDC\");\n }\n\n let callbackInfo: IPacketCallback | undefined;\n let wantedCmdId: number | undefined;\n let wantedCmdExId: number | undefined;\n let tryIdx = 0;\n while ((callbackInfo = this.callbacksQueue[tryIdx++]) !== undefined) {\n wantedCmdId = callbackInfo?.wantedCommandId;\n wantedCmdExId = callbackInfo?.wantedCommandExId;\n\n if (\n (wantedCmdId !== undefined && wantedCmdId !== cmdId) ||\n (wantedCmdExId !== undefined && wantedCmdExId !== cmdExId)\n ) {\n continue;\n }\n break;\n }\n\n if (callbackInfo === undefined) {\n console.warn(\"Unexpected command\", cmdId, cmdExId, ack);\n continue;\n }\n\n const data = cache.slice(0, sliceIdx);\n const PackageType =\n thePacketEncoder.allPacketsTable[wantedCmdId + \" \" + wantedCmdExId];\n if (\n (wantedCmdId === undefined && wantedCmdExId === undefined) ||\n PackageType === undefined\n ) {\n callbackInfo.callback(\n data.buffer.slice(\n data.byteOffset,\n data.byteOffset + data.byteLength,\n ),\n );\n } else {\n if (!hasExtId || PackageType.isValidPacket(data, n)) {\n callbackInfo.callback(new PackageType(data));\n } else {\n console.warn(\"ack\", ack);\n\n callbackInfo.callback(ack!);\n }\n }\n\n clearTimeout(callbackInfo.timeout);\n\n this.callbacksQueue.splice(tryIdx - 1, 1);\n } catch (e) {\n if (!(e instanceof Error && e.message === \"No data\")) {\n console.warn(\"Read error.\", e, cache);\n }\n\n await this.close();\n break;\n } finally {\n cache = cache.slice(sliceIdx);\n }\n }\n\n query1(): ResultAsync<Query1ReplyD2HPacket, VexSerialError> {\n return new ResultAsync(\n (async () => {\n const result = await this.writeDataAsync(new Query1H2DPacket(), 100);\n return result instanceof Query1ReplyD2HPacket\n ? ok(result)\n : err(new VexProtocolError(\"query1 was not acknowledged\"));\n })(),\n );\n }\n\n getSystemVersion(): ResultAsync<VexFirmwareVersion, VexSerialError> {\n return new ResultAsync(\n (async () => {\n const result = await this.writeDataAsync(new SystemVersionH2DPacket());\n if (result instanceof SystemVersionReplyD2HPacket) {\n return ok(result.version);\n }\n return err(new VexProtocolError(\"system version was not acknowledged\"));\n })(),\n );\n }\n}\n\nexport class V5SerialConnection extends VexSerialConnection {\n filters: SerialPortFilter[] = [\n { usbVendorId: 10376, usbProductId: SerialDeviceType.V5_BRAIN },\n { usbVendorId: 10376, usbProductId: SerialDeviceType.V5_BRAIN_DFU },\n { usbVendorId: 10376, usbProductId: SerialDeviceType.V5_CONTROLLER },\n ];\n\n /**\n * Serialize every transfer that touches the device's file-transfer mode\n * through a single connection-level queue. Each call returns the prior\n * tail and chains after it, so transfers always execute in request\n * order without packet interleaving.\n */\n async withFileTransfer<T>(operation: () => Promise<T>): Promise<T> {\n const previous = this.fileTransferTail;\n let release = (): void => {};\n const current = new Promise<void>((resolve) => {\n release = resolve;\n });\n this.fileTransferTail = previous.then(() => current);\n this.fileTransferDepth++;\n try {\n await previous;\n return await operation();\n } finally {\n this.fileTransferDepth--;\n release();\n }\n }\n\n getDeviceStatus(): ResultAsync<\n GetDeviceStatusReplyD2HPacket,\n VexSerialError\n > {\n return new ResultAsync(\n (async () => {\n const result = await this.writeDataAsync(\n new GetDeviceStatusH2DPacket(),\n );\n return result instanceof GetDeviceStatusReplyD2HPacket\n ? ok(result)\n : err(new VexProtocolError(\"device status was not acknowledged\"));\n })(),\n );\n }\n\n getRadioStatus(): ResultAsync<GetRadioStatusReplyD2HPacket, VexSerialError> {\n return new ResultAsync(\n (async () => {\n const result = await this.writeDataAsync(new GetRadioStatusH2DPacket());\n return result instanceof GetRadioStatusReplyD2HPacket\n ? ok(result)\n : err(new VexProtocolError(\"radio status was not acknowledged\"));\n })(),\n );\n }\n\n getSystemFlags(): ResultAsync<GetSystemFlagsReplyD2HPacket, VexSerialError> {\n return new ResultAsync(\n (async () => {\n const result = await this.writeDataAsync(new GetSystemFlagsH2DPacket());\n return result instanceof GetSystemFlagsReplyD2HPacket\n ? ok(result)\n : err(new VexProtocolError(\"system flags were not acknowledged\"));\n })(),\n );\n }\n\n getSystemStatus(\n timeout = 1000,\n ): ResultAsync<GetSystemStatusReplyD2HPacket, VexSerialError> {\n return new ResultAsync(\n (async () => {\n const result = await this.writeDataAsync(\n new GetSystemStatusH2DPacket(),\n timeout,\n );\n return result instanceof GetSystemStatusReplyD2HPacket\n ? ok(result)\n : err(new VexProtocolError(\"system status was not acknowledged\"));\n })(),\n );\n }\n\n getMatchStatus(): ResultAsync<MatchStatusReplyD2HPacket, VexSerialError> {\n return new ResultAsync(\n (async () => {\n const result = await this.writeDataAsync(new GetMatchStatusH2DPacket());\n return result instanceof MatchStatusReplyD2HPacket\n ? ok(result)\n : err(new VexProtocolError(\"match status was not acknowledged\"));\n })(),\n );\n }\n\n /**\n * Upload an entire program (INI, optional cold binary, and the user\n * binary) under a single connection-level transaction so that no other\n * file-transfer request can interleave with the multi-file write.\n */\n uploadProgramToDevice(\n iniConfig: ProgramIniConfig,\n binFileBuf: Uint8Array,\n coldFileBuf: Uint8Array | undefined,\n progressCallback: (state: string, current: number, total: number) => void,\n ): ResultAsync<boolean, VexSerialError> {\n return wrapTransfer(this, () =>\n this._uploadProgramToDevice(\n iniConfig,\n binFileBuf,\n coldFileBuf,\n progressCallback,\n ),\n );\n }\n\n private async _uploadProgramToDevice(\n iniConfig: ProgramIniConfig,\n binFileBuf: Uint8Array,\n coldFileBuf: Uint8Array | undefined,\n progressCallback: (state: string, current: number, total: number) => void,\n ): Promise<Result<boolean, VexSerialError>> {\n const iniFileBuffer = new TextEncoder().encode(iniConfig.createIni());\n\n const basename = iniConfig.baseName;\n\n const iniRequest = {\n filename: basename + \".ini\",\n buf: iniFileBuffer,\n downloadTarget: FileDownloadTarget.FILE_TARGET_QSPI,\n vendor: FileVendor.USER,\n autoRun: false,\n };\n const r1 = await this.uploadFileToDeviceUnlocked(\n iniRequest,\n (current, total) => {\n progressCallback(\"INI\", current, total);\n },\n );\n if (r1.isErr()) return err(r1.error);\n if (!r1.value) return ok(false);\n\n const coldRequest =\n coldFileBuf !== undefined\n ? {\n filename: basename + \"_lib.bin\",\n buf: coldFileBuf,\n downloadTarget: FileDownloadTarget.FILE_TARGET_QSPI,\n vendor: FileVendor.DEV2, // PROS vendor id\n autoRun: false,\n }\n : undefined;\n if (coldRequest != null) {\n const r2 = await this.uploadFileToDeviceUnlocked(\n coldRequest,\n (current, total) => {\n progressCallback(\"COLD\", current, total);\n },\n );\n if (r2.isErr()) return err(r2.error);\n if (!r2.value) return ok(false);\n }\n\n const binRequest = {\n filename: basename + \".bin\",\n buf: binFileBuf,\n downloadTarget: FileDownloadTarget.FILE_TARGET_QSPI,\n vendor: FileVendor.USER,\n loadAddress: coldFileBuf != null ? 0x07800000 : undefined,\n autoRun: iniConfig.autorun,\n linkedFile: coldRequest,\n };\n const r3 = await this.uploadFileToDeviceUnlocked(\n binRequest,\n (current, total) => {\n progressCallback(\"BIN\", current, total);\n },\n );\n\n return r3;\n }\n\n downloadFileToHost(\n request: IFileBasicInfo,\n downloadTarget = FileDownloadTarget.FILE_TARGET_QSPI,\n progressCallback?: (current: number, total: number) => void,\n ): ResultAsync<Uint8Array, VexSerialError> {\n return wrapTransfer(this, () =>\n this.downloadFileToHostUnlocked(\n request,\n downloadTarget,\n progressCallback,\n ),\n );\n }\n\n /**\n * Run a download without acquiring the connection-level transfer lock.\n * Intended for callers that already hold a transaction (such as\n * `captureScreen`) and need to issue the download within a larger\n * queued operation.\n */\n downloadFileToHostUnlocked(\n request: IFileBasicInfo,\n downloadTarget: FileDownloadTarget = FileDownloadTarget.FILE_TARGET_QSPI,\n progressCallback?: (current: number, total: number) => void,\n ): ResultAsync<Uint8Array, VexSerialError> {\n return new ResultAsync(\n this._downloadFileToHostUnlocked(\n request,\n downloadTarget,\n progressCallback,\n ),\n );\n }\n\n private async _downloadFileToHostUnlocked(\n request: IFileBasicInfo,\n downloadTarget: FileDownloadTarget,\n progressCallback?: (current: number, total: number) => void,\n ): Promise<Result<Uint8Array, VexSerialError>> {\n const { filename, vendor, loadAddress, size } = request;\n\n let nextAddress = loadAddress ?? USER_FLASH_USR_CODE_START;\n\n const p1 = await this.writeDataAsync(\n new InitFileTransferH2DPacket(\n FileInitAction.READ,\n downloadTarget,\n vendor,\n FileInitOption.NONE,\n new Uint8Array(),\n nextAddress,\n filename,\n \"\",\n ),\n );\n\n if (!(p1 instanceof InitFileTransferReplyD2HPacket)) {\n return err(new VexTransferError(\"InitFileTransferH2DPacket failed\"));\n }\n\n let transferFailed = true;\n let result: Result<Uint8Array, VexSerialError> = ok(new Uint8Array());\n try {\n const fileSize = size ?? p1.fileSize;\n const bufferChunkSize = getTransferChunkSize(p1.windowSize);\n let bufferOffset = 0;\n const fileBuf = new Uint8Array(fileSize);\n\n while (bufferOffset < fileSize) {\n const requestedSize = Math.min(\n bufferChunkSize,\n fileSize - bufferOffset,\n );\n const p2 = await this.writeDataAsync(\n new ReadFileH2DPacket(nextAddress, requestedSize),\n 3000,\n );\n\n if (!(p2 instanceof ReadFileReplyD2HPacket)) {\n throw new VexTransferError(\"ReadFileReplyD2HPacket failed\");\n }\n if (p2.addr !== nextAddress) {\n throw new VexTransferError(\n `ReadFileReplyD2HPacket returned address ${p2.addr}, expected ${nextAddress}`,\n );\n }\n if (\n p2.length <= 0 ||\n p2.length > requestedSize ||\n p2.buf.byteLength !== p2.length\n ) {\n throw new VexTransferError(\n `ReadFileReplyD2HPacket returned invalid length ${p2.length}`,\n );\n }\n\n fileBuf.set(new Uint8Array(p2.buf), bufferOffset);\n bufferOffset += p2.length;\n nextAddress += p2.length;\n progressCallback?.(bufferOffset, fileSize);\n }\n\n transferFailed = false;\n result = ok(fileBuf);\n } catch (e) {\n result = err(\n e instanceof VexSerialError ? e : toVexSerialError(e, \"transfer\"),\n );\n } finally {\n // Always exit file-transfer mode even if reading or writing the\n // reply throws. If the original transfer also failed we keep its\n // error so callers see the underlying cause, not the cleanup\n // failure.\n try {\n await this.writeDataAsync(\n new ExitFileTransferH2DPacket(FileExitAction.EXIT_HALT),\n 30000,\n );\n } catch (cleanupError) {\n if (!transferFailed) {\n result = err(toVexSerialError(cleanupError, \"io\"));\n }\n }\n }\n return result;\n }\n\n uploadFileToDevice(\n request: IFileWriteRequest,\n progressCallback?: (current: number, total: number) => void,\n ): ResultAsync<boolean, VexSerialError> {\n return wrapTransfer(this, () =>\n this.uploadFileToDeviceUnlocked(request, progressCallback),\n );\n }\n\n async uploadFileToDeviceUnlocked(\n request: IFileWriteRequest,\n progressCallback?: (current: number, total: number) => void,\n ): Promise<Result<boolean, VexSerialError>> {\n let {\n filename,\n buf,\n downloadTarget,\n vendor,\n loadAddress,\n exttype,\n autoRun,\n linkedFile,\n } = request;\n\n if (buf === undefined) {\n return err(new VexTransferError(\"no buffer provided for upload\"));\n }\n\n downloadTarget = downloadTarget ?? FileDownloadTarget.FILE_TARGET_QSPI;\n vendor = vendor ?? FileVendor.USER;\n\n let nextAddress = loadAddress ?? USER_FLASH_USR_CODE_START;\n\n const p1 = await this.writeDataAsync(\n new InitFileTransferH2DPacket(\n FileInitAction.WRITE,\n downloadTarget,\n vendor,\n FileInitOption.OVERWRITE,\n buf,\n nextAddress,\n filename,\n exttype,\n ),\n );\n\n if (!(p1 instanceof InitFileTransferReplyD2HPacket)) {\n return err(new VexTransferError(\"InitFileTransferH2DPacket failed\"));\n }\n\n const bufferChunkSize = getTransferChunkSize(p1.windowSize);\n let bufferOffset = 0;\n\n let lastBlock = false;\n\n let transferFailed = true;\n let exitReply: HostBoundPacket | ArrayBuffer | AckType | undefined;\n let result: Result<boolean, VexSerialError> = ok(false);\n\n try {\n if (linkedFile !== undefined) {\n const p3 = await this.writeDataAsync(\n new LinkFileH2DPacket(\n linkedFile.vendor ?? FileVendor.USER,\n linkedFile.filename,\n 0,\n ),\n 10000,\n );\n\n if (!(p3 instanceof LinkFileReplyD2HPacket)) {\n throw new VexTransferError(\"LinkFileH2DPacket failed\");\n }\n }\n\n while (!lastBlock) {\n let tmpbuf;\n if (buf.byteLength - bufferOffset > bufferChunkSize) {\n tmpbuf = buf.subarray(bufferOffset, bufferOffset + bufferChunkSize);\n } else {\n // last chunk\n // word align length\n const length = ((buf.byteLength - bufferOffset + 3) / 4) >>> 0;\n tmpbuf = new Uint8Array(length * 4);\n tmpbuf.set(buf.subarray(bufferOffset, buf.byteLength));\n lastBlock = true;\n }\n\n const p2 = await this.writeDataAsync(\n new WriteFileH2DPacket(nextAddress, tmpbuf),\n 3000,\n );\n\n if (!(p2 instanceof WriteFileReplyD2HPacket))\n throw new VexTransferError(\"WriteFileReplyD2DPacket failed\");\n\n if (progressCallback != null)\n progressCallback(bufferOffset, buf.byteLength);\n\n // next chunk\n bufferOffset += bufferChunkSize;\n nextAddress += bufferChunkSize;\n }\n\n progressCallback?.(buf.byteLength, buf.byteLength);\n transferFailed = false;\n } catch (e) {\n result = err(\n e instanceof VexSerialError ? e : toVexSerialError(e, \"transfer\"),\n );\n } finally {\n // Always exit file-transfer mode even if writing or cleanup throws.\n // If the original transfer failed, keep its error so callers see\n // the root cause rather than the cleanup failure.\n try {\n exitReply = await this.writeDataAsync(\n new ExitFileTransferH2DPacket(\n transferFailed\n ? FileExitAction.EXIT_HALT\n : autoRun\n ? FileExitAction.EXIT_RUN\n : FileExitAction.EXIT_HALT,\n ),\n 30000,\n );\n if (!transferFailed) {\n result = ok(\n exitReply !== undefined &&\n exitReply instanceof ExitFileTransferReplyD2HPacket,\n );\n }\n } catch (cleanupError) {\n if (!transferFailed) {\n result = err(toVexSerialError(cleanupError, \"io\"));\n }\n }\n }\n return result;\n }\n\n /**\n * Erase a single file under a single transfer-mode session, exiting\n * file-transfer mode in a `finally` block regardless of how the\n * operation completes.\n */\n removeFile(\n request: IFileBasicInfo | string,\n ): ResultAsync<void, VexSerialError> {\n return new ResultAsync(\n this.withFileTransfer(async () => {\n let vendor: FileVendor, filename: string;\n if (typeof request === \"string\") {\n vendor = FileVendor.USER;\n filename = request;\n } else {\n vendor = request.vendor;\n filename = request.filename;\n }\n\n let result: Result<void, VexSerialError>;\n try {\n const ack = await this.writeDataAsync(\n new EraseFileH2DPacket(vendor, filename),\n );\n result =\n ack instanceof EraseFileReplyD2HPacket\n ? ok(undefined)\n : err(new VexProtocolError(\"removeFile was not acknowledged\"));\n } catch (e) {\n result = err(toVexSerialError(e, \"io\"));\n } finally {\n try {\n await this.writeDataAsync(\n new ExitFileTransferH2DPacket(FileExitAction.EXIT_HALT),\n );\n } catch {\n // Preserve the original error.\n }\n }\n return result;\n }),\n );\n }\n\n /**\n * Erase every file in the user vendor namespace under a single\n * transfer-mode session.\n */\n removeAllFiles(): ResultAsync<void, VexSerialError> {\n return new ResultAsync(\n this.withFileTransfer(async () => {\n let result: Result<void, VexSerialError>;\n try {\n const ack = await this.writeDataAsync(\n new FileClearUpH2DPacket(FileVendor.USER),\n 30000,\n );\n result =\n ack instanceof FileClearUpReplyD2HPacket\n ? ok(undefined)\n : err(\n new VexProtocolError(\"removeAllFiles was not acknowledged\"),\n );\n } catch (e) {\n result = err(toVexSerialError(e, \"io\"));\n } finally {\n try {\n await this.writeDataAsync(\n new ExitFileTransferH2DPacket(FileExitAction.EXIT_HALT),\n );\n } catch {\n // Preserve the original error.\n }\n }\n return result;\n }),\n );\n }\n\n /**\n * Issue the screen-capture command and validate that the device\n * acknowledged it. Callers must inspect the returned packet (or the\n * error result on NACK) before downloading the framebuffer so that a\n * rejected request performs no download.\n */\n captureScreenSetup(): ResultAsync<\n ScreenCaptureReplyD2HPacket,\n VexSerialError\n > {\n return new ResultAsync(\n (async () => {\n const result = await this.writeDataAsync(new ScreenCaptureH2DPacket(0));\n return result instanceof ScreenCaptureReplyD2HPacket\n ? ok(result)\n : err(new VexProtocolError(\"screen capture was rejected\"));\n })(),\n );\n }\n\n captureScreen(\n progressCallback?: (current: number, total: number) => void,\n ): ResultAsync<Uint8Array, VexSerialError> {\n return wrapTransfer(this, () => this._captureScreen(progressCallback));\n }\n\n private async _captureScreen(\n progressCallback?: (current: number, total: number) => void,\n ): Promise<Result<Uint8Array, VexSerialError>> {\n const response = await this.captureScreenSetup();\n if (response.isErr()) {\n return err(response.error);\n }\n\n const framebuffer = await this.downloadFileToHostUnlocked(\n {\n filename: \"screen\",\n vendor: FileVendor.SYS,\n loadAddress: 0,\n size:\n SCREEN_CAPTURE_MESSAGE_WIDTH *\n SCREEN_CAPTURE_HEIGHT *\n SCREEN_CAPTURE_MESSAGE_CHANNELS,\n },\n FileDownloadTarget.FILE_TARGET_CBUF,\n progressCallback,\n );\n if (framebuffer.isErr()) return err(framebuffer.error);\n\n return ok(convertScreenCapture(framebuffer.value));\n }\n\n setMatchMode(\n mode: MatchMode,\n ): ResultAsync<MatchModeReplyD2HPacket, VexSerialError> {\n return new ResultAsync(\n (async () => {\n const result = await this.writeDataAsync(\n new UpdateMatchModeH2DPacket(mode, 0),\n );\n return result instanceof MatchModeReplyD2HPacket\n ? ok(result)\n : err(new VexProtocolError(\"setMatchMode was not acknowledged\"));\n })(),\n );\n }\n\n runProgram(\n value: SlotNumber | string,\n ): ResultAsync<LoadFileActionReplyD2HPacket, VexSerialError> {\n return this.loadProgram(value);\n }\n\n loadProgram(\n value: SlotNumber | string,\n ): ResultAsync<LoadFileActionReplyD2HPacket, VexSerialError> {\n return new ResultAsync(\n (async () => {\n const result = await this.writeDataAsync(\n new LoadFileActionH2DPacket(\n FileVendor.USER,\n FileLoadAction.RUN,\n value,\n ),\n );\n return result instanceof LoadFileActionReplyD2HPacket\n ? ok(result)\n : err(new VexProtocolError(\"loadProgram was not acknowledged\"));\n })(),\n );\n }\n\n stopProgram(): ResultAsync<LoadFileActionReplyD2HPacket, VexSerialError> {\n return new ResultAsync(\n (async () => {\n const result = await this.writeDataAsync(\n new LoadFileActionH2DPacket(FileVendor.USER, FileLoadAction.STOP, \"\"),\n );\n return result instanceof LoadFileActionReplyD2HPacket\n ? ok(result)\n : err(new VexProtocolError(\"stopProgram was not acknowledged\"));\n })(),\n );\n }\n\n mockTouch(\n x: number,\n y: number,\n press: boolean,\n ): ResultAsync<SendDashTouchReplyD2HPacket, VexSerialError> {\n return new ResultAsync(\n (async () => {\n const result = await this.writeDataAsync(\n new SendDashTouchH2DPacket(x, y, press),\n );\n return result instanceof SendDashTouchReplyD2HPacket\n ? ok(result)\n : err(new VexProtocolError(\"mockTouch was not acknowledged\"));\n })(),\n );\n }\n\n openScreen(\n screen: number | SelectDashScreen,\n port: number,\n ): ResultAsync<SelectDashReplyD2HPacket, VexSerialError> {\n return new ResultAsync(\n (async () => {\n const result = await this.writeDataAsync(\n new SelectDashH2DPacket(screen, port),\n );\n return result instanceof SelectDashReplyD2HPacket\n ? ok(result)\n : err(new VexProtocolError(\"openScreen was not acknowledged\"));\n })(),\n );\n }\n}\n\nfunction binaryArrayJoin(\n left: Uint8Array | ArrayBuffer | null,\n right: Uint8Array | ArrayBuffer | null,\n): Uint8Array {\n const leftSize = left != null ? left.byteLength : 0;\n const rightSize = right != null ? right.byteLength : 0;\n const all = new Uint8Array(leftSize + rightSize);\n if (all.length === 0) return new Uint8Array();\n if (left != null) all.set(new Uint8Array(left), 0);\n if (right != null) all.set(new Uint8Array(right), leftSize);\n return all;\n}\n\nfunction getTransferChunkSize(windowSize: number): number {\n return windowSize > 0 && windowSize <= USER_PROG_CHUNK_SIZE\n ? windowSize\n : USER_PROG_CHUNK_SIZE;\n}\n\nfunction convertScreenCapture(framebuffer: Uint8Array): Uint8Array {\n const pixels = new Uint8Array(\n SCREEN_CAPTURE_WIDTH * SCREEN_CAPTURE_HEIGHT * SCREEN_CAPTURE_CHANNELS,\n );\n\n for (let row = 0; row < SCREEN_CAPTURE_HEIGHT; row++) {\n for (let column = 0; column < SCREEN_CAPTURE_WIDTH; column++) {\n const source =\n (row * SCREEN_CAPTURE_MESSAGE_WIDTH + column) *\n SCREEN_CAPTURE_MESSAGE_CHANNELS;\n const target =\n (row * SCREEN_CAPTURE_WIDTH + column) * SCREEN_CAPTURE_CHANNELS;\n\n pixels[target] = framebuffer[source + 2] ?? 0;\n pixels[target + 1] = framebuffer[source + 1] ?? 0;\n pixels[target + 2] = framebuffer[source] ?? 0;\n }\n }\n\n return pixels;\n}\n\n/**\n * Run an operation inside the per-connection transfer queue and lift its\n * `Promise<Result<T, VexSerialError>>` into a `ResultAsync`. Throwables\n * escaping `withFileTransfer` are coerced into a {@link VexSerialError}.\n */\nfunction wrapTransfer<T>(\n conn: V5SerialConnection,\n operation: () =>\n | Promise<Result<T, VexSerialError>>\n | ResultAsync<T, VexSerialError>,\n): ResultAsync<T, VexSerialError> {\n return new ResultAsync(\n conn.withFileTransfer<Result<T, VexSerialError>>(async () => {\n try {\n return (await operation()) as Result<T, VexSerialError>;\n } catch (e) {\n if (e instanceof VexSerialError) return err(e);\n return err(toVexSerialError(e, \"io\"));\n }\n }),\n );\n}\n\n// Eager async-rejection helper used by synchronous entry points.\nfunction errAsyncVex<E extends VexSerialError>(\n error: E,\n): ResultAsync<never, VexSerialError> {\n return new ResultAsync<never, VexSerialError>(Promise.resolve(err(error)));\n}\n",
|
|
16
|
+
"import {\n FileDownloadTarget,\n FileVendor,\n type IFileWriteRequest,\n USER_FLASH_USR_CODE_START,\n} from \"./Vex.js\";\nimport type { V5SerialDeviceState } from \"./VexDeviceState.js\";\nimport {\n VexDownloadError,\n VexFirmwareError,\n VexInvalidArgumentError,\n VexNotConnectedError,\n VexProtocolError,\n VexSerialError,\n toVexSerialError,\n} from \"./VexError.js\";\nimport { err, errAsync, ok, Result, ResultAsync } from \"neverthrow\";\nimport {\n FactoryEnableH2DPacket,\n FactoryEnableReplyD2HPacket,\n FactoryStatusH2DPacket,\n FactoryStatusReplyD2HPacket,\n} from \"./VexPacketModels.js\";\n\n/** Maximum number of bytes accepted when downloading the version catalog. */\nconst MAX_CATALOG_BYTES = 4 * 1024;\n/** Maximum compressed size accepted when downloading a VEXos archive. */\nconst MAX_VEXOS_BYTES = 64 * 1024 * 1024;\n/** Maximum size accepted for any single extracted firmware image. */\nconst MAX_FIRMWARE_IMAGE_BYTES = 32 * 1024 * 1024;\n/** Maximum total size accepted across all extracted firmware images. */\nconst MAX_AGGREGATE_IMAGE_BYTES = 48 * 1024 * 1024;\n\nexport interface DownloadFileFromInternetOptions {\n /** Maximum total bytes to read from the response body. */\n maxBytes?: number;\n /** Request timeout in milliseconds. */\n timeout?: number;\n}\n\n/**\n * Lift an async function that returns `Promise<Result<T, VexSerialError>>`\n * into a {@link ResultAsync}. Used by the public exports so they read as\n * synchronous Result-returning APIs while keeping the implementation in\n * plain async helpers.\n */\nfunction fromAsyncFn<T>(\n fn: () => Promise<Result<T, VexSerialError>>,\n): ResultAsync<T, VexSerialError> {\n return new ResultAsync(fn());\n}\n\n/**\n * Download a remote resource while enforcing a maximum body size. The\n * declared `Content-Length` header is validated up front, and the body\n * is streamed so an oversized payload is rejected before it is fully\n * read into memory. Failures are returned as a {@link VexDownloadError}\n * (or {@link VexInvalidArgumentError} for bad options) instead of\n * thrown.\n */\nexport function downloadFileFromInternet(\n link: string,\n options: DownloadFileFromInternetOptions = {},\n): ResultAsync<ArrayBuffer, VexSerialError> {\n const { maxBytes = Number.POSITIVE_INFINITY, timeout = 30000 } = options;\n if (maxBytes <= 0) {\n return errAsync(new VexInvalidArgumentError(\"maxBytes must be positive\"));\n }\n if (timeout < 0) {\n return errAsync(\n new VexInvalidArgumentError(\"timeout must be non-negative\"),\n );\n }\n return fromAsyncFn(() => runDownload(link, maxBytes, timeout));\n}\n\nasync function runDownload(\n link: string,\n maxBytes: number,\n timeout: number,\n): Promise<Result<ArrayBuffer, VexSerialError>> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeout);\n try {\n let response: Response;\n try {\n response = await fetch(link, { signal: controller.signal });\n } catch (e) {\n return err(\n new VexDownloadError(\n `failed to download ${link} (${e instanceof Error ? e.message : String(e)})`,\n ),\n );\n }\n if (!response.ok) {\n return err(\n new VexDownloadError(`failed to download ${link} (${response.status})`),\n );\n }\n\n const declaredLength = response.headers.get(\"content-length\");\n if (declaredLength !== null) {\n const declared = Number.parseInt(declaredLength, 10);\n if (!Number.isNaN(declared) && declared > 0 && declared > maxBytes) {\n return err(\n new VexDownloadError(\n `declared content length ${declared} exceeds limit ${maxBytes} for ${link}`,\n ),\n );\n }\n }\n\n if (response.body == null) {\n return err(new VexDownloadError(`no response body for ${link}`));\n }\n\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n for (;;) {\n const { value, done } = await reader.read();\n if (done) break;\n if (value === undefined) continue;\n total += value.byteLength;\n if (total > maxBytes) {\n try {\n await reader.cancel();\n } catch {\n // The reader may already be in a terminal state.\n }\n return err(\n new VexDownloadError(\n `downloaded body exceeds limit ${maxBytes} for ${link}`,\n ),\n );\n }\n chunks.push(value);\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // The reader may already be released by cancel().\n }\n }\n\n const result = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return ok(result.buffer);\n } finally {\n clearTimeout(timer);\n }\n}\n\n/**\n * Poll an async predicate until it returns true or the timeout elapses.\n * Argument errors are returned as {@link VexInvalidArgumentError}; a\n * throwing predicate surfaces its error through the {@link Result}\n * error channel.\n */\nexport function sleepUntilAsync(\n f: () => Promise<boolean>,\n timeout: number,\n interval = 20,\n): ResultAsync<boolean, VexSerialError> {\n if (timeout < 0) {\n return errAsync(\n new VexInvalidArgumentError(\"timeout must be non-negative\"),\n );\n }\n if (interval <= 0) {\n return errAsync(new VexInvalidArgumentError(\"interval must be positive\"));\n }\n return fromAsyncFn(() => runSleepUntilAsync(f, timeout, interval));\n}\n\nasync function runSleepUntilAsync(\n f: () => Promise<boolean>,\n timeout: number,\n interval: number,\n): Promise<Result<boolean, VexSerialError>> {\n const deadline = Date.now() + timeout;\n while (Date.now() <= deadline) {\n try {\n if (await f()) return ok(true);\n } catch (e) {\n return err(toVexSerialError(e, \"io\"));\n }\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await sleepInner(Math.min(interval, remaining));\n }\n return ok(false);\n}\n\n/**\n * Poll a synchronous predicate until it returns true or the timeout\n * elapses. The implementation uses a loop with `sleep` rather than\n * `setInterval` so the timer is cleared as soon as the predicate\n * resolves, and so predicate exceptions are surfaced without leaving a\n * pending interval behind.\n */\nexport function sleepUntil(\n f: () => boolean,\n timeout: number,\n interval = 20,\n): ResultAsync<boolean, VexSerialError> {\n if (timeout < 0) {\n return errAsync(\n new VexInvalidArgumentError(\"timeout must be non-negative\"),\n );\n }\n if (interval <= 0) {\n return errAsync(new VexInvalidArgumentError(\"interval must be positive\"));\n }\n return fromAsyncFn(() => runSleepUntil(f, timeout, interval));\n}\n\nasync function runSleepUntil(\n f: () => boolean,\n timeout: number,\n interval: number,\n): Promise<Result<boolean, VexSerialError>> {\n const deadline = Date.now() + timeout;\n while (Date.now() <= deadline) {\n try {\n if (f()) return ok(true);\n } catch (e) {\n return err(toVexSerialError(e, \"io\"));\n }\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await sleepInner(Math.min(interval, remaining));\n }\n return ok(false);\n}\n\n/**\n * Resolve after `ms` milliseconds. Returns a {@link VexInvalidArgumentError}\n * when `ms` is negative.\n */\nexport function sleep(ms: number): ResultAsync<void, VexSerialError> {\n if (ms < 0) {\n return errAsync(new VexInvalidArgumentError(\"ms must be non-negative\"));\n }\n return ResultAsync.fromSafePromise<void>(sleepInner(ms));\n}\n\nasync function sleepInner(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\ninterface FirmwareImage {\n name: string;\n buf: Uint8Array;\n}\n\n// Internal helper: stays throwing. The public `uploadFirmware` boundary\n// converts thrown errors into the {@link VexSerialError} hierarchy.\nasync function extractFirmwareImages(\n usingVersion: string,\n vexos: ArrayBuffer,\n): Promise<FirmwareImage[]> {\n const { unzip } = await import(\"unzipit\");\n const { entries } = await unzip(vexos);\n\n const expectedPaths = new Set([\n `${usingVersion}/BOOT.bin`,\n `${usingVersion}/assets.bin`,\n ]);\n const unexpected: string[] = [];\n for (const name of Object.keys(entries)) {\n if (!expectedPaths.has(name)) unexpected.push(name);\n }\n if (unexpected.length > 0) {\n throw new VexFirmwareError(\n `VEXos archive contains unexpected entries: ${unexpected.join(\", \")}`,\n );\n }\n\n const ordered: FirmwareImage[] = [];\n let aggregate = 0;\n for (const name of expectedPaths) {\n const entry = entries[name];\n if (entry === undefined) {\n throw new VexFirmwareError(`VEXos archive is missing ${name}`);\n }\n if (entry.encrypted) {\n throw new VexFirmwareError(`VEXos entry ${name} is encrypted`);\n }\n if (entry.size <= 0) {\n throw new VexFirmwareError(`VEXos entry ${name} is empty`);\n }\n if (entry.size > MAX_FIRMWARE_IMAGE_BYTES) {\n throw new VexFirmwareError(\n `VEXos entry ${name} (${entry.size} bytes) exceeds per-entry limit ${MAX_FIRMWARE_IMAGE_BYTES}`,\n );\n }\n aggregate += entry.size;\n if (aggregate > MAX_AGGREGATE_IMAGE_BYTES) {\n throw new VexFirmwareError(\n `VEXos aggregate extracted size exceeds limit ${MAX_AGGREGATE_IMAGE_BYTES}`,\n );\n }\n const buf = new Uint8Array(await entry.arrayBuffer());\n if (buf.byteLength === 0) {\n throw new VexFirmwareError(`VEXos entry ${name} is empty`);\n }\n if (buf.byteLength !== entry.size) {\n throw new VexFirmwareError(\n `VEXos entry ${name} size does not match its metadata (${buf.byteLength} vs ${entry.size})`,\n );\n }\n ordered.push({ name, buf });\n }\n\n return ordered;\n}\n\n/**\n * Upload a VEXos firmware archive to a connected brain. Network and\n * archive validation failures are returned as {@link VexSerialError}\n * values rather than thrown; a device that refuses a step or a missing\n * connection surfaces as {@link VexProtocolError} / {@link VexNotConnectedError}.\n */\nexport function uploadFirmware(\n state: V5SerialDeviceState,\n publicUrl = \"https://content.vexrobotics.com/vexos/public/V5/\",\n usingVersion?: string,\n progressCallback?: (state: string, current: number, total: number) => void,\n): ResultAsync<boolean, VexSerialError> {\n return fromAsyncFn(() =>\n runUploadFirmware(state, publicUrl, usingVersion, progressCallback),\n );\n}\n\nasync function runUploadFirmware(\n state: V5SerialDeviceState,\n publicUrl: string,\n usingVersion: string | undefined,\n progressCallback?: (state: string, current: number, total: number) => void,\n): Promise<Result<boolean, VexSerialError>> {\n const device = state._instance;\n const conn = device.connection;\n if (conn == null || !conn.isConnected) {\n return err(new VexNotConnectedError());\n }\n\n const pcb = progressCallback ?? (() => {});\n let version = usingVersion;\n\n if (version === undefined) {\n pcb(\"FETCH CATALOG\", 0, 1);\n const catalog = await downloadFileFromInternet(publicUrl + \"catalog.txt\", {\n maxBytes: MAX_CATALOG_BYTES,\n });\n if (catalog.isErr()) return err(catalog.error);\n version = new TextDecoder().decode(catalog.value).trim();\n pcb(\"FETCH CATALOG\", 1, 1);\n }\n\n if (!/^[A-Za-z0-9._-]+$/.test(version)) {\n return err(new VexFirmwareError(`invalid VEXos version: ${version}`));\n }\n\n pcb(\"FETCH VEXOS\", 0, 1);\n const vexosResult = await downloadFileFromInternet(\n publicUrl + version + \".vexos\",\n { maxBytes: MAX_VEXOS_BYTES },\n );\n if (vexosResult.isErr()) return err(vexosResult.error);\n const vexos = vexosResult.value;\n if (vexos.byteLength === 0) {\n return err(new VexFirmwareError(\"VEXos archive is empty\"));\n }\n pcb(\"FETCH VEXOS\", 1, 1);\n pcb(\"UNZIP VEXOS\", 0, 1);\n\n let images: FirmwareImage[];\n try {\n images = await extractFirmwareImages(version, vexos);\n } catch (e) {\n if (e instanceof VexSerialError) return err(e);\n return err(toVexSerialError(e, \"firmware\"));\n }\n pcb(\"UNZIP VEXOS\", 1, 1);\n\n return state.withFileTransfer(async () => {\n pcb(\"FACTORY ENB BOOT\", 0, 0);\n\n const result = await conn.writeDataAsync(new FactoryEnableH2DPacket());\n if (!(result instanceof FactoryEnableReplyD2HPacket)) {\n return err(new VexProtocolError(\"FactoryEnableH2DPacket failed\"));\n }\n\n const boot = images.find((image) => image.name.endsWith(\"BOOT.bin\"));\n if (boot === undefined) {\n return err(new VexFirmwareError(\"VEXos archive is missing BOOT.bin\"));\n }\n const assertImage = images.find((image) =>\n image.name.endsWith(\"assets.bin\"),\n );\n if (assertImage === undefined) {\n return err(new VexFirmwareError(\"VEXos archive is missing assets.bin\"));\n }\n\n const bootWriteRequest: IFileWriteRequest = {\n filename: \"null.bin\",\n vendor: FileVendor.USER,\n loadAddress: USER_FLASH_USR_CODE_START,\n buf: boot.buf,\n downloadTarget: FileDownloadTarget.FILE_TARGET_B1,\n exttype: \"bin\",\n autoRun: true, // need to set EXIT_RUN\n linkedFile: undefined,\n };\n\n const bootUpload = await conn.uploadFileToDevice(\n bootWriteRequest,\n (c, t) => {\n pcb(\"UPLOAD BOOT\", c, t);\n },\n );\n if (bootUpload.isErr()) return err(bootUpload.error);\n if (!bootUpload.value) return ok(false);\n\n const bootDeadline = Date.now() + 120000;\n let bootComplete = false;\n while (Date.now() < bootDeadline) {\n const result3 = await conn.writeDataAsync(\n new FactoryStatusH2DPacket(),\n 10000,\n );\n if (result3 instanceof FactoryStatusReplyD2HPacket) {\n switch (result3.status) {\n case 2:\n pcb(\"ERASE BOOT\", result3.percent, 100);\n break;\n case 3:\n pcb(\"WRITE BOOT\", result3.percent, 100);\n break;\n case 4:\n pcb(\"VERIFY BOOT\", result3.percent, 100);\n break;\n case 8:\n pcb(\"FINISHING BOOT\", result3.percent, 100);\n break;\n }\n if (result3.status === 0 && result3.percent === 100) {\n bootComplete = true;\n break;\n }\n } else {\n return ok(false);\n }\n await sleepInner(500);\n }\n if (!bootComplete) return ok(false);\n\n pcb(\"FACTORY ENB ASSERT\", 0, 0);\n\n const result5 = await conn.writeDataAsync(new FactoryEnableH2DPacket());\n if (!(result5 instanceof FactoryEnableReplyD2HPacket)) {\n return err(new VexProtocolError(\"FactoryEnableH2DPacket failed\"));\n }\n\n const assertWriteRequest: IFileWriteRequest = {\n filename: \"null.bin\",\n vendor: FileVendor.USER,\n loadAddress: USER_FLASH_USR_CODE_START,\n buf: assertImage.buf,\n downloadTarget: FileDownloadTarget.FILE_TARGET_A1,\n exttype: \"bin\",\n autoRun: true, // need to set EXIT_RUN\n linkedFile: undefined,\n };\n\n const assertUpload = await conn.uploadFileToDevice(\n assertWriteRequest,\n (c, t) => {\n pcb(\"UPLOAD ASSERT\", c, t);\n },\n );\n if (assertUpload.isErr()) return err(assertUpload.error);\n if (!assertUpload.value) return ok(false);\n\n const assertDeadline = Date.now() + 120000;\n let assertComplete = false;\n while (Date.now() < assertDeadline) {\n const result7 = await conn.writeDataAsync(\n new FactoryStatusH2DPacket(),\n 10000,\n );\n if (result7 instanceof FactoryStatusReplyD2HPacket) {\n switch (result7.status) {\n case 2:\n pcb(\"ERASE ASSERT\", result7.percent, 100);\n break;\n case 3:\n pcb(\"WRITE ASSERT\", result7.percent, 100);\n break;\n case 4:\n pcb(\"VERIFY ASSERT\", result7.percent, 100);\n break;\n case 8:\n pcb(\"FINISHING ASSERT\", result7.percent, 100);\n break;\n }\n\n if (result7.status === 0 && result7.percent === 100) {\n assertComplete = true;\n break;\n }\n } else {\n return ok(false);\n }\n await sleepInner(500);\n }\n if (!assertComplete) return ok(false);\n return ok(true);\n });\n}\n",
|
|
17
|
+
"import {\n type IFileBasicInfo,\n type IFileHandle,\n FileVendor,\n type IProgramInfo,\n type IFileWriteRequest,\n FileDownloadTarget,\n RadioChannelType,\n} from \"./Vex.js\";\nimport { type ProgramIniConfig } from \"./VexIniConfig.js\";\nimport type { V5SerialDeviceState } from \"./VexDeviceState.js\";\nimport { sleep, sleepUntilAsync } from \"./VexFirmware.js\";\nimport {\n VexNotConnectedError,\n VexProtocolError,\n VexSerialError,\n} from \"./VexError.js\";\nimport { err, ok, Result, ResultAsync } from \"neverthrow\";\nimport {\n GetDirectoryEntryH2DPacket,\n GetDirectoryEntryReplyD2HPacket,\n GetDirectoryFileCountH2DPacket,\n GetDirectoryFileCountReplyD2HPacket,\n GetProgramSlotInfoH2DPacket,\n GetProgramSlotInfoReplyD2HPacket,\n ReadKeyValueH2DPacket,\n ReadKeyValueReplyD2HPacket,\n WriteKeyValueH2DPacket,\n WriteKeyValueReplyD2HPacket,\n} from \"./VexPacketModels.js\";\n\nexport function getValue(\n state: V5SerialDeviceState,\n key: string,\n): ResultAsync<string | undefined, VexSerialError> {\n return new ResultAsync(\n (async () => {\n const conn = state._instance.connection;\n if (conn == null || !conn.isConnected) {\n return err(new VexNotConnectedError());\n }\n const result = await conn.writeDataAsync(new ReadKeyValueH2DPacket(key));\n return result instanceof ReadKeyValueReplyD2HPacket\n ? ok(result.value)\n : err(new VexProtocolError(\"getValue was not acknowledged\"));\n })(),\n );\n}\n\nexport function setValue(\n state: V5SerialDeviceState,\n key: string,\n value: string,\n): ResultAsync<void, VexSerialError> {\n return new ResultAsync(\n (async () => {\n const conn = state._instance.connection;\n if (conn == null || !conn.isConnected) {\n return err(new VexNotConnectedError());\n }\n const result = await conn.writeDataAsync(\n new WriteKeyValueH2DPacket(key, value),\n );\n return result instanceof WriteKeyValueReplyD2HPacket\n ? ok(undefined)\n : err(new VexProtocolError(\"setValue was not acknowledged\"));\n })(),\n );\n}\n\nexport function listFiles(\n state: V5SerialDeviceState,\n vendor = FileVendor.USER,\n): ResultAsync<IFileHandle[], VexSerialError> {\n return new ResultAsync(\n (async () => {\n const conn = state._instance.connection;\n if (conn == null || !conn.isConnected) {\n return err(new VexNotConnectedError());\n }\n const result = await conn.writeDataAsync(\n new GetDirectoryFileCountH2DPacket(vendor),\n );\n if (!(result instanceof GetDirectoryFileCountReplyD2HPacket)) {\n return err(\n new VexProtocolError(\"directory file count was not acknowledged\"),\n );\n }\n\n const files: IFileHandle[] = [];\n for (let i = 0; i < result.count; i++) {\n const result2 = await conn.writeDataAsync(\n new GetDirectoryEntryH2DPacket(i),\n );\n if (!(result2 instanceof GetDirectoryEntryReplyD2HPacket)) {\n return err(\n new VexProtocolError(\"directory entry was not acknowledged\"),\n );\n }\n\n // .file is undefined if the file is not found\n // .file is a file entry but not a file handle\n if (result2.file != null) {\n files.push({\n filename: result2.file.filename,\n vendor,\n loadAddress: result2.file.loadAddress,\n\n size: result2.file.size,\n crc32: result2.file.crc32,\n\n type: result2.file.type,\n timestamp: result2.file.timestamp,\n version: result2.file.version,\n });\n }\n }\n\n return ok(files);\n })(),\n );\n}\n\nexport function listProgram(\n state: V5SerialDeviceState,\n): ResultAsync<IProgramInfo[], VexSerialError> {\n return new ResultAsync(\n (async () => {\n const conn = state._instance.connection;\n if (conn == null || !conn.isConnected) {\n return err(new VexNotConnectedError());\n }\n\n const files = await listFiles(state, FileVendor.USER);\n if (files.isErr()) return err(files.error);\n\n const programList: IProgramInfo[] = [];\n const iniFiles = files.value.filter((file) =>\n file.filename.endsWith(\".ini\"),\n );\n\n for (let i = 0; i < iniFiles.length; i++) {\n const ini = iniFiles[i]!;\n if (ini.size === 0) continue;\n\n const programName = /(.+?)(\\.[^.]*$|$)/.exec(ini.filename)?.[1] ?? \"\";\n const bin = files.value.find(\n (file) => file.filename === programName + \".bin\",\n );\n if (bin == null || bin.timestamp === 0 || bin.size === 0) continue;\n\n const n = new Date();\n n.setTime(1000 * bin.timestamp);\n const program: IProgramInfo = {\n name: programName,\n binfile: bin.filename,\n size: ini.size + bin.size,\n slot: -1,\n time: n,\n requestedSlot: -1,\n };\n\n const result2 = await conn.writeDataAsync(\n new GetProgramSlotInfoH2DPacket(FileVendor.USER, program.binfile),\n );\n if (result2 instanceof GetProgramSlotInfoReplyD2HPacket) {\n program.slot = result2.slot;\n program.requestedSlot = result2.requestedSlot;\n }\n programList.push(program);\n }\n return ok(programList);\n })(),\n );\n}\n\nexport function readFile(\n state: V5SerialDeviceState,\n request: IFileBasicInfo | string,\n downloadTarget = FileDownloadTarget.FILE_TARGET_QSPI,\n progressCallback?: (current: number, total: number) => void,\n): ResultAsync<Uint8Array, VexSerialError> {\n return new ResultAsync(\n (async () => {\n const conn = state._instance.connection;\n if (conn == null || !conn.isConnected) {\n return err(new VexNotConnectedError());\n }\n\n let handle: IFileBasicInfo;\n\n // If request is a string, then it is a filename\n if (typeof request === \"string\") {\n handle = { filename: request, vendor: FileVendor.USER };\n } else {\n handle = request;\n }\n\n return state.withFileTransfer(() =>\n conn.downloadFileToHost(handle, downloadTarget, progressCallback),\n );\n })(),\n );\n}\n\nexport function removeFile(\n state: V5SerialDeviceState,\n request: IFileBasicInfo | string,\n): ResultAsync<void, VexSerialError> {\n return new ResultAsync(\n (async () => {\n const conn = state._instance.connection;\n if (conn == null || !conn.isConnected) {\n return err(new VexNotConnectedError());\n }\n\n return state.withFileTransfer(() => conn.removeFile(request));\n })(),\n );\n}\n\nexport function removeAllFiles(\n state: V5SerialDeviceState,\n): ResultAsync<void, VexSerialError> {\n return new ResultAsync(\n (async () => {\n const conn = state._instance.connection;\n if (conn == null || !conn.isConnected) {\n return err(new VexNotConnectedError());\n }\n\n return state.withFileTransfer(() => conn.removeAllFiles());\n })(),\n );\n}\n\nexport function uploadProgram(\n state: V5SerialDeviceState,\n iniConfig: ProgramIniConfig,\n binFileBuf: Uint8Array,\n coldFileBuf: Uint8Array | undefined,\n progressCallback: (state: string, current: number, total: number) => void,\n): ResultAsync<boolean, VexSerialError> {\n return new ResultAsync(\n runUploadProgram(\n state,\n iniConfig,\n binFileBuf,\n coldFileBuf,\n progressCallback,\n ),\n );\n}\n\nasync function runUploadProgram(\n state: V5SerialDeviceState,\n iniConfig: ProgramIniConfig,\n binFileBuf: Uint8Array,\n coldFileBuf: Uint8Array | undefined,\n progressCallback: (state: string, current: number, total: number) => void,\n): Promise<Result<boolean, VexSerialError>> {\n const device = state._instance;\n const conn = device.connection;\n if (conn == null || !conn.isConnected) {\n return err(new VexNotConnectedError());\n }\n\n let switchedToDownload = false;\n\n return state.withFileTransfer(async () => {\n try {\n if (device.isV5Controller) {\n await sleep(250);\n\n // V5 Controller doesn't appear to be connected to a V5 Brain\n const refreshed = await device.refresh();\n if (refreshed.isErr() || !refreshed.value) {\n return err(new VexProtocolError(\"device is unavailable\"));\n }\n\n progressCallback(\"CHANNEL\", 0, 1);\n\n const p1 = await device.radio.changeChannel(RadioChannelType.DOWNLOAD);\n if (p1.isErr()) return err(p1.error);\n switchedToDownload = true;\n\n await sleep(250);\n const transferred = await sleepUntilAsync(\n async () => (await conn?.getSystemStatus(150))?.isOk() ?? false,\n 10000,\n 200,\n );\n if (transferred.isErr()) return err(transferred.error);\n if (!transferred.value) {\n return err(new VexProtocolError(\"channel switch timed out\"));\n }\n\n progressCallback(\"CHANNEL\", 1, 1);\n }\n\n const p2 = await conn.uploadProgramToDevice(\n iniConfig,\n binFileBuf,\n coldFileBuf,\n progressCallback,\n );\n if (p2.isErr()) return err(p2.error);\n if (!p2.value)\n return err(new VexProtocolError(\"program upload rejected\"));\n\n if (device.isV5Controller) {\n // Disconnected\n if (!device.brain.isAvailable) {\n return err(new VexProtocolError(\"brain unavailable after upload\"));\n }\n\n progressCallback(\"CHANNEL\", 0, 1);\n\n const p3 = await device.radio.changeChannel(RadioChannelType.PIT);\n if (p3.isErr()) return err(p3.error);\n switchedToDownload = false;\n\n await sleep(250);\n const transferred = await sleepUntilAsync(\n async () => (await conn?.getSystemStatus(150))?.isOk() ?? false,\n 10000,\n 200,\n );\n if (transferred.isErr()) return err(transferred.error);\n if (!transferred.value) {\n return err(new VexProtocolError(\"channel switch timed out\"));\n }\n\n progressCallback(\"CHANNEL\", 1, 1);\n }\n\n return ok(true);\n } finally {\n if (switchedToDownload) {\n await device.radio.changeChannel(RadioChannelType.PIT);\n }\n }\n });\n}\n\nexport function writeFile(\n state: V5SerialDeviceState,\n request: IFileWriteRequest,\n progressCallback?: (current: number, total: number) => void,\n): ResultAsync<boolean, VexSerialError> {\n return new ResultAsync(\n (async () => {\n const conn = state._instance.connection;\n if (conn == null || !conn.isConnected) {\n return err(new VexNotConnectedError());\n }\n return state.withFileTransfer(() =>\n conn.uploadFileToDevice(request, progressCallback),\n );\n })(),\n );\n}\n\n/**\n * @param progressCallback Informs the progress of the download.\n * @returns array of bytes where each pixel is represented by 3 consecutive bytes (rgb).\n * This array's length is 272 width * 480 height * 3 channels = 391680 bytes.\n */\nexport function captureScreen(\n state: V5SerialDeviceState,\n progressCallback?: (current: number, total: number) => void,\n): ResultAsync<Uint8Array, VexSerialError> {\n // pros implementation: https://github.com/purduesigbots/pros-cli/blob/5ee18656faeb48f51d680bab4b53d5b59cc5a7d5/pros/serial/devices/vex/v5_device.py#L578\n\n return new ResultAsync(\n (async () => {\n const conn = state._instance.connection;\n if (conn == null || !conn.isConnected) {\n return err(new VexNotConnectedError());\n }\n\n return state.withFileTransfer(() => conn.captureScreen(progressCallback));\n })(),\n );\n}\n",
|
|
18
|
+
"import {\n type MatchMode,\n SerialDeviceType,\n type SlotNumber,\n type ISmartDeviceInfo,\n SmartDeviceType,\n FileVendor,\n type IProgramInfo,\n type IFileHandle,\n type IFileBasicInfo,\n type IFileWriteRequest,\n FileDownloadTarget,\n RadioChannelType,\n} from \"./Vex.js\";\nimport { type V5SerialConnection } from \"./VexConnection.js\";\nimport { VexEventTarget } from \"./VexEvent.js\";\nimport { VexFirmwareVersion } from \"./VexFirmwareVersion.js\";\nimport { type ProgramIniConfig } from \"./VexIniConfig.js\";\nimport {\n VexNotConnectedError,\n VexProtocolError,\n VexSerialError,\n} from \"./VexError.js\";\nimport { err, ok, ResultAsync } from \"neverthrow\";\nimport {\n FileControlH2DPacket,\n FileControlReplyD2HPacket,\n} from \"./VexPacketModels.js\";\nimport type { V5SerialDevice } from \"./VexDevice.js\";\nimport * as firmware from \"./VexFirmware.js\";\nimport * as transfers from \"./VexTransfers.js\";\n\nexport abstract class VexSerialDevice extends VexEventTarget {\n connection: V5SerialConnection | undefined;\n defaultSerial: Serial;\n\n get isConnected(): boolean {\n return this.connection != null ? this.connection.isConnected : false;\n }\n\n get deviceType(): SerialDeviceType | undefined {\n return this.isConnected\n ? this.connection?.port?.getInfo().usbProductId\n : undefined;\n }\n\n constructor(defaultSerial: Serial) {\n super();\n this.defaultSerial = defaultSerial;\n }\n\n abstract connect(\n conn?: V5SerialConnection,\n ): ResultAsync<void, VexSerialError>;\n\n abstract disconnect(): Promise<void>;\n}\n\nexport class V5SerialDeviceState {\n _instance: V5SerialDevice;\n /**\n * Counter used only to pause automatic refresh while a file transfer\n * is in flight. This is not a mutex: serialisation of transfer\n * operations lives on the {@link V5SerialConnection} transaction\n * queue. The counter is exposed via {@link isFileTransferring} so the\n * refresh loop can skip work during transfers.\n */\n private refreshPauseDepth = 0;\n\n get isFileTransferring(): boolean {\n return this.refreshPauseDepth > 0;\n }\n\n /**\n * Increment the refresh-pause depth, run the operation, and decrement\n * the depth again. The actual transfer mutex lives on the connection,\n * so this method does not serialise anything; it only signals the\n * device that a transfer is in progress so refresh polling is paused.\n */\n async withFileTransfer<T>(operation: () => PromiseLike<T>): Promise<T> {\n this.refreshPauseDepth++;\n try {\n return await operation();\n } finally {\n this.refreshPauseDepth--;\n }\n }\n\n brain = {\n activeProgram: 0,\n battery: {\n batteryPercent: 0,\n isCharging: false,\n },\n button: {\n isPressed: false,\n isDoublePressed: false,\n },\n cpu0Version: VexFirmwareVersion.allZero(),\n cpu1Version: VexFirmwareVersion.allZero(),\n isAvailable: false,\n settings: {\n isScreenReversed: false,\n isWhiteTheme: false,\n usingLanguage: 0,\n },\n systemVersion: VexFirmwareVersion.allZero(),\n uniqueId: 0,\n };\n\n controllers = [\n {\n battery: 0,\n isAvailable: false,\n isCharging: false,\n },\n {\n battery: 0,\n isAvailable: false,\n },\n ];\n\n devices: Array<ISmartDeviceInfo | undefined> = [];\n isFieldControllerConnected = false;\n matchMode: MatchMode = \"disabled\";\n radio = {\n channel: 0,\n isAvailable: false,\n isConnected: false,\n isVexNet: false,\n isRadioData: false,\n latency: 0,\n signalQuality: 0,\n signalStrength: 0,\n };\n\n constructor(instance: V5SerialDevice) {\n this._instance = instance;\n }\n}\n\nexport class V5Brain {\n private readonly state: V5SerialDeviceState;\n\n constructor(state: V5SerialDeviceState) {\n this.state = state;\n }\n\n get isRunningProgram(): boolean {\n return this.activeProgram !== 0;\n }\n\n get activeProgram(): number {\n return this.state.brain.activeProgram;\n }\n\n /**\n * @deprecated Setting this property dispatches a fire-and-forget\n * request that cannot be awaited. Use {@link setActiveProgram}\n * instead, which returns a {@link ResultAsync} that resolves to an\n * error result when the device refuses or is disconnected.\n */\n set activeProgram(value) {\n void this.setActiveProgram(value as SlotNumber | 0).mapErr(() => {\n // Preserve the legacy fire-and-forget contract; callers who\n // need rejection handling should migrate to setActiveProgram().\n });\n }\n\n /**\n * Load a program slot on the brain, or stop the currently running\n * program when called with `0`. Resolves to an error result when the\n * device refuses, the request times out, or no connection is open.\n */\n setActiveProgram(value: SlotNumber | 0): ResultAsync<void, VexSerialError> {\n return new ResultAsync(\n (async () => {\n if (this.state.brain.activeProgram === value) return ok(undefined);\n\n const conn = this.state._instance.connection;\n if (conn == null) return err(new VexNotConnectedError());\n\n const result =\n value === 0\n ? await conn.stopProgram()\n : await conn.loadProgram(value);\n if (result.isErr()) return err(result.error);\n\n this.state.brain.activeProgram = value;\n return ok(undefined);\n })(),\n );\n }\n\n /**\n * Request that the brain start running the program in the given slot.\n * Resolves to an error result when the device refuses, the request\n * times out, or no connection is open.\n */\n runProgram(slot: SlotNumber | string): ResultAsync<void, VexSerialError> {\n return new ResultAsync(\n (async () => {\n const conn = this.state._instance.connection;\n if (conn == null) return err(new VexNotConnectedError());\n\n const reply = await conn.runProgram(slot);\n if (reply.isErr()) return err(reply.error);\n\n const slotNumber =\n typeof slot === \"string\" ? Number.parseInt(slot, 10) : slot;\n if (Number.isFinite(slotNumber))\n this.state.brain.activeProgram = slotNumber;\n return ok(undefined);\n })(),\n );\n }\n\n /**\n * Request that the brain stop the currently running program. Resolves\n * to an error result when the device refuses, the request times out,\n * or no connection is open.\n */\n stopProgram(): ResultAsync<void, VexSerialError> {\n return new ResultAsync(\n (async () => {\n const conn = this.state._instance.connection;\n if (conn == null) return err(new VexNotConnectedError());\n\n const reply = await conn.stopProgram();\n if (reply.isErr()) return err(reply.error);\n\n this.state.brain.activeProgram = 0;\n return ok(undefined);\n })(),\n );\n }\n\n get battery(): V5Battery {\n return new V5Battery(this.state);\n }\n\n get button(): V5BrainButton {\n return new V5BrainButton(this.state);\n }\n\n get cpu0Version(): VexFirmwareVersion {\n return this.state.brain.cpu0Version;\n }\n\n get cpu1Version(): VexFirmwareVersion {\n return this.state.brain.cpu1Version;\n }\n\n get isAvailable(): boolean {\n return this.state.brain.isAvailable;\n }\n\n get settings(): V5BrainSettings {\n return new V5BrainSettings(this.state);\n }\n\n get systemVersion(): VexFirmwareVersion {\n return this.state.brain.systemVersion;\n }\n\n get uniqueId(): number {\n return this.state.brain.uniqueId;\n }\n\n getValue(key: string): ResultAsync<string | undefined, VexSerialError> {\n return transfers.getValue(this.state, key);\n }\n\n setValue(key: string, value: string): ResultAsync<void, VexSerialError> {\n return transfers.setValue(this.state, key, value);\n }\n\n listFiles(\n vendor = FileVendor.USER,\n ): ResultAsync<IFileHandle[], VexSerialError> {\n return transfers.listFiles(this.state, vendor);\n }\n\n listProgram(): ResultAsync<IProgramInfo[], VexSerialError> {\n return transfers.listProgram(this.state);\n }\n\n readFile(\n request: IFileBasicInfo | string,\n downloadTarget = FileDownloadTarget.FILE_TARGET_QSPI,\n progressCallback?: (current: number, total: number) => void,\n ): ResultAsync<Uint8Array, VexSerialError> {\n return transfers.readFile(\n this.state,\n request,\n downloadTarget,\n progressCallback,\n );\n }\n\n removeFile(\n request: IFileBasicInfo | string,\n ): ResultAsync<void, VexSerialError> {\n return transfers.removeFile(this.state, request);\n }\n\n removeAllFiles(): ResultAsync<void, VexSerialError> {\n return transfers.removeAllFiles(this.state);\n }\n\n uploadFirmware(\n publicUrl = \"https://content.vexrobotics.com/vexos/public/V5/\",\n usingVersion?: string,\n progressCallback?: (state: string, current: number, total: number) => void,\n ): ResultAsync<boolean, VexSerialError> {\n return firmware.uploadFirmware(\n this.state,\n publicUrl,\n usingVersion,\n progressCallback,\n );\n }\n\n uploadProgram(\n iniConfig: ProgramIniConfig,\n binFileBuf: Uint8Array,\n coldFileBuf: Uint8Array | undefined,\n progressCallback: (state: string, current: number, total: number) => void,\n ): ResultAsync<boolean, VexSerialError> {\n return transfers.uploadProgram(\n this.state,\n iniConfig,\n binFileBuf,\n coldFileBuf,\n progressCallback,\n );\n }\n\n writeFile(\n request: IFileWriteRequest,\n progressCallback?: (current: number, total: number) => void,\n ): ResultAsync<boolean, VexSerialError> {\n return transfers.writeFile(this.state, request, progressCallback);\n }\n\n /**\n *\n * @param progressCallback Informs the progress of the download.\n * @returns array of bytes where each pixel is represented by 3 consecutive bytes (rgb).\n * This array's length is 272 width * 480 height * 3 channels = 391680 bytes.\n */\n captureScreen(\n progressCallback?: (current: number, total: number) => void,\n ): ResultAsync<Uint8Array, VexSerialError> {\n return transfers.captureScreen(this.state, progressCallback);\n }\n}\n\nexport class V5Battery {\n private readonly state: V5SerialDeviceState;\n\n constructor(state: V5SerialDeviceState) {\n this.state = state;\n }\n\n get batteryPercent(): number {\n return this.state.brain.battery.batteryPercent;\n }\n\n get isCharging(): boolean {\n return this.state.brain.battery.isCharging;\n }\n}\n\nexport class V5BrainButton {\n private readonly state: V5SerialDeviceState;\n\n constructor(state: V5SerialDeviceState) {\n this.state = state;\n }\n\n get isPressed(): boolean {\n return this.state.brain.button.isPressed;\n }\n\n get isDoublePressed(): boolean {\n return this.state.brain.button.isDoublePressed;\n }\n}\n\nexport class V5BrainSettings {\n private readonly state: V5SerialDeviceState;\n\n constructor(state: V5SerialDeviceState) {\n this.state = state;\n }\n\n get isScreenReversed(): boolean {\n return this.state.brain.settings.isScreenReversed;\n }\n\n get isWhiteTheme(): boolean {\n return this.state.brain.settings.isWhiteTheme;\n }\n\n get usingLanguage(): number {\n return this.state.brain.settings.usingLanguage;\n }\n}\n\nexport class V5Controller {\n private readonly state: V5SerialDeviceState;\n private readonly controllerIndex: number;\n\n constructor(state: V5SerialDeviceState, controllerIndex: number) {\n this.state = state;\n this.controllerIndex = controllerIndex;\n }\n\n get batteryPercent(): number {\n return this.state.controllers[this.controllerIndex]!.battery;\n }\n\n get isMasterController(): boolean {\n return this.controllerIndex === 0;\n }\n\n get isAvailable(): boolean {\n return this.state.controllers[this.controllerIndex]!.isAvailable;\n }\n\n get isCharging(): boolean | undefined {\n return this.state.controllers[this.controllerIndex]!.isCharging;\n }\n}\n\nexport class V5SmartDevice {\n private readonly state: V5SerialDeviceState;\n private readonly deviceIndex: number;\n\n constructor(state: V5SerialDeviceState, index: number) {\n this.state = state;\n this.deviceIndex = index;\n }\n\n protected getDeviceInfo(): ISmartDeviceInfo | undefined {\n return this.state.devices[this.deviceIndex];\n }\n\n get isAvailable(): boolean {\n return this.getDeviceInfo() !== undefined;\n }\n\n get port(): number {\n return this.deviceIndex;\n }\n\n get type(): SmartDeviceType {\n return this.getDeviceInfo()?.type ?? SmartDeviceType.EMPTY;\n }\n\n get version(): number {\n return this.getDeviceInfo()?.version ?? 0;\n }\n}\n\nexport class V5Radio {\n private readonly state: V5SerialDeviceState;\n\n constructor(state: V5SerialDeviceState) {\n this.state = state;\n }\n\n get channel(): number {\n return this.state.radio.channel;\n }\n\n get isAvailable(): boolean {\n return this.state.radio.isAvailable;\n }\n\n get isConnected(): boolean {\n return this.state.radio.isConnected;\n }\n\n get isVexNet(): boolean {\n return this.state.radio.isVexNet;\n }\n\n get isRadioData(): boolean {\n return this.state.radio.isRadioData;\n }\n\n get latency(): number {\n return this.state.radio.latency;\n }\n\n changeChannel(channel: RadioChannelType): ResultAsync<void, VexSerialError> {\n return new ResultAsync(\n (async () => {\n const result = await this.state._instance.connection?.writeDataAsync(\n new FileControlH2DPacket(1, channel),\n );\n return result instanceof FileControlReplyD2HPacket\n ? ok(undefined)\n : err(new VexProtocolError(\"changeChannel was not acknowledged\"));\n })(),\n );\n }\n}\n",
|
|
19
|
+
"import {\n type ISmartDeviceInfo,\n type MatchMode,\n SerialDeviceType,\n} from \"./Vex.js\";\nimport { V5SerialConnection } from \"./VexConnection.js\";\nimport {\n V5Brain,\n V5Controller,\n V5Radio,\n V5SerialDeviceState,\n V5SmartDevice,\n VexSerialDevice,\n} from \"./VexDeviceState.js\";\nimport { sleepUntil, sleepUntilAsync } from \"./VexFirmware.js\";\nimport {\n VexInvalidArgumentError,\n VexIoError,\n VexNotConnectedError,\n VexSerialError,\n toVexSerialError,\n} from \"./VexError.js\";\nimport { err, ok, Result, ResultAsync } from \"neverthrow\";\nimport {\n GetDeviceStatusReplyD2HPacket,\n GetRadioStatusReplyD2HPacket,\n GetSystemFlagsReplyD2HPacket,\n GetSystemStatusReplyD2HPacket,\n} from \"./VexPacket.js\";\n\n// Re-exports for backward compatibility with the previous VexDevice module.\nexport {\n VexSerialDevice,\n V5Brain,\n V5Battery,\n V5BrainButton,\n V5BrainSettings,\n V5Controller,\n V5SmartDevice,\n V5Radio,\n V5SerialDeviceState,\n} from \"./VexDeviceState.js\";\nexport {\n sleep,\n sleepUntil,\n sleepUntilAsync,\n downloadFileFromInternet,\n uploadFirmware,\n} from \"./VexFirmware.js\";\n\nexport class V5SerialDevice extends VexSerialDevice {\n autoReconnect = true;\n autoRefresh = true;\n pauseRefreshOnFileTransfer = true;\n\n protected _isReconnecting = false;\n private _isDisconnecting = false;\n private _refreshInterval: ReturnType<typeof setInterval> | undefined;\n state: V5SerialDeviceState = new V5SerialDeviceState(this);\n private _disposed = false;\n private _refreshGeneration = 0;\n\n constructor(defaultSerial: Serial) {\n super(defaultSerial);\n\n let isLastRefreshComplete: boolean = true;\n this._refreshInterval = setInterval(() => {\n if (this._disposed) return;\n if (this.autoRefresh && isLastRefreshComplete) {\n if (!this.isConnected) {\n this.state.brain.isAvailable = false;\n return;\n }\n\n if (\n !this.pauseRefreshOnFileTransfer ||\n !this.state.isFileTransferring\n ) {\n isLastRefreshComplete = false;\n void (async () => {\n try {\n const r = await this.refresh();\n if (r.isErr()) this.emit(\"error\", r.error);\n } catch (error: unknown) {\n this.emit(\"error\", error);\n } finally {\n isLastRefreshComplete = true;\n }\n })();\n }\n }\n }, 200);\n }\n\n get isV5Controller(): boolean {\n return this.deviceType === SerialDeviceType.V5_CONTROLLER;\n }\n\n get brain(): V5Brain {\n return new V5Brain(this.state);\n }\n\n get controllers(): [V5Controller, V5Controller] {\n return [new V5Controller(this.state, 0), new V5Controller(this.state, 1)];\n }\n\n get devices(): V5SmartDevice[] {\n const rtn = [];\n for (let i = 1; i <= this.state.devices.length; i++) {\n if (this.state.devices[i] != null)\n rtn.push(new V5SmartDevice(this.state, i));\n }\n return rtn;\n }\n\n get isFieldControllerConnected(): boolean {\n return this.state.isFieldControllerConnected;\n }\n\n get matchMode(): MatchMode {\n return this.state.matchMode;\n }\n\n /**\n * @deprecated Setting this property dispatches a fire-and-forget\n * request whose result cannot be observed. Use {@link setMatchMode}\n * instead, which returns a {@link ResultAsync} that resolves to an\n * error result when the device refuses or is disconnected.\n */\n set matchMode(value) {\n void this.setMatchMode(value).mapErr(() => {\n // Preserve the legacy fire-and-forget contract: callers who\n // need rejection handling should migrate to setMatchMode().\n });\n }\n\n /**\n * Update the match mode and resolve only after the device\n * acknowledges the command. Resolves to an error result when the\n * device NACKs, the request times out, or no connection is open.\n */\n setMatchMode(mode: MatchMode): ResultAsync<void, VexSerialError> {\n return new ResultAsync(\n (async () => {\n const reply = await this.connection?.setMatchMode(mode);\n if (reply === undefined) return err(new VexNotConnectedError());\n if (reply.isErr()) return err(reply.error);\n this.state.matchMode = mode;\n return ok(undefined);\n })(),\n );\n }\n\n get radio(): V5Radio {\n return new V5Radio(this.state);\n }\n\n mockTouch(\n x: number,\n y: number,\n press: boolean,\n ): ResultAsync<void, VexSerialError> {\n return new ResultAsync(\n (async () => {\n const reply = await this.connection?.mockTouch(x, y, press);\n if (reply === undefined) return err(new VexNotConnectedError());\n if (reply.isErr()) return err(reply.error);\n return ok(undefined);\n })(),\n );\n }\n\n connect(conn?: V5SerialConnection): ResultAsync<void, VexSerialError> {\n return new ResultAsync(this._connect(conn));\n }\n\n private async _connect(\n conn?: V5SerialConnection,\n ): Promise<Result<void, VexSerialError>> {\n if (this.isConnected) return ok(undefined);\n\n if (conn != null) {\n if (!conn.isConnected) {\n const opened = await conn.open();\n if (opened.isErr() || opened.value !== true) {\n return err(new VexIoError(\"failed to open the supplied connection\"));\n }\n }\n const q = await conn.query1();\n if (q.isErr()) {\n await conn.close();\n return err(q.error);\n }\n this.connection = conn;\n } else {\n let tryIdx = 0;\n while (true) {\n const c = new V5SerialConnection(this.defaultSerial);\n\n const result = await c.open(tryIdx++, true);\n if (result.isErr()) {\n await c.close();\n return err(result.error);\n }\n if (result.value === undefined) {\n return err(new VexNotConnectedError(\"no V5 device was found\"));\n }\n if (!result.value) {\n // The port was already in use elsewhere; try the next index.\n await c.close();\n continue;\n }\n\n const q = await c.query1();\n if (q.isErr()) {\n // no response\n await c.close();\n continue;\n }\n\n this.connection = c;\n break;\n }\n }\n\n if (!this.isConnected) return err(new VexNotConnectedError());\n\n await this.doAfterConnect();\n\n return ok(undefined);\n }\n\n async disconnect(): Promise<void> {\n this._isDisconnecting = true;\n const connection = this.connection;\n this.connection = undefined;\n try {\n await connection?.close();\n } finally {\n this._isDisconnecting = false;\n }\n }\n\n async dispose(): Promise<void> {\n this.autoReconnect = false;\n this.autoRefresh = false;\n this._disposed = true;\n if (this._refreshInterval !== undefined) {\n clearInterval(this._refreshInterval);\n this._refreshInterval = undefined;\n }\n await this.disconnect();\n }\n\n /**\n * @param timeout defaults to 0. If timeout is 0, then it will attempt to reconnect forever.\n */\n reconnect(timeout: number = 0): ResultAsync<void, VexSerialError> {\n return new ResultAsync(this._reconnect(timeout));\n }\n\n private async _reconnect(\n timeout: number,\n ): Promise<Result<void, VexSerialError>> {\n if (this.isConnected) return ok(undefined);\n if (timeout < 0) {\n return err(new VexInvalidArgumentError(\"timeout must be non-negative\"));\n }\n\n const endTime = Date.now() + timeout;\n\n if (this._isReconnecting) {\n if (timeout === 0) {\n await this.waitForReconnectToFinish();\n } else {\n const waited = await sleepUntil(() => !this._isReconnecting, timeout);\n if (waited.isErr() || !waited.value) {\n return err(new VexNotConnectedError());\n }\n }\n\n if (this.isConnected) return ok(undefined);\n }\n\n this._isReconnecting = true;\n try {\n while (timeout === 0 || Date.now() < endTime) {\n let tryIdx = 0;\n while (true) {\n const c = new V5SerialConnection(this.defaultSerial);\n\n const result = await c.open(tryIdx++, false);\n\n if (result.isErr()) {\n await c.close();\n return err(result.error);\n }\n if (result.value === undefined) break; // no port left\n if (!result.value) {\n // has been opened\n await c.close();\n continue;\n }\n\n const status = await c.getSystemStatus(200);\n if (status.isErr()) {\n // no response\n await c.close();\n continue;\n }\n\n if (\n this.brain.uniqueId !== 0 &&\n status.value.uniqueId !== this.brain.uniqueId\n ) {\n // uuid not match\n await c.close();\n continue;\n }\n\n this.connection = c;\n break;\n }\n\n if (this.isConnected) break;\n\n // try again every second or when the number of ports is different\n const getPortCount = async (): Promise<number> =>\n (await this.defaultSerial.getPorts()).length;\n const portsCount = await getPortCount();\n await sleepUntilAsync(\n async () => (await getPortCount()) !== portsCount,\n 1000,\n );\n }\n } catch (e) {\n return err(toVexSerialError(e));\n } finally {\n this._isReconnecting = false;\n }\n\n if (!this.isConnected) return err(new VexNotConnectedError());\n\n await this.doAfterConnect();\n\n return ok(undefined);\n }\n\n private async waitForReconnectToFinish(): Promise<void> {\n while (this._isReconnecting) {\n const r = await sleepUntil(() => !this._isReconnecting, 1000);\n if (r.isOk() && r.value) return;\n }\n }\n\n private async doAfterConnect(): Promise<void> {\n if (this.connection == null) return;\n\n this.connection.on(\"disconnected\", (_data) => {\n if (this.autoReconnect && !this._isDisconnecting) {\n void this.reconnect().mapErr((e) => this.emit(\"error\", e));\n }\n });\n\n await this.refresh();\n }\n\n /**\n * Refresh the high-level device snapshot. All required replies are\n * collected before any public state is mutated, so callers never see\n * a half-updated view. A failed or missing reply resolves to an `Ok`\n * of `false` (the previous snapshot is preserved and only the\n * `isAvailable` flag is updated) so transient communication loss does\n * not surface as a hard error result.\n */\n refresh(): ResultAsync<boolean, VexSerialError> {\n return new ResultAsync(this._refresh());\n }\n\n private async _refresh(): Promise<Result<boolean, VexSerialError>> {\n if (this._disposed) return ok(false);\n\n const generation = ++this._refreshGeneration;\n const conn = this.connection;\n if (conn == null || !conn.isConnected) {\n this._applySnapshotIfCurrent(generation, { isAvailable: false });\n return ok(false);\n }\n\n const ssPacket = await conn.getSystemStatus();\n if (generation !== this._refreshGeneration || this._disposed)\n return ok(false);\n if (ssPacket.isErr()) {\n this._applySnapshotIfCurrent(generation, { isAvailable: false });\n return ok(false);\n }\n\n const sfPacket = await conn.getSystemFlags();\n if (generation !== this._refreshGeneration || this._disposed)\n return ok(false);\n if (sfPacket.isErr()) {\n this._applySnapshotIfCurrent(generation, { isAvailable: false });\n return ok(false);\n }\n\n const rdPacket = await conn.getRadioStatus();\n if (generation !== this._refreshGeneration || this._disposed)\n return ok(false);\n if (rdPacket.isErr()) {\n this._applySnapshotIfCurrent(generation, { isAvailable: false });\n return ok(false);\n }\n\n const dsPacket = await conn.getDeviceStatus();\n if (generation !== this._refreshGeneration || this._disposed)\n return ok(false);\n if (dsPacket.isErr()) {\n this._applySnapshotIfCurrent(generation, { isAvailable: false });\n return ok(false);\n }\n\n const snapshot = this._buildSnapshot(\n ssPacket.value,\n sfPacket.value,\n rdPacket.value,\n dsPacket.value,\n );\n return ok(this._applySnapshotIfCurrent(generation, snapshot));\n }\n\n private _buildSnapshot(\n ssPacket: GetSystemStatusReplyD2HPacket,\n sfPacket: GetSystemFlagsReplyD2HPacket,\n rdPacket: GetRadioStatusReplyD2HPacket,\n dsPacket: GetDeviceStatusReplyD2HPacket,\n ): V5SerialDeviceSnapshot {\n const flags2 = ssPacket.sysflags[2]!;\n const matchMode: MatchMode =\n (flags2 & 0b00100000) !== 0\n ? \"disabled\"\n : (flags2 & 0b01000000) !== 0\n ? \"autonomous\"\n : \"driver\";\n const isFieldControllerConnected = (flags2 & 0b00010000) !== 0;\n\n const flags4 = ssPacket.sysflags[4]!;\n const usingLanguage = (flags4 & 0b11110000) >> 4;\n const isWhiteTheme = (flags4 & 0b00000100) !== 0;\n const isScreenReversed = (flags4 & 0b00000001) === 0;\n\n const flags5 = sfPacket.flags;\n const hasFlag = (bit: number): boolean =>\n (flags5 & (2 ** (32 - bit))) !== 0;\n const isRadioData = hasFlag(12);\n const isDoublePressed = hasFlag(14);\n const isCharging = hasFlag(15);\n const isPressed = hasFlag(17);\n const isVexNet = hasFlag(18);\n const controller1Available = hasFlag(19);\n const radioConnected = hasFlag(22);\n const radioAvailable = hasFlag(23);\n const batteryPercent = sfPacket.battery ?? 0;\n const controller0Available =\n radioConnected || sfPacket.controllerBatteryPercent !== undefined;\n const controller0Battery = sfPacket.controllerBatteryPercent ?? 0;\n const controller1Battery = sfPacket.partnerControllerBatteryPercent ?? 0;\n const activeProgram = sfPacket.currentProgram;\n const isAvailable = !this.isV5Controller || radioConnected;\n\n const devices = dsPacket.devices.map((d) => ({ ...d }));\n\n return {\n isAvailable: true,\n matchMode,\n isFieldControllerConnected,\n brain: {\n ...this.state.brain,\n activeProgram,\n battery: { batteryPercent, isCharging },\n button: { isPressed, isDoublePressed },\n cpu0Version: ssPacket.cpu0Version,\n cpu1Version: ssPacket.cpu1Version,\n isAvailable,\n settings: { isScreenReversed, isWhiteTheme, usingLanguage },\n systemVersion: ssPacket.systemVersion,\n uniqueId: ssPacket.uniqueId,\n },\n controllers: [\n {\n battery: controller0Battery,\n isAvailable: controller0Available,\n isCharging: (flags2 & 0b10000000) !== 0,\n },\n {\n battery: controller1Battery,\n isAvailable: controller1Available,\n },\n ],\n radio: {\n channel: rdPacket.channel,\n latency: rdPacket.timeslot,\n signalQuality: rdPacket.quality,\n signalStrength: rdPacket.strength,\n isRadioData,\n isVexNet,\n isConnected: radioConnected,\n isAvailable: radioAvailable,\n },\n devices,\n };\n }\n\n private _applySnapshotIfCurrent(\n generation: number,\n snapshot: V5SerialDeviceSnapshot | { isAvailable: false },\n ): boolean {\n if (this._disposed) return false;\n if (generation !== this._refreshGeneration) return false;\n\n if (snapshot.isAvailable === false) {\n this.state.brain.isAvailable = false;\n return false;\n }\n\n this.state.matchMode = snapshot.matchMode;\n this.state.isFieldControllerConnected = snapshot.isFieldControllerConnected;\n Object.assign(this.state.brain, snapshot.brain);\n Object.assign(this.state.controllers[0]!, snapshot.controllers[0]);\n Object.assign(this.state.controllers[1]!, snapshot.controllers[1]);\n Object.assign(this.state.radio, snapshot.radio);\n\n const next: Array<ISmartDeviceInfo | undefined> = [];\n for (const device of snapshot.devices) {\n if (device != null) next[device.port] = device;\n }\n this.state.devices = next;\n return true;\n }\n}\n\ninterface V5SerialDeviceSnapshot {\n isAvailable: true;\n matchMode: MatchMode;\n isFieldControllerConnected: boolean;\n brain: V5SerialDeviceState[\"brain\"];\n controllers: V5SerialDeviceState[\"controllers\"];\n radio: V5SerialDeviceState[\"radio\"];\n devices: ISmartDeviceInfo[];\n}\n",
|
|
20
|
+
"// hey this code seemed really goofy to me, so I changed it,\n// see https://github.com/LemLib/v5-serial-protocol/blob/ef8df5019a5504b5b96fc887ef1587d9ecaa84ea/src/VexIniConfig.ts\n// for unchanged code\n// -@meisZWFLZ\n\nimport { type ZerobaseSlotNumber } from \"./Vex.js\";\nclass BaseIniBuilder {\n protected str = \"\";\n protected addLine(line: string): void {\n this.str += line + \"\\n\";\n }\n\n public addComment(comment: string): this {\n this.addLine(\"; \" + comment);\n return this;\n }\n\n public getContent(): string {\n return this.str;\n }\n}\n\nclass IniSectionBuilder<\n O extends Record<number | string, string | number>,\n> extends BaseIniBuilder {\n constructor(\n public readonly name: string,\n private readonly object: O,\n private readonly keyTransform: (k: keyof O) => string = (k) => k.toString(),\n ) {\n super();\n }\n\n private addSingleObjProperty(key: keyof O, maxValueLength?: number): void {\n // if property is empty or nullish, skip it\n if (this.object[key] == null || this.object[key].toString().length === 0)\n return;\n\n const formattedKey = this.keyTransform(key).padEnd(12).slice(0, 12);\n const trimmedVal = this.object[key].toString().slice(0, maxValueLength);\n const escapedVal = trimmedVal.replace(\n /[\"\\\\\\u0000-\\u001f\\u007f]/g,\n (character) =>\n `\\\\x${character.charCodeAt(0).toString(16).padStart(2, \"0\")}`,\n );\n\n this.addLine(`${formattedKey} = \"${escapedVal}\"`);\n }\n\n public addObjProperty(\n key: keyof O | Array<keyof O>,\n maxValueLength?: number,\n ): this {\n const keys = Array.isArray(key) ? key : [key];\n for (const k of keys) {\n this.addSingleObjProperty(k, maxValueLength);\n }\n return this;\n }\n\n public addAllObjProps(maxValueLength?: number): this {\n const keys = Object.keys(this.object);\n for (const k of keys) {\n this.addSingleObjProperty(k, maxValueLength);\n }\n return this;\n }\n}\nclass IniFileBuilder extends BaseIniBuilder {\n public addSection(\n section: IniSectionBuilder<Record<number | string, string | number>>,\n ): this {\n this.addLine(`[${section.name}]`);\n this.str += section.getContent();\n\n return this;\n }\n}\n\nexport class ProgramIniConfig {\n baseName = \"slot_1\";\n autorun = false;\n project = { version: \"1\", ide: \"Unknown\", file: \"none\" };\n program = {\n version: \"1\",\n name: \"program\",\n slot: 0 as ZerobaseSlotNumber,\n icon: \"default.bmp\",\n iconalt: \"\",\n description: \"\",\n date: \"\",\n timezone: \"0\",\n };\n\n config: Record<number, string> = {}; // { port_22: \"...\" }\n controller1: Record<string, string> = {};\n controller2: Record<string, string> = {};\n // private options: { [key: string]: string } = {};\n\n constructor() {\n this.config = {\n 22: \"adi\",\n };\n }\n\n setProgramDate(date: Date): void {\n const d = date;\n this.program.date = d.toISOString();\n const tzo = Math.abs(d.getTimezoneOffset());\n const tzh = (tzo / 60) >>> 0;\n const tzm = tzo - tzh * 60;\n this.program.timezone =\n (d.getTimezoneOffset() > 0 ? \"-\" : \"+\") +\n this.dec2(tzh) +\n \":\" +\n this.dec2(tzm);\n }\n\n createIni(): string {\n if (this.program.date.length === 0) {\n this.setProgramDate(new Date());\n }\n return new IniFileBuilder()\n .addComment(\"\")\n .addComment(\"VEX program ini file\")\n .addComment(\"Generated by Vex V5 Serial Protocol Library\")\n .addComment(\"\")\n .addSection(\n new IniSectionBuilder(\"project\", this.project).addObjProperty(\n \"ide\",\n 16,\n ),\n )\n .addComment(\"\")\n .addSection(\n new IniSectionBuilder(\"program\", this.program)\n .addObjProperty(\"name\", 32)\n .addObjProperty(\"description\", 256)\n .addObjProperty(\"icon\", 16)\n .addObjProperty(\"iconalt\", 16)\n .addObjProperty(\"slot\", 16),\n )\n .addComment(\"\")\n .addSection(\n new IniSectionBuilder(\n \"config\",\n this.config,\n (k) => \"port_\" + this.dec2(k),\n ).addAllObjProps(),\n )\n .addComment(\"\")\n .addSection(\n new IniSectionBuilder(\n \"controller_1\",\n this.controller1,\n ).addAllObjProps(),\n )\n .addComment(\"\")\n .addSection(\n new IniSectionBuilder(\n \"controller_2\",\n this.controller2,\n ).addAllObjProps(),\n )\n .getContent();\n }\n\n dec2(value: number): string {\n const str = (\"00\" + value.toString(10)).substr(-2, 2);\n return str.toUpperCase();\n }\n}\n"
|
|
21
|
+
],
|
|
22
|
+
"mappings": "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,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAChE;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAChE;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAChE;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAChE;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAChE;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAChE;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAChE;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAChE;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAChE;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAChE;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAChE;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAChE;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAChE;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;A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",
|
|
23
|
+
"debugId": "AEA86FF140C3172464756E2164756E21",
|
|
24
|
+
"names": []
|
|
25
|
+
}
|