│ ├── 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? }