isar 1.33.8__tar.gz → 1.33.9__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 (223) hide show
  1. {isar-1.33.8 → isar-1.33.9}/.github/workflows/compile_requirements.yml +1 -1
  2. {isar-1.33.8 → isar-1.33.9}/.github/workflows/project_automations.yml +11 -5
  3. {isar-1.33.8 → isar-1.33.9}/.github/workflows/pythonpackage.yml +3 -0
  4. {isar-1.33.8 → isar-1.33.9}/.github/workflows/pythonpublish.yml +3 -0
  5. {isar-1.33.8 → isar-1.33.9}/PKG-INFO +2 -1
  6. {isar-1.33.8 → isar-1.33.9}/README.md +1 -0
  7. {isar-1.33.8 → isar-1.33.9}/src/isar/config/settings.py +1 -1
  8. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/states/await_next_mission.py +7 -6
  9. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/states/going_to_lockdown.py +13 -12
  10. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/states/home.py +7 -6
  11. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/states/intervention_needed.py +7 -6
  12. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/states/lockdown.py +8 -7
  13. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/states/monitor.py +26 -22
  14. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/states/paused.py +19 -17
  15. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/states/pausing.py +17 -16
  16. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/states/pausing_return_home.py +17 -16
  17. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/states/recharging.py +17 -11
  18. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/states/return_home_paused.py +27 -23
  19. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/states/returning_home.py +27 -23
  20. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/states/stopping.py +11 -9
  21. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/states/stopping_go_to_lockdown.py +18 -18
  22. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/states/stopping_return_home.py +28 -26
  23. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/states/unknown_status.py +7 -4
  24. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/utils/common_event_handlers.py +58 -49
  25. {isar-1.33.8 → isar-1.33.9}/src/isar.egg-info/PKG-INFO +2 -1
  26. {isar-1.33.8 → isar-1.33.9}/.dockerignore +0 -0
  27. {isar-1.33.8 → isar-1.33.9}/.env.test +0 -0
  28. {isar-1.33.8 → isar-1.33.9}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  29. {isar-1.33.8 → isar-1.33.9}/.github/ISSUE_TEMPLATE/feature.md +0 -0
  30. {isar-1.33.8 → isar-1.33.9}/.github/ISSUE_TEMPLATE/improvement.md +0 -0
  31. {isar-1.33.8 → isar-1.33.9}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  32. {isar-1.33.8 → isar-1.33.9}/.github/release.yml +0 -0
  33. {isar-1.33.8 → isar-1.33.9}/.github/workflows/stale.yml +0 -0
  34. {isar-1.33.8 → isar-1.33.9}/.gitignore +0 -0
  35. {isar-1.33.8 → isar-1.33.9}/.pre-commit-config.yaml +0 -0
  36. {isar-1.33.8 → isar-1.33.9}/LICENSE +0 -0
  37. {isar-1.33.8 → isar-1.33.9}/SECURITY.md +0 -0
  38. {isar-1.33.8 → isar-1.33.9}/docs/Makefile +0 -0
  39. {isar-1.33.8 → isar-1.33.9}/docs/full_state_machine_diagram.png +0 -0
  40. {isar-1.33.8 → isar-1.33.9}/docs/make.bat +0 -0
  41. {isar-1.33.8 → isar-1.33.9}/docs/mission_state_machine_diagram.png +0 -0
  42. {isar-1.33.8 → isar-1.33.9}/docs/robot_status_state_machine_diagram.png +0 -0
  43. {isar-1.33.8 → isar-1.33.9}/docs/rst_processing.py +0 -0
  44. {isar-1.33.8 → isar-1.33.9}/docs/source/conf.py +0 -0
  45. {isar-1.33.8 → isar-1.33.9}/docs/source/index.rst +0 -0
  46. {isar-1.33.8 → isar-1.33.9}/docs/source/readme_link.md +0 -0
  47. {isar-1.33.8 → isar-1.33.9}/docs/update_state_diagram.py +0 -0
  48. {isar-1.33.8 → isar-1.33.9}/main.py +0 -0
  49. {isar-1.33.8 → isar-1.33.9}/pyproject.toml +0 -0
  50. {isar-1.33.8 → isar-1.33.9}/radixconfig.yml +0 -0
  51. {isar-1.33.8 → isar-1.33.9}/requirements.txt +0 -0
  52. {isar-1.33.8 → isar-1.33.9}/setup.cfg +0 -0
  53. {isar-1.33.8 → isar-1.33.9}/src/isar/__init__.py +0 -0
  54. {isar-1.33.8 → isar-1.33.9}/src/isar/apis/__init__.py +0 -0
  55. {isar-1.33.8 → isar-1.33.9}/src/isar/apis/api.py +0 -0
  56. {isar-1.33.8 → isar-1.33.9}/src/isar/apis/models/__init__.py +0 -0
  57. {isar-1.33.8 → isar-1.33.9}/src/isar/apis/models/models.py +0 -0
  58. {isar-1.33.8 → isar-1.33.9}/src/isar/apis/models/start_mission_definition.py +0 -0
  59. {isar-1.33.8 → isar-1.33.9}/src/isar/apis/robot_control/robot_controller.py +0 -0
  60. {isar-1.33.8 → isar-1.33.9}/src/isar/apis/schedule/__init__.py +0 -0
  61. {isar-1.33.8 → isar-1.33.9}/src/isar/apis/schedule/scheduling_controller.py +0 -0
  62. {isar-1.33.8 → isar-1.33.9}/src/isar/apis/security/__init__.py +0 -0
  63. {isar-1.33.8 → isar-1.33.9}/src/isar/apis/security/authentication.py +0 -0
  64. {isar-1.33.8 → isar-1.33.9}/src/isar/config/__init__.py +0 -0
  65. {isar-1.33.8 → isar-1.33.9}/src/isar/config/certs/ca-cert.pem +0 -0
  66. {isar-1.33.8 → isar-1.33.9}/src/isar/config/configuration_error.py +0 -0
  67. {isar-1.33.8 → isar-1.33.9}/src/isar/config/keyvault/__init__.py +0 -0
  68. {isar-1.33.8 → isar-1.33.9}/src/isar/config/keyvault/keyvault_error.py +0 -0
  69. {isar-1.33.8 → isar-1.33.9}/src/isar/config/keyvault/keyvault_service.py +0 -0
  70. {isar-1.33.8 → isar-1.33.9}/src/isar/config/log.py +0 -0
  71. {isar-1.33.8 → isar-1.33.9}/src/isar/config/logging.conf +0 -0
  72. {isar-1.33.8 → isar-1.33.9}/src/isar/config/maps/JSP1_intermediate_deck.json +0 -0
  73. {isar-1.33.8 → isar-1.33.9}/src/isar/config/maps/JSP1_weather_deck.json +0 -0
  74. {isar-1.33.8 → isar-1.33.9}/src/isar/config/maps/default_map.json +0 -0
  75. {isar-1.33.8 → isar-1.33.9}/src/isar/config/maps/klab_b.json +0 -0
  76. {isar-1.33.8 → isar-1.33.9}/src/isar/config/maps/klab_compressor.json +0 -0
  77. {isar-1.33.8 → isar-1.33.9}/src/isar/config/maps/klab_turtlebot.json +0 -0
  78. {isar-1.33.8 → isar-1.33.9}/src/isar/config/maps/turtleworld.json +0 -0
  79. {isar-1.33.8 → isar-1.33.9}/src/isar/config/open_telemetry.py +0 -0
  80. {isar-1.33.8 → isar-1.33.9}/src/isar/config/predefined_mission_definition/__init__.py +0 -0
  81. {isar-1.33.8 → isar-1.33.9}/src/isar/config/predefined_mission_definition/default_exr.json +0 -0
  82. {isar-1.33.8 → isar-1.33.9}/src/isar/config/predefined_mission_definition/default_mission.json +0 -0
  83. {isar-1.33.8 → isar-1.33.9}/src/isar/config/predefined_mission_definition/default_turtlebot.json +0 -0
  84. {isar-1.33.8 → isar-1.33.9}/src/isar/config/predefined_missions/__init__.py +0 -0
  85. {isar-1.33.8 → isar-1.33.9}/src/isar/config/predefined_missions/default.json +0 -0
  86. {isar-1.33.8 → isar-1.33.9}/src/isar/config/predefined_missions/default_turtlebot.json +0 -0
  87. {isar-1.33.8 → isar-1.33.9}/src/isar/eventhandlers/eventhandler.py +0 -0
  88. {isar-1.33.8 → isar-1.33.9}/src/isar/mission_planner/__init__.py +0 -0
  89. {isar-1.33.8 → isar-1.33.9}/src/isar/mission_planner/local_planner.py +0 -0
  90. {isar-1.33.8 → isar-1.33.9}/src/isar/mission_planner/mission_planner_interface.py +0 -0
  91. {isar-1.33.8 → isar-1.33.9}/src/isar/mission_planner/sequential_task_selector.py +0 -0
  92. {isar-1.33.8 → isar-1.33.9}/src/isar/mission_planner/task_selector_interface.py +0 -0
  93. {isar-1.33.8 → isar-1.33.9}/src/isar/models/__init__.py +0 -0
  94. {isar-1.33.8 → isar-1.33.9}/src/isar/models/events.py +0 -0
  95. {isar-1.33.8 → isar-1.33.9}/src/isar/models/status.py +0 -0
  96. {isar-1.33.8 → isar-1.33.9}/src/isar/modules.py +0 -0
  97. {isar-1.33.8 → isar-1.33.9}/src/isar/robot/robot.py +0 -0
  98. {isar-1.33.8 → isar-1.33.9}/src/isar/robot/robot_battery.py +0 -0
  99. {isar-1.33.8 → isar-1.33.9}/src/isar/robot/robot_pause_mission.py +0 -0
  100. {isar-1.33.8 → isar-1.33.9}/src/isar/robot/robot_start_mission.py +0 -0
  101. {isar-1.33.8 → isar-1.33.9}/src/isar/robot/robot_status.py +0 -0
  102. {isar-1.33.8 → isar-1.33.9}/src/isar/robot/robot_stop_mission.py +0 -0
  103. {isar-1.33.8 → isar-1.33.9}/src/isar/robot/robot_task_status.py +0 -0
  104. {isar-1.33.8 → isar-1.33.9}/src/isar/script.py +0 -0
  105. {isar-1.33.8 → isar-1.33.9}/src/isar/services/__init__.py +0 -0
  106. {isar-1.33.8 → isar-1.33.9}/src/isar/services/auth/__init__.py +0 -0
  107. {isar-1.33.8 → isar-1.33.9}/src/isar/services/auth/azure_credentials.py +0 -0
  108. {isar-1.33.8 → isar-1.33.9}/src/isar/services/service_connections/__init__.py +0 -0
  109. {isar-1.33.8 → isar-1.33.9}/src/isar/services/service_connections/mqtt/__init__.py +0 -0
  110. {isar-1.33.8 → isar-1.33.9}/src/isar/services/service_connections/mqtt/mqtt_client.py +0 -0
  111. {isar-1.33.8 → isar-1.33.9}/src/isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +0 -0
  112. {isar-1.33.8 → isar-1.33.9}/src/isar/services/service_connections/mqtt/robot_info_publisher.py +0 -0
  113. {isar-1.33.8 → isar-1.33.9}/src/isar/services/service_connections/request_handler.py +0 -0
  114. {isar-1.33.8 → isar-1.33.9}/src/isar/services/utilities/__init__.py +0 -0
  115. {isar-1.33.8 → isar-1.33.9}/src/isar/services/utilities/robot_utilities.py +0 -0
  116. {isar-1.33.8 → isar-1.33.9}/src/isar/services/utilities/scheduling_utilities.py +0 -0
  117. {isar-1.33.8 → isar-1.33.9}/src/isar/services/utilities/threaded_request.py +0 -0
  118. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/__init__.py +0 -0
  119. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/state_machine.py +0 -0
  120. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/states/__init__.py +0 -0
  121. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/states/blocked_protective_stop.py +0 -0
  122. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/states/offline.py +0 -0
  123. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/states_enum.py +0 -0
  124. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/transitions/functions/fail_mission.py +0 -0
  125. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/transitions/functions/finish_mission.py +0 -0
  126. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/transitions/functions/pause.py +0 -0
  127. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/transitions/functions/resume.py +0 -0
  128. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/transitions/functions/return_home.py +0 -0
  129. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/transitions/functions/robot_status.py +0 -0
  130. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/transitions/functions/start_mission.py +0 -0
  131. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/transitions/functions/stop.py +0 -0
  132. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/transitions/functions/utils.py +0 -0
  133. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/transitions/mission.py +0 -0
  134. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/transitions/return_home.py +0 -0
  135. {isar-1.33.8 → isar-1.33.9}/src/isar/state_machine/transitions/robot_status.py +0 -0
  136. {isar-1.33.8 → isar-1.33.9}/src/isar/storage/__init__.py +0 -0
  137. {isar-1.33.8 → isar-1.33.9}/src/isar/storage/blob_storage.py +0 -0
  138. {isar-1.33.8 → isar-1.33.9}/src/isar/storage/local_storage.py +0 -0
  139. {isar-1.33.8 → isar-1.33.9}/src/isar/storage/storage_interface.py +0 -0
  140. {isar-1.33.8 → isar-1.33.9}/src/isar/storage/uploader.py +0 -0
  141. {isar-1.33.8 → isar-1.33.9}/src/isar/storage/utilities.py +0 -0
  142. {isar-1.33.8 → isar-1.33.9}/src/isar.egg-info/SOURCES.txt +0 -0
  143. {isar-1.33.8 → isar-1.33.9}/src/isar.egg-info/dependency_links.txt +0 -0
  144. {isar-1.33.8 → isar-1.33.9}/src/isar.egg-info/entry_points.txt +0 -0
  145. {isar-1.33.8 → isar-1.33.9}/src/isar.egg-info/requires.txt +0 -0
  146. {isar-1.33.8 → isar-1.33.9}/src/isar.egg-info/top_level.txt +0 -0
  147. {isar-1.33.8 → isar-1.33.9}/src/robot_interface/__init__.py +0 -0
  148. {isar-1.33.8 → isar-1.33.9}/src/robot_interface/models/__init__.py +0 -0
  149. {isar-1.33.8 → isar-1.33.9}/src/robot_interface/models/exceptions/__init__.py +0 -0
  150. {isar-1.33.8 → isar-1.33.9}/src/robot_interface/models/exceptions/robot_exceptions.py +0 -0
  151. {isar-1.33.8 → isar-1.33.9}/src/robot_interface/models/initialize/__init__.py +0 -0
  152. {isar-1.33.8 → isar-1.33.9}/src/robot_interface/models/inspection/__init__.py +0 -0
  153. {isar-1.33.8 → isar-1.33.9}/src/robot_interface/models/inspection/inspection.py +0 -0
  154. {isar-1.33.8 → isar-1.33.9}/src/robot_interface/models/mission/__init__.py +0 -0
  155. {isar-1.33.8 → isar-1.33.9}/src/robot_interface/models/mission/mission.py +0 -0
  156. {isar-1.33.8 → isar-1.33.9}/src/robot_interface/models/mission/status.py +0 -0
  157. {isar-1.33.8 → isar-1.33.9}/src/robot_interface/models/mission/task.py +0 -0
  158. {isar-1.33.8 → isar-1.33.9}/src/robot_interface/models/robots/__init__.py +0 -0
  159. {isar-1.33.8 → isar-1.33.9}/src/robot_interface/models/robots/battery_state.py +0 -0
  160. {isar-1.33.8 → isar-1.33.9}/src/robot_interface/models/robots/media.py +0 -0
  161. {isar-1.33.8 → isar-1.33.9}/src/robot_interface/models/robots/robot_model.py +0 -0
  162. {isar-1.33.8 → isar-1.33.9}/src/robot_interface/robot_interface.py +0 -0
  163. {isar-1.33.8 → isar-1.33.9}/src/robot_interface/telemetry/__init__.py +0 -0
  164. {isar-1.33.8 → isar-1.33.9}/src/robot_interface/telemetry/mqtt_client.py +0 -0
  165. {isar-1.33.8 → isar-1.33.9}/src/robot_interface/telemetry/payloads.py +0 -0
  166. {isar-1.33.8 → isar-1.33.9}/src/robot_interface/test_robot_interface.py +0 -0
  167. {isar-1.33.8 → isar-1.33.9}/src/robot_interface/utilities/__init__.py +0 -0
  168. {isar-1.33.8 → isar-1.33.9}/src/robot_interface/utilities/json_service.py +0 -0
  169. {isar-1.33.8 → isar-1.33.9}/src/robot_interface/utilities/uuid_string_factory.py +0 -0
  170. {isar-1.33.8 → isar-1.33.9}/tests/__init__.py +0 -0
  171. {isar-1.33.8 → isar-1.33.9}/tests/conftest.py +0 -0
  172. {isar-1.33.8 → isar-1.33.9}/tests/integration/__init__.py +0 -0
  173. {isar-1.33.8 → isar-1.33.9}/tests/integration/turtlebot/__init__.py +0 -0
  174. {isar-1.33.8 → isar-1.33.9}/tests/integration/turtlebot/config/__init__.py +0 -0
  175. {isar-1.33.8 → isar-1.33.9}/tests/integration/turtlebot/config/maps/__init__.py +0 -0
  176. {isar-1.33.8 → isar-1.33.9}/tests/integration/turtlebot/config/maps/turtleworld.json +0 -0
  177. {isar-1.33.8 → isar-1.33.9}/tests/integration/turtlebot/config/missions/__init__.py +0 -0
  178. {isar-1.33.8 → isar-1.33.9}/tests/integration/turtlebot/config/missions/default.json +0 -0
  179. {isar-1.33.8 → isar-1.33.9}/tests/integration/turtlebot/test_successful_mission.py +0 -0
  180. {isar-1.33.8 → isar-1.33.9}/tests/isar/__init__.py +0 -0
  181. {isar-1.33.8 → isar-1.33.9}/tests/isar/apis/__init__.py +0 -0
  182. {isar-1.33.8 → isar-1.33.9}/tests/isar/apis/models/__init__.py +0 -0
  183. {isar-1.33.8 → isar-1.33.9}/tests/isar/apis/models/example_mission_definition.json +0 -0
  184. {isar-1.33.8 → isar-1.33.9}/tests/isar/apis/models/test_start_mission_definition.py +0 -0
  185. {isar-1.33.8 → isar-1.33.9}/tests/isar/apis/scheduler/__init__.py +0 -0
  186. {isar-1.33.8 → isar-1.33.9}/tests/isar/apis/scheduler/test_scheduler_router.py +0 -0
  187. {isar-1.33.8 → isar-1.33.9}/tests/isar/apis/security/__init__.py +0 -0
  188. {isar-1.33.8 → isar-1.33.9}/tests/isar/apis/security/test_authentication.py +0 -0
  189. {isar-1.33.8 → isar-1.33.9}/tests/isar/mission/__init__.py +0 -0
  190. {isar-1.33.8 → isar-1.33.9}/tests/isar/mission/test_mission.py +0 -0
  191. {isar-1.33.8 → isar-1.33.9}/tests/isar/models/__init__.py +0 -0
  192. {isar-1.33.8 → isar-1.33.9}/tests/isar/models/communication/__init__.py +0 -0
  193. {isar-1.33.8 → isar-1.33.9}/tests/isar/models/communication/test_events.py +0 -0
  194. {isar-1.33.8 → isar-1.33.9}/tests/isar/services/__init__.py +0 -0
  195. {isar-1.33.8 → isar-1.33.9}/tests/isar/services/readers/__init__.py +0 -0
  196. {isar-1.33.8 → isar-1.33.9}/tests/isar/services/readers/test_mission_reader.py +0 -0
  197. {isar-1.33.8 → isar-1.33.9}/tests/isar/services/service_connections/__init__.py +0 -0
  198. {isar-1.33.8 → isar-1.33.9}/tests/isar/services/service_connections/echo/__init__.py +0 -0
  199. {isar-1.33.8 → isar-1.33.9}/tests/isar/services/service_connections/test_base_request_handler.py +0 -0
  200. {isar-1.33.8 → isar-1.33.9}/tests/isar/services/utilities/__init__.py +0 -0
  201. {isar-1.33.8 → isar-1.33.9}/tests/isar/services/utilities/test_queue_utilities.py +0 -0
  202. {isar-1.33.8 → isar-1.33.9}/tests/isar/services/utilities/test_scheduling_utilities.py +0 -0
  203. {isar-1.33.8 → isar-1.33.9}/tests/isar/state_machine/__init__.py +0 -0
  204. {isar-1.33.8 → isar-1.33.9}/tests/isar/state_machine/states/__init__.py +0 -0
  205. {isar-1.33.8 → isar-1.33.9}/tests/isar/state_machine/states/test_monitor.py +0 -0
  206. {isar-1.33.8 → isar-1.33.9}/tests/isar/state_machine/test_state_machine.py +0 -0
  207. {isar-1.33.8 → isar-1.33.9}/tests/isar/storage/test_blob_storage.py +0 -0
  208. {isar-1.33.8 → isar-1.33.9}/tests/isar/storage/test_uploader.py +0 -0
  209. {isar-1.33.8 → isar-1.33.9}/tests/test_data/test_map_config/test_map_config.json +0 -0
  210. {isar-1.33.8 → isar-1.33.9}/tests/test_data/test_mission_not_working.json +0 -0
  211. {isar-1.33.8 → isar-1.33.9}/tests/test_data/test_mission_working.json +0 -0
  212. {isar-1.33.8 → isar-1.33.9}/tests/test_data/test_mission_working_no_tasks.json +0 -0
  213. {isar-1.33.8 → isar-1.33.9}/tests/test_data/test_thermal_image_mission.json +0 -0
  214. {isar-1.33.8 → isar-1.33.9}/tests/test_double/__init__.py +0 -0
  215. {isar-1.33.8 → isar-1.33.9}/tests/test_double/blob_storage.py +0 -0
  216. {isar-1.33.8 → isar-1.33.9}/tests/test_double/mission_definition.py +0 -0
  217. {isar-1.33.8 → isar-1.33.9}/tests/test_double/mqtt_client.py +0 -0
  218. {isar-1.33.8 → isar-1.33.9}/tests/test_double/pose.py +0 -0
  219. {isar-1.33.8 → isar-1.33.9}/tests/test_double/request.py +0 -0
  220. {isar-1.33.8 → isar-1.33.9}/tests/test_double/robot_interface.py +0 -0
  221. {isar-1.33.8 → isar-1.33.9}/tests/test_double/status.py +0 -0
  222. {isar-1.33.8 → isar-1.33.9}/tests/test_double/task.py +0 -0
  223. {isar-1.33.8 → isar-1.33.9}/tests/test_double/token.py +0 -0
@@ -38,7 +38,7 @@ jobs:
38
38
  pip-compile --output-file=requirements.txt pyproject.toml --upgrade
39
39
 
40
40
  - name: Create Pull Request
41
- uses: peter-evans/create-pull-request@v6
41
+ uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e #v7
42
42
  with:
43
43
  commit-message: "GHA: Update dependencies"
44
44
  title: Update dependencies
@@ -1,4 +1,10 @@
1
1
  name: Project automations
2
+
3
+ permissions:
4
+ contents: read
5
+ issues: write
6
+ pull-requests: write
7
+
2
8
  on:
3
9
  issues:
4
10
  types:
@@ -19,7 +25,7 @@ jobs:
19
25
  if: github.event_name == 'issues' && github.event.action == 'opened' || github.event.action == 'reopened'
20
26
  steps:
21
27
  - name: 'Move issue to "Todo"'
22
- uses: leonsteinhaeuser/project-beta-automations@v2.1.0
28
+ uses: leonsteinhaeuser/project-beta-automations@939000fb1900c9fc4f7b5058a09d9f833ebc6859 #Version 2.2.1
23
29
  with:
24
30
  gh_token: ${{ secrets.MY_GITHUB_TOKEN }}
25
31
  organization: equinor
@@ -32,7 +38,7 @@ jobs:
32
38
  if: github.event_name == 'issues' && github.event.action == 'closed'
