From fe80867ce41821597927e2d2fc301e71cd94cefe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thea=20Sch=C3=B6bl?= Date: Wed, 24 Jul 2024 18:28:47 +0200 Subject: [PATCH] feat: M4G support --- src/lib/assets/layouts/m4g.yml | 37 +++++++++++++++++++++++++ src/lib/components/layout/Layout.svelte | 4 +++ src/lib/serial/device.ts | 12 ++++---- 3 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 src/lib/assets/layouts/m4g.yml diff --git a/src/lib/assets/layouts/m4g.yml b/src/lib/assets/layouts/m4g.yml new file mode 100644 index 00000000..d2fe782c --- /dev/null +++ b/src/lib/assets/layouts/m4g.yml @@ -0,0 +1,37 @@ +name: M4G +col: + # Ring / Middle + - offset: [2, 0] + row: + - switch: { d: 25, e: 26, n: 27, w: 28, s: 29 } + - switch: { d: 20, e: 21, n: 22, w: 23, s: 24 } + - offset: [4, 0] + switch: { d: 65, w: 66, n: 67, e: 68, s: 69 } + - switch: { d: 70, w: 71, n: 72, e: 73, s: 74 } + - offset: [2, 0] + row: + - switch: { d: 40, e: 41, n: 42, w: 43, s: 44 } + - switch: { d: 35, e: 36, n: 37, w: 38, s: 39 } + - offset: [4, 0] + switch: { d: 80, w: 81, n: 82, e: 83, s: 84 } + - switch: { d: 85, w: 86, n: 87, e: 88, s: 89 } + # Pinkie / Index + - offset: [0, -3] + row: + - switch: { d: 30, e: 31, n: 32, w: 33, s: 34 } + - offset: [4, 0] + switch: { d: 15, e: 16, n: 17, w: 18, s: 19 } + - switch: { d: 60, w: 61, n: 62, e: 63, s: 64 } + - offset: [4, 0] + switch: { d: 75, w: 76, n: 77, e: 78, s: 79 } + # Thumbs + - row: + - offset: [5.5, 0.5] + switch: { d: 10, e: 11, n: 12, w: 13, s: 14 } + - offset: [1, 0.5] + switch: { d: 55, w: 56, n: 57, e: 58, s: 59 } + - row: + - offset: [4.5, -0.25] + switch: { d: 5, e: 6, n: 7, w: 8, s: 9 } + - offset: [3, -0.25] + switch: { d: 50, w: 51, n: 52, e: 53, s: 54 } diff --git a/src/lib/components/layout/Layout.svelte b/src/lib/components/layout/Layout.svelte index 91a726cd..2831bc22 100644 --- a/src/lib/components/layout/Layout.svelte +++ b/src/lib/components/layout/Layout.svelte @@ -33,6 +33,10 @@ import("$lib/assets/layouts/generic/103-key.yml").then( (it) => it.default as VisualLayout, ), + M4G: () => + import("$lib/assets/layouts/m4g.yml").then( + (it) => it.default as VisualLayout, + ), }; diff --git a/src/lib/serial/device.ts b/src/lib/serial/device.ts index 2bb5e03c..57655c5a 100644 --- a/src/lib/serial/device.ts +++ b/src/lib/serial/device.ts @@ -16,6 +16,7 @@ const PORT_FILTERS: Map = new Map([ ["LITE S2", { usbProductId: 33070, usbVendorId: 12346 }], ["LITE M0", { usbProductId: 32796, usbVendorId: 9114 }], ["X", { usbProductId: 33163, usbVendorId: 12346 }], + ["M4G S3", { usbProductId: 0x1001, usbVendorId: 0x303a }], ]); const KEY_COUNTS = { @@ -23,6 +24,7 @@ const KEY_COUNTS = { TWO: 90, LITE: 67, X: 256, + M4G: 90, } as const; if ( @@ -88,8 +90,8 @@ export class CharaDevice { private suspendDebounceId?: number; version!: SemVer; - company!: "CHARACHORDER"; - device!: "ONE" | "TWO" | "LITE" | "X"; + company!: "CHARACHORDER" | "FORGE"; + device!: "ONE" | "TWO" | "LITE" | "X" | "M4G"; chipset!: "M0" | "S2" | "S3"; keyCount!: 90 | 67 | 256; @@ -126,9 +128,9 @@ export class CharaDevice { await this.send(1, "VERSION").then(([version]) => version), ); const [company, device, chipset] = await this.send(3, "ID"); - this.company = company as "CHARACHORDER"; - this.device = device as "ONE" | "TWO" | "LITE" | "X"; - this.chipset = chipset as "M0" | "S2" | "S3"; + this.company = company as typeof this.company; + this.device = device as typeof this.device; + this.chipset = chipset as typeof this.chipset; this.keyCount = KEY_COUNTS[this.device]; } catch (e) { alert(e);