From d9a88b01e3af49b692a7b21de5483f5e26d9e0ba Mon Sep 17 00:00:00 2001 From: sylph-decoder Date: Wed, 2 Sep 2026 20:02:52 +0000 Subject: [PATCH] tools: F5 probe -- a second A during the title build-in Presses A once to skip the attract video, then again during the build-in, and records the press instant so a press that lands late is reported rather than silently reinterpreted. Blind timing is the weak point: the build-in is ~5 s wide and run pacing has been seen to vary 2x. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t --- tools/re-capture/f5_snap_or_accelerate.sh | 56 +++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100755 tools/re-capture/f5_snap_or_accelerate.sh diff --git a/tools/re-capture/f5_snap_or_accelerate.sh b/tools/re-capture/f5_snap_or_accelerate.sh new file mode 100755 index 00000000..5b54fef9 --- /dev/null +++ b/tools/re-capture/f5_snap_or_accelerate.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash +# F6 unit 2 -- capture the TITLE's build-in and read the sweep's drawn alpha. +# +# Discriminator: pteff03's LEAF declares alpha 255 from its own t=0, while its +# PARENT ramps 0->255 across t=70..100. So in the drawn vertex colour: +# flat 255 throughout => the parent is NOT multiplied in +# a ramp 0->255 => it IS +# That also settles the port's own flagged ambiguity, whose stated separating +# interval (t=100..238) is the same one F6 is about. +# +# Simpler than the menu probe on purpose: ONE A press to skip the attract video, +# then no further input, so the title builds in undisturbed and stays. +set -u +export HOME=/sylph-home/re SDL_AUDIODRIVER=dummy DISPLAY=:98 +export XENIA_PAD_FILE=/tmp/xenia_pad.txt +OUT="${1:-/sylph-home/re/f5}"; mkdir -p "$OUT"; rm -f "$OUT"/xenia_re_ui_draws_*.log +pad(){ printf '%s' "$1" > "$XENIA_PAD_FILE.tmp"; mv "$XENIA_PAD_FILE.tmp" "$XENIA_PAD_FILE"; } +pad "" +( cd "$OUT" && nohup run-canary --log_ui_draws=true \ + --ui_draw_capture_frames=6000 --ui_draw_capture_max=1500000 \ + >"$OUT/canary.stdout" 2>"$OUT/canary.stderr" & ) +sleep 8 +win="$(xdotool search --name "Xenia-canary" | tail -1)" +[ -n "$win" ] || { echo "FATAL: no Xenia window"; pkill -x xenia_canary; exit 1; } +xdotool windowactivate "$win" 2>/dev/null; xdotool key --window "$win" F10; xdotool key F10 +echo "armed at ${SECONDS}s" + +sleep 12; pad "press=A"; sleep 0.4; pad ""; echo "A (skip video) at ${SECONDS}s" + +# ⚠️ ARMING IS NOT CONFIRMED BY SENDING THE KEY. Twice now a probe has printed +# "armed", pressed on, and written no draw log at all -- once because the window +# lookup failed, once with the window found and the key sent. A probe that cannot +# confirm its own instrument is recording is a probe whose negatives mean nothing. +# So: wait for the log to exist AND grow, and abort loudly if it does not. +for _ in $(seq 1 45); do + sz=$(stat -c %s "$OUT"/xenia_re_ui_draws_*.log 2>/dev/null | head -1 || echo 0) + [ "${sz:-0}" -gt 0 ] && break + sleep 1 +done +[ "${sz:-0}" -gt 0 ] || { echo "FATAL: armed but no draw log after 45s -- not recording"; pkill -x xenia_canary; exit 1; } +echo "logging confirmed at ${SECONDS}s (${sz} bytes)" + +# --- F5: a SECOND A during the title build-in --------------------------- +# Discriminator (brief): a snap shows no intermediate alphas, an acceleration +# does. Press 2 must land while the build-in is still running -- after the +# sweep is up (title t>=100) and before the settle (~t=236). Blind timing is +# the weak point, so the press instant is RECORDED and checked post hoc; a +# press that lands late is reported as such, not silently reinterpreted. +PRESS2="${PRESS2_DELAY:-16}" +sleep "$PRESS2" +echo "PRESS2 at ${SECONDS}s (log frame marker below)" +grep -c '^--- frame' "$OUT"/xenia_re_ui_draws_*.log | tail -1 | sed 's/^/frames at press2: /' +pad "press=A"; sleep 0.4; pad "" +sleep 90 +pkill -x xenia_canary +echo "done at ${SECONDS}s"; ls -la "$OUT"/*.log 2>/dev/null