From 631b96c0e8d26453920550ca6dbd8ce323abcfda Mon Sep 17 00:00:00 2001
From: Trishna Saeharaseelan <trishna.saeharaseelan@noc.ac.uk>
Date: Tue, 16 May 2023 10:24:35 +0100
Subject: [PATCH] refactor: planning configuration file

---
 .../planning_configuration.json               | 194 +++++++++----
 .../gui_adapter/planning_configuration.json   | 205 +++++++++----
 formats/planning_configuration.py             |  76 ++++-
 project/soar/swagger.json                     | 166 +++++++----
 tests-js/docker/output.txt                    | 273 ++++++++++++++++++
 5 files changed, 740 insertions(+), 174 deletions(-)
 create mode 100644 tests-js/docker/output.txt

diff --git a/examples/autonomy_engine_adapter/planning_configuration.json b/examples/autonomy_engine_adapter/planning_configuration.json
index c5a4fb7..977e5a2 100644
--- a/examples/autonomy_engine_adapter/planning_configuration.json
+++ b/examples/autonomy_engine_adapter/planning_configuration.json
@@ -16,111 +16,195 @@
         "geometry_coordinates": [
           [
             [
-              -4.187143188645706,
-              50.37072283932642
+              -4.1777839187560915,
+              50.34173405662855
             ],
             [
-              -4.202697005964865,
-              50.368816892405874
+              -4.1777839187560915,
+              50.33820949229701
             ],
             [
-              -4.203156724702808,
-              50.365640144076906
+              -4.143667777943875,
+              50.33820949229701
             ],
             [
-              -4.19449868846155,
-              50.362267670845654
+              -4.143667777943875,
+              50.34173405662855
+            ],
+            [
+              -4.1777839187560915,
+              50.34173405662855
             ]
           ]
         ]
       }
     ],
+    "region_of_interest": [
+      {
+        "geometry_coordinates": [
+          [
+            [
+              -4.1777839187560915,
+              50.34173405662855
+            ],
+            [
+              -4.1777839187560915,
+              50.33820949229701
+            ],
+            [
+              -4.143667777943875,
+              50.33820949229701
+            ],
+            [
+              -4.143667777943875,
+              50.34173405662855
+            ],
+            [
+              -4.1777839187560915,
+              50.34173405662855
+            ]
+          ]
+        ]
+      }
+    ],   
     "squads": [
       {
         "squad_ID": 1,
         "no_of_platforms": 1,
         "squad_mission_type": "tracking",
-        "squad_state": "active",
         "platforms": [
           {
+            "operator": "hydrosurv",
             "model": "reav",
             "platform_ID": "reav-60-1",
             "emergency": {
               "additional_data": {},
-              "target_waypoint_latitude": -7.432,
-              "target_waypoint_longitude": 50.365,
+              "target_waypoint_latitude": -4.189772466767039,
+              "target_waypoint_longitude": 50.33611100020795,
               "safe_command": "go_home",
               "target_depth": 10.0
             },
+            "min_altitude": 0.0,
             "max_velocity": 0.9,
-            "min_altitude": 15.2,
             "min_velocity": 0.1,
+            "target_altitude": 0.0,
+            "turning_radius": null,
+            "scan_sensor": null,
             "additional_data": {}
           }
-        ],
-        "region_of_interest": {
-          "geometry_coordinates": [
-            [
-              [
-                -4.187143188645706,
-                50.37072283932642
-              ],
-              [
-                -4.202697005964865,
-                50.368816892405874
-              ],
-              [
-                -4.203156724702808,
-                50.365640144076906
-              ],
-              [
-                -4.19449868846155,
-                50.362267670845654
-              ]
-            ]
-          ]
-        }
+        ]
       },
       {
         "squad_ID": 2,
         "no_of_platforms": 3,
         "squad_mission_type": "survey",
-        "squad_state": "active",
         "platforms": [
           {
+            "operator": "planet-ocean",
             "platform_ID": "ecosub-1",
             "model": "ecosub",
             "emergency": {
               "additional_data": {},
-              "target_waypoint_latitude": -7.432,
-              "target_waypoint_longitude": 50.365,
+              "target_waypoint_latitude": -4.192219151149999,
+              "target_waypoint_longitude": 50.32933594228737,
               "safe_command": "go_home",
               "target_depth": 10.0
             },
+            "min_altitude": 5.0,
             "max_velocity": 0.9,
-            "min_altitude": 15.2,
             "min_velocity": 0.1,
+            "target_altitude": 15.0,
+            "turning_radius": 1.5,
+            "scan_sensor": {
+              "sensor_type": "SIDESCAN",
+              "swath_width": 38.0,
+              "frequency": 700.0,
+              "angle": 110.0
+            },
             "additional_data": {
-                "scan_type": "DVL",
-                "swath_width": 10
+                "new_sensor_a": "test_sensor",
+                "range": 10.0
             }
           },
           {
+            "operator": "planet-ocean",
             "platform_ID": "ecosub-2",
             "model": "ecosub",
             "emergency": {
               "additional_data": {},
-              "target_waypoint_latitude": -0.432,
-              "target_waypoint_longitude": 20.365,
+              "target_waypoint_latitude": -4.192219151149999,
+              "target_waypoint_longitude": 50.32775207068519,
               "safe_command": "go_home",
               "target_depth": 0.0
             },
+            "min_altitude": 5.0,
             "max_velocity": 0.9,
-            "min_altitude": 15.2,
             "min_velocity": 0.1,
+            "target_altitude": 15.0,
+            "turning_radius": 1.5,
+            "scan_sensor": {
+              "sensor_type": "SIDESCAN",
+              "swath_width": 38.0,
+              "frequency": 700.0,
+              "angle": 110.0
+            },
             "additional_data": {
-                "scan_type": "DVL",
-                "swath_width": 10
+              "new_sensor_a": "test_sensor",
+              "range": 10.0
+            }
+          },
+          {
+            "operator": "planet-ocean",
+            "platform_ID": "ecosub-3",
+            "model": "ecosub",
+            "emergency": {
+              "additional_data": {},
+              "target_waypoint_latitude": -4.184550412882118,
+              "target_waypoint_longitude": 50.326744124905844,
+              "safe_command": "go_home",
+              "target_depth": 0.0
+            },
+            "min_altitude": 5.0,
+            "max_velocity": 0.9,
+            "min_velocity": 0.1,
+            "target_altitude": 15.0,
+            "turning_radius": 1.5,
+            "scan_sensor": {
+              "sensor_type": "SIDESCAN",
+              "swath_width": 38.0,
+              "frequency": 700.0,
+              "angle": 110.0
+            },
+            "additional_data": {
+              "new_sensor_a": "test_sensor",
+              "range": 10.0
+            }
+          },
+          {
+            "operator": "planet-ocean",
+            "platform_ID": "ecosub-4",
+            "model": "ecosub",
+            "emergency": {
+              "additional_data": {},
+              "target_waypoint_latitude": -4.188610333142037,
+              "target_waypoint_longitude": 50.32616814629094,
+              "safe_command": "go_home",
+              "target_depth": 0.0
+            },
+            "min_altitude": 5.0,
+            "max_velocity": 0.9,
+            "min_velocity": 0.1,
+            "target_altitude": 15.0,
+            "turning_radius": 1.5,
+            "scan_sensor": {
+              "sensor_type": "SIDESCAN",
+              "swath_width": 38.0,
+              "frequency": 700.0,
+              "angle": 110.0
+            },
+            "additional_data": {
+              "new_sensor_a": "test_sensor",
+              "range": 10.0
             }
           }
         ]
@@ -129,23 +213,31 @@
         "squad_ID": 3,
         "no_of_platforms": 1,
         "squad_mission_type": "inspection",
-        "squad_state": "active",
         "platforms": [
           {
             "platform_ID": "ah-1",
             "model": "autosub",
             "emergency": {
               "additional_data": {},
-              "target_waypoint_latitude": 20.432,
-              "target_waypoint_longitude": 50.365,
+              "target_waypoint_latitude": -4.19759350502369,
+              "target_waypoint_longitude": 50.3342284629413,
               "safe_command": "abort_now",
               "target_depth": 0.0
             },
+            "min_altitude": 5.0,
             "max_velocity": 0.9,
-            "min_altitude": 15.2,
             "min_velocity": 0.1,
+            "target_altitude": 15.0,
+            "turning_radius": 1.5,
+            "scan_sensor": {
+              "sensor_type": "SIDESCAN",
+              "swath_width": 38.0,
+              "frequency": 700.0,
+              "angle": 110.0
+            },
             "additional_data": {
-                "scan_type": "MBES"
+              "new_sensor_a": "test_sensor",
+              "range": 10.0
             }
           }
         ]
diff --git a/examples/gui_adapter/planning_configuration.json b/examples/gui_adapter/planning_configuration.json
index 319d9bd..977e5a2 100644
--- a/examples/gui_adapter/planning_configuration.json
+++ b/examples/gui_adapter/planning_configuration.json
@@ -16,108 +16,195 @@
         "geometry_coordinates": [
           [
             [
-              -4.187143188645706,
-              50.37072283932642
+              -4.1777839187560915,
+              50.34173405662855
             ],
             [
-              -4.202697005964865,
-              50.368816892405874
+              -4.1777839187560915,
+              50.33820949229701
             ],
             [
-              -4.203156724702808,
-              50.365640144076906
+              -4.143667777943875,
+              50.33820949229701
             ],
             [
-              -4.19449868846155,
-              50.362267670845654
+              -4.143667777943875,
+              50.34173405662855
+            ],
+            [
+              -4.1777839187560915,
+              50.34173405662855
             ]
           ]
         ]
       }
     ],
