Skip to content

feat(lizard): trackpad haptics, and no controller announce in pure Lizard - #24

Merged
ripps818 merged 4 commits into
mainfrom
feat/lizard-pad-haptics
Oct 14, 2026
Merged

ripps818 merged 4 commits into
mainfrom
feat/lizard-pad-haptics

Conversation

@ripps818

Copy link
Copy Markdown
Owner

What

  • Lizard trackpad haptics. New settings for Lizard mode: On / Clicks only / Off, click strength, tick spacing, tick strength. Stored in the config tail, set from a new card in the panel (fields 156..159, 0xAE payload offset 48), and included in the panel's backup/clone.
  • Haptics died after a few clicks. An SDL3 program on the host (its Steam driver) writes id9 = 0 (lizard off) every 3 s while it holds the puck open as a joystick. The puck relayed it, the controller's pad layer switched off, and the haptics stopped. Two changes:
    • filterSettingsRelay drops the host's id9 write in pure Lizard.
    • Pure Lizard no longer pushes 0x79/0x7B/0x43 "controller connected" reports, so SDL never opens a joystick and never sends the heartbeat at all.

Checked

  • Hardware, debug build: ticks and clicks keep working past 3 clicks. Capture over 75 s of clicking: 0 host writes, 0 0x79 pushes (before: one write every 3 s).
  • Host tests: tests/type_haptics, tests/lizard_stick, new tests/settings_filter.
  • Not run locally: the panel jsdom tests.

Trade-off

Steam will not list the puck as a controller in Lizard mode. The controller's own battery report is still forwarded.

🤖 Generated with Claude Code

ripps818 and others added 4 commits October 13, 2026 22:46
Lizard mode now steers the trackpad haptics like the emulated types,
with its own settings: Trackpad haptics (On / Clicks only / Off), click
strength, tick spacing and tick strength. On is the default, so the
controller's own ticks and clicks play as before; Clicks only has the
puck pulse each click at the chosen strength. Lizard keeps the IMU mode
the controller has, and Steam mode's lizard still leaves the pads to
Steam.

Protocol v30 (unreleased, no bump): WebUSB fields 156..159, read back in
the 0xAE frame's spare bytes p[50..53] since the status blob is full;
the config file keeps them in a new tail field, so an older cfg.bin
loads with the defaults. The panel adds a Trackpad feedback card to the
Lizard tab, and backups carry the four values.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A capture from a puck in Lizard mode showed the host writing the lizard
setting (id9=0) to the puck every ~3 s, and the puck relaying each one to
the controller. id9 is the switch behind the controller's own trackpad
ticks and clicks, and pure Lizard lands it once per connect, so the first
host write after connecting switched the trackpad haptics off for good:
a few clicks felt, then nothing.

In pure Lizard the puck now drops the host's id9 writes instead of
relaying them (Steam mode still relays them; Steam owns the controller
there). The IMU filter next to it is unchanged. Adds a host test.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
SDL's Steam driver only opens a joystick, and starts its 3 s lizard-off
heartbeat, once it sees a 0x79 connect push. Pure Lizard needs none of
the 0x79/0x7B/0x43 pushes.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@ripps818
ripps818 merged commit 46b9258 into main Oct 14, 2026
3 checks passed
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