│ ├── Mini Map + Tractor Position
│ ├── Path + Coverage
│ ├── Speed / PTO / Hydraulics
│ ├── Warnings / Faults
│ ├── Pause / Take Over
│ └── End Job
Live Run
Top:
————————————
[< Back] LIVE RUN [Stop All]
Map Panel:
————————————
(Tractor icon moving on mini-map)
Path: solid line
Coverage: light green fill
Obstacle markers (if detected)
Center Panel:
————————————
Speed: 4.8 mph
Engine Load: 55%
Autonomy: ACTIVE
PTO: ON (540 rpm)
Hydraulics: “Mowing preset”
Warnings (collapsible):
————————————
• Ultrasonic Left: Obstacle detected at 2.8m
• GPS degrade – switching to slow mode
Bottom Buttons:
————————————
[PAUSE] [TAKE OVER] [OPTIONS]
API-
You’ll likely want WebSockets for low-latency data + commands.
Real-Time Telemetry (WebSocket)
- WS /ws/telemetry
– Server → app:
{ jobId, tractorId, fieldId, position, heading, speed, coverage, ptoStatus, hydraulicPreset, safetyState, obstacles[], timestamps }
Real-Time Commands (could be same socket or separate)
- WS /ws/commands (or reuse /ws/telemetry bidirectionally)
– App → server:
{ type: “PAUSE” | “RESUME” | “TAKE_OVER” | “SET_TARGET_SPEED” | “STOP”, payload: { jobId, value? } }
If you want REST fallbacks:
- GET /machines/current/status
– Snapshot for when socket isn’t connected. - POST /machines/{machineId}/commands
– Body: { command: “PAUSE” | “STOP” | “RESUME” | “TAKE_OVER” | “SET_SPEED”, value? }