# ModelRailPro 🚂 (werktitel)

Moderne, zelf-gehoste modeltreinbesturing — web/PWA, realtime, mobiel-first.
Een eigen, eigentijdse "iTrain": draait op een klein kastje (Raspberry Pi / mini-pc)
dat aan je baan hangt, en je bedient alles vanaf je telefoon/tablet in hetzelfde wifi.

## Waarom
- **Modern**: PWA, realtime via WebSocket, donker en strak, grote tikdoelen, meerdere
  bedienposten tegelijk (ieder z'n telefoon). Geen Java-desktop.
- **Zelf-gehost & open**: geen abonnement, geen cloud. Alles op je eigen kastje.
- **Adapter-architectuur**: de besturingslogica weet niet welke centrale eronder hangt.
  Eén interface, meerdere "adapters" (sim, DCC-EX, Twin Center …).

## Jouw opstelling
- **Centrale:** Fleischmann **Twin Center** + **Twin Control** (Uhlenbrock Intellibox-familie)
  → seriële koppeling met het **P50X-protocol** (RS232, vaak via USB-serieel).
- **Wissel-/blokdecoders:** Littfinski (**LDT**) → geschakeld via DCC-accessory dóór de
  centrale; s88-terugmelding voor bezetmelding.
- **Locdecoders:** **ESU** (op 2–3 na) → gewoon DCC.

## Nu al werkend (v0.1)
- Volledige **simulator** (geen hardware nodig) + moderne PWA-throttle:
  - locroster, grote snelheidsregelaar (0–126), richting, STOP, **noodstop**
  - functieknoppen per loc (licht/geluid…), met "vasthouden" voor momentane functies
  - wissels schakelen
  - railspanning aan/uit
  - realtime synchroon over meerdere apparaten
- DCC-EX adapter (TCP/WiFi) als alternatief.
- Twin Center adapter **scaffold** (P50X) — interface klaar, telegrammen nog te verifiëren.

## Starten — makkelijkst (dubbelklik)
Eenmalig **Node.js 18+** installeren (https://nodejs.org, LTS). Daarna:
- **Windows:** dubbelklik `start-windows.bat`
- **macOS:** rechtsklik `start-mac.command` → Open (1e keer), daarna dubbelklik
- **Linux / Raspberry Pi:** `./start-linux.sh`

De browser opent vanzelf op http://localhost:3000. Op je telefoon: open het getoonde
`http://192.168.x.x:3000` (zelfde wifi) → "Toevoegen aan beginscherm" voor een echte app.

## Centrale instellen
Open `data/config.json`, zet `mode` (sim · dccex · z21 · dr5000 · ecos · twincenter) en
voor netwerk-centrales het `host`-IP. Opslaan, opnieuw starten. Geen commandoregel nodig.

## Starten — handmatig
```bash
cd modelrailpro
node server.js
# of met env-variabelen (hebben voorrang op config.json):
PORT=3000 DCC_MODE=z21 DCC_HOST=192.168.0.111 node server.js
```

### Met je Twin Center
```bash
npm i serialport               # eenmalig, native module
DCC_MODE=twincenter TC_PORT=/dev/ttyUSB0 TC_BAUD=19200 node server.js
```
**Eerste keer koppelen?** Volg `HARDWARE.md` (bring-up checklist) en test losse telegrammen met:
```bash
node tools/p50x-test.js --port /dev/ttyUSB0 --baud 19200 power on
```

## Roadmap → volledige automatisering
1. **v0.1 — handmatig rijden (KLAAR, simulator):** throttle, functies, wissels, noodstop, PWA.
2. **Twin Center live:** P50X-telegrammen implementeren + verifiëren (rijden, functies,
   wissels via LDT, railspanning).
3. **Terugmelding:** s88/LDT-bezetmelders uitlezen → live "welk blok is bezet".
4. **Baanschema-editor:** sporen, blokken, wissels, seinen tekenen (web-canvas).
5. **Bloksturing:** botsingpreventie — een trein mag alleen een vrij/gereserveerd blok in.
6. **Routes & rijwegen:** wissels + seinen als één route schakelen.
7. **Automatisch rijden:** treinen volgen routes/dienstregeling; handmatig overrulen kan altijd.
8. **Extra's:** push-meldingen (kortsluiting/storing), rij-logging, scenes, kinderbediening.

## Architectuur
```
browser (PWA)  ──WebSocket──►  server.js (Node, 0 dependencies)
                                  │
                                  ├─ lib/ws.js        minimale WebSocket-server
                                  ├─ lib/dccex.js     adapter: sim / DCC-EX (TCP)
                                  ├─ lib/twincenter.js adapter: Twin Center (P50X serieel)
                                  └─ lib/store.js     roster (locs+wissels) als JSON
```
Een adapter biedt steeds dezelfde methoden: `connect / power / throttle / func / estop /
turnout` en zendt `state`/`log`-events. De server zet die om naar WebSocket-broadcasts.

Roster (locs + wissels) staat in `data/roster.json` — pas die aan voor je eigen materieel.
