# ATO ↔ TrainSim interface (v1) Standalone. No ETCS. No ATP. JSON over HTTP. Base URL (TrainSim): `http://trainsim:8080` ## TrainSim → ATO reads `GET /train/state` ```json { "speed_mps": 0.0, "position_m": 0.0, "track_length_m": 1000.0, "sim_running": false } ``` ## ATO → TrainSim writes `POST /train/actuate` ```json { "traction_pct": 0, "brake_pct": 0 } ``` Percent 0–100. Do not send both > 0 (TrainSim clamps brake wins). `POST /sim/start` — start physics tick (empty body) `POST /sim/stop` — pause physics (empty body) Optional (TrainSim logs only): `POST /train/doors` `{ "command": "open" | "close" }` ## ATO configuration (env) | Variable | Meaning | |----------|---------| | `TRAINSIM_URL` | TrainSim base URL | | `TARGET_SPEED_MPS` | Cruise target (default 10) | | `TICK_MS` | Control period (default 100) |