diff --git a/captures/razer-diamondback-chroma/README.md b/captures/razer-diamondback-chroma/README.md new file mode 100644 index 0000000..1ff181f --- /dev/null +++ b/captures/razer-diamondback-chroma/README.md @@ -0,0 +1,17 @@ +# Razer Diamondback Chroma (`1532:004c`) hardware report, 2026-09-30 + +Reporter's own mouse, firmware "Mouse 1.0", wired, Windows. Connected through +OpenMouse Bridge with an unmodified `RazerHidClient`; the Bridge listed seven +HID paths for the device and opened all of them. + +- `hardware-test-2026-09-30.json`: the app's hardware test export. Identity, + firmware, DPI (1800) and polling (500 Hz) read back; 800 DPI and 1000 Hz each + wrote, read back and were restored. Verdict: pass. + +What it does not settle: + +- Polling was read back but not measured: the sampler averaged 305 Hz against + the reported 500 Hz and flagged dropouts, so it skipped rather than failed. +- The DPI stage read (`0x04`/`0x86`) gave nothing usable, so no stage editor + is offered on this model. +- No raw feature reports were captured in this session. diff --git a/captures/razer-diamondback-chroma/hardware-test-2026-09-30.json b/captures/razer-diamondback-chroma/hardware-test-2026-09-30.json new file mode 100644 index 0000000..e010e9d --- /dev/null +++ b/captures/razer-diamondback-chroma/hardware-test-2026-09-30.json @@ -0,0 +1,132 @@ +{ + "device": { + "present": true, + "brand": "Razer", + "name": "Razer Diamondback Chroma", + "vendorId": 5426, + "productId": 76, + "productName": "Razer Diamondback Chroma", + "transport": "bridge", + "connectionType": "Wired", + "pollingRateHz": 500, + "supportedPollingRates": [ + 125, + 500, + 1000 + ], + "dpi": 1800, + "dpiStages": null, + "activeDpiStage": null, + "batteryPercent": null, + "batteryState": "Unknown", + "firmware": [ + "Mouse 1.0" + ], + "liftOffDistance": null, + "driverFamily": "razer", + "deviceMode": null, + "collectionsSummary": "interfaces 0x0001:0x0002, 0x000C:0x0001, 0x0001:0x0006, 0x0001:0x0080, 0x0001:0x0000", + "signalStrength": null, + "receiverOnline": null, + "receiverRfId": null, + "pairingInProgress": false + }, + "results": [ + { + "key": "connection", + "label": "Device connected", + "status": "pass", + "detail": "Connected through OpenMouse Bridge" + }, + { + "key": "interface", + "label": "Control interface", + "status": "pass", + "detail": "interfaces 0x0001:0x0002, 0x000C:0x0001, 0x0001:0x0006, 0x0001:0x0080, 0x0001:0x0000" + }, + { + "key": "identity", + "label": "Device identity", + "status": "pass", + "detail": "Razer Razer Diamondback Chroma" + }, + { + "key": "driver", + "label": "Driver identification", + "status": "pass", + "detail": "Razer razer" + }, + { + "key": "dpi", + "label": "DPI read-back", + "status": "pass", + "detail": "1,800 DPI" + }, + { + "key": "pollingRead", + "label": "Polling rate read-back", + "status": "pass", + "detail": "500 Hz" + }, + { + "key": "battery", + "label": "Battery read-back", + "status": "skip", + "detail": "Not reported by this device." + }, + { + "key": "firmware", + "label": "Firmware read-back", + "status": "pass", + "detail": "Mouse 1.0" + }, + { + "key": "liftOff", + "label": "Lift-off read-back", + "status": "skip", + "detail": "Not reported by this device." + }, + { + "key": "link", + "label": "Wireless link (receiver)", + "status": "skip", + "detail": null + }, + { + "key": "flashRead", + "label": "Flash / EEPROM read-back", + "status": "pass", + "detail": "decoded fields are in range (dpi, polling)" + }, + { + "key": "brandWirelessBattery", + "label": "Razer wireless battery", + "status": "skip", + "detail": null + }, + { + "key": "sampling", + "label": "Polling rate sampling", + "status": "skip", + "detail": "avg 305 Hz vs reported 500 Hz — dropout or rate mismatch detected, so the sample is not counted as a failure." + }, + { + "key": "flashWrite", + "label": "Flash write round-trip", + "status": "pass", + "detail": "wrote 800 DPI → read back → restored 1,800 DPI · wrote 1,000 Hz → read back → restored 500 Hz · Lift-off skipped" + } + ], + "verdict": "pass", + "durationMs": 17802.09999999404, + "runAt": "2026-09-30T21:58:33.335Z", + "build": "BETA · v2.0.58d", + "supportedPage": { + "listed": true, + "status": "likely", + "label": "Test Needed", + "matchedBy": "pid", + "pageModel": "Diamondback Chroma", + "detail": "listed as Test Needed on the supported-devices page — this passing verification supports moving it to Supported." + } +} \ No newline at end of file diff --git a/docs/razer-testing.md b/docs/razer-testing.md index d65c23d..3b32c56 100644 --- a/docs/razer-testing.md +++ b/docs/razer-testing.md @@ -25,6 +25,7 @@ Identifiers verified on hardware: - `1532:00a3` — Cobra, wired (separate driver) - `1532:00b6` — DeathAdder V3 Pro, wired (firmware 2.1) - `1532:00b7` — DeathAdder V3 Pro, stock HyperSpeed receiver (firmware 2.1) +- `1532:004c`: Diamondback Chroma, wired (firmware 1.0, through OpenMouse Bridge) Mouse Dock Pro uses the same 90-byte protocol as the paired mouse. It has no fixed polling list: if the paired mouse answers the extended polling command it diff --git a/src/drivers/razer/devices.test.ts b/src/drivers/razer/devices.test.ts index 02f2eeb..746d3e2 100644 --- a/src/drivers/razer/devices.test.ts +++ b/src/drivers/razer/devices.test.ts @@ -65,6 +65,9 @@ const VERIFIED_SINCE: ReadonlyArray<[number, VerifiedProfile]> = [ // Same mouse over the cable, same session: 13/13 writes persisted, 126 Hz // peak measured at 125, battery reports "Charging". [0x00b6, { model: "DeathAdder V3 Pro (Wired)", wireless: false, maxDpi: 30000, transactionId: RAZER_TRANSACTION_ID, rates: RATES_1K, highRate: false }], + // Diamondback Chroma (firmware 1.0) over the cable through OpenMouse Bridge: + // answers on `0xff`, and DPI and legacy polling each round-tripped. + [0x004c, { model: "Diamondback Chroma", wireless: false, maxDpi: 16000, transactionId: RAZER_TRANSACTION_ID_FF, rates: RATES_1K, highRate: false }], ]; const VERIFIED = [...REFACTOR_BASELINE, ...VERIFIED_SINCE]; @@ -77,7 +80,7 @@ const VERIFIED = [...REFACTOR_BASELINE, ...VERIFIED_SINCE]; * hardware-tested", so it is pinned like the others without claiming to be * verified. */ -const HARDWARE_VERIFIED: readonly number[] = [0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00c0, 0x00c1, 0x00b8, 0x00b7, 0x00b6]; +const HARDWARE_VERIFIED: readonly number[] = [0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00c0, 0x00c1, 0x00b8, 0x00b7, 0x00b6, 0x004c]; test("every pinned product keeps exactly the profile it was given", () => { // A silent change to any of these would only show up on hardware, which is diff --git a/src/razer/devices.ts b/src/razer/devices.ts index 8b7fe3c..56b620a 100644 --- a/src/razer/devices.ts +++ b/src/razer/devices.ts @@ -441,7 +441,12 @@ const PRODUCT_DEFINITIONS: ReadonlyArray<[number, Omit