From 737044eeb7a2aaf1208ed9f209ea094a36685cbc Mon Sep 17 00:00:00 2001 From: KoyoNoguchi Date: Mon, 5 Oct 2026 15:41:22 +0900 Subject: [PATCH] =?UTF-8?q?=E7=B2=BE=E5=BA=A6=E5=AE=9F=E9=A8=93=E7=94=A8?= =?UTF-8?q?=E3=82=B9=E3=82=AF=E3=83=AA=E3=83=97=E3=83=88=E3=81=AB=E5=9B=9E?= =?UTF-8?q?=E9=A0=AD=E6=99=82=E9=96=93=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/accuracy_session.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/accuracy_session.py b/src/accuracy_session.py index 0d9b7a4..a0d67eb 100644 --- a/src/accuracy_session.py +++ b/src/accuracy_session.py @@ -205,13 +205,13 @@ class SessionRunner: def __init__( self, plan: Sequence[PlanRow], trials_path: Path, session_id: str, *, baseline_sec: float = 3.0, - hold_sec: float = 5.0, auto_interval: float = 0.0, block_interval: float = 0.0, input_fn: Callable[[str], str] = input, + hold_sec: float = 5.0, turn_grace_sec: float = 3.0, auto_interval: float = 0.0, block_interval: float = 0.0, input_fn: Callable[[str], str] = input, out: Callable[[str], object] = print, sleep: Callable[[float], object] = time.sleep, clock: Callable[[], str] = _now_iso, beep: Callable[[str], object] = _beep, interval_audio: IntervalAudioPlayer | None = None, ) -> None: self.plan, self.trials_path, self.session_id = list(plan), trials_path, session_id - self.baseline_sec, self.hold_sec = baseline_sec, hold_sec + self.baseline_sec, self.hold_sec, self.turn_grace_sec = baseline_sec, hold_sec, turn_grace_sec self.auto_interval, self.block_interval = auto_interval, block_interval self.input_fn, self.out, self.sleep, self.clock, self.beep = input_fn, out, sleep, clock, beep self.interval_audio = interval_audio or IntervalAudioPlayer() @@ -321,7 +321,9 @@ class SessionRunner: self.sleep(self.baseline_sec) t_cue = self.clock() self.beep("turn") - self.out(f" TURN to {_sign(row.true_yaw_deg)} deg (head only) and hold {self.hold_sec:g} s") + self.out(f" TURN to {_sign(row.true_yaw_deg)} deg (head only) — you have {self.turn_grace_sec:g} s to turn") + self.sleep(self.turn_grace_sec) + self.out(f" HOLD {self.hold_sec:g} s") self.sleep(self.hold_sec) t_end = self.clock() self.beep("end") @@ -348,6 +350,7 @@ def _build_parser() -> argparse.ArgumentParser: run.add_argument("--session-id", default=None) run.add_argument("--baseline-sec", type=float, default=3.0) run.add_argument("--hold-sec", type=float, default=5.0) + run.add_argument("--turn-grace-sec", type=float, default=3.0, help="seconds allowed to complete the head turn after the turn cue") run.add_argument("--auto-interval", type=float, default=0.0, help="seconds between trials within a block; 0 = wait for Enter") run.add_argument("--block-interval", type=float, default=0.0, help="seconds to allow moving after Enter at a block change; 0 = no extra wait") run.add_argument("--resume", action="store_true") @@ -373,7 +376,7 @@ def main(argv: Sequence[str] | None = None, out: Callable[[str], object] = print print("--resume needs --trials ", file=sys.stderr) return 2 runner = SessionRunner(read_plan(args.plan), trials, session_id, baseline_sec=args.baseline_sec, - hold_sec=args.hold_sec, auto_interval=args.auto_interval, + hold_sec=args.hold_sec, turn_grace_sec=args.turn_grace_sec, auto_interval=args.auto_interval, block_interval=args.block_interval) return runner.run(resume=args.resume)