Settings has a Knock actions screen with Knock twice and Knock thrice
side by side. Each lists four actions, and one press picks one: switch
passthrough, switch the style, show or hide SteamVR's performance graph,
or do nothing. The defaults stay the same, and the lists mark them with
(default).
config.json stores the actions under knock_actions, keyed by kind and
count, so each kind of knock can have its own actions and a new count
needs no format change. The screen sets every kind the same. The
performance graph is the SteamVR setting perfcheck.perfGraphInHMD. The
tour still teaches the default actions.
Settings is down to five rows. The classic_bar_icon key in config.json
still works, so anyone who turned it on keeps the colored icon.
The calibrate, update, and report GIFs in the README show the new
Settings screen.
The version defaults in CMakeLists.txt, build-arm64.sh, and package.mjs
say 1.0.0, and so do the README's manual install and build examples.
The README's update GIF goes from 1.0.0 to 1.1.0, not 0.1.0 to 0.2.0.
A triple knock while passthrough is off switches the style, and
passthrough opens in it next time. The README table and the tour's
triple knock step now say so. The tour title names the style, not Room
View, so one card never calls passthrough by two names.
The README now opens with an animation of the dashboard panel reacting
to knocks, then covers install, how to knock, the dashboard tab, and
troubleshooting in plain words. Settings, SSH calibration, commands,
manual install, and build move into collapsed sections at the bottom.
scripts/readme_media.py makes the images: the hero and dashboard images
come from the real panel code through panel_preview --readme, and the
knock kinds and timing animations are drawn with Pillow. ffmpeg writes
the GIFs.
Installing an update fills the Install button with a progress bar,
driven by the ZIP's size against its Content-Length. When the install
finishes, a blue Restart button starts the new version. After the
restart, a card names the new and old versions. A failed install or a
missed restart shows a card with the reason.
A pending update marks the Settings button and the Settings header with
Steam's alert yellow (#FFC82C) and its exclamation mark, taken from the
SettingsAlert icon in Steam's UI on the Frame. The automatic check runs
daily instead of weekly, and retries after an hour when it fails.
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.
state.json remembers the SteamVR version, the date KnockThru first saw
it, and the version before. Each change goes in the log, and the report
shows the history, so a report after a Steam update names the cause.
A minute after start, KnockThru asks GitHub for the latest release if
the last automatic check was a week ago or more. A newer release puts a
dot on the Settings button and Install in the Settings header. Failures
only go in the log. check_updates: false in config.json turns it off.
The report card's QR code now opens a page on the Frame, over the local
Wi-Fi, with the whole report. One button copies it and opens the
prefilled GitHub form, where it goes in the Report box. The page also
offers the report as a download. It needs a random token in the path and
stops when the card closes or after 15 minutes. SteamOS's firewall opens
TCP 1024 to 65535, and the kernel picks the port from that range.
Without a network, the QR code opens the GitHub form directly, as before.
The report card numbers the steps: open the phone camera, scan the code
through a lens, then sign in and press Create. Save report file is a
separate button that keeps the full report on the headset and says it
sends nothing. The issue link also carries the last error KnockThru
showed, in a new last-error field on the bug form.
Report in Settings opens a card with a QR code. A phone held up to a lens
scans it and opens the bug form in .github/ISSUE_TEMPLATE/bug.yml, with
the KnockThru version, SteamVR version, and passthrough status filled in.
The full report still goes to ~/knockthru-report.txt.
Vendors nayuki/QR-Code-generator (MIT) to encode the code.
Settings rows are 92 px so a sixth row fits: Something wrong?, with a
Report button. The update button reads Check for updates, Checking,
Install X.Y.Z, Installing, or Try again.
--update installs the latest GitHub release over the running one and
restarts it. It reads the FrameDrop manifest, checks the ZIP's SHA-256,
and renames each new file over the old one. The resident app has the same
check and install behind CheckUpdate and InstallUpdate, for the panel.
--report writes ~/knockthru-report.txt with the KnockThru and SteamVR
versions, registration state, settings, and the end of both logs.
--uninstall --purge also deletes ~/.config/knockthru and SteamVR's
vrappconfig file for KnockThru.
A missing Room View button now throws DashboardChanged. The passthrough
tile then says a Steam update moved the button, and the log records the
SteamVR version once.
Skip opens a confirm card that says the tour can be replayed from
Settings. The knock steps list only the knock kinds that are on, and
pick-your-knocks says why Next is off when every kind is off. Errors
show in the strip under the buttons, where no step draws. The knock
steps ignore pause and per-game blocks only while the panel shows them.
The tour shows the first time someone opens the KnockThru tab. It walks
through picking knock kinds, calibrating each kind that is on, and a
live double and triple knock that really switch passthrough and style.
Next stays off until a step is complete. Skip ends the tour from any step.
Anyone with an existing config.json or calibration.json skips it.
Settings now holds Calibrate, which moves off the main screen, plus a
Sounds switch, Replay for the tour, and Factory reset. Reset deletes
config.json and calibration.json, keeps application.log, and starts
the tour again.
Recording logs one line with how each knock ended (counted, too soon,
too light, other kind, ignored) instead of a line per knock, and the
panel no longer logs frame timings. Canceling a recording logs the same
summary.
The learn step names the ring it asks people to wait for. The Saved
banner says when the calibrated kind or KnockThru itself is turned off,
since knocks would do nothing until it is back on. The calibration plan
records the current decisions.
The ring started when a knock was confirmed, about 0.3 s after it, and
filled over 1 s, while counting only needed 0.6 s of quiet. So a knock
could count with the ring partway full. The ring now runs from the knock
itself, and a knock before it fills, or during Get ready, shows "Too
soon. Wait for the ring." The surface knock animation turns the
controller to 135 degrees, so it lies flatter with the handle to the
right.
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.
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.
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.
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.
The spike size divides by pose update gaps that vary from 2 to 7 ms. In
the knock recordings, the top tenth of spikes ran 2.8 to 8.3 times the
bottom tenth. The controller's fastest speed in the 100 ms before the
knock ran 1.7 to 2.5 times, so the recording bars use it now.
The panel paints its background once and copies it, which halves the
frame time, and draws 30 times a second while something moves.
Pick a kind, learn the knock, record single knocks, adjust sensitivity
on a notched slider, and try a double knock before saving. The knock
animations port the README timing and draw controllers and the headset
traced from the CAD sprites. The slider's middle notch keeps the old
60 percent rule. The tuning comes in a later change.
The knocks switch is now a KnockThru On/Off card with a larger switch,
tinted with the accent while on, so it no longer looks like the
per-knock switches below it.
A Settings screen holds a "Classic bar icon" switch, saved as
classic_bar_icon. Off, the bar icon is white with half-transparent
accent parts, and Steam's tint turns it grey, and white on hover. On,
it is the same mark in the logo colors, without the tint.
Calibration hints say to knock 10 times, at least 1 second apart, and
to knock as softly as KnockThru should catch. A finished calibration
shows a Saved banner with a Done button.
The dashboard bar shows the thumbnail small, and the dark tile shrank the
mark to about three quarters of it. The bar icon now drops the tile and
fills the canvas. The SteamVR library tile and the panel header keep it.
The tab has a passthrough button, a translucent or opaque switch,
switches to pause knocks, pick knock kinds, and turn knocks off in the
running game, and a calibration screen with step-by-step progress.
The panel draws into an RGBA image with stb_truetype and Noto Sans, and
shows it through two Vulkan textures that take turns. SetOverlayRaw made
the panel flash on every update. Calibration moved into a Calibrator
class shared by the panel and --calibrate. Panel changes write to the
user config.json. SteamVR also gets an app icon.