diff --git a/README.md b/README.md index 485ef7a..2dafbb9 100644 --- a/README.md +++ b/README.md @@ -427,6 +427,8 @@ SQLite database file: ## Connect to AMMC There are two supported modes. +For the complete network diagram, ready-to-use 1/2/3/4-decoder examples, firewall setup, and troubleshooting, see [`docs/decoder-setup.md`](docs/decoder-setup.md). Swedish: [`docs/decoder-setup.sv.md`](docs/decoder-setup.sv.md). + ### A. Managed AMMC from the web UI Important: - AMMC runs on the same host where the backend was started with `npm.cmd start` diff --git a/README.sv.md b/README.sv.md index 931b879..12f4ebc 100644 --- a/README.sv.md +++ b/README.sv.md @@ -416,6 +416,8 @@ SQLite-filen skapas automatiskt här: ## Koppla mot AMMC Det finns nu två sätt: +Komplett nätverksdiagram, färdiga exempel för 1/2/3/4 decoders, brandvägg och felsökning finns i [`docs/decoder-setup.sv.md`](docs/decoder-setup.sv.md). Engelsk version: [`docs/decoder-setup.md`](docs/decoder-setup.md). + ### A. Hanterad AMMC i webbgränssnittet Viktigt: - AMMC körs på samma Windows-host där backend startades med `npm.cmd start`. diff --git a/docs/decoder-setup.md b/docs/decoder-setup.md new file mode 100644 index 0000000..d4b9314 --- /dev/null +++ b/docs/decoder-setup.md @@ -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 `. + +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://: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. + diff --git a/docs/decoder-setup.sv.md b/docs/decoder-setup.sv.md new file mode 100644 index 0000000..54231b2 --- /dev/null +++ b/docs/decoder-setup.sv.md @@ -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 +``` + +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://: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. + diff --git a/docs/javascript-architecture.md b/docs/javascript-architecture.md index 4f82dce..ff3320e 100644 --- a/docs/javascript-architecture.md +++ b/docs/javascript-architecture.md @@ -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 | diff --git a/src/app.js b/src/app.js index 8975c33..b3214ea 100644 --- a/src/app.js +++ b/src/app.js @@ -906,8 +906,8 @@ const TRANSLATIONS = { "settings.enable_split_decoder": "Aktivera mellantidsdecoder", "settings.split_ws_url": "Mellantid WebSocket-url", "settings.enable_pit_decoders": "Aktivera depådecoders", - "settings.decoder_roles_hint": "Main räknar varv. Mellantid mäter från senaste main-passering. Depå in/ut mäter depåstopp. Varje fysisk decoder måste ha egen IP och varje AMMC-kanal egen WebSocket-port.", - "settings.managed_channels_hint": "Backend startar en separat AMMC-process per aktiverad kanal. Standardportar: main 9000, mellantid 9001, depå in 9002 och depå ut 9003.", + "settings.decoder_roles_hint": "Klientens WebSocket-url ska använda backend-datorns IP, inte den fysiska decoderns IP. Main räknar varv; mellantid och depå gör det aldrig.", + "settings.managed_channels_hint": "Fälten Decoder IP / host nedan är de fysiska decodrarnas adresser. Backend startar en AMMC-process per roll på unika portar: main 9000, mellantid 9001, depå in 9002 och depå ut 9003.", "settings.pit_entry_ws_url": "Depå in WebSocket-url", "settings.pit_exit_ws_url": "Depå ut WebSocket-url", "settings.split_decoder_host": "Mellantid decoder IP / host", @@ -1243,6 +1243,10 @@ const TRANSLATIONS = { "guide.decoder_roles_8": "8. Kontrollera i Tidtagning att varje aktiverad roll står som Ansluten. Om main är offline räknas inga varv; om en extrakanal är offline fortsätter vanlig varvräkning.", "guide.decoder_roles_9": "9. Tidtagning visar live-sammanställning och depåstoppslogg. Race Setup visar samma data per heat, och resultat-PDF inkluderar stoppantal, total depåtid samt varje depå in/ut.", "guide.decoder_roles_10": "10. Träningsstatistik och den personliga mobilprofilen visar sanerade mellantids- och depåaggregat per vald klass. Mobilprofilen visar inte transpondrar eller rå depålogg. Vid förarbyte tillhör stoppet föraren och bilen vid Depå in.", + "guide.decoder_roles_11": "11. Välj installation: 1 decoder = Main; 2 = Main + Mellantid; 3 = Main + Depå in/ut; 4 = alla roller. Depå kräver alltid både in och ut.", + "guide.decoder_roles_12": "12. Exempel: backend 192.168.1.100, main-decoder .10, split .11, depå in .12 och depå ut .13. Decoder-IP-fälten får .10-.13; klientens WS-url använder alltid backend .100 med port 9000-9003.", + "guide.decoder_roles_13": "13. Startordning: pinga decoders från backend, starta backend, starta Managed AMMC, kontrollera AMMC-loggen, använd serverns WS-url och anslut sedan i Tidtagning.", + "guide.decoder_roles_14": "14. Funktionstest: Main ska öka varv, Split ska inte öka varv, Depå in ska visa I DEPÅ och Depå ut ska skapa ett tidtaget stopp. Komplett guide finns i docs/decoder-setup.sv.md.", "guide.host_1": "1. AMMC körs alltid på samma maskin som backend körs på (`npm.cmd start` i Windows eller `npm start` i Linux).", "guide.host_2": "2. Om du bara surfar in från en laptop/webbläsare startas ingen process där. Webbläsaren styr bara backend via HTTP.", "guide.host_3": "3. Kör backend på Linux-servern -> Linux-binären används: `AMMC/linux_x86-64/ammc-amb`.", @@ -1938,8 +1942,8 @@ const TRANSLATIONS = { "settings.enable_split_decoder": "Enable split decoder", "settings.split_ws_url": "Split WebSocket URL", "settings.enable_pit_decoders": "Enable pit decoders", - "settings.decoder_roles_hint": "Main counts laps. Split measures from the latest main crossing. Pit entry/exit measures pit stops. Every physical decoder needs its own IP and every AMMC channel needs a unique WebSocket port.", - "settings.managed_channels_hint": "The backend starts one AMMC process per enabled channel. Default ports: main 9000, split 9001, pit entry 9002, and pit exit 9003.", + "settings.decoder_roles_hint": "Client WebSocket URLs must use the backend host IP, not a physical decoder IP. Main counts laps; split and pit channels never do.", + "settings.managed_channels_hint": "Decoder IP / host fields below are physical decoder addresses. The backend starts one AMMC process per role on unique ports: main 9000, split 9001, pit entry 9002, and pit exit 9003.", "settings.pit_entry_ws_url": "Pit entry WebSocket URL", "settings.pit_exit_ws_url": "Pit exit WebSocket URL", "settings.split_decoder_host": "Split decoder IP / host", @@ -2275,6 +2279,10 @@ const TRANSLATIONS = { "guide.decoder_roles_8": "8. Verify in Timing that every enabled role is Connected. If main is offline no laps are counted; an offline optional channel does not stop normal lap counting.", "guide.decoder_roles_9": "9. Timing shows a live summary and pit-stop log. Race Setup shows the same data per heat, and result PDFs include stop count, total pit time, and every pit entry/exit.", "guide.decoder_roles_10": "10. Training statistics and the personal mobile profile show sanitized split/pit aggregates per selected class. The mobile profile does not expose transponders or the raw pit log. During a driver change, the stop remains attributed to the driver and car at Pit entry.", + "guide.decoder_roles_11": "11. Choose a layout: 1 decoder = Main; 2 = Main + Split; 3 = Main + Pit entry/exit; 4 = every role. Pit timing always needs both entry and exit.", + "guide.decoder_roles_12": "12. Example: backend 192.168.1.100, main decoder .10, split .11, pit entry .12, and pit exit .13. Decoder host fields receive .10-.13; client WS URLs always use backend .100 with ports 9000-9003.", + "guide.decoder_roles_13": "13. Start order: ping decoders from backend, start backend, start Managed AMMC, inspect the AMMC log, use server WS URLs, then connect in Timing.", + "guide.decoder_roles_14": "14. Functional test: Main increments laps, Split does not, Pit entry shows IN PIT, and Pit exit creates a timed stop. See docs/decoder-setup.md for the complete guide.", "guide.host_1": "1. AMMC always runs on the backend host (`npm.cmd start` on Windows or `npm start` on Linux).", "guide.host_2": "2. If you only browse from a laptop/browser, no process is started there. The browser only controls the backend over HTTP.", "guide.host_3": "3. Run the backend on Linux -> the Linux binary is used: `AMMC/linux_x86-64/ammc-amb`.", diff --git a/src/misc_views.js b/src/misc_views.js index 0cf74d6..59c5759 100644 --- a/src/misc_views.js +++ b/src/misc_views.js @@ -72,7 +72,7 @@ export function renderGuideView({ dom, t }) {
- ${renderGuidePanel("guide.decoder_roles_title", ["guide.decoder_roles_1", "guide.decoder_roles_2", "guide.decoder_roles_3", "guide.decoder_roles_4", "guide.decoder_roles_5", "guide.decoder_roles_6", "guide.decoder_roles_7", "guide.decoder_roles_8", "guide.decoder_roles_9", "guide.decoder_roles_10"], "", { t })} + ${renderGuidePanel("guide.decoder_roles_title", ["guide.decoder_roles_1", "guide.decoder_roles_2", "guide.decoder_roles_3", "guide.decoder_roles_4", "guide.decoder_roles_5", "guide.decoder_roles_6", "guide.decoder_roles_7", "guide.decoder_roles_8", "guide.decoder_roles_9", "guide.decoder_roles_10", "guide.decoder_roles_11", "guide.decoder_roles_12", "guide.decoder_roles_13", "guide.decoder_roles_14"], "", { t })} ${renderGuidePanel("guide.host_title", ["guide.host_1", "guide.host_2", "guide.host_3", "guide.host_4", "guide.host_5", "guide.host_6", "guide.host_7", "guide.host_8"], "", { t })}
diff --git a/windows/README.md b/windows/README.md index 677dff7..7ec9b1f 100644 --- a/windows/README.md +++ b/windows/README.md @@ -111,6 +111,8 @@ windows\start_ammc.bat ## Managed AMMC from the web UI +For the complete decoder/IP diagram and examples for Main, Split, and Pit roles, see [`..\docs\decoder-setup.md`](../docs/decoder-setup.md) or the [Swedish guide](../docs/decoder-setup.sv.md). + The recommended normal operation is to let the backend manage AMMC: 1. Start RaceController with `npm.cmd start`.