{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:adaptiveagrotech:fieldscout:simulation-command:v1",
  "title": "FieldScout local simulation command specimen",
  "description": "Educational browser export only. A live robot receiver must reject simulation_only=true. This schema is not a live control protocol or an authorisation mechanism.",
  "type": "object",
  "required": ["schema_type", "simulation_only", "seq", "timestamp", "simulation_time_s", "units", "serial", "wheels_rad_s", "wheels_rpm", "drivers"],
  "additionalProperties": false,
  "properties": {
    "schema_type": {"const": "fieldscout.simulation.command.v1"},
    "simulation_only": {"const": true},
    "seq": {"type": "integer", "minimum": 1},
    "timestamp": {"type": "string", "format": "date-time", "description": "Browser wall-clock export time; not a hardware freshness guarantee."},
    "simulation_time_s": {"type": "number", "minimum": 0},
    "units": {"const": "rad/s"},
    "serial": {"type": "string", "pattern": "^CMD,-?[0-9]+\\.[0-9]{3},-?[0-9]+\\.[0-9]{3},-?[0-9]+\\.[0-9]{3},-?[0-9]+\\.[0-9]{3}\\n$"},
    "wheels_rad_s": {"$ref": "#/$defs/angularWheels"},
    "wheels_rpm": {"$ref": "#/$defs/rpmWheels"},
    "drivers": {
      "type": "array", "minItems": 2, "maxItems": 2,
      "items": {"type": "object", "required": ["id", "rpm", "request_hex", "expected_ack_hex", "ack_status"], "additionalProperties": false,
        "properties": {
          "id": {"enum": [1, 2]},
          "rpm": {"type": "array", "minItems": 2, "maxItems": 2, "items": {"type": "integer", "minimum": -150, "maximum": 150}},
          "request_hex": {"type": "string", "pattern": "^[0-9A-F]{2}( [0-9A-F]{2}){12}$"},
          "expected_ack_hex": {"type": "string", "pattern": "^[0-9A-F]{2}( [0-9A-F]{2}){7}$"},
          "ack_status": {"const": "expected example only; no hardware response"}
        }
      }
    }
  },
  "$defs": {
    "angularWheels": {"type": "object", "required": ["FL", "FR", "RL", "RR"], "additionalProperties": false,
      "properties": {"FL":{"type":"number","minimum":-15.708,"maximum":15.708},"FR":{"type":"number","minimum":-15.708,"maximum":15.708},"RL":{"type":"number","minimum":-15.708,"maximum":15.708},"RR":{"type":"number","minimum":-15.708,"maximum":15.708}}},
    "rpmWheels": {"type": "object", "required": ["FL", "FR", "RL", "RR"], "additionalProperties": false,
      "properties": {"FL":{"type":"integer","minimum":-150,"maximum":150},"FR":{"type":"integer","minimum":-150,"maximum":150},"RL":{"type":"integer","minimum":-150,"maximum":150},"RR":{"type":"integer","minimum":-150,"maximum":150}}}
  }
}
