diff --git a/build/check-bundle-size.ts b/build/check-bundle-size.ts index b885f8f0..5d7ce005 100644 --- a/build/check-bundle-size.ts +++ b/build/check-bundle-size.ts @@ -15,8 +15,11 @@ const BUDGET_BYTES: Record = { // fixtures retain their separate allowance below; the measured aggregate // is 573.4 kB with them, plus the ~11 kB Hall of Fame chunk. Raised again // from 590 kB for the Razer button-mapping card and its codec: the measured - // aggregate is 588.2 kB, which left under 2 kB of headroom. - ".js": 600_000, + // aggregate is 588.2 kB, which left under 2 kB of headroom. Raised again to + // 610 kB for the Pulsar XS-1 feature-report driver and 4K receiver support + // (mouse-protocol 3c3a445): the X3 family codec plus the 4K DPI/polling work + // adds ~1.3 kB to the measured aggregate. + ".js": 610_000, }; const ASSETS = join("dist", "assets"); diff --git a/package-lock.json b/package-lock.json index f8768895..793fc8c3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -460,7 +460,8 @@ }, "node_modules/@openmouse/protocol": { "version": "0.1.0", - "resolved": "git+https://github.com/OpenMouse-Project/mouse-protocol.git#6d506506cf3b322846718ae19cfae191c8f6ad66", + "resolved": "git+https://github.com/OpenMouse-Project/mouse-protocol.git#3c3a4452197a57e3f2fed2323012244f3a175986", + "integrity": "sha512-htpO6JBZSdbkx5NUfBaABufH7CXfjqA+C8rx4zGYdjb/FXrb9LE5nt7suuIvt03E8185x2I8dUyg/AjpJKjgvQ==", "engines": { "node": ">=20" } diff --git a/src/device/controller.ts b/src/device/controller.ts index c1cfaf03..d7e94476 100644 --- a/src/device/controller.ts +++ b/src/device/controller.ts @@ -2558,6 +2558,9 @@ export function toggleDongleLed(): void { apply: async () => { const client = pulsarClient(); if (!client) throw new Error("The receiver is no longer connected."); + if (!("setDongleLed" in client)) { + throw new Error("This Pulsar device does not expose a receiver LED control."); + } await client.setDongleLed(enabled); }, }); diff --git a/src/supported-mice.test.ts b/src/supported-mice.test.ts index f7de5319..40c8a0d8 100644 --- a/src/supported-mice.test.ts +++ b/src/supported-mice.test.ts @@ -17,6 +17,7 @@ import { NINJUTSO_RECEIVER_PRODUCT_IDS, } from "@openmouse/protocol/ninjutso"; import { ORBITAL_DEVICES } from "@openmouse/protocol/orbital"; +import { PULSAR_XS1_PRODUCT_IDS } from "@openmouse/protocol/pulsar"; import { RAZER_PRODUCTS } from "@openmouse/protocol/razer-devices"; import { TEEVOLUTION_PRODUCT_IDS } from "@openmouse/protocol/teevolution"; import { ZAUNKOENIG_PRODUCT_IDS } from "@openmouse/protocol/zaunkoenig"; @@ -100,6 +101,8 @@ const PID_UNIVERSE = new Set([ 0x1960, 0x1961, 0x1962, 0x1968, 0x1970, 0x1972, 0x1982, // VGN Dragonfly F2 Master+ (drivers/vgn/hid.ts). 0xfb56, 0xfb57, + // Pulsar X3 family on the Sonix XS-1 feature interface (drivers/pulsar/pulsar-xs1-hid.ts). + ...PULSAR_XS1_PRODUCT_IDS, // Finalmouse ULX dongle (drivers/finalmouse/hid.ts). 0x0100, ]); diff --git a/src/supported-mice.ts b/src/supported-mice.ts index aebb79e2..d53dfa60 100644 --- a/src/supported-mice.ts +++ b/src/supported-mice.ts @@ -407,9 +407,9 @@ export const MICE: Mouse[] = [ note: "Pulsar driver (VID 0x3710) — collection-based detection" }, { brand: "Pulsar", model: "X2 V3 ES Mini", status: "supported", req: 2, note: "Pulsar driver (VID 0x3710) — collection-based detection" }, - { brand: "Pulsar", model: "X3 Medium", status: "likely", req: 1, + { brand: "Pulsar", model: "X3 Medium", status: "supported", req: 1, pids: [0x3409, 0x3410, 0x5402, 0x5403], - note: "XS-1 driver written for PIDs 0x3409/0x3410/0x5402/0x5403 — pending merge + hardware test" }, + note: "XS-1 feature-report driver (usage 0xffff:1) — PIDs pinned in the protocol registry" }, { brand: "Pulsar", model: "X2F", status: "supported", req: 1, note: "Pulsar driver (VID 0x3710) — collection-based detection" },