33
39
  steps:
34
40
  - name: 'Moved issue to "Done"'
35
- uses: leonsteinhaeuser/project-beta-automations@v2.1.0
41
+ uses: leonsteinhaeuser/project-beta-automations@939000fb1900c9fc4f7b5058a09d9f833ebc6859 #Version 2.2.1
36
42
  with:
37
43
  gh_token: ${{ secrets.MY_GITHUB_TOKEN }}
38
44
  organization: equinor
@@ -45,7 +51,7 @@ jobs:
45
51
  if: github.event_name == 'pull_request' && github.event.action == 'opened' || github.event.action == 'reopened' || github.event.action == 'review_requested'
46
52
  steps:
47
53
  - name: 'Move PR to "In Progress"'
48
- uses: leonsteinhaeuser/project-beta-automations@v2.1.0
54
+ uses: leonsteinhaeuser/project-beta-automations@939000fb1900c9fc4f7b5058a09d9f833ebc6859 #Version 2.2.1
49
55
  with:
50
56
  gh_token: ${{ secrets.MY_GITHUB_TOKEN }}
51
57
  organization: equinor
@@ -58,7 +64,7 @@ jobs:
58
64
  if: github.event_name == 'pull_request' && github.event.action == 'ready_for_review'
59
65
  steps:
