# 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` - 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 - 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 - AMMC + npm setup på Windows och Linux - Språkval i UI: `SV` / `EN` ## 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_event` 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" } ```