isar 1.33.0__tar.gz → 1.33.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 (213) hide show
  1. {isar-1.33.0 → isar-1.33.1}/PKG-INFO +1 -1
  2. {isar-1.33.0 → isar-1.33.1}/src/isar/apis/schedule/scheduling_controller.py +21 -52
  3. {isar-1.33.0 → isar-1.33.1}/src/isar/models/events.py +45 -26
  4. {isar-1.33.0 → isar-1.33.1}/src/isar/services/utilities/scheduling_utilities.py +3 -0
  5. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/state_machine.py +1 -1
  6. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/states/monitor.py +1 -3
  7. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/states/returning_home.py +9 -12
  8. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/states/stopping.py +33 -0
  9. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/transitions/functions/pause.py +1 -1
  10. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/transitions/functions/resume.py +1 -1
  11. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/transitions/functions/start_mission.py +3 -3
  12. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/transitions/functions/stop.py +3 -30
  13. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/transitions/mission.py +0 -2
  14. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/transitions/return_home.py +1 -1
  15. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/utils/common_event_handlers.py +10 -13
  16. {isar-1.33.0 → isar-1.33.1}/src/isar.egg-info/PKG-INFO +1 -1
  17. {isar-1.33.0 → isar-1.33.1}/tests/isar/models/communication/test_events.py +3 -3
  18. {isar-1.33.0 → isar-1.33.1}/tests/isar/services/utilities/test_queue_utilities.py +2 -2
  19. {isar-1.33.0 → isar-1.33.1}/tests/isar/services/utilities/test_scheduling_utilities.py +1 -1
  20. {isar-1.33.0 → isar-1.33.1}/tests/isar/state_machine/test_state_machine.py +1 -1
  21. {isar-1.33.0 → isar-1.33.1}/.dockerignore +0 -0
  22. {isar-1.33.0 → isar-1.33.1}/.env.test +0 -0
  23. {isar-1.33.0 → isar-1.33.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  24. {isar-1.33.0 → isar-1.33.1}/.github/ISSUE_TEMPLATE/feature.md +0 -0
  25. {isar-1.33.0 → isar-1.33.1}/.github/ISSUE_TEMPLATE/improvement.md +0 -0
  26. {isar-1.33.0 → isar-1.33.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  27. {isar-1.33.0 → isar-1.33.1}/.github/release.yml +0 -0
  28. {isar-1.33.0 → isar-1.33.1}/.github/workflows/compile_requirements.yml +0 -0
  29. {isar-1.33.0 → isar-1.33.1}/.github/workflows/project_automations.yml +0 -0
  30. {isar-1.33.0 → isar-1.33.1}/.github/workflows/pythonpackage.yml +0 -0
  31. {isar-1.33.0 → isar-1.33.1}/.github/workflows/pythonpublish.yml +0 -0
  32. {isar-1.33.0 → isar-1.33.1}/.github/workflows/stale.yml +0 -0
  33. {isar-1.33.0 → isar-1.33.1}/.gitignore +0 -0
  34. {isar-1.33.0 → isar-1.33.1}/.pre-commit-config.yaml +0 -0
  35. {isar-1.33.0 → isar-1.33.1}/LICENSE +0 -0
  36. {isar-1.33.0 → isar-1.33.1}/README.md +0 -0
  37. {isar-1.33.0 → isar-1.33.1}/SECURITY.md +0 -0
  38. {isar-1.33.0 → isar-1.33.1}/docs/Makefile +0 -0
  39. {isar-1.33.0 → isar-1.33.1}/docs/full_state_machine_diagram.png +0 -0
  40. {isar-1.33.0 → isar-1.33.1}/docs/make.bat +0 -0
  41. {isar-1.33.0 → isar-1.33.1}/docs/mission_state_machine_diagram.png +0 -0
  42. {isar-1.33.0 → isar-1.33.1}/docs/robot_status_state_machine_diagram.png +0 -0
  43. {isar-1.33.0 → isar-1.33.1}/docs/rst_processing.py +0 -0
  44. {isar-1.33.0 → isar-1.33.1}/docs/source/conf.py +0 -0
  45. {isar-1.33.0 → isar-1.33.1}/docs/source/index.rst +0 -0
  46. {isar-1.33.0 → isar-1.33.1}/docs/source/readme_link.md +0 -0
  47. {isar-1.33.0 → isar-1.33.1}/docs/update_state_diagram.py +0 -0
  48. {isar-1.33.0 → isar-1.33.1}/main.py +0 -0
  49. {isar-1.33.0 → isar-1.33.1}/pyproject.toml +0 -0
  50. {isar-1.33.0 → isar-1.33.1}/radixconfig.yml +0 -0
  51. {isar-1.33.0 → isar-1.33.1}/requirements.txt +0 -0
  52. {isar-1.33.0 → isar-1.33.1}/setup.cfg +0 -0
  53. {isar-1.33.0 → isar-1.33.1}/src/isar/__init__.py +0 -0
  54. {isar-1.33.0 → isar-1.33.1}/src/isar/apis/__init__.py +0 -0
  55. {isar-1.33.0 → isar-1.33.1}/src/isar/apis/api.py +0 -0
  56. {isar-1.33.0 → isar-1.33.1}/src/isar/apis/models/__init__.py +0 -0
  57. {isar-1.33.0 → isar-1.33.1}/src/isar/apis/models/models.py +0 -0
  58. {isar-1.33.0 → isar-1.33.1}/src/isar/apis/models/start_mission_definition.py +0 -0
  59. {isar-1.33.0 → isar-1.33.1}/src/isar/apis/robot_control/robot_controller.py +0 -0
  60. {isar-1.33.0 → isar-1.33.1}/src/isar/apis/schedule/__init__.py +0 -0
  61. {isar-1.33.0 → isar-1.33.1}/src/isar/apis/security/__init__.py +0 -0
  62. {isar-1.33.0 → isar-1.33.1}/src/isar/apis/security/authentication.py +0 -0
  63. {isar-1.33.0 → isar-1.33.1}/src/isar/config/__init__.py +0 -0
  64. {isar-1.33.0 → isar-1.33.1}/src/isar/config/certs/ca-cert.pem +0 -0
  65. {isar-1.33.0 → isar-1.33.1}/src/isar/config/configuration_error.py +0 -0
  66. {isar-1.33.0 → isar-1.33.1}/src/isar/config/keyvault/__init__.py +0 -0
  67. {isar-1.33.0 → isar-1.33.1}/src/isar/config/keyvault/keyvault_error.py +0 -0
  68. {isar-1.33.0 → isar-1.33.1}/src/isar/config/keyvault/keyvault_service.py +0 -0
  69. {isar-1.33.0 → isar-1.33.1}/src/isar/config/log.py +0 -0
  70. {isar-1.33.0 → isar-1.33.1}/src/isar/config/logging.conf +0 -0
  71. {isar-1.33.0 → isar-1.33.1}/src/isar/config/maps/JSP1_intermediate_deck.json +0 -0
  72. {isar-1.33.0 → isar-1.33.1}/src/isar/config/maps/JSP1_weather_deck.json +0 -0
  73. {isar-1.33.0 → isar-1.33.1}/src/isar/config/maps/default_map.json +0 -0
  74. {isar-1.33.0 → isar-1.33.1}/src/isar/config/maps/klab_b.json +0 -0
  75. {isar-1.33.0 → isar-1.33.1}/src/isar/config/maps/klab_compressor.json +0 -0
  76. {isar-1.33.0 → isar-1.33.1}/src/isar/config/maps/klab_turtlebot.json +0 -0
  77. {isar-1.33.0 → isar-1.33.1}/src/isar/config/maps/turtleworld.json +0 -0
  78. {isar-1.33.0 → isar-1.33.1}/src/isar/config/open_telemetry.py +0 -0
  79. {isar-1.33.0 → isar-1.33.1}/src/isar/config/predefined_mission_definition/__init__.py +0 -0
  80. {isar-1.33.0 → isar-1.33.1}/src/isar/config/predefined_mission_definition/default_exr.json +0 -0
  81. {isar-1.33.0 → isar-1.33.1}/src/isar/config/predefined_mission_definition/default_mission.json +0 -0
  82. {isar-1.33.0 → isar-1.33.1}/src/isar/config/predefined_mission_definition/default_turtlebot.json +0 -0
  83. {isar-1.33.0 → isar-1.33.1}/src/isar/config/predefined_missions/__init__.py +0 -0
  84. {isar-1.33.0 → isar-1.33.1}/src/isar/config/predefined_missions/default.json +0 -0
  85. {isar-1.33.0 → isar-1.33.1}/src/isar/config/predefined_missions/default_turtlebot.json +0 -0
  86. {isar-1.33.0 → isar-1.33.1}/src/isar/config/settings.py +0 -0
  87. {isar-1.33.0 → isar-1.33.1}/src/isar/eventhandlers/eventhandler.py +0 -0
  88. {isar-1.33.0 → isar-1.33.1}/src/isar/mission_planner/__init__.py +0 -0
  89. {isar-1.33.0 → isar-1.33.1}/src/isar/mission_planner/local_planner.py +0 -0
  90. {isar-1.33.0 → isar-1.33.1}/src/isar/mission_planner/mission_planner_interface.py +0 -0
  91. {isar-1.33.0 → isar-1.33.1}/src/isar/mission_planner/sequential_task_selector.py +0 -0
  92. {isar-1.33.0 → isar-1.33.1}/src/isar/mission_planner/task_selector_interface.py +0 -0
  93. {isar-1.33.0 → isar-1.33.1}/src/isar/models/__init__.py +0 -0
  94. {isar-1.33.0 → isar-1.33.1}/src/isar/modules.py +0 -0
  95. {isar-1.33.0 → isar-1.33.1}/src/isar/robot/robot.py +0 -0
  96. {isar-1.33.0 → isar-1.33.1}/src/isar/robot/robot_start_mission.py +0 -0
  97. {isar-1.33.0 → isar-1.33.1}/src/isar/robot/robot_status.py +0 -0
  98. {isar-1.33.0 → isar-1.33.1}/src/isar/robot/robot_stop_mission.py +0 -0
  99. {isar-1.33.0 → isar-1.33.1}/src/isar/robot/robot_task_status.py +0 -0
  100. {isar-1.33.0 → isar-1.33.1}/src/isar/script.py +0 -0
  101. {isar-1.33.0 → isar-1.33.1}/src/isar/services/__init__.py +0 -0
  102. {isar-1.33.0 → isar-1.33.1}/src/isar/services/auth/__init__.py +0 -0
  103. {isar-1.33.0 → isar-1.33.1}/src/isar/services/auth/azure_credentials.py +0 -0
  104. {isar-1.33.0 → isar-1.33.1}/src/isar/services/service_connections/__init__.py +0 -0
  105. {isar-1.33.0 → isar-1.33.1}/src/isar/services/service_connections/mqtt/__init__.py +0 -0
  106. {isar-1.33.0 → isar-1.33.1}/src/isar/services/service_connections/mqtt/mqtt_client.py +0 -0
  107. {isar-1.33.0 → isar-1.33.1}/src/isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +0 -0
  108. {isar-1.33.0 → isar-1.33.1}/src/isar/services/service_connections/mqtt/robot_info_publisher.py +0 -0
  109. {isar-1.33.0 → isar-1.33.1}/src/isar/services/service_connections/request_handler.py +0 -0
  110. {isar-1.33.0 → isar-1.33.1}/src/isar/services/utilities/__init__.py +0 -0
  111. {isar-1.33.0 → isar-1.33.1}/src/isar/services/utilities/robot_utilities.py +0 -0
  112. {isar-1.33.0 → isar-1.33.1}/src/isar/services/utilities/threaded_request.py +0 -0
  113. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/__init__.py +0 -0
  114. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/states/__init__.py +0 -0
  115. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/states/await_next_mission.py +0 -0
  116. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/states/blocked_protective_stop.py +0 -0
  117. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/states/home.py +0 -0
  118. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/states/intervention_needed.py +0 -0
  119. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/states/offline.py +0 -0
  120. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/states/paused.py +0 -0
  121. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/states/recharging.py +0 -0
  122. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/states/robot_standing_still.py +0 -0
  123. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/states/unknown_status.py +0 -0
  124. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/states_enum.py +0 -0
  125. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/transitions/functions/fail_mission.py +0 -0
  126. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/transitions/functions/finish_mission.py +0 -0
  127. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/transitions/functions/return_home.py +0 -0
  128. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/transitions/functions/robot_status.py +0 -0
  129. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/transitions/functions/utils.py +0 -0
  130. {isar-1.33.0 → isar-1.33.1}/src/isar/state_machine/transitions/robot_status.py +0 -0
  131. {isar-1.33.0 → isar-1.33.1}/src/isar/storage/__init__.py +0 -0
  132. {isar-1.33.0 → isar-1.33.1}/src/isar/storage/blob_storage.py +0 -0
  133. {isar-1.33.0 → isar-1.33.1}/src/isar/storage/local_storage.py +0 -0
  134. {isar-1.33.0 → isar-1.33.1}/src/isar/storage/storage_interface.py +0 -0
  135. {isar-1.33.0 → isar-1.33.1}/src/isar/storage/uploader.py +0 -0
  136. {isar-1.33.0 → isar-1.33.1}/src/isar/storage/utilities.py +0 -0
  137. {isar-1.33.0 → isar-1.33.1}/src/isar.egg-info/SOURCES.txt +0 -0
  138. {isar-1.33.0 → isar-1.33.1}/src/isar.egg-info/dependency_links.txt +0 -0
  139. {isar-1.33.0 → isar-1.33.1}/src/isar.egg-info/entry_points.txt +0 -0
  140. {isar-1.33.0 → isar-1.33.1}/src/isar.egg-info/requires.txt +0 -0
  141. {isar-1.33.0 → isar-1.33.1}/src/isar.egg-info/top_level.txt +0 -0
  142. {isar-1.33.0 → isar-1.33.1}/src/robot_interface/__init__.py +0 -0
  143. {isar-1.33.0 → isar-1.33.1}/src/robot_interface/models/__init__.py +0 -0
  144. {isar-1.33.0 → isar-1.33.1}/src/robot_interface/models/exceptions/__init__.py +0 -0
  145. {isar-1.33.0 → isar-1.33.1}/src/robot_interface/models/exceptions/robot_exceptions.py +0 -0
  146. {isar-1.33.0 → isar-1.33.1}/src/robot_interface/models/initialize/__init__.py +0 -0
  147. {isar-1.33.0 → isar-1.33.1}/src/robot_interface/models/inspection/__init__.py +0 -0
  148. {isar-1.33.0 → isar-1.33.1}/src/robot_interface/models/inspection/inspection.py +0 -0
  149. {isar-1.33.0 → isar-1.33.1}/src/robot_interface/models/mission/__init__.py +0 -0
  150. {isar-1.33.0 → isar-1.33.1}/src/robot_interface/models/mission/mission.py +0 -0
  151. {isar-1.33.0 → isar-1.33.1}/src/robot_interface/models/mission/status.py +0 -0
  152. {isar-1.33.0 → isar-1.33.1}/src/robot_interface/models/mission/task.py +0 -0
  153. {isar-1.33.0 → isar-1.33.1}/src/robot_interface/models/robots/__init__.py +0 -0
  154. {isar-1.33.0 → isar-1.33.1}/src/robot_interface/models/robots/battery_state.py +0 -0
  155. {isar-1.33.0 → isar-1.33.1}/src/robot_interface/models/robots/media.py +0 -0
  156. {isar-1.33.0 → isar-1.33.1}/src/robot_interface/models/robots/robot_model.py +0 -0
  157. {isar-1.33.0 → isar-1.33.1}/src/robot_interface/robot_interface.py +0 -0
  158. {isar-1.33.0 → isar-1.33.1}/src/robot_interface/telemetry/__init__.py +0 -0
  159. {isar-1.33.0 → isar-1.33.1}/src/robot_interface/telemetry/mqtt_client.py +0 -0
  160. {isar-1.33.0 → isar-1.33.1}/src/robot_interface/telemetry/payloads.py +0 -0
  161. {isar-1.33.0 → isar-1.33.1}/src/robot_interface/test_robot_interface.py +0 -0
  162. {isar-1.33.0 → isar-1.33.1}/src/robot_interface/utilities/__init__.py +0 -0
  163. {isar-1.33.0 → isar-1.33.1}/src/robot_interface/utilities/json_service.py +0 -0
  164. {isar-1.33.0 → isar-1.33.1}/src/robot_interface/utilities/uuid_string_factory.py +0 -0
  165. {isar-1.33.0 → isar-1.33.1}/tests/__init__.py +0 -0
  166. {isar-1.33.0 → isar-1.33.1}/tests/conftest.py +0 -0
  167. {isar-1.33.0 → isar-1.33.1}/tests/integration/__init__.py +0 -0
  168. {isar-1.33.0 → isar-1.33.1}/tests/integration/turtlebot/__init__.py +0 -0
  169. {isar-1.33.0 → isar-1.33.1}/tests/integration/turtlebot/config/__init__.py +0 -0
  170. {isar-1.33.0 → isar-1.33.1}/tests/integration/turtlebot/config/maps/__init__.py +0 -0
  171. {isar-1.33.0 → isar-1.33.1}/tests/integration/turtlebot/config/maps/turtleworld.json +0 -0
  172. {isar-1.33.0 → isar-1.33.1}/tests/integration/turtlebot/config/missions/__init__.py +0 -0
  173. {isar-1.33.0 → isar-1.33.1}/tests/integration/turtlebot/config/missions/default.json +0 -0
  174. {isar-1.33.0 → isar-1.33.1}/tests/integration/turtlebot/test_successful_mission.py +0 -0
  175. {isar-1.33.0 → isar-1.33.1}/tests/isar/__init__.py +0 -0
  176. {isar-1.33.0 → isar-1.33.1}/tests/isar/apis/__init__.py +0 -0
  177. {isar-1.33.0 → isar-1.33.1}/tests/isar/apis/models/__init__.py +0 -0
  178. {isar-1.33.0 → isar-1.33.1}/tests/isar/apis/models/example_mission_definition.json +0 -0
  179. {isar-1.33.0 → isar-1.33.1}/tests/isar/apis/models/test_start_mission_definition.py +0 -0
  180. {isar-1.33.0 → isar-1.33.1}/tests/isar/apis/scheduler/__init__.py +0 -0
  181. {isar-1.33.0 → isar-1.33.1}/tests/isar/apis/scheduler/test_scheduler_router.py +0 -0
  182. {isar-1.33.0 → isar-1.33.1}/tests/isar/apis/security/__init__.py +0 -0
  183. {isar-1.33.0 → isar-1.33.1}/tests/isar/apis/security/test_authentication.py +0 -0
  184. {isar-1.33.0 → isar-1.33.1}/tests/isar/mission/__init__.py +0 -0
  185. {isar-1.33.0 → isar-1.33.1}/tests/isar/mission/test_mission.py +0 -0
  186. {isar-1.33.0 → isar-1.33.1}/tests/isar/models/__init__.py +0 -0
  187. {isar-1.33.0 → isar-1.33.1}/tests/isar/models/communication/__init__.py +0 -0
  188. {isar-1.33.0 → isar-1.33.1}/tests/isar/services/__init__.py +0 -0
  189. {isar-1.33.0 → isar-1.33.1}/tests/isar/services/readers/__init__.py +0 -0
  190. {isar-1.33.0 → isar-1.33.1}/tests/isar/services/readers/test_mission_reader.py +0 -0
  191. {isar-1.33.0 → isar-1.33.1}/tests/isar/services/service_connections/__init__.py +0 -0
  192. {isar-1.33.0 → isar-1.33.1}/tests/isar/services/service_connections/echo/__init__.py +0 -0
  193. {isar-1.33.0 → isar-1.33.1}/tests/isar/services/service_connections/test_base_request_handler.py +0 -0
  194. {isar-1.33.0 → isar-1.33.1}/tests/isar/services/utilities/__init__.py +0 -0
  195. {isar-1.33.0 → isar-1.33.1}/tests/isar/state_machine/__init__.py +0 -0
  196. {isar-1.33.0 → isar-1.33.1}/tests/isar/state_machine/states/__init__.py +0 -0
  197. {isar-1.33.0 → isar-1.33.1}/tests/isar/state_machine/states/test_monitor.py +0 -0
  198. {isar-1.33.0 → isar-1.33.1}/tests/isar/storage/test_blob_storage.py +0 -0
  199. {isar-1.33.0 → isar-1.33.1}/tests/isar/storage/test_uploader.py +0 -0
  200. {isar-1.33.0 → isar-1.33.1}/tests/test_data/test_map_config/test_map_config.json +0 -0
  201. {isar-1.33.0 → isar-1.33.1}/tests/test_data/test_mission_not_working.json +0 -0
  202. {isar-1.33.0 → isar-1.33.1}/tests/test_data/test_mission_working.json +0 -0
  203. {isar-1.33.0 → isar-1.33.1}/tests/test_data/test_mission_working_no_tasks.json +0 -0
  204. {isar-1.33.0 → isar-1.33.1}/tests/test_data/test_thermal_image_mission.json +0 -0
  205. {isar-1.33.0 → isar-1.33.1}/tests/test_double/__init__.py +0 -0
  206. {isar-1.33.0 → isar-1.33.1}/tests/test_double/blob_storage.py +0 -0
  207. {isar-1.33.0 → isar-1.33.1}/tests/test_double/mission_definition.py +0 -0
  208. {isar-1.33.0 → isar-1.33.1}/tests/test_double/pose.py +0 -0
  209. {isar-1.33.0 → isar-1.33.1}/tests/test_double/request.py +0 -0
  210. {isar-1.33.0 → isar-1.33.1}/tests/test_double/robot_interface.py +0 -0
  211. {isar-1.33.0 → isar-1.33.1}/tests/test_double/status.py +0 -0
  212. {isar-1.33.0 → isar-1.33.1}/tests/test_double/task.py +0 -0
  213. {isar-1.33.0 → isar-1.33.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.33.0
3
+ Version: 1.33.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
@@ -1,6 +1,5 @@
1
1
  import logging
2
2
  from http import HTTPStatus
3
- from threading import Lock
4
3
 
5
4
  from fastapi import Body, HTTPException, Path
6
5
 
@@ -29,7 +28,6 @@ class SchedulingController:
29
28
  ):
30
29
  self.scheduling_utilities: SchedulingUtilities = scheduling_utilities
31
30
  self.logger = logging.getLogger("api")
32
- self.start_mission_lock: Lock = Lock()
33
31
 
34
32
  def start_mission_by_id(
35
33
  self,
@@ -77,67 +75,38 @@ class SchedulingController:
77
75
  detail=error_message_no_mission_definition,
78
76
  )
79
77
 
80
- if not self.start_mission_lock.acquire(blocking=False):
81
- error_message_another_mission_starting: str = (
82
- "Conflict - Another mission is currently being started"
83
- )
84
- self.logger.warning(error_message_another_mission_starting)
85
- raise HTTPException(
86
- status_code=HTTPStatus.CONFLICT,
87
- detail=error_message_another_mission_starting,
88
- )
78
+ state: States = self.scheduling_utilities.get_state()
79
+ self.scheduling_utilities.verify_state_machine_ready_to_receive_mission(state)
89
80
 
90
81
  try:
91
- state: States = self.scheduling_utilities.get_state()
92
- self.scheduling_utilities.verify_state_machine_ready_to_receive_mission(
93
- state
82
+ mission: Mission = to_isar_mission(
83
+ start_mission_definition=mission_definition
94
84
  )
95
-
96
- try:
97
- mission: Mission = to_isar_mission(
98
- start_mission_definition=mission_definition
99
- )
100
- except MissionPlannerError as e:
101
- error_message = f"Bad Request - Cannot create ISAR mission: {e}"
102
- self.logger.warning(error_message)
103
- raise HTTPException(
104
- status_code=HTTPStatus.BAD_REQUEST,
105
- detail=error_message,
106
- )
107
-
108
- self.scheduling_utilities.verify_robot_capable_of_mission(
109
- mission=mission, robot_capabilities=robot_settings.CAPABILITIES
85
+ except MissionPlannerError as e:
86
+ error_message = f"Bad Request - Cannot create ISAR mission: {e}"
87
+ self.logger.warning(error_message)
88
+ raise HTTPException(
89
+ status_code=HTTPStatus.BAD_REQUEST,
90
+ detail=error_message,
110
91
  )
111
92
 
112
- self.logger.info("Starting mission: %s", mission.id)
113
- self.scheduling_utilities.start_mission(mission=mission)
114
- return self._api_response(mission)
93
+ self.scheduling_utilities.verify_robot_capable_of_mission(
94
+ mission=mission, robot_capabilities=robot_settings.CAPABILITIES
95
+ )
115
96
 
116
- finally:
117
- self.start_mission_lock.release()
97
+ self.logger.info("Starting mission: %s", mission.id)
98
+ self.scheduling_utilities.start_mission(mission=mission)
99
+ return self._api_response(mission)
118
100
 
119
101
  def return_home(self) -> None:
120
102
  self.logger.info("Received request to return home")
121
103
 
122
- if not self.start_mission_lock.acquire(blocking=False):
123
- error_message_another_mission_starting: str = (
124
- "Conflict - Another mission is currently being started"
125
- )
126
- self.logger.warning(error_message_another_mission_starting)
127
- raise HTTPException(
128
- status_code=HTTPStatus.CONFLICT,
129
- detail=error_message_another_mission_starting,
130
- )
131
-
132
- try:
133
- state: States = self.scheduling_utilities.get_state()
134
- self.scheduling_utilities.verify_state_machine_ready_to_receive_return_home_mission(
135
- state
136
- )
104
+ state: States = self.scheduling_utilities.get_state()
105
+ self.scheduling_utilities.verify_state_machine_ready_to_receive_return_home_mission(
106
+ state
107
+ )
137
108
 
138
- self.scheduling_utilities.return_home()
139
- finally:
140
- self.start_mission_lock.release()
109
+ self.scheduling_utilities.return_home()
141
110
 
142
111
  def pause_mission(self) -> ControlMissionResponse:
143
112
  self.logger.info("Received request to pause current mission")
@@ -17,12 +17,15 @@ T2 = TypeVar("T2")
17
17
 
18
18
 
19
19
  class Event(Queue[T]):
20
- def __init__(self) -> None:
20
+ def __init__(self, name: str) -> None:
21
21
  super().__init__(maxsize=1)
22
+ self.name = name
22
23
 
23
24
  def trigger_event(self, data: T, timeout: int = None) -> None:
24
25
  try:
25
- self.put(data, timeout=timeout)
26
+ # We always want a timeout when blocking for results, so that
27
+ # the thread will never get stuck waiting for a result
28
+ self.put(data, block=timeout is not None, timeout=timeout)
26
29
  except Exception:
27
30
  if timeout is not None:
28
31
  raise EventTimeoutError
@@ -79,46 +82,62 @@ class APIEvent(Generic[T1, T2]):
79
82
  api to state machine while the response is from state machine to api.
80
83
  """
81
84
 
82
- def __init__(self):
83
- self.request: Event[T1] = Event()
84
- self.response: Event[T2] = Event()
85
+ def __init__(self, name: str):
86
+ self.request: Event[T1] = Event("api-" + name + "-request")
87
+ self.response: Event[T2] = Event("api-" + name + "-request")
85
88
 
86
89
 
87
90
  class APIRequests:
88
91
  def __init__(self) -> None:
89
- self.start_mission: APIEvent[Mission, MissionStartResponse] = APIEvent()
90
- self.stop_mission: APIEvent[str, ControlMissionResponse] = APIEvent()
91
- self.pause_mission: APIEvent[bool, ControlMissionResponse] = APIEvent()
92
- self.resume_mission: APIEvent[bool, ControlMissionResponse] = APIEvent()
93
- self.return_home: APIEvent[bool, bool] = APIEvent()
94
- self.release_intervention_needed: APIEvent[bool, bool] = APIEvent()
92
+ self.start_mission: APIEvent[Mission, MissionStartResponse] = APIEvent(
93
+ "start_mission"
94
+ )
95
+ self.stop_mission: APIEvent[str, ControlMissionResponse] = APIEvent(
96
+ "stop_mission"
97
+ )
98
+ self.pause_mission: APIEvent[bool, ControlMissionResponse] = APIEvent(
99
+ "pause_mission"
100
+ )
101
+ self.resume_mission: APIEvent[bool, ControlMissionResponse] = APIEvent(
102
+ "resume_mission"
103
+ )
104
+ self.return_home: APIEvent[bool, bool] = APIEvent("return_home")
105
+ self.release_intervention_needed: APIEvent[bool, bool] = APIEvent(
106
+ "release_intervention_needed"
107
+ )
95
108
 
96
109
 
97
110
  class StateMachineEvents:
98
111
  def __init__(self) -> None:
99
- self.start_mission: Event[Mission] = Event()
100
- self.stop_mission: Event[bool] = Event()
101
- self.pause_mission: Event[bool] = Event()
102
- self.task_status_request: Event[str] = Event()
112
+ self.start_mission: Event[Mission] = Event("start_mission")
113
+ self.stop_mission: Event[bool] = Event("stop_mission")
114
+ self.pause_mission: Event[bool] = Event("pause_mission")
115
+ self.task_status_request: Event[str] = Event("task_status_request")
103
116
 
104
117
 
105
118
  class RobotServiceEvents:
106
119
  def __init__(self) -> None:
107
- self.task_status_updated: Event[TaskStatus] = Event()
108
- self.task_status_failed: Event[ErrorMessage] = Event()
109
- self.mission_started: Event[bool] = Event()
110
- self.mission_failed: Event[ErrorMessage] = Event()
111
- self.robot_status_changed: Event[bool] = Event()
112
- self.mission_failed_to_stop: Event[ErrorMessage] = Event()
113
- self.mission_successfully_stopped: Event[bool] = Event()
120
+ self.task_status_updated: Event[TaskStatus] = Event("task_status_updated")
121
+ self.task_status_failed: Event[ErrorMessage] = Event("task_status_failed")
122
+ self.mission_started: Event[bool] = Event("mission_started")
123
+ self.mission_failed: Event[ErrorMessage] = Event("mission_failed")
124
+ self.robot_status_changed: Event[bool] = Event("robot_status_changed")
125
+ self.mission_failed_to_stop: Event[ErrorMessage] = Event(
126
+ "mission_failed_to_stop"
127
+ )
128
+ self.mission_successfully_stopped: Event[bool] = Event(
129
+ "mission_successfully_stopped"
130
+ )
114
131
 
115
132
 
116
133
  class SharedState:
117
134
  def __init__(self) -> None:
118
- self.state: Event[State] = Event()
119
- self.robot_status: Event[RobotStatus] = Event()
120
- self.state_machine_current_task: Event[TASKS] = Event()
121
- self.robot_battery_level: Event[float] = Event()
135
+ self.state: Event[State] = Event("state")
136
+ self.robot_status: Event[RobotStatus] = Event("robot_status")
137
+ self.state_machine_current_task: Event[TASKS] = Event(
138
+ "state_machine_current_task"
139
+ )
140
+ self.robot_battery_level: Event[float] = Event("robot_battery_level")
122
141
 
123
142
 
124
143
  class EventTimeoutError(Exception):
@@ -347,3 +347,6 @@ class SchedulingUtilities:
347
347
  api_event.request.clear_event()
348
348
  self.logger.error("No output received for command to state machine")
349
349
  raise e
350
+ finally:
351
+ api_event.request.clear_event()
352
+ api_event.response.clear_event()
@@ -406,7 +406,7 @@ class StateMachine(object):
406
406
  )
407
407
 
408
408
  def _queue_empty_response(self) -> None:
409
- self.events.api_requests.stop_mission.response.put(
409
+ self.events.api_requests.stop_mission.response.trigger_event(
410
410
  ControlMissionResponse(
411
411
  mission_id="None",
412
412
  mission_status="None",
@@ -60,9 +60,7 @@ class Monitor(EventHandlerBase):
60
60
  state_machine.logger.warning(
61
61
  "Cancelling current mission due to low battery"
62
62
  )
63
- state_machine.current_mission = None
64
- state_machine.current_task = None
65
- return state_machine.request_return_home # type: ignore
63
+ return state_machine.stop # type: ignore
66
64
  return None
67
65
 
68
66
  event_handlers: List[EventHandlerMapping] = [
@@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, Callable, List, Optional
2
2
 
3
3
  from isar.apis.models.models import MissionStartResponse
4
4
  from isar.eventhandlers.eventhandler import EventHandlerBase, EventHandlerMapping
5
- from isar.models.events import Event, EventTimeoutError
5
+ from isar.models.events import Event
6
6
  from isar.state_machine.utils.common_event_handlers import (
7
7
  mission_failed_event_handler,
8
8
  mission_started_event_handler,
@@ -43,17 +43,14 @@ class ReturningHome(EventHandlerBase):
43
43
  ) -> Optional[Callable]:
44
44
  if event.has_event():
45
45
  if not state_machine.battery_level_is_above_mission_start_threshold():
46
- try:
47
- state_machine.events.api_requests.start_mission.response.trigger_event(
48
- MissionStartResponse(
49
- mission_id=None,
50
- mission_started=False,
51
- mission_not_started_reason="Robot battery too low",
52
- ),
53
- timeout=1, # This conflict can happen if two API requests are received at the same time
54
- )
55
- except EventTimeoutError:
56
- pass
46
+ response = MissionStartResponse(
47
+ mission_id=None,
48
+ mission_started=False,
49
+ mission_not_started_reason="Robot battery too low",
50
+ )
51
+ state_machine.events.api_requests.start_mission.response.trigger_event(
52
+ response
53
+ )
57
54
  return None
58
55
  return state_machine.stop # type: ignore
59
56
  return None
@@ -1,9 +1,11 @@
1
1
  import logging
2
2
  from typing import TYPE_CHECKING, Callable, List, Optional
3
3
 
4
+ from isar.apis.models.models import ControlMissionResponse
4
5
  from isar.eventhandlers.eventhandler import EventHandlerBase, EventHandlerMapping
5
6
  from isar.models.events import Event
6
7
  from robot_interface.models.exceptions.robot_exceptions import ErrorMessage
8
+ from robot_interface.models.mission.status import MissionStatus, TaskStatus
7
9
 
8
10
  if TYPE_CHECKING:
9
11
  from isar.state_machine.state_machine import StateMachine
@@ -15,6 +17,32 @@ class Stopping(EventHandlerBase):
15
17
  logger = logging.getLogger("state_machine")
16
18
  events = state_machine.events
17
19
 
20
+ def _stop_mission_cleanup() -> None:
21
+ if state_machine.current_mission is None:
22
+ state_machine._queue_empty_response()
23
+ state_machine.reset_state_machine()
24
+ return None
25
+
26
+ state_machine.current_mission.status = MissionStatus.Cancelled
27
+
28
+ for task in state_machine.current_mission.tasks:
29
+ if task.status in [
30
+ TaskStatus.NotStarted,
31
+ TaskStatus.InProgress,
32
+ TaskStatus.Paused,
33
+ ]:
34
+ task.status = TaskStatus.Cancelled
35
+
36
+ stopped_mission_response: ControlMissionResponse = (
37
+ state_machine._make_control_mission_response()
38
+ )
39
+ state_machine.events.api_requests.stop_mission.response.trigger_event(
40
+ stopped_mission_response
41
+ )
42
+ state_machine.publish_task_status(task=state_machine.current_task)
43
+ state_machine._finalize()
44
+ return None
45
+
18
46
  def _failed_stop_event_handler(
19
47
  event: Event[ErrorMessage],
20
48
  ) -> Optional[Callable]:
@@ -38,6 +66,11 @@ class Stopping(EventHandlerBase):
38
66
  ):
39
67
  return state_machine.return_home_mission_stopped # type: ignore
40
68
  else:
69
+ _stop_mission_cleanup()
70
+ if (
71
+ not state_machine.battery_level_is_above_mission_start_threshold()
72
+ ):
73
+ return state_machine.request_return_home # type: ignore
41
74
  return state_machine.mission_stopped # type: ignore
42
75
  return None
43
76
 
@@ -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.response.put(
32
+ state_machine.events.api_requests.pause_mission.response.trigger_event(
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.response.put(
38
+ state_machine.events.api_requests.resume_mission.response.trigger_event(
39
39
  resume_mission_response
40
40
  )
41
41
 
@@ -13,7 +13,7 @@ from robot_interface.models.mission.status import MissionStatus, TaskStatus
13
13
 
14
14
 
15
15
  def acknowledge_mission(state_machine: "StateMachine") -> bool:
16
- state_machine.events.api_requests.start_mission.response.put(
16
+ state_machine.events.api_requests.start_mission.response.trigger_event(
17
17
  MissionStartResponse(mission_started=True)
18
18
  )
19
19
  return True
@@ -66,14 +66,14 @@ def set_mission_to_in_progress(state_machine: "StateMachine") -> bool:
66
66
 
67
67
 
68
68
  def trigger_start_mission_event(state_machine: "StateMachine") -> bool:
69
- state_machine.events.state_machine_events.start_mission.put(
69
+ state_machine.events.state_machine_events.start_mission.trigger_event(
70
70
  state_machine.current_mission
71
71
  )
72
72
  return True
73
73
 
74
74
 
75
75
  def _initialization_failed(state_machine: "StateMachine") -> None:
76
- state_machine.events.api_requests.start_mission.response.put(
76
+ state_machine.events.api_requests.start_mission.response.trigger_event(
77
77
  MissionStartResponse(
78
78
  mission_started=False,
79
79
  mission_not_started_reason="Failed to initialize robot",
@@ -12,38 +12,11 @@ def trigger_stop_mission_event(state_machine: "StateMachine") -> bool:
12
12
  return True
13
13
 
14
14
 
15
- def stop_mission_cleanup(state_machine: "StateMachine") -> bool:
16
- if state_machine.current_mission is None:
17
- state_machine._queue_empty_response()
18
- state_machine.reset_state_machine()
19
- return True
20
-
21
- state_machine.current_mission.status = MissionStatus.Cancelled
22
-
23
- for task in state_machine.current_mission.tasks:
24
- if task.status in [
25
- TaskStatus.NotStarted,
26
- TaskStatus.InProgress,
27
- TaskStatus.Paused,
28
- ]:
29
- task.status = TaskStatus.Cancelled
30
-
31
- stopped_mission_response: ControlMissionResponse = (
32
- state_machine._make_control_mission_response()
33
- )
34
- state_machine.events.api_requests.stop_mission.response.put(
35
- stopped_mission_response
36
- )
37
- state_machine.publish_task_status(task=state_machine.current_task)
38
- state_machine._finalize()
39
- return True
40
-
41
-
42
15
  def stop_mission_failed(state_machine: "StateMachine") -> bool:
43
16
  stopped_mission_response: ControlMissionResponse = (
44
17
  state_machine._make_control_mission_response()
45
18
  )
46
- state_machine.events.api_requests.stop_mission.response.put(
19
+ state_machine.events.api_requests.stop_mission.response.trigger_event(
47
20
  stopped_mission_response
48
21
  )
49
22
  return True
@@ -69,7 +42,7 @@ def stop_return_home_mission_cleanup(state_machine: "StateMachine") -> bool:
69
42
  stopped_mission_response: ControlMissionResponse = (
70
43
  state_machine._make_control_mission_response()
71
44
  )
72
- state_machine.events.api_requests.stop_mission.response.put(
45
+ state_machine.events.api_requests.stop_mission.response.trigger_event(
73
46
  stopped_mission_response
74
47
  )
75
48
 
@@ -83,7 +56,7 @@ def stop_return_home_mission_failed(state_machine: "StateMachine") -> bool:
83
56
  stopped_mission_response: ControlMissionResponse = (
84
57
  state_machine._make_control_mission_response()
85
58
  )
86
- state_machine.events.api_requests.stop_mission.response.put(
59
+ state_machine.events.api_requests.stop_mission.response.trigger_event(
87
60
  stopped_mission_response
88
61
  )
89
62
  return True
@@ -14,7 +14,6 @@ from isar.state_machine.transitions.functions.start_mission import (
14
14
  trigger_start_mission_event,
15
15
  )
16
16
  from isar.state_machine.transitions.functions.stop import (
17
- stop_mission_cleanup,
18
17
  stop_mission_failed,
19
18
  stop_return_home_mission_cleanup,
20
19
  stop_return_home_mission_failed,
@@ -66,7 +65,6 @@ def get_mission_transitions(state_machine: "StateMachine") -> List[dict]:
66
65
  "trigger": "mission_stopped",
67
66
  "source": state_machine.stopping_state,
68
67
  "dest": state_machine.await_next_mission_state,
69
- "before": def_transition(state_machine, stop_mission_cleanup),
70
68
  },
71
69
  {
72
70
  "trigger": "mission_stopping_failed",
@@ -31,13 +31,13 @@ def get_return_home_transitions(state_machine: "StateMachine") -> List[dict]:
31
31
  state_machine.robot_standing_still_state,
32
32
  state_machine.intervention_needed_state,
33
33
  state_machine.monitor_state,
34
+ state_machine.stopping_state,
34
35
  ],
35
36
  "dest": state_machine.returning_home_state,
36
37
  "conditions": [
37
38
  def_transition(state_machine, start_return_home_mission),
38
39
  def_transition(state_machine, set_return_home_status),
39
40
  def_transition(state_machine, initialize_robot),
40
- def_transition(state_machine, initialize_robot),
41
41
  ],
42
42
  "before": def_transition(state_machine, trigger_start_mission_event),
43
43
  },
@@ -1,7 +1,7 @@
1
1
  from typing import TYPE_CHECKING, Callable, Optional
2
2
 
3
3
  from isar.apis.models.models import ControlMissionResponse, MissionStartResponse
4
- from isar.models.events import Event, EventTimeoutError
4
+ from isar.models.events import Event
5
5
  from robot_interface.models.exceptions.robot_exceptions import ErrorMessage
6
6
  from robot_interface.models.mission.mission import Mission
7
7
  from robot_interface.models.mission.status import RobotStatus, TaskStatus
@@ -18,17 +18,13 @@ def start_mission_event_handler(
18
18
  mission: Optional[Mission] = event.consume_event()
19
19
  if mission:
20
20
  if not state_machine.battery_level_is_above_mission_start_threshold():
21
- try:
22
- response.trigger_event(
23
- MissionStartResponse(
24
- mission_id=mission.id,
25
- mission_started=False,
26
- mission_not_started_reason="Robot battery too low",
27
- ),
28
- timeout=1, # This conflict can happen if two API requests are received at the same time
21
+ response.trigger_event(
22
+ MissionStartResponse(
23
+ mission_id=mission.id,
24
+ mission_started=False,
25
+ mission_not_started_reason="Robot battery too low",
29
26
  )
30
- except EventTimeoutError:
31
- pass
27
+ )
32
28
  return None
33
29
  state_machine.start_mission(mission=mission)
34
30
  return state_machine.request_mission_start # type: ignore
@@ -39,7 +35,7 @@ def return_home_event_handler(
39
35
  state_machine: "StateMachine", event: Event[bool]
40
36
  ) -> Optional[Callable]:
41
37
  if event.consume_event():
42
- state_machine.events.api_requests.return_home.response.put(True)
38
+ state_machine.events.api_requests.return_home.response.trigger_event(True)
43
39
  return state_machine.request_return_home # type: ignore
44
40
  return None
45
41
 
@@ -63,7 +59,7 @@ def stop_mission_event_handler(
63
59
  if state_machine.current_mission.id == mission_id or mission_id == "":
64
60
  return state_machine.stop # type: ignore
65
61
  else:
66
- state_machine.events.api_requests.stop_mission.response.put(
62
+ state_machine.events.api_requests.stop_mission.response.trigger_event(
67
63
  ControlMissionResponse(
68
64
  mission_id=mission_id,
69
65
  mission_status=state_machine.current_mission.status,
@@ -80,6 +76,7 @@ def mission_started_event_handler(
80
76
  event: Event[bool],
81
77
  ) -> Optional[Callable]:
82
78
  if event.consume_event():
79
+ state_machine.logger.info("Received confirmation that mission has started")
83
80
  state_machine.mission_ongoing = True
84
81
  return None
85
82
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: isar
3
- Version: 1.33.0
3
+ Version: 1.33.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
@@ -25,19 +25,19 @@ class TestEvents:
25
25
 
26
26
 
27
27
  def test_staus_queue_empty() -> None:
28
- status_event: Event = Event()
28
+ status_event: Event = Event("test")
29
29
  assert status_event.check() is None
30
30
 
31
31
 
32
32
  def test_status_event_check() -> None:
33
- status_event: Event = Event()
33
+ status_event: Event = Event("test")
34
34
  status_event.update("Test")
35
35
  assert status_event.check() == "Test"
36
36
  assert status_event._qsize() == 1
37
37
 
38
38
 
39
39
  def test_status_event_update() -> None:
40
- status_event: Event = Event()
40
+ status_event: Event = Event("test")
41
41
  status_event.update("Test")
42
42
  status_event.update("New Test")
43
43
  assert status_event._qsize() == 1
@@ -18,7 +18,7 @@ class TestQueueUtilities:
18
18
  def test_check_queue_with_queue_size_one(
19
19
  self, message, queue_timeout, expected_message
20
20
  ) -> None:
21
- test_event: Event = Event()
21
+ test_event: Event = Event("test")
22
22
  if message is not None:
23
23
  test_event.put(message)
24
24
  message = test_event.consume_event(timeout=queue_timeout)
@@ -28,7 +28,7 @@ class TestQueueUtilities:
28
28
  test_event.consume_event(timeout=queue_timeout)
29
29
 
30
30
  def test_clear_queue(self) -> None:
31
- test_event: Event = Event()
31
+ test_event: Event = Event("test")
32
32
  test_event.put(1)
33
33
  test_event.clear_event()
34
34
  assert test_event.empty()
@@ -15,7 +15,7 @@ def test_timeout_send_command(
15
15
  mocker: MockerFixture, scheduling_utilities: SchedulingUtilities
16
16
  ):
17
17
  mocker.patch.object(Event, "consume_event", side_effect=EventTimeoutError)
18
- q: APIEvent = APIEvent()
18
+ q: APIEvent = APIEvent("test")
19
19
  with pytest.raises(EventTimeoutError):
20
20
  scheduling_utilities._send_command(True, q)
21
21
  assert q.request.empty()
@@ -233,7 +233,7 @@ def test_monitor_goes_to_return_home_when_battery_low(
233
233
  event_handler.event.trigger_event(10.0, timeout=1)
234
234
  transition = event_handler.handler(event_handler.event)
235
235
 
236
- assert transition is state_machine.request_return_home # type: ignore
236
+ assert transition is state_machine.stop # type: ignore
237
237
  assert not state_machine.events.mqtt_queue.empty()
238
238
 
239
239
  mqtt_message = state_machine.events.mqtt_queue.get(block=False)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes