OpenPuck Config

nRF52840 Steam Controller 2 puck reimplementation — WebUSB. Chrome/Edge only.

disconnected

If nothing appears in the device picker, the copycat may be busy (quit any app holding it) or needs a replug.

USB mode

Switching reboots the copycat and re-enumerates USB (~2 s). WebUSB works in every mode, including Steam/Lizard with Steam running (Chrome claims the vendor interface; Steam keeps the HID slots). Switch HORIPAD + WebUSB is PC-only.

Off (default): every restart / fresh reconnect boots into Steam mode. On: remembers the last mode you selected.

Back4 + face button chords

Hold all four back paddles (L4+R4+L5+R5) plus a face button to switch mode without the WebUI. A is always Steam. B / X / Y are configurable below (defaults: B=Lizard, X=Xbox, Y=Switch HORIPAD).

Link status

RF link
Battery
—
Signal
—
Slot
—
Delivered
—
New reports
—
Polls/s
—
Loop period
—
Slowest stage
—
Poll period act/want
—
Build (git)
—

Polls/s ≈ 250 expected; it's capped by Loop period (≈4000 µs needed). "Slowest stage" is the loop section eating the most time per iteration.

Manually (re)arm the buzz-clear flood now: replays the haptic re-init at 10 Hz for 30 s (same as pressing Steam). Use it if a buzz shows up right now.
Floods the buzz-clear re-init at 10 Hz for 30 s after every connect — the proven fix for the connect-time stuck buzz. On by default; only turn it off if you're testing. Persists across reboots.
Fires the controller power-off (0x9F "off!", x3) — the same path host-suspend uses. Watch the capture / link status to see if the controller actually disconnects.
Danger: wipes all persistent storage on the copycat — the paired controller bond and every saved setting (mode, chords, back-paddle map, sensitivity). The copycat reboots to factory defaults and you must re-pair the controller. This cannot be undone.

Trackpad mouse (lizard + Xbox)

Right-pad cursor in Steam-mode lizard (Steam closed) and in Xbox mode. Sensitivity is a divisor — lower = faster pointer. Glide = how long the cursor coasts after a flick.

Button mapping

Nintendo layout (affects Xbox & Switch modes)

Back-paddle → button, applied in Xbox & Switch modes.

Capture — host → controller commands

The firmware logs everything from boot into a big RAM ring: Steam's writes (ifN), the frames we transmit to the controller (TX→ctlr), and RF LINK UP/DOWN edges. For the reconnect buzz: trigger it (it appears moments after the puck boots / the controller reconnects), then connect here and click Dump from boot — the trigger is still in the ring. (Only present in a logging build, -DOPK_LOG=1.)

Dump streams the whole ring (oldest→newest) and then keeps live-updating until you press Stop. cmd is the command/report byte, then the raw bytes.