Skip to content

fix(hid): add StreamDeck+ udev rule + correct HID migration default#3493

Merged
jensenpat merged 1 commit into
aethersdr:mainfrom
motoham88:fix/StreamDeck-Comms-Missing
Jun 9, 2026
Merged

fix(hid): add StreamDeck+ udev rule + correct HID migration default#3493
jensenpat merged 1 commit into
aethersdr:mainfrom
motoham88:fix/StreamDeck-Comms-Missing

Conversation

@motoham88

Copy link
Copy Markdown
Contributor

Summary

Two root causes for the StreamDeck+ going dark after the v26.6 opt-in gate (#3258):

  • Missing udev rule (Linux): 60-hid-encoders.rules had no entry for the StreamDeck+ (0fd9:0084). Without it hidraw is root-only on Linux, so hid_open() fails silently — the device appears in the Serial panel but never powers up.
  • Wrong migration default: The v1 migration reads HidEncoderAutoDetect with a fallback of "False", but the old code treated the key's absence as "True" (implicit default, line 8029). Users who never explicitly set that key had HID working via the old always-on path, but the migration silently wrote HidEncoderEnabled=False for them. A V2 one-shot migration now detects and corrects those installs.

Test plan

  • Plug in StreamDeck+ on Linux, reload udev rules, confirm device connects without root
  • On a fresh/affected install, verify HidEncoderEnabled flips to True on startup (Preferences → Serial checkbox)
  • Confirm RC-28, PowerMate, ShuttleXpress still work (their udev entries untouched)
  • Confirm macOS is unaffected (no udev involved; migration logic is platform-agnostic)

Fixes regression introduced by #3258.

🤖 Generated with Claude Code

…-enables on upgrade (aethersdr#3257)

Two root causes for StreamDeck+ going dark after the v26.6 opt-in gate (aethersdr#3258):

1. packaging/linux/60-hid-encoders.rules was missing the StreamDeck+ entry
   (0fd9:0084). Without it hidraw is root-only on Linux, so hid_open() fails
   silently and the device never initialises.

2. The v1 migration in MainWindow read HidEncoderAutoDetect with default "False",
   but the old code treated the key's *absence* as True (implicit default on
   line 8029). Users who never touched that setting had HID implicitly on, yet
   the migration wrote HidEncoderEnabled=False for them. V2 migration detects
   and corrects installs that were already written with the wrong default.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@motoham88 motoham88 requested a review from a team as a code owner June 9, 2026 18:21

@aethersdr-agent aethersdr-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the tight, well-diagnosed fix @motoham88. The two changes hang together cleanly and the root-cause analysis matches what's in the tree:

  • udev rule: 0fd9:0084 for the StreamDeck+ follows the existing pattern in 60-hid-encoders.rules — looks good.
  • V1 default flip: The new "True" fallback at MainWindow.cpp:4485 matches the implicit default used elsewhere — MainWindow.cpp:8029 also reads HidEncoderAutoDetect with a "True" fallback, so this aligns the migration with the historical truth. Comment is helpful.
  • V2 one-shot: Gated on HidEncoderEnabledMigrationV2 and only flips when both HidEncoderEnabled == "False" AND HidEncoderAutoDetect is absent — narrow enough to target only the buggy-migration cohort.

One non-blocking thing to consider

The V2 migration cannot distinguish "this user was bitten by the buggy V1" from "this user explicitly turned HID off in Preferences after the broken migration ran". Both states look identical: HidEncoderEnabled=False, HidEncoderAutoDetect absent. Users in the second bucket will silently get HID flipped back on once and have to toggle it off again.

Probably acceptable given (a) it's a one-shot, (b) the Preferences toggle is right there, and (c) the alternative — leaving affected users dark — is worse. Worth a sentence in the release notes if any of those silent-flip users are likely.

Other checks

  • AppSettings (not QSettings) ✓
  • No null/leak risk, conventional C++20 ✓
  • macOS unaffected as you noted (no udev), migration is platform-agnostic ✓
  • All CI green on 18a96e0

Nice catch on tying the StreamDeck+ symptom to two distinct root causes — the udev miss would have left the device dark on Linux even after fixing the migration.


🤖 aethersdr-agent · cost: $8.2160 · model: claude-opus-4-7

@jensenpat jensenpat left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — clean two-part root-cause fix. CI green, aethersdr-agent review positive. Approving as maintainer.

@jensenpat jensenpat merged commit 84e9285 into aethersdr:main Jun 9, 2026
6 checks passed
G6PWY-Chris pushed a commit to G6PWY-Chris/AetherSDR that referenced this pull request Jun 22, 2026
…-enables on upgrade (aethersdr#3493)

Two root causes for StreamDeck+ going dark after the v26.6 opt-in gate (aethersdr#3258):

1. packaging/linux/60-hid-encoders.rules was missing the StreamDeck+ entry
   (0fd9:0084). Without it hidraw is root-only on Linux, so hid_open() fails
   silently and the device never initialises.

2. The v1 migration in MainWindow read HidEncoderAutoDetect with default "False",
   but the old code treated the key's *absence* as True (implicit default on
   line 8029). Users who never touched that setting had HID implicitly on, yet
   the migration wrote HidEncoderEnabled=False for them. V2 migration detects
   and corrects installs that were already written with the wrong default.

Squashed-from: aethersdr#3493

Co-authored-by: Tony KX3H <276457091+motoham88@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: jensenpat <patjensen@gmail.com>
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