60
66
  - name: 'Move PR to "Review"'
61
- uses: leonsteinhaeuser/project-beta-automations@v2.1.0
67
+ uses: leonsteinhaeuser/project-beta-automations@939000fb1900c9fc4f7b5058a09d9f833ebc6859 #Version 2.2.1
62
68
  with:
63
69
  gh_token: ${{ secrets.MY_GITHUB_TOKEN }}
64
70
  organization: equinor
@@ -71,7 +77,7 @@ jobs:
71
77
  if: github.event_name == 'pull_request' && github.event.action == 'closed'
72
78
  steps:
73
79
  - name: 'Move PR to "Done"'
74
- uses: leonsteinhaeuser/project-beta-automations@v2.1.0
80
+ uses: leonsteinhaeuser/project-beta-automations@939000fb1900c9fc4f7b5058a09d9f833ebc6859 #Version 2.2.1
75
81
  with:
76
82
  gh_token: ${{ secrets.MY_GITHUB_TOKEN }}
77
83
  organization: equinor
@@ -1,5 +1,8 @@
1
1
  name: Python package
2
2
 
3
+ permissions:
4
+ contents: read
5
+
3
6
  on:
4
7
  push:
5
8
  branches:
@@ -1,5 +1,8 @@
1
1
  name: Upload Python Package
2
2
 
3
+ permissions:
4
+ contents: read
5
+
3
6
  on:
4
7
  release:
5
8
  types: [created]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: isar
3
- Version: 1.33.8
3
+ Version: 1.33.9
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
@@ -480,6 +480,7 @@ Enabling API authentication also requires the same environment variables. The re
480
480
  AZURE_CLIENT_ID
481
481
  AZURE_TENANT_ID
482
482
  AZURE_CLIENT_SECRET
483
+ ISAR_BLOB_STORAGE_ACCOUNT
483
484
  ```
484
485
 
485
486
  ## MQTT communication
@@ -336,6 +336,7 @@ Enabling API authentication also requires the same environment variables. The re
336
336
  AZURE_CLIENT_ID
337
337
  AZURE_TENANT_ID
338
338
  AZURE_CLIENT_SECRET
339
+ ISAR_BLOB_STORAGE_ACCOUNT
339
340
  ```
340
341
 
341
342
  ## MQTT communication
@@ -168,7 +168,7 @@ class Settings(BaseSettings):
168
168
  UPLOAD_INSPECTIONS_ASYNC: bool = Field(default=False)
169
169
 
170
170
  # URL to storage account for Azure Blob Storage
171
- BLOB_STORAGE_ACCOUNT: str = Field(default="eqrobotdevstorage")
171
+ BLOB_STORAGE_ACCOUNT: str = Field(default="")
172
172
 
173
173
  # Name of blob container in Azure Blob Storage [slimm test]
174
174
  BLOB_CONTAINER: str = Field(default="test")
@@ -27,12 +27,13 @@ class AwaitNextMission(EventHandlerBase):
27
27
  event: Event[bool],
28
28
  ) -> Optional[Callable]:
29
29
  should_lockdown: bool = event.consume_event()
30
- if should_lockdown:
31
- events.api_requests.send_to_lockdown.response.trigger_event(
32
- LockdownResponse(lockdown_started=True)
33
- )
34
- return state_machine.request_lockdown_mission # type: ignore
35
- return None
30
+ if not should_lockdown:
31
+ return None
32
+
33
+ events.api_requests.send_to_lockdown.response.trigger_event(
34
+ LockdownResponse(lockdown_started=True)
35
+ )
36
+ return state_machine.request_lockdown_mission # type: ignore
36
37
 
