isar 1.31.1__tar.gz → 1.32.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of isar might be problematic. Click here for more details.
- {isar-1.31.1 → isar-1.32.1}/PKG-INFO +1 -1
- {isar-1.31.1 → isar-1.32.1}/src/isar/apis/api.py +18 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/apis/models/start_mission_definition.py +4 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/apis/schedule/scheduling_controller.py +16 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/config/log.py +1 -2
- isar-1.32.1/src/isar/config/logging.conf +37 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/config/settings.py +4 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/models/events.py +5 -4
- {isar-1.31.1 → isar-1.32.1}/src/isar/script.py +7 -16
- {isar-1.31.1 → isar-1.32.1}/src/isar/services/utilities/scheduling_utilities.py +23 -3
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/state_machine.py +26 -1
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/states/await_next_mission.py +3 -3
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/states/home.py +3 -3
- isar-1.32.1/src/isar/state_machine/states/intervention_needed.py +43 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/states/monitor.py +2 -2
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/states/paused.py +2 -2
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/states/returning_home.py +2 -2
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/states/robot_standing_still.py +3 -3
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/states/unknown_status.py +1 -1
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/states_enum.py +1 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/transitions/functions/fail_mission.py +7 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/transitions/functions/pause.py +1 -1
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/transitions/functions/resume.py +1 -1
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/transitions/functions/start_mission.py +4 -4
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/transitions/functions/stop.py +12 -6
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/transitions/mission.py +4 -10
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/transitions/return_home.py +14 -2
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/utils/common_event_handlers.py +2 -2
- {isar-1.31.1 → isar-1.32.1}/src/isar.egg-info/PKG-INFO +1 -1
- {isar-1.31.1 → isar-1.32.1}/src/isar.egg-info/SOURCES.txt +1 -0
- {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/mission/status.py +1 -0
- {isar-1.31.1 → isar-1.32.1}/src/robot_interface/telemetry/payloads.py +8 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/models/communication/test_events.py +8 -8
- {isar-1.31.1 → isar-1.32.1}/tests/isar/services/utilities/test_scheduling_utilities.py +1 -1
- {isar-1.31.1 → isar-1.32.1}/tests/isar/state_machine/test_state_machine.py +2 -2
- isar-1.31.1/src/isar/config/logging.conf +0 -58
- {isar-1.31.1 → isar-1.32.1}/.dockerignore +0 -0
- {isar-1.31.1 → isar-1.32.1}/.env.test +0 -0
- {isar-1.31.1 → isar-1.32.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {isar-1.31.1 → isar-1.32.1}/.github/ISSUE_TEMPLATE/feature.md +0 -0
- {isar-1.31.1 → isar-1.32.1}/.github/ISSUE_TEMPLATE/improvement.md +0 -0
- {isar-1.31.1 → isar-1.32.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {isar-1.31.1 → isar-1.32.1}/.github/release.yml +0 -0
- {isar-1.31.1 → isar-1.32.1}/.github/workflows/compile_requirements.yml +0 -0
- {isar-1.31.1 → isar-1.32.1}/.github/workflows/project_automations.yml +0 -0
- {isar-1.31.1 → isar-1.32.1}/.github/workflows/pythonpackage.yml +0 -0
- {isar-1.31.1 → isar-1.32.1}/.github/workflows/pythonpublish.yml +0 -0
- {isar-1.31.1 → isar-1.32.1}/.github/workflows/stale.yml +0 -0
- {isar-1.31.1 → isar-1.32.1}/.gitignore +0 -0
- {isar-1.31.1 → isar-1.32.1}/.pre-commit-config.yaml +0 -0
- {isar-1.31.1 → isar-1.32.1}/LICENSE +0 -0
- {isar-1.31.1 → isar-1.32.1}/README.md +0 -0
- {isar-1.31.1 → isar-1.32.1}/SECURITY.md +0 -0
- {isar-1.31.1 → isar-1.32.1}/docs/Makefile +0 -0
- {isar-1.31.1 → isar-1.32.1}/docs/full_state_machine_diagram.png +0 -0
- {isar-1.31.1 → isar-1.32.1}/docs/make.bat +0 -0
- {isar-1.31.1 → isar-1.32.1}/docs/mission_state_machine_diagram.png +0 -0
- {isar-1.31.1 → isar-1.32.1}/docs/robot_status_state_machine_diagram.png +0 -0
- {isar-1.31.1 → isar-1.32.1}/docs/rst_processing.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/docs/source/conf.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/docs/source/index.rst +0 -0
- {isar-1.31.1 → isar-1.32.1}/docs/source/readme_link.md +0 -0
- {isar-1.31.1 → isar-1.32.1}/docs/update_state_diagram.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/main.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/pyproject.toml +0 -0
- {isar-1.31.1 → isar-1.32.1}/radixconfig.yml +0 -0
- {isar-1.31.1 → isar-1.32.1}/requirements.txt +0 -0
- {isar-1.31.1 → isar-1.32.1}/setup.cfg +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/apis/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/apis/models/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/apis/models/models.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/apis/robot_control/robot_controller.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/apis/schedule/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/apis/security/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/apis/security/authentication.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/config/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/config/certs/ca-cert.pem +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/config/configuration_error.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/config/keyvault/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/config/keyvault/keyvault_error.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/config/keyvault/keyvault_service.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/config/maps/JSP1_intermediate_deck.json +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/config/maps/JSP1_weather_deck.json +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/config/maps/default_map.json +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/config/maps/klab_b.json +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/config/maps/klab_compressor.json +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/config/maps/klab_turtlebot.json +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/config/maps/turtleworld.json +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/config/open_telemetry.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/config/predefined_mission_definition/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/config/predefined_mission_definition/default_exr.json +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/config/predefined_mission_definition/default_mission.json +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/config/predefined_mission_definition/default_turtlebot.json +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/config/predefined_missions/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/config/predefined_missions/default.json +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/config/predefined_missions/default_turtlebot.json +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/eventhandlers/eventhandler.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/mission_planner/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/mission_planner/local_planner.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/mission_planner/mission_planner_interface.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/mission_planner/sequential_task_selector.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/mission_planner/task_selector_interface.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/models/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/modules.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/robot/robot.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/robot/robot_start_mission.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/robot/robot_status.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/robot/robot_stop_mission.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/robot/robot_task_status.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/services/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/services/auth/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/services/auth/azure_credentials.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/services/service_connections/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/services/service_connections/mqtt/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/services/service_connections/mqtt/mqtt_client.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/services/service_connections/mqtt/robot_info_publisher.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/services/service_connections/request_handler.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/services/utilities/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/services/utilities/robot_utilities.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/services/utilities/threaded_request.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/states/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/states/blocked_protective_stop.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/states/offline.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/states/stopping.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/transitions/functions/finish_mission.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/transitions/functions/return_home.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/transitions/functions/robot_status.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/transitions/functions/utils.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/state_machine/transitions/robot_status.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/storage/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/storage/blob_storage.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/storage/local_storage.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/storage/storage_interface.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/storage/uploader.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar/storage/utilities.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar.egg-info/dependency_links.txt +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar.egg-info/entry_points.txt +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar.egg-info/requires.txt +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/isar.egg-info/top_level.txt +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/robot_interface/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/exceptions/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/exceptions/robot_exceptions.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/initialize/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/inspection/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/inspection/inspection.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/mission/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/mission/mission.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/mission/task.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/robots/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/robots/battery_state.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/robots/media.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/robot_interface/models/robots/robot_model.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/robot_interface/robot_interface.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/robot_interface/telemetry/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/robot_interface/telemetry/mqtt_client.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/robot_interface/test_robot_interface.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/robot_interface/utilities/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/robot_interface/utilities/json_service.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/src/robot_interface/utilities/uuid_string_factory.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/conftest.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/integration/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/integration/turtlebot/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/integration/turtlebot/config/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/integration/turtlebot/config/maps/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/integration/turtlebot/config/maps/turtleworld.json +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/integration/turtlebot/config/missions/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/integration/turtlebot/config/missions/default.json +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/integration/turtlebot/test_successful_mission.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/apis/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/apis/models/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/apis/models/example_mission_definition.json +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/apis/models/test_start_mission_definition.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/apis/scheduler/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/apis/scheduler/test_scheduler_router.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/apis/security/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/apis/security/test_authentication.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/mission/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/mission/test_mission.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/models/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/models/communication/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/services/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/services/readers/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/services/readers/test_mission_reader.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/services/service_connections/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/services/service_connections/echo/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/services/service_connections/test_base_request_handler.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/services/utilities/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/services/utilities/test_queue_utilities.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/state_machine/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/state_machine/states/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/state_machine/states/test_monitor.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/storage/test_blob_storage.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/isar/storage/test_uploader.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/test_data/test_map_config/test_map_config.json +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/test_data/test_mission_not_working.json +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/test_data/test_mission_working.json +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/test_data/test_mission_working_no_tasks.json +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/test_data/test_thermal_image_mission.json +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/test_double/__init__.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/test_double/blob_storage.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/test_double/mission_definition.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/test_double/mqtt_client.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/test_double/pose.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/test_double/request.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/test_double/robot_interface.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/test_double/status.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/tests/test_double/task.py +0 -0
- {isar-1.31.1 → isar-1.32.1}/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,
|
|
@@ -53,6 +53,7 @@ class StartMissionTaskDefinition(BaseModel):
|
|
|
53
53
|
|
|
54
54
|
|
|
55
55
|
class StartMissionDefinition(BaseModel):
|
|
56
|
+
id: Optional[str] = None
|
|
56
57
|
tasks: List[StartMissionTaskDefinition]
|
|
57
58
|
name: Optional[str] = None
|
|
58
59
|
start_pose: Optional[InputPose] = None
|
|
@@ -84,7 +85,10 @@ def to_isar_mission(
|
|
|
84
85
|
if start_mission_definition.start_pose:
|
|
85
86
|
start_pose = start_mission_definition.start_pose.to_alitra_pose()
|
|
86
87
|
|
|
88
|
+
id = start_mission_definition.id if start_mission_definition.id else uuid4_string()
|
|
89
|
+
|
|
87
90
|
return Mission(
|
|
91
|
+
id=id,
|
|
88
92
|
tasks=isar_tasks,
|
|
89
93
|
name=isar_mission_name,
|
|
90
94
|
start_pose=start_pose,
|
|
@@ -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):
|
|
@@ -70,13 +70,13 @@ class Events:
|
|
|
70
70
|
|
|
71
71
|
class APIEvent(Generic[T1, T2]):
|
|
72
72
|
"""
|
|
73
|
-
Creates
|
|
74
|
-
api to state machine while the
|
|
73
|
+
Creates request and response event. The events are defined such that the request is from
|
|
74
|
+
api to state machine while the response is from state machine to api.
|
|
75
75
|
"""
|
|
76
76
|
|
|
77
77
|
def __init__(self):
|
|
78
|
-
self.
|
|
79
|
-
self.
|
|
78
|
+
self.request: Event[T1] = Event()
|
|
79
|
+
self.response: Event[T2] = Event()
|
|
80
80
|
|
|
81
81
|
|
|
82
82
|
class APIRequests:
|
|
@@ -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,12 +290,32 @@ 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
|
-
api_event.
|
|
314
|
+
api_event.request.trigger_event(input)
|
|
295
315
|
try:
|
|
296
|
-
return api_event.
|
|
316
|
+
return api_event.response.consume_event(timeout=self.queue_timeout)
|
|
297
317
|
except EventTimeoutError as e:
|
|
298
318
|
self.logger.error("Queue timed out")
|
|
299
|
-
api_event.
|
|
319
|
+
api_event.request.clear_event()
|
|
300
320
|
self.logger.error("No output received for command to state machine")
|
|
301
321
|
raise e
|
|
@@ -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
|
|
|
@@ -343,7 +368,7 @@ class StateMachine(object):
|
|
|
343
368
|
)
|
|
344
369
|
|
|
345
370
|
def _queue_empty_response(self) -> None:
|
|
346
|
-
self.events.api_requests.stop_mission.
|
|
371
|
+
self.events.api_requests.stop_mission.response.put(
|
|
347
372
|
ControlMissionResponse(
|
|
348
373
|
mission_id="None",
|
|
349
374
|
mission_status="None",
|
|
@@ -24,17 +24,17 @@ class AwaitNextMission(EventHandlerBase):
|
|
|
24
24
|
event_handlers: List[EventHandlerMapping] = [
|
|
25
25
|
EventHandlerMapping(
|
|
26
26
|
name="start_mission_event",
|
|
27
|
-
event=events.api_requests.start_mission.
|
|
27
|
+
event=events.api_requests.start_mission.request,
|
|
28
28
|
handler=lambda event: start_mission_event_handler(state_machine, event),
|
|
29
29
|
),
|
|
30
30
|
EventHandlerMapping(
|
|
31
31
|
name="return_home_event",
|
|
32
|
-
event=events.api_requests.return_home.
|
|
32
|
+
event=events.api_requests.return_home.request,
|
|
33
33
|
handler=lambda event: return_home_event_handler(state_machine, event),
|
|
34
34
|
),
|
|
35
35
|
EventHandlerMapping(
|
|
36
36
|
name="stop_mission_event",
|
|
37
|
-
event=events.api_requests.return_home.
|
|
37
|
+
event=events.api_requests.return_home.request,
|
|
38
38
|
handler=lambda event: stop_mission_event_handler(state_machine, event),
|
|
39
39
|
),
|
|
40
40
|
]
|
|
@@ -22,17 +22,17 @@ class Home(EventHandlerBase):
|
|
|
22
22
|
event_handlers: List[EventHandlerMapping] = [
|
|
23
23
|
EventHandlerMapping(
|
|
24
24
|
name="start_mission_event",
|
|
25
|
-
event=events.api_requests.start_mission.
|
|
25
|
+
event=events.api_requests.start_mission.request,
|
|
26
26
|
handler=lambda event: start_mission_event_handler(state_machine, event),
|
|
27
27
|
),
|
|
28
28
|
EventHandlerMapping(
|
|
29
29
|
name="return_home_event",
|
|
30
|
-
event=events.api_requests.return_home.
|
|
30
|
+
event=events.api_requests.return_home.request,
|
|
31
31
|
handler=lambda event: return_home_event_handler(state_machine, event),
|
|
32
32
|
),
|
|
33
33
|
EventHandlerMapping(
|
|
34
34
|
name="stop_mission_event",
|
|
35
|
-
event=events.api_requests.return_home.
|
|
35
|
+
event=events.api_requests.return_home.request,
|
|
36
36
|
handler=lambda event: stop_mission_event_handler(state_machine, event),
|
|
37
37
|
),
|
|
38
38
|
EventHandlerMapping(
|
|
@@ -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.response.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.request,
|
|
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.request,
|
|
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
|
+
)
|
|
@@ -49,12 +49,12 @@ class Monitor(EventHandlerBase):
|
|
|
49
49
|
event_handlers: List[EventHandlerMapping] = [
|
|
50
50
|
EventHandlerMapping(
|
|
51
51
|
name="stop_mission_event",
|
|
52
|
-
event=events.api_requests.stop_mission.
|
|
52
|
+
event=events.api_requests.stop_mission.request,
|
|
53
53
|
handler=lambda event: stop_mission_event_handler(state_machine, event),
|
|
54
54
|
),
|
|
55
55
|
EventHandlerMapping(
|
|
56
56
|
name="pause_mission_event",
|
|
57
|
-
event=events.api_requests.pause_mission.
|
|
57
|
+
event=events.api_requests.pause_mission.request,
|
|
58
58
|
handler=_pause_mission_event_handler,
|
|
59
59
|
),
|
|
60
60
|
EventHandlerMapping(
|
|
@@ -14,12 +14,12 @@ class Paused(EventHandlerBase):
|
|
|
14
14
|
event_handlers: List[EventHandlerMapping] = [
|
|
15
15
|
EventHandlerMapping(
|
|
16
16
|
name="stop_mission_event",
|
|
17
|
-
event=events.api_requests.stop_mission.
|
|
17
|
+
event=events.api_requests.stop_mission.request,
|
|
18
18
|
handler=lambda event: state_machine.stop if event.consume_event() else None, # type: ignore
|
|
19
19
|
),
|
|
20
20
|
EventHandlerMapping(
|
|
21
21
|
name="resume_mission_event",
|
|
22
|
-
event=events.api_requests.resume_mission.
|
|
22
|
+
event=events.api_requests.resume_mission.request,
|
|
23
23
|
handler=lambda event: state_machine.resume if event.consume_event() else None, # type: ignore
|
|
24
24
|
),
|
|
25
25
|
]
|
|
@@ -41,7 +41,7 @@ class ReturningHome(EventHandlerBase):
|
|
|
41
41
|
event_handlers: List[EventHandlerMapping] = [
|
|
42
42
|
EventHandlerMapping(
|
|
43
43
|
name="stop_mission_event",
|
|
44
|
-
event=events.api_requests.stop_mission.
|
|
44
|
+
event=events.api_requests.stop_mission.request,
|
|
45
45
|
handler=lambda event: stop_mission_event_handler(state_machine, event),
|
|
46
46
|
),
|
|
47
47
|
EventHandlerMapping(
|
|
@@ -60,7 +60,7 @@ class ReturningHome(EventHandlerBase):
|
|
|
60
60
|
),
|
|
61
61
|
EventHandlerMapping(
|
|
62
62
|
name="start_mission_event",
|
|
63
|
-
event=events.api_requests.start_mission.
|
|
63
|
+
event=events.api_requests.start_mission.request,
|
|
64
64
|
handler=_start_mission_event_handler,
|
|
65
65
|
),
|
|
66
66
|
EventHandlerMapping(
|
|
@@ -22,17 +22,17 @@ class RobotStandingStill(EventHandlerBase):
|
|
|
22
22
|
event_handlers: List[EventHandlerMapping] = [
|
|
23
23
|
EventHandlerMapping(
|
|
24
24
|
name="start_mission_event",
|
|
25
|
-
event=events.api_requests.start_mission.
|
|
25
|
+
event=events.api_requests.start_mission.request,
|
|
26
26
|
handler=lambda event: start_mission_event_handler(state_machine, event),
|
|
27
27
|
),
|
|
28
28
|
EventHandlerMapping(
|
|
29
29
|
name="return_home_event",
|
|
30
|
-
event=events.api_requests.return_home.
|
|
30
|
+
event=events.api_requests.return_home.request,
|
|
31
31
|
handler=lambda event: return_home_event_handler(state_machine, event),
|
|
32
32
|
),
|
|
33
33
|
EventHandlerMapping(
|
|
34
34
|
name="stop_mission_event",
|
|
35
|
-
event=events.api_requests.return_home.
|
|
35
|
+
event=events.api_requests.return_home.request,
|
|
36
36
|
handler=lambda event: stop_mission_event_handler(state_machine, event),
|
|
37
37
|
),
|
|
38
38
|
EventHandlerMapping(
|
|
@@ -31,7 +31,7 @@ class UnknownStatus(EventHandlerBase):
|
|
|
31
31
|
event_handlers: List[EventHandlerMapping] = [
|
|
32
32
|
EventHandlerMapping(
|
|
33
33
|
name="stop_mission_event",
|
|
34
|
-
event=events.api_requests.stop_mission.
|
|
34
|
+
event=events.api_requests.stop_mission.request,
|
|
35
35
|
handler=lambda event: stop_mission_event_handler(state_machine, event),
|
|
36
36
|
),
|
|
37
37
|
EventHandlerMapping(
|
|
@@ -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)
|
|
@@ -29,7 +29,7 @@ def pause_mission(state_machine: "StateMachine") -> bool:
|
|
|
29
29
|
paused_mission_response: ControlMissionResponse = (
|
|
30
30
|
state_machine._make_control_mission_response()
|
|
31
31
|
)
|
|
32
|
-
state_machine.events.api_requests.pause_mission.
|
|
32
|
+
state_machine.events.api_requests.pause_mission.response.put(
|
|
33
33
|
paused_mission_response
|
|
34
34
|
)
|
|
35
35
|
|
|
@@ -35,7 +35,7 @@ def resume_mission(state_machine: "StateMachine") -> bool:
|
|
|
35
35
|
resume_mission_response: ControlMissionResponse = (
|
|
36
36
|
state_machine._make_control_mission_response()
|
|
37
37
|
)
|
|
38
|
-
state_machine.events.api_requests.resume_mission.
|
|
38
|
+
state_machine.events.api_requests.resume_mission.response.put(
|
|
39
39
|
resume_mission_response
|
|
40
40
|
)
|
|
41
41
|
|
|
@@ -11,12 +11,12 @@ from robot_interface.models.exceptions.robot_exceptions import (
|
|
|
11
11
|
from robot_interface.models.mission.status import MissionStatus, TaskStatus
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
def
|
|
15
|
-
state_machine.events.api_requests.start_mission.
|
|
14
|
+
def acknowledge_mission(state_machine: "StateMachine") -> bool:
|
|
15
|
+
state_machine.events.api_requests.start_mission.response.put(True)
|
|
16
16
|
return True
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
def
|
|
19
|
+
def prepare_state_machine_before_mission(state_machine: "StateMachine") -> bool:
|
|
20
20
|
state_machine.logger.info(
|
|
21
21
|
"Initiating mission:\n"
|
|
22
22
|
f" Mission ID: {state_machine.current_mission.id}\n"
|
|
@@ -70,5 +70,5 @@ def trigger_start_mission_event(state_machine: "StateMachine") -> bool:
|
|
|
70
70
|
|
|
71
71
|
|
|
72
72
|
def _initialization_failed(state_machine: "StateMachine") -> None:
|
|
73
|
-
state_machine.events.api_requests.start_mission.
|
|
73
|
+
state_machine.events.api_requests.start_mission.response.put(False)
|
|
74
74
|
state_machine._finalize()
|
|
@@ -31,7 +31,9 @@ def stop_mission_cleanup(state_machine: "StateMachine") -> bool:
|
|
|
31
31
|
stopped_mission_response: ControlMissionResponse = (
|
|
32
32
|
state_machine._make_control_mission_response()
|
|
33
33
|
)
|
|
34
|
-
state_machine.events.api_requests.stop_mission.
|
|
34
|
+
state_machine.events.api_requests.stop_mission.response.put(
|
|
35
|
+
stopped_mission_response
|
|
36
|
+
)
|
|
35
37
|
state_machine.publish_task_status(task=state_machine.current_task)
|
|
36
38
|
state_machine._finalize()
|
|
37
39
|
return True
|
|
@@ -41,7 +43,9 @@ def stop_mission_failed(state_machine: "StateMachine") -> bool:
|
|
|
41
43
|
stopped_mission_response: ControlMissionResponse = (
|
|
42
44
|
state_machine._make_control_mission_response()
|
|
43
45
|
)
|
|
44
|
-
state_machine.events.api_requests.stop_mission.
|
|
46
|
+
state_machine.events.api_requests.stop_mission.response.put(
|
|
47
|
+
stopped_mission_response
|
|
48
|
+
)
|
|
45
49
|
return True
|
|
46
50
|
|
|
47
51
|
|
|
@@ -51,7 +55,7 @@ def stop_return_home_mission_cleanup(state_machine: "StateMachine") -> bool:
|
|
|
51
55
|
state_machine.reset_state_machine()
|
|
52
56
|
return True
|
|
53
57
|
|
|
54
|
-
if not state_machine.events.api_requests.start_mission.
|
|
58
|
+
if not state_machine.events.api_requests.start_mission.request.has_event():
|
|
55
59
|
state_machine.current_mission.status = MissionStatus.Cancelled
|
|
56
60
|
|
|
57
61
|
for task in state_machine.current_mission.tasks:
|
|
@@ -65,7 +69,7 @@ def stop_return_home_mission_cleanup(state_machine: "StateMachine") -> bool:
|
|
|
65
69
|
stopped_mission_response: ControlMissionResponse = (
|
|
66
70
|
state_machine._make_control_mission_response()
|
|
67
71
|
)
|
|
68
|
-
state_machine.events.api_requests.stop_mission.
|
|
72
|
+
state_machine.events.api_requests.stop_mission.response.put(
|
|
69
73
|
stopped_mission_response
|
|
70
74
|
)
|
|
71
75
|
|
|
@@ -74,10 +78,12 @@ def stop_return_home_mission_cleanup(state_machine: "StateMachine") -> bool:
|
|
|
74
78
|
|
|
75
79
|
|
|
76
80
|
def stop_return_home_mission_failed(state_machine: "StateMachine") -> bool:
|
|
77
|
-
if state_machine.events.api_requests.start_mission.
|
|
81
|
+
if state_machine.events.api_requests.start_mission.request.has_event():
|
|
78
82
|
return True
|
|
79
83
|
stopped_mission_response: ControlMissionResponse = (
|
|
80
84
|
state_machine._make_control_mission_response()
|
|
81
85
|
)
|
|
82
|
-
state_machine.events.api_requests.stop_mission.
|
|
86
|
+
state_machine.events.api_requests.stop_mission.response.put(
|
|
87
|
+
stopped_mission_response
|
|
88
|
+
)
|
|
83
89
|
return True
|