Skip to content

fix(logitech): G305 LIGHTSPEED — connect via Nano receiver and hide unsupported controls - #54

Merged
snekxs merged 2 commits into
OpenMouse-Project:devfrom
jazzstack:g305-fixes
Aug 9, 2026
Merged

fix(logitech): G305 LIGHTSPEED — connect via Nano receiver and hide unsupported controls#54
snekxs merged 2 commits into
OpenMouse-Project:devfrom
jazzstack:g305-fixes

Conversation

@jazzstack

@jazzstack jazzstack commented Aug 8, 2026

Copy link
Copy Markdown

Summary

Two fixes make the G305 LIGHTSPEED usable: it never connected before (probing latched onto its receiver's HID++ 1.0 error reply), and once connected it showed gaming-surface / LightForce controls the mouse does not have. Both are verified on hardware.

Fix 1 — device connect

The G305 connects through a Nano Lightspeed receiver (046d:c53f) that was missing from LOGITECH_RECEIVER_PRODUCT_IDS, so device-index probing ran the wrong way around.

  • Root cause: resolveDeviceIndex() probes two HID++ device indexes to learn whether a mouse answers on its own endpoint (0xFF) or through a receiver pairing slot (0x01). For product IDs not on the receiver list it tried 0xFF first. The G305's receiver is a HID++ 1.0 device and answers that probe with a HID++ 1.0 error reply (0x8F, "invalid command") rather than silence. The old probe counted any reply — including an error reply — as "a mouse is here", so OpenMouse locked onto device index 0xFF and every later request failed with "The mouse rejected that setting (HID++ 1.0: invalid command)."
  • Fix: resolveDeviceIndex() now only treats a successful root feature query as proof of a HID++ 2.0 mouse; a receiver's HID++ 1.0 error reply no longer counts as "answered", so probing falls through to the pairing slot and finds the mouse. Only genuine HID++ 2.0 mice answer the root probe successfully, so direct-connect mice (G402, G403 HERO, etc.) are unaffected. Also added 0xc53f (Nano Lightspeed 1.1, G305) and 0xc543 (Lightspeed 1.2) to LOGITECH_RECEIVER_PRODUCT_IDS so the receiver slot is probed first.

Fix 2 — hide surface / LightForce controls the G305 does not have

The G305 exposes Mode Status 0x8090, but only the power-mode half is meaningful: the status1 byte that would carry the gaming-surface and LightForce fields is reserved and reads 0. That decoded as Gaming surface "Auto" and LightForce "Optical" and offered both controls (plus the sensor card).

  • Fix: keyed on the firmware model id 407400000000 (captured from the device's connection diagnostics), added to MODE_STATUS_POWER_ONLY_MODEL_IDS the same way the G309 was handled in ff6e1cd. gamingSurfaceMode and lightforceSwitchMode are now reported null and both cards stay hidden.

Files changed

  • src/devices/logitech/hidpp.ts — strict index probe; receiver PIDs; G305 model id.
  • src/devices/vendors.ts — receiver PIDs for the picker.
  • src/devices/logitech/hidpp.test.ts — G305 mode-status assertion.
  • src/devices/logitech/TESTING.md — receiver identifiers and G305 checklist.

Verification

  • Confirmed on hardware with a G305 LIGHTSPEED (receiver 046d:c53f): connects and reads DPI, polling rate, and battery correctly; gaming-surface, LightForce, and lift-off cards stay hidden.
  • npm run check (build + 197 tests) passes.

@jazzstack jazzstack changed the title fix(logitech): connect G305 LIGHTSPEED receivers by probing slot 0x01 first fix(logitech): G305 LIGHTSPEED — connect via Nano receiver and hide unsupported controls Aug 8, 2026
@jazzstack

Copy link
Copy Markdown
Author

verified on hardware by discord user Gandhi (284314794788519938)

image

@snekxs
snekxs merged commit 19190e9 into OpenMouse-Project:dev Aug 9, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants