isar 1.30.4__tar.gz → 1.30.5__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 (222) hide show
  1. {isar-1.30.4 → isar-1.30.5}/.gitignore +3 -0
  2. {isar-1.30.4 → isar-1.30.5}/PKG-INFO +1 -1
  3. {isar-1.30.4 → isar-1.30.5}/src/isar/apis/models/models.py +4 -4
  4. {isar-1.30.4 → isar-1.30.5}/src/isar/services/utilities/scheduling_utilities.py +10 -1
  5. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/generic_states/ongoing_mission.py +1 -1
  6. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/state_machine.py +7 -10
  7. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/states/stopping.py +2 -2
  8. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/transitions/functions/stop.py +44 -1
  9. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/transitions/mission.py +14 -0
  10. {isar-1.30.4 → isar-1.30.5}/src/isar.egg-info/PKG-INFO +1 -1
  11. {isar-1.30.4 → isar-1.30.5}/tests/isar/apis/scheduler/test_scheduler_router.py +16 -2
  12. {isar-1.30.4 → isar-1.30.5}/tests/isar/state_machine/test_state_machine.py +112 -6
  13. {isar-1.30.4 → isar-1.30.5}/tests/test_double/mission_definition.py +10 -0
  14. {isar-1.30.4 → isar-1.30.5}/tests/test_double/task.py +3 -2
  15. {isar-1.30.4 → isar-1.30.5}/.dockerignore +0 -0
  16. {isar-1.30.4 → isar-1.30.5}/.env.test +0 -0
  17. {isar-1.30.4 → isar-1.30.5}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  18. {isar-1.30.4 → isar-1.30.5}/.github/ISSUE_TEMPLATE/feature.md +0 -0
  19. {isar-1.30.4 → isar-1.30.5}/.github/ISSUE_TEMPLATE/improvement.md +0 -0
  20. {isar-1.30.4 → isar-1.30.5}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  21. {isar-1.30.4 → isar-1.30.5}/.github/release.yml +0 -0
  22. {isar-1.30.4 → isar-1.30.5}/.github/workflows/compile_requirements.yml +0 -0
  23. {isar-1.30.4 → isar-1.30.5}/.github/workflows/project_automations.yml +0 -0
  24. {isar-1.30.4 → isar-1.30.5}/.github/workflows/pythonpackage.yml +0 -0
  25. {isar-1.30.4 → isar-1.30.5}/.github/workflows/pythonpublish.yml +0 -0
  26. {isar-1.30.4 → isar-1.30.5}/.github/workflows/stale.yml +0 -0
  27. {isar-1.30.4 → isar-1.30.5}/.pre-commit-config.yaml +0 -0
  28. {isar-1.30.4 → isar-1.30.5}/LICENSE +0 -0
  29. {isar-1.30.4 → isar-1.30.5}/README.md +0 -0
  30. {isar-1.30.4 → isar-1.30.5}/SECURITY.md +0 -0
  31. {isar-1.30.4 → isar-1.30.5}/docs/Makefile +0 -0
  32. {isar-1.30.4 → isar-1.30.5}/docs/full_state_machine_diagram.png +0 -0
  33. {isar-1.30.4 → isar-1.30.5}/docs/make.bat +0 -0
  34. {isar-1.30.4 → isar-1.30.5}/docs/mission_state_machine_diagram.png +0 -0
  35. {isar-1.30.4 → isar-1.30.5}/docs/robot_status_state_machine_diagram.png +0 -0
  36. {isar-1.30.4 → isar-1.30.5}/docs/rst_processing.py +0 -0
  37. {isar-1.30.4 → isar-1.30.5}/docs/source/conf.py +0 -0
  38. {isar-1.30.4 → isar-1.30.5}/docs/source/index.rst +0 -0
  39. {isar-1.30.4 → isar-1.30.5}/docs/source/readme_link.md +0 -0
  40. {isar-1.30.4 → isar-1.30.5}/docs/update_state_diagram.py +0 -0
  41. {isar-1.30.4 → isar-1.30.5}/main.py +0 -0
  42. {isar-1.30.4 → isar-1.30.5}/pyproject.toml +0 -0
  43. {isar-1.30.4 → isar-1.30.5}/radixconfig.yml +0 -0
  44. {isar-1.30.4 → isar-1.30.5}/requirements.txt +0 -0
  45. {isar-1.30.4 → isar-1.30.5}/setup.cfg +0 -0
  46. {isar-1.30.4 → isar-1.30.5}/src/isar/__init__.py +0 -0
  47. {isar-1.30.4 → isar-1.30.5}/src/isar/apis/__init__.py +0 -0
  48. {isar-1.30.4 → isar-1.30.5}/src/isar/apis/api.py +0 -0
  49. {isar-1.30.4 → isar-1.30.5}/src/isar/apis/models/__init__.py +0 -0
  50. {isar-1.30.4 → isar-1.30.5}/src/isar/apis/models/start_mission_definition.py +0 -0
  51. {isar-1.30.4 → isar-1.30.5}/src/isar/apis/robot_control/robot_controller.py +0 -0
  52. {isar-1.30.4 → isar-1.30.5}/src/isar/apis/schedule/__init__.py +0 -0
  53. {isar-1.30.4 → isar-1.30.5}/src/isar/apis/schedule/scheduling_controller.py +0 -0
  54. {isar-1.30.4 → isar-1.30.5}/src/isar/apis/security/__init__.py +0 -0
  55. {isar-1.30.4 → isar-1.30.5}/src/isar/apis/security/authentication.py +0 -0
  56. {isar-1.30.4 → isar-1.30.5}/src/isar/config/__init__.py +0 -0
  57. {isar-1.30.4 → isar-1.30.5}/src/isar/config/certs/ca-cert.pem +0 -0
  58. {isar-1.30.4 → isar-1.30.5}/src/isar/config/configuration_error.py +0 -0
  59. {isar-1.30.4 → isar-1.30.5}/src/isar/config/keyvault/__init__.py +0 -0
  60. {isar-1.30.4 → isar-1.30.5}/src/isar/config/keyvault/keyvault_error.py +0 -0
  61. {isar-1.30.4 → isar-1.30.5}/src/isar/config/keyvault/keyvault_service.py +0 -0
  62. {isar-1.30.4 → isar-1.30.5}/src/isar/config/log.py +0 -0
  63. {isar-1.30.4 → isar-1.30.5}/src/isar/config/logging.conf +0 -0
  64. {isar-1.30.4 → isar-1.30.5}/src/isar/config/maps/JSP1_intermediate_deck.json +0 -0
  65. {isar-1.30.4 → isar-1.30.5}/src/isar/config/maps/JSP1_weather_deck.json +0 -0
  66. {isar-1.30.4 → isar-1.30.5}/src/isar/config/maps/default_map.json +0 -0
  67. {isar-1.30.4 → isar-1.30.5}/src/isar/config/maps/klab_b.json +0 -0
  68. {isar-1.30.4 → isar-1.30.5}/src/isar/config/maps/klab_compressor.json +0 -0
  69. {isar-1.30.4 → isar-1.30.5}/src/isar/config/maps/klab_turtlebot.json +0 -0
  70. {isar-1.30.4 → isar-1.30.5}/src/isar/config/maps/turtleworld.json +0 -0
  71. {isar-1.30.4 → isar-1.30.5}/src/isar/config/predefined_mission_definition/__init__.py +0 -0
  72. {isar-1.30.4 → isar-1.30.5}/src/isar/config/predefined_mission_definition/default_exr.json +0 -0
  73. {isar-1.30.4 → isar-1.30.5}/src/isar/config/predefined_mission_definition/default_mission.json +0 -0
  74. {isar-1.30.4 → isar-1.30.5}/src/isar/config/predefined_mission_definition/default_turtlebot.json +0 -0
  75. {isar-1.30.4 → isar-1.30.5}/src/isar/config/predefined_missions/__init__.py +0 -0
  76. {isar-1.30.4 → isar-1.30.5}/src/isar/config/predefined_missions/default.json +0 -0
  77. {isar-1.30.4 → isar-1.30.5}/src/isar/config/predefined_missions/default_turtlebot.json +0 -0
  78. {isar-1.30.4 → isar-1.30.5}/src/isar/config/settings.py +0 -0
  79. {isar-1.30.4 → isar-1.30.5}/src/isar/mission_planner/__init__.py +0 -0
  80. {isar-1.30.4 → isar-1.30.5}/src/isar/mission_planner/local_planner.py +0 -0
  81. {isar-1.30.4 → isar-1.30.5}/src/isar/mission_planner/mission_planner_interface.py +0 -0
  82. {isar-1.30.4 → isar-1.30.5}/src/isar/mission_planner/sequential_task_selector.py +0 -0
  83. {isar-1.30.4 → isar-1.30.5}/src/isar/mission_planner/task_selector_interface.py +0 -0
  84. {isar-1.30.4 → isar-1.30.5}/src/isar/models/__init__.py +0 -0
  85. {isar-1.30.4 → isar-1.30.5}/src/isar/models/communication/__init__.py +0 -0
  86. {isar-1.30.4 → isar-1.30.5}/src/isar/models/communication/message.py +0 -0
  87. {isar-1.30.4 → isar-1.30.5}/src/isar/models/communication/queues/__init__.py +0 -0
  88. {isar-1.30.4 → isar-1.30.5}/src/isar/models/communication/queues/events.py +0 -0
  89. {isar-1.30.4 → isar-1.30.5}/src/isar/models/communication/queues/queue_io.py +0 -0
  90. {isar-1.30.4 → isar-1.30.5}/src/isar/models/communication/queues/queue_timeout_error.py +0 -0
  91. {isar-1.30.4 → isar-1.30.5}/src/isar/models/communication/queues/queue_utils.py +0 -0
  92. {isar-1.30.4 → isar-1.30.5}/src/isar/models/communication/queues/status_queue.py +0 -0
  93. {isar-1.30.4 → isar-1.30.5}/src/isar/models/mission_metadata/__init__.py +0 -0
  94. {isar-1.30.4 → isar-1.30.5}/src/isar/modules.py +0 -0
  95. {isar-1.30.4 → isar-1.30.5}/src/isar/robot/robot.py +0 -0
  96. {isar-1.30.4 → isar-1.30.5}/src/isar/robot/robot_start_mission.py +0 -0
  97. {isar-1.30.4 → isar-1.30.5}/src/isar/robot/robot_status.py +0 -0
  98. {isar-1.30.4 → isar-1.30.5}/src/isar/robot/robot_stop_mission.py +0 -0
  99. {isar-1.30.4 → isar-1.30.5}/src/isar/robot/robot_task_status.py +0 -0
  100. {isar-1.30.4 → isar-1.30.5}/src/isar/script.py +0 -0
  101. {isar-1.30.4 → isar-1.30.5}/src/isar/services/__init__.py +0 -0
  102. {isar-1.30.4 → isar-1.30.5}/src/isar/services/auth/__init__.py +0 -0
  103. {isar-1.30.4 → isar-1.30.5}/src/isar/services/auth/azure_credentials.py +0 -0
  104. {isar-1.30.4 → isar-1.30.5}/src/isar/services/service_connections/__init__.py +0 -0
  105. {isar-1.30.4 → isar-1.30.5}/src/isar/services/service_connections/mqtt/__init__.py +0 -0
  106. {isar-1.30.4 → isar-1.30.5}/src/isar/services/service_connections/mqtt/mqtt_client.py +0 -0
  107. {isar-1.30.4 → isar-1.30.5}/src/isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +0 -0
  108. {isar-1.30.4 → isar-1.30.5}/src/isar/services/service_connections/mqtt/robot_info_publisher.py +0 -0
  109. {isar-1.30.4 → isar-1.30.5}/src/isar/services/service_connections/request_handler.py +0 -0
  110. {isar-1.30.4 → isar-1.30.5}/src/isar/services/service_connections/stid/__init__.py +0 -0
  111. {isar-1.30.4 → isar-1.30.5}/src/isar/services/utilities/__init__.py +0 -0
  112. {isar-1.30.4 → isar-1.30.5}/src/isar/services/utilities/queue_utilities.py +0 -0
  113. {isar-1.30.4 → isar-1.30.5}/src/isar/services/utilities/robot_utilities.py +0 -0
  114. {isar-1.30.4 → isar-1.30.5}/src/isar/services/utilities/threaded_request.py +0 -0
  115. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/__init__.py +0 -0
  116. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/generic_states/idle.py +0 -0
  117. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/generic_states/robot_unavailable.py +0 -0
  118. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/states/__init__.py +0 -0
  119. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/states/await_next_mission.py +0 -0
  120. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/states/blocked_protective_stop.py +0 -0
  121. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/states/home.py +0 -0
  122. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/states/monitor.py +0 -0
  123. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/states/offline.py +0 -0
  124. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/states/paused.py +0 -0
  125. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/states/returning_home.py +0 -0
  126. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/states/robot_standing_still.py +0 -0
  127. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/states/unknown_status.py +0 -0
  128. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/states_enum.py +0 -0
  129. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/transitions/functions/fail_mission.py +0 -0
  130. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/transitions/functions/finish_mission.py +0 -0
  131. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/transitions/functions/pause.py +0 -0
  132. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/transitions/functions/resume.py +0 -0
  133. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/transitions/functions/return_home.py +0 -0
  134. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/transitions/functions/robot_status.py +0 -0
  135. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/transitions/functions/start_mission.py +0 -0
  136. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/transitions/functions/utils.py +0 -0
  137. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/transitions/return_home.py +0 -0
  138. {isar-1.30.4 → isar-1.30.5}/src/isar/state_machine/transitions/robot_status.py +0 -0
  139. {isar-1.30.4 → isar-1.30.5}/src/isar/storage/__init__.py +0 -0
  140. {isar-1.30.4 → isar-1.30.5}/src/isar/storage/blob_storage.py +0 -0
  141. {isar-1.30.4 → isar-1.30.5}/src/isar/storage/local_storage.py +0 -0
  142. {isar-1.30.4 → isar-1.30.5}/src/isar/storage/storage_interface.py +0 -0
  143. {isar-1.30.4 → isar-1.30.5}/src/isar/storage/uploader.py +0 -0
  144. {isar-1.30.4 → isar-1.30.5}/src/isar/storage/utilities.py +0 -0
  145. {isar-1.30.4 → isar-1.30.5}/src/isar.egg-info/SOURCES.txt +0 -0
  146. {isar-1.30.4 → isar-1.30.5}/src/isar.egg-info/dependency_links.txt +0 -0
  147. {isar-1.30.4 → isar-1.30.5}/src/isar.egg-info/entry_points.txt +0 -0
  148. {isar-1.30.4 → isar-1.30.5}/src/isar.egg-info/requires.txt +0 -0
  149. {isar-1.30.4 → isar-1.30.5}/src/isar.egg-info/top_level.txt +0 -0
  150. {isar-1.30.4 → isar-1.30.5}/src/robot_interface/__init__.py +0 -0
  151. {isar-1.30.4 → isar-1.30.5}/src/robot_interface/models/__init__.py +0 -0
  152. {isar-1.30.4 → isar-1.30.5}/src/robot_interface/models/exceptions/__init__.py +0 -0
  153. {isar-1.30.4 → isar-1.30.5}/src/robot_interface/models/exceptions/robot_exceptions.py +0 -0
  154. {isar-1.30.4 → isar-1.30.5}/src/robot_interface/models/initialize/__init__.py +0 -0
  155. {isar-1.30.4 → isar-1.30.5}/src/robot_interface/models/inspection/__init__.py +0 -0
  156. {isar-1.30.4 → isar-1.30.5}/src/robot_interface/models/inspection/inspection.py +0 -0
  157. {isar-1.30.4 → isar-1.30.5}/src/robot_interface/models/mission/__init__.py +0 -0
  158. {isar-1.30.4 → isar-1.30.5}/src/robot_interface/models/mission/mission.py +0 -0
  159. {isar-1.30.4 → isar-1.30.5}/src/robot_interface/models/mission/status.py +0 -0
  160. {isar-1.30.4 → isar-1.30.5}/src/robot_interface/models/mission/task.py +0 -0
  161. {isar-1.30.4 → isar-1.30.5}/src/robot_interface/models/robots/__init__.py +0 -0
  162. {isar-1.30.4 → isar-1.30.5}/src/robot_interface/models/robots/battery_state.py +0 -0
  163. {isar-1.30.4 → isar-1.30.5}/src/robot_interface/models/robots/media.py +0 -0
  164. {isar-1.30.4 → isar-1.30.5}/src/robot_interface/models/robots/robot_model.py +0 -0
  165. {isar-1.30.4 → isar-1.30.5}/src/robot_interface/robot_interface.py +0 -0
  166. {isar-1.30.4 → isar-1.30.5}/src/robot_interface/telemetry/__init__.py +0 -0
  167. {isar-1.30.4 → isar-1.30.5}/src/robot_interface/telemetry/mqtt_client.py +0 -0
  168. {isar-1.30.4 → isar-1.30.5}/src/robot_interface/telemetry/payloads.py +0 -0
  169. {isar-1.30.4 → isar-1.30.5}/src/robot_interface/test_robot_interface.py +0 -0
  170. {isar-1.30.4 → isar-1.30.5}/src/robot_interface/utilities/__init__.py +0 -0
  171. {isar-1.30.4 → isar-1.30.5}/src/robot_interface/utilities/json_service.py +0 -0
  172. {isar-1.30.4 → isar-1.30.5}/src/robot_interface/utilities/uuid_string_factory.py +0 -0
  173. {isar-1.30.4 → isar-1.30.5}/tests/__init__.py +0 -0
  174. {isar-1.30.4 → isar-1.30.5}/tests/conftest.py +0 -0
  175. {isar-1.30.4 → isar-1.30.5}/tests/integration/__init__.py +0 -0
  176. {isar-1.30.4 → isar-1.30.5}/tests/integration/turtlebot/__init__.py +0 -0
  177. {isar-1.30.4 → isar-1.30.5}/tests/integration/turtlebot/config/__init__.py +0 -0
  178. {isar-1.30.4 → isar-1.30.5}/tests/integration/turtlebot/config/maps/__init__.py +0 -0
  179. {isar-1.30.4 → isar-1.30.5}/tests/integration/turtlebot/config/maps/turtleworld.json +0 -0
  180. {isar-1.30.4 → isar-1.30.5}/tests/integration/turtlebot/config/missions/__init__.py +0 -0
  181. {isar-1.30.4 → isar-1.30.5}/tests/integration/turtlebot/config/missions/default.json +0 -0
  182. {isar-1.30.4 → isar-1.30.5}/tests/integration/turtlebot/test_successful_mission.py +0 -0
  183. {isar-1.30.4 → isar-1.30.5}/tests/isar/__init__.py +0 -0
  184. {isar-1.30.4 → isar-1.30.5}/tests/isar/apis/__init__.py +0 -0
  185. {isar-1.30.4 → isar-1.30.5}/tests/isar/apis/models/__init__.py +0 -0
  186. {isar-1.30.4 → isar-1.30.5}/tests/isar/apis/models/example_mission_definition.json +0 -0
  187. {isar-1.30.4 → isar-1.30.5}/tests/isar/apis/models/test_start_mission_definition.py +0 -0
  188. {isar-1.30.4 → isar-1.30.5}/tests/isar/apis/scheduler/__init__.py +0 -0
  189. {isar-1.30.4 → isar-1.30.5}/tests/isar/apis/security/__init__.py +0 -0
  190. {isar-1.30.4 → isar-1.30.5}/tests/isar/apis/security/test_authentication.py +0 -0
  191. {isar-1.30.4 → isar-1.30.5}/tests/isar/mission/__init__.py +0 -0
  192. {isar-1.30.4 → isar-1.30.5}/tests/isar/mission/test_mission.py +0 -0
  193. {isar-1.30.4 → isar-1.30.5}/tests/isar/models/__init__.py +0 -0
  194. {isar-1.30.4 → isar-1.30.5}/tests/isar/models/communication/__init__.py +0 -0
  195. {isar-1.30.4 → isar-1.30.5}/tests/isar/models/communication/test_queues.py +0 -0
  196. {isar-1.30.4 → isar-1.30.5}/tests/isar/services/__init__.py +0 -0
  197. {isar-1.30.4 → isar-1.30.5}/tests/isar/services/readers/__init__.py +0 -0
  198. {isar-1.30.4 → isar-1.30.5}/tests/isar/services/readers/test_mission_reader.py +0 -0
  199. {isar-1.30.4 → isar-1.30.5}/tests/isar/services/service_connections/__init__.py +0 -0
  200. {isar-1.30.4 → isar-1.30.5}/tests/isar/services/service_connections/echo/__init__.py +0 -0
  201. {isar-1.30.4 → isar-1.30.5}/tests/isar/services/service_connections/test_base_request_handler.py +0 -0
  202. {isar-1.30.4 → isar-1.30.5}/tests/isar/services/utilities/__init__.py +0 -0
  203. {isar-1.30.4 → isar-1.30.5}/tests/isar/services/utilities/test_queue_utilities.py +0 -0
  204. {isar-1.30.4 → isar-1.30.5}/tests/isar/services/utilities/test_scheduling_utilities.py +0 -0
  205. {isar-1.30.4 → isar-1.30.5}/tests/isar/state_machine/__init__.py +0 -0
  206. {isar-1.30.4 → isar-1.30.5}/tests/isar/state_machine/states/__init__.py +0 -0
  207. {isar-1.30.4 → isar-1.30.5}/tests/isar/state_machine/states/test_monitor.py +0 -0
  208. {isar-1.30.4 → isar-1.30.5}/tests/isar/storage/test_blob_storage.py +0 -0
  209. {isar-1.30.4 → isar-1.30.5}/tests/isar/storage/test_uploader.py +0 -0
  210. {isar-1.30.4 → isar-1.30.5}/tests/test_data/test_map_config/test_map_config.json +0 -0
  211. {isar-1.30.4 → isar-1.30.5}/tests/test_data/test_mission_not_working.json +0 -0
  212. {isar-1.30.4 → isar-1.30.5}/tests/test_data/test_mission_working.json +0 -0
  213. {isar-1.30.4 → isar-1.30.5}/tests/test_data/test_mission_working_no_tasks.json +0 -0
  214. {isar-1.30.4 → isar-1.30.5}/tests/test_data/test_thermal_image_mission.json +0 -0
  215. {isar-1.30.4 → isar-1.30.5}/tests/test_double/__init__.py +0 -0
  216. {isar-1.30.4 → isar-1.30.5}/tests/test_double/blob_storage.py +0 -0
  217. {isar-1.30.4 → isar-1.30.5}/tests/test_double/mqtt_client.py +0 -0
  218. {isar-1.30.4 → isar-1.30.5}/tests/test_double/pose.py +0 -0
  219. {isar-1.30.4 → isar-1.30.5}/tests/test_double/request.py +0 -0
  220. {isar-1.30.4 → isar-1.30.5}/tests/test_double/robot_interface.py +0 -0
  221. {isar-1.30.4 → isar-1.30.5}/tests/test_double/status.py +0 -0
  222. {isar-1.30.4 → isar-1.30.5}/tests/test_double/token.py +0 -0
@@ -137,3 +137,6 @@ dmypy.json
137
137
  # Temporary result folders
138
138
  results
139
139
  temp_results
140
+
141
+ # MacOs file system
142
+ .DS_Store
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: isar
3
- Version: 1.30.4
3
+ Version: 1.30.5
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
@@ -19,10 +19,10 @@ class StartMissionResponse(BaseModel):
19
19
 
20
20
 
21
21
  class ControlMissionResponse(BaseModel):
22
- mission_id: str
23
- mission_status: str
24
- task_id: str
25
- task_status: str
22
+ mission_id: Optional[str]
23
+ mission_status: Optional[str]
24
+ task_id: Optional[str]
25
+ task_status: Optional[str]
26
26
 
27
27
 
28
28
  class RobotInfoResponse(BaseModel):
@@ -22,6 +22,7 @@ from isar.models.communication.queues.queue_timeout_error import QueueTimeoutErr
22
22
  from isar.services.utilities.queue_utilities import QueueUtilities
23
23
  from isar.state_machine.states_enum import States
24
24
  from robot_interface.models.mission.mission import Mission
25
+ from robot_interface.models.mission.status import MissionStatus
25
26
 
26
27
 
27
28
  class SchedulingUtilities:
@@ -253,13 +254,21 @@ class SchedulingUtilities:
253
254
 
