Decoder-dokumentationen är nu tydligare och mer komplett
This commit is contained in:
167
docs/decoder-setup.md
Normal file
167
docs/decoder-setup.md
Normal file
@@ -0,0 +1,167 @@
|
||||
# Decoder, IP, and AMMC configuration
|
||||
|
||||
This guide explains how physical MyLaps/AMB decoders connect to JMK RB RaceController. It uses this example network:
|
||||
|
||||
| Device | Example address | Purpose |
|
||||
|---|---:|---|
|
||||
| RaceController/backend | `192.168.1.100` | Runs Node.js, AMMC processes, web UI, and API |
|
||||
| Operator laptop | `192.168.1.50` | Opens the web UI; does not run AMMC |
|
||||
| Main decoder | `192.168.1.10` | Start/finish and lap counting |
|
||||
| Split decoder | `192.168.1.11` | Optional intermediate timing |
|
||||
| Pit entry decoder | `192.168.1.12` | Opens a pit stop |
|
||||
| Pit exit decoder | `192.168.1.13` | Closes a pit stop |
|
||||
|
||||
Replace these addresses with addresses from your own LAN.
|
||||
|
||||
## The three address types
|
||||
|
||||
| Value | Example | Consumer |
|
||||
|---|---|---|
|
||||
| Decoder IP | `192.168.1.10` | AMMC connects to the physical decoder |
|
||||
| AMMC WebSocket | `ws://192.168.1.100:9000` | Browser connects to AMMC on the backend host |
|
||||
| Backend URL | `http://192.168.1.100:8081` | Browser uses the web UI, API, and persistence |
|
||||
|
||||
`127.0.0.1` always means the current machine. Use `ws://127.0.0.1:9000` only when the browser and backend run on the same computer. A remote laptop must use the backend LAN address.
|
||||
|
||||
## Data path
|
||||
|
||||
```text
|
||||
car transponder -> physical loop -> physical decoder with its own IP
|
||||
-> AMMC process on backend -> unique backend WebSocket port
|
||||
-> browser/RaceController -> active session, results, statistics
|
||||
```
|
||||
|
||||
Complete example:
|
||||
|
||||
```text
|
||||
Main 192.168.1.10 -> backend AMMC :9000 -> main/start-finish
|
||||
Split 192.168.1.11 -> backend AMMC :9001 -> intermediate timing
|
||||
Pit entry 192.168.1.12 -> backend AMMC :9002 -> open stop
|
||||
Pit exit 192.168.1.13 -> backend AMMC :9003 -> close stop
|
||||
|
||||
Operator laptop opens http://192.168.1.100:8081 and connects to
|
||||
ws://192.168.1.100:9000 through ws://192.168.1.100:9003.
|
||||
```
|
||||
|
||||
## Supported layouts
|
||||
|
||||
| Installation | Decoders | Enabled roles |
|
||||
|---|---:|---|
|
||||
| Normal timing | 1 | Main |
|
||||
| Timing with split | 2 | Main + Split |
|
||||
| Timing with pit stops | 3 | Main + Pit entry + Pit exit |
|
||||
| Full endurance | 4 | Main + Split + Pit entry + Pit exit |
|
||||
|
||||
Pit timing always needs both entry and exit. One pit decoder cannot calculate stop duration.
|
||||
|
||||
## Roles and ports
|
||||
|
||||
| Role | Example decoder IP | AMMC port | Counts laps? | Stored data |
|
||||
|---|---:|---:|---|---|
|
||||
| Main start/finish | `192.168.1.10` | `9000` | Yes | Passing, lap, and lap time |
|
||||
| Split | `192.168.1.11` | `9001` | No | Split since latest main crossing |
|
||||
| Pit entry | `192.168.1.12` | `9002` | No | Entry time and active driver/car |
|
||||
| Pit exit | `192.168.1.13` | `9003` | No | Exit time and completed stop duration |
|
||||
|
||||
Each physical decoder needs a unique IP. Each enabled AMMC process needs a unique WebSocket port.
|
||||
|
||||
## Recommended Managed AMMC setup
|
||||
|
||||
AMMC runs on the computer started with `npm start` or `npm.cmd start`, not on a remote browser laptop.
|
||||
|
||||
1. Start the backend and open `Settings`.
|
||||
2. From remote devices use backend URL `http://192.168.1.100:8081`.
|
||||
3. Enable `Managed AMMC`.
|
||||
4. Configure Main decoder host `192.168.1.10`, port `9000`.
|
||||
5. If present, enable Split and configure host `192.168.1.11`, port `9001`.
|
||||
6. If both pit decoders are present, enable Pit and configure entry `.12`/`9002` and exit `.13`/`9003`.
|
||||
7. Save AMMC and click `Start AMMC`.
|
||||
8. Verify every enabled process reports Running without an error.
|
||||
9. Click `Use server WS URL`.
|
||||
10. Open `Timing`, click `Connect decoder`, and verify every enabled role is Connected.
|
||||
|
||||
Client WebSocket URLs for this example are:
|
||||
|
||||
```text
|
||||
Main ws://192.168.1.100:9000
|
||||
Split ws://192.168.1.100:9001
|
||||
Pit entry ws://192.168.1.100:9002
|
||||
Pit exit ws://192.168.1.100:9003
|
||||
```
|
||||
|
||||
Do not put the physical decoder IP in the browser WebSocket URL. The WebSocket server is AMMC on the backend host.
|
||||
|
||||
## Manual AMMC
|
||||
|
||||
Run one process per enabled role:
|
||||
|
||||
```powershell
|
||||
ammc-amb.exe -w 9000 192.168.1.10
|
||||
ammc-amb.exe -w 9001 192.168.1.11
|
||||
ammc-amb.exe -w 9002 192.168.1.12
|
||||
ammc-amb.exe -w 9003 192.168.1.13
|
||||
```
|
||||
|
||||
Syntax: `ammc-amb -w <backend WebSocket port> <physical decoder IP>`.
|
||||
|
||||
Disable Managed AMMC when starting these processes manually, otherwise two processes may compete for the same port.
|
||||
|
||||
## Firewall
|
||||
|
||||
Open ports on the backend host, not the operator laptop.
|
||||
|
||||
Linux/UFW:
|
||||
|
||||
```bash
|
||||
sudo ufw allow 8081/tcp
|
||||
sudo ufw allow 9000:9003/tcp
|
||||
```
|
||||
|
||||
Windows, from an elevated PowerShell:
|
||||
|
||||
```powershell
|
||||
Start-Process powershell -Verb RunAs -ArgumentList '-ExecutionPolicy Bypass -File .\windows\setup.ps1 -OpenFirewall -StartServer'
|
||||
```
|
||||
|
||||
This opens TCP `8081` and `9000-9003`. Use these ports only on a trusted LAN. Never expose the admin UI, API, or AMMC ports directly to the internet.
|
||||
|
||||
## Verification order
|
||||
|
||||
1. Ping every physical decoder from the backend host.
|
||||
2. Verify backend status with `npm run status` or `npm.cmd run status`.
|
||||
3. Start Managed AMMC and inspect its log.
|
||||
4. Connect decoder roles in `Timing`.
|
||||
5. Cross Main: lap count must increase.
|
||||
6. Cross Split: split changes but lap count does not.
|
||||
7. Cross Pit entry: competitor becomes `IN PIT`.
|
||||
8. Cross Pit exit: one timed pit stop is created.
|
||||
|
||||
## Where the data appears
|
||||
|
||||
- `Timing`: live leaderboard, split, and pit log.
|
||||
- `Overlay`: latest split and active pit state.
|
||||
- `Race Setup -> Manage -> Live / results`: analysis per heat.
|
||||
- Result/PDF exports: split/pit summary and complete pit log.
|
||||
- `Training -> More statistics`: personal profile statistics for the selected class.
|
||||
- Personal mobile profile: sanitized aggregates only; no transponder or raw pit log.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
| Symptom | Likely cause | Check |
|
||||
|---|---|---|
|
||||
| Decoder offline | Main WebSocket unavailable | AMMC main, port `9000`, firewall |
|
||||
| AMMC starts then exits | Decoder IP, binary, or library error | AMMC log and ping from backend |
|
||||
| Remote laptop opens UI but receives no timing | URL uses `127.0.0.1` | Use `ws://<backend-IP>:9000` |
|
||||
| Main works but Split does not | Split disabled or port blocked | Decoder `.11`, port `9001`, Timing status |
|
||||
| Pit entry works but no stop closes | Pit exit missing/wrong role | Decoder `.13`, port `9003`, separate loop |
|
||||
| Split crossing increments laps | Feed assigned to wrong role | Use separate IP/port for Main and Split |
|
||||
| `EADDRINUSE` | Duplicate AMMC port/process | Stop manual AMMC or assign unique ports |
|
||||
|
||||
## Invariants
|
||||
|
||||
- Only Main may count laps.
|
||||
- Split and pit records must never be stored as normal lap passings.
|
||||
- Pit entry and exit are separate roles.
|
||||
- A stop remains attributed to the driver/car captured at pit entry during an endurance driver change.
|
||||
- Driver statistics remain separated by class.
|
||||
|
||||
203
docs/decoder-setup.sv.md
Normal file
203
docs/decoder-setup.sv.md
Normal file
@@ -0,0 +1,203 @@
|
||||
# Decoder-, IP- och AMMC-konfiguration
|
||||
|
||||
Den här guiden beskriver hur fysiska MyLaps/AMB-decoders kopplas till JMK RB RaceController. Exemplen använder följande nätverk:
|
||||
|
||||
| Enhet | Exempeladress | Uppgift |
|
||||
|---|---:|---|
|
||||
| RaceController/backend | `192.168.1.100` | Kör Node.js, AMMC-processerna, webb och API |
|
||||
| Operatörens laptop | `192.168.1.50` | Öppnar webbgränssnittet, kör inte AMMC |
|
||||
| Main-decoder | `192.168.1.10` | Start/mål och varvräkning |
|
||||
| Mellantidsdecoder | `192.168.1.11` | Valfri split/mellantid |
|
||||
| Depå in-decoder | `192.168.1.12` | Öppnar depåstopp |
|
||||
| Depå ut-decoder | `192.168.1.13` | Stänger depåstopp |
|
||||
|
||||
Byt adresserna mot adresserna i ditt nätverk.
|
||||
|
||||
## Tre olika adresstyper
|
||||
|
||||
De här värdena får inte blandas ihop:
|
||||
|
||||
| Värde | Exempel | Vem använder det? |
|
||||
|---|---|---|
|
||||
| Decoder-IP | `192.168.1.10` | AMMC ansluter till fysisk decoder |
|
||||
| AMMC WebSocket | `ws://192.168.1.100:9000` | Webbläsaren ansluter till AMMC på backend-hosten |
|
||||
| Backend URL | `http://192.168.1.100:8081` | Webbläsaren använder webb, API och sparning |
|
||||
|
||||
`127.0.0.1` betyder alltid "den här maskinen". Använd därför bara `ws://127.0.0.1:9000` när webbläsaren kör på samma dator som backend. Från en laptop ska du använda backend-datorns LAN-IP, till exempel `ws://192.168.1.100:9000`.
|
||||
|
||||
## Dataflödet
|
||||
|
||||
```text
|
||||
Bilens transponder
|
||||
-> fysisk loop i banan
|
||||
-> fysisk decoder med egen IP
|
||||
-> AMMC-process på backend-datorn
|
||||
-> unik WebSocket-port på backend-datorn
|
||||
-> webbläsaren/RaceController
|
||||
-> aktiv session, resultat och statistik
|
||||
```
|
||||
|
||||
Komplett exempel:
|
||||
|
||||
```text
|
||||
Main: decoder 192.168.1.10 -> AMMC på backend :9000 -> main/start/mål
|
||||
Split: decoder 192.168.1.11 -> AMMC på backend :9001 -> mellantid
|
||||
Depå in: decoder 192.168.1.12 -> AMMC på backend :9002 -> öppna stopp
|
||||
Depå ut: decoder 192.168.1.13 -> AMMC på backend :9003 -> stäng stopp
|
||||
|
||||
Laptop 192.168.1.50 öppnar:
|
||||
http://192.168.1.100:8081
|
||||
och ansluter till:
|
||||
ws://192.168.1.100:9000
|
||||
ws://192.168.1.100:9001
|
||||
ws://192.168.1.100:9002
|
||||
ws://192.168.1.100:9003
|
||||
```
|
||||
|
||||
## Välj antal decoders
|
||||
|
||||
| Installation | Fysiska decoders | Aktivera |
|
||||
|---|---:|---|
|
||||
| Vanlig tidtagning | 1 | Main |
|
||||
| Tidtagning + mellantid | 2 | Main + Split |
|
||||
| Tidtagning + depåstopp | 3 | Main + Depå in + Depå ut |
|
||||
| Komplett endurance | 4 | Main + Split + Depå in + Depå ut |
|
||||
|
||||
Depåtid kräver alltid både Depå in och Depå ut. En enda depådecoder kan inte beräkna stopptiden.
|
||||
|
||||
## Roller och standardportar
|
||||
|
||||
| Roll | Decoder-IP i exemplet | AMMC-port | Påverkar varv? | Sparad data |
|
||||
|---|---:|---:|---|---|
|
||||
| Main start/mål | `192.168.1.10` | `9000` | Ja | Passering, varv och varvtid |
|
||||
| Mellantid | `192.168.1.11` | `9001` | Nej | Split från senaste main-passering |
|
||||
| Depå in | `192.168.1.12` | `9002` | Nej | Tidpunkt och aktiv förare/bil vid infart |
|
||||
| Depå ut | `192.168.1.13` | `9003` | Nej | Tidpunkt och färdig depåstopptid |
|
||||
|
||||
Varje fysisk decoder ska ha en unik IP. Varje aktiverad AMMC-process ska ha en unik WebSocket-port. Använd aldrig samma port för två roller.
|
||||
|
||||
## Rekommenderad konfiguration: Managed AMMC
|
||||
|
||||
AMMC körs på samma dator som startats med `npm start` eller `npm.cmd start`. Webbläsaren kan köras på en annan dator.
|
||||
|
||||
1. Starta backend.
|
||||
2. Öppna `Inställningar`.
|
||||
3. Kontrollera `Backend URL`: `http://192.168.1.100:8081` från andra datorer.
|
||||
4. Aktivera `Hanterad AMMC`.
|
||||
5. Fyll i de roller som finns fysiskt.
|
||||
|
||||
Exempel på fälten under `Hanterad AMMC`:
|
||||
|
||||
| Fält | Värde |
|
||||
|---|---|
|
||||
| Main decoder IP / host | `192.168.1.10` |
|
||||
| Main WebSocket-port | `9000` |
|
||||
| Aktivera mellantidsdecoder | På om decoder `.11` finns |
|
||||
| Mellantid decoder IP / host | `192.168.1.11` |
|
||||
| Mellantid WebSocket-port | `9001` |
|
||||
| Aktivera depådecoders | På endast om både `.12` och `.13` finns |
|
||||
| Depå in decoder IP / host | `192.168.1.12` |
|
||||
| Depå in WebSocket-port | `9002` |
|
||||
| Depå ut decoder IP / host | `192.168.1.13` |
|
||||
| Depå ut WebSocket-port | `9003` |
|
||||
|
||||
6. Klicka `Spara AMMC`.
|
||||
7. Klicka `Starta AMMC`.
|
||||
8. Kontrollera att varje aktiverad process står som `Kör` och inte visar fel.
|
||||
9. Klicka `Använd serverns WS-url`. Detta fyller klientfälten med backend-IP, inte decoder-IP.
|
||||
10. Gå till `Tidtagning` och klicka `Anslut decoder`.
|
||||
11. Kontrollera att Main och valfria roller står som `Ansluten`.
|
||||
|
||||
## Klientens WebSocket-fält
|
||||
|
||||
När backend är `192.168.1.100` ska klientinställningarna vara:
|
||||
|
||||
| Klientfält | Värde |
|
||||
|---|---|
|
||||
| Main WebSocket-url | `ws://192.168.1.100:9000` |
|
||||
| Mellantid WebSocket-url | `ws://192.168.1.100:9001` |
|
||||
| Depå in WebSocket-url | `ws://192.168.1.100:9002` |
|
||||
| Depå ut WebSocket-url | `ws://192.168.1.100:9003` |
|
||||
|
||||
Skriv inte decoder-IP i WebSocket-url. `ws://192.168.1.10:9000` är normalt fel eftersom AMMC-porten finns på backend-datorn, inte på decodern.
|
||||
|
||||
## Manuell AMMC-start
|
||||
|
||||
Använd manuell start endast när backend inte ska hantera processerna. Kör en process per roll:
|
||||
|
||||
```powershell
|
||||
ammc-amb.exe -w 9000 192.168.1.10
|
||||
ammc-amb.exe -w 9001 192.168.1.11
|
||||
ammc-amb.exe -w 9002 192.168.1.12
|
||||
ammc-amb.exe -w 9003 192.168.1.13
|
||||
```
|
||||
|
||||
Syntaxen är:
|
||||
|
||||
```text
|
||||
ammc-amb -w <WebSocket-port på backend> <fysisk decoder-IP>
|
||||
```
|
||||
|
||||
Starta bara processerna för de roller som används. Stäng av `Hanterad AMMC` om processerna startas manuellt, annars kan två processer försöka använda samma portar.
|
||||
|
||||
## Brandvägg
|
||||
|
||||
Portarna öppnas på backend-datorn, inte på operatörens laptop.
|
||||
|
||||
Linux/UFW:
|
||||
|
||||
```bash
|
||||
sudo ufw allow 8081/tcp
|
||||
sudo ufw allow 9000:9003/tcp
|
||||
```
|
||||
|
||||
Windows, kör installationsskriptet som administratör:
|
||||
|
||||
```powershell
|
||||
Start-Process powershell -Verb RunAs -ArgumentList '-ExecutionPolicy Bypass -File .\windows\setup.ps1 -OpenFirewall -StartServer'
|
||||
```
|
||||
|
||||
Det öppnar TCP `8081` och `9000-9003`. Öppna endast portarna på ett betrott LAN. Exponera inte admin-UI, API eller AMMC-portar direkt mot internet.
|
||||
|
||||
## Start- och testordning
|
||||
|
||||
1. Pinga varje fysisk decoder från backend: `ping 192.168.1.10` och motsvarande extradecoders.
|
||||
2. Starta backend och kontrollera `npm run status` eller `npm.cmd run status`.
|
||||
3. Starta Managed AMMC.
|
||||
4. Läs AMMC-loggen i `Inställningar`. Fel mot decoder-IP ska lösas innan webbläsaren felsöks.
|
||||
5. Anslut rollerna i `Tidtagning`.
|
||||
6. Kör en transponder över Main. Antal varv ska öka.
|
||||
7. Kör över Split. Mellantiden ska uppdateras men varvantalet ska vara oförändrat.
|
||||
8. Kör över Depå in. Status ska bli `I DEPÅ`.
|
||||
9. Kör över Depå ut. Ett depåstopp med tid ska skapas.
|
||||
|
||||
## Var data visas
|
||||
|
||||
- `Tidtagning`: live leaderboard, split och aktiv/fullständig depålogg.
|
||||
- `Overlay`: senaste split och depåstatus för aktiv session.
|
||||
- `Race Setup -> Hantera -> Live / resultat`: sammanställning per heat.
|
||||
- Resultat/PDF: split-/depåsammanställning och full depålogg.
|
||||
- `Träning -> Mer statistik`: statistik per personlig profil och vald klass.
|
||||
- Personlig mobilprofil: endast sanerade aggregat, aldrig transponder eller rå depålogg.
|
||||
|
||||
## Felsökning
|
||||
|
||||
| Symptom | Trolig orsak | Kontroll |
|
||||
|---|---|---|
|
||||
| `Decoder offline` | Main WebSocket kan inte nås | AMMC main kör, port `9000`, brandvägg |
|
||||
| AMMC startar men stannar | Fel decoder-IP, binär eller bibliotek | AMMC-logg och ping från backend |
|
||||
| Laptop når sidan men inte tider | WS-url använder `127.0.0.1` | Byt till `ws://<backend-IP>:9000` |
|
||||
| Main fungerar men split saknas | Split ej aktiverad eller port blockerad | `.11`, port `9001`, status i Tidtagning |
|
||||
| Depå in visas men inget stopp skapas | Depå ut saknas eller använder fel roll | `.13`, port `9003`, separat fysisk loop |
|
||||
| Varv ökar vid mellantid | Samma feed/roll används fel | Main och Split ska ha separata decoder-IP/portar |
|
||||
| `EADDRINUSE` | Två processer använder samma port | Stoppa manuell AMMC eller byt unik port |
|
||||
| Ingen anslutning efter kopierade filer | Backend kör gammal kod | `npm restart` eller `npm.cmd restart` |
|
||||
|
||||
## Regler som inte får ändras
|
||||
|
||||
- Endast Main får räkna varv.
|
||||
- Split och depå får aldrig läggas in som vanliga passeringar.
|
||||
- Depå in och Depå ut måste vara två separata roller.
|
||||
- Ett depåstopp kopplas till förare/bil vid depåinfarten även om laget byter förare innan utfarten.
|
||||
- Olika klasser hålls separerade i förarstatistik.
|
||||
|
||||
@@ -224,7 +224,7 @@ Important constraints:
|
||||
- `npm start` is already a background start; batch wrappers must not create a second detached npm process
|
||||
- server process identity is stored in `data\\server.pid`
|
||||
- Windows stdout/stderr use `logs\\server.out.log` and `logs\\server.err.log`
|
||||
- the optional `-OpenFirewall` setup flag opens inbound TCP `8081` and `9000` only when PowerShell is elevated
|
||||
- the optional `-OpenFirewall` setup flag opens inbound TCP `8081` and decoder channels `9000-9003` only when PowerShell is elevated
|
||||
|
||||
## 2.2 Frontend files
|
||||
|
||||
@@ -895,6 +895,8 @@ sequenceDiagram
|
||||
|
||||
### 8.3.1 Multi-decoder topology and ownership
|
||||
|
||||
Operator-facing installation and IP configuration is documented in `docs/decoder-setup.md` and `docs/decoder-setup.sv.md`. This architecture section defines code ownership and invariants; the setup guides define deployment values and verification order.
|
||||
|
||||
The decoder runtime supports four explicit roles. Roles are semantic, not inferred from `loop_id`; the WebSocket connection used to receive a message determines how it is processed.
|
||||
|
||||
| Runtime role | Frontend URL setting | Managed AMMC config | Default port | Canonical mutation |
|
||||
|
||||
Reference in New Issue
Block a user