18 KiB
JMK RB RaceController
RC timing app med sponsor-eventflöde (delade bilar/transpondrar mellan olika heat/finaler), AMMC WebSocket och lokal SQLite-lagring på Windows.
Arkitektur
- JavaScript-modulöversikt:
docs/javascript-architecture.md - Primär engelsk README:
README.md
Skärmbilder
Översikt
Tidtagning
Overlay
Event
Race Setup
Team Overlay
Domare
Publik Overlay Och OBS
Appen har nu en separat publik overlay-route så att du inte behöver exponera hela admin-UI:t externt.
- Publik overlay-route:
/public-overlay/<mode> - OBS-läge:
/public-overlay/obs - OBS-overlay konfigureras från menyn
Overlay:- antal rader
- layout:
leaderboard,grid,lowerthird - tema:
panel,transparent,chroma - vilka kolumner och block som ska visas
- Använd
Kopiera OBS-urlför att få en färdig browser-source-länk till OBS.
Om du vill ha ett enkelt skydd för publika overlays, sätt denna miljövariabel på servern:
PUBLIC_OVERLAY_TOKEN=din-hemliga-token
Då måste den publika overlay-länken innehålla:
/public-overlay/obs?token=din-hemliga-token
Rekommenderad deploy:
- publicera bara
/public-overlay/*via reverse proxy - håll huvudappen/admin internt
Vad som ingår
- Event-lägen:
Race (driver transponders)Track Event (shared cars)
- UI-separering:
Event= sponsor-event med delade bilar/transpondrarRace Setup= riktiga race med personlig transponder per förare
- Lagring/import:
- full export/import av race-data för backup eller flytt till annan maskin
- register-export/import för bara klasser, förare och bilar
- CSV-export för förare och bilar när du vill ha enkla listor i kalkylark
- export/import av ett enskilt racepaket via
Race Setup -> Hantera -> Race actions
Race Setupinnehåller nu även:- grupperade sektioner för
DeltagareochLagiHantera - en fyrstegs
Create Race Wizardför nya race Hanterauppdelad iSetup,Format,GenereringochLive / resultat- Grundläge reagerar nu på valt preset, inklusive renare endurance-vy
Grundläge / AvanceratförRaceformat- en sammanfattningspanel till höger
- ett presetstyrt sammanfattningskort som växlar mellan endurance- och vanligt race-fokus
- statusbrickor för
Setup,Format,GenereringochLive / resultat - sammanfattningsvarningar när deltagare, sessioner, lag eller varvfönster saknas
- klickbara sammanfattningsvarningar som hoppar till rätt del av Hantera
- klickbara stegkort som fungerar som snabbnavigering i
Hantera - kompaktare stegkort med levande räknare för t.ex. förare, lag, sessioner och aktiv/resultat-status
- separata
Race actionsför generering, reseeding och bump-up - omgjord inbyggd
Guidemed översiktskort och tvåkolumnslayout - välj exakt vilka förare som är med i racet
- practice-ranking
- kval-ranking med
poängellerbästa resultat - inbyggd guide för hur man skapar race steg för steg
- beskrivningar direkt i alla fält under
Raceformat Follow-up tidefter ordinarie racetid innan heatet stängsMin varvtidochMax varvtidför att filtrera shortcuts/felträffar och styra bättre statistik/stintlogik- seedmetoder för practice/kval: bästa N varv som summa, snitt eller konsekutiva varv
- valbar kval-poängtabell och tie-break-regler
- presets i
Raceformatför kort teknisk bana, klubbrace, IFMAR-liknande upplägg och endurance - schemaavvikelse på
Översiktmellan planerad och faktisk körtid - sessionstyp
Free Practiceför löpande varvtider utan seedning - auto-generering av kvalheat från practice-ranking eller klasslista
- reseeding av kommande kvalheat från aktuell ranking
- auto-generering av
A/B/C...finaler från ranking - sparad manuell grid per session via dragbar grid-editor
- auto-reseed hoppar över heat där manuell grid har låsts tills du återställer den
- tydlig
Lås/Lås upp gridi grid-editorn per session - final-ranking över flera leg med räknade finalheat
- valbar
bump-upmellan finaler - reserverade bump-platser i högre finaler
- visuell finalmatris med reserverade bump-platser
- dragbar grid-editor för positionsstart
- utskrift/export av heatsheets per kval/final
- overlay-vy för extern leaderboard-skärm
- flera overlay-lägen: leaderboard, speaker och results
- speaker-overlay med eventmarkörer och separata speaker-cues
- live speaker-panel i
Timingför att slå av/på cues under pågående session - speaker-cues och klubbinfo/PDF-header styrs från
Settings - logo-upload för overlay från
Settings - branding per event/race med egen logo, tagline, footer och PDF-tema i
Hantera - extra speaker-cues för
session start,new best lapochtop 3 change - valbart PDF-tema:
classic,minimal,motorsport - utskrift av startlistor och resultat med vald branding
- servergenererad PDF-export för startlistor, heatsheets och resultat med inbäddad logo
- genererade kval/finaler ärver tid och starttyp från raceformatet
- finish-ljud som siren i stället för browser-röst
- grupperade sektioner för
- Sessioner:
practice,qualification,heat,final - Sponsor-verktyg:
- Skapa rundor automatiskt (
qualification,heat,final) - Auto-assign förare -> bil per session
- Skapa rundor automatiskt (
- Live timing från AMMC WebSocket (
msg: "PASSING") - Hanterad AMMC från webbgränssnittet:
- backend kan starta/stoppa lokal
ammc-ambpå Windows, Linux och macOS - läser bundlade binärer från
AMMC/windows64,AMMC/linux_x86-64,AMMC/apple_m
- backend kan starta/stoppa lokal
- Redigering i UI:
- Klasser, eventnamn/datum, förare och bilar kan redigeras direkt
- förare och bilar har valfria brandfält för team, sponsor, märke eller modell
FörareochBilarkan sökas på namn, transponder eller brand direkt i UI- startlistor och heatsheets tar med förarens brand i print, CSV och PDF-export
- Live race-kontroll:
- Nedräkning under pågående session
- Auto-finish vid tidslut med status
Race is finished - Leaderboard-sortering: varv först, därefter närmast måltid för sessionen (t.ex. 5 min = 600s)
- Browserljud för passing (
blippeller tala förarnamn) och målgång - Sessioninställningar för
Mass start,Position start,Staggered Timingvisar grid/startordning för aktivPosition start-session- leaderboard visar både
gap till ledaren,gap till bilen framförocheget deltamot förra varvet Senaste passeringarvisar nu även ogiltiga varv med statusFör kort varvellerÖver maxvarv- manuella korrigeringar i
Tidtagning -> Detaljer:+1/-1 varv,+1/+5/-1 sek,Nollställ korrigering - Practice/Kval kan seedas på bästa
2eller3varv i sessionsinställningar
- Persistens:
- Frontend state i browser (
localStorage) - Samma state + passeringar sparas i lokal SQLite via Node-backend
- Frontend state i browser (
- Inbyggd
Guide-meny i appen med steg-för-steg för:- Sponsor-event (10 personer / 4 bilar)
- Vanligt race
- ogiltiga varv, follow-up och manuella korrigeringar
- AMMC + npm setup på Windows och Linux
- Språkval i UI:
SV/EN
Träning Och Belöningar
Menyn Träning ger förarna utveckling och delmål även mellan tävlingarna:
- beständig logg med totalt antal giltiga varv synkad från sparade sessionsresultat
- träningsdagar, antal sessioner, personbästa, total-/30-varvssnitt, kontrollerad varvserie och spridning
- daglig historik för de senaste träningsdagarna och förbättring mot tidigare personbästa
- automatiska utvecklingsnivåer vid lämpliga varvantal utan manuell konfiguration
- rekommenderat 20-minuterspass uppdelat i maxfokus och kontrollerad körning på 80-90 procent
- egna varvmål med snabbval på
500,1000och1500varv - valfri reward/belöning och markering när den har delats ut
- responsiv layout som kan öppnas från mobilen via samma server i det lokala nätet
Direktlänk för mobil/bokmärke: http://<server-ip>:8081/?view=training. När en förare väljs läggs förarens ID i länken så just den förarens sida kan sparas som bokmärke.
Träningsstatistiken räknar just nu bara giltiga varv som är kopplade till en registrerad förare. Anonyma transpondrar från Open Practice räknas inte förrän de kopplats till en förare.
Domarkorrigeringar uppdaterar loggade varv så länge källsessionen finns kvar. När sessionen senare tas bort ligger de synkade träningsvarven kvar så förarens livstidsutveckling inte försvinner. Full dataexport inkluderar både varvloggen och belöningsmålen.
Create Race Wizard
Race Setupstartar nu med en fyrstegs wizard för nya race:GrunddataDeltagareSessionsplanBekräfta
- Wizarden är till för att snabbt skapa första grundstrukturen:
- välj klass och preset
- välj vilka förare som faktiskt ska vara giltiga i racet
- skapa practice, kval och/eller team race automatiskt
- Finaler skapas fortfarande senare från
Race actionsnär practice eller kval är färdiga.
Hantera-flödet
- Efter att racet skapats är
Hanterauppdelat i fyra tydliga steg:SetupFormatGenereringLive / resultat
Setupanvänds för racedeltagare och lag. Stegkorten högst upp fungerar också som snabbnavigering mellan de fyra blocken.Formatanvänds för practice/kval, finaler, validering, presets och avancerade val. I Grundläge döljer endurance de flesta kval-/finalfält tills du öppnar Avancerat.Genereringligger separat så knappar för kval, reseeding, finaler och bump-up inte blandas ihop med raceformatet.Live / resultatär där grid, standings, print, PDF och finalmatris används när upplägget väl är klart.
Export / Import
Inställningar -> Lagringstöder nu:- full JSON-export/import för hela tävlingsdatabasen
- register-JSON för bara klasser, förare och bilar
- CSV-export för förare och bilar
Race Setup -> Hantera -> Race actionsstöder nu enskilda racepaket:- exportera ett race med dess sessioner, resultat och refererade klasser/förare/bilar
- importera paketet på en annan installation som ett nytt race
- JSON-exporter innehåller nu även exportmetadata och ett schema-/versionsfält för säkrare import framåt.
Nya racefunktioner
Follow-up time
- Ställs i
Race Setup -> Hantera -> Raceformat - Kan också sättas per session när du skapar eller redigerar en session
- När ordinarie tid går ut går sessionen först in i
Follow-up aktiv - När follow-up-tiden är slut stängs sessionen automatiskt
- Genererade kval/finaler ärver follow-up från raceformatet
Min / Max varvtid
- Ställs i
Race Setup -> Hantera -> Raceformat Min varvtid:- varv snabbare än gränsen ignoreras som shortcut eller felträff
Max varvtid:- varv långsammare än gränsen räknas inte som giltigt varv
- används också för att bryta stintar och förbättra statistik
Praktiskt exempel:
- bana runt
16 sek/varv Min varvtid = 11 sekMax varvtid = 60 sek
Ogiltiga passeringar
Tidtagning -> Senaste passeringarvisar nu både giltiga och ogiltiga passeringar- status som visas:
För kort varvÖver maxvarv
- ogiltiga passeringar markeras visuellt i listan
Manuella korrigeringar
- öppna
Tidtagning - klicka
Detaljerpå en förare / ett lag - där finns:
+1 varv-1 varv+1 sek+5 sek-1 sekNollställ korrigering
- korrigeringarna uppdaterar leaderboard och resultat direkt
Best laps / average / consecutive
- Ställs per session med
SeedmetodnärSeed bästa varvär större än0 - tillgängliga lägen:
Bästa N varv, summaBästa N varv, snittBästa N konsekutiva varv
- leaderboard och ranking visar rätt format beroende på läge:
- summa:
3/00:48.321 - snitt:
3 avg 16.107 - konsekutiva:
3 con 00:49.005
- summa:
Poängtabeller och tie-break
- Ställs i
Race Setup -> Hantera -> Raceformat - poängtabeller för kval:
Placeringstal (1,2,3...)Fallande efter fältstorlek10-9-8-7-6-5-4-3-2-1
- tie-break för kvalranking:
Jämför räknade rundorBästa enskilda varvBästa runda / heatresultat
- kvalrankingen visar även en underrad med aktiv tie-break-information i tabellen
Raceformat presets
Race Setup -> Hantera -> Raceformat- välj ett preset och klicka
Applicera preset - tillgängliga presets:
Kort teknisk bana 16sKlubbrace kval + finalIFMAR-stil kval/finalEndurance / lagrace
- efter applicering kan alla fält fortfarande justeras manuellt och sparas som vanligt
Spara klubb-presetlagrar egna lokala presets i appens state så de kan återanvändas på samma installationTa bort klubb-presettar bort ett lokalt preset igenInställningar -> Klubb-presetarkan exportera/importera presetbiblioteket som JSON mellan installationer
Schemaavvikelse på Översikt
Översiktvisar nu om dagen ligger före eller efter schema- planerad tid räknar:
- sessionens varaktighet
- plus follow-up tid
- faktisk tid räknar:
- verklig tid från start till stopp
- eller pågående körtid om sessionen fortfarande kör
Invalid-lap markering i leaderboard
- om senaste mottagna passing för en förare/ett lag var ogiltig markeras raden även i leaderboard och overlay
- det gör det lättare att se felträffar utan att behöva stå i
Senaste passeringar
Manuell invalidate last lap
Tidtagning -> Detaljer- knappen
Ogiltigförklara senaste varvmarkerar senaste räknade varv som manuellt ogiltigt - leaderboard, overlay och passings-historik uppdateras direkt
Återställ senaste manuellt ogiltiga varvlägger tillbaka senaste manuellt ogiltiga varvet om du ångrar dig
Domarvy
- ny meny
Domare - visar aktiv session, leaderboard, lap history och domarlogg i samma vy
- samma korrigeringar som i
Tidtagning -> Detaljerfinns där som snabbknappar - filter för:
AllaOgiltigaKorrigeradeTeam race
- domarloggen kan exporteras per session som JSON
- både
Ångra senasteoch undo-knapp per loggrad finns för flera manuella åtgärder
Windows installation
Använd 64-bitars Windows 11 och Node.js 22 eller 24 LTS. Enklaste installationen är:
- Klona eller packa upp hela repot, helst till
C:\\Live_RC. - Dubbelklicka på
windows\\install.bat. - Starta med
windows\\start_backend.batellernpm start. - Öppna
http://localhost:8081.
Installationsskriptet kan installera Node.js LTS med winget, kör en låst dependency-installation med npm ci, verifierar SQLite/Express och kontrollerar bundlad AMMC. Komplett guide och felsökning: windows/README.md.
Vanliga kommandon:
npm start
npm stop
npm restart
npm run status
npm run start:fg
npm startstartarlive_eventi bakgrundennpm stopstoppar processen viadata/server.pidnpm restartstartar om backendnpm run statusvisar om backend körnpm run start:fgkör i foreground för felsökning
Windows scripts (bakgrundsstart)
Det finns färdiga .bat-filer i mappen windows/:
windows\\install.batinstallerar och verifierar Node/npm-dependencieswindows\\start_ammc.batstartar AMMC i bakgrundenwindows\\start_backend.batstartarnpm starti bakgrundenwindows\\start_all.batstartar både AMMC + backend och öppnar webbsidanwindows\\stop_all.batstoppar den hanterade backendprocessen ochammc-amb.exe
Backendloggar:
logs\\server.out.loglogs\\server.err.log
SQLite-filen skapas automatiskt här:
data\\rc_timing.sqlite
Koppla mot AMMC
Det finns nu två sätt:
A. Hanterad AMMC i webbgränssnittet
Viktigt:
- AMMC körs på samma host där
npm start/node server.jskörs. - Om du öppnar sidan från en annan laptop startas ingen AMMC där.
- Fältet
AMMC binäriSettingsär en sökväg på backend-hosten, inte på klienten som surfar in.
- Lägg AMMC-binärerna i projektmappen
AMMC/(redan gjort i denna repo). - Öppna
Settings. - Aktivera
Hanterad AMMC / Managed AMMC. - Sätt
Decoder IP / host, kontrollera port9000, spara. - Klicka
Starta AMMC / Start AMMC. - Klicka
Använd serverns WS-url / Use server WS URLså sätts klienten till t.ex.ws://<server-ip>:9000.
Standardbinärer:
- Linux-host:
AMMC/linux_x86-64/ammc-amb - Windows-host:
AMMC/windows64/ammc-amb.exe - macOS-host:
AMMC/apple_m/ammc-amb
B. Manuell start
Starta AMMC med WebSocket (exempel):
ammc-amb.exe -w 9000 192.168.1.11
I appen:
Settings- Sätt
WebSocket URLtill t.ex.ws://127.0.0.1:9000 - Sätt
Backend URLtillhttp://127.0.0.1:8081 - Klicka
Test Backend - Gå till
Timingoch klickaConnect Decoder
Om du kör Linux-brandvägg (UFW), öppna porten:
sudo ufw allow 8081/tcp
Auto reload vid uppdatering
- Servern bevakar
index.html,src/app.jsochsrc/styles.css. - När du uppdaterar filer i
Live_RCoch sparar, laddar klienten om sidan automatiskt. - Om backendkoden ändras, kör
npm restart.
Verifiera att SQLite sparar
Hämta senaste passeringar via API:
http://localhost:8081/api/passings
Hämta sparad app-state:
http://localhost:8081/api/state
Viktig regel för sponsor-event
- I samma pågående session måste varje aktiv bil ha unikt transponder-ID.
- Samma transponder-ID kan återanvändas i nästa session (Heat 1 -> Heat 2 -> Heat 3 -> Final 1 ...).
Referens AMMC JSON
Officiell quick-start:
Exempelmeddelande:
{
"msg": "PASSING",
"passing_number": 1,
"transponder": 232323,
"rtc_time": "2022-10-11T22:57:36.099+02:00",
"strength": 0.0,
"resend": false,
"tran_code": "ID:232323",
"loop_id": "55"
}