254
255
  Raises
255
256
  ------
256
- HTTTPException 408 Request timeout
257
+ HTTPException 503 Service Unavailable
258
+ The request was understood, but attempting to stop the mission failed
259
+ HTTPException 408 Request timeout
257
260
  If there is a timeout while communicating with the state machine
258
261
  """
259
262
  try:
260
263
  stop_mission_response: ControlMissionResponse = self._send_command(
261
264
  True, self.api_events.stop_mission
262
265
  )
266
+ if stop_mission_response.mission_status != MissionStatus.Cancelled.value:
267
+ error_message = "Failed to stop mission"
268
+ self.logger.error(error_message)
269
+ raise HTTPException(
270
+ status_code=HTTPStatus.SERVICE_UNAVAILABLE, detail=error_message
271
+ )
263
272
  except QueueTimeoutError:
264
273
  error_message = "Internal Server Error - Failed to stop mission"
265
274
  self.logger.error(error_message)
@@ -54,7 +54,7 @@ class OngoingMission:
54
54
  self._run()
55
55
 
56
56
  def stop(self) -> None:
57
- self.state_machine.mission_ongoing = False
57
+ return
58
58
 
59
59
  def _check_and_handle_stop_mission_event(self, event: Queue) -> bool:
60
60
  if check_for_event(event):
@@ -194,6 +194,7 @@ class StateMachine(object):
194
194
  self.current_task = None
195
195
  self.send_task_status()
196
196
  self.current_mission = None
197
+ self.mission_ongoing = False
197
198
 
198
199
  def start_mission(self, mission: Mission):
199
200
  """Starts a scheduled mission."""
@@ -316,17 +317,13 @@ class StateMachine(object):
316
317
  self.logger.info("Mission overview:\n%s", log_statement)
317
318
 
318
319
  def _make_control_mission_response(self) -> ControlMissionResponse:
319
- if self.current_mission is None:
320
- raise ValueError("No current mission is set")
321
-
322
- if self.current_task is None:
323
- raise ValueError("No current task is set")
324
-
325
320
  return ControlMissionResponse(
326
- mission_id=self.current_mission.id,
327
- mission_status=self.current_mission.status,
328
- task_id=self.current_task.id,
329
- task_status=self.current_task.status,
321
+ mission_id=self.current_mission.id if self.current_mission else None,
322
+ mission_status=(
323
+ self.current_mission.status if self.current_mission else None
324
+ ),
325
+ task_id=self.current_task.id if self.current_task else None,
326
+ task_status=self.current_task.status if self.current_task else None,
330
327
  )
331
328
 
332
329
  def _queue_empty_response(self) -> None:
@@ -39,9 +39,9 @@ class Stopping(State):
39
39
  if error_message is not None:
40
40
  self.logger.warning(error_message.error_description)
41
41
  if self.stopping_return_home_mission:
42
- self.state_machine.return_home_mission_stopped() # type: ignore
42
+ self.state_machine.return_home_mission_stopping_failed() # type: ignore
43
43
  else:
44
- self.state_machine.mission_stopped() # type: ignore
44
+ self.state_machine.mission_stopping_failed() # type: ignore
45
45
  return True
46
46
  return False
47
47
 
@@ -1,6 +1,9 @@
1
1
  from typing import TYPE_CHECKING
2
2
 
3
- from isar.models.communication.queues.queue_utils import trigger_event_without_data
3
+ from isar.models.communication.queues.queue_utils import (
4
+ check_for_event_without_consumption,
5
+ trigger_event_without_data,
6
+ )
4
7
 
5
8
  if TYPE_CHECKING:
6
9
  from isar.state_machine.state_machine import StateMachine
@@ -39,11 +42,51 @@ def stop_mission_cleanup(state_machine: "StateMachine") -> bool:
39
42
  return True
40
43
 
41
44
 
45
+ def stop_mission_failed(state_machine: "StateMachine") -> bool:
46
+ stopped_mission_response: ControlMissionResponse = (
47
+ state_machine._make_control_mission_response()
48
+ )
49
+ state_machine.events.api_requests.stop_mission.output.put(stopped_mission_response)
50
+ return True
51
+
52
+
42
53
  def stop_return_home_mission_cleanup(state_machine: "StateMachine") -> bool:
43
54
  if state_machine.current_mission is None:
44
55
  state_machine._queue_empty_response()
45
56
  state_machine.reset_state_machine()
46
57
  return True
47
58
 
59
+ if not check_for_event_without_consumption(
60
+ state_machine.events.api_requests.start_mission.input
61
+ ):
62
+ state_machine.current_mission.status = MissionStatus.Cancelled
63
+
64
+ for task in state_machine.current_mission.tasks:
65
+ if task.status in [
66
+ TaskStatus.NotStarted,
67
+ TaskStatus.InProgress,
68
+ TaskStatus.Paused,
69
+ ]:
70
+ task.status = TaskStatus.Cancelled
71
+
72
+ stopped_mission_response: ControlMissionResponse = (
73
+ state_machine._make_control_mission_response()
74
+ )
75
+ state_machine.events.api_requests.stop_mission.output.put(
76
+ stopped_mission_response
77
+ )
78
+
48
79
  state_machine._finalize()
49
80
  return True
81
+
82
+
83
+ def stop_return_home_mission_failed(state_machine: "StateMachine") -> bool:
84
+ if check_for_event_without_consumption(
85
+ state_machine.events.api_requests.start_mission.input
86
+ ):
87
+ return True
88
+ stopped_mission_response: ControlMissionResponse = (
89
+ state_machine._make_control_mission_response()
90
+ )
91
+ state_machine.events.api_requests.stop_mission.output.put(stopped_mission_response)
92
+ return True
@@ -15,7 +15,9 @@ from isar.state_machine.transitions.functions.start_mission import (
15
15
  )
16
16
  from isar.state_machine.transitions.functions.stop import (
17
17
  stop_mission_cleanup,
18
+ stop_mission_failed,
18
19
  stop_return_home_mission_cleanup,
20
+ stop_return_home_mission_failed,
19
21
  trigger_stop_mission_event,
20
22
  )
21
23
  from isar.state_machine.transitions.functions.utils import def_transition
@@ -56,6 +58,18 @@ def get_mission_transitions(state_machine: "StateMachine") -> List[dict]:
56
58
  "dest": state_machine.await_next_mission_state,
57
59
  "before": def_transition(state_machine, stop_mission_cleanup),
58
60
  },
61
+ {
62
+ "trigger": "mission_stopping_failed",
63
+ "source": state_machine.stopping_state,
64
+ "dest": state_machine.monitor_state,
65
+ "before": def_transition(state_machine, stop_mission_failed),
66
+ },
67
+ {
68
+ "trigger": "return_home_mission_stopping_failed",
69
+ "source": state_machine.stopping_state,
70
+ "dest": state_machine.returning_home_state,
71
+ "before": def_transition(state_machine, stop_return_home_mission_failed),
72
+ },
59
73
  {
60
74
  "trigger": "return_home_mission_stopped",
61
75
  "source": state_machine.stopping_state,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: isar
3
- Version: 1.30.4
3
+ Version: 1.30.5
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
@@ -16,6 +16,7 @@ from isar.state_machine.states_enum import States
16
16
  from tests.test_double.mission_definition import DummyMissionDefinition
17
17
 
18
18
  dummy_mission = DummyMissionDefinition.default_mission
19
+ dummy_mission_stopped = DummyMissionDefinition.stopped_mission
19
20
 
20
21
  mock_return_unknown_status = mock.Mock(return_value=States.UnknownStatus)
21
22
  mock_return_robot_standing_still = mock.Mock(return_value=States.RobotStandingStill)
@@ -34,9 +35,18 @@ dummy_control_mission_response = ControlMissionResponse(
34
35
  task_id=dummy_task.id,
35
36
  task_status=dummy_task.status,
36
37
  )
38
+ dummy_stopped_control_mission_response = ControlMissionResponse(
39
+ mission_id=dummy_mission_stopped.id,
40
+ mission_status=dummy_mission_stopped.status,
41
+ task_id=dummy_mission_stopped.tasks[0].id,
42
+ task_status=dummy_mission_stopped.tasks[0].status,
43
+ )
37
44
  mock_return_control_mission_response = mock.Mock(
38
45
  return_value=dummy_control_mission_response
39
46
  )
47
+ mock_return_stopped_control_mission_response = mock.Mock(
48
+ return_value=dummy_stopped_control_mission_response
49
+ )
40
50
  mock_queue_timeout_error = mock.Mock(side_effect=QueueTimeoutError)
41
51
  mock_mission_planner_error = mock.Mock(side_effect=MissionPlannerError)
42
52
 
@@ -255,7 +265,9 @@ class TestStopMission:
255
265
 
256
266
  @pytest.mark.parametrize("state", valid_states)
257
267
  @mock.patch.object(
258
- SchedulingUtilities, "_send_command", mock_return_control_mission_response
268
+ SchedulingUtilities,
269
+ "_send_command",
270
+ mock_return_stopped_control_mission_response,
259
271
  )
260
272
  def test_stop_mission(
261
273
  self, client: TestClient, state: States, mocker: MockerFixture
@@ -263,7 +275,9 @@ class TestStopMission:
263
275
  mocker.patch.object(SchedulingUtilities, "get_state", return_value=state)
264
276
  response = client.post(url=self.schedule_stop_mission_path)
265
277
  assert response.status_code == HTTPStatus.OK
266
- assert response.json() == jsonable_encoder(dummy_control_mission_response)
278
+ assert response.json() == jsonable_encoder(
279
+ dummy_stopped_control_mission_response
280
+ )
267
281
 
268
282
  @mock.patch.object(SchedulingUtilities, "get_state", mock_return_unknown_status)
269
283
  @mock.patch.object(
@@ -1,11 +1,16 @@
1
1
  import time
2
2
  from collections import deque
3
+ from http import HTTPStatus
3
4
  from threading import Thread
4
5
  from typing import List
5
6
 
6
7
  import pytest
8
+ from fastapi import HTTPException
7
9
  from pytest_mock import MockerFixture
8
10
 
11
+ from isar.models.communication.queues.queue_utils import (
12
+ check_for_event_without_consumption,
13
+ )
9
14
  from isar.modules import ApplicationContainer
10
15
  from isar.robot.robot import Robot
11
16
  from isar.robot.robot_status import RobotStatusThread
@@ -122,7 +127,6 @@ def test_state_machine_failed_dependency(
122
127
  robot_service_thread: RobotServiceThreadMock,
123
128
  mocker,
124
129
  ) -> None:
125
-
126
130
  state_machine_thread.state_machine.await_next_mission_state.return_home_delay = 0.1
127
131
 
128
132
  mocker.patch.object(StubRobot, "task_status", return_value=TaskStatus.Failed)
@@ -250,7 +254,6 @@ def test_state_machine_with_successful_mission_stop(
250
254
  uploader_thread: UploaderThreadMock,
251
255
  mocker,
252
256
  ) -> None:
253
-
254
257
  mocker.patch.object(StubRobot, "robot_status", return_value=RobotStatus.Home)
255
258
  mocker.patch.object(StubRobot, "task_status", return_value=TaskStatus.InProgress)
256
259
 
@@ -303,19 +306,19 @@ def test_state_machine_with_unsuccessful_mission_stop(
303
306
 
304
307
  state_machine_thread.state_machine.sleep_time = 0
305
308
 
306
- state_machine_thread.state_machine.await_next_mission_state.return_home_delay = 10 # Return home delay is set to 10 seconds to avoid the state machine triggering return home within the test duration
307
309
  state_machine_thread.start()
308
310
  robot_service_thread.start()
309
311
 
310
312
  scheduling_utilities.start_mission(mission=mission)
311
313
  time.sleep(1)
312
- scheduling_utilities.stop_mission()
313
- time.sleep(3)
314
+ with pytest.raises(HTTPException) as exception_details:
315
+ scheduling_utilities.stop_mission()
314
316
 
315
317
  expected_log = (
316
318
  "Be aware that the robot may still be "
317
319
  "moving even though a stop has been attempted"
318
320
  )
321
+ assert exception_details.value.status_code == HTTPStatus.SERVICE_UNAVAILABLE.value
319
322
  assert expected_log in caplog.text
320
323
  assert state_machine_thread.state_machine.transitions_list == deque(
321
324
  [
@@ -323,11 +326,114 @@ def test_state_machine_with_unsuccessful_mission_stop(
323
326
  States.RobotStandingStill,
324
327
  States.Monitor,
325
328
  States.Stopping,
326
- States.AwaitNextMission,
329
+ States.Monitor,
330
+ ]
331
+ )
332
+
333
+
334
+ def test_state_machine_with_unsuccessful_return_home_stop(
335
+ container: ApplicationContainer,
336
+ mocker: MockerFixture,
337
+ state_machine_thread: StateMachineThreadMock,
338
+ caplog: pytest.LogCaptureFixture,
339
+ robot_service_thread: RobotServiceThreadMock,
340
+ ) -> None:
341
+ scheduling_utilities: SchedulingUtilities = container.scheduling_utilities()
342
+ mocker.patch.object(StubRobot, "task_status", return_value=TaskStatus.InProgress)
343
+ mocker.patch.object(
344
+ StubRobot, "stop", side_effect=_mock_robot_exception_with_message
345
+ )
346
+
347
+ state_machine_thread.state_machine.sleep_time = 0
348
+
349
+ state_machine_thread.start()
350
+ robot_service_thread.start()
351
+
352
+ scheduling_utilities.return_home()
353
+ time.sleep(1)
354
+ with pytest.raises(HTTPException) as exception_details:
355
+ scheduling_utilities.stop_mission()
356
+
357
+ expected_log = (
358
+ "Be aware that the robot may still be "
359
+ "moving even though a stop has been attempted"
360
+ )
361
+ assert exception_details.value.status_code == HTTPStatus.SERVICE_UNAVAILABLE.value
362
+ assert expected_log in caplog.text
363
+ assert state_machine_thread.state_machine.transitions_list == deque(
364
+ [
365
+ States.UnknownStatus,
366
+ States.RobotStandingStill,
367
+ States.ReturningHome,
368
+ States.Stopping,
369
+ States.ReturningHome,
370
+ ]
371
+ )
372
+
373
+
374
+ def test_state_machine_with_successful_return_home_stop(
375
+ container: ApplicationContainer,
376
+ mocker: MockerFixture,
377
+ state_machine_thread: StateMachineThreadMock,
378
+ robot_service_thread: RobotServiceThreadMock,
379
+ ) -> None:
380
+ scheduling_utilities: SchedulingUtilities = container.scheduling_utilities()
381
+ mocker.patch.object(StubRobot, "task_status", return_value=TaskStatus.InProgress)
382
+
383
+ state_machine_thread.state_machine.sleep_time = 0
384
+
385
+ state_machine_thread.start()
386
+ robot_service_thread.start()
387
+
388
+ scheduling_utilities.return_home()
389
+ time.sleep(1)
390
+ scheduling_utilities.stop_mission()
391
+
392
+ assert state_machine_thread.state_machine.transitions_list == deque(
393
+ [
394
+ States.UnknownStatus,
395
+ States.RobotStandingStill,
396
+ States.ReturningHome,
397
+ States.Stopping,
398
+ States.RobotStandingStill,
327
399
  ]
328
400
  )
329
401
 
330
402
 
403
+ def test_state_machine_with_mission_start_during_return_home_without_queueing_stop_response(
404
+ container: ApplicationContainer,
405
+ mocker: MockerFixture,
406
+ state_machine_thread: StateMachineThreadMock,
407
+ robot_service_thread: RobotServiceThreadMock,
408
+ ) -> None:
409
+ mission: Mission = Mission(name="Dummy misson", tasks=[StubTask.take_image()])
410
+ scheduling_utilities: SchedulingUtilities = container.scheduling_utilities()
411
+ mocker.patch.object(StubRobot, "task_status", return_value=TaskStatus.InProgress)
412
+
413
+ state_machine_thread.state_machine.sleep_time = 0
414
+
415
+ state_machine_thread.start()
416
+ robot_service_thread.start()
417
+
418
+ scheduling_utilities.return_home()
419
+ time.sleep(1)
420
+ scheduling_utilities.start_mission(mission=mission)
421
+
422
+ assert state_machine_thread.state_machine.transitions_list == deque(
423
+ [
424
+ States.UnknownStatus,
425
+ States.RobotStandingStill,
426
+ States.ReturningHome,
427
+ States.Stopping,
428
+ States.RobotStandingStill,
429
+ States.Monitor,
430
+ ]
431
+ )
432
+ assert not check_for_event_without_consumption(
433
+ state_machine_thread.state_machine.events.api_requests.start_mission.input
434
+ )
435
+
436
+
331
437
  def test_state_machine_offline_to_robot_standing_still(
332
438
  state_machine_thread, robot_service_thread, mocker
333
439
  ) -> None:
@@ -12,6 +12,7 @@ from isar.apis.models.start_mission_definition import (
12
12
  StartMissionTaskDefinition,
13
13
  )
14
14
  from robot_interface.models.mission.mission import Mission
15
+ from robot_interface.models.mission.status import MissionStatus, TaskStatus
15
16
  from tests.test_double.task import StubTask
16
17
 
17
18
 
@@ -32,6 +33,15 @@ class DummyMissionDefinition:
32
33
  dummy_task_take_image,
33
34
  ],
34
35
  )
36
+ dummy_task_take_image_cancelled = StubTask.take_image(status=TaskStatus.Cancelled)
37
+ stopped_mission = Mission(
38
+ id="default_mission",
39
+ name="Dummy misson",
40
+ tasks=[
41
+ dummy_task_take_image_cancelled,
42
+ ],
43
+ status=MissionStatus.Cancelled,
44
+ )
35
45
  dummy_start_mission_inspection_definition = StartMissionInspectionDefinition(
36
46
  type=InspectionTypes.image,
37
47
  inspection_target=dummy_input_target_position,
@@ -1,15 +1,16 @@
1
1
  from alitra import Frame, Orientation, Pose, Position
2
2
 
3
+ from robot_interface.models.mission.status import TaskStatus
3
4
  from robot_interface.models.mission.task import TakeImage
4
5
 
5
6
 
6
7
  class StubTask:
7
8
  @staticmethod
8
- def take_image() -> TakeImage:
9
+ def take_image(status: TaskStatus = TaskStatus.NotStarted) -> TakeImage:
9
10
  target_pose = Position(x=1, y=1, z=1, frame=Frame("robot"))
10
11
  robot_pose = Pose(
11
12
  position=Position(x=0, y=0, z=1, frame=Frame("robot")),
12
13
  orientation=Orientation(x=0, y=0, z=0, w=1, frame=Frame("robot")),
13
14
  frame=Frame("robot"),
14
15
  )
15
- return TakeImage(target=target_pose, robot_pose=robot_pose)
16
+ return TakeImage(target=target_pose, robot_pose=robot_pose, status=status)
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
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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes