feat(booth): blink the Entry/Exit lights on radar presence (mirror relay 3)
The on-screen Hyrje/Dalje barrier lights were 2-state (green=free / red=busy)
off the camera lane-status only — they couldn't show the radar-only "detected,
not yet confirmed" state that makes the physical button lamp (relay 3) blink.
Now they mirror the lamp's 3-state rule per lane:
radar present + camera not busy → BLINK green↔red (~1 Hz)
camera busy → SOLID red
otherwise → SOLID green
End-to-end:
- LanePresence (lane-presence.ts): subscribes to deviceEvents.onInput, resolves
each presence edge to its lane via the new direction-agnostic presenceLaneOf()
(device-resolve.ts) — entry AND exit, unlike the entry-gated relayForPresence
the one-car-one-ticket gate uses — and emits a lane-presence {entry,exit} bus
event on change. Wired in server.ts (start + onClose).
- WS forwards it (hello snapshot + push) into live-store.radar.
- BarrierLight (BoothScreen.tsx) is now 3-state; blinks via the .lane-blink
keyframe (index.css), which holds solid-red under prefers-reduced-motion.
Same input + same rule as the lamp, so the screen and the post never disagree.
A new test (lane-presence.test.ts) caught a real bug: the first cut reused
relayForPresence, so the EXIT lane never resolved (it's entry-gated) and never
blinked — presenceLaneOf fixes it. Covers entry/exit independence, de-dupe
across several radars on one lane, and ignoring non-presence inputs.
Full workspace build/lint/test green (185 server tests). Updated the
button-light-indicator wiki page ("On-screen twin").
Claude-Session: https://claude.ai/code/session_01Xcm6ikLgGoCxxHrxtjkk5V
This commit is contained in:
+16
@@ -1794,3 +1794,19 @@ resolution + legacy-fallback identical + exit-radar resolves to the exit relay),
|
||||
case in `button-light.test.ts`, `activeLowFrom` cases in the dingtian suite. Full workspace
|
||||
`build lint test` green. Updated [[entry-double-press]], [[button-light-indicator]], [[dingtian-relay]],
|
||||
memory `access-direction-is-per-relay`.
|
||||
|
||||
## [2026-06-28] feat | Booth Entry/Exit lights blink on radar presence (mirror relay 3)
|
||||
The on-screen Hyrje/Dalje barrier lights were 2-state (green=free / red=busy) off the camera
|
||||
lane-status only — they couldn't show the radar-only "detected, not yet confirmed" state that makes
|
||||
the physical button lamp (relay 3) blink. Added that signal end-to-end: a small server tracker
|
||||
**`LanePresence`** (lane-presence.ts) subscribes to `deviceEvents.onInput`, resolves each presence
|
||||
edge to its lane via a new **`presenceLaneOf`** (device-resolve.ts) — direction-agnostic (entry AND
|
||||
exit), unlike the entry-gated `relayForPresence` — and emits a `lane-presence {entry,exit}` bus
|
||||
event on change. The WS forwards it (hello snapshot + push) into `live-store.radar`; `BarrierLight`
|
||||
(BoothScreen.tsx) became **3-state**, mirroring relay 3 exactly: radar+camera-free → BLINK green↔red
|
||||
~1 Hz (`.lane-blink` keyframe in index.css, holds solid-red under prefers-reduced-motion);
|
||||
camera-busy → SOLID red; else SOLID green. Same input + same rule as the lamp, so screen and post
|
||||
never disagree. A test (lane-presence.test.ts) caught a real bug: the first cut reused
|
||||
`relayForPresence`, so the EXIT lane never resolved (entry-gated) and never blinked —
|
||||
`presenceLaneOf` fixes it. Full workspace build/lint/test green (185 server tests). Updated
|
||||
[[button-light-indicator]] (new "On-screen twin" section).
|
||||
|
||||
Reference in New Issue
Block a user