feat(race-day): start heats with an EFRA/IFMAR count-down and flying start

Race Day Start now runs a count-down (Go, 30 s - 5 min, default per
event) with calls every minute, 30 s and 10 s, grid call and 9..3
count for grid starts, hold/resume/+1 min/to 30 s/to 10 s/Go now, and
starts the heat by itself when it runs out. The transponder check runs
during the count-down, replacing the separate warm-up.

Adds a flying start mode (horn + clock is running, own clock per car)
as the qualifying default, and the latest personal clock start rules
from EFRA 9.3 / IFMAR 4.2.3 for flying and staggered starts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
larssand
2026-09-30 21:27:20 +02:00
parent 1bc75f8ec1
commit 5bfb67ea02
27 changed files with 884 additions and 334 deletions

View File

@@ -47,9 +47,14 @@
"race_1_minute": "Race starts in one minute.", "race_30_seconds": "Thirty seconds to start.", "race_10_seconds": "Ten seconds to start.",
"drivers_ready": "Drivers, stand by.", "start_sequence": "Starting on the sound of the tone.", "false_start": "False start.", "restart_race": "Prepare to restart the race.",
"staggered_release": "Car {tp}.",
"warmup_start": "Warm-up has started. {minutes} minutes.",
"warmup_1_minute": "One minute of warm-up remaining.",
"warmup_end": "Warm-up is over. Drivers to the grid.",
"prologue_start": "{heat} starts in {time}. The track is open.",
"prologue_minutes": "{minutes} minutes to the start.",
"prologue_grid": "Thirty seconds to start. Cars to the grid.",
"prologue_count": "{seconds}",
"prologue_hold": "Start on hold.",
"prologue_resumed": "Count-down resumed. {time} to the start.",
"prologue_cancelled": "Start cancelled.",
"clock_running": "Clock is running.",
"personal_best": "Personal best. {driverName}. {lapTime}.", "fastest_lap": "Fastest lap. {driverName}. {lapTime}.",
"training_stable_pace": "{driverName}, good pace and consistent driving.",
"track_record": "New track record. {driverName}. {lapTime}.", "new_leader": "New race leader. {driverName}.",
@@ -72,9 +77,14 @@
"race_1_minute": "Start om en minut.", "race_30_seconds": "Trettio sekunder till start.", "race_10_seconds": "Tio sekunder till start.",
"drivers_ready": "Förare, gör er redo.", "start_sequence": "Start på signalen.", "false_start": "Felaktig start.", "restart_race": "Förbered omstart.",
"staggered_release": "Bil {tp}.",
"warmup_start": "Uppvärmningen har startat. {minutes} minuter.",
"warmup_1_minute": "En minut kvar av uppvärmningen.",
"warmup_end": "Uppvärmningen är slut. Förarna till start.",
"prologue_start": "{heat} startar om {time}. Banan är öppen.",
"prologue_minutes": "{minutes} minuter till start.",
"prologue_grid": "Trettio sekunder till start. Bilarna till startplatsen.",
"prologue_count": "{seconds}",
"prologue_hold": "Starten är pausad.",
"prologue_resumed": "Nedräkningen fortsätter. {time} till start.",
"prologue_cancelled": "Starten är avbruten.",
"clock_running": "Klockan går.",
"personal_best": "Personbästa. {driverName}. {lapTime}.", "fastest_lap": "Snabbaste varv. {driverName}. {lapTime}.",
"training_stable_pace": "{driverName}, bra tempo och stabil körning.",
"track_record": "Nytt banrekord. {driverName}. {lapTime}.", "new_leader": "Ny ledare. {driverName}.",