# JMK RB Live Event RC timing app med sponsor-eventflöde (delade bilar/transpondrar mellan olika heat/finaler), AMMC WebSocket och lokal SQLite-lagring på Windows. ## Vad som ingår - Event-lägen: - `Race (driver transponders)` - `Track Event (shared cars)` - UI-separering: - `Event` = sponsor-event med delade bilar/transpondrar - `Race Setup` = riktiga race med personlig transponder per förare - `Race Setup` innehåller nu även: - välj exakt vilka förare som är med i racet - practice-ranking - kval-ranking med `poäng` eller `bästa resultat` - inbyggd guide för hur man skapar race steg för steg - beskrivningar direkt i alla fält under `Raceformat` - `Follow-up tid` efter ordinarie racetid innan heatet stängs - `Min varvtid` och `Max varvtid` fö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 `Raceformat` för kort teknisk bana, klubbrace, IFMAR-liknande upplägg och endurance - schemaavvikelse på `Översikt` mellan planerad och faktisk körtid - sessionstyp `Free Practice` fö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 grid` i grid-editorn per session - final-ranking över flera leg med räknade finalheat - valbar `bump-up` mellan 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 `Timing` fö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 lap` och `top 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 - Sessioner: `practice`, `qualification`, `heat`, `final` - Sponsor-verktyg: - Skapa rundor automatiskt (`qualification`, `heat`, `final`) - Auto-assign förare -> bil per session - Live timing från AMMC WebSocket (`msg: "PASSING"`) - Hanterad AMMC från webbgränssnittet: - backend kan starta/stoppa lokal `ammc-amb` på Windows, Linux och macOS - läser bundlade binärer från `AMMC/windows64`, `AMMC/linux_x86-64`, `AMMC/apple_m` - Redigering i UI: - Klasser, eventnamn/datum, förare och bilar kan redigeras direkt - 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 (`blipp` eller tala förarnamn) och målgång - Sessioninställningar för `Mass start`, `Position start`, `Staggered` - `Timing` visar grid/startordning för aktiv `Position start`-session - leaderboard visar både `gap till ledaren`, `gap till bilen framför` och `eget delta` mot förra varvet - `Senaste passeringar` visar nu även ogiltiga varv med status `För kort varv` eller `Över maxvarv` - manuella korrigeringar i `Tidtagning -> Detaljer`: `+1/-1 varv`, `+1/+5/-1 sek`, `Nollställ korrigering` - Practice/Kval kan seedas på bästa `2` eller `3` varv i sessionsinställningar - Persistens: - Frontend state i browser (`localStorage`) - Samma state + passeringar sparas i lokal SQLite via Node-backend - 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` ## 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 sek` - `Max varvtid = 60 sek` ### Ogiltiga passeringar - `Tidtagning -> Senaste passeringar` visar 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 `Detaljer` på en förare / ett lag - där finns: - `+1 varv` - `-1 varv` - `+1 sek` - `+5 sek` - `-1 sek` - `Nollställ korrigering` - korrigeringarna uppdaterar leaderboard och resultat direkt ### Best laps / average / consecutive - Ställs per session med `Seedmetod` när `Seed bästa varv` är större än `0` - tillgängliga lägen: - `Bästa N varv, summa` - `Bästa N varv, snitt` - `Bä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` ### Poängtabeller och tie-break - Ställs i `Race Setup -> Hantera -> Raceformat` - poängtabeller för kval: - `Placeringstal (1,2,3...)` - `Fallande efter fältstorlek` - `10-9-8-7-6-5-4-3-2-1` - tie-break för kvalranking: - `Jämför räknade rundor` - `Bästa enskilda varv` - `Bä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 16s` - `Klubbrace kval + final` - `IFMAR-stil kval/final` - `Endurance / lagrace` - efter applicering kan alla fält fortfarande justeras manuellt och sparas som vanligt - `Spara klubb-preset` lagrar egna lokala presets i appens state så de kan återanvändas på samma installation - `Ta bort klubb-preset` tar bort ett lokalt preset igen ### Schemaavvikelse på Översikt - `Översikt` visar 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 varv` markerar senaste räknade varv som manuellt ogiltigt - leaderboard, overlay och passings-historik uppdateras direkt ## Windows installation Kör i PowerShell i projektmappen. 1. Installera Node.js LTS (18+). 2. Installera dependencies: ```powershell npm install ``` 3. Starta servern i bakgrunden: ```powershell npm start ``` 4. Öppna: - `http://localhost:8081` - eller från annan dator: `http://:8081` Vanliga kommandon: ```powershell npm start npm stop npm restart npm run status npm run start:fg ``` - `npm start` startar `live_event` i bakgrunden - `npm stop` stoppar processen via `data/server.pid` - `npm restart` startar om backend - `npm run status` visar om backend kör - `npm run start:fg` kör i foreground för felsökning ### Windows scripts (bakgrundsstart) Det finns färdiga `.bat`-filer i mappen `windows/`: - `windows\\start_ammc.bat` startar AMMC i bakgrunden - `windows\\start_backend.bat` startar `npm start` i bakgrunden (logg: `logs\\backend.log`) - `windows\\start_all.bat` startar både AMMC + backend och öppnar webbsidan - `windows\\stop_all.bat` stoppar backend på port `8081` och `ammc-amb.exe` 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.js` körs. - Om du öppnar sidan från en annan laptop startas ingen AMMC där. - Fältet `AMMC binär` i `Settings` är en sökväg på backend-hosten, inte på klienten som surfar in. 1. Lägg AMMC-binärerna i projektmappen `AMMC/` (redan gjort i denna repo). 2. Öppna `Settings`. 3. Aktivera `Hanterad AMMC / Managed AMMC`. 4. Sätt `Decoder IP / host`, kontrollera port `9000`, spara. 5. Klicka `Starta AMMC / Start AMMC`. 6. Klicka `Använd serverns WS-url / Use server WS URL` så sätts klienten till t.ex. `ws://: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): ```powershell ammc-amb.exe -w 9000 192.168.1.11 ``` I appen: 1. `Settings` 2. Sätt `WebSocket URL` till t.ex. `ws://127.0.0.1:9000` 3. Sätt `Backend URL` till `http://127.0.0.1:8081` 4. Klicka `Test Backend` 5. Gå till `Timing` och klicka `Connect Decoder` Om du kör Linux-brandvägg (UFW), öppna porten: ```bash sudo ufw allow 8081/tcp ``` ## Auto reload vid uppdatering - Servern bevakar `index.html`, `src/app.js` och `src/styles.css`. - När du uppdaterar filer i `Live_RC` och 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: - https://www.ammconverter.eu/docs/intro/quick-start/ Exempelmeddelande: ```json { "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" } ```