@v5x/serial 0.5.4 → 0.5.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +73 -9
- package/dist/Vex.d.ts +4 -4
- package/dist/VexCRC.d.ts +0 -12
- package/dist/VexConnection.d.ts +106 -26
- package/dist/VexDevice.d.ts +52 -157
- package/{dts/VexDevice.d.ts → dist/VexDeviceState.d.ts} +79 -62
- package/dist/VexError.d.ts +50 -0
- package/dist/VexEvent.d.ts +15 -10
- package/dist/VexFirmware.d.ts +47 -0
- package/dist/VexFirmwareVersion.d.ts +4 -43
- package/dist/VexIniConfig.d.ts +1 -2
- package/dist/VexPacket.d.ts +3 -512
- package/dist/VexPacketBase.d.ts +24 -0
- package/dist/VexPacketEncoder.d.ts +36 -0
- package/{dts/VexPacket.d.ts → dist/VexPacketModels.d.ts} +3 -118
- package/dist/VexPacketView.d.ts +5 -3
- package/dist/VexTransfers.d.ts +20 -0
- package/dist/index.cjs +4175 -0
- package/dist/index.cjs.map +25 -0
- package/dist/index.d.ts +9 -9
- package/dist/index.js +4093 -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": ["../../../node_modules/.bun/neverthrow@8.2.0/node_modules/neverthrow/dist/index.cjs.js", "../src/Vex.ts", "../src/VexError.ts", "../src/VexEvent.ts", "../src/VexConnection.ts", "../src/VexPacketBase.ts", "../src/VexCRC.ts", "../src/VexFirmwareVersion.ts", "../src/VexPacketView.ts", "../src/VexPacketModels.ts", "../src/VexPacketEncoder.ts", "../src/VexDeviceState.ts", "../src/VexFirmware.ts", "../src/VexTransfers.ts", "../src/VexDevice.ts", "../src/VexIniConfig.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"'use strict';\n\nconst 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\nexports.Result = void 0;\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})(exports.Result || (exports.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 = exports.Result.fromThrowable;\r\n//#endregion\n\nexports.Err = Err;\nexports.Ok = Ok;\nexports.ResultAsync = ResultAsync;\nexports.err = err;\nexports.errAsync = errAsync;\nexports.fromAsyncThrowable = fromAsyncThrowable;\nexports.fromPromise = fromPromise;\nexports.fromSafePromise = fromSafePromise;\nexports.fromThrowable = fromThrowable;\nexports.ok = ok;\nexports.okAsync = okAsync;\nexports.safeTry = safeTry;\n",
|
|
6
|
+
"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",
|
|
7
|
+
"import { type AckType } from \"./Vex.js\";\n\n/**\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 readonly ackType: AckType | undefined = undefined;\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 readonly ackType: AckType | undefined;\n\n constructor(message: string, ackType?: AckType) {\n super(\"protocol\", message);\n this.name = \"VexProtocolError\";\n this.ackType = ackType;\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",
|
|
8
|
+
"type EventName = string | symbol;\ntype EventMapKey<TEvents> = Extract<keyof TEvents, EventName>;\ntype EventListener<TValue> = (data: TValue) => void;\n\nexport class VexEventEmitter<\n TEvents extends object = Record<EventName, unknown>,\n> {\n handlerMap: Map<EventName, Array<EventListener<unknown>>>;\n\n constructor() {\n this.handlerMap = new Map<EventName, Array<EventListener<unknown>>>();\n }\n\n on<K extends EventMapKey<TEvents>>(\n eventName: K,\n listener: EventListener<TEvents[K]>,\n ): void {\n let listeners = this.handlerMap.get(eventName);\n listeners ??= [];\n\n listeners.push(listener as EventListener<unknown>);\n\n this.handlerMap.set(eventName, listeners);\n }\n\n remove<K extends EventMapKey<TEvents>>(\n eventName: K,\n listener: EventListener<TEvents[K]>,\n ): void {\n let listeners = this.handlerMap.get(eventName);\n listeners ??= [];\n\n const index = listeners.indexOf(listener as EventListener<unknown>);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n\n this.handlerMap.set(eventName, listeners);\n }\n\n emit<K extends EventMapKey<TEvents>>(eventName: K, data: TEvents[K]): void {\n const errors: unknown[] = [];\n for (const callback of [...(this.handlerMap.get(eventName) ?? [])]) {\n try {\n callback(data);\n } catch (error: unknown) {\n errors.push(error);\n }\n }\n if (errors.length === 1) throw errors[0];\n if (errors.length > 1) {\n throw new AggregateError(\n errors,\n `listeners for ${String(eventName)} failed`,\n );\n }\n }\n\n clearListeners(): void {\n this.handlerMap.clear();\n }\n}\n\nexport class VexEventTarget<\n TEvents extends object = Record<EventName, unknown>,\n> {\n emitter: VexEventEmitter<TEvents>;\n\n constructor() {\n this.emitter = new VexEventEmitter<TEvents>();\n }\n\n emit<K extends EventMapKey<TEvents>>(eventName: K, data: TEvents[K]): void {\n this.emitter.emit(this.normalizeEventName(eventName), data);\n }\n\n on<K extends EventMapKey<TEvents>>(\n eventName: K,\n listener: EventListener<TEvents[K]>,\n ): void {\n this.emitter.on(this.normalizeEventName(eventName), listener);\n }\n\n remove<K extends EventMapKey<TEvents>>(\n eventName: K,\n listener: EventListener<TEvents[K]>,\n ): void {\n this.emitter.remove(this.normalizeEventName(eventName), listener);\n }\n\n clearListeners(): void {\n this.emitter.clearListeners();\n }\n\n private normalizeEventName<K extends EventMapKey<TEvents>>(eventName: K): K {\n return String(eventName) as K;\n }\n}\n",
|
|
9
|
+
"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\ntype HostBoundPacketType<T extends HostBoundPacket> = {\n new (data: ArrayBuffer | Uint8Array): T;\n name: string;\n};\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/** Outcome of {@link VexSerialConnection.open}. */\nexport type OpenResult = \"opened\" | \"busy\" | \"no-port\";\n\n/**\n * Payload of the `warning` event: a non-fatal condition the library\n * recovered from, surfaced so embedders can log or ignore it.\n */\nexport interface ConnectionWarning {\n message: string;\n details?: unknown;\n}\n\nexport interface VexSerialConnectionEvents {\n connected: undefined;\n disconnected: undefined;\n warning: ConnectionWarning;\n}\n\n/**\n * A connection to a V5 device.\n * Emit events: connected, disconnected, warning\n */\nexport class VexSerialConnection extends VexEventTarget<VexSerialConnectionEvents> {\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 protected reportWarning(message: string, details?: unknown): void {\n this.emit(\"warning\", { message, details } satisfies ConnectionWarning);\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 this.reportWarning(\"failed to close the serial port\", 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. Resolves `\"opened\"` when a connection is established,\n * `\"busy\"` when the matching port is already held elsewhere, and\n * `\"no-port\"` when no matching port was selected. The result is `Err`\n * when a connection is already open (programmer error) or when the\n * port fails to open (permissions, dead device, ...).\n */\n open(\n use: number = 0,\n askUser: boolean = true,\n ): ResultAsync<OpenResult, VexSerialError> {\n return new ResultAsync(this._open(use, askUser));\n }\n\n private async _open(\n use: number,\n askUser: boolean,\n ): Promise<Result<OpenResult, VexSerialError>> {\n // Serialize behind an in-flight close so its teardown tail cannot\n // partially dismantle the connection opened here.\n if (this._closePromise !== null) await this._closePromise;\n\n if (this.port !== undefined) {\n return err(new VexIoError(\"Already connected.\"));\n }\n\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 let port: SerialPort | undefined = ports[use];\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(\"no-port\");\n\n if (port.readable != null) return ok(\"busy\");\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(\"opened\");\n } catch (e) {\n await this.close();\n return err(toVexSerialError(e, \"io\"));\n }\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 request<T extends HostBoundPacket>(\n packet: DeviceBoundPacket,\n ReplyType: HostBoundPacketType<T>,\n timeout: number = 1000,\n ): ResultAsync<T, VexSerialError> {\n return new ResultAsync(\n (async () => {\n const result = await this.writeDataAsync(packet, timeout);\n if (result instanceof ReplyType) return ok(result);\n\n return err(\n new VexProtocolError(\n expectedReplyMessage(packet, ReplyType, result),\n typeof result === \"number\" ? result : undefined,\n ),\n );\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 // Route the reply to the first callback wanting these command\n // IDs. Untyped callbacks (raw writes, which want nothing in\n // particular) are only used as a fallback so they cannot steal\n // a reply from a typed request that is also in flight.\n let matchIdx = -1;\n let untypedIdx = -1;\n for (let i = 0; i < this.callbacksQueue.length; i++) {\n const candidate = this.callbacksQueue[i]!;\n if (\n candidate.wantedCommandId === undefined &&\n candidate.wantedCommandExId === undefined\n ) {\n if (untypedIdx === -1) untypedIdx = i;\n continue;\n }\n if (\n (candidate.wantedCommandId === undefined ||\n candidate.wantedCommandId === cmdId) &&\n (candidate.wantedCommandExId === undefined ||\n candidate.wantedCommandExId === cmdExId)\n ) {\n matchIdx = i;\n break;\n }\n }\n if (matchIdx === -1) matchIdx = untypedIdx;\n\n if (matchIdx === -1) {\n this.reportWarning(\"received a reply with no matching request\", {\n commandId: cmdId,\n commandExtendedId: cmdExId,\n ack,\n });\n continue;\n }\n\n const callbackInfo: IPacketCallback = this.callbacksQueue[matchIdx]!;\n const wantedCmdId = callbackInfo.wantedCommandId;\n const wantedCmdExId = callbackInfo.wantedCommandExId;\n\n const data = cache.slice(0, sliceIdx);\n const PackageType = thePacketEncoder.getPacketType(\n wantedCmdId,\n wantedCmdExId,\n );\n if (wantedCmdId === undefined || PackageType === undefined) {\n if (wantedCmdId !== undefined) {\n this.reportWarning(\n \"no packet class is registered for the wanted command\",\n { commandId: wantedCmdId, commandExtendedId: wantedCmdExId },\n );\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 this.reportWarning(\n \"reply failed packet validation; delivering its ack instead\",\n { commandId: cmdId, commandExtendedId: cmdExId, ack },\n );\n\n callbackInfo.callback(ack!);\n }\n }\n\n clearTimeout(callbackInfo.timeout);\n\n this.callbacksQueue.splice(matchIdx, 1);\n } catch (e) {\n if (!(e instanceof Error && e.message === \"No data\")) {\n this.reportWarning(\"reader loop stopped by a read error\", {\n error: e,\n pendingBytes: cache,\n });\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 this.request(new Query1H2DPacket(), Query1ReplyD2HPacket, 100);\n }\n\n getSystemVersion(): ResultAsync<VexFirmwareVersion, VexSerialError> {\n return this.request(\n new SystemVersionH2DPacket(),\n SystemVersionReplyD2HPacket,\n ).map((result) => result.version);\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 this.request(\n new GetDeviceStatusH2DPacket(),\n GetDeviceStatusReplyD2HPacket,\n );\n }\n\n getRadioStatus(): ResultAsync<GetRadioStatusReplyD2HPacket, VexSerialError> {\n return this.request(\n new GetRadioStatusH2DPacket(),\n GetRadioStatusReplyD2HPacket,\n );\n }\n\n getSystemFlags(): ResultAsync<GetSystemFlagsReplyD2HPacket, VexSerialError> {\n return this.request(\n new GetSystemFlagsH2DPacket(),\n GetSystemFlagsReplyD2HPacket,\n );\n }\n\n getSystemStatus(\n timeout = 1000,\n ): ResultAsync<GetSystemStatusReplyD2HPacket, VexSerialError> {\n return this.request(\n new GetSystemStatusH2DPacket(),\n GetSystemStatusReplyD2HPacket,\n timeout,\n );\n }\n\n getMatchStatus(): ResultAsync<MatchStatusReplyD2HPacket, VexSerialError> {\n return this.request(\n new GetMatchStatusH2DPacket(),\n MatchStatusReplyD2HPacket,\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 p1Result = await this.request(\n new InitFileTransferH2DPacket(\n FileInitAction.READ,\n downloadTarget,\n vendor,\n FileInitOption.NONE,\n new Uint8Array(),\n nextAddress,\n filename,\n \"\",\n ),\n InitFileTransferReplyD2HPacket,\n );\n\n if (p1Result.isErr()) return err(p1Result.error);\n\n let transferFailed = true;\n let result: Result<Uint8Array, VexSerialError> = ok(new Uint8Array());\n try {\n const p1 = p1Result.value;\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 p2Result = await this.request(\n new ReadFileH2DPacket(nextAddress, requestedSize),\n ReadFileReplyD2HPacket,\n 3000,\n );\n\n if (p2Result.isErr()) throw p2Result.error;\n const p2 = p2Result.value;\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 const exitResult = await this.request(\n new ExitFileTransferH2DPacket(FileExitAction.EXIT_HALT),\n ExitFileTransferReplyD2HPacket,\n 30000,\n );\n if (!transferFailed && exitResult.isErr())\n result = err(exitResult.error);\n } catch (e) {\n if (!transferFailed) result = err(toVexSerialError(e, \"io\"));\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 p1Result = await this.request(\n new InitFileTransferH2DPacket(\n FileInitAction.WRITE,\n downloadTarget,\n vendor,\n FileInitOption.OVERWRITE,\n buf,\n nextAddress,\n filename,\n exttype,\n ),\n InitFileTransferReplyD2HPacket,\n );\n\n if (p1Result.isErr()) return err(p1Result.error);\n\n const p1 = p1Result.value;\n const bufferChunkSize = getTransferChunkSize(p1.windowSize);\n let bufferOffset = 0;\n\n let lastBlock = false;\n\n let transferFailed = true;\n let result: Result<boolean, VexSerialError> = ok(false);\n\n try {\n if (linkedFile !== undefined) {\n const p3Result = await this.request(\n new LinkFileH2DPacket(\n linkedFile.vendor ?? FileVendor.USER,\n linkedFile.filename,\n 0,\n ),\n LinkFileReplyD2HPacket,\n 10000,\n );\n\n if (p3Result.isErr()) throw p3Result.error;\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 p2Result = await this.request(\n new WriteFileH2DPacket(nextAddress, tmpbuf),\n WriteFileReplyD2HPacket,\n 3000,\n );\n\n if (p2Result.isErr()) throw p2Result.error;\n\n // next chunk\n bufferOffset += bufferChunkSize;\n nextAddress += bufferChunkSize;\n\n progressCallback?.(\n Math.min(bufferOffset, buf.byteLength),\n buf.byteLength,\n );\n }\n\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 const exitResult = await this.request(\n new ExitFileTransferH2DPacket(\n transferFailed\n ? FileExitAction.EXIT_HALT\n : autoRun\n ? FileExitAction.EXIT_RUN\n : FileExitAction.EXIT_HALT,\n ),\n ExitFileTransferReplyD2HPacket,\n 30000,\n );\n if (!transferFailed) {\n result = exitResult.map(() => true);\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 eraseResult = await this.request(\n new EraseFileH2DPacket(vendor, filename),\n EraseFileReplyD2HPacket,\n );\n result = eraseResult.map(() => undefined);\n } catch (e) {\n result = err(toVexSerialError(e, \"io\"));\n }\n // Always exit file-transfer mode; a failed exit only overrides\n // the result when the erase itself succeeded, so callers see\n // the root cause rather than the cleanup failure.\n try {\n const exitResult = await this.request(\n new ExitFileTransferH2DPacket(FileExitAction.EXIT_HALT),\n ExitFileTransferReplyD2HPacket,\n 30000,\n );\n if (result.isOk() && exitResult.isErr())\n result = err(exitResult.error);\n } catch (e) {\n if (result.isOk()) result = err(toVexSerialError(e, \"io\"));\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 clearResult = await this.request(\n new FileClearUpH2DPacket(FileVendor.USER),\n FileClearUpReplyD2HPacket,\n 30000,\n );\n result = clearResult.map(() => undefined);\n } catch (e) {\n result = err(toVexSerialError(e, \"io\"));\n }\n // Always exit file-transfer mode; a failed exit only overrides\n // the result when the clear itself succeeded, so callers see\n // the root cause rather than the cleanup failure.\n try {\n const exitResult = await this.request(\n new ExitFileTransferH2DPacket(FileExitAction.EXIT_HALT),\n ExitFileTransferReplyD2HPacket,\n 30000,\n );\n if (result.isOk() && exitResult.isErr())\n result = err(exitResult.error);\n } catch (e) {\n if (result.isOk()) result = err(toVexSerialError(e, \"io\"));\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 this.request(\n new ScreenCaptureH2DPacket(0),\n ScreenCaptureReplyD2HPacket,\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 this.request(\n new UpdateMatchModeH2DPacket(mode, 0),\n MatchModeReplyD2HPacket,\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 this.request(\n new LoadFileActionH2DPacket(FileVendor.USER, FileLoadAction.RUN, value),\n LoadFileActionReplyD2HPacket,\n );\n }\n\n stopProgram(): ResultAsync<LoadFileActionReplyD2HPacket, VexSerialError> {\n return this.request(\n new LoadFileActionH2DPacket(FileVendor.USER, FileLoadAction.STOP, \"\"),\n LoadFileActionReplyD2HPacket,\n );\n }\n\n mockTouch(\n x: number,\n y: number,\n press: boolean,\n ): ResultAsync<SendDashTouchReplyD2HPacket, VexSerialError> {\n return this.request(\n new SendDashTouchH2DPacket(x, y, press),\n SendDashTouchReplyD2HPacket,\n );\n }\n\n openScreen(\n screen: number | SelectDashScreen,\n port: number,\n ): ResultAsync<SelectDashReplyD2HPacket, VexSerialError> {\n return this.request(\n new SelectDashH2DPacket(screen, port),\n SelectDashReplyD2HPacket,\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\nfunction expectedReplyMessage<T extends HostBoundPacket>(\n packet: DeviceBoundPacket,\n ReplyType: HostBoundPacketType<T>,\n reply: HostBoundPacket | ArrayBuffer | AckType,\n): string {\n const expected = `expected ${ReplyType.name} for ${packet.constructor.name}`;\n if (typeof reply === \"number\")\n return `${expected}; received ${ackTypeName(reply)}`;\n if (reply instanceof ArrayBuffer)\n return `${expected}; received raw ArrayBuffer`;\n return `${expected}; received ${reply.constructor.name}`;\n}\n\nfunction ackTypeName(ackType: AckType): string {\n return `AckType.${AckType[ackType] ?? \"UNKNOWN\"} (${ackType})`;\n}\n",
|
|
10
|
+
"import { AckType, type DataArray } from \"./Vex.js\";\nimport type { PacketEncoder } from \"./VexPacketEncoder.js\";\n\n// The match-status reply acknowledges with 167 instead of CDC2_ACK.\nconst MATCH_STATUS_ALT_ACK = 167;\n\nexport abstract class Packet {\n /** Raw bytes sent to or received from the device. */\n data: Uint8Array;\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 static COMMAND_ID: number;\n static COMMAND_EXTENDED_ID: number | undefined;\n\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 constructor(payload?: Uint8Array) {\n const { COMMAND_ID: cmd, COMMAND_EXTENDED_ID: ext } =\n new.target as typeof DeviceBoundPacket;\n const encoder = Packet.ENCODER;\n super(\n ext === undefined\n ? payload === undefined\n ? encoder.cdcCommand(cmd)\n : encoder.cdcCommandWithData(cmd, payload)\n : payload === undefined\n ? encoder.cdc2Command(cmd, ext)\n : encoder.cdc2CommandWithData(cmd, ext, payload),\n );\n }\n}\n\nexport class HostBoundPacket extends Packet {\n static COMMAND_ID: number;\n static COMMAND_EXTENDED_ID: number | undefined;\n\n ack: AckType;\n payloadSize: number;\n ackIndex: number;\n\n constructor(data: DataArray) {\n super(data);\n this.payloadSize = Packet.ENCODER.getPayloadSize(this.data);\n this.ackIndex = Packet.ENCODER.getHostHeaderLength(this.data) + 1;\n this.ack = this.data[this.ackIndex]!;\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",
|
|
11
|
+
"const POLYNOMIAL_CRC32 = 0x04c11db7;\nconst POLYNOMIAL_CRC16 = 0x1021;\n\nfunction genTable16(): Uint16Array {\n const table = new Uint16Array(256);\n for (let i = 0; i < 256; i++) {\n let acc = i << 8;\n for (let j = 0; j < 8; j++) {\n acc = (acc & 0x8000) !== 0 ? (acc << 1) ^ POLYNOMIAL_CRC16 : acc << 1;\n }\n table[i] = acc & 0xffff;\n }\n return table;\n}\n\nfunction genTable32(): Uint32Array {\n const table = new Uint32Array(256);\n for (let i = 0; i < 256; i++) {\n let acc = i << 24;\n for (let j = 0; j < 8; j++) {\n acc = (acc & 0x80000000) !== 0 ? (acc << 1) ^ POLYNOMIAL_CRC32 : acc << 1;\n }\n table[i] = acc;\n }\n return table;\n}\n\nconst CRC16_TABLE = genTable16();\nconst CRC32_TABLE = genTable32();\n\nexport class CrcGenerator {\n crc32Table: Uint32Array = CRC32_TABLE;\n static POLYNOMIAL_CRC32 = POLYNOMIAL_CRC32;\n static POLYNOMIAL_CRC16 = POLYNOMIAL_CRC16;\n\n crc16(buf: Uint8Array, initValue: number): number {\n let acc = initValue;\n for (let j = 0; j < buf.length; j++) {\n acc = ((acc << 8) ^ CRC16_TABLE[((acc >>> 8) ^ buf[j]!) & 0xff]!) >>> 0;\n }\n return acc & 0xffff;\n }\n\n crc32(buf: Uint8Array, initValue: number): number {\n let acc = initValue;\n for (let j = 0; j < buf.length; j++) {\n acc = ((acc << 8) ^ CRC32_TABLE[((acc >>> 24) ^ buf[j]!) & 0xff]!) >>> 0;\n }\n return acc >>> 0;\n }\n}\n",
|
|
12
|
+
"export class VexFirmwareVersion {\n constructor(\n readonly major: number,\n readonly minor: number,\n readonly build: number,\n readonly beta: number,\n ) {}\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) parts.push(0);\n return new VexFirmwareVersion(parts[0]!, parts[1]!, parts[2]!, parts[3]!);\n }\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 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 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 toUserString(): string {\n return `${this.major}.${this.minor}.${this.build}`;\n }\n\n toInternalString(): string {\n return `${this.toUserString()}.b${this.beta}`;\n }\n\n compare(that: VexFirmwareVersion): number {\n for (const [a, b] of [\n [this.major, that.major],\n [this.minor, that.minor],\n [this.build, that.build],\n [this.beta, that.beta],\n ] as const) {\n const delta = a - b;\n if (delta !== 0) return delta;\n }\n return 0;\n }\n}\n",
|
|
13
|
+
"import { VexFirmwareVersion } from \"./VexFirmwareVersion.js\";\nimport { type HostBoundPacket } from \"./VexPacket.js\";\n\nconst textDecoder = new TextDecoder(\"UTF-8\");\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 return this.getInt8(this.position++);\n }\n\n nextUint8(): number {\n return this.getUint8(this.position++);\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 const result = textDecoder.decode(\n new Uint8Array(this.buffer, this.byteOffset + this.position, length),\n );\n this.position += length;\n return result;\n }\n\n /** Read a null-terminated string from a fixed-width `length`-byte field. */\n nextNTBS(length: number): string {\n const start = this.position;\n const result = this.nextVarNTBS(length);\n this.position = start + length;\n return result;\n }\n\n /** Read a null-terminated string of at most `length` bytes. */\n nextVarNTBS(length: number): string {\n const start = this.position;\n let byteLength = 0;\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 byteLength++;\n }\n return textDecoder.decode(\n new Uint8Array(this.buffer, this.byteOffset + start, byteLength),\n );\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",
|
|
14
|
+
"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\n/** Encode `[vendor/first byte, options/second byte, 23-byte filename + NUL]`. */\nfunction filePayload(a: number, b: number, fileName: string): Uint8Array {\n const payload = new Uint8Array(26);\n payload[0] = a;\n payload[1] = b;\n payload.set(encodeFixedText(fileName, \"Filename\", 23), 2);\n return payload;\n}\n\nconst clamp100 = (value: number | undefined): number | undefined =>\n value !== undefined && value > 100 ? 100 : value;\n\nexport class Query1H2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 33;\n static COMMAND_EXTENDED_ID = undefined;\n}\n\nexport class SystemVersionH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 164;\n static COMMAND_EXTENDED_ID = undefined;\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 const bit1 = mode === \"autonomous\" ? 10 : mode === \"driver\" ? 8 : 11;\n const payload = new Uint8Array(5);\n payload[0] = bit1 & 15;\n new DataView(payload.buffer).setUint32(1, matchClock, true);\n super(payload);\n }\n}\n\nexport class GetMatchStatusH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 88;\n static COMMAND_EXTENDED_ID = 194;\n}\n\nexport class GetRadioModeH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 88;\n static COMMAND_EXTENDED_ID = 65;\n\n constructor(mode: number) {\n super(Uint8Array.of(mode));\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 super(Uint8Array.of(a, b));\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 payload[0] = operation;\n payload[1] = target;\n payload[2] = vendor;\n payload[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 // files with a gz extension are also type bin\n let ext = /(?:\\.([^.]+))?$/.exec(name)?.[1] ?? \"\";\n if (ext === \"gz\") ext = \"bin\";\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 payload.set(encodeFixedText(name, \"Filename\", 23), 28);\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 super(Uint8Array.of(action));\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 new DataView(payload.buffer).setUint32(0, addr, true);\n payload.set(buf, 4);\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 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 super(filePayload(vendor, options, fileName));\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 super(Uint8Array.of(vendor, 0));\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 super(Uint8Array.of(index, 0));\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 const fileName =\n typeof fileNameOrSlotNumber === \"string\"\n ? fileNameOrSlotNumber\n : `___s_${fileNameOrSlotNumber - 1}.bin`;\n super(filePayload(vendor, actionId, fileName));\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 super(filePayload(vendor, options, fileName));\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 super(filePayload(vendor, 128, fileName));\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 super(filePayload(vendor, 0, fileName));\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 super(Uint8Array.of(vendor, 0));\n }\n}\n\nexport class FileFormatH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 31;\n\n constructor() {\n super(Uint8Array.of(68, 67, 66, 65));\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\nexport class GetSystemStatusH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 34;\n}\n\nexport class GetFdtStatusH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 35;\n}\n\nexport class GetLogCountH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 36;\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 super(payload);\n }\n}\n\nexport class GetRadioStatusH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 38;\n}\n\nexport class ScreenCaptureH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 40;\n\n constructor(e: number) {\n super(Uint8Array.of(e));\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 super(payload);\n }\n}\n\nexport class SelectDashH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 43;\n\n constructor(screen: number | SelectDashScreen, port: number) {\n super(Uint8Array.of(screen, port));\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 payload = new Uint8Array(32);\n payload.set(encodeFixedText(key, \"Key\", 31), 0);\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 super(payload);\n }\n}\n\nexport class GetSlot1to4InfoH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 49;\n}\n\nexport class GetSlot5to8InfoH2DPacket extends DeviceBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 50;\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 super(Uint8Array.of(77, 76, 75, 74));\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 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 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 this.modebit = PacketView.fromPacket(this).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 view = PacketView.fromPacket(this);\n const n = this.ackIndex;\n\n this.rssi = view.nextInt8();\n this.systemStatusBits = view.nextUint16();\n this.radioStatusBits = view.nextUint16();\n this.fieldStatusBits = view.nextUint8();\n this.matchClock = view.nextUint8();\n this.brainBatteryPercent = view.nextUint8();\n this.controllerBatteryPercent = view.nextUint8();\n this.partnerControllerBatteryPercent = view.nextUint8();\n this.pad = view.nextUint8();\n this.buttons = view.nextUint16();\n this.activeProgram = view.nextUint8();\n this.radioType = view.nextUint8();\n this.radioChannel = view.nextUint8();\n this.radioSlot = view.nextUint8();\n this.controllerFlags = view.getUint8(n + 28);\n this.rxSignalQuality = view.getUint8(n + 29);\n\n const raw = new TextDecoder(\"UTF-8\").decode(\n this.data.slice(n + 18, n + this.payloadSize + 28),\n );\n const end = raw.indexOf(\"\\0\");\n this.robotName = end > -1 ? raw.slice(0, end) : raw;\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 const view = PacketView.fromPacket(this);\n this.windowSize = view.nextUint16();\n this.fileSize = view.nextUint32();\n this.crc32 = view.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 const view = PacketView.fromPacket(this);\n this.addr = view.nextUint32();\n this.length = this.payloadSize - 8;\n this.buf = this.data.slice(\n view.position,\n view.position + this.length,\n ).buffer;\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 this.count = PacketView.fromPacket(this).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 if (this.payloadSize <= 4) return;\n\n const view = PacketView.fromPacket(this);\n this.file = {\n index: view.nextUint8(),\n size: view.nextUint32(),\n loadAddress: view.nextUint32(),\n crc32: view.nextUint32(),\n type: view.nextString(4),\n timestamp: view.nextUint32() + PacketEncoder.J2000_EPOCH,\n version: view.nextVersion(),\n filename: view.nextNTBS(32),\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 if (this.payloadSize <= 4) return;\n\n const view = PacketView.fromPacket(this);\n view.nextUint8();\n this.file = {\n size: view.nextUint32(),\n loadAddress: view.nextUint32(),\n crc32: view.nextUint32(),\n type: view.nextString(4),\n timestamp: view.nextUint32() + PacketEncoder.J2000_EPOCH,\n version: view.nextVersion(),\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 const view = PacketView.fromPacket(this);\n this.slot = view.nextUint8();\n this.requestedSlot = view.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 = false;\n radioQuality?: number;\n controllerBatteryPercent?: number;\n partnerControllerBatteryPercent?: number;\n battery?: number;\n currentProgram = 0;\n\n constructor(data: DataArray) {\n super(data);\n\n const view = PacketView.fromPacket(this);\n this.flags = view.nextUint32();\n const hasPartner = (8192 & this.flags) !== 0;\n const hasRadio = (1536 & this.flags) === 1536;\n\n const byte1 = view.nextUint8();\n const byte2 = view.nextUint8();\n\n if (this.payloadSize === 11) {\n this.battery = clamp100(8 * (byte1 & 0x0f));\n if ((this.flags & 0x100) !== 0 || hasRadio) {\n this.controllerBatteryPercent = clamp100(8 * ((byte1 >> 4) & 0x0f));\n }\n if (hasRadio) this.radioQuality = clamp100(8 * (byte2 & 0x0f));\n this.radioSearching = (this.flags & 0x600) === 0x200;\n if (hasPartner) {\n this.partnerControllerBatteryPercent = clamp100(\n 8 * ((byte2 >> 4) & 0x0f),\n );\n }\n this.currentProgram = view.nextUint8();\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 view = PacketView.fromPacket(this);\n this.count = view.nextUint8();\n this.devices = [];\n for (let i = 0; i < this.count; i++) {\n this.devices.push({\n port: view.nextUint8(),\n type: view.nextUint8(),\n status: view.nextUint8(),\n betaversion: view.nextUint8(),\n version: view.nextUint16(),\n bootversion: view.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.allZero();\n touchVersion: VexFirmwareVersion;\n uniqueId = 1234;\n sysflags: number[] = [0, 0, 0, 0, 0, 0, 0];\n eventBrain = false;\n romBootloaderActive = false;\n ramBootloaderActive = false;\n goldenVersion = VexFirmwareVersion.allZero();\n\n constructor(data: DataArray) {\n super(data);\n\n const view = PacketView.fromPacket(this);\n view.nextUint8();\n\n this.systemVersion = view.nextVersion();\n this.cpu0Version = view.nextVersion();\n this.cpu1Version = view.nextVersion();\n this.touchVersion = view.nextVersion(true);\n\n if (this.payloadSize > 25) {\n this.uniqueId = view.nextUint32();\n this.sysflags = [\n view.nextUint8(),\n view.nextUint8(),\n view.nextUint8(),\n view.nextUint8(),\n view.nextUint8(),\n 0,\n view.nextUint8(),\n ];\n const flags6 = this.sysflags[6]!;\n this.eventBrain = (1 & flags6) !== 0;\n this.romBootloaderActive = (2 & flags6) !== 0;\n this.ramBootloaderActive = (4 & flags6) !== 0;\n\n view.nextUint16();\n this.goldenVersion = view.nextVersion();\n }\n\n if (this.payloadSize > 37) {\n this.nxpVersion = view.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 view = PacketView.fromPacket(this);\n this.count = view.nextUint8();\n this.status = [];\n for (let i = 0; i < this.count; i++) {\n this.status.push({\n index: view.nextUint8(),\n type: view.nextUint8(),\n status: view.nextUint8(),\n betaversion: view.nextUint8(),\n version: view.nextUint16(),\n bootversion: view.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 const view = PacketView.fromPacket(this);\n view.nextUint8();\n this.count = view.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 view = PacketView.fromPacket(this);\n const size = view.nextUint8();\n this.offset = view.nextUint32();\n this.count = view.nextUint16();\n this.entries = [];\n\n let j = this.ackIndex + 8;\n for (let i = 0; i < this.count; i++) {\n this.entries.push({\n code: view.getUint8(j),\n type: view.getUint8(j + 1),\n desc: view.getUint8(j + 2),\n spare: view.getUint8(j + 3),\n time: view.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 view = PacketView.fromPacket(this);\n this.device = view.nextUint8();\n this.quality = view.nextUint16();\n this.strength = view.nextInt16();\n this.channel = this.data[this.ackIndex + 6]!;\n this.timeslot = this.data[this.ackIndex + 7]!;\n }\n}\n\nexport class ScreenCaptureReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 40;\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 this.value = PacketView.fromPacket(this).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 view = PacketView.fromPacket(this);\n this.slotFlags = view.nextUint8();\n this.slots = [];\n\n for (let i = 0; i < 4; i++) {\n if ((this.slotFlags & (1 << (start - 1 + i))) === 0) continue;\n\n const icon = view.nextUint16();\n const nameLen = view.nextUint8();\n this.slots.push({\n slot: start + i,\n icon,\n name: view.nextString(nameLen),\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 const view = PacketView.fromPacket(this);\n this.status = view.nextUint8();\n this.percent = view.nextUint8();\n }\n}\n\nexport class FactoryEnableReplyD2HPacket extends HostBoundPacket {\n static COMMAND_ID = 86;\n static COMMAND_EXTENDED_ID = 255;\n}\n",
|
|
15
|
+
"import { CrcGenerator } from \"./VexCRC.js\";\nimport { HostBoundPacket, Packet } from \"./VexPacketBase.js\";\nimport * as AllPackets from \"./VexPacketModels.js\";\n\nconst textEncoder = new TextEncoder();\nconst HEADER_TO_DEVICE = Uint8Array.of(201, 54, 184, 71);\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 = 0;\n\n crcgen = new CrcGenerator();\n allPacketsTable = new Map<\n number,\n Map<number | undefined, typeof HostBoundPacket>\n >();\n\n static getInstance(): PacketEncoder {\n Packet.ENCODER ??= new PacketEncoder();\n return Packet.ENCODER;\n }\n\n private constructor() {\n for (const packet of Object.values(AllPackets)) {\n if (\n typeof packet === \"function\" &&\n packet.prototype instanceof HostBoundPacket\n ) {\n const type = packet as typeof HostBoundPacket;\n let byExtendedId = this.allPacketsTable.get(type.COMMAND_ID);\n if (byExtendedId === undefined) {\n byExtendedId = new Map();\n this.allPacketsTable.set(type.COMMAND_ID, byExtendedId);\n }\n byExtendedId.set(type.COMMAND_EXTENDED_ID, type);\n }\n }\n }\n\n /** Look up the reply class registered for a command ID pair. */\n getPacketType(\n commandId: number | undefined,\n commandExtendedId: number | undefined,\n ): typeof HostBoundPacket | undefined {\n if (commandId === undefined) return undefined;\n return this.allPacketsTable.get(commandId)?.get(commandExtendedId);\n }\n\n /** Create the vex CDC header. */\n createHeader(buf: ArrayBuffer | undefined): Uint8Array {\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(HEADER_TO_DEVICE);\n return h;\n }\n\n /** Create a simple CDC message. */\n cdcCommand(cmd: number): Uint8Array {\n const h = new Uint8Array(5);\n h.set(HEADER_TO_DEVICE);\n h[4] = cmd;\n return h;\n }\n\n /** Create a simple CDC message carrying data. */\n cdcCommandWithData(cmd: number, data: Uint8Array): Uint8Array {\n const h = new Uint8Array(6 + data.length);\n h.set(HEADER_TO_DEVICE);\n h[4] = cmd;\n h[5] = data.length;\n h.set(data, 6);\n return h;\n }\n\n /** Create a CDC2 (extended) message with no payload. */\n cdc2Command(cmd: number, ext: number): Uint8Array {\n const h = new Uint8Array(9);\n h.set(HEADER_TO_DEVICE);\n h[4] = cmd;\n h[5] = ext;\n h[6] = 0;\n this.appendCrc16(h);\n return h;\n }\n\n /**\n * Buffer length for a CDC2 command: header + command byte + function\n * byte + length byte (two bytes when payload > 127) + payload + CRC16.\n */\n cdc2CommandBufferLength(data: Uint8Array): number {\n return (\n PacketEncoder.HEADERS_LENGTH +\n data.length +\n 5 +\n (data.length > 127 ? 1 : 0)\n );\n }\n\n /** Create a CDC2 (extended) message carrying a payload. */\n cdc2CommandWithData(cmd: number, ext: number, data: Uint8Array): Uint8Array {\n const h = new Uint8Array(this.cdc2CommandBufferLength(data));\n h.set(HEADER_TO_DEVICE);\n h[4] = cmd;\n h[5] = ext;\n if (data.length < 128) {\n h[6] = data.length;\n h.set(data, 7);\n } else {\n h[6] = (data.length >>> 8) | 0x80;\n h[7] = data.length & 0xff;\n h.set(data, 8);\n }\n this.appendCrc16(h);\n return h;\n }\n\n private appendCrc16(h: Uint8Array): void {\n const crc = this.crcgen.crc16(h.subarray(0, h.length - 2), 0);\n h[h.length - 2] = crc >>> 8;\n h[h.length - 1] = crc & 0xff;\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 crc = (data[data.byteLength - 2]! << 8) + data[data.byteLength - 1]!;\n return this.crcgen.crc16(data.subarray(0, data.byteLength - 2), 0) === crc;\n }\n\n getPayloadSize(data: Uint8Array): number {\n const a = data[3]!;\n return (a & 0x80) === 0 ? a : ((a & 0x7f) << 8) + data[4]!;\n }\n\n getHostHeaderLength(data: Uint8Array): number {\n return (data[3]! & 0x80) === 0 ? 4 : 5;\n }\n}\n",
|
|
16
|
+
"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 { VexNotConnectedError, VexSerialError } 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 interface VexSerialDeviceEvents {\n disconnected: undefined;\n error: unknown;\n}\n\nexport abstract class VexSerialDevice extends VexEventTarget<VexSerialDeviceEvents> {\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: serialization of transfer\n * operations lives on the {@link V5SerialConnection} transaction queue.\n */\n private refreshPauseDepth = 0;\n\n get isRefreshPaused(): boolean {\n return this.refreshPauseDepth > 0;\n }\n\n /**\n * @deprecated Use {@link isRefreshPaused}. This flag only means that\n * automatic refresh is paused, not that transfer operations are locked.\n */\n get isFileTransferring(): boolean {\n return this.isRefreshPaused;\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 */\n async withRefreshPaused<T>(operation: () => PromiseLike<T>): Promise<T> {\n this.refreshPauseDepth++;\n try {\n return await operation();\n } finally {\n this.refreshPauseDepth--;\n }\n }\n\n /**\n * @deprecated Use {@link withRefreshPaused}. This only pauses automatic\n * refresh and does not lock file transfers.\n */\n async withFileTransfer<T>(operation: () => PromiseLike<T>): Promise<T> {\n return this.withRefreshPaused(operation);\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 isCharging: 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 private readonly batteryFacade: V5Battery;\n private readonly buttonFacade: V5BrainButton;\n private readonly settingsFacade: V5BrainSettings;\n\n constructor(state: V5SerialDeviceState) {\n this.state = state;\n this.batteryFacade = new V5Battery(state);\n this.buttonFacade = new V5BrainButton(state);\n this.settingsFacade = new V5BrainSettings(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 if (typeof slot === \"number\") this.state.brain.activeProgram = slot;\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 this.batteryFacade;\n }\n\n get button(): V5BrainButton {\n return this.buttonFacade;\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 this.settingsFacade;\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 conn = this.state._instance.connection;\n if (conn == null || !conn.isConnected) {\n return err(new VexNotConnectedError());\n }\n\n return conn\n .request(\n new FileControlH2DPacket(1, channel),\n FileControlReplyD2HPacket,\n )\n .map(() => undefined);\n })(),\n );\n }\n}\n",
|
|
17
|
+
"import {\n FileDownloadTarget,\n FileVendor,\n type IFileWriteRequest,\n USER_FLASH_USR_CODE_START,\n} from \"./Vex.js\";\nimport { type V5SerialConnection } from \"./VexConnection.js\";\nimport type { V5SerialDeviceState } from \"./VexDeviceState.js\";\nimport {\n VexDownloadError,\n VexFirmwareError,\n VexInvalidArgumentError,\n VexNotConnectedError,\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 * 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 new ResultAsync(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 new ResultAsync(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 new ResultAsync(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\ntype FirmwareProgressCallback = (\n state: string,\n current: number,\n total: number,\n) => void;\n\ntype FactoryImageLabel = \"BOOT\" | \"ASSETS\";\n\ninterface FactoryImageFlashOptions {\n image: FirmwareImage;\n label: FactoryImageLabel;\n downloadTarget: FileDownloadTarget;\n}\n\nasync function flashFactoryImage(\n conn: V5SerialConnection,\n options: FactoryImageFlashOptions,\n pcb: FirmwareProgressCallback,\n): Promise<Result<void, VexSerialError>> {\n const { image, label, downloadTarget } = options;\n pcb(`FACTORY ENB ${label}`, 0, 0);\n\n const enableReply = await conn.request(\n new FactoryEnableH2DPacket(),\n FactoryEnableReplyD2HPacket,\n );\n if (enableReply.isErr()) return err(enableReply.error);\n\n const writeRequest: IFileWriteRequest = {\n filename: \"null.bin\",\n vendor: FileVendor.USER,\n loadAddress: USER_FLASH_USR_CODE_START,\n buf: image.buf,\n downloadTarget,\n exttype: \"bin\",\n autoRun: true, // need to set EXIT_RUN\n linkedFile: undefined,\n };\n\n const upload = await conn.uploadFileToDevice(writeRequest, (c, t) => {\n pcb(`UPLOAD ${label}`, c, t);\n });\n if (upload.isErr()) return err(upload.error);\n if (!upload.value) {\n return err(new VexFirmwareError(`${label} upload was rejected by device`));\n }\n\n const deadline = Date.now() + 120000;\n while (Date.now() < deadline) {\n const statusReply = await conn.request(\n new FactoryStatusH2DPacket(),\n FactoryStatusReplyD2HPacket,\n 10000,\n );\n if (statusReply.isErr()) return err(statusReply.error);\n\n reportFactoryStatus(label, statusReply.value, pcb);\n\n if (statusReply.value.status === 0 && statusReply.value.percent === 100) {\n return ok(undefined);\n }\n await sleepInner(500);\n }\n\n return err(new VexFirmwareError(`${label} factory status timed out`));\n}\n\nfunction reportFactoryStatus(\n label: FactoryImageLabel,\n reply: FactoryStatusReplyD2HPacket,\n pcb: FirmwareProgressCallback,\n): void {\n switch (reply.status) {\n case 2:\n pcb(`ERASE ${label}`, reply.percent, 100);\n break;\n case 3:\n pcb(`WRITE ${label}`, reply.percent, 100);\n break;\n case 4:\n pcb(`VERIFY ${label}`, reply.percent, 100);\n break;\n case 8:\n pcb(`FINISHING ${label}`, reply.percent, 100);\n break;\n }\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 VexFirmwareError} / {@link VexNotConnectedError}.\n */\nexport function uploadFirmware(\n state: V5SerialDeviceState,\n publicUrl = \"https://content.vexrobotics.com/vexos/public/V5/\",\n usingVersion?: string,\n progressCallback?: FirmwareProgressCallback,\n): ResultAsync<boolean, VexSerialError> {\n return new ResultAsync(\n runUploadFirmware(state, publicUrl, usingVersion, progressCallback),\n );\n}\n\nasync function runUploadFirmware(\n state: V5SerialDeviceState,\n publicUrl: string,\n usingVersion: string | undefined,\n progressCallback?: FirmwareProgressCallback,\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.withRefreshPaused(async () => {\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 bootFlash = await flashFactoryImage(\n conn,\n {\n image: boot,\n label: \"BOOT\",\n downloadTarget: FileDownloadTarget.FILE_TARGET_B1,\n },\n pcb,\n );\n if (bootFlash.isErr()) return err(bootFlash.error);\n\n const assetsFlash = await flashFactoryImage(\n conn,\n {\n image: assertImage,\n label: \"ASSETS\",\n downloadTarget: FileDownloadTarget.FILE_TARGET_A1,\n },\n pcb,\n );\n if (assetsFlash.isErr()) return err(assetsFlash.error);\n\n return ok(true);\n });\n}\n",
|
|
18
|
+
"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 return conn\n .request(new ReadKeyValueH2DPacket(key), ReadKeyValueReplyD2HPacket)\n .map((result) => result.value);\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 return conn\n .request(\n new WriteKeyValueH2DPacket(key, value),\n WriteKeyValueReplyD2HPacket,\n )\n .map(() => undefined);\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 countResult = await conn.request(\n new GetDirectoryFileCountH2DPacket(vendor),\n GetDirectoryFileCountReplyD2HPacket,\n );\n if (countResult.isErr()) return err(countResult.error);\n\n const files: IFileHandle[] = [];\n for (let i = 0; i < countResult.value.count; i++) {\n const entryResult = await conn.request(\n new GetDirectoryEntryH2DPacket(i),\n GetDirectoryEntryReplyD2HPacket,\n );\n if (entryResult.isErr()) return err(entryResult.error);\n\n // .file is undefined if the file is not found\n // .file is a file entry but not a file handle\n if (entryResult.value.file != null) {\n files.push({\n filename: entryResult.value.file.filename,\n vendor,\n loadAddress: entryResult.value.file.loadAddress,\n\n size: entryResult.value.file.size,\n crc32: entryResult.value.file.crc32,\n\n type: entryResult.value.file.type,\n timestamp: entryResult.value.file.timestamp,\n version: entryResult.value.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 slotInfo = await conn.request(\n new GetProgramSlotInfoH2DPacket(FileVendor.USER, program.binfile),\n GetProgramSlotInfoReplyD2HPacket,\n );\n if (slotInfo.isOk()) {\n program.slot = slotInfo.value.slot;\n program.requestedSlot = slotInfo.value.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.withRefreshPaused(() =>\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.withRefreshPaused(() => 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.withRefreshPaused(() => 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.withRefreshPaused(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.withRefreshPaused(() =>\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.withRefreshPaused(() =>\n conn.captureScreen(progressCallback),\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\ntype RefreshTimer = ReturnType<typeof setInterval>;\n\nfunction unrefTimerIfPossible(timer: RefreshTimer): void {\n if (typeof timer !== \"object\" || timer === null || !(\"unref\" in timer))\n return;\n\n const unref = timer.unref;\n if (typeof unref === \"function\") unref.call(timer);\n}\n\nexport class V5SerialDevice extends VexSerialDevice {\n autoReconnect = true;\n pauseRefreshOnFileTransfer = true;\n\n protected _isReconnecting = false;\n private _isDisconnecting = false;\n private _refreshInterval: RefreshTimer | undefined;\n state: V5SerialDeviceState = new V5SerialDeviceState(this);\n private _disposed = false;\n private _refreshGeneration = 0;\n private _autoRefresh = false;\n private _isLastRefreshComplete = true;\n private readonly _brain = new V5Brain(this.state);\n private readonly _controllers: [V5Controller, V5Controller] = [\n new V5Controller(this.state, 0),\n new V5Controller(this.state, 1),\n ];\n private readonly _radio = new V5Radio(this.state);\n private readonly _deviceFacades: Array<V5SmartDevice | undefined> = [];\n\n constructor(defaultSerial: Serial, autoRefresh = false) {\n super(defaultSerial);\n this.autoRefresh = autoRefresh;\n }\n\n get autoRefresh(): boolean {\n return this._autoRefresh;\n }\n\n set autoRefresh(value: boolean) {\n if (this._autoRefresh === value) return;\n this._autoRefresh = value;\n if (value) {\n this._startRefreshInterval();\n } else {\n this._stopRefreshInterval();\n }\n }\n\n private _startRefreshInterval(): void {\n if (this._refreshInterval !== undefined || this._disposed) return;\n this._refreshInterval = setInterval(() => {\n if (this._disposed) return;\n if (this._autoRefresh && this._isLastRefreshComplete) {\n if (!this.isConnected) {\n this.state.brain.isAvailable = false;\n return;\n }\n\n if (!this.pauseRefreshOnFileTransfer || !this.state.isRefreshPaused) {\n this._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 this._isLastRefreshComplete = true;\n }\n })();\n }\n }\n }, 200);\n unrefTimerIfPossible(this._refreshInterval);\n }\n\n private _stopRefreshInterval(): void {\n if (this._refreshInterval === undefined) return;\n clearInterval(this._refreshInterval);\n this._refreshInterval = undefined;\n }\n\n get isV5Controller(): boolean {\n return this.deviceType === SerialDeviceType.V5_CONTROLLER;\n }\n\n get brain(): V5Brain {\n return this._brain;\n }\n\n get controllers(): [V5Controller, V5Controller] {\n return this._controllers;\n }\n\n get devices(): V5SmartDevice[] {\n const rtn: V5SmartDevice[] = [];\n for (let i = 1; i < this.state.devices.length; i++) {\n if (this.state.devices[i] != null) {\n const facade =\n this._deviceFacades[i] ?? new V5SmartDevice(this.state, i);\n this._deviceFacades[i] = facade;\n rtn.push(facade);\n }\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 this._radio;\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 !== \"opened\") {\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 === \"no-port\") {\n return err(new VexNotConnectedError(\"no V5 device was found\"));\n }\n if (result.value === \"busy\") {\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 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 === \"no-port\") break;\n if (result.value === \"busy\") {\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._isDisconnecting) return;\n this.emit(\"disconnected\", undefined);\n if (this.autoReconnect) {\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 isCharging: (flags2 & 0b10000000) !== 0,\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\";\n\nclass BaseIniBuilder {\n protected str = \"\";\n\n protected addLine(line: string): void {\n this.str += line + \"\\n\";\n }\n\n addComment(comment: string): this {\n this.addLine(\"; \" + comment);\n return this;\n }\n\n 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 const value = this.object[key];\n if (value == null || value.toString().length === 0) return;\n\n const formattedKey = this.keyTransform(key).padEnd(12).slice(0, 12);\n const trimmedVal = value.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 addObjProperty(key: keyof O | Array<keyof O>, maxValueLength?: number): this {\n for (const k of Array.isArray(key) ? key : [key]) {\n this.addSingleObjProperty(k, maxValueLength);\n }\n return this;\n }\n\n addAllObjProps(maxValueLength?: number): this {\n for (const k of Object.keys(this.object)) {\n this.addSingleObjProperty(k, maxValueLength);\n }\n return this;\n }\n}\n\nclass IniFileBuilder extends BaseIniBuilder {\n addSection(\n section: IniSectionBuilder<Record<number | string, string | number>>,\n ): this {\n this.addLine(`[${section.name}]`);\n this.str += section.getContent();\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> = { 22: \"adi\" };\n controller1: Record<string, string> = {};\n controller2: Record<string, string> = {};\n\n setProgramDate(date: Date): void {\n this.program.date = date.toISOString();\n const offset = Math.abs(date.getTimezoneOffset());\n const hours = (offset / 60) >>> 0;\n const minutes = offset - hours * 60;\n this.program.timezone =\n (date.getTimezoneOffset() > 0 ? \"-\" : \"+\") +\n this.dec2(hours) +\n \":\" +\n this.dec2(minutes);\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 return (value % 100).toString(10).padStart(2, \"0\").toUpperCase();\n }\n}\n"
|
|
21
|
+
],
|
|
22
|
+
"mappings": "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",
|
|
23
|
+
"debugId": "6C653363AF816C0D64756E2164756E21",
|
|
24
|
+
"names": []
|
|
25
|
+
}
|