Dart lands
1.0 sMinimum detection gap before another dart can register.
Dart trainer · operator guide · v0.9.59
The board is not merely waiting. It is deciding whether motion was a dart, protecting its empty-board reference from changing light, or handing the turn to the next player. This page shows every player-visible timing control on an honest clock.
Every timeline starts at the event named in its title. Vertical grid lines are real seconds. A bar's width therefore means the same thing everywhere on the page.
Minimum detection gap before another dart can register.
One breath lets the arm and new player lighting settle.
Rainbow plus its one-second vision guard.
Up to four clean-board photographs, one second apart.
The white score flash and the detection cooldown begin together, but they protect different things. The flash does not itself block throws; the cooldown does.
flash + 0.3 s. It prevents the lit board
becoming the remembered “empty” board. The separate 1 s cooldown prevents one wobbling dart
from being counted twice.Shorter is a quicker blink; longer gives the score more stage time.
Leave this derived. Setting it below the flash lets lit frames poison the empty reference.
Shorter accepts rapid throws sooner but increases double-count risk. Longer can swallow a genuinely fast next dart.
After a “nothing landed” result, zero returns the unused cooldown immediately. At ≥0.24 s the field regression reappears.
Before v0.9.58, a harmless motion blip could reserve the full second even though no dart landed. A normal dart arriving 0.24 s later was then dropped until the player pressed Detect now. Only a real landed dart now earns the full cooldown.
This is two clocks, not one. First the board confirms that the pull is real. Only after the visit is booked do the suppression, player-colour change, and bounce lockout begin.
DT_TURN_FLIP_DELAY_S
0.4 s
<
DT_POST_PULL_SUPPRESS_S
1.0 s
Hard constraint: the colour flip must remain inside the clean-pull suppression window. A delay at or beyond 1.0 s moves the lighting transition back into live detection and recreates the phantom-dart failure.
Less feels faster but can book while the hand is still present. More is calmer but adds delay to every confirmed pull.
The fail-open ceiling for a noisy or partial pull. Raising it adds patience; lowering it accepts a less-settled scene.
Protection after a clean pull. Shortening it lets the next dart count sooner, but also the retreating arm and LED transition.
The longer version used after a dirty or ceiling-booked pull, when the scene is less trustworthy.
No bounce is recorded or hinted here: the impact signature is assumed to be the pull tail, not a new throw.
A vision threshold, not a delay. Drift from 30–149 px with no darts down is treated as lighting and becomes the new visit reference.
The previous design photographed the new visit under the old player's light and changed colour immediately afterwards. Camera exposure and reflection drift crossed the throw trigger at a repeatable 2.1 s, creating four phantom first darts in one field session. The delayed flip plus the refreshed reference remove both halves of that failure.
Six false “BOUNCE” events arrived 2.05–2.13 s after a takeout. Real first darts measured much later (5th percentile 3.5 s, n=271), so the 2.5 s window removes the pull-tail signature without taxing normal play.
The rainbow is visible celebration. The extra second after it is invisible protection: the strip's return to normal lighting must not look like a bounce-out.
DT_CELEBRATE_GUARD_S derives as
DT_LED_CELEBRATE_S + 1.0 s. If the rainbow changes, the safe default follows it.Shorter gets to the next leg sooner; longer makes the win more prominent.
Leave derived. An explicit value shorter than the rainbow reopens the fake-bounce hole.
A clean empty-board photograph is more valuable than a fast poisoned one. The trainer retries if a hand or shadow is present, but never blocks play indefinitely.
Spacing between retries. Shorter samples a hand still in motion more often; longer makes a dirty start more noticeable.
More attempts improve the chance of a clean reference but extend the worst case. The trainer remains best-effort.
Only when a manually pinned model is not yet serving: wait once for download and swap, then start with an explicit warning rather than block offline play.
During an open score correction, a pull waits this long for the edit to save before it books the visit.
Defaults are the shipped v0.9.59 values. “Derived” means another setting computes the default; an explicit environment value still overrides it.
DT_LED_FLASH_SWhite/red score flash emitted by the WLED sidecar.
DT_ANCHOR_FLASH_GUARD_SRejects empty-reference photographs while the score flash can still be visible.
DT_COOLDOWN_SMinimum gap after a detected throw before another trigger may fire.
DT_IGNORE_COOLDOWN_SCooldown retained after an IGNORE. Keep below 0.24 s; zero releases it next tick.
DT_TAKEOUT_CONFIRM_MIN_QUIET_SContinuous stillness required before a clean takeout re-read may execute.
DT_TAKEOUT_CONFIRM_MAX_SFail-open ceiling for takeout confirmation in a noisy scene.
DT_POST_PULL_SUPPRESS_SMotion suppression after a clean pull.
DT_POST_PULL_SUPPRESS_DIRTY_SLonger suppression after a dirty or ceiling-booked pull.
DT_TURN_FLIP_DELAY_SDefers the new player-colour event into the protected window.
DT_BOUNCE_TAKEOUT_LOCKOUT_SForbids bounce records and hints while pull-tail impacts are plausible.
DT_LED_CELEBRATE_SRainbow duration after a leg or game ends.
DT_CELEBRATE_GUARD_SSuppresses lighting-driven false bounces through the rainbow's return transition.
DT_CLEAN_BOARD_WAIT_SInterval between clean-board reference attempts.
DT_SAVE_FIRST_MAX_SMaximum pull deferral while a score correction is saving.
DT_MODEL_GATE_SOne-time game-start wait for a manually pinned model that has not swapped in yet.
DT_RECONCILE_EVERY_SCadence of the optional reconcile recheck. It matters only with DT_RECONCILE=1; reconciliation is off by default because it invented phantom darts.
DT_CLEAN_BOARD_TRIES=4 limits clean-board attempts.
DT_REF_ADOPT_MAX=150 pixels caps lighting-sized reference adoption.
DT_RECONCILE=0 keeps the reconcile net off.
DT_AUTO_BOUNCE=1 auto-records strong bounce candidates into review.
These are per-rig experiments, not universal physics. Camera position, lighting, strip brightness, and throwing pace all change the safe operating range.
/etc/dart-trainer/config.env on the Pi.No software update is required. Invalid floating-point values in the
params.py timing controls fall back to their defaults, but do not rely on that
as validation: constraint-breaking numbers can still be syntactically valid.
# /etc/dart-trainer/config.env # Shorter celebration; guard follows to 3.0 s. DT_LED_CELEBRATE_S=2.0 # Brisker clean-pull handoff. DT_POST_PULL_SUPPRESS_S=0.8 # Keep the flip safely inside that window. DT_TURN_FLIP_DELAY_S=0.4