+    "region_of_interest": [
+      {
+        "geometry_coordinates": [
+          [
+            [
+              -4.1777839187560915,
+              50.34173405662855
+            ],
+            [
+              -4.1777839187560915,
+              50.33820949229701
+            ],
+            [
+              -4.143667777943875,
+              50.33820949229701
+            ],
+            [
+              -4.143667777943875,
+              50.34173405662855
+            ],
+            [
+              -4.1777839187560915,
+              50.34173405662855
+            ]
+          ]
+        ]
+      }
+    ],   
     "squads": [
       {
         "squad_ID": 1,
         "no_of_platforms": 1,
         "squad_mission_type": "tracking",
-        "squad_state": "active",
         "platforms": [
           {
+            "operator": "hydrosurv",
             "model": "reav",
             "platform_ID": "reav-60-1",
             "emergency": {
-              "target_waypoint_latitude": -7.432,
-              "target_waypoint_longitude": 50.365,
+              "additional_data": {},
+              "target_waypoint_latitude": -4.189772466767039,
+              "target_waypoint_longitude": 50.33611100020795,
               "safe_command": "go_home",
               "target_depth": 10.0
             },
+            "min_altitude": 0.0,
             "max_velocity": 0.9,
-            "min_altitude": 15.2,
-            "min_velocity": 0.1
+            "min_velocity": 0.1,
+            "target_altitude": 0.0,
+            "turning_radius": null,
+            "scan_sensor": null,
+            "additional_data": {}
           }
-        ],
-        "region_of_interest": {
-          "geometry_coordinates": [
-            [
-              [
-                -4.187143188645706,
-                50.37072283932642
-              ],
-              [
-                -4.202697005964865,
-                50.368816892405874
-              ],
-              [
-                -4.203156724702808,
-                50.365640144076906
-              ],
-              [
-                -4.19449868846155,
-                50.362267670845654
-              ]
-            ]
-          ]
-        }
+        ]
       },
       {
         "squad_ID": 2,
         "no_of_platforms": 3,
         "squad_mission_type": "survey",
-        "squad_state": "active",
         "platforms": [
           {
-            "platform_ID": "ecosub-2",
+            "operator": "planet-ocean",
+            "platform_ID": "ecosub-1",
             "model": "ecosub",
             "emergency": {
-              "target_waypoint_latitude": -7.432,
-              "target_waypoint_longitude": 50.365,
+              "additional_data": {},
+              "target_waypoint_latitude": -4.192219151149999,
+              "target_waypoint_longitude": 50.32933594228737,
               "safe_command": "go_home",
               "target_depth": 10.0
             },
+            "min_altitude": 5.0,
+            "max_velocity": 0.9,
+            "min_velocity": 0.1,
+            "target_altitude": 15.0,
+            "turning_radius": 1.5,
+            "scan_sensor": {
+              "sensor_type": "SIDESCAN",
+              "swath_width": 38.0,
+              "frequency": 700.0,
+              "angle": 110.0
+            },
+            "additional_data": {
+                "new_sensor_a": "test_sensor",
+                "range": 10.0
+            }
+          },
+          {
+            "operator": "planet-ocean",
+            "platform_ID": "ecosub-2",
+            "model": "ecosub",
+            "emergency": {
+              "additional_data": {},
+              "target_waypoint_latitude": -4.192219151149999,
+              "target_waypoint_longitude": 50.32775207068519,
+              "safe_command": "go_home",
+              "target_depth": 0.0
+            },
+            "min_altitude": 5.0,
+            "max_velocity": 0.9,
+            "min_velocity": 0.1,
+            "target_altitude": 15.0,
+            "turning_radius": 1.5,
+            "scan_sensor": {
+              "sensor_type": "SIDESCAN",
+              "swath_width": 38.0,
+              "frequency": 700.0,
+              "angle": 110.0
+            },
+            "additional_data": {
+              "new_sensor_a": "test_sensor",
+              "range": 10.0
+            }
+          },
+          {
+            "operator": "planet-ocean",
+            "platform_ID": "ecosub-3",
+            "model": "ecosub",
+            "emergency": {
+              "additional_data": {},
+              "target_waypoint_latitude": -4.184550412882118,
+              "target_waypoint_longitude": 50.326744124905844,
+              "safe_command": "go_home",
+              "target_depth": 0.0
+            },
+            "min_altitude": 5.0,
             "max_velocity": 0.9,
-            "min_altitude": 15.2,
             "min_velocity": 0.1,
+            "target_altitude": 15.0,
+            "turning_radius": 1.5,
+            "scan_sensor": {
+              "sensor_type": "SIDESCAN",
+              "swath_width": 38.0,
+              "frequency": 700.0,
+              "angle": 110.0
+            },
             "additional_data": {
-                "scan_type": "DVL",
-                "swath_width": 10
+              "new_sensor_a": "test_sensor",
+              "range": 10.0
             }
           },
           {
-            "platform_ID": "ecosub-5",
+            "operator": "planet-ocean",
+            "platform_ID": "ecosub-4",
             "model": "ecosub",
             "emergency": {
               "additional_data": {},
-              "target_waypoint_latitude": -0.432,
-              "target_waypoint_longitude": 20.365,
+              "target_waypoint_latitude": -4.188610333142037,
+              "target_waypoint_longitude": 50.32616814629094,
               "safe_command": "go_home",
               "target_depth": 0.0
             },
+            "min_altitude": 5.0,
             "max_velocity": 0.9,
-            "min_altitude": 15.2,
             "min_velocity": 0.1,
+            "target_altitude": 15.0,
+            "turning_radius": 1.5,
+            "scan_sensor": {
+              "sensor_type": "SIDESCAN",
+              "swath_width": 38.0,
+              "frequency": 700.0,
+              "angle": 110.0
+            },
             "additional_data": {
-                "scan_type": "DVL",
-                "swath_width": 10
+              "new_sensor_a": "test_sensor",
+              "range": 10.0
             }
           }
         ]
@@ -126,23 +213,31 @@
         "squad_ID": 3,
         "no_of_platforms": 1,
         "squad_mission_type": "inspection",
-        "squad_state": "active",
         "platforms": [
           {
-            "platform_ID": "139-ah-1",
+            "platform_ID": "ah-1",
             "model": "autosub",
             "emergency": {
               "additional_data": {},
-              "target_waypoint_latitude": 20.432,
-              "target_waypoint_longitude": 50.365,
+              "target_waypoint_latitude": -4.19759350502369,
+              "target_waypoint_longitude": 50.3342284629413,
               "safe_command": "abort_now",
               "target_depth": 0.0
             },
+            "min_altitude": 5.0,
             "max_velocity": 0.9,
-            "min_altitude": 15.2,
             "min_velocity": 0.1,
+            "target_altitude": 15.0,
+            "turning_radius": 1.5,
+            "scan_sensor": {
+              "sensor_type": "SIDESCAN",
+              "swath_width": 38.0,
+              "frequency": 700.0,
+              "angle": 110.0
+            },
             "additional_data": {
-                "scan_type": "MBES"
+              "new_sensor_a": "test_sensor",
+              "range": 10.0
             }
           }
         ]
diff --git a/formats/planning_configuration.py b/formats/planning_configuration.py
index c741b6c..44aa473 100644
--- a/formats/planning_configuration.py
+++ b/formats/planning_configuration.py
@@ -46,9 +46,46 @@ emergency_schema = {
 }
 
 
+scan_sensor_schema = {
+    "type": "object",
+    "properties": {
+        "sensor_type": {
+            "type": "string",
+            "description": "Unique identifier for this platform",
+            "example": "MBES",
+            "enum": ["SIDESCAN", "MBES"],
+        },
+        "swath_width": {
+            "type": "number",
+            "format": "float",
+            "description": "Function of `target_altitude` for the platform's "
+            + "swath width (in metres)",
+            "example": 38.0,
+        },
+        "frequency": {
+            "type": "number",
+            "format": "float",
+            "description": "Frequency of scanning sensor (in kHz)",
+            "example": 700.0,
+        },
+        "angle": {
+            "type": "number",
+            "format": "float",
+            "description": "Angle of range of swath width (in degrees)",
+            "example": 140.0,
+        },
+    },
+}
+
+
 platform_schema = {
     "type": "object",
     "properties": {
+        "operator": {
+            "type": "string",
+            "description": "Operator of platform",
+            "example": "noc",
+        },
         "platform_ID": {
             "type": "string",
             "description": "Unique identifier for this platform",
@@ -62,24 +99,37 @@ platform_schema = {
         "min_altitude": {
             "type": "number",
             "format": "float",
-            "description": "Minimum altitude set for squad.",
+            "description": "Minimum altitude set for plaform.",
             "example": 15.2,
         },
         "min_velocity": {
             "type": "number",
             "format": "float",
-            "description": "Minimum velocity set for squad.",
+            "description": "Minimum velocity set for plaform.",
             "example": 0.1,
         },
         "max_velocity": {
             "type": "number",
             "format": "float",
-            "description": "Maximum altitude set for squad.",
+            "description": "Maximum altitude set for plaform.",
             "example": 0.9,
         },
+        "target_altitude": {
+            "type": "number",
+            "format": "float",
+            "description": "Target altitude set for plaform. This affects swath width",
+            "example": 15.0,
+        },
+        "turning_radius": {
+            "type": "number",
+            "format": "float",
+            "description": "Turning radius of platform (in metres)",
+            "example": 1.0,
+        },
+        "scan_sensor": scan_sensor_schema,
         "additional_data": {
             "description": "Any addition fields/data to be added here",
-            "example": {"swath_width": 10.0, "scan_type": "DVL"},
+            "example": {"new_sensor_a": "test_sensor", "range": 10.0},
             "type": "object",
         },
     },
@@ -97,18 +147,19 @@ region_schema = {
     "type": "object",
     "properties": {
         "geometry_coordinates": {
-            "type": "array",  # TODO: Check if config defn is right.
+            "type": "array",
             "example": [
                 [
                     [-4.187143188645706, 50.37072283932642],
                     [-4.202697005964865, 50.368816892405874],
                     [-4.203156724702808, 50.365640144076906],
                     [-4.19449868846155, 50.362267670845654],
+                    [-4.187143188645706, 50.37072283932642],
                 ]
             ],
         },
     },
-    "description": "Using GEOJSON, exact 4-point region (rectangle shaped)",
+    "description": "Using GEOJSON, exact 4-point region (rectangle shaped - 5 points)",
 }
 
 squad_metadata_schema = {
@@ -136,19 +187,12 @@ squad_metadata_schema = {
             + ", `inspection`",
             "example": "survey",
         },
-        "squad_state": {
-            "type": "string",
-            "description": "In execution, Waiting.. <define further>",
-            "example": False,
-        },
-        "region_of_interest": region_schema,
     },
     "required": [
         "squad_ID",
         "no_of_platforms",
         "platforms",
         "squad_mission_type",
-        "squad_state",
     ],
 }
 
@@ -167,6 +211,11 @@ planning_configuration_schema = {
             + " configuration plan",
             "example": 3,
         },
+        "region_of_interest": {
+            "type": "array",
+            "items": region_schema,
+            "description": "Region of interest for the entire operation",
+        },
         "exclusion_zones": {
             "type": "array",
             "items": region_schema,
@@ -182,5 +231,6 @@ planning_configuration_schema = {
         "planning_config_ID",
         "squads",
         "exclusion_zones",
+        "region_of_interest",
     ],
 }
diff --git a/project/soar/swagger.json b/project/soar/swagger.json
index bdbda61..109afa9 100644
--- a/project/soar/swagger.json
+++ b/project/soar/swagger.json
@@ -107,6 +107,12 @@
                   "example":3,
                   "type":"integer"
                },
+               "emergency":{
+                  "default":false,
+                  "description":"To indicate if this is an emergency. true = emergency and false = no emergency",
+                  "example":false,
+                  "type":"boolean"
+               },
                "message_type":{
                   "description":"Type of message",
                   "enum":[
@@ -115,12 +121,6 @@
                   "example":"mission_plan",
                   "type":"string"
                },
-               "emergency": {
-                  "default": false,
-                  "description": "To indicate if this is an emergency. true = emergency and false = no emergency",
-                  "example": false,
-                  "type": "boolean"
-               },
                "plan":{
                   "items":{
                      "properties":{
@@ -219,9 +219,9 @@
                "message_type":{
                   "description":"Type of message",
                   "enum":[
-                     "mission_plan_encoded"
+                     "platform_status_encoded"
                   ],
-                  "example":"mission_plan_encoded",
+                  "example":"platform_status_encoded",
                   "type":"string"
                },
                "mime_type":{
@@ -320,9 +320,9 @@
                "message_type":{
                   "description":"Type of message",
                   "enum":[
-                     "observation_encoded"
+                     "platform_status_encoded"
                   ],
-                  "example":"observation_encoded",
+                  "example":"platform_status_encoded",
                   "type":"string"
                },
                "mime_type":{
@@ -383,7 +383,7 @@
                "exclusion_zones":{
                   "description":"Exclusion zones for all platforms",
                   "items":{
-                     "description":"Using GEOJSON, exact 4-point region (rectangle shaped)",
+                     "description":"Using GEOJSON, exact 4-point region (rectangle shaped - 5 points)",
                      "properties":{
                         "geometry_coordinates":{
                            "example":[
@@ -403,6 +403,10 @@
                                  [
                                     -4.19449868846155,
                                     50.362267670845654
+                                 ],
+                                 [
+                                    -4.187143188645706,
+                                    50.37072283932642
                                  ]
                               ]
                            ],
@@ -426,6 +430,43 @@
                   "example":3,
                   "type":"integer"
                },
+               "region_of_interest":{
+                  "description":"Region of interest for the entire operation",
+                  "items":{
+                     "description":"Using GEOJSON, exact 4-point region (rectangle shaped - 5 points)",
+                     "properties":{
+                        "geometry_coordinates":{
+                           "example":[
+                              [
+                                 [
+                                    -4.187143188645706,
+                                    50.37072283932642
+                                 ],
+                                 [
+                                    -4.202697005964865,
+                                    50.368816892405874
+                                 ],
+                                 [
+                                    -4.203156724702808,
+                                    50.365640144076906
+                                 ],
+                                 [
+                                    -4.19449868846155,
+                                    50.362267670845654
+                                 ],
+                                 [
+                                    -4.187143188645706,
+                                    50.37072283932642
+                                 ]
+                              ]
+                           ],
+                           "type":"array"
+                        }
+                     },
+                     "type":"object"
+                  },
+                  "type":"array"
+               },
                "squads":{
                   "items":{
                      "properties":{
@@ -441,19 +482,19 @@
                                  "additional_data":{
                                     "description":"Any addition fields/data to be added here",
                                     "example":{
-                                       "scan_type":"DVL",
-                                       "swath_width":10.0
+                                       "new_sensor_a":"test_sensor",
+                                       "range":10.0
                                     },
                                     "type":"object"
                                  },
                                  "emergency":{
                                     "properties":{
                                        "additional_data":{
-                                          "type": "object",
                                           "description":"Any addition fields/data to be added here",
                                           "example":{
                                              
-                                          }
+                                          },
+                                          "type":"object"
                                        },
                                        "safe_command":{
                                           "description":"Command/Action that is native to respective partner's platform/C2",
@@ -492,19 +533,19 @@
                                     "type":"object"
                                  },
                                  "max_velocity":{
-                                    "description":"Maximum altitude set for squad.",
+                                    "description":"Maximum altitude set for plaform.",
                                     "example":0.9,
                                     "format":"float",
                                     "type":"number"
                                  },
                                  "min_altitude":{
-                                    "description":"Minimum altitude set for squad.",
+                                    "description":"Minimum altitude set for plaform.",
                                     "example":15.2,
                                     "format":"float",
                                     "type":"number"
                                  },
                                  "min_velocity":{
-                                    "description":"Minimum velocity set for squad.",
+                                    "description":"Minimum velocity set for plaform.",
                                     "example":0.1,
                                     "format":"float",
                                     "type":"number"
@@ -513,10 +554,59 @@
                                     "example":"reav",
                                     "type":"string"
                                  },
+                                 "operator":{
+                                    "description":"Operator of platform",
+                                    "example":"noc",
+                                    "type":"string"
+                                 },
                                  "platform_ID":{
                                     "description":"Unique identifier for this platform",
                                     "example":"reav-x-1",
                                     "type":"string"
+                                 },
+                                 "scan_sensor":{
+                                    "properties":{
+                                       "angle":{
+                                          "description":"Angle of range of swath width (in degrees)",
+                                          "example": 140.0,
+                                          "format":"float",
+                                          "type":"number"
+                                       },
+                                       "frequency":{
+                                          "description":"Frequency of scanning sensor (in kHz)",
+                                          "example": 700.0,
+                                          "format":"float",
+                                          "type":"number"
+                                       },
+                                       "sensor_type":{
+                                          "description":"Unique identifier for this platform",
+                                          "enum":[
+                                             "SIDESCAN",
+                                             "MBES"
+                                          ],
+                                          "example":"MBES",
+                                          "type":"string"
+                                       },
+                                       "swath_width":{
+                                          "description":"Function of `target_altitude` for the platform's swath width (in metres)",
+                                          "example": 38.0,
+                                          "format":"float",
+                                          "type":"number"
+                                       }
+                                    },
+                                    "type":"object"
+                                 },
+                                 "target_altitude":{
+                                    "description":"Target altitude set for plaform. This affects swath width",
+                                    "example":15.0,
+                                    "format":"float",
+                                    "type":"number"
+                                 },
+                                 "turning_radius":{
+                                    "description":"Turning radius of platform (in metres)",
+                                    "example":1.0,
+                                    "format":"float",
+                                    "type":"number"
                                  }
                               },
                               "required":[
@@ -531,35 +621,6 @@
                            },
                            "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"
-                              }
-                           },
-                           "type":"object"
-                        },
                         "squad_ID":{
                            "description":"Identifier of given squad",
                            "example":23,
@@ -574,19 +635,13 @@
                            ],
                            "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"
+                        "squad_mission_type"
                      ],
                      "type":"object"
                   },
@@ -597,7 +652,8 @@
                "message_type",
                "planning_config_ID",
                "squads",
-               "exclusion_zones"
+               "exclusion_zones",
+               "region_of_interest"
             ],
             "type":"object"
          },
diff --git a/tests-js/docker/output.txt b/tests-js/docker/output.txt
new file mode 100644
index 0000000..b7d42f1
--- /dev/null
+++ b/tests-js/docker/output.txt
@@ -0,0 +1,273 @@
+#1 [internal] load build definition from Dockerfile
+#1 DONE 0.0s
+
+#1 [internal] load build definition from Dockerfile
+#1 transferring dockerfile: 32B done
+#1 DONE 0.0s
+
+#2 [internal] load .dockerignore
+#2 transferring context: 2B done
+#2 DONE 0.0s
+
+#3 [internal] load metadata for docker.io/library/node:18.7.0-alpine
+#3 DONE 0.4s
+
+#4 [1/7] FROM docker.io/library/node:18.7.0-alpine@sha256:02a5466bd5abde6cde29c16d83e2f5a10eec11c8dcefa667a2c9f88a7fa8b0b3
+#4 DONE 0.0s
+
+#5 [internal] load build context
+#5 transferring context: 114.55kB 0.1s done
+#5 DONE 0.1s
+
+#6 [2/7] WORKDIR /app/tests-js
+#6 CACHED
+
+#7 [3/7] COPY tests-js/package.json /app/tests-js/package.json
+#7 CACHED
+
+#8 [4/7] RUN yarn install
+#8 CACHED
+
+#9 [5/7] WORKDIR /app
+#9 CACHED
+
+#10 [6/7] COPY . /app
+#10 DONE 0.3s
+
+#11 [7/7] WORKDIR /app/tests-js
+#11 DONE 0.1s
+
+#12 exporting to image
+#12 exporting layers
+#12 exporting layers 0.3s done
+#12 writing image sha256:e98eadc0bbdc0809fd2540b1652f250264f2166575be3b9f18890d722b653ded done
+#12 naming to docker.io/library/docker_soar_js_test done
+#12 DONE 0.3s
+Attaching to soar_js_test
+soar_js_test  | yarn run v1.22.19
+soar_js_test  | warning package.json: No license field
+soar_js_test  | $ jest
+soar_js_test  |   console.log
+soar_js_test  |     examples [
+soar_js_test  |       '/app/examples/hydrosurv_adapter/platform_status.json',
+soar_js_test  |       '/app/examples/hydrosurv_adapter/mission_plan.json',
+soar_js_test  |       '/app/examples/hydrosurv_adapter/acknowledgement.json',
+soar_js_test  |       '/app/examples/gui_adapter/planning_configuration.json',
+soar_js_test  |       '/app/examples/gui_adapter/emergency_mission_plan.json',
+soar_js_test  |       '/app/examples/gui_adapter/emergency_mission_command.json',
+soar_js_test  |       '/app/examples/ecosub_adapter/platform_status.json',
+soar_js_test  |       '/app/examples/ecosub_adapter/platform_status-from_usbl_example.json',
+soar_js_test  |       '/app/examples/ecosub_adapter/observation_encoded.json',
+soar_js_test  |       '/app/examples/ecosub_adapter/observation.json',
+soar_js_test  |       '/app/examples/ecosub_adapter/mission_plan.json',
+soar_js_test  |       '/app/examples/autonomy_engine_adapter/platform_status_encoded.json',
+soar_js_test  |       '/app/examples/autonomy_engine_adapter/platform_status.json',
+soar_js_test  |       '/app/examples/autonomy_engine_adapter/platform_status-from_usbl_example.json',
+soar_js_test  |       '/app/examples/autonomy_engine_adapter/planning_configuration.json',
+soar_js_test  |       '/app/examples/autonomy_engine_adapter/observation_encoded.json',
+soar_js_test  |       '/app/examples/autonomy_engine_adapter/mission_plan_encoded.json',
+soar_js_test  |       '/app/examples/autonomy_engine_adapter/mission_plan_HYDROSURV.json',
+soar_js_test  |       '/app/examples/autonomy_engine_adapter/mission_plan_ECOSUB.json',
+soar_js_test  |       '/app/examples/autonomy_engine_adapter/mission_plan_AH1.json',
+soar_js_test  |       '/app/examples/autonomy_engine_adapter/emergency_mission_plan.json',
+soar_js_test  |       '/app/examples/autonomy_engine_adapter/emergency_mission_command.json',
+soar_js_test  |       '/app/examples/autonomy_engine_adapter/acknowledgement.json'
+soar_js_test  |     ]
+soar_js_test  | 
+soar_js_test  |       at soar-examples.test.js:42:11
+soar_js_test  | 
+soar_js_test  |   console.log
+soar_js_test  |     validation: /app/examples/ecosub_adapter/observation_encoded.json [
+soar_js_test  |       undefined,
+soar_js_test  |       'payload is not a valid target for a oneOf {"$ref":"#/components/schemas/acknowledgement"}',
+soar_js_test  |       undefined,
+soar_js_test  |       'payload is not a valid target for a oneOf {"$ref":"#/components/schemas/mission_plan"}',
+soar_js_test  |       undefined,
+soar_js_test  |       'payload is not a valid target for a oneOf {"$ref":"#/components/schemas/mission_plan_encoded"}',
+soar_js_test  |       undefined,
+soar_js_test  |       'payload is not a valid target for a oneOf {"$ref":"#/components/schemas/observation"}',
+soar_js_test  |       undefined,
+soar_js_test  |       'payload is not a valid target for a oneOf {"$ref":"#/components/schemas/observation_encoded"}',
+soar_js_test  |       undefined,
+soar_js_test  |       'payload is not a valid target for a oneOf {"$ref":"#/components/schemas/planning_configuration"}',
+soar_js_test  |       undefined,
+soar_js_test  |       'payload is not a valid target for a oneOf {"$ref":"#/components/schemas/platform_status"}',
+soar_js_test  |       undefined,
+soar_js_test  |       'payload is not a valid target for a oneOf {"$ref":"#/components/schemas/platform_status_encoded"}'
+soar_js_test  |     ]
+soar_js_test  | 
+soar_js_test  |       at Object.<anonymous> (soar-examples.test.js:49:17)
+soar_js_test  | 
+soar_js_test  |   console.log
+soar_js_test  |     payload observation_encoded [
+soar_js_test  |       'message_type must be one of the following: platform_status_encoded'
+soar_js_test  |     ]
+soar_js_test  | 
+soar_js_test  |       at Object.<anonymous> (soar-examples.test.js:52:19)
+soar_js_test  | 
+soar_js_test  |   console.log
+soar_js_test  |     validation: /app/examples/autonomy_engine_adapter/platform_status_encoded.json [ 'payloadmatches more than one entry in a oneOf.' ]
+soar_js_test  | 
+soar_js_test  |       at Object.<anonymous> (soar-examples.test.js:49:17)
+soar_js_test  | 
+soar_js_test  |   console.log
+soar_js_test  |     validation: /app/examples/autonomy_engine_adapter/observation_encoded.json [
+soar_js_test  |       undefined,
+soar_js_test  |       'payload is not a valid target for a oneOf {"$ref":"#/components/schemas/acknowledgement"}',
+soar_js_test  |       undefined,
+soar_js_test  |       'payload is not a valid target for a oneOf {"$ref":"#/components/schemas/mission_plan"}',
+soar_js_test  |       undefined,
+soar_js_test  |       'payload is not a valid target for a oneOf {"$ref":"#/components/schemas/mission_plan_encoded"}',
+soar_js_test  |       undefined,
+soar_js_test  |       'payload is not a valid target for a oneOf {"$ref":"#/components/schemas/observation"}',
+soar_js_test  |       undefined,
+soar_js_test  |       'payload is not a valid target for a oneOf {"$ref":"#/components/schemas/observation_encoded"}',
+soar_js_test  |       undefined,
+soar_js_test  |       'payload is not a valid target for a oneOf {"$ref":"#/components/schemas/planning_configuration"}',
+soar_js_test  |       undefined,
+soar_js_test  |       'payload is not a valid target for a oneOf {"$ref":"#/components/schemas/platform_status"}',
+soar_js_test  |       undefined,
+soar_js_test  |       'payload is not a valid target for a oneOf {"$ref":"#/components/schemas/platform_status_encoded"}'
+soar_js_test  |     ]
+soar_js_test  | 
+soar_js_test  |       at Object.<anonymous> (soar-examples.test.js:49:17)
+soar_js_test  | 
+soar_js_test  |   console.log
+soar_js_test  |     payload observation_encoded [
+soar_js_test  |       'message_type must be one of the following: platform_status_encoded'
+soar_js_test  |     ]
+soar_js_test  | 
+soar_js_test  |       at Object.<anonymous> (soar-examples.test.js:52:19)
+soar_js_test  | 
+soar_js_test  |   console.log
+soar_js_test  |     validation: /app/examples/autonomy_engine_adapter/mission_plan_encoded.json [
+soar_js_test  |       undefined,
+soar_js_test  |       'payload is not a valid target for a oneOf {"$ref":"#/components/schemas/acknowledgement"}',
+soar_js_test  |       undefined,
+soar_js_test  |       'payload is not a valid target for a oneOf {"$ref":"#/components/schemas/mission_plan"}',
+soar_js_test  |       undefined,
+soar_js_test  |       'payload is not a valid target for a oneOf {"$ref":"#/components/schemas/mission_plan_encoded"}',
+soar_js_test  |       undefined,
+soar_js_test  |       'payload is not a valid target for a oneOf {"$ref":"#/components/schemas/observation"}',
+soar_js_test  |       undefined,
+soar_js_test  |       'payload is not a valid target for a oneOf {"$ref":"#/components/schemas/observation_encoded"}',
+soar_js_test  |       undefined,
+soar_js_test  |       'payload is not a valid target for a oneOf {"$ref":"#/components/schemas/planning_configuration"}',
+soar_js_test  |       undefined,
+soar_js_test  |       'payload is not a valid target for a oneOf {"$ref":"#/components/schemas/platform_status"}',
+soar_js_test  |       undefined,
+soar_js_test  |       'payload is not a valid target for a oneOf {"$ref":"#/components/schemas/platform_status_encoded"}'
+soar_js_test  |     ]
+soar_js_test  | 
+soar_js_test  |       at Object.<anonymous> (soar-examples.test.js:49:17)
+soar_js_test  | 
+soar_js_test  |   console.log
+soar_js_test  |     payload mission_plan_encoded [
+soar_js_test  |       'message_type must be one of the following: platform_status_encoded'
+soar_js_test  |     ]
+soar_js_test  | 
+soar_js_test  |       at Object.<anonymous> (soar-examples.test.js:52:19)
+soar_js_test  | 
+soar_js_test  | FAIL ./soar-examples.test.js
+soar_js_test  |   ✓ schema validates (384 ms)
+soar_js_test  |   examples validate
+soar_js_test  |     ✓ validate /app/examples/hydrosurv_adapter/platform_status.json (8 ms)
+soar_js_test  |     ✓ validate /app/examples/hydrosurv_adapter/mission_plan.json (5 ms)
+soar_js_test  |     ✓ validate /app/examples/hydrosurv_adapter/acknowledgement.json (3 ms)
+soar_js_test  |     ✓ validate /app/examples/gui_adapter/planning_configuration.json (4 ms)
+soar_js_test  |     ✓ validate /app/examples/gui_adapter/emergency_mission_plan.json (3 ms)
+soar_js_test  |     ✓ validate /app/examples/gui_adapter/emergency_mission_command.json (4 ms)
+soar_js_test  |     ✓ validate /app/examples/ecosub_adapter/platform_status.json (4 ms)
+soar_js_test  |     ✓ validate /app/examples/ecosub_adapter/platform_status-from_usbl_example.json (3 ms)
+soar_js_test  |     ✕ validate /app/examples/ecosub_adapter/observation_encoded.json (14 ms)
+soar_js_test  |     ✓ validate /app/examples/ecosub_adapter/observation.json (3 ms)
+soar_js_test  |     ✓ validate /app/examples/ecosub_adapter/mission_plan.json (2 ms)
+soar_js_test  |     ✕ validate /app/examples/autonomy_engine_adapter/platform_status_encoded.json (6 ms)
+soar_js_test  |     ✓ validate /app/examples/autonomy_engine_adapter/platform_status.json (2 ms)
+soar_js_test  |     ✓ validate /app/examples/autonomy_engine_adapter/platform_status-from_usbl_example.json (2 ms)
+soar_js_test  |     ✓ validate /app/examples/autonomy_engine_adapter/planning_configuration.json (3 ms)
+soar_js_test  |     ✕ validate /app/examples/autonomy_engine_adapter/observation_encoded.json (8 ms)
+soar_js_test  |     ✕ validate /app/examples/autonomy_engine_adapter/mission_plan_encoded.json (8 ms)
+soar_js_test  |     ✓ validate /app/examples/autonomy_engine_adapter/mission_plan_HYDROSURV.json (2 ms)
+soar_js_test  |     ✓ validate /app/examples/autonomy_engine_adapter/mission_plan_ECOSUB.json (2 ms)
+soar_js_test  |     ✓ validate /app/examples/autonomy_engine_adapter/mission_plan_AH1.json (2 ms)
+soar_js_test  |     ✓ validate /app/examples/autonomy_engine_adapter/emergency_mission_plan.json (3 ms)
+soar_js_test  |     ✓ validate /app/examples/autonomy_engine_adapter/emergency_mission_command.json (2 ms)
+soar_js_test  |     ✓ validate /app/examples/autonomy_engine_adapter/acknowledgement.json (6 ms)
+soar_js_test  | 
+soar_js_test  |   ● examples validate › validate /app/examples/ecosub_adapter/observation_encoded.json
+soar_js_test  | 
+soar_js_test  |     expect(received).toBe(expected) // Object.is equality
+soar_js_test  | 
+soar_js_test  |     Expected: true
+soar_js_test  |     Received: false
+soar_js_test  | 
+soar_js_test  |       53 |         }
+soar_js_test  |       54 |       }
+soar_js_test  |     > 55 |       expect(valid).toBe(true);
+soar_js_test  |          |                     ^
+soar_js_test  |       56 |     });
+soar_js_test  |       57 |   });
+soar_js_test  |       58 | });
+soar_js_test  | 
+soar_js_test  |       at Object.<anonymous> (soar-examples.test.js:55:21)
+soar_js_test  | 
+soar_js_test  |   ● examples validate › validate /app/examples/autonomy_engine_adapter/platform_status_encoded.json
+soar_js_test  | 
+soar_js_test  |     expect(received).toBe(expected) // Object.is equality
+soar_js_test  | 
+soar_js_test  |     Expected: true
+soar_js_test  |     Received: false
+soar_js_test  | 
+soar_js_test  |       53 |         }
+soar_js_test  |       54 |       }
+soar_js_test  |     > 55 |       expect(valid).toBe(true);
+soar_js_test  |          |                     ^
+soar_js_test  |       56 |     });
+soar_js_test  |       57 |   });
+soar_js_test  |       58 | });
+soar_js_test  | 
+soar_js_test  |       at Object.<anonymous> (soar-examples.test.js:55:21)
+soar_js_test  | 
+soar_js_test  |   ● examples validate › validate /app/examples/autonomy_engine_adapter/observation_encoded.json
+soar_js_test  | 
+soar_js_test  |     expect(received).toBe(expected) // Object.is equality
+soar_js_test  | 
+soar_js_test  |     Expected: true
+soar_js_test  |     Received: false
+soar_js_test  | 
+soar_js_test  |       53 |         }
+soar_js_test  |       54 |       }
+soar_js_test  |     > 55 |       expect(valid).toBe(true);
+soar_js_test  |          |                     ^
+soar_js_test  |       56 |     });
+soar_js_test  |       57 |   });
+soar_js_test  |       58 | });
+soar_js_test  | 
+soar_js_test  |       at Object.<anonymous> (soar-examples.test.js:55:21)
+soar_js_test  | 
+soar_js_test  |   ● examples validate › validate /app/examples/autonomy_engine_adapter/mission_plan_encoded.json
+soar_js_test  | 
+soar_js_test  |     expect(received).toBe(expected) // Object.is equality
+soar_js_test  | 
+soar_js_test  |     Expected: true
+soar_js_test  |     Received: false
+soar_js_test  | 
+soar_js_test  |       53 |         }
+soar_js_test  |       54 |       }
+soar_js_test  |     > 55 |       expect(valid).toBe(true);
+soar_js_test  |          |                     ^
+soar_js_test  |       56 |     });
+soar_js_test  |       57 |   });
+soar_js_test  |       58 | });
+soar_js_test  | 
+soar_js_test  |       at Object.<anonymous> (soar-examples.test.js:55:21)
+soar_js_test  | 
+soar_js_test  | Test Suites: 1 failed, 1 total
+soar_js_test  | Tests:       4 failed, 20 passed, 24 total
+soar_js_test  | Snapshots:   0 total
+soar_js_test  | Time:        1.405 s
+soar_js_test  | Ran all test suites.
+soar_js_test  | error Command failed with exit code 1.
+soar_js_test  | info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
+soar_js_test exited with code 1
-- 
GitLab