From d2fd84a6b5620b8da23deae599237c634e364be8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thea=20Sch=C3=B6bl?= Date: Fri, 3 Nov 2023 18:24:32 +0100 Subject: [PATCH] fix: add vendor ids for additional devices fix: use proper semver parsing for device versions Fixes #2 --- src/lib/components/action-extension.ts | 0 src/lib/serial/device.ts | 27 ++++++++++++++++++++------ src/lib/serial/sem-ver.ts | 27 ++++++++++++++++++++++++++ src/routes/ConnectionPopup.svelte | 2 +- 4 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 src/lib/components/action-extension.ts create mode 100644 src/lib/serial/sem-ver.ts diff --git a/src/lib/components/action-extension.ts b/src/lib/components/action-extension.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/lib/serial/device.ts b/src/lib/serial/device.ts index ee43aa65..871fa534 100644 --- a/src/lib/serial/device.ts +++ b/src/lib/serial/device.ts @@ -1,17 +1,33 @@ import {LineBreakTransformer} from "$lib/serial/line-break-transformer" import {serialLog} from "$lib/serial/connection" import type {Chord} from "$lib/serial/chord" +import {SemVer} from "$lib/serial/sem-ver" import {parseChordActions, parsePhrase, stringifyChordActions, stringifyPhrase} from "$lib/serial/chord" import {browser} from "$app/environment" -export const VENDOR_ID = 0x239a +const PORT_FILTERS: Map = new Map([ + ["ONE M0", {usbProductId: 32783, usbVendorId: 9114}], + ["LITE S2", {usbProductId: 33070, usbVendorId: 12346}], + ["LITE M0", {usbProductId: 32796, usbVendorId: 9114}], + ["X", {usbProductId: 33163, usbVendorId: 12346}], +]) if (browser && navigator.serial === undefined && import.meta.env.TAURI_FAMILY !== undefined) { await import("./tauri-serial") } export async function getViablePorts(): Promise { - return navigator.serial.getPorts().then(ports => ports.filter(it => it.getInfo().usbVendorId === VENDOR_ID)) + return navigator.serial.getPorts().then(ports => + ports.filter(it => { + const {usbProductId, usbVendorId} = it.getInfo() + for (const filter of PORT_FILTERS.values()) { + if (filter.usbProductId === usbProductId && filter.usbVendorId === usbVendorId) { + return true + } + } + return false + }), + ) } export async function canAutoConnect() { @@ -29,7 +45,7 @@ export class CharaDevice { private lock?: Promise - version!: [number, number, number] + version!: SemVer company!: "CHARACHORDER" device!: "ONE" | "LITE" chipset!: "M0" | "S2" @@ -42,7 +58,7 @@ export class CharaDevice { this.port = !manual && ports.length === 1 ? ports[0] - : await navigator.serial.requestPort({filters: [{usbVendorId: VENDOR_ID}]}) + : await navigator.serial.requestPort({filters: [...PORT_FILTERS.values()]}) await this.port.open({baudRate: this.baudRate}) const info = this.port.getInfo() @@ -57,8 +73,7 @@ export class CharaDevice { }) await this.port.close() - const [version] = await this.send("VERSION") - this.version = version.split(".").map(Number) as [number, number, number] + this.version = new SemVer(await this.send("VERSION").then(([version]) => version)) const [company, device, chipset] = await this.send("ID") this.company = company as "CHARACHORDER" this.device = device as "ONE" | "LITE" diff --git a/src/lib/serial/sem-ver.ts b/src/lib/serial/sem-ver.ts new file mode 100644 index 00000000..b5099ab7 --- /dev/null +++ b/src/lib/serial/sem-ver.ts @@ -0,0 +1,27 @@ +export class SemVer { + major: number + minor: number + patch: number + preRelease?: string + meta?: string + + constructor(versionString: string) { + const [, major, minor, patch, preRelease, meta] = + /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+([0-9A-Za-z-]+))?$/.exec( + versionString, + )! + this.major = Number.parseInt(major) + this.minor = Number.parseInt(minor) + this.patch = Number.parseInt(patch) + if (preRelease) this.preRelease = preRelease + if (meta) this.meta = meta + } + + toString() { + return ( + `${this.major}.${this.minor}.${this.patch}` + + (this.preRelease ? `-${this.preRelease}` : "") + + (this.meta ? `+${this.meta}` : "") + ) + } +} diff --git a/src/routes/ConnectionPopup.svelte b/src/routes/ConnectionPopup.svelte index e7ec49e5..a1d803b7 100644 --- a/src/routes/ConnectionPopup.svelte +++ b/src/routes/ConnectionPopup.svelte @@ -21,7 +21,7 @@ {$serialPort.device} {$serialPort.chipset}
- Version {$serialPort.version.map(it => it.toString()).join(".")} + Version {$serialPort.version}

{/if}