Skip to content

Add support for Nyxi Hyperion 3 and dual-controller latency fix - #19

Draft
SWeav02 wants to merge 7 commits into
JoeGeC:mainfrom
SWeav02:nyxi
Draft

SWeav02 wants to merge 7 commits into
JoeGeC:mainfrom
SWeav02:nyxi

Conversation

@SWeav02

@SWeav02 SWeav02 commented Sep 19, 2026

Copy link
Copy Markdown

Hello, and love the project! I just got the Nyxi hyperion 3 controller and thought it would be easy to connect to my galaxy tab A9. Turns out it wasn't, so I spent a while googling and stumbled upon this project. I tried connecting but determined that the controller was sending some data that probably didn't match well with the true Joycon 2. I have never touched kotlin, java, or android apps in general, but I thought I might see if I could get it working. I had a gemini agent help with the coding and manually mapped each button to its corresponding byte packet. I also had some latency issues from one controller when in two handed mode and tracked that down to android setting the first controller to a lower priority when the second connected.

Here is the slightly edited overview from the agent on the changes made. If the PR isn't up to standard or needs to be split up let me know. Additionally, if this doesn't seem in line with your vision for the project or you just don't like it I will take no offense. Thanks for the repo, and I hope the project continues to go well!

Overview of Changes

  1. Nyxi Hyperion 3 (NJ22) Controller Support:
  • Input Report Parsing ( PacketParser.kt): Implemented isNyxiFormat and parseNyxiFormat to reverse-engineer and decode input report packets (status 0x14/0x18)
  • Service & Characteristic Discovery ( JoyconConnection.kt): Added support for custom KeyLinker/Espressif GATT service UUIDs (d7f010e0...) and notification characteristic d5a9e01e-2ffc-4cca-b20c-8b67142bf442.
  1. Duplicate Connection Filtering ( BleScanner.kt):
  • Restricts BLE scanning to the Nintendo gameplay advertisement record (0x0553), ignoring duplicate KeyLinker management advertisements (0x6c42 / 0x0442) and preventing OS pairing prompts.
  1. Dual-Controller High-Priority Latency Fix ( ConnectionPool.kt,  Joycon2Manager.kt,  JoyconConnection.kt):
  • Set highPriority default to true across Joycon2Manager and ConnectionPool.
  • Added post-initialization priority re-assertion tasks when new controllers join the pool. This prevents Android's Bluetooth stack from demoting earlier connected controllers (e.g. Left) to low-power/200ms intervals when a second controller (Right) connects, ensuring sub-15ms low-latency streaming for both devices simultaneously.
  1. Konsist Architecture Test Fix ( ArchitectureTest.kt):
  • Updated file path checking to normalize Windows backslashes () for cross-platform Konsist test execution.

Protocol & Code Guidelines Compliance

  • Minimal Touch: Unrelated files ( JoyconScreen.kt,  JoyconConnectionState.kt, etc.) were left completely clean without unnecessary edits.
  • Protocol Documentation: Detailed comments explain hardware byte layouts, bitmasks, 12-bit stick decoding, and D-Pad hat switch values according to  CLAUDE.md guidelines.
  • CI & Konsist Checks: Verified green via ./gradlew :app:assembleDebug :konsist:test.

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.

1 participant