isar 1.31.1__tar.gz → 1.32.0__tar.gz

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

Potentially problematic release.


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

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