isar 1.31.1__tar.gz → 1.32.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of isar might be problematic. Click here for more details.

Files changed (214) hide show
  1. {isar-1.31.1 → isar-1.32.1}/PKG-INFO +1 -1
  2. {isar-1.31.1 → isar-1.32.1}/src/isar/apis/api.py +18 -0
  3. {isar-1.31.1 → isar-1.32.1}/src/isar/apis/models/start_mission_definition.py +4 -0
  4. {isar-1.31.1 → isar-1.32.1}/src/isar/apis/schedule/scheduling_controller.py +16 -0
  5. {isar-1.31.1 → isar-1.32.1}/src/isar/config/log.py +1 -2
  6. isar-1.32.1/src/isar/config/logging.conf +37 -0
  7. {isar-1.31.1 → isar-1.32.1}/src/isar/config/settings.py +4 -0
  8. {isar-1.31.1 → isar-1.32.1}/src/isar/models/events.py +5 -4
  9. {isar-1.31.1 → isar-1.32.1}/src/isar/script.py +7 -16
  10. {isar-1.31.1 → isar-1.32.1}/src/isar/services/utilities/scheduling_utilities.py +23 -3
  11. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/state_machine.py +26 -1
  12. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/states/await_next_mission.py +3 -3
  13. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/states/home.py +3 -3
  14. isar-1.32.1/src/isar/state_machine/states/intervention_needed.py +43 -0
  15. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/states/monitor.py +2 -2
  16. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/states/paused.py +2 -2
  17. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/states/returning_home.py +2 -2
  18. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/states/robot_standing_still.py +3 -3
  19. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/states/unknown_status.py +1 -1
  20. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/states_enum.py +1 -0
  21. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/transitions/functions/fail_mission.py +7 -0
  22. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/transitions/functions/pause.py +1 -1
  23. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/transitions/functions/resume.py +1 -1
  24. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/transitions/functions/start_mission.py +4 -4
  25. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/transitions/functions/stop.py +12 -6
  26. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/transitions/mission.py +4 -10
  27. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/transitions/return_home.py +14 -2
  28. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/utils/common_event_handlers.py +2 -2
  29. {isar-1.31.1 → isar-1.32.1}/src/isar.egg-info/PKG-INFO +1 -1
  30. {isar-1.31.1 → isar-1.32.1}/src/isar.egg-info/SOURCES.txt +1 -0
  31. {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/mission/status.py +1 -0
  32. {isar-1.31.1 → isar-1.32.1}/src/robot_interface/telemetry/payloads.py +8 -0
  33. {isar-1.31.1 → isar-1.32.1}/tests/isar/models/communication/test_events.py +8 -8
  34. {isar-1.31.1 → isar-1.32.1}/tests/isar/services/utilities/test_scheduling_utilities.py +1 -1
  35. {isar-1.31.1 → isar-1.32.1}/tests/isar/state_machine/test_state_machine.py +2 -2
  36. isar-1.31.1/src/isar/config/logging.conf +0 -58
  37. {isar-1.31.1 → isar-1.32.1}/.dockerignore +0 -0
  38. {isar-1.31.1 → isar-1.32.1}/.env.test +0 -0
  39. {isar-1.31.1 → isar-1.32.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  40. {isar-1.31.1 → isar-1.32.1}/.github/ISSUE_TEMPLATE/feature.md +0 -0
  41. {isar-1.31.1 → isar-1.32.1}/.github/ISSUE_TEMPLATE/improvement.md +0 -0
  42. {isar-1.31.1 → isar-1.32.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  43. {isar-1.31.1 → isar-1.32.1}/.github/release.yml +0 -0
  44. {isar-1.31.1 → isar-1.32.1}/.github/workflows/compile_requirements.yml +0 -0
  45. {isar-1.31.1 → isar-1.32.1}/.github/workflows/project_automations.yml +0 -0
  46. {isar-1.31.1 → isar-1.32.1}/.github/workflows/pythonpackage.yml +0 -0
  47. {isar-1.31.1 → isar-1.32.1}/.github/workflows/pythonpublish.yml +0 -0
  48. {isar-1.31.1 → isar-1.32.1}/.github/workflows/stale.yml +0 -0
  49. {isar-1.31.1 → isar-1.32.1}/.gitignore +0 -0
  50. {isar-1.31.1 → isar-1.32.1}/.pre-commit-config.yaml +0 -0
  51. {isar-1.31.1 → isar-1.32.1}/LICENSE +0 -0
  52. {isar-1.31.1 → isar-1.32.1}/README.md +0 -0
  53. {isar-1.31.1 → isar-1.32.1}/SECURITY.md +0 -0
  54. {isar-1.31.1 → isar-1.32.1}/docs/Makefile +0 -0
  55. {isar-1.31.1 → isar-1.32.1}/docs/full_state_machine_diagram.png +0 -0
  56. {isar-1.31.1 → isar-1.32.1}/docs/make.bat +0 -0
  57. {isar-1.31.1 → isar-1.32.1}/docs/mission_state_machine_diagram.png +0 -0
  58. {isar-1.31.1 → isar-1.32.1}/docs/robot_status_state_machine_diagram.png +0 -0
  59. {isar-1.31.1 → isar-1.32.1}/docs/rst_processing.py +0 -0
  60. {isar-1.31.1 → isar-1.32.1}/docs/source/conf.py +0 -0
  61. {isar-1.31.1 → isar-1.32.1}/docs/source/index.rst +0 -0
  62. {isar-1.31.1 → isar-1.32.1}/docs/source/readme_link.md +0 -0
  63. {isar-1.31.1 → isar-1.32.1}/docs/update_state_diagram.py +0 -0
  64. {isar-1.31.1 → isar-1.32.1}/main.py +0 -0
  65. {isar-1.31.1 → isar-1.32.1}/pyproject.toml +0 -0
  66. {isar-1.31.1 → isar-1.32.1}/radixconfig.yml +0 -0
  67. {isar-1.31.1 → isar-1.32.1}/requirements.txt +0 -0
  68. {isar-1.31.1 → isar-1.32.1}/setup.cfg +0 -0
  69. {isar-1.31.1 → isar-1.32.1}/src/isar/__init__.py +0 -0
  70. {isar-1.31.1 → isar-1.32.1}/src/isar/apis/__init__.py +0 -0
  71. {isar-1.31.1 → isar-1.32.1}/src/isar/apis/models/__init__.py +0 -0
  72. {isar-1.31.1 → isar-1.32.1}/src/isar/apis/models/models.py +0 -0
  73. {isar-1.31.1 → isar-1.32.1}/src/isar/apis/robot_control/robot_controller.py +0 -0
  74. {isar-1.31.1 → isar-1.32.1}/src/isar/apis/schedule/__init__.py +0 -0
  75. {isar-1.31.1 → isar-1.32.1}/src/isar/apis/security/__init__.py +0 -0
  76. {isar-1.31.1 → isar-1.32.1}/src/isar/apis/security/authentication.py +0 -0
  77. {isar-1.31.1 → isar-1.32.1}/src/isar/config/__init__.py +0 -0
  78. {isar-1.31.1 → isar-1.32.1}/src/isar/config/certs/ca-cert.pem +0 -0
  79. {isar-1.31.1 → isar-1.32.1}/src/isar/config/configuration_error.py +0 -0
  80. {isar-1.31.1 → isar-1.32.1}/src/isar/config/keyvault/__init__.py +0 -0
  81. {isar-1.31.1 → isar-1.32.1}/src/isar/config/keyvault/keyvault_error.py +0 -0
  82. {isar-1.31.1 → isar-1.32.1}/src/isar/config/keyvault/keyvault_service.py +0 -0
  83. {isar-1.31.1 → isar-1.32.1}/src/isar/config/maps/JSP1_intermediate_deck.json +0 -0
  84. {isar-1.31.1 → isar-1.32.1}/src/isar/config/maps/JSP1_weather_deck.json +0 -0
  85. {isar-1.31.1 → isar-1.32.1}/src/isar/config/maps/default_map.json +0 -0
  86. {isar-1.31.1 → isar-1.32.1}/src/isar/config/maps/klab_b.json +0 -0
  87. {isar-1.31.1 → isar-1.32.1}/src/isar/config/maps/klab_compressor.json +0 -0
  88. {isar-1.31.1 → isar-1.32.1}/src/isar/config/maps/klab_turtlebot.json +0 -0
  89. {isar-1.31.1 → isar-1.32.1}/src/isar/config/maps/turtleworld.json +0 -0
  90. {isar-1.31.1 → isar-1.32.1}/src/isar/config/open_telemetry.py +0 -0
  91. {isar-1.31.1 → isar-1.32.1}/src/isar/config/predefined_mission_definition/__init__.py +0 -0
  92. {isar-1.31.1 → isar-1.32.1}/src/isar/config/predefined_mission_definition/default_exr.json +0 -0
  93. {isar-1.31.1 → isar-1.32.1}/src/isar/config/predefined_mission_definition/default_mission.json +0 -0
  94. {isar-1.31.1 → isar-1.32.1}/src/isar/config/predefined_mission_definition/default_turtlebot.json +0 -0
  95. {isar-1.31.1 → isar-1.32.1}/src/isar/config/predefined_missions/__init__.py +0 -0
  96. {isar-1.31.1 → isar-1.32.1}/src/isar/config/predefined_missions/default.json +0 -0
  97. {isar-1.31.1 → isar-1.32.1}/src/isar/config/predefined_missions/default_turtlebot.json +0 -0
  98. {isar-1.31.1 → isar-1.32.1}/src/isar/eventhandlers/eventhandler.py +0 -0
  99. {isar-1.31.1 → isar-1.32.1}/src/isar/mission_planner/__init__.py +0 -0
  100. {isar-1.31.1 → isar-1.32.1}/src/isar/mission_planner/local_planner.py +0 -0
  101. {isar-1.31.1 → isar-1.32.1}/src/isar/mission_planner/mission_planner_interface.py +0 -0
  102. {isar-1.31.1 → isar-1.32.1}/src/isar/mission_planner/sequential_task_selector.py +0 -0
  103. {isar-1.31.1 → isar-1.32.1}/src/isar/mission_planner/task_selector_interface.py +0 -0
  104. {isar-1.31.1 → isar-1.32.1}/src/isar/models/__init__.py +0 -0
  105. {isar-1.31.1 → isar-1.32.1}/src/isar/modules.py +0 -0
  106. {isar-1.31.1 → isar-1.32.1}/src/isar/robot/robot.py +0 -0
  107. {isar-1.31.1 → isar-1.32.1}/src/isar/robot/robot_start_mission.py +0 -0
  108. {isar-1.31.1 → isar-1.32.1}/src/isar/robot/robot_status.py +0 -0
  109. {isar-1.31.1 → isar-1.32.1}/src/isar/robot/robot_stop_mission.py +0 -0
  110. {isar-1.31.1 → isar-1.32.1}/src/isar/robot/robot_task_status.py +0 -0
  111. {isar-1.31.1 → isar-1.32.1}/src/isar/services/__init__.py +0 -0
  112. {isar-1.31.1 → isar-1.32.1}/src/isar/services/auth/__init__.py +0 -0
  113. {isar-1.31.1 → isar-1.32.1}/src/isar/services/auth/azure_credentials.py +0 -0
  114. {isar-1.31.1 → isar-1.32.1}/src/isar/services/service_connections/__init__.py +0 -0
  115. {isar-1.31.1 → isar-1.32.1}/src/isar/services/service_connections/mqtt/__init__.py +0 -0
  116. {isar-1.31.1 → isar-1.32.1}/src/isar/services/service_connections/mqtt/mqtt_client.py +0 -0
  117. {isar-1.31.1 → isar-1.32.1}/src/isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +0 -0
  118. {isar-1.31.1 → isar-1.32.1}/src/isar/services/service_connections/mqtt/robot_info_publisher.py +0 -0
  119. {isar-1.31.1 → isar-1.32.1}/src/isar/services/service_connections/request_handler.py +0 -0
  120. {isar-1.31.1 → isar-1.32.1}/src/isar/services/utilities/__init__.py +0 -0
  121. {isar-1.31.1 → isar-1.32.1}/src/isar/services/utilities/robot_utilities.py +0 -0
  122. {isar-1.31.1 → isar-1.32.1}/src/isar/services/utilities/threaded_request.py +0 -0
  123. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/__init__.py +0 -0
  124. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/states/__init__.py +0 -0
  125. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/states/blocked_protective_stop.py +0 -0
  126. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/states/offline.py +0 -0
  127. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/states/stopping.py +0 -0
  128. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/transitions/functions/finish_mission.py +0 -0
  129. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/transitions/functions/return_home.py +0 -0
  130. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/transitions/functions/robot_status.py +0 -0
  131. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/transitions/functions/utils.py +0 -0
  132. {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/transitions/robot_status.py +0 -0
  133. {isar-1.31.1 → isar-1.32.1}/src/isar/storage/__init__.py +0 -0
  134. {isar-1.31.1 → isar-1.32.1}/src/isar/storage/blob_storage.py +0 -0
  135. {isar-1.31.1 → isar-1.32.1}/src/isar/storage/local_storage.py +0 -0
  136. {isar-1.31.1 → isar-1.32.1}/src/isar/storage/storage_interface.py +0 -0
  137. {isar-1.31.1 → isar-1.32.1}/src/isar/storage/uploader.py +0 -0
  138. {isar-1.31.1 → isar-1.32.1}/src/isar/storage/utilities.py +0 -0
  139. {isar-1.31.1 → isar-1.32.1}/src/isar.egg-info/dependency_links.txt +0 -0
  140. {isar-1.31.1 → isar-1.32.1}/src/isar.egg-info/entry_points.txt +0 -0
  141. {isar-1.31.1 → isar-1.32.1}/src/isar.egg-info/requires.txt +0 -0
  142. {isar-1.31.1 → isar-1.32.1}/src/isar.egg-info/top_level.txt +0 -0
  143. {isar-1.31.1 → isar-1.32.1}/src/robot_interface/__init__.py +0 -0
  144. {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/__init__.py +0 -0
  145. {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/exceptions/__init__.py +0 -0
  146. {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/exceptions/robot_exceptions.py +0 -0
  147. {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/initialize/__init__.py +0 -0
  148. {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/inspection/__init__.py +0 -0
  149. {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/inspection/inspection.py +0 -0
  150. {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/mission/__init__.py +0 -0
  151. {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/mission/mission.py +0 -0
  152. {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/mission/task.py +0 -0
  153. {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/robots/__init__.py +0 -0
  154. {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/robots/battery_state.py +0 -0
  155. {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/robots/media.py +0 -0
  156. {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/robots/robot_model.py +0 -0
  157. {isar-1.31.1 → isar-1.32.1}/src/robot_interface/robot_interface.py +0 -0
  158. {isar-1.31.1 → isar-1.32.1}/src/robot_interface/telemetry/__init__.py +0 -0
  159. {isar-1.31.1 → isar-1.32.1}/src/robot_interface/telemetry/mqtt_client.py +0 -0
  160. {isar-1.31.1 → isar-1.32.1}/src/robot_interface/test_robot_interface.py +0 -0
  161. {isar-1.31.1 → isar-1.32.1}/src/robot_interface/utilities/__init__.py +0 -0
  162. {isar-1.31.1 → isar-1.32.1}/src/robot_interface/utilities/json_service.py +0 -0
  163. {isar-1.31.1 → isar-1.32.1}/src/robot_interface/utilities/uuid_string_factory.py +0 -0
  164. {isar-1.31.1 → isar-1.32.1}/tests/__init__.py +0 -0
  165. {isar-1.31.1 → isar-1.32.1}/tests/conftest.py +0 -0
  166. {isar-1.31.1 → isar-1.32.1}/tests/integration/__init__.py +0 -0
  167. {isar-1.31.1 → isar-1.32.1}/tests/integration/turtlebot/__init__.py +0 -0
  168. {isar-1.31.1 → isar-1.32.1}/tests/integration/turtlebot/config/__init__.py +0 -0
  169. {isar-1.31.1 → isar-1.32.1}/tests/integration/turtlebot/config/maps/__init__.py +0 -0
  170. {isar-1.31.1 → isar-1.32.1}/tests/integration/turtlebot/config/maps/turtleworld.json +0 -0
  171. {isar-1.31.1 → isar-1.32.1}/tests/integration/turtlebot/config/missions/__init__.py +0 -0
  172. {isar-1.31.1 → isar-1.32.1}/tests/integration/turtlebot/config/missions/default.json +0 -0
  173. {isar-1.31.1 → isar-1.32.1}/tests/integration/turtlebot/test_successful_mission.py +0 -0
  174. {isar-1.31.1 → isar-1.32.1}/tests/isar/__init__.py +0 -0
  175. {isar-1.31.1 → isar-1.32.1}/tests/isar/apis/__init__.py +0 -0
  176. {isar-1.31.1 → isar-1.32.1}/tests/isar/apis/models/__init__.py +0 -0
  177. {isar-1.31.1 → isar-1.32.1}/tests/isar/apis/models/example_mission_definition.json +0 -0
  178. {isar-1.31.1 → isar-1.32.1}/tests/isar/apis/models/test_start_mission_definition.py +0 -0
  179. {isar-1.31.1 → isar-1.32.1}/tests/isar/apis/scheduler/__init__.py +0 -0
  180. {isar-1.31.1 → isar-1.32.1}/tests/isar/apis/scheduler/test_scheduler_router.py +0 -0
  181. {isar-1.31.1 → isar-1.32.1}/tests/isar/apis/security/__init__.py +0 -0
  182. {isar-1.31.1 → isar-1.32.1}/tests/isar/apis/security/test_authentication.py +0 -0
  183. {isar-1.31.1 → isar-1.32.1}/tests/isar/mission/__init__.py +0 -0
  184. {isar-1.31.1 → isar-1.32.1}/tests/isar/mission/test_mission.py +0 -0
  185. {isar-1.31.1 → isar-1.32.1}/tests/isar/models/__init__.py +0 -0
  186. {isar-1.31.1 → isar-1.32.1}/tests/isar/models/communication/__init__.py +0 -0
  187. {isar-1.31.1 → isar-1.32.1}/tests/isar/services/__init__.py +0 -0
  188. {isar-1.31.1 → isar-1.32.1}/tests/isar/services/readers/__init__.py +0 -0
  189. {isar-1.31.1 → isar-1.32.1}/tests/isar/services/readers/test_mission_reader.py +0 -0
  190. {isar-1.31.1 → isar-1.32.1}/tests/isar/services/service_connections/__init__.py +0 -0
  191. {isar-1.31.1 → isar-1.32.1}/tests/isar/services/service_connections/echo/__init__.py +0 -0
  192. {isar-1.31.1 → isar-1.32.1}/tests/isar/services/service_connections/test_base_request_handler.py +0 -0
  193. {isar-1.31.1 → isar-1.32.1}/tests/isar/services/utilities/__init__.py +0 -0
  194. {isar-1.31.1 → isar-1.32.1}/tests/isar/services/utilities/test_queue_utilities.py +0 -0
  195. {isar-1.31.1 → isar-1.32.1}/tests/isar/state_machine/__init__.py +0 -0
  196. {isar-1.31.1 → isar-1.32.1}/tests/isar/state_machine/states/__init__.py +0 -0
  197. {isar-1.31.1 → isar-1.32.1}/tests/isar/state_machine/states/test_monitor.py +0 -0
  198. {isar-1.31.1 → isar-1.32.1}/tests/isar/storage/test_blob_storage.py +0 -0
  199. {isar-1.31.1 → isar-1.32.1}/tests/isar/storage/test_uploader.py +0 -0
  200. {isar-1.31.1 → isar-1.32.1}/tests/test_data/test_map_config/test_map_config.json +0 -0
  201. {isar-1.31.1 → isar-1.32.1}/tests/test_data/test_mission_not_working.json +0 -0
  202. {isar-1.31.1 → isar-1.32.1}/tests/test_data/test_mission_working.json +0 -0
  203. {isar-1.31.1 → isar-1.32.1}/tests/test_data/test_mission_working_no_tasks.json +0 -0
  204. {isar-1.31.1 → isar-1.32.1}/tests/test_data/test_thermal_image_mission.json +0 -0
  205. {isar-1.31.1 → isar-1.32.1}/tests/test_double/__init__.py +0 -0
  206. {isar-1.31.1 → isar-1.32.1}/tests/test_double/blob_storage.py +0 -0
  207. {isar-1.31.1 → isar-1.32.1}/tests/test_double/mission_definition.py +0 -0
  208. {isar-1.31.1 → isar-1.32.1}/tests/test_double/mqtt_client.py +0 -0
  209. {isar-1.31.1 → isar-1.32.1}/tests/test_double/pose.py +0 -0
  210. {isar-1.31.1 → isar-1.32.1}/tests/test_double/request.py +0 -0
  211. {isar-1.31.1 → isar-1.32.1}/tests/test_double/robot_interface.py +0 -0
  212. {isar-1.31.1 → isar-1.32.1}/tests/test_double/status.py +0 -0
  213. {isar-1.31.1 → isar-1.32.1}/tests/test_double/task.py +0 -0
  214. {isar-1.31.1 → isar-1.32.1}/tests/test_double/token.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: isar
3
- Version: 1.31.1
3
+ Version: 1.32.1
4
4
  Summary: Integration and Supervisory control of Autonomous Robots
5
5
  Author-email: Equinor ASA <fg_robots_dev@equinor.com>
6
6
  License: Eclipse Public License version 2.0
@@ -245,6 +245,24 @@ class API:
245
245
  },
246
246
  },
247
247
  )
248
+ router.add_api_route(
249
+ path="/schedule/release-intervention-needed",
250
+ endpoint=self.scheduling_controller.release_intervention_needed,
251
+ methods=["POST"],
252
+ dependencies=[authentication_dependency],
253
+ summary="Release the intervention needed state",
254
+ responses={
255
+ HTTPStatus.OK.value: {
256
+ "description": "Robot released from intervention needed state"
257
+ },
258
+ HTTPStatus.CONFLICT.value: {
259
+ "description": "Conflict - Invalid command in the current state"
260
+ },
261
+ HTTPStatus.INTERNAL_SERVER_ERROR.value: {
262
+ "description": "Internal Server Error - Current state of state machine unknown"
263
+ },
264
+ },
265
+ )
248
266
  router.add_api_route(
249
267
  path="/schedule/move_arm/{arm_pose_literal}",
250
268
  endpoint=self.scheduling_controller.start_move_arm_mission,
@@ -53,6 +53,7 @@ class StartMissionTaskDefinition(BaseModel):
53
53
 
54
54
 
55
55
  class StartMissionDefinition(BaseModel):
56
+ id: Optional[str] = None
56
57
  tasks: List[StartMissionTaskDefinition]
57
58
  name: Optional[str] = None
58
59
  start_pose: Optional[InputPose] = None
@@ -84,7 +85,10 @@ def to_isar_mission(
84
85
  if start_mission_definition.start_pose:
85
86
  start_pose = start_mission_definition.start_pose.to_alitra_pose()
86
87
 
88
+ id = start_mission_definition.id if start_mission_definition.id else uuid4_string()
89
+
87
90
  return Mission(
91
+ id=id,
88
92
  tasks=isar_tasks,
89
93
  name=isar_mission_name,
90
94
  start_pose=start_pose,
@@ -256,6 +256,22 @@ class SchedulingController:
256
256
  self.scheduling_utilities.start_mission(mission=mission)
257
257
  return self._api_response(mission)
258
258
 
259
+ def release_intervention_needed(self) -> None:
260
+ self.logger.info("Received request to release intervention needed state")
261
+
262
+ state: States = self.scheduling_utilities.get_state()
263
+
264
+ if state != States.InterventionNeeded:
265
+ error_message = f"Conflict - Release intervention needed command received in invalid state - State: {state}"
266
+ self.logger.warning(error_message)
267
+ raise HTTPException(
268
+ status_code=HTTPStatus.CONFLICT,
269
+ detail=error_message,
270
+ )
271
+
272
+ self.scheduling_utilities.release_intervention_needed()
273
+ self.logger.info("Released intervention needed state successfully")
274
+
259
275
  def _api_response(self, mission: Mission) -> StartMissionResponse:
260
276
  return StartMissionResponse(
261
277
  id=mission.id,
@@ -5,11 +5,10 @@ from importlib.resources import as_file, files
5
5
  import yaml
6
6
  from uvicorn.logging import ColourizedFormatter
7
7
 
8
- from isar.config.keyvault.keyvault_service import Keyvault
9
8
  from isar.config.settings import settings
10
9
 
11
10
 
12
- def setup_loggers(keyvault: Keyvault) -> None:
11
+ def setup_loggers() -> None:
13
12
  log_levels: dict = settings.LOG_LEVELS
14
13
  log_config = load_log_config()
15
14
 
@@ -0,0 +1,37 @@
1
+ version: 1
2
+ formatters:
3
+ simple:
4
+ format: '%(asctime)s - %(levelname)s - %(name)s - %(message)s'
5
+ colourized:
6
+ style: "{"
7
+ format: "{asctime} - {levelprefix:<8} - {name} - {message}"
8
+ loggers:
9
+ console:
10
+ handlers: []
11
+ propagate: no
12
+ main:
13
+ handlers: []
14
+ propagate: no
15
+ api:
16
+ handlers: []
17
+ propagate: no
18
+ mqtt:
19
+ handlers: []
20
+ propagate: no
21
+ state_machine:
22
+ handlers: []
23
+ propagate: no
24
+ uploader:
25
+ handlers: []
26
+ propagate: no
27
+ urllib3:
28
+ handlers: []
29
+ uvicorn:
30
+ handlers: []
31
+ propagate: no
32
+ azure:
33
+ handlers: []
34
+ propagate: no
35
+ root:
36
+ level: DEBUG
37
+ handlers: []
@@ -224,6 +224,9 @@ class Settings(BaseSettings):
224
224
  default="robot_heartbeat", validate_default=True
225
225
  )
226
226
  TOPIC_ISAR_STARTUP: str = Field(default="startup", validate_default=True)
227
+ TOPIC_ISAR_INTERVENTION_NEEDED: str = Field(
228
+ default="intervention_needed", validate_default=True
229
+ )
227
230
 
228
231
  # Logging
229
232
 
@@ -275,6 +278,7 @@ class Settings(BaseSettings):
275
278
  "TOPIC_ISAR_INSPECTION_RESULT",
276
279
  "TOPIC_ISAR_INSPECTION_VALUE",
277
280
  "TOPIC_ISAR_STARTUP",
281
+ "TOPIC_ISAR_INTERVENTION_NEEDED",
278
282
  )
279
283
  @classmethod
280
284
  def prefix_isar_topics(cls, v: Any, info: ValidationInfo):
@@ -70,13 +70,13 @@ class Events:
70
70
 
71
71
  class APIEvent(Generic[T1, T2]):
72
72
  """
73
- Creates input and output event. The events are defined such that the input is from
74
- api to state machine while the output is from state machine to api.
73
+ Creates request and response event. The events are defined such that the request is from
74
+ api to state machine while the response is from state machine to api.
75
75
  """
76
76
 
77
77
  def __init__(self):
78
- self.input: Event[T1] = Event()
79
- self.output: Event[T2] = Event()
78
+ self.request: Event[T1] = Event()
79
+ self.response: Event[T2] = Event()
80
80
 
81
81
 
82
82
  class APIRequests:
@@ -86,6 +86,7 @@ class APIRequests:
86
86
  self.pause_mission: APIEvent[bool, ControlMissionResponse] = APIEvent()
87
87
  self.resume_mission: APIEvent[bool, ControlMissionResponse] = APIEvent()
88
88
  self.return_home: APIEvent[bool, bool] = APIEvent()
89
+ self.release_intervention_needed: APIEvent[bool, bool] = APIEvent()
89
90
 
90
91
 
91
92
  class StateMachineEvents:
@@ -36,7 +36,8 @@ def print_setting(
36
36
 
37
37
 
38
38
  def print_startup_info():
39
- print(
39
+ logger: Logger = logging.getLogger("main")
40
+ logger.info(
40
41
  """
41
42
  __ ________ ___ ________
42
43
  / / / ______/ / | / ____ /
@@ -48,21 +49,15 @@ def print_startup_info():
48
49
  """
49
50
  )
50
51
 
51
- WIDTH = 48
52
-
53
52
  def print_setting(setting: str = "", value: Any = "", fillchar: str = " "):
54
53
  separator = ": " if value != "" else ""
55
- text = setting.ljust(22, fillchar) + separator + str(value)
56
- print("*", text.ljust(WIDTH - 4, fillchar), "*")
54
+ logger.info(setting + separator + str(value))
57
55
 
58
- print("Integration and Supervisory control".center(WIDTH, " "))
59
- print("of Autonomous Robots".center(WIDTH, " "))
60
- print()
61
- print(f"Version: {isar.__version__}\n".center(WIDTH, " "))
56
+ logger.info(
57
+ f"Integration and Supervisory control of Autonomous Robots - Version: {isar.__version__}\n"
58
+ )
62
59
 
63
- print_setting(fillchar="*")
64
60
  print_setting("ISAR settings")
65
- print_setting(fillchar="-")
66
61
  print_setting("Robot package", settings.ROBOT_PACKAGE)
67
62
  print_setting("Robot name", settings.ROBOT_NAME)
68
63
  print_setting("Running on port", settings.API_PORT)
@@ -74,17 +69,13 @@ def print_startup_info():
74
69
  print_setting("Plant code", settings.PLANT_CODE)
75
70
  print_setting("Plant name", settings.PLANT_NAME)
76
71
  print_setting("Plant shortname", settings.PLANT_SHORT_NAME)
77
- print_setting(fillchar="-")
78
72
  print_setting("Robot capabilities", robot_settings.CAPABILITIES)
79
- print_setting(fillchar="*")
80
- print()
81
73
 
82
74
 
83
75
  def start() -> None:
84
76
  injector: ApplicationContainer = get_injector()
85
77
 
86
- keyvault = injector.keyvault()
87
- setup_loggers(keyvault=keyvault)
78
+ setup_loggers()
88
79
  setup_open_telemetry(app=injector.api().app)
89
80
  logger: Logger = logging.getLogger("main")
90
81
 
@@ -290,12 +290,32 @@ class SchedulingUtilities:
290
290
  self.logger.info("OK - Mission successfully stopped")
291
291
  return stop_mission_response
292
292
 
293
+ def release_intervention_needed(self) -> None:
294
+ """Release intervention needed state
295
+
296
+ Raises
297
+ ------
298
+ HTTPException 500 Internal Server Error
299
+ If the intervention needed state could not be released
300
+ """
301
+ try:
302
+ self._send_command(True, self.api_events.release_intervention_needed)
303
+ self.logger.info("OK - Intervention needed state released")
304
+ except EventTimeoutError:
305
+ error_message = (
306
+ "Internal Server Error - Failed to release intervention needed state"
307
+ )
308
+ self.logger.error(error_message)
309
+ raise HTTPException(
310
+ status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail=error_message
311
+ )
312
+
293
313
  def _send_command(self, input: T1, api_event: APIEvent[T1, T2]) -> T2:
294
- api_event.input.trigger_event(input)
314
+ api_event.request.trigger_event(input)
295
315
  try:
296
- return api_event.output.consume_event(timeout=self.queue_timeout)
316
+ return api_event.response.consume_event(timeout=self.queue_timeout)
297
317
  except EventTimeoutError as e:
298
318
  self.logger.error("Queue timed out")
299
- api_event.input.clear_event()
319
+ api_event.request.clear_event()
300
320
  self.logger.error("No output received for command to state machine")
301
321
  raise e
@@ -18,6 +18,7 @@ from isar.models.events import Events, SharedState
18
18
  from isar.state_machine.states.await_next_mission import AwaitNextMission
19
19
  from isar.state_machine.states.blocked_protective_stop import BlockedProtectiveStop
20
20
  from isar.state_machine.states.home import Home
21
+ from isar.state_machine.states.intervention_needed import InterventionNeeded
21
22
  from isar.state_machine.states.monitor import Monitor
22
23
  from isar.state_machine.states.offline import Offline
23
24
  from isar.state_machine.states.paused import Paused
@@ -41,6 +42,7 @@ from robot_interface.models.mission.task import TASKS, InspectionTask, Task
41
42
  from robot_interface.robot_interface import RobotInterface
42
43
  from robot_interface.telemetry.mqtt_client import MqttClientInterface
43
44
  from robot_interface.telemetry.payloads import (
45
+ InterventionNeededPayload,
44
46
  MissionPayload,
45
47
  RobotStatusPayload,
46
48
  TaskPayload,
@@ -101,6 +103,7 @@ class StateMachine(object):
101
103
  self.await_next_mission_state: State = AwaitNextMission(self)
102
104
  self.home_state: State = Home(self)
103
105
  self.robot_standing_still_state: State = RobotStandingStill(self)
106
+ self.intervention_needed_state: State = InterventionNeeded(self)
104
107
 
105
108
  # Status states
106
109
  self.offline_state: State = Offline(self)
@@ -120,6 +123,7 @@ class StateMachine(object):
120
123
  self.offline_state,
121
124
  self.blocked_protective_stopping_state,
122
125
  self.unknown_status_state,
126
+ self.intervention_needed_state,
123
127
  ]
124
128
 
125
129
  self.machine = Machine(
@@ -282,6 +286,25 @@ class StateMachine(object):
282
286
  retain=True,
283
287
  )
284
288
 
289
+ def publish_intervention_needed(self, error_message: str) -> None:
290
+ """Publishes the intervention needed message to the MQTT Broker"""
291
+ if not self.mqtt_publisher:
292
+ return
293
+
294
+ payload: InterventionNeededPayload = InterventionNeededPayload(
295
+ isar_id=settings.ISAR_ID,
296
+ robot_name=settings.ROBOT_NAME,
297
+ reason=error_message,
298
+ timestamp=datetime.now(timezone.utc),
299
+ )
300
+
301
+ self.mqtt_publisher.publish(
302
+ topic=settings.TOPIC_ISAR_INTERVENTION_NEEDED,
303
+ payload=json.dumps(payload, cls=EnhancedJSONEncoder),
304
+ qos=1,
305
+ retain=True,
306
+ )
307
+
285
308
  def publish_status(self) -> None:
286
309
  if not self.mqtt_publisher:
287
310
  return
@@ -314,6 +337,8 @@ class StateMachine(object):
314
337
  return RobotStatus.Offline
315
338
  elif self.current_state == States.BlockedProtectiveStop:
316
339
  return RobotStatus.BlockedProtectiveStop
340
+ elif self.current_state == States.InterventionNeeded:
341
+ return RobotStatus.InterventionNeeded
317
342
  else:
318
343
  return RobotStatus.Busy
319
344
 
@@ -343,7 +368,7 @@ class StateMachine(object):
343
368
  )
344
369
 
345
370
  def _queue_empty_response(self) -> None:
346
- self.events.api_requests.stop_mission.output.put(
371
+ self.events.api_requests.stop_mission.response.put(
347
372
  ControlMissionResponse(
348
373
  mission_id="None",
349
374
  mission_status="None",
@@ -24,17 +24,17 @@ class AwaitNextMission(EventHandlerBase):
24
24
  event_handlers: List[EventHandlerMapping] = [
25
25
  EventHandlerMapping(
26
26
  name="start_mission_event",
27
- event=events.api_requests.start_mission.input,
27
+ event=events.api_requests.start_mission.request,
28
28
  handler=lambda event: start_mission_event_handler(state_machine, event),
29
29
  ),
30
30
  EventHandlerMapping(
31
31
  name="return_home_event",
32
- event=events.api_requests.return_home.input,
32
+ event=events.api_requests.return_home.request,
33
33
  handler=lambda event: return_home_event_handler(state_machine, event),
34
34
  ),
35
35
  EventHandlerMapping(
36
36
  name="stop_mission_event",
37
- event=events.api_requests.return_home.input,
37
+ event=events.api_requests.return_home.request,
38
38
  handler=lambda event: stop_mission_event_handler(state_machine, event),
39
39
  ),
40
40
  ]
@@ -22,17 +22,17 @@ class Home(EventHandlerBase):
22
22
  event_handlers: List[EventHandlerMapping] = [
23
23
  EventHandlerMapping(
24
24
  name="start_mission_event",
25
- event=events.api_requests.start_mission.input,
25
+ event=events.api_requests.start_mission.request,
26
26
  handler=lambda event: start_mission_event_handler(state_machine, event),
27
27
  ),
28
28
  EventHandlerMapping(
29
29
  name="return_home_event",
30
- event=events.api_requests.return_home.input,
30
+ event=events.api_requests.return_home.request,
31
31
  handler=lambda event: return_home_event_handler(state_machine, event),
32
32
  ),
33
33
  EventHandlerMapping(
34
34
  name="stop_mission_event",
35
- event=events.api_requests.return_home.input,
35
+ event=events.api_requests.return_home.request,
36
36
  handler=lambda event: stop_mission_event_handler(state_machine, event),
37
37
  ),
38
38
  EventHandlerMapping(
@@ -0,0 +1,43 @@
1
+ from collections.abc import Callable
2
+ from typing import TYPE_CHECKING, List, Optional
3
+
4
+ from isar.eventhandlers.eventhandler import EventHandlerBase, EventHandlerMapping
5
+ from isar.models.events import Event
6
+ from isar.state_machine.utils.common_event_handlers import return_home_event_handler
7
+
8
+ if TYPE_CHECKING:
9
+ from isar.state_machine.state_machine import StateMachine
10
+
11
+
12
+ class InterventionNeeded(EventHandlerBase):
13
+
14
+ def __init__(self, state_machine: "StateMachine"):
15
+ events = state_machine.events
16
+
17
+ def release_intervention_needed_handler(
18
+ event: Event[bool],
19
+ ) -> Optional[Callable]:
20
+ if event.consume_event():
21
+ state_machine.events.api_requests.release_intervention_needed.response.trigger_event(
22
+ True
23
+ )
24
+ return state_machine.release_intervention_needed # type: ignore
25
+ return None
26
+
27
+ event_handlers: List[EventHandlerMapping] = [
28
+ EventHandlerMapping(
29
+ name="return_home_event",
30
+ event=events.api_requests.return_home.request,
31
+ handler=lambda event: return_home_event_handler(state_machine, event),
32
+ ),
33
+ EventHandlerMapping(
34
+ name="release_intervention_needed_event",
35
+ event=events.api_requests.release_intervention_needed.request,
36
+ handler=release_intervention_needed_handler,
37
+ ),
38
+ ]
39
+ super().__init__(
40
+ state_name="intervention_needed",
41
+ state_machine=state_machine,
42
+ event_handler_mappings=event_handlers,
43
+ )
@@ -49,12 +49,12 @@ class Monitor(EventHandlerBase):
49
49
  event_handlers: List[EventHandlerMapping] = [
50
50
  EventHandlerMapping(
51
51
  name="stop_mission_event",
52
- event=events.api_requests.stop_mission.input,
52
+ event=events.api_requests.stop_mission.request,
53
53
  handler=lambda event: stop_mission_event_handler(state_machine, event),
54
54
  ),
55
55
  EventHandlerMapping(
56
56
  name="pause_mission_event",
57
- event=events.api_requests.pause_mission.input,
57
+ event=events.api_requests.pause_mission.request,
58
58
  handler=_pause_mission_event_handler,
59
59
  ),
60
60
  EventHandlerMapping(
@@ -14,12 +14,12 @@ class Paused(EventHandlerBase):
14
14
  event_handlers: List[EventHandlerMapping] = [
15
15
  EventHandlerMapping(
16
16
  name="stop_mission_event",
17
- event=events.api_requests.stop_mission.input,
17
+ event=events.api_requests.stop_mission.request,
18
18
  handler=lambda event: state_machine.stop if event.consume_event() else None, # type: ignore
19
19
  ),
20
20
  EventHandlerMapping(
21
21
  name="resume_mission_event",
22
- event=events.api_requests.resume_mission.input,
22
+ event=events.api_requests.resume_mission.request,
23
23
  handler=lambda event: state_machine.resume if event.consume_event() else None, # type: ignore
24
24
  ),
25
25
  ]
@@ -41,7 +41,7 @@ class ReturningHome(EventHandlerBase):
41
41
  event_handlers: List[EventHandlerMapping] = [
42
42
  EventHandlerMapping(
43
43
  name="stop_mission_event",
44
- event=events.api_requests.stop_mission.input,
44
+ event=events.api_requests.stop_mission.request,
45
45
  handler=lambda event: stop_mission_event_handler(state_machine, event),
46
46
  ),
47
47
  EventHandlerMapping(
@@ -60,7 +60,7 @@ class ReturningHome(EventHandlerBase):
60
60
  ),
61
61
  EventHandlerMapping(
62
62
  name="start_mission_event",
63
- event=events.api_requests.start_mission.input,
63
+ event=events.api_requests.start_mission.request,
64
64
  handler=_start_mission_event_handler,
65
65
  ),
66
66
  EventHandlerMapping(
@@ -22,17 +22,17 @@ class RobotStandingStill(EventHandlerBase):
22
22
  event_handlers: List[EventHandlerMapping] = [
23
23
  EventHandlerMapping(
24
24
  name="start_mission_event",
25
- event=events.api_requests.start_mission.input,
25
+ event=events.api_requests.start_mission.request,
26
26
  handler=lambda event: start_mission_event_handler(state_machine, event),
27
27
  ),
28
28
  EventHandlerMapping(
29
29
  name="return_home_event",
30
- event=events.api_requests.return_home.input,
30
+ event=events.api_requests.return_home.request,
31
31
  handler=lambda event: return_home_event_handler(state_machine, event),
32
32
  ),
33
33
  EventHandlerMapping(
34
34
  name="stop_mission_event",
35
- event=events.api_requests.return_home.input,
35
+ event=events.api_requests.return_home.request,
36
36
  handler=lambda event: stop_mission_event_handler(state_machine, event),
37
37
  ),
38
38
  EventHandlerMapping(
@@ -31,7 +31,7 @@ class UnknownStatus(EventHandlerBase):
31
31
  event_handlers: List[EventHandlerMapping] = [
32
32
  EventHandlerMapping(
33
33
  name="stop_mission_event",
34
- event=events.api_requests.stop_mission.input,
34
+ event=events.api_requests.stop_mission.request,
35
35
  handler=lambda event: stop_mission_event_handler(state_machine, event),
36
36
  ),
37
37
  EventHandlerMapping(
@@ -12,6 +12,7 @@ class States(str, Enum):
12
12
  Offline = "offline"
13
13
  BlockedProtectiveStop = "blocked_protective_stop"
14
14
  UnknownStatus = "unknown_status"
15
+ InterventionNeeded = "intervention_needed"
15
16
 
16
17
  def __repr__(self):
17
18
  return self.value
@@ -11,3 +11,10 @@ def report_failed_mission_and_finalize(state_machine: "StateMachine") -> None:
11
11
  state_machine.current_mission.status = MissionStatus.Failed
12
12
  state_machine.publish_task_status(task=state_machine.current_task)
13
13
  state_machine._finalize()
14
+
15
+
16
+ def report_failed_return_home_and_intervention_needed(
17
+ state_machine: "StateMachine",
18
+ ) -> None:
19
+ error_message: str = "Return home failed."
20
+ state_machine.publish_intervention_needed(error_message=error_message)
@@ -29,7 +29,7 @@ def pause_mission(state_machine: "StateMachine") -> bool:
29
29
  paused_mission_response: ControlMissionResponse = (
30
30
  state_machine._make_control_mission_response()
31
31
  )
32
- state_machine.events.api_requests.pause_mission.output.put(
32
+ state_machine.events.api_requests.pause_mission.response.put(
33
33
  paused_mission_response
34
34
  )
35
35
 
@@ -35,7 +35,7 @@ def resume_mission(state_machine: "StateMachine") -> bool:
35
35
  resume_mission_response: ControlMissionResponse = (
36
36
  state_machine._make_control_mission_response()
37
37
  )
38
- state_machine.events.api_requests.resume_mission.output.put(
38
+ state_machine.events.api_requests.resume_mission.response.put(
39
39
  resume_mission_response
40
40
  )
41
41
 
@@ -11,12 +11,12 @@ from robot_interface.models.exceptions.robot_exceptions import (
11
11
  from robot_interface.models.mission.status import MissionStatus, TaskStatus
12
12
 
13
13
 
14
- def put_start_mission_on_queue(state_machine: "StateMachine") -> bool:
15
- state_machine.events.api_requests.start_mission.output.put(True)
14
+ def acknowledge_mission(state_machine: "StateMachine") -> bool:
15
+ state_machine.events.api_requests.start_mission.response.put(True)
16
16
  return True
17
17
 
18
18
 
19
- def initiate_mission(state_machine: "StateMachine") -> bool:
19
+ def prepare_state_machine_before_mission(state_machine: "StateMachine") -> bool:
20
20
  state_machine.logger.info(
21
21
  "Initiating mission:\n"
22
22
  f" Mission ID: {state_machine.current_mission.id}\n"
@@ -70,5 +70,5 @@ def trigger_start_mission_event(state_machine: "StateMachine") -> bool:
70
70
 
71
71
 
72
72
  def _initialization_failed(state_machine: "StateMachine") -> None:
73
- state_machine.events.api_requests.start_mission.output.put(False)
73
+ state_machine.events.api_requests.start_mission.response.put(False)
74
74
  state_machine._finalize()
@@ -31,7 +31,9 @@ def stop_mission_cleanup(state_machine: "StateMachine") -> bool:
31
31
  stopped_mission_response: ControlMissionResponse = (
32
32
  state_machine._make_control_mission_response()
33
33
  )
34
- state_machine.events.api_requests.stop_mission.output.put(stopped_mission_response)
34
+ state_machine.events.api_requests.stop_mission.response.put(
35
+ stopped_mission_response
36
+ )
35
37
  state_machine.publish_task_status(task=state_machine.current_task)
36
38
  state_machine._finalize()
37
39
  return True
@@ -41,7 +43,9 @@ def stop_mission_failed(state_machine: "StateMachine") -> bool:
41
43
  stopped_mission_response: ControlMissionResponse = (
42
44
  state_machine._make_control_mission_response()
43
45
  )
44
- state_machine.events.api_requests.stop_mission.output.put(stopped_mission_response)
46
+ state_machine.events.api_requests.stop_mission.response.put(
47
+ stopped_mission_response
48
+ )
45
49
  return True
46
50
 
47
51
 
@@ -51,7 +55,7 @@ def stop_return_home_mission_cleanup(state_machine: "StateMachine") -> bool:
51
55
  state_machine.reset_state_machine()
52
56
  return True
53
57
 
54
- if not state_machine.events.api_requests.start_mission.input.has_event():
58
+ if not state_machine.events.api_requests.start_mission.request.has_event():
55
59
  state_machine.current_mission.status = MissionStatus.Cancelled
56
60
 
57
61
  for task in state_machine.current_mission.tasks:
@@ -65,7 +69,7 @@ def stop_return_home_mission_cleanup(state_machine: "StateMachine") -> bool:
65
69
  stopped_mission_response: ControlMissionResponse = (
66
70
  state_machine._make_control_mission_response()
67
71
  )
68
- state_machine.events.api_requests.stop_mission.output.put(
72
+ state_machine.events.api_requests.stop_mission.response.put(
69
73
  stopped_mission_response
70
74
  )
71
75
 
@@ -74,10 +78,12 @@ def stop_return_home_mission_cleanup(state_machine: "StateMachine") -> bool:
74
78
 
75
79
 
76
80
  def stop_return_home_mission_failed(state_machine: "StateMachine") -> bool:
77
- if state_machine.events.api_requests.start_mission.input.has_event():
81
+ if state_machine.events.api_requests.start_mission.request.has_event():
78
82
  return True
79
83
  stopped_mission_response: ControlMissionResponse = (
80
84
  state_machine._make_control_mission_response()
81
85
  )
82
- state_machine.events.api_requests.stop_mission.output.put(stopped_mission_response)
86
+ state_machine.events.api_requests.stop_mission.response.put(
87
+ stopped_mission_response
88
+ )
83
89
  return True