From ee5574f92122c37e286fc2eaddf7048d2c6bc395 Mon Sep 17 00:00:00 2001
From: Trishna Saeharaseelan <trishna.saeharaseelan@noc.ac.uk>
Date: Fri, 22 Nov 2024 11:03:21 +0000
Subject: [PATCH] fix: rebase to latest 67 branch

---
 CHANGELOG.md                                |   2 +
 examples/mas-dt/planning_configuration.json |   5 +
 formats/planning_configuration.py           |  72 +++++++--
 project/soar/swagger.json                   | 160 +++++++++++++++-----
 4 files changed, 185 insertions(+), 54 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index a973545..f763be9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,12 +11,14 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
 
 - Goal object in mission_plan message that consists of a GeoJSON feature (representing the part of primitive that is currently the goal of the given mission plan).
 - A `partial` flag that indicates if a mission plan is a partial plan or the entire mission plan
+- Options to primitives (under planning_configuration message) which is only a property when a primitive has an instruction of "follow" or "navigate_to"
 - Validate message_ID matches uuid format
 - Add definition of instruction_set message
 - Added optional primitives to squad schema
 
 ### Changed
 
+- Added "instruction" as required under the primitive schema (planning configuration)
 - Refactor instructeion_set into platform_instruction_set
 - Refactor mission_plan schema autonomy_engine_plan_ID oneOf
 - Update all example messages with valid UUIDs
diff --git a/examples/mas-dt/planning_configuration.json b/examples/mas-dt/planning_configuration.json
index fc34ee7..8244541 100644
--- a/examples/mas-dt/planning_configuration.json
+++ b/examples/mas-dt/planning_configuration.json
@@ -153,6 +153,11 @@
                   50.335942
                 ]
               }
+            },
+            "options": {
+              "repeat": true,
+              "reverse": true,
+              "acceptance_radius_m": 3000
             }
           }
         ]
diff --git a/formats/planning_configuration.py b/formats/planning_configuration.py
index 7b5bc17..c679e85 100644
--- a/formats/planning_configuration.py
+++ b/formats/planning_configuration.py
@@ -181,26 +181,66 @@ platform_schema = {
     ],
 }
 
-primitive_schema = {
+options_schema = {
     "type": "object",
     "properties": {
-        "instruction": {
-            "type": "string",
-            "enum": [
-                "stay_inside",
-                "stay_outside",
-                "navigate_to",
-                "follow",
-                "repeat",
-                "cover",
-            ],
-            "description": "How the associated feature should be used",
-        },
-        "feature": {
-            "$ref": "https://geojson.org/schema/Feature.json",
+        "repeat": {
+            "type": "boolean",
+            "description": "Repeat these set of primitives in order (e.g. 1->2->3->1->2...)",
+            "example": True,
+        },
+        "reverse": {
+            "type": "boolean",
+            "description": "Loop backwards through the set of primitives (e.g 1->2->-3->2->1...)",
+            "example": True,
+        },
+        "acceptance_radius_m": {
+            "type": "number",
+            "format": "float",
+            "description": "Acceptance radius (if applicable) to points of geometry in metres",
+            "example": 10000,
         },
     },
-    "required": ["feature"],
+}
+
+primitive_schema = {
+    "oneOf": [
+        {
+            "properties": {
+                "instruction": {
+                    "type": "string",
+                    "enum": [
+                        "navigate_to",
+                        "follow",
+                    ],
+                    "description": "How the associated feature should be used",
+                },
+                "options": options_schema,
+                "feature": {
+                    "$ref": "https://geojson.org/schema/Feature.json",
+                },
+            },
+            "required": ["feature", "instruction"],
+        },
+        {
+            "properties": {
+                "instruction": {
+                    "type": "string",
+                    "enum": [
+                        "stay_inside",
+                        "stay_outside",
+                        "repeat",
+                        "cover",
+                    ],
+                    "description": "How the associated feature should be used",
+                },
+                "feature": {
+                    "$ref": "https://geojson.org/schema/Feature.json",
+                },
+            },
+            "required": ["feature", "instruction"],
+        },
+    ]
 }
 
 squad_metadata_schema = {
diff --git a/project/soar/swagger.json b/project/soar/swagger.json
index 44e912e..8dc6f11 100644
--- a/project/soar/swagger.json
+++ b/project/soar/swagger.json
@@ -1947,27 +1947,69 @@
           "primitives": {
             "description": "Specification primitives - campaign-wide such as operating area and obstacles",
             "items": {
-              "properties": {
-                "feature": {
-                  "$ref": "#/components/schemas/geojson.org.schema.Feature.json"
+              "oneOf": [
+                {
+                  "properties": {
+                    "feature": {
+                      "$ref": "#/components/schemas/geojson.org.schema.Feature.json"
+                    },
+                    "instruction": {
+                      "description": "How the associated feature should be used",
+                      "enum": [
+                        "navigate_to",
+                        "follow"
+                      ],
+                      "type": "string"
+                    },
+                    "options": {
+                      "properties": {
+                        "acceptance_radius_m": {
+                          "description": "Acceptance radius (if applicable) to points of geometry in metres",
+                          "example": 10000,
+                          "format": "float",
+                          "type": "number"
+                        },
+                        "repeat": {
+                          "description": "Repeat these set of primitives in order (e.g. 1->2->3->1->2...)",
+                          "example": true,
+                          "type": "boolean"
+                        },
+                        "reverse": {
+                          "description": "Loop backwards through the set of primitives (e.g 1->2->-3->2->1...)",
+                          "example": true,
+                          "type": "boolean"
+                        }
+                      },
+                      "type": "object"
+                    }
+                  },
+                  "required": [
+                    "feature",
+                    "instruction"
+                  ]
                 },
-                "instruction": {
-                  "description": "How the associated feature should be used",
-                  "enum": [
-                    "stay_inside",
-                    "stay_outside",
-                    "navigate_to",
-                    "follow",
-                    "repeat",
-                    "cover"
-                  ],
-                  "type": "string"
+                {
+                  "properties": {
+                    "feature": {
+                      "$ref": "#/components/schemas/geojson.org.schema.Feature.json"
+                    },
+                    "instruction": {
+                      "description": "How the associated feature should be used",
+                      "enum": [
+                        "stay_inside",
+                        "stay_outside",
+                        "repeat",
+                        "cover"
+                      ],
+                      "type": "string"
+                    }
+                  },
+                  "required": [
+                    "feature",
+                    "instruction"
+                  ]
                 }
-              },
-              "required": [
-                "feature"
-              ],
-              "type": "object"
+              ]
             },
             "type": "array"
           },
@@ -2158,27 +2200,69 @@
                 "primitives": {
                   "description": "Squad primitives - includes platform group navigation instructions",
                   "items": {
-                    "properties": {
-                      "feature": {
-                        "$ref": "#/components/schemas/geojson.org.schema.Feature.json"
+                    "oneOf": [
+                      {
+                        "properties": {
+                          "feature": {
+                            "$ref": "#/components/schemas/geojson.org.schema.Feature.json"
+                          },
+                          "instruction": {
+                            "description": "How the associated feature should be used",
+                            "enum": [
+                              "navigate_to",
+                              "follow"
+                            ],
+                            "type": "string"
+                          },
+                          "options": {
+                            "properties": {
+                              "acceptance_radius_m": {
+                                "description": "Acceptance radius (if applicable) to points of geometry in metres",
+                                "example": 10000,
+                                "format": "float",
+                                "type": "number"
+                              },
+                              "repeat": {
+                                "description": "Repeat these set of primitives in order (e.g. 1->2->3->1->2...)",
+                                "example": true,
+                                "type": "boolean"
+                              },
+                              "reverse": {
+                                "description": "Loop backwards through the set of primitives (e.g 1->2->-3->2->1...)",
+                                "example": true,
+                                "type": "boolean"
+                              }
+                            },
+                            "type": "object"
+                          }
+                        },
+                        "required": [
+                          "feature",
+                          "instruction"
+                        ]
                       },
-                      "instruction": {
-                        "description": "How the associated feature should be used",
-                        "enum": [
-                          "stay_inside",
-                          "stay_outside",
-                          "navigate_to",
-                          "follow",
-                          "repeat",
-                          "cover"
-                        ],
-                        "type": "string"
+                      {
+                        "properties": {
+                          "feature": {
+                            "$ref": "#/components/schemas/geojson.org.schema.Feature.json"
+                          },
+                          "instruction": {
+                            "description": "How the associated feature should be used",
+                            "enum": [
+                              "stay_inside",
+                              "stay_outside",
+                              "repeat",
+                              "cover"
+                            ],
+                            "type": "string"
+                          }
+                        },
+                        "required": [
+                          "feature",
+                          "instruction"
+                        ]
                       }
-                    },
-                    "required": [
-                      "feature"
-                    ],
-                    "type": "object"
+                    ]
                   },
                   "type": "array"
                 },
-- 
GitLab