mirror of
https://github.com/safijari/openpuck.git
synced 2026-11-03 22:30:22 +00:00
[GH-ISSUE #126] Weird slot / HID interface behaviour when using multiple slots #50
Labels
No labels
pull-request
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
safijari/openpuck#50
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @Leseratte10 on GitHub (Jul 5, 2026).
Original GitHub issue: https://github.com/safijari/openpuck/issues/126
During my work on #125 I noticed a bug in OpenPuck.
To reproduce it, set up an OpenPuck where the slots 2, 3 and 4 are all in use by existing pairings and slot 1 is empty.
Now try to pair a controller to the OpenPuck, either through Steam or through the scpair.py script.
Notice that that pairing will fail. scpair.py claims success but the pairing then doesn't show up; Steam shows "Pairing failed (25)".
All the other slots can be written to without issues. Also, this issue does not occur on an original Steam Puck.
@Leseratte10 commented on GitHub (Jul 5, 2026):
(EDIT: There was a spam comment above this one that has since been deleted).
Hey guys, do not click that link, that is malware: https://www.virustotal.com/gui/file/736f0ce6bba9e85b646ea2906b3f1294ffb4074b293fefb036ede0b23702a1a0
@safijari can you remove that comment?
@safijari commented on GitHub (Jul 5, 2026):
This is just a problem with scpair? Or also happens when pairing via Steam?
@Leseratte10 commented on GitHub (Jul 6, 2026):
Yes, the issue also happens with Steam, not just with scpair.
I just tested it again and I believe that there's either a one-off bug in the import/export code in the WebUI, or there's a one-off bug in the pairing / writing slot code in OpenPuck.
I wiped all settings again, then restored a JSON file writing a unique key to each slot (slot 0 has a key starting with 00, slot 1 has a key starting with 01, and so on). Also, I added the slot number in the "serial" / description field.
For reference, this is the (part of the) JSON I imported back into the device; and when I export it again, it looks exactly like that. All four slots used, the slots are labelled "sb-0" through "sb-3", and the first key byte is the slot ID:
However, when I look at the puck with Steam, Steam only shows three slots, one of them isn't just empty, it's totally gone:

Normally, Steam shows all four slots, even if they are empty. I have confirmed that with a real Steam Puck. But for some reason, with this JSON, it only shows three.
And when I check with scpair, it claims that slot 0 is empty and slot 1 contains the slot 0 key:
But there must be something different / odd / corrupted, since if the slot was just empty, Steam would display it as an empty slot.
@Leseratte10 commented on GitHub (Jul 6, 2026):
You can also see that if you wipe an OpenPuck, then check the puck pairings in Steam, it shows three empty slots. If you check the original Valve puck, it shows four empty slots.
Also, if you take an empty Valve Puck and pair a controller through Steam, it'll pair to the 1st slot (id 0) out of 4 according to Steam, and scpuck.py agrees and displays the same.
If you take an empty OpenPuck and pair a controller through Steam, it'll pair to the 1st slot out of 3 (according to Steam), and if I then check the pairings with scpair.py, it displays the pairing in slot id 1 (so, the 2nd slot out of 4) instead of 0.
So this is completely independant of scpair and the WebUI and import/export, something is wrong about how OpenPuck handles these slots.
@Leseratte10 commented on GitHub (Jul 6, 2026):
I just compared the USB Interfaces of the original Valve Puck with the Interfaces of the OpenPuck, and I'm a bit confused.
The original Valve Puck has a CDC Modem (0x81), CDC Data (0x82), four HID devices for the up to four connected controllers (0x83, 0x84, 0x85, 0x86) and then the HID device for dongle status (0x87). Data sent to any of the four controller HID devices will be forwarded to that controller, if connected. (See this page for details)
The OpenPuck, in Steam Mode, has a completely different configuration. A Vendor Specific Class object (0x81), the OpenPuck Wake Mouse (0x82), and then three HID devices (0x83, 0x84, 0x85).
That configuration should make if impossible to ever connect four controllers at a time, as there aren't enough HID devices. And depending on what the last one is used for, maybe even makes it impossible to connect more than two controllers.
Also, CFG_TUD_HID is set to 4 in the Makefile which seems to limit the amount of HID interfaces to 4 - however, the original Steam Puck has five HID interfaces ...
Do you think this could be the possibility for these pairing issues? Is there a reason these interfaces are so different?