Files
Live_RC/README.sv.md
2026-08-24 16:54:35 +02:00

19 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

Översikt

Tidtagning

Tidtagning

Overlay

Overlay

Event

Event

Race Setup

Race Setup

Team Overlay

Team Overlay

Domare

Team Overlay

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-url fö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/transpondrar
    • Race 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 Setup innehåller nu även:
    • grupperade sektioner för Deltagare och Lag i Hantera
    • en fyrstegs Create Race Wizard för nya race
    • Hantera uppdelad i Setup, Format, Generering och Live / resultat
    • Grundläge reagerar nu på valt preset, inklusive renare endurance-vy
    • Grundläge / Avancerat för Raceformat
    • en sammanfattningspanel till höger
    • ett presetstyrt sammanfattningskort som växlar mellan endurance- och vanligt race-fokus
    • statusbrickor för Setup, Format, Generering och Live / 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 actions för generering, reseeding och bump-up
    • omgjord inbyggd Guide med översiktskort och tvåkolumnslayout
    • 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
    • förare och bilar har valfria brandfält för team, sponsor, märke eller modell
    • Förare och Bilar kan 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 (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

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, 1000 och 1500 varv
  • 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.

Skrivskyddad mobilprofil

Varje registrerad förare kan få en valfri personlig mobillänk:

  1. Öppna Träning och välj föraren.
  2. Klicka Aktivera mobilprofil.
  3. Kopiera eller öppna länken som skapas.
  4. Använd Skapa ny länk för att återkalla den gamla eller Stäng av profil för att stoppa delningen.

Länken använder en slumpad 192-bitars bearer-nyckel i stället för förar-ID. Det publika API:t lämnar bara ut den valda förarens visningsnamn, klass/märke, summerad träningsstatistik, dagshistorik, mål och belöningstext. Transponder-ID, andra förares namn, race setup och admin-state lämnas inte ut.

Mobilsidan har också en lokal 20-minuterstimer: 10 minuter maxfokus följt av 10 minuter kontrollerad körning på 80-90 procent. Timern sparas bara i mobilens webbläsare och ändrar ingen racedata.

Vid extern publicering ska bara dessa paths proxas:

/public-training/*
/src/public_training.js
/src/public_training.css

Exponera inte /api/state eller hela admin-appen. Statisk servering är begränsad till /src och /docs; data/, serverscripts och bundlade binärer publiceras inte som statiska filer.

Create Race Wizard

  • Race Setup startar nu med en fyrstegs wizard för nya race:
    • Grunddata
    • Deltagare
    • Sessionsplan
    • Bekrä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 actions när practice eller kval är färdiga.

Hantera-flödet

  • Efter att racet skapats är Hantera uppdelat i fyra tydliga steg:
    • Setup
    • Format
    • Generering
    • Live / resultat
  • Setup används för racedeltagare och lag. Stegkorten högst upp fungerar också som snabbnavigering mellan de fyra blocken.
  • Format anvä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.
  • Generering ligger 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 -> Lagring stö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 actions stö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 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
  • Inställningar -> Klubb-presetar kan exportera/importera presetbiblioteket som JSON mellan installationer

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
  • Återställ senaste manuellt ogiltiga varv lä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 -> Detaljer finns där som snabbknappar
  • filter för:
    • Alla
    • Ogiltiga
    • Korrigerade
    • Team race
  • domarloggen kan exporteras per session som JSON
  • både Ångra senaste och 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:

  1. Klona eller packa upp hela repot, helst till C:\\Live_RC.
  2. Dubbelklicka på windows\\install.bat.
  3. Starta med windows\\start_backend.bat eller npm start.
  4. Ö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 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\\install.bat installerar och verifierar Node/npm-dependencies
  • windows\\start_ammc.bat startar AMMC i bakgrunden
  • windows\\start_backend.bat startar npm start i bakgrunden
  • windows\\start_all.bat startar både AMMC + backend och öppnar webbsidan
  • windows\\stop_all.bat stoppar den hanterade backendprocessen och ammc-amb.exe

Backendloggar:

  • logs\\server.out.log
  • logs\\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.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://<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:

  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:

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:

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"
}