Skip to content

fix(firmware): stop comparing receiver bootloader ids against the manifest - #1225

Merged
jazzstack merged 1 commit into
mainfrom
fix/firmware-receiver-verdict
Oct 25, 2026
Merged

jazzstack merged 1 commit into
mainfrom
fix/firmware-receiver-verdict

Conversation

@jazzstack

@jazzstack jazzstack commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

Problem

Logitech devices paired with a Lightspeed receiver reported a false firmware update: the card showed "v2.0.9 → v4.2.9, update available" for the receiver while Logitech's own PRO X SUPERLIGHT 2 SE page listed the receiver as 4.2.9 and up to date (issue #1111, two screenshots included there).

Root cause

sweepReceiverRegister() reads HID++ register 0xF1 per-MCU over the receiver's own interface and formats the raw payload as x.y.z. Those bytes are per-MCU bootloader identifiers, not app firmware versions — already proven in this repo: a full G HUB flash (14.3.19 → 14.4.20) left them byte-identical, and the first payload byte is literally the MCU index (mcu=1 -> 01 07 02, mcu=2 -> 02 00 09). Despite that documented invariant, FirmwareCard.tsx built a FirmwareDeviceRef around it and ran it through getDfuInfo(). The readout matched the receiver's DFU package entry by interfaceId (c547_dfu@4.2.9), and compareVersions("2.0.9", "4.2.9") < 0 produced the false "update available" verdict, badge, medication-free "Later" dismissal and download button.

Fix

  • The receiver row no longer produces a dfuInfo or any version verdict. The MCU readouts are shown as an informational row, labeled for what they are (fw.receiverMcu: "MCU {mcu} bootloader {value}"), with a note that OpenMouse cannot read the receiver's app firmware version yet so no update check runs for it.
  • The update pill, "available" state, dismissal flow and download button are now driven by the mouse itself only.
  • New strings fw.receiverIdentity and fw.receiverMcu were added to src/i18n/index.ts and all 12 locale files (translated, not English placeholders).

Scope note

WebHID cannot reach the receiver's app firmware version yet (G HUB reads it through its agent service). When an honest source lands, the receiver row can regain a real verdict against the same manifest entries — until then, unknown stays unknown per DESIGN.md.

Checks

  • npm run build ✓
  • npm test — 403 pass ✓
  • npm run size ✓ (CSS 92%, JS 99% of budget)

Fixes #1111

Note

Remove receiver bootloader ID comparison against firmware manifest

  • Removes the receiver firmware update path from FirmwareCard: no more update badges, DFU downloads, or dismissal state for receiver MCUs. Update status now depends only on the mouse.
  • The receiver section now shows an informational note that receiver firmware is not checked, plus each receiver MCU's bootloader value. The section is hidden when no MCUs exist.
  • Adds English templates in index.ts and translations for the new messages across all locale files in src/i18n/locales.
  • Behavioral Change: receiver MCUs no longer contribute to available-update calculations in FirmwareCard.tsx, and the receiver DFU row is gone.

Macroscope summarized 8391905.

…ifest

The 0xF1 receiver readout is a per-MCU bootloader identifier (proven
static across a real 14.3.19 -> 14.4.20 app flash), not a firmware
version. FirmwareCard fed it to getDfuInfo() as the current version,
which matched the receiver's DFU package (e.g. c547_dfu@4.2.9) and
reported "v2.0.9 -> v4.2.9, update available" on receivers that are
already current — Logitech's own page lists 4.2.9 as the installed
receiver firmware on the PRO X SUPERLIGHT 2 SE.

The receiver row is now an informational readout (bootloader identity,
labeled as such) and produces no dfuInfo, so the update pill, badge,
dismissal and download actions are driven by the mouse itself only.

Fixes #1111
@github-actions github-actions Bot added type: bug PR title category: bug area: ui Interface and styling area: devices Device integration and HID support area: translations Localized interface strings labels Oct 25, 2026
@jazzstack
jazzstack merged commit 85eaf3f into main Oct 25, 2026
6 of 9 checks passed
@coderabbitai

coderabbitai Bot commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Caution

Review failed

The pull request is closed.

Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@jazzstack
jazzstack deleted the fix/firmware-receiver-verdict branch October 25, 2026 17:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: devices Device integration and HID support area: translations Localized interface strings area: ui Interface and styling type: bug PR title category: bug

Projects

None yet

Development

Successfully merging this pull request may close these issues.

showing false firmware update available: Logitech PRO X SUPERLIGHT 2 SE

1 participant