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

434 lines
26 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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](README.md) · Ändringar: [CHANGELOG.md](CHANGELOG.md) · Planer: [ROADMAP.md](ROADMAP.md) · Versionen som körs visas längst ner i menyn.
## Innehåll
- [Höjdpunkter](#höjdpunkter)
- [Skärmbilder](#skärmbilder)
- [Snabbstart](#snabbstart)
- [Använda RaceCore](#använda-racecore)
- [Race day](#race-day)
- [Skapa race](#skapa-race)
- [Serie / cup](#serie--cup)
- [Träning och träningsstatistik](#träning-och-träningsstatistik)
- [Ljud och utrop](#ljud-och-utrop)
- [Overlays och OBS](#overlays-och-obs)
- [Sponsorevent med delade bilar](#sponsorevent-med-delade-bilar)
- [Data, backup och export/import](#data-backup-och-exportimport)
- [Säkerhet](#säkerhet)
- [Videoguider](#videoguider)
- [Installation](#installation)
- [Decoders och AMMC](#decoders-och-ammc)
- [Utveckling och tester](#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.
<table>
<tr>
<td width="50%"><a href="docs/screenshots/overview-active-session.jpg"><img src="docs/screenshots/overview-active-session.jpg" alt="Översikt med aktiv session" /></a><br><strong>Översikt med aktiv session</strong></td>
<td width="50%"><a href="docs/screenshots/race-setup-wizard.jpg"><img src="docs/screenshots/race-setup-wizard.jpg" alt="Race Setup-guiden" /></a><br><strong>Race Setup-guiden</strong></td>
</tr>
<tr>
<td width="50%"><a href="docs/screenshots/overlay.jpg"><img src="docs/screenshots/overlay.jpg" alt="Fullständig liveoverlay" /></a><br><strong>Fullständig liveoverlay</strong></td>
<td width="50%"><a href="docs/screenshots/leaderboard-overlay.jpg"><img src="docs/screenshots/leaderboard-overlay.jpg" alt="Leaderboard-overlay" /></a><br><strong>Leaderboard-overlay</strong></td>
</tr>
<tr>
<td width="50%"><a href="docs/screenshots/training-overview.jpg"><img src="docs/screenshots/training-overview.jpg" alt="Översikt över träningsstatistik" /></a><br><strong>Träningsstatistik, översikt</strong></td>
<td width="50%"><a href="docs/screenshots/training-extra-stats.jpg"><img src="docs/screenshots/training-extra-stats.jpg" alt="Detaljerad träningsstatistik med tempokarta och stintanalys" /></a><br><strong>Detaljerad träningsstatistik</strong></td>
</tr>
<tr>
<td width="50%"><a href="docs/screenshots/series.jpg"><img src="docs/screenshots/series.jpg" alt="Serie / cup med numrerade steg" /></a><br><strong>Serie / cup</strong></td>
<td width="50%"><a href="docs/screenshots/judging-current.jpg"><img src="docs/screenshots/judging-current.jpg" alt="Domarvy och racekorrigeringar" /></a><br><strong>Domarvy och korrigeringar</strong></td>
</tr>
<tr>
<td width="50%"><a href="docs/screenshots/race-audio-settings.jpg"><img src="docs/screenshots/race-audio-settings.jpg" alt="Raceljud och utrop" /></a><br><strong>Raceljud och utrop</strong></td>
<td width="50%"><a href="docs/screenshots/race-manage-tabs.jpg"><img src="docs/screenshots/race-manage-tabs.jpg" alt="Event Managers flik Live & resultat" /></a><br><strong>Event Managers flik Live & resultat</strong></td>
</tr>
<tr>
<td width="50%"><a href="docs/screenshots/decoder-settings.jpg"><img src="docs/screenshots/decoder-settings.jpg" alt="Decoderinställningar" /></a><br><strong>Decoderinställningar</strong></td>
<td width="50%"><a href="docs/screenshots/managed-ammc.jpg"><img src="docs/screenshots/managed-ammc.jpg" alt="Hanterad AMMC" /></a><br><strong>Hanterad AMMC</strong></td>
</tr>
<tr>
<td width="50%"><a href="docs/screenshots/guide.jpg"><img src="docs/screenshots/guide.jpg" alt="Inbyggd guide" /></a><br><strong>Inbyggd guide</strong></td>
<td width="50%"></td>
</tr>
</table>
## Snabbstart
**Windows 11** (PowerShell):
```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:
```bash
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](#videoguider) visar hur man ansluter decodern, lägger in förare och skapar första racet. Alla steg: [Installation](#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](#träning-och-träningsstatistik)).
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](#återställ-en-serverbackup)).
- **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):
```csv
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](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](docs/videos/connect-decoder.mkv) · [Lägg till förare och bilar](docs/videos/add-drivers-cars.mkv) · [Skapa ett race](docs/videos/create-race.mkv) · [Kör en session](docs/videos/run-a-session.mkv)
- **Rundtur i gränssnittet:** [Inställningsflikar](docs/videos/settings-tabs.mkv) · [Event Managers flikar](docs/videos/event-manager-tabs.mkv) · [Dagens schema](docs/videos/event-schedule.mkv)
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](https://git-scm.com/download/win). Utan Git: ladda ner zip-filen från [repot](https://git.dio.nu/Public/Live_RC) och packa upp allt.
2. **Ladda ner:**
```powershell
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:**
```powershell
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)
```bash
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:
```bash
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:
```bash
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](docs/decoder-setup.sv.md) (engelska: [docs/decoder-setup.md](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](https://www.ammconverter.eu/docs/intro/quick-start/)):
```json
{ "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](docs/javascript-architecture.md), och planerat och klart arbete i [ROADMAP.md](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.