Files
Live_RC/README.sv.md
larssand abed53fb32 docs(readme): restructure both READMEs and cover every current feature
Contents, highlights and quick start first, then features in the order
a club uses them, then installation, decoders and development. Adds the
start count-down, series hub, practice tooling, audio, OBS and security
features, and removes outdated statements.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 07:44:23 +02:00

26 KiB
Raw Blame History

RC RaceCore

Tidtagning och tävlingsledning för RC-klubbar. Systemet har livetidtagning från AMB/MyLaps-decoders via AMMC och en Race Day-sida med startförfarande som i EFRA/IFMAR. Det har också:

  • kval och finaler, serier och cuper;
  • träningsstatistik med personliga mobilprofiler;
  • utrop med offlineröst;
  • overlays för skärmar och OBS.

Allt körs lokalt på en dator (Windows eller Linux) med en SQLite-databas. Ingen molntjänst och inget internet behövs på banan.

English version: README.md · Ändringar: CHANGELOG.md · Planer: ROADMAP.md · Versionen som körs visas längst ner i menyn.

Innehåll

Höjdpunkter

  • Race Day-sida med heat-kö, förkontroll och start med ett klick.
  • Startförfarande som i EFRA/IFMAR: nedräkning med utrop (2 min, 1 min, 30 s, 10 s, 9..3), paus medan bilarna ställs upp, flygande start för kval och gridstart med startljus och slumpad startsignal för finaler.
  • Transponderkontroll under nedräkningen: grön bock för varje förare som passerat, och fel transponder rättas med ett klick.
  • Kval och finaler: skapas från deltagarlistan med jämnt fördelade heat, A/B/C-finaler, bump-up, poängtabeller, tie-break och grid med dra-och-släpp.
  • Serie / cup: poängtabell, bästa N eller stryk X, val för endast klubbmedlemmar, ställning per klass och varje deltävling sköts från seriesidan.
  • Domarvy: straff och varvändringar, allt loggat och ångringsbart.
  • Träningsstatistik per förare, klass och banlayout: stints, jämnhet, utmärkelser, mål och en personlig mobilprofil med QR-kod.
  • Ren statistik: misstänkt korta träningsvarv (genvägar) flaggas automatiskt och tas bort med ett klick.
  • Utrop på svenska eller engelska med lokal neural röst (Piper, offline). Under race spelas bara passeringsljud, som i tidtagningssystem.
  • Overlays för skärmar och OBS, med placeringar vunna/förlorade sedan start.
  • Säker data: SQLite, automatisk backup före varje start, full export/import och valfri admin-PIN.

Skärmbilder

Klicka på en bild för full upplösning.

Översikt med aktiv session
Översikt med aktiv session
Race Setup-guiden
Race Setup-guiden
Fullständig liveoverlay
Fullständig liveoverlay
Leaderboard-overlay
Leaderboard-overlay
Översikt över träningsstatistik
Träningsstatistik, översikt
Detaljerad träningsstatistik med tempokarta och stintanalys
Detaljerad träningsstatistik
Serie / cup med numrerade steg
Serie / cup
Domarvy och racekorrigeringar
Domarvy och korrigeringar
Raceljud och utrop
Raceljud och utrop
Event Managers flik Live & resultat
Event Managers flik Live & resultat
Decoderinställningar
Decoderinställningar
Hanterad AMMC
Hanterad AMMC
Inbyggd guide
Inbyggd guide

Snabbstart

Windows 11 (PowerShell):

winget install --id Git.Git --exact --source winget   # bara om "git --version" inte fungerar
Set-Location $HOME
git clone https://git.dio.nu/Public/Live_RC.git Live_RC
Set-Location .\Live_RC
.\windows\install.bat

Linux (Ubuntu/Debian) med Node.js 22 eller 24:

git clone https://git.dio.nu/Public/Live_RC.git Live_RC
cd Live_RC
npm ci && npm run verify
npm start

Öppna sedan http://localhost:8081, eller http://<serverns-ip>:8081 från en annan dator i racenätverket. Guiden i menyn och videoguiderna visar hur man ansluter decodern, lägger in förare och skapar första racet. Alla steg: Installation.

Använda RaceCore

Menyn följer hur en tävlingsdag går till:

  • Start: Översikt, Race Day.
  • Skapa: Race Setup, Sponsor Event, Serier / cup.
  • Kör och följ: Tidtagning, Domare, Overlay, Träningsstatistik, Resultatarkiv.
  • Register: Klasser, Förare, Bilar.
  • System och hjälp: Inställningar, Guide.

Gränssnittet finns på svenska och engelska.

Race day

Race Day är operatörens sida:

  • Heat-kön visar aktuellt, nästa och därpå följande heat.
  • Förkontrollen kontrollerar decoder, deltagare, transpondrar (saknade eller dubbletter), varvtidsgränser, grid och ljud. Blockerare visas först, var och en med en genväg till rätt inställning. Min/max-varvtid kan ändras direkt där.
  • En automatisk SQLite-backup tas före varje start.

Startförfarande (EFRA/IFMAR): Start kör först en nedräkning. Välj Go, 30 s, 1, 1:30, 2, 3 eller 5 min; standard sätts per tävling för kval och final.

  • Under nedräkningen:
    • Banan är öppen.
    • Speakern ropar "Heat 3 startar om 2 minuter", sedan varje minut, 30 s och 10 s.
    • Vid gridstart ropar den dessutom "bilarna till startplatsen" vid 30 s och räknar 9..3.
  • Knappar:
    • Pausa (medan bilarna ställs upp) och Fortsätt.
    • +1 min.
    • Till 30 s (omstart av gridet).
    • Till 10 s.
    • Go nu, som varnar om förare som inte setts.
    • Avbryt.
  • När tiden går ut startar heatet av sig självt.
    • Gridstart (mass/position): startljus och en slumpad startsignal inom 0-5 s.
    • Flygande start (standard för kval): signalen och "Klockan går". Varje bils tid startar vid dess första passering, och en sen bil får klockan startad senast efter 150 % av ett varv (EFRA 9.3).
    • Staggered start: bilarna ropas ut en och en.
  • Transponderkontroll: varje förare i heatet får en grön bock när transpondern passerar under nedräkningen. Saknas någon kan transpondern bytas direkt i panelen, eller kopplas till en okänd transponder som just passerat.
  • Paus, fortsätt och avsluta fungerar under heatet. Follow-up-tid låter sista varvet köras klart efter klockan.

Tidtagning visar livetopplistan (varv, gap till ledaren och framför, eget delta, bästa och senaste varv), senaste passeringar med ogiltiga korta varv markerade, grid vid positionsstart, repris av sessionen (1-10x) och speakerpanelen.

Domare är platsen för korrigeringar i race: ±varv, ±sekunder och nollställ, samt ta bort eller återställa vilket varv som helst. Allt loggas med tid och kan ångras; loggen kan exporteras som JSON. I kval, heat och final är Domarvyn enda stället för straff; Tidtagning visar korrigeringarna och har knappen Öppna i Domarvyn. Träning har inga straff, men varv kan städas direkt i Tidtagning (se träning).

Varvkontroll:

  • Minsta varvtid stoppar genvägar och falska träffar.
  • Längsta varvtid startar en ny statistik-stint efter en paus; det långa varvet räknas ändå i racet.

Skapa race

Race Setup har två ingångar:

  • Snabbstart Open Practice: bara ett namn. Den skapar en otidsatt session för alla transpondrar och går direkt till Tidtagning; ingen klass, förare eller format behövs.
  • Skapa race-guiden: Grunder → Deltagare → Sessionsplan → Bekräfta. Välj klass och förval, bocka i förarna, och träning, kval (eller lagrace) skapas.

Efter det hanteras racet i fyra flikar (Race Setup → Hantera):

  • Deltagare & lag: bocka i vilka som kör, och hantera lag för endurance.
  • Format:
    • kvalomgångar, bilar per heat, tid och starttyp (mass, position, staggered, flygande);
    • seedning (bästa N varv sammanlagt, snitt eller i följd);
    • poängtabell för kval (placering, efter fältstorlek, 10-9-8...) och tie-break;
    • finaler: antal finalheat, räknade finalheat, bump-up och reserverade bump-platser;
    • nedräkningens längd, follow-up-tid och min/max-varvtid;
    • förval: kort teknisk bana, klubbrace, IFMAR-stil, endurance, eller egna sparade klubbförval;
    • Race actions längst ner i fliken:
      • skapa kval från träningen (eller deltagarlistan); heaten delas så jämnt som möjligt, till exempel 9 förare och max 8 per heat → 5 + 4;
      • omseeda kommande heat; låsta manuella grid respekteras;
      • skapa A/B/C-finaler och bump-up;
      • exportera racet som ett paket.
  • Live & resultat:
    • grid-redigerare (dra och släpp) och låsning;
    • ställning för träning, kval och final samt finalmatris;
    • utskrift och PDF med klubbens profil;
    • sammanfattning av split- och depåtider.
  • Schema & utskrift: dagens körordning med planerade tider, och heatlistor.

Översikt visar schemaavvikelse (planerad mot faktisk tid). Resultatarkivet hittar avslutade race utan att gå via Race Setup.

Serie / cup

Menyn Serier / cup kör ett mästerskap över valfritt antal deltävlingar, med fritt valda klasser. Varje klass får en egen ställning.

  1. Namn och klasser.
  2. Poäng:
    • Vem får poäng: alla förare (öppen serie), eller endast klubbmedlemmar. Med endast medlemmar kör förare från andra klubbar och syns i dagens resultat men får inga seriepoäng, och medlemmarna rangordnas om utan dem.
    • Poängtabell: ÖRC-tabellen (100, 90, 82, 75, 69 … sedan −4 per plats, lägst 10), 100-80-70, F1, eller en egen lista.
    • Räknade resultat: bästa N (t.ex. 9 av 12), eller alla körda utom X sämsta. Då minskar antalet automatiskt om en deltävling ställs in.
  3. Deltävlingar: klistra in datumen, så skapas ett race per datum och klass med valt antal kvalomgångar, finaler och max bilar per heat. Varje deltävling sköts sedan från sin rad:
    • välj förare;
    • Kopiera från förra deltävlingen;
    • Ny förare för en efteranmälan;
    • ändra formatet för just den deltävlingen (det kan skilja mellan deltävlingar och klasser);
    • Skapa kval (heaten följer fältets storlek) och Skapa finaler;
    • Status och Öppna.
  4. Ställning:
    • Dagens placering kommer från slutresultatet (A före B), sedan kvalordningen.
    • Inget registrerat varv ger 0. Frånvaro räknas som 0 och kan strykas.
    • Lika poäng avgörs av flest segrar, sedan andraplatser, sedan senaste gemensamma deltävling.
    • Skriv ut eller exportera som PDF (breda tabeller blir liggande A4).

Träning och träningsstatistik

Träningspass:

  • Open Practice kan köras hela säsongen; Free Practice rankar på bästa varv.
  • Nollställ data i Tidtagning rensar passet inför en ny dag, men alla varv finns kvar i träningsstatistiken.

Banlayouter:

  • Tryck Ny layout (på Träningsstatistik, Race Day eller Översikt) när banan byggs om. Ett pågående träningspass flyttas till den nya layouten, och bästa varven börjar om.
  • Varje layout kan ha egen min/max-varvtid för träning. Race använder alltid tävlingens värden.
  • Statistiken visas per layout, med en översikt för alla layouter.

Misstänkt korta varv (bara träning):

  • Ett varv som är mycket snabbare än förarens egen nivå (under 85 % av medianen, efter 5 varv) flaggas ⚠, oftast en genväg av en nybörjare eller ett barn.
  • Det räknas som ett varv men inte som bästa varv, rekord eller i statistiken förrän någon Godkänner det.
  • Ta bort görs med ett klick, i panelen på Tidtagning och Race Day eller i förarens varvlista.

Träningsstatistik (menyn):

  • Klubböversikten och en sida per förare och klass visar:
    • personbästa, snittider och jämnhet;
    • bästa 3 varv i följd och bästa 5-minutersresultat;
    • stintanalys, 30-minuters tempoblock och setup-markeringar med före/efter-jämförelse;
    • dagshistorik och utmärkelser;
    • mål med belöningar, dagliga utmaningar och ett gemensamt klubbmål.
  • Underlag: Träning (standard), Race eller Alla. Racevarv hålls separat och märks 🏁 med tävling, pass och serie. Under Race visas de per racepass; ett race delas aldrig upp i stints.
  • En person kan köra flera klasser. Koppla klassposterna till samma träningsprofil under Förare; statistiken hålls per klass.

Mobilprofil:

  • Varje förare kan få en personlig länk med QR-kod. Den visar förarens egen statistik, en träningstimer, setup-markeringar och övningar (jämna varv, stegträning), och har val för tränings- eller racevarv.
  • Länken använder en slumpad nyckel; inga transpondrar eller andra förare visas.
  • För användning via internet, ange den publika adressen en gång för alla under Inställningar → System & backup → Publik adress (domän / DynDNS), till exempel https://klubben.dyndns.org:8443. Lämnas den tom används den lokala nätverksadressen.
  • Publicera bara de här sökvägarna mot internet: /public-training/*, /src/public_training.js och /src/public_training.css. Färdiga Teltonika-filer finns i scripts/teltonika/.

Ljud och utrop

Inställningar → Ljud:

  • Raceljud:
    • startljus, slumpad startfördröjning och passeringsljud (valfritt olika ton per förare/bil);
    • utrop på svenska eller engelska för start, klocka (1 min, 30 s, 10 s), sista varv, målgång, vinnare och pall, depå, straff och tävlingsledning (stopp på banan, röd flagga, tjuvstart, marshal);
    • varje händelse kan slås på eller av för effekt och röst.
  • Utrop under race: "Bara passeringsljud" (standard, som tidtagningssystem) eller "Speaker" med namn, personbästa och ny ledare. Träning får alltid alla utrop.
  • Lokal neural röst (Piper): gratis och fungerar offline. Installera under Inställningar → Ljud → Röstmotor, eller med npm run tts:install.
    • Standardröster: svenska NST (man) och Lisa (kvinna), engelska Ryan (man) och Lessac (kvinna).
    • Under Fler röster, en i taget (ca 63 MB var): svenska Alma; brittiska Alan, Northern English, Cori och Alba (skotsk); amerikanska Joe, John och Norman.
    • Förgenerera fraser och förarnamn före racedagen.
    • Saknas Piper tar webbläsarens röst över.
  • Uttalsnamn per förare: skriv ett uttal eller smeknamn under Förare och tryck 🔊 Testa uttal för att höra det i riktiga utrop.

Overlays och OBS

Menyn Overlay har lägena leaderboard, speaker, resultat, TV och lag, plus ett OBS-läge med layout (leaderboard, grid, lower third), tema (panel, transparent, chroma), rader och kolumner:

  • Kolumner: varv, resultat, bästa, gap och placering sedan start (▲/▼ i heat och finaler).
  • Kopiera OBS-URL ger en länk för browser source; valda kolumner ingår i länken.
  • Publika overlays finns på /public-overlay/<läge> och kan kräva en nyckel: sätt PUBLIC_OVERLAY_TOKEN och lägg till ?token=.... Publicera bara /public-overlay/* via din reverse proxy.
  • Klubbprofilen (namn, logga, PDF-tema) används i menyn, overlays, mobilprofiler och PDF; den kan även sättas per tävling.

Sponsorevent med delade bilar

Sponsor Event låter många förare dela på några få bilar och transpondrar, till exempel 10 förare och 4 bilar:

  • omgångar skapas automatiskt och förarna tilldelas bilar per session;
  • inom en session måste varje bil ha en unik transponder, men samma transponder kan användas igen i nästa session.

Data, backup och export/import

  • Lagring:
    • Allt sparas i data/rc_timing.sqlite; webbläsaren håller en lokal kopia och synkar.
    • Menyn visar sparstatus (sparat, väntar, misslyckades, med Försök igen).
    • Domarkorrigeringar skickas direkt till servern.
  • Backup:
    • automatisk före varje sessionsstart, plus manuella;
    • de senaste 30 listas under Inställningar;
    • återställ med npm run backup:restore (se Installation).
  • Export/import (Inställningar → Lagring):
    • full JSON, eller bara registret (klasser, förare, bilar);
    • CSV för förare och bilar (Excel/LibreOffice; komma, semikolon eller tab). CSV-importen slår ihop: den matchar på id, sedan transponder, sedan namn + klass.
    • ett enskilt racepaket från Race Setup;
    • klubbförval.
  • Rensning: förare, bilar, klasser, race eller träningsstatistik kan rensas var för sig, var och en med egen bekräftelse. Exportera först.

Exempel på förar-CSV (bara name krävs):

name;transponder;class;brand;club;country
Anna Andersson;123456;2WD;;JMK;SE
Erik Eriksson;654321;4WD;Associated;;

Säkerhet

RaceCore är tänkt för ett betrott racenätverk:

  • Admin-PIN (Inställningar → System & backup, av som standard) skyddar alla ändringar via API:t. Inloggningen gäller i 30 dagar och är skyddad mot gissning.
  • RC_ADMIN_ALLOWED_CIDRS begränsar adminändringar till vissa adresser eller nät, till exempel 192.168.1.0/24.
  • RC_ALLOWED_ORIGINS används för ett gränssnitt som medvetet körs från en annan adress.
  • Exponera inte port 8081 mot internet. Läsningar skyddas inte av PIN. Publicera bara sökvägarna för publik overlay och mobilprofil via reverse proxy eller VPN.

Se docs/security-performance-audit.md.

Videoguider

Korta inspelningar med berättarröst (.mkv, H.264/AAC), även länkade från Guiden i appen:

Spelas in med node scripts/record-video-guides.mjs, mot en isolerad testserver.

Installation

RaceCore körs på 64-bitars Windows 11 och Linux med Node.js 22 eller 24 LTS och npm 10+. Använd npm ci (repot har en package-lock.json).

Windows 11

  1. Git: kör git --version. Saknas det, kör winget install --id Git.Git --exact --source winget och öppna PowerShell igen, eller använd Git for Windows. Utan Git: ladda ner zip-filen från repot och packa upp allt.
  2. Ladda ner:
    Set-Location $HOME
    git clone https://git.dio.nu/Public/Live_RC.git Live_RC
    Set-Location .\Live_RC
    
  3. Installera: kör .\windows\install.bat (eller dubbelklicka). Den gör följande:
    • installerar Node.js LTS vid behov, plus Visual C++-runtime som AMMC behöver;
    • kör npm.cmd ci;
    • verifierar Express, SQLite och AMMC;
    • skapar data\ och logs\;
    • startar RaceCore i bakgrunden.
  4. Kontrollera:
    npm.cmd run status
    Invoke-RestMethod -Uri "http://127.0.0.1:8081/api/health"
    
    Öppna sedan http://localhost:8081, eller http://<ipconfig-adressen>:8081 från en annan dator.

Använd npm.cmd i PowerShell; då slipper du felet "running scripts is disabled". Manuell installation utan skriptet: npm.cmd ci, npm.cmd run verify, npm.cmd start. Använd inte --ignore-scripts, eftersom SQLite behöver sitt installationsskript.

Linux (Ubuntu/Debian)

sudo apt update && sudo apt install -y git curl build-essential
# Node.js 22 om "node --version" saknas eller är äldre:
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs
git clone https://git.dio.nu/Public/Live_RC.git Live_RC
cd Live_RC
npm ci
npm run verify
chmod +x AMMC/linux_x86-64/ammc-*
npm start
npm run status

Öppna http://localhost:8081 eller http://<hostname -I-adressen>:8081. Den medföljande Linux-AMMC kräver GLIBC 2.39+ (ldd --version). På äldre system: använd en AMMC-version byggd för ditt system eller kör AMMC på en annan dator. Byt aldrig systemets GLIBC.

Driftkommandon

Kommando (Windows: npm.cmd ...) Gör
npm start Startar i bakgrunden
npm run status Körs den? (PID i data/server.pid)
npm restart Startar om efter en uppdatering
npm stop Stoppar
npm run start:fg Kör i terminalen och visar fel direkt
npm run tts:install Installerar Piper och standardrösterna

Loggar hamnar i logs/server.out.log och logs/server.err.log; data ligger i data/.

Hjälpskript i windows\:

  • install.bat: installerar, verifierar och startar om.
  • start_backend.bat och restart_backend.bat: startar eller startar om servern.
  • start_ammc.bat: startar AMMC.
  • start_all.bat: startar AMMC och servern och öppnar webbläsaren.
  • stop_all.bat: stoppar servern och AMMC.

Uppdatera utan att tappa data

Radera aldrig data/. Så här uppdaterar du:

npm stop
git pull --ff-only
npm ci
npm run verify
npm restart

På Windows används samma kommandon med npm.cmd. Menyn visar när en uppdatering finns, och uppdateringen kan också köras från Inställningar → System & backup. Vid zip-installation: behåll data/, och kopiera aldrig node_modules/ mellan Windows och Linux.

Återställ en serverbackup

Backuper ligger i data/backups/. Återställning görs med ett lokalt kommando, med avsikt:

npm stop
npm run backup:restore -- <backupfil>.sqlite --confirm
npm start

På Windows hittar du senaste filen med Get-ChildItem .\data\backups\*.sqlite | Sort-Object LastWriteTime -Descending | Select-Object -First 1. Återställningen kontrollerar filen och tar först en pre_restore-backup av den nuvarande databasen.

Decoders och AMMC

Den fullständiga guiden, med nätverksskiss, exempel med 1-4 decoders, brandvägg och felsökning, finns i docs/decoder-setup.sv.md (engelska: docs/decoder-setup.md).

Roll Placering Exempel decoder-IP AMMC WS-port Effekt
Main Start/mål-slinga 192.168.1.10 9000 Räknar varv
Split Mellanslinga 192.168.1.11 9001 Mellantid, aldrig ett varv
Depå in Depåinfart 192.168.1.12 9002 Öppnar ett depåstopp
Depå ut Depåutfart 192.168.1.13 9003 Stänger och tar tid

Hanterad AMMC (Inställningar):

  1. Slå på Hanterad AMMC.
  2. Ange decoderns IP för varje kanal.
  3. Klicka Starta AMMC, sedan Använd serverns WS-url.

AMMC körs på serverdatorn, inte i webbläsaren. De medföljande programmen ligger i AMMC/windows64, AMMC/linux_x86-64 och AMMC/apple_m.

Manuell start: kör en ammc-amb -w <port> <decoder-ip> per decoder. Sätt WebSocket-URL i Inställningar (t.ex. ws://<serverns-ip>:9000) och tryck Anslut decoder. Webbläsaren ansluter till AMMC-datorn, inte till decodern. På Linux med UFW: sudo ufw allow 8081/tcp och sudo ufw allow 9000:9003/tcp.

Diagnostik: Inställningar → Decoder / socket-diagnostik visar varje kanals anslutning, meddelanden och passeringar, senaste råmeddelandet och 50 händelser. ammc-sim emulerar en decoder med valda transpondrar, för träning och test utan hårdvara.

AMMC skickar PASSING-meddelanden så här (AMMC-dokumentation):

{ "msg": "PASSING", "passing_number": 1, "transponder": 232323, "rtc_time": "2022-10-11T22:57:36.099+02:00", "strength": 0.0, "resend": false, "loop_id": "55" }

Utveckling och tester

  • Enhets-, logik- och API-tester: npm test. SQLite-integrationstesterna startar en egen server mot en tillfällig databas och rör aldrig data/.
  • Webbläsartester: npm run test:browser. De kräver Chrome, Chromium eller Edge (sätt CHROME_PATH om den inte hittas) och körs mot en isolerad server med fejkad decoder.
  • Skärmbilder och videoguider: node scripts/capture-screenshots.mjs [namn] och node scripts/record-video-guides.mjs.
  • Dokumentation: modulöversikten finns i docs/javascript-architecture.md, och planerat och klart arbete i ROADMAP.md.
  • Automatisk omladdning: klienten laddas om när index.html eller frontendfiler ändras. Kör npm restart efter ändringar i backend.
  • Rådata: /api/passings (senaste passeringar) och /api/state (appens data), bara i det lokala nätverket.