14 Commits
Author SHA1 Message Date
Robin Anderson 9a0d044d3c Let leg knocks in a pair land up to 6 cm apart
Two knocks on a leg spread wider than two knocks on a desk. In a run of
about 40 leg doubles, 7 pairs landed 3.5 to 8.3 cm apart, and the 3 cm
same-spot rule dropped them. At 6 cm, 25 doubles count instead of 20.
play, noise, and straps still give no actions at twice that distance.

tests/data/leg-doubles.csv.gz holds that run.
2026-10-16 19:42:32 -04:00
Robin Anderson e01afc9833 Count knocks on a leg as surface knocks
Knocks on a leg come in faster than knocks on a desk. Most right-hand
leg knocks moved faster than 1.8 m/s 30 ms before the spike, so the
detector threw them out as arm swings. Surface knocks now get their own
limit of 2.2 m/s. Together and headset knocks keep 1.8 m/s, because at
2.2 m/s a together calibration counted one knock in the noise recording.

tests/data/leg.csv.gz holds doubles and triples knocked on a leg with
each hand, headset worn. It gives 16 actions at 2.2 m/s and 9 at 1.8 m/s.
2026-10-16 19:32:42 -04:00
Robin Anderson a8a1e50f00 Share the test check helper in tests/check.hpp
Three test programs each defined the same check() and failure count.
update_test now prints the same summary as the other two.
2026-10-16 15:54:26 -04:00
Robin Anderson 56833d5671 Remove the docs folder and CLAUDE.md from the repo
docs/calibration-plan.md was a working plan for local branches, and
docs/knock-signal.md was the tuning log. Both stay in git history.
The README and two code comments no longer point at them.

CLAUDE.md is now in .gitignore, so it stays as a local file only.
2026-10-16 15:17:09 -04:00
Robin Anderson e74c296156 Raise the together calibration floor to 30 m/s^2
Fitting the controller straps in Into the Radius 2 bumped the controllers
together 19 times in 5 s. With a together calibration at the old floor of
20, the first two bumps turned passthrough on. At 30, the strap recording
gives no action, and the calibrated replays keep 19 together doubles.

Saved calibrations load with the current floor, so existing files with a
together threshold of 20 get 30 too. tests/data/straps.csv.gz must give
no action at the defaults and with that calibration.
2026-10-16 12:48:47 -04:00
Robin Anderson b3f8928155 Record knocks for a bug report
Record knocks on the report card records 20 s of headset and controller
motion in the tests/data CSV format, gzips it to
~/knockthru-knocks.csv.gz, and adds the knocks and actions heard to the
report. The phone page then offers the recording as a download to
attach to the issue.

detector_test FILE replays any recording and prints every knock and
action, for triaging a report.
2026-10-15 22:10:19 -04:00
Robin Anderson 8353df585b Call every knock a knock
The panel said "tap" for headset knocks and the docs said "hits" in
places. Everything now says knock, including the headset spike
threshold, renamed from tap_peak to headset_knock_peak.
2026-10-15 19:25:32 -04:00
Robin Anderson 8dd6bd3927 Drop the sensitivity step and go straight to trying the knocks
The slider earned little in testing. Its middle and most sensitive ends
gave nearly the same replay results, and its least sensitive end only
lost real knocks. The walkthrough is now four steps: pick, learn,
record, and try. Recording goes straight to the try step, with the
approach threshold fixed at 55 percent of the second slowest knock,
and a miss offers Record again.
2026-10-15 18:54:26 -04:00
Robin Anderson f2fcce5893 Ignore knocks right after Start and let Less drop weak knocks
On the Frame, the hand coming down from pressing Start counted as a
knock 1 s in. Recording now opens with a 1.5 s Get ready ring, and
knocks during it do not count.

The sensitivity range sat below every recorded knock, so moving the
line changed nothing on the chart. The least sensitive end is now the
speed a quarter of the way up from the slowest recorded knock, so
dragging toward Less greys out the weakest ones. Middle and More are
unchanged. Replays at Less keep 14 to 17 of the real doubles, with no
false or wrong actions.
2026-10-15 18:47:28 -04:00
Robin Anderson 55a927bf51 Make the sensitivity step foolproof and polish the calibration screens
The sensitivity chart is logarithmic from a quarter to two and a half
times the second slowest knock, so the scale is the same height for
everyone. Bars stay under the heading. Knocks too light to count at any
sensitivity are turned away while recording with a hint, so every bar
on the chart can count.

The pick cards fill the panel, recording bars are blue like counted
knocks on the chart, the chart heading says All when every knock
counts, and the try step goes Back by name.
2026-10-15 18:40:52 -04:00
Robin Anderson 8b70acea03 Calibrate an approach-speed threshold and drag it on the knock chart
Each calibrated kind now saves a spike threshold and an approach
threshold, with the slider position and the recorded knocks. A sequence
needs its fastest knock to reach the approach threshold. Slow knocks
still join their sequence, so clapping runs stay rejected. Together and
headset knocks get separate spike thresholds. Older calibration files
load with their shared threshold as before.

The sensitivity step charts approach speeds, and the threshold line is
the control: a press anywhere on the chart drags it, and it clicks into
Less, Middle, and More notches. A new test calibrates each kind on its
recording and replays every recording at each notch, with no false
actions and no wrong actions in mixed.
2026-10-15 18:27:48 -04:00
Robin Anderson 8852ac7e05 Count the fastest knock in each burst while calibrating
Starting a hard swing from rest spiked about 0.1 s before the knock, and
that spike took the count and blocked the real knock, so hard knocks
showed small bars. A slow hand movement also counted. Knocks less than
0.25 s apart now form a burst that stands for its fastest-approaching
knock, which must approach at 0.25 m/s or faster. Only surface knocks
need a still controller before the swing.

The app logs every knock heard while calibrating, and the panel's frame
gaps, render times, and upload times.
2026-10-15 16:29:39 -04:00
Robin Anderson 26dc163158 Count only deliberate knocks while calibrating
Calibration lowers the thresholds, so waving the controllers or getting
ready to knock counted about one knock a second in the play and noise
recordings. A calibration knock now needs 0.6 s without another knock
before it, and a nearly still controller before its swing. That leaves
2 knocks in the 90 s of play and noise, and every knock recording still
gives 10 of 10. Knocks of another kind only show the hint when they are
deliberate too.
2026-10-15 16:15:15 -04:00
Robin Anderson 4a002fb8ed Add KnockThru: double knock toggles Steam Frame passthrough
A SteamVR overlay app for the Steam Frame. A double knock (controllers
together, a controller on a surface, or a tap on the headset) turns Room
View on or off. A triple knock switches translucent and opaque.

Includes the knock detector with replay tests on recorded poses, the
debug port client for the Room View button, per-game blocklist,
calibration, haptics, install and autostart, and FrameDrop packaging.
2026-10-15 13:18:08 -04:00