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.
- {isar-1.31.1 → isar-1.32.0}/PKG-INFO +1 -1
- {isar-1.31.1 → isar-1.32.0}/src/isar/apis/api.py +18 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/apis/schedule/scheduling_controller.py +16 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/config/log.py +1 -2
- isar-1.32.0/src/isar/config/logging.conf +37 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/config/settings.py +4 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/models/events.py +1 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/script.py +7 -16
- {isar-1.31.1 → isar-1.32.0}/src/isar/services/utilities/scheduling_utilities.py +20 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/state_machine.py +25 -0
- isar-1.32.0/src/isar/state_machine/states/intervention_needed.py +43 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/states_enum.py +1 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/transitions/functions/fail_mission.py +7 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/transitions/mission.py +0 -6
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/transitions/return_home.py +14 -2
- {isar-1.31.1 → isar-1.32.0}/src/isar.egg-info/PKG-INFO +1 -1
- {isar-1.31.1 → isar-1.32.0}/src/isar.egg-info/SOURCES.txt +1 -0
- {isar-1.31.1 → isar-1.32.0}/src/robot_interface/models/mission/status.py +1 -0
- {isar-1.31.1 → isar-1.32.0}/src/robot_interface/telemetry/payloads.py +8 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/state_machine/test_state_machine.py +1 -1
- isar-1.31.1/src/isar/config/logging.conf +0 -58
- {isar-1.31.1 → isar-1.32.0}/.dockerignore +0 -0
- {isar-1.31.1 → isar-1.32.0}/.env.test +0 -0
- {isar-1.31.1 → isar-1.32.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {isar-1.31.1 → isar-1.32.0}/.github/ISSUE_TEMPLATE/feature.md +0 -0
- {isar-1.31.1 → isar-1.32.0}/.github/ISSUE_TEMPLATE/improvement.md +0 -0
- {isar-1.31.1 → isar-1.32.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {isar-1.31.1 → isar-1.32.0}/.github/release.yml +0 -0
- {isar-1.31.1 → isar-1.32.0}/.github/workflows/compile_requirements.yml +0 -0
- {isar-1.31.1 → isar-1.32.0}/.github/workflows/project_automations.yml +0 -0
- {isar-1.31.1 → isar-1.32.0}/.github/workflows/pythonpackage.yml +0 -0
- {isar-1.31.1 → isar-1.32.0}/.github/workflows/pythonpublish.yml +0 -0
- {isar-1.31.1 → isar-1.32.0}/.github/workflows/stale.yml +0 -0
- {isar-1.31.1 → isar-1.32.0}/.gitignore +0 -0
- {isar-1.31.1 → isar-1.32.0}/.pre-commit-config.yaml +0 -0
- {isar-1.31.1 → isar-1.32.0}/LICENSE +0 -0
- {isar-1.31.1 → isar-1.32.0}/README.md +0 -0
- {isar-1.31.1 → isar-1.32.0}/SECURITY.md +0 -0
- {isar-1.31.1 → isar-1.32.0}/docs/Makefile +0 -0
- {isar-1.31.1 → isar-1.32.0}/docs/full_state_machine_diagram.png +0 -0
- {isar-1.31.1 → isar-1.32.0}/docs/make.bat +0 -0
- {isar-1.31.1 → isar-1.32.0}/docs/mission_state_machine_diagram.png +0 -0
- {isar-1.31.1 → isar-1.32.0}/docs/robot_status_state_machine_diagram.png +0 -0
- {isar-1.31.1 → isar-1.32.0}/docs/rst_processing.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/docs/source/conf.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/docs/source/index.rst +0 -0
- {isar-1.31.1 → isar-1.32.0}/docs/source/readme_link.md +0 -0
- {isar-1.31.1 → isar-1.32.0}/docs/update_state_diagram.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/main.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/pyproject.toml +0 -0
- {isar-1.31.1 → isar-1.32.0}/radixconfig.yml +0 -0
- {isar-1.31.1 → isar-1.32.0}/requirements.txt +0 -0
- {isar-1.31.1 → isar-1.32.0}/setup.cfg +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/apis/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/apis/models/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/apis/models/models.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/apis/models/start_mission_definition.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/apis/robot_control/robot_controller.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/apis/schedule/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/apis/security/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/apis/security/authentication.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/config/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/config/certs/ca-cert.pem +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/config/configuration_error.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/config/keyvault/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/config/keyvault/keyvault_error.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/config/keyvault/keyvault_service.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/config/maps/JSP1_intermediate_deck.json +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/config/maps/JSP1_weather_deck.json +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/config/maps/default_map.json +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/config/maps/klab_b.json +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/config/maps/klab_compressor.json +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/config/maps/klab_turtlebot.json +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/config/maps/turtleworld.json +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/config/open_telemetry.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/config/predefined_mission_definition/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/config/predefined_mission_definition/default_exr.json +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/config/predefined_mission_definition/default_mission.json +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/config/predefined_mission_definition/default_turtlebot.json +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/config/predefined_missions/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/config/predefined_missions/default.json +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/config/predefined_missions/default_turtlebot.json +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/eventhandlers/eventhandler.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/mission_planner/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/mission_planner/local_planner.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/mission_planner/mission_planner_interface.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/mission_planner/sequential_task_selector.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/mission_planner/task_selector_interface.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/models/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/modules.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/robot/robot.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/robot/robot_start_mission.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/robot/robot_status.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/robot/robot_stop_mission.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/robot/robot_task_status.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/services/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/services/auth/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/services/auth/azure_credentials.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/services/service_connections/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/services/service_connections/mqtt/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/services/service_connections/mqtt/mqtt_client.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/services/service_connections/mqtt/robot_info_publisher.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/services/service_connections/request_handler.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/services/utilities/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/services/utilities/robot_utilities.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/services/utilities/threaded_request.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/states/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/states/await_next_mission.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/states/blocked_protective_stop.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/states/home.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/states/monitor.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/states/offline.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/states/paused.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/states/returning_home.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/states/robot_standing_still.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/states/stopping.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/states/unknown_status.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/transitions/functions/finish_mission.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/transitions/functions/pause.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/transitions/functions/resume.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/transitions/functions/return_home.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/transitions/functions/robot_status.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/transitions/functions/start_mission.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/transitions/functions/stop.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/transitions/functions/utils.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/transitions/robot_status.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/state_machine/utils/common_event_handlers.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/storage/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/storage/blob_storage.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/storage/local_storage.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/storage/storage_interface.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/storage/uploader.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar/storage/utilities.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar.egg-info/dependency_links.txt +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar.egg-info/entry_points.txt +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar.egg-info/requires.txt +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/isar.egg-info/top_level.txt +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/robot_interface/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/robot_interface/models/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/robot_interface/models/exceptions/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/robot_interface/models/exceptions/robot_exceptions.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/robot_interface/models/initialize/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/robot_interface/models/inspection/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/robot_interface/models/inspection/inspection.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/robot_interface/models/mission/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/robot_interface/models/mission/mission.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/robot_interface/models/mission/task.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/robot_interface/models/robots/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/robot_interface/models/robots/battery_state.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/robot_interface/models/robots/media.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/robot_interface/models/robots/robot_model.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/robot_interface/robot_interface.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/robot_interface/telemetry/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/robot_interface/telemetry/mqtt_client.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/robot_interface/test_robot_interface.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/robot_interface/utilities/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/robot_interface/utilities/json_service.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/src/robot_interface/utilities/uuid_string_factory.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/conftest.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/integration/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/integration/turtlebot/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/integration/turtlebot/config/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/integration/turtlebot/config/maps/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/integration/turtlebot/config/maps/turtleworld.json +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/integration/turtlebot/config/missions/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/integration/turtlebot/config/missions/default.json +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/integration/turtlebot/test_successful_mission.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/apis/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/apis/models/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/apis/models/example_mission_definition.json +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/apis/models/test_start_mission_definition.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/apis/scheduler/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/apis/scheduler/test_scheduler_router.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/apis/security/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/apis/security/test_authentication.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/mission/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/mission/test_mission.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/models/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/models/communication/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/models/communication/test_events.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/services/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/services/readers/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/services/readers/test_mission_reader.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/services/service_connections/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/services/service_connections/echo/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/services/service_connections/test_base_request_handler.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/services/utilities/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/services/utilities/test_queue_utilities.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/services/utilities/test_scheduling_utilities.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/state_machine/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/state_machine/states/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/state_machine/states/test_monitor.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/storage/test_blob_storage.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/isar/storage/test_uploader.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/test_data/test_map_config/test_map_config.json +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/test_data/test_mission_not_working.json +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/test_data/test_mission_working.json +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/test_data/test_mission_working_no_tasks.json +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/test_data/test_thermal_image_mission.json +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/test_double/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/test_double/blob_storage.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/test_double/mission_definition.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/test_double/mqtt_client.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/test_double/pose.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/test_double/request.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/test_double/robot_interface.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/test_double/status.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/test_double/task.py +0 -0
- {isar-1.31.1 → isar-1.32.0}/tests/test_double/token.py +0 -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(
|
|
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
|
-
|
|
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
|
-
|
|
56
|
-
print("*", text.ljust(WIDTH - 4, fillchar), "*")
|
|
54
|
+
logger.info(setting + separator + str(value))
|
|
57
55
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
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
|
+
)
|
|
@@ -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.
|
|
66
|
-
"before":
|
|
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
|
|
@@ -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
|
|
@@ -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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|