Files
Live_RC/windows/README.md
2026-03-14 09:51:35 +01:00

175 lines
6.2 KiB
Markdown

# 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
- 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
- utskrift av startlistor och resultat
- 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://<server-ip>: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://<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):
```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"
}
```