Markers/badges -> detection -> cross-view triangulation -> track ribbons + follow-a-friend + LED badge hardware kit. Coordinator-merges policy this phase. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2.8 KiB
2.8 KiB
Lane K — LED badges & bench kit (M23 firmware+docs, M24 self-test)
You build the wearable side: badge firmware speaking the frozen blink protocol, the hardware
guide, and the bench self-test John runs before a shoot. Spec: 30-phase6.md M23/M24 +
contract #4. Branch lane/k-badges, own worktree.
M23 — firmware + docs, the parts that bite
- Contract #4 is FROZEN: 133 ms bit,
11100preamble + 6-bit ID + even parity, continuous repeat, ID 63 = sync beacon. Keep the constants in ONE header (hardware/badge/protocol.h) shared by badge.ino and beacon.ino; document the manual-sync rule withtracker_detect.py's decoder constants (can't import across languages — state both locations in the header comment and in docs/hardware.md). - badge.ino: plain Arduino APIs (millis()-paced, no delay()-drift), single bright LED on a
PWM pin OR a WS2812 (compile-time #define), ID set by #define (document per-badge flashing).
Hardware is never ideal on paper: expose a
BIT_TRIM_UScalibration knob for clock drift. - beacon.ino: ID 63, double LED brightness/size guidance.
- docs/hardware.md: parts list with rough prices (ESP32 dev board / ATtiny85, LED + resistor
or WS2812, LiPo/coin cell, diffuser ping-pong ball), wiring, flashing (
arduino-clicommands), wearing guidance (chest/hat, diffusion, one badge per person, ≥24 fps cameras, exposure caveat: blown-out video kills OOK contrast). - Compile check:
arduino-cli compile --fqbn esp32:esp32:esp32(and attiny if the core is installable). If arduino-cli isn't available in your environment, document the exact commands and mark the box unverified — do NOT claim compiled without output.
M24 — bench self-test, the parts that bite
scripts/badge_selftest.pymust run lane H's REAL decoder (tracker_detectblink path) — import it, don't re-implement; if lane H hasn't merged yet, code against the frozen contract #3/#4 shapes and mark the integration box pending (integration3 re-runs it).--syntheticmode: render a small blinking clip using the fixture's marker-rendering helpers (foundation3 exposes them in synthetic.py) and assert the ID round-trips.- Clear, John-readable failure messages: no blob found / decoded wrong ID / clip too short (< 1 word). Exit codes: 0 ok, 1 decode-fail, 2 usage.
Acceptance (evidence in plan/status/lane-K.md)
- protocol.h constants byte-identical to contract #4; badge + beacon sketches compile (output pasted) or compile commands documented + marked unverified
- docs/hardware.md complete enough that John can order parts from it
uv run python scripts/badge_selftest.py --syntheticdecodes the rendered ID (test_badge_selftest.pycovers it); failure paths print actionable text- Backend suite green;
npmuntouched