{
  "openapi": "3.0.2",
  "info": {
    "description": "SoAR message protocol in schemas",
    "title": "SoAR Backbone Message Formats",
    "version": "1.0"
  },
  "paths": {},
  "components": {
    "schemas": {
      "MESSAGE": {
        "description": "Full message definition with message-metadata in `header` and different message type schemas under `payload`",
        "properties": {
          "header": {
            "$ref": "#/components/schemas/header"
          },
          "payload": {
            "$ref": "#/components/schemas/payload"
          }
        },
        "required": [
          "header",
          "payload"
        ],
        "type": "object"
      },
      "acknowledgement": {
        "properties": {
          "acknowledged_message_ID": {
            "description": "Identifier of message received and executed with success for mission plans sent by the Autonomy Engine.",
            "example": "02125022255-7bc8-11ed-a1eb-0242ac999999",
            "type": "string"
          },
          "message_type": {
            "description": "Type of message",
            "example": "acknowledgement",
            "type": "string"
          },
          "status": {
            "description": "Highest level of acknowledgement. I.e. `c2_received`: Received by C2, `operator_approved_and_sent` : Approved by operator and sent from C2->Platform, `executed`: Executed by platform",
            "enum": [
              "c2_received",
              "operator_approved_and_sent",
              "executed"
            ],
            "example": "executed by platform",
            "type": "string"
          }
        },
        "required": [
          "message_type",
          "acknowledged_message_ID",
          "status"
        ],
        "type": "object"
      },
      "header": {
        "discriminator": {
          "propertyName": "message_type"
        },
        "properties": {
          "delivery_type": {
            "default": "publish",
            "description": "To publish or broadcast this message.",
            "enum": [
              "broadcast",
              "publish"
            ],
            "example": "publish",
            "type": "string"
          },
          "destination": {
            "description": "Publisher topic; What is the destination of this message",
            "example": "ah1",
            "type": "string"
          },
          "encoded": {
            "description": "Indicate that message raw (encoded) or decoded. Options: encoded=True, decoded=False",
            "example": false,
            "type": "boolean"
          },
          "message_ID": {
            "description": "An identifier for the type of message received.",
            "example": "b427003c-0000-11aa-a1eb-bvcdfghjgfdd",
            "type": "string"
          },
          "source": {
            "description": "The sender; Where is this message from",
            "example": "autonomy_engine",
            "type": "string"
          },
          "timestamp": {
            "description": "Timestamp of message",
            "example": "2022-11-16T00:00:00Z",
            "format": "date-time",
            "type": "string"
          },
          "version": {
            "description": "Version of comms backbone message format protocol",
            "example": 2.0,
            "format": "float",
            "type": "number"
          }
        },
        "type": "object"
      },
      "mission_plan": {
        "properties": {
          "autonomy_engine_plan_ID": {
            "description": "Unique identifier for this plangenerated by the Autonomy Engine",
            "example": 3,
            "type": "integer"
          },
          "message_type": {
            "description": "Type of message",
            "example": "mission_plan",
            "type": "string"
          },
          "plan": {
            "items": {
              "properties": {
                "action": {
                  "description": "Autonomy Engine's action from `move`, `payload`, `dive`, `send_hits`, `scanline`, `scanpoint`.",
                  "example": "move",
                  "type": "string"
                },
                "activate_payload": {
                  "description": "To activate/deactivate sensor for Autosub Hover-1 --> `MBES` sensor and for EcoSUB --> `Sidescan`",
                  "example": true,
                  "type": "boolean"
                },
                "altitude": {
                  "description": "Altitude of next action",
                  "example": 15.0,
                  "format": "float",
                  "type": "number"
                },
                "depth": {
                  "description": "Depth of next action",
                  "example": 15.0,
                  "format": "float",
                  "type": "number"
                },
                "flight_style": {
                  "description": "Platform-specific modes/flight styles to perform next action",
                  "example": "orbit",
                  "type": "string"
                },
                "latitude_waypoint": {
                  "description": "Next waypoint, x-coordinate",
                  "example": -4.187143188645706,
                  "format": "float",
                  "type": "number"
                },
                "longitude_waypoint": {
                  "description": "Next waypoint, y-coordinate",
                  "example": 50.37072283932642,
                  "format": "float",
                  "type": "number"
                },
                "send_environmental_data": {
                  "description": "To trigger the platform to send list of  observations if any found",
                  "example": false,
                  "type": "boolean"
                }
              },
              "required": [
                "latitude_waypoint",
                "longitude_waypoint"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "platform_ID": {
            "description": "Unique identifier for this platform",
            "example": 1,
            "type": "integer"
          }
        },
        "required": [
          "message_type",
          "autonomy_engine_plan_ID",
          "platform_ID",
          "plan"
        ],
        "type": "object"
      },
      "observation": {
        "properties": {
          "additional_data": {
            "description": "Placeholder field for any additional data",
            "example": {
              "sensor_payload": false
            }
          },
          "message_type": {
            "description": "Type of message",
            "example": "observation",
            "type": "string"
          },
          "platform_ID": {
            "description": "ID of platform to sending observations",
            "example": 2,
            "type": "integer"
          },
          "points_of_interest": {
            "description": "Points from features of interest identified by platform if any found.",
            "items": {
              "properties": {
                "latitude": {
                  "description": "Identified x-coordinate of point of interest",
                  "example": 178.2,
                  "format": "float",
                  "type": "number"
                },
                "longitude": {
                  "description": "Identified y-coordinate of point of interest",
                  "example": -10.122,
                  "format": "float",
                  "type": "number"
                },
                "quality_of_point": {
                  "description": "Quality/strength of points from features of interest identified by platform.",
                  "example": 0.98,
                  "format": "float",
                  "type": "number"
                }
              },
              "required": [
                "latitude",
                "longitude"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "region_surveyed": {
            "description": "Region surveyed by given platform. GEOJSON",
            "example": "",
            "nullable": true
          }
        },
        "required": [
          "message_type",
          "platform_ID"
        ],
        "type": "object"
      },
      "payload": {
        "discriminator": {
          "mapping": {
            "acknowledgement": "#/components/schemas/acknowledgement",
            "mission_plan": "#/components/schemas/mission_plan",
            "observation": "#/components/schemas/observation",
            "planning_configuration": "#/components/schemas/planning_configuration",
            "platform_status": "#/components/schemas/platform_status"
          },
          "propertyName": "message_type"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/acknowledgement"
          },
          {
            "$ref": "#/components/schemas/mission_plan"
          },
          {
            "$ref": "#/components/schemas/observation"
          },
          {
            "$ref": "#/components/schemas/planning_configuration"
          },
          {
            "$ref": "#/components/schemas/platform_status"
          }
        ]
      },
      "planning_configuration": {
        "properties": {
          "exclusion_zones": {
            "description": "Exclusion zones for all platforms",
            "items": {
              "description": "Using GEOJSON, exact 4-point region (rectangle shaped)",
              "properties": {
                "geometry_coordinates": {
                  "example": [
                    [
                      [
                        -4.187143188645706,
                        50.37072283932642
                      ],
                      [
                        -4.202697005964865,
                        50.368816892405874
                      ],
                      [
                        -4.203156724702808,
                        50.365640144076906
                      ],
                      [
                        -4.19449868846155,
                        50.362267670845654
                      ]
                    ]
                  ],
                  "type": "array"
                }
              },
              "required": [
                "geometry_coordinates"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "message_type": {
            "description": "Type of message",
            "example": "planning_configuration",
            "type": "string"
          },
          "planning_config_ID": {
            "description": "Unique identifier tagged to version of this configuration plan",
            "example": 3,
            "type": "integer"
          },
          "squads": {
            "items": {
              "properties": {
                "no_of_platforms": {
                  "description": "Number of platforms",
                  "example": 3,
                  "type": "integer"
                },
                "platforms": {
                  "description": "Squad consists of these platforms",
                  "items": {
                    "properties": {
                      "additional_specs": {
                        "description": "Any addition fields/data to be added here",
                        "example": {
                          "scan_type": "DVL",
                          "swath_width": 10.0
                        }
                      },
                      "emergency": {
                        "properties": {
                          "additional_data": {
                            "description": "Any addition fields/data to be added here",
                            "example": {}
                          },
                          "latitude_waypoint": {
                            "description": "X-coordinate safe place for respective platform",
                            "example": -7.432,
                            "format": "float",
                            "type": "number"
                          },
                          "longitude_waypoint": {
                            "description": "Y-coordinate safe place for respective platform",
                            "example": 50.365,
                            "format": "float",
                            "type": "number"
                          },
                          "safe_command": {
                            "description": "Command/Action that is native to respective partner's platform/C2",
                            "enum": [
                              "go_home",
                              "abort_now",
                              "stop_mission"
                            ],
                            "example": "go_home",
                            "type": "string"
                          },
                          "target_depth": {
                            "description": "Z-coordinate safe place for respective platform . If platform to NOT stay at depth, key in `0.0`",
                            "example": 10,
                            "format": "float",
                            "type": "number"
                          }
                        },
                        "required": [
                          "latitude_waypoint",
                          "longitude_waypoint",
                          "target_depth"
                        ],
                        "type": "object"
                      },
                      "max_velocity": {
                        "description": "Maximum altitude set for squad.",
                        "example": 0.9,
                        "format": "float",
                        "type": "number"
                      },
                      "min_altitude": {
                        "description": "Minimum altitude set for squad.",
                        "example": 15.2,
                        "format": "float",
                        "type": "number"
                      },
                      "min_velocity": {
                        "description": "Minimum velocity set for squad.",
                        "example": 0.1,
                        "format": "float",
                        "type": "number"
                      },
                      "model": {
                        "example": "reav",
                        "type": "string"
                      },
                      "platform_ID": {
                        "description": "Identifier for platform",
                        "example": 23,
                        "type": "integer"
                      },
                      "serial": {
                        "description": "platform serial number",
                        "example": "reav-60",
                        "type": "string"
                      }
                    },
                    "required": [
                      "platform_ID",
                      "serial",
                      "model",
                      "emergency",
                      "min_altitude",
                      "min_velocity",
                      "max_velocity"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                },
                "region_of_interest": {
                  "description": "Using GEOJSON, exact 4-point region (rectangle shaped)",
                  "properties": {
                    "geometry_coordinates": {
                      "example": [
                        [
                          [
                            -4.187143188645706,
                            50.37072283932642
                          ],
                          [
                            -4.202697005964865,
                            50.368816892405874
                          ],
                          [
                            -4.203156724702808,
                            50.365640144076906
                          ],
                          [
                            -4.19449868846155,
                            50.362267670845654
                          ]
                        ]
                      ],
                      "type": "array"
                    }
                  },
                  "required": [
                    "geometry_coordinates"
                  ],
                  "type": "object"
                },
                "squad_ID": {
                  "description": "Identifier of given squad",
                  "example": 23,
                  "type": "integer"
                },
                "squad_mission_type": {
                  "description": "Mission of given squad: `tracking`, `survey`, `inspection`",
                  "enum": [
                    "tracking",
                    "survey",
                    "inspection"
                  ],
                  "example": "survey",
                  "type": "string"
                },
                "squad_state": {
                  "description": "In execution, Waiting.. <define further>",
                  "example": false,
                  "type": "string"
                }
              },
              "required": [
                "squad_ID",
                "no_of_platforms",
                "platforms",
                "squad_mission_type",
                "squad_state"
              ],
              "type": "object"
            },
            "type": "array"
          }
        },
        "required": [
          "message_type",
          "planning_config_ID",
          "squads",
          "exclusion_zones"
        ],
        "type": "object"
      },
      "platform_status": {
        "properties": {
          "altitude": {
            "description": "Target altitude in metres",
            "example": 20,
            "format": "float",
            "type": "number"
          },
          "autonomy_engine_plan_ID": {
            "description": "Last mission plan ID (according to Autonomy Engine's mission plan number sent) executed by platform",
            "example": 1,
            "type": "integer"
          },
          "battery_remaining_capacity": {
            "description": "Battery remaining % provided by respective C2",
            "example": 80.2,
            "format": "float",
            "type": "number"
          },
          "current_pitch": {
            "description": "Current pitch of platform",
            "example": -4.0,
            "format": "float",
            "type": "number"
          },
          "depth": {
            "default": 0,
            "description": "Target depth in metres",
            "example": 50,
            "format": "float",
            "type": "number"
          },
          "heading": {
            "description": "Angular distance relative to north, usually 000\u00b0 at north, clockwise through 359\u00b0, in degrees",
            "example": 124.3,
            "format": "float",
            "type": "number"
          },
          "health_status": {
            "description": "Health status extracted by respective platform if any diagnosis is available to check sensors",
            "example": "Warning",
            "type": "string"
          },
          "latitude": {
            "description": "Latitude in decimal degrees.",
            "example": 178.2,
            "format": "float",
            "type": "number"
          },
          "localisation_error": {
            "description": "Localisation error at last USBL update.",
            "example": 0.000129,
            "format": "float",
            "type": "number"
          },
          "longitude": {
            "description": "Longitude in decimal degrees.",
            "example": -10.122,
            "format": "float",
            "type": "number"
          },
          "message_type": {
            "description": "Type of message",
            "example": "platform_status",
            "type": "string"
          },
          "mission_action_ID": {
            "description": "",
            "example": 1,
            "type": "integer"
          },
          "mission_track_ID": {
            "description": "Track number - stage in mission (e.g. 4 --> Waypoint 3 to Waypoint 4)",
            "example": 4,
            "type": "integer"
          },
          "platform_ID": {
            "description": "Identifier for platform",
            "example": 1,
            "type": "integer"
          },
          "platform_state": {
            "description": "Current state executed by platform. E.g. STOP, IDLE, ABORT.",
            "example": "ABORT",
            "type": "string"
          },
          "platform_timestamp": {
            "description": "Timestamp for onboard platform status message",
            "example": "2022-12-21T00:00:00Z",
            "format": "date-time",
            "type": "string"
          },
          "range_to_go": {
            "description": "Estimated distance to reach next waypoint",
            "example": 124.3,
            "format": "float",
            "type": "number"
          },
          "sensor_config": {
            "description": "Scanning sensor on platform available to be controlled by  the Autonomy Engine",
            "properties": {
              "additional_data": {
                "description": "Any addition fields/data to be added here",
                "example": {
                  "payload": [
                    1.2,
                    434
                  ]
                }
              },
              "sensor_on": {
                "description": "Sensor switched on (True) or off (False)",
                "example": true,
                "type": "boolean"
              },
              "sensor_serial": {
                "description": "serial number of sensor",
                "example": "mbes-002a",
                "type": "string"
              }
            },
            "type": "object"
          },
          "speed_over_ground": {
            "description": "",
            "example": 124.3,
            "format": "float",
            "type": "number"
          },
          "status_source": {
            "description": "Indicate if this status message is from the platform or USBL",
            "enum": [
              "usbl",
              "onboard_platform"
            ],
            "example": "usbl",
            "type": "string"
          },
          "thrust_applied": {
            "description": "",
            "example": 124.3,
            "format": "float",
            "type": "number"
          },
          "transmission_mode": {
            "description": "Mode in which status message was transmitted when on the surface (e.g. iridium/wifi) or underwater (e.g. acoustics)",
            "enum": [
              "acoustics",
              "iridium",
              "wifi",
              "starlink"
            ],
            "example": "wifi",
            "type": "string"
          },
          "usbl_fix_seconds_ago": {
            "description": "USBL Fix received x second ago.",
            "example": 10.0,
            "format": "float",
            "type": "number"
          },
          "water_current_velocity": {
            "description": "",
            "example": 124.3,
            "format": "float",
            "type": "number"
          }
        },
        "required": [
          "message_type",
          "platform_ID",
          "status_source",
          "platform_timestamp",
          "latitude",
          "longitude"
        ],
        "type": "object"
      }
    }
  }
}