Skip to content

feat: support the MCHOSE V9 Pro headset - #28

Merged
PyFlat-JR merged 4 commits into
mainfrom
feature/mchose-v9-pro
Oct 15, 2026
Merged

PyFlat-JR merged 4 commits into
mainfrom
feature/mchose-v9-pro

Conversation

@PyFlat-JR

@PyFlat-JR PyFlat-JR commented Oct 15, 2026 •

Copy link
Copy Markdown
Member

What does this PR do?

Adds the MCHOSE V9 Pro wireless headset (2.4 GHz dongle 291D:385D) as a new HID brand. Closes #24.

  • Protocol: Sources/Mchose/MchoseProtocol.cs writes 55 65 01 on the vendor collection FF90:0001 (64-byte reports), which is the request the MCHOSE app sends. The dongle answers 55 65 with the level in byte 2 and the state in byte 3 within about 25 ms. It doesn't need the MCHOSE app to be running.
  • States:
    • 0x02 is on battery and shows the level, which moves in 10% steps.
    • 0x00 (the query's answer while the cable is in) and 0x03 (the frame the dongle pushes while charging) both read as Charging with no percent, as on Rapoo and AULA. With the cable in, the level stays frozen at its value from when the cable went in, through to full, so showing it would be misleading. Charging and full can't be told apart.
  • Headset off: a switched-off headset leaves the query unanswered, so the read times out and the plugin keeps the last value. The 00 1A frame the dongle pushes when the headset goes off throws instead of publishing 0%.
  • Reply matching: the 55 11 02 frame pushed when the headset connects is rejected.
  • Tests: MchoseProtocolTests parse the frames the owner captured: on battery, the cable states, off, and the connect frame. A new [Explicit] hardware test, Reads_the_raw_mchose_battery_report, prints the raw reply with a timestamp. That is what mapped the 0x00 cable state.
  • Linux: a udev line for 291d:385d in packaging/linux/70-device-battery-info.rules, plus its copy in docs/linux-setup.md.
  • Docs: a README supported-devices row ("10% steps"), the brand lists, and an AGENTS.md paragraph on the protocol.

Checklist

  • I have read AGENTS.md and CONTRIBUTING.md.
  • dotnet build and dotnet test pass locally (0 warnings, 321 tests).
  • I updated README.md / AGENTS.md if this changes what they describe.
  • If this touches a device backend: I tested it against the real hardware (see below).

Device/hardware tested against (if applicable)

The headset's owner (@Don-AriOn) tested it in #24 on Windows with the V9 Pro and its dongle:

  • The hardware tests on this branch, with the MCHOSE app closed: 90% Discharging on battery; the raw reply over more than two hours of charging (0x00, level frozen at 90, through to full); right after unplugging; and switched off (no answer, as expected).
  • The packed plugin in Macro Deck 3: the widget shows the level on battery, charging with -- on the cable, and "no signal" when the headset is off, recovering when it is switched back on.

🤖 Generated with Claude Code

@PyFlat-JR
PyFlat-JR merged commit 34e3eb0 into main Oct 15, 2026
3 checks passed
@PyFlat-JR
PyFlat-JR deleted the feature/mchose-v9-pro branch October 15, 2026 22:08
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.

[Device Request]: Add support for MCHOSE V9 Pro Wireless Headset (2.4 GHz)

1 participant