37
38
  event_handlers: List[EventHandlerMapping] = [
38
39
  EventHandlerMapping(
@@ -32,18 +32,19 @@ class GoingToLockdown(EventHandlerBase):
32
32
  event: Event[Optional[ErrorMessage]],
33
33
  ) -> Optional[Callable]:
34
34
  mission_failed: Optional[ErrorMessage] = event.consume_event()
35
- if mission_failed is not None:
36
- state_machine.logger.warning(
37
- f"Failed to initiate mission "
38
- f"{str(state_machine.current_mission.id)[:8]} because: "
39
- f"{mission_failed.error_description}"
40
- )
41
- state_machine.current_mission.error_message = ErrorMessage(
42
- error_reason=mission_failed.error_reason,
43
- error_description=mission_failed.error_description,
44
- )
45
- return state_machine.lockdown_mission_failed # type: ignore
46
- return None
35
+ if mission_failed is None:
36
+ return None
37
+
38
+ state_machine.logger.warning(
39
+ f"Failed to initiate mission "
40
+ f"{str(state_machine.current_mission.id)[:8]} because: "
41
+ f"{mission_failed.error_description}"
42
+ )
43
+ state_machine.current_mission.error_message = ErrorMessage(
44
+ error_reason=mission_failed.error_reason,
45
+ error_description=mission_failed.error_description,
46
+ )
47
+ return state_machine.lockdown_mission_failed # type: ignore
47
48
 
48
49
  event_handlers: List[EventHandlerMapping] = [
49
50
  EventHandlerMapping(
@@ -22,12 +22,13 @@ class Home(EventHandlerBase):
22
22
 
23
23
  def _send_to_lockdown_event_handler(event: Event[bool]):
24
24
  should_send_robot_home: bool = event.consume_event()
25
- if should_send_robot_home:
26
- events.api_requests.send_to_lockdown.response.trigger_event(
27
- LockdownResponse(lockdown_started=True)
28
- )
29
- return state_machine.reached_lockdown # type: ignore
30
- return None
25
+ if not should_send_robot_home:
26
+ return None
27
+
28
+ events.api_requests.send_to_lockdown.response.trigger_event(
29
+ LockdownResponse(lockdown_started=True)
30
+ )
31
+ return state_machine.reached_lockdown # type: ignore
31
32
 
32
33
  def _robot_status_event_handler(
33
34
  state_machine: "StateMachine",
@@ -17,12 +17,13 @@ class InterventionNeeded(EventHandlerBase):
17
17
  def release_intervention_needed_handler(
18
18
  event: Event[bool],
19
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
20
+ if not event.consume_event():
21
+ return None
22
+
23
+ state_machine.events.api_requests.release_intervention_needed.response.trigger_event(
24
+ True
25
+ )
26
+ return state_machine.release_intervention_needed # type: ignore
26
27
 
27
28
  event_handlers: List[EventHandlerMapping] = [
28
29
  EventHandlerMapping(
@@ -14,13 +14,14 @@ class Lockdown(EventHandlerBase):
14
14
 
15
15
  def _release_from_lockdown_handler(event: Event[bool]):
16
16
  should_release_from_lockdown: bool = event.consume_event()
17
- if should_release_from_lockdown:
18
- events.api_requests.release_from_lockdown.response.trigger_event(True)
19
- if state_machine.battery_level_is_above_mission_start_threshold():
20
- return state_machine.release_from_lockdown # type: ignore
21
- else:
22
- return state_machine.starting_recharging # type: ignore
23
- return None
17
+ if not should_release_from_lockdown:
18
+ return None
19
+
20
+ events.api_requests.release_from_lockdown.response.trigger_event(True)
21
+ if state_machine.battery_level_is_above_mission_start_threshold():
22
+ return state_machine.release_from_lockdown # type: ignore
23
+ else:
24
+ return state_machine.starting_recharging # type: ignore
24
25
 
25
26
  event_handlers: List[EventHandlerMapping] = [
26
27
  EventHandlerMapping(
@@ -27,9 +27,10 @@ class Monitor(EventHandlerBase):
27
27
  shared_state = state_machine.shared_state
28
28
 
29
29
  def _pause_mission_event_handler(event: Event[bool]) -> Optional[Callable]:
30
- if event.consume_event():
31
- return state_machine.pause # type: ignore
32
- return None
30
+ if not event.consume_event():
31
+ return None
32
+
33
+ return state_machine.pause # type: ignore
33
34
 
34
35
  def _handle_task_completed(task_status: TaskStatus):
35
36
  if state_machine.should_upload_inspections():
@@ -44,35 +45,38 @@ class Monitor(EventHandlerBase):
44
45
  )
45
46
 
46
47
  state_machine.iterate_current_task()
47
- if state_machine.current_task is None:
48
- return state_machine.mission_finished # type: ignore
49
- return None
48
+ if state_machine.current_task is not None:
49
+ return None
50
+
51
+ return state_machine.mission_finished # type: ignore
50
52
 
51
53
  def _robot_battery_level_updated_handler(
52
54
  event: Event[float],
53
55
  ) -> Optional[Callable]:
54
56
  battery_level: float = event.check()
55
- if battery_level < settings.ROBOT_MISSION_BATTERY_START_THRESHOLD:
56
- state_machine.publish_mission_aborted(
57
- "Robot battery too low to continue mission", True
58
- )
59
- state_machine._finalize()
60
- state_machine.logger.warning(
61
- "Cancelling current mission due to low battery"
62
- )
63
- return state_machine.stop # type: ignore
64
- return None
57
+ if battery_level >= settings.ROBOT_MISSION_BATTERY_START_THRESHOLD:
58
+ return None
59
+
60
+ state_machine.publish_mission_aborted(
61
+ "Robot battery too low to continue mission", True
62
+ )
63
+ state_machine._finalize()
64
+ state_machine.logger.warning(
65
+ "Cancelling current mission due to low battery"
66
+ )
67
+ return state_machine.stop # type: ignore
65
68
 
66
69
  def _send_to_lockdown_event_handler(
67
70
  event: Event[bool],
68
71
  ) -> Optional[Callable]:
69
72
  should_lockdown: bool = event.consume_event()
70
- if should_lockdown:
71
- state_machine.logger.warning(
72
- "Cancelling current mission due to robot going to lockdown"
73
- )
74
- return state_machine.stop_go_to_lockdown # type: ignore
75
- return None
73
+ if not should_lockdown:
74
+ return None
75
+
76
+ state_machine.logger.warning(
77
+ "Cancelling current mission due to robot going to lockdown"
78
+ )
79
+ return state_machine.stop_go_to_lockdown # type: ignore
76
80
 
77
81
  event_handlers: List[EventHandlerMapping] = [
78
82
  EventHandlerMapping(
@@ -19,28 +19,30 @@ class Paused(EventHandlerBase):
19
19
  event: Event[float],
20
20
  ) -> Optional[Callable]:
21
21
  battery_level: float = event.check()
22
- if battery_level < settings.ROBOT_MISSION_BATTERY_START_THRESHOLD:
23
- state_machine.publish_mission_aborted(
24
- "Robot battery too low to continue mission", True
25
- )
26
- state_machine._finalize()
27
- state_machine.logger.warning(
28
- "Cancelling current mission due to low battery"
29
- )
30
- return state_machine.stop # type: ignore
31
- return None
22
+ if battery_level >= settings.ROBOT_MISSION_BATTERY_START_THRESHOLD:
23
+ return None
24
+
25
+ state_machine.publish_mission_aborted(
26
+ "Robot battery too low to continue mission", True
27
+ )
28
+ state_machine._finalize()
29
+ state_machine.logger.warning(
30
+ "Cancelling current mission due to low battery"
31
+ )
32
+ return state_machine.stop # type: ignore
32
33
 
33
34
  def _send_to_lockdown_event_handler(
34
35
  event: Event[bool],
35
36
  ) -> Optional[Callable]:
36
37
  should_lockdown: bool = event.consume_event()
37
- if should_lockdown:
38
- state_machine._finalize()
39
- state_machine.logger.warning(
40
- "Cancelling current mission due to robot going to lockdown"
41
- )
42
- return state_machine.stop_go_to_lockdown # type: ignore
43
- return None
38
+ if not should_lockdown:
39
+ return None
40
+
41
+ state_machine._finalize()
42
+ state_machine.logger.warning(
43
+ "Cancelling current mission due to robot going to lockdown"
44
+ )
45
+ return state_machine.stop_go_to_lockdown # type: ignore
44
46
 
45
47
  event_handlers: List[EventHandlerMapping] = [
46
48
  EventHandlerMapping(
@@ -31,29 +31,30 @@ class Pausing(EventHandlerBase):
31
31
  state_machine.publish_mission_status()
32
32
  state_machine.send_task_status()
33
33
 
34
- if error_message is not None:
35
- return state_machine.mission_pausing_failed # type: ignore
36
- return None
34
+ if error_message is None:
35
+ return None
36
+
37
+ return state_machine.mission_pausing_failed # type: ignore
37
38
 
38
39
  def _successful_pause_event_handler(event: Event[bool]) -> Optional[Callable]:
39
- if event.consume_event():
40
+ if not event.consume_event():
41
+ return None
40
42
 
41
- state_machine.current_mission.status = MissionStatus.Paused
42
- state_machine.current_task.status = TaskStatus.Paused
43
+ state_machine.current_mission.status = MissionStatus.Paused
44
+ state_machine.current_task.status = TaskStatus.Paused
43
45
 
44
- paused_mission_response: ControlMissionResponse = (
45
- state_machine._make_control_mission_response()
46
- )
46
+ paused_mission_response: ControlMissionResponse = (
47
+ state_machine._make_control_mission_response()
48
+ )
47
49
 
48
- state_machine.events.api_requests.pause_mission.response.trigger_event(
49
- paused_mission_response
50
- )
50
+ state_machine.events.api_requests.pause_mission.response.trigger_event(
51
+ paused_mission_response
52
+ )
51
53
 
52
- state_machine.publish_mission_status()
53
- state_machine.send_task_status()
54
+ state_machine.publish_mission_status()
55
+ state_machine.send_task_status()
54
56
 
55
- return state_machine.mission_paused # type:ignore
56
- return None
57
+ return state_machine.mission_paused # type:ignore
57
58
 
58
59
  event_handlers: List[EventHandlerMapping] = [
59
60
  EventHandlerMapping(
@@ -31,29 +31,30 @@ class PausingReturnHome(EventHandlerBase):
31
31
  state_machine.publish_mission_status()
32
32
  state_machine.send_task_status()
33
33
 
34
- if error_message is not None:
35
- return state_machine.return_home_mission_pausing_failed # type: ignore
36
- return None
34
+ if error_message is None:
35
+ return None
36
+
37
+ return state_machine.return_home_mission_pausing_failed # type: ignore
37
38
 
38
39
  def _successful_pause_event_handler(event: Event[bool]) -> Optional[Callable]:
39
- if event.consume_event():
40
+ if not event.consume_event():
41
+ return None
40
42
 
41
- state_machine.current_mission.status = MissionStatus.Paused
42
- state_machine.current_task.status = TaskStatus.Paused
43
+ state_machine.current_mission.status = MissionStatus.Paused
44
+ state_machine.current_task.status = TaskStatus.Paused
43
45
 
44
- paused_mission_response: ControlMissionResponse = (
45
- state_machine._make_control_mission_response()
46
- )
46
+ paused_mission_response: ControlMissionResponse = (
47
+ state_machine._make_control_mission_response()
48
+ )
47
49
 
48
- state_machine.events.api_requests.pause_mission.response.trigger_event(
49
- paused_mission_response
50
- )
50
+ state_machine.events.api_requests.pause_mission.response.trigger_event(
51
+ paused_mission_response
52
+ )
51
53
 
52
- state_machine.publish_mission_status()
53
- state_machine.send_task_status()
54
+ state_machine.publish_mission_status()
55
+ state_machine.send_task_status()
54
56
 
55
- return state_machine.return_home_mission_paused # type: ignore
56
- return None
57
+ return state_machine.return_home_mission_paused # type: ignore
57
58
 
58
59
  event_handlers: List[EventHandlerMapping] = [
59
60
  EventHandlerMapping(
@@ -1,4 +1,4 @@
1
- from typing import TYPE_CHECKING, List
1
+ from typing import TYPE_CHECKING, List, Optional
2
2
 
3
3
  from isar.apis.models.models import LockdownResponse
4
4
  from isar.config.settings import settings
@@ -18,23 +18,29 @@ class Recharging(EventHandlerBase):
18
18
 
19
19
  def robot_battery_level_updated_handler(event: Event[float]):
20
20
  battery_level: float = event.check()
21
- if battery_level >= settings.ROBOT_BATTERY_RECHARGE_THRESHOLD:
22
- return state_machine.robot_recharged # type: ignore
23
- return None
21
+ if battery_level < settings.ROBOT_BATTERY_RECHARGE_THRESHOLD:
22
+ return None
23
+
24
+ return state_machine.robot_recharged # type: ignore
24
25
 
25
26
  def robot_offline_handler(event: Event[RobotStatus]):
26
- robot_status: RobotStatus = event.check()
27
+ robot_status: Optional[RobotStatus] = event.check()
28
+
29
+ if robot_status is None:
30
+ return None
31
+
27
32
  if robot_status == RobotStatus.Offline:
28
33
  return state_machine.robot_went_offline # type: ignore
29
34
 
30
35
  def _send_to_lockdown_event_handler(event: Event[bool]):
31
36
  should_lockdown: bool = event.consume_event()
32
- if should_lockdown:
33
- events.api_requests.send_to_lockdown.response.trigger_event(
34
- LockdownResponse(lockdown_started=True)
35
- )
36
- return state_machine.reached_lockdown # type: ignore
37
- return None
37
+ if not should_lockdown:
38
+ return None
39
+
40
+ events.api_requests.send_to_lockdown.response.trigger_event(
41
+ LockdownResponse(lockdown_started=True)
42
+ )
43
+ return state_machine.reached_lockdown # type: ignore
38
44
 
39
45
  event_handlers: List[EventHandlerMapping] = [
40
46
  EventHandlerMapping(
@@ -20,38 +20,42 @@ class ReturnHomePaused(EventHandlerBase):
20
20
  event: Event[float],
21
21
  ) -> Optional[Callable]:
22
22
  battery_level: float = event.check()
23
- if battery_level < settings.ROBOT_MISSION_BATTERY_START_THRESHOLD:
24
- return state_machine.resume # type: ignore
25
- return None
23
+
24
+ if battery_level >= settings.ROBOT_MISSION_BATTERY_START_THRESHOLD:
25
+ return None
26
+
27
+ return state_machine.resume # type: ignore
26
28
 
27
29
  def _start_mission_event_handler(
28
30
  event: Event[Mission],
29
31
  ) -> Optional[Callable]:
30
- if event.has_event():
31
- if not state_machine.battery_level_is_above_mission_start_threshold():
32
- state_machine.events.api_requests.start_mission.request.consume_event()
33
- response = MissionStartResponse(
34
- mission_id=None,
35
- mission_started=False,
36
- mission_not_started_reason="Robot battery too low",
37
- )
38
- state_machine.events.api_requests.start_mission.response.trigger_event(
39
- response
40
- )
41
- return None
42
- return state_machine.stop_return_home # type: ignore
43
- return None
32
+ if not event.has_event():
33
+ return None
34
+
35
+ if not state_machine.battery_level_is_above_mission_start_threshold():
36
+ state_machine.events.api_requests.start_mission.request.consume_event()
37
+ response = MissionStartResponse(
38
+ mission_id=None,
39
+ mission_started=False,
40
+ mission_not_started_reason="Robot battery too low",
41
+ )
42
+ state_machine.events.api_requests.start_mission.response.trigger_event(
43
+ response
44
+ )
45
+ return None
46
+ return state_machine.stop_return_home # type: ignore
44
47
 
45
48
  def _send_to_lockdown_event_handler(
46
49
  event: Event[bool],
47
50
  ) -> Optional[Callable]:
48
51
  should_lockdown: bool = event.consume_event()
49
- if should_lockdown:
50
- events.api_requests.send_to_lockdown.response.trigger_event(
51
- LockdownResponse(lockdown_started=True)
52
- )
53
- return state_machine.resume_lockdown # type: ignore
54
- return None
52
+ if not should_lockdown:
53
+ return None
54
+
55
+ events.api_requests.send_to_lockdown.response.trigger_event(
56
+ LockdownResponse(lockdown_started=True)
57
+ )
58
+ return state_machine.resume_lockdown # type: ignore
55
59
 
56
60
  event_handlers: List[EventHandlerMapping] = [
57
61
  EventHandlerMapping(
@@ -24,9 +24,10 @@ class ReturningHome(EventHandlerBase):
24
24
  events = state_machine.events
25
25
 
26
26
  def _pause_mission_event_handler(event: Event[bool]) -> Optional[Callable]:
27
- if event.consume_event():
28
- return state_machine.pause_return_home # type: ignore
29
- return None
27
+ if not event.consume_event():
28
+ return None
29
+
30
+ return state_machine.pause_return_home # type: ignore
30
31
 
31
32
  def _handle_task_completed(status: TaskStatus):
32
33
  if status != TaskStatus.Successful:
@@ -45,31 +46,34 @@ class ReturningHome(EventHandlerBase):
45
46
  def _start_mission_event_handler(
46
47
  event: Event[Mission],
47
48
  ) -> Optional[Callable]:
48
- if event.has_event():
49
- if not state_machine.battery_level_is_above_mission_start_threshold():
50
- state_machine.events.api_requests.start_mission.request.consume_event()
51
- response = MissionStartResponse(
52
- mission_id=None,
53
- mission_started=False,
54
- mission_not_started_reason="Robot battery too low",
55
- )
56
- state_machine.events.api_requests.start_mission.response.trigger_event(
57
- response
58
- )
59
- return None
60
- return state_machine.stop_return_home # type: ignore
61
- return None
49
+ if not event.has_event():
50
+ return None
51
+
52
+ if not state_machine.battery_level_is_above_mission_start_threshold():
53
+ state_machine.events.api_requests.start_mission.request.consume_event()
54
+ response = MissionStartResponse(
55
+ mission_id=None,
56
+ mission_started=False,
57
+ mission_not_started_reason="Robot battery too low",
58
+ )
59
+ state_machine.events.api_requests.start_mission.response.trigger_event(
60
+ response
61
+ )
62
+ return None
63
+
64
+ return state_machine.stop_return_home # type: ignore
62
65
 
63
66
  def _send_to_lockdown_event_handler(
64
67
  event: Event[bool],
65
68
  ) -> Optional[Callable]:
66
69
  should_lockdown: bool = event.consume_event()
67
- if should_lockdown:
68
- events.api_requests.send_to_lockdown.response.trigger_event(
69
- LockdownResponse(lockdown_started=True)
70
- )
71
- return state_machine.go_to_lockdown # type: ignore
72
- return None
70
+ if not should_lockdown:
71
+ return None
72
+
73
+ events.api_requests.send_to_lockdown.response.trigger_event(
74
+ LockdownResponse(lockdown_started=True)
75
+ )
76
+ return state_machine.go_to_lockdown # type: ignore
73
77
 
74
78
  event_handlers: List[EventHandlerMapping] = [
75
79
  EventHandlerMapping(