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>
26 KiB
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
- Skärmbilder
- Snabbstart
- Använda RaceCore
- Videoguider
- Installation
- Decoders och AMMC
- Utveckling och tester
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.
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.
- Namn och klasser.
- 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.
- 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.
- 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.jsoch/src/public_training.css. Färdiga Teltonika-filer finns iscripts/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ättPUBLIC_OVERLAY_TOKENoch 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.
- Allt sparas i
- 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_CIDRSbegränsar adminändringar till vissa adresser eller nät, till exempel192.168.1.0/24.RC_ALLOWED_ORIGINSanvä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:
- Kom igång: Anslut en decoder · Lägg till förare och bilar · Skapa ett race · Kör en session
- Rundtur i gränssnittet: Inställningsflikar · Event Managers flikar · Dagens schema
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
- Git: kör
git --version. Saknas det, körwinget install --id Git.Git --exact --source wingetoch öppna PowerShell igen, eller använd Git for Windows. Utan Git: ladda ner zip-filen från repot och packa upp allt. - Ladda ner:
Set-Location $HOME git clone https://git.dio.nu/Public/Live_RC.git Live_RC Set-Location .\Live_RC - 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\ochlogs\; - startar RaceCore i bakgrunden.
- Kontrollera:
Öppna sedan
npm.cmd run status Invoke-RestMethod -Uri "http://127.0.0.1:8081/api/health"http://localhost:8081, ellerhttp://<ipconfig-adressen>:8081frå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.batochrestart_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):
- Slå på Hanterad AMMC.
- Ange decoderns IP för varje kanal.
- 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 aldrigdata/. - Webbläsartester:
npm run test:browser. De kräver Chrome, Chromium eller Edge (sättCHROME_PATHom den inte hittas) och körs mot en isolerad server med fejkad decoder. - Skärmbilder och videoguider:
node scripts/capture-screenshots.mjs [namn]ochnode 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.htmleller frontendfiler ändras. Körnpm restartefter ändringar i backend. - Rådata:
/api/passings(senaste passeringar) och/api/state(appens data), bara i det lokala nätverket.












