isar 1.33.8__py3-none-any.whl → 1.34.0__py3-none-any.whl
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/apis/models/models.py +2 -5
- isar/config/settings.py +1 -8
- isar/models/events.py +9 -10
- isar/modules.py +5 -11
- isar/robot/robot.py +109 -24
- isar/robot/robot_monitor_mission.py +399 -0
- isar/robot/robot_status.py +0 -10
- isar/robot/robot_stop_mission.py +7 -7
- isar/robot/robot_upload_inspection.py +80 -0
- isar/services/utilities/scheduling_utilities.py +30 -10
- isar/state_machine/state_machine.py +7 -223
- isar/state_machine/states/await_next_mission.py +7 -6
- isar/state_machine/states/going_to_lockdown.py +29 -39
- isar/state_machine/states/home.py +11 -15
- isar/state_machine/states/intervention_needed.py +7 -6
- isar/state_machine/states/lockdown.py +8 -7
- isar/state_machine/states/monitor.py +39 -53
- isar/state_machine/states/paused.py +19 -17
- isar/state_machine/states/pausing.py +12 -27
- isar/state_machine/states/pausing_return_home.py +12 -27
- isar/state_machine/states/recharging.py +17 -11
- isar/state_machine/states/return_home_paused.py +27 -23
- isar/state_machine/states/returning_home.py +62 -55
- isar/state_machine/states/stopping.py +13 -31
- isar/state_machine/states/stopping_go_to_lockdown.py +18 -38
- isar/state_machine/states/stopping_return_home.py +26 -26
- isar/state_machine/states/unknown_status.py +7 -4
- isar/state_machine/transitions/functions/fail_mission.py +1 -9
- isar/state_machine/transitions/functions/finish_mission.py +2 -32
- isar/state_machine/transitions/functions/pause.py +8 -7
- isar/state_machine/transitions/functions/resume.py +3 -12
- isar/state_machine/transitions/functions/return_home.py +1 -16
- isar/state_machine/transitions/functions/robot_status.py +2 -12
- isar/state_machine/transitions/functions/start_mission.py +2 -44
- isar/state_machine/transitions/functions/stop.py +4 -33
- isar/state_machine/transitions/mission.py +2 -17
- isar/state_machine/transitions/return_home.py +3 -24
- isar/state_machine/utils/common_event_handlers.py +39 -122
- {isar-1.33.8.dist-info → isar-1.34.0.dist-info}/METADATA +2 -63
- {isar-1.33.8.dist-info → isar-1.34.0.dist-info}/RECORD +46 -47
- robot_interface/models/mission/task.py +0 -10
- robot_interface/robot_interface.py +25 -1
- isar/mission_planner/sequential_task_selector.py +0 -23
- isar/mission_planner/task_selector_interface.py +0 -31
- isar/robot/robot_task_status.py +0 -87
- {isar-1.33.8.dist-info → isar-1.34.0.dist-info}/WHEEL +0 -0
- {isar-1.33.8.dist-info → isar-1.34.0.dist-info}/entry_points.txt +0 -0
- {isar-1.33.8.dist-info → isar-1.34.0.dist-info}/licenses/LICENSE +0 -0
- {isar-1.33.8.dist-info → isar-1.34.0.dist-info}/top_level.txt +0 -0
|
@@ -19,28 +19,30 @@ class Paused(EventHandlerBase):
|
|
|
19
19
|
event: Event[float],
|
|
20
20
|
) -> Optional[Callable]:
|
|
21
21
|
battery_level: float = event.check()
|
|
22
|
-
if battery_level
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
22
|
+
if battery_level >= settings.ROBOT_MISSION_BATTERY_START_THRESHOLD:
|
|
23
|
+
return None
|
|
24
|
+
|
|
25
|
+
state_machine.publish_mission_aborted(
|
|
26
|
+
"Robot battery too low to continue mission", True
|
|
27
|
+
)
|
|
28
|
+
state_machine.print_transitions()
|
|
29
|
+
state_machine.logger.warning(
|
|
30
|
+
"Cancelling current mission due to low battery"
|
|
31
|
+
)
|
|
32
|
+
return state_machine.stop # type: ignore
|
|
32
33
|
|
|
33
34
|
def _send_to_lockdown_event_handler(
|
|
34
35
|
event: Event[bool],
|
|
35
36
|
) -> Optional[Callable]:
|
|
36
37
|
should_lockdown: bool = event.consume_event()
|
|
37
|
-
if should_lockdown:
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
38
|
+
if not should_lockdown:
|
|
39
|
+
return None
|
|
40
|
+
|
|
41
|
+
state_machine.print_transitions()
|
|
42
|
+
state_machine.logger.warning(
|
|
43
|
+
"Cancelling current mission due to robot going to lockdown"
|
|
44
|
+
)
|
|
45
|
+
return state_machine.stop_go_to_lockdown # type: ignore
|
|
44
46
|
|
|
45
47
|
event_handlers: List[EventHandlerMapping] = [
|
|
46
48
|
EventHandlerMapping(
|
|
@@ -4,7 +4,6 @@ from isar.apis.models.models import ControlMissionResponse
|
|
|
4
4
|
from isar.eventhandlers.eventhandler import EventHandlerBase, EventHandlerMapping
|
|
5
5
|
from isar.models.events import Event
|
|
6
6
|
from robot_interface.models.exceptions.robot_exceptions import ErrorMessage
|
|
7
|
-
from robot_interface.models.mission.status import MissionStatus, TaskStatus
|
|
8
7
|
|
|
9
8
|
if TYPE_CHECKING:
|
|
10
9
|
from isar.state_machine.state_machine import StateMachine
|
|
@@ -20,40 +19,26 @@ class Pausing(EventHandlerBase):
|
|
|
20
19
|
) -> Optional[Callable]:
|
|
21
20
|
error_message: Optional[ErrorMessage] = event.consume_event()
|
|
22
21
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
)
|
|
22
|
+
if error_message is None:
|
|
23
|
+
return None
|
|
26
24
|
|
|
27
25
|
state_machine.events.api_requests.pause_mission.response.trigger_event(
|
|
28
|
-
|
|
26
|
+
ControlMissionResponse(
|
|
27
|
+
success=False, failure_reason=error_message.error_reason
|
|
28
|
+
)
|
|
29
29
|
)
|
|
30
30
|
|
|
31
|
-
state_machine.
|
|
32
|
-
state_machine.send_task_status()
|
|
33
|
-
|
|
34
|
-
if error_message is not None:
|
|
35
|
-
return state_machine.mission_pausing_failed # type: ignore
|
|
36
|
-
return None
|
|
31
|
+
return state_machine.mission_pausing_failed # type: ignore
|
|
37
32
|
|
|
38
33
|
def _successful_pause_event_handler(event: Event[bool]) -> Optional[Callable]:
|
|
39
|
-
if event.consume_event():
|
|
40
|
-
|
|
41
|
-
state_machine.current_mission.status = MissionStatus.Paused
|
|
42
|
-
state_machine.current_task.status = TaskStatus.Paused
|
|
43
|
-
|
|
44
|
-
paused_mission_response: ControlMissionResponse = (
|
|
45
|
-
state_machine._make_control_mission_response()
|
|
46
|
-
)
|
|
47
|
-
|
|
48
|
-
state_machine.events.api_requests.pause_mission.response.trigger_event(
|
|
49
|
-
paused_mission_response
|
|
50
|
-
)
|
|
34
|
+
if not event.consume_event():
|
|
35
|
+
return None
|
|
51
36
|
|
|
52
|
-
|
|
53
|
-
|
|
37
|
+
state_machine.events.api_requests.pause_mission.response.trigger_event(
|
|
38
|
+
ControlMissionResponse(success=True)
|
|
39
|
+
)
|
|
54
40
|
|
|
55
|
-
|
|
56
|
-
return None
|
|
41
|
+
return state_machine.mission_paused # type:ignore
|
|
57
42
|
|
|
58
43
|
event_handlers: List[EventHandlerMapping] = [
|
|
59
44
|
EventHandlerMapping(
|
|
@@ -4,7 +4,6 @@ from isar.apis.models.models import ControlMissionResponse
|
|
|
4
4
|
from isar.eventhandlers.eventhandler import EventHandlerBase, EventHandlerMapping
|
|
5
5
|
from isar.models.events import Event
|
|
6
6
|
from robot_interface.models.exceptions.robot_exceptions import ErrorMessage
|
|
7
|
-
from robot_interface.models.mission.status import MissionStatus, TaskStatus
|
|
8
7
|
|
|
9
8
|
if TYPE_CHECKING:
|
|
10
9
|
from isar.state_machine.state_machine import StateMachine
|
|
@@ -20,40 +19,26 @@ class PausingReturnHome(EventHandlerBase):
|
|
|
20
19
|
) -> Optional[Callable]:
|
|
21
20
|
error_message: Optional[ErrorMessage] = event.consume_event()
|
|
22
21
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
)
|
|
22
|
+
if error_message is None:
|
|
23
|
+
return None
|
|
26
24
|
|
|
27
25
|
state_machine.events.api_requests.pause_mission.response.trigger_event(
|
|
28
|
-
|
|
26
|
+
ControlMissionResponse(
|
|
27
|
+
success=False, failure_reason=error_message.error_reason
|
|
28
|
+
)
|
|
29
29
|
)
|
|
30
30
|
|
|
31
|
-
state_machine.
|
|
32
|
-
state_machine.send_task_status()
|
|
33
|
-
|
|
34
|
-
if error_message is not None:
|
|
35
|
-
return state_machine.return_home_mission_pausing_failed # type: ignore
|
|
36
|
-
return None
|
|
31
|
+
return state_machine.return_home_mission_pausing_failed # type: ignore
|
|
37
32
|
|
|
38
33
|
def _successful_pause_event_handler(event: Event[bool]) -> Optional[Callable]:
|
|
39
|
-
if event.consume_event():
|
|
40
|
-
|
|
41
|
-
state_machine.current_mission.status = MissionStatus.Paused
|
|
42
|
-
state_machine.current_task.status = TaskStatus.Paused
|
|
43
|
-
|
|
44
|
-
paused_mission_response: ControlMissionResponse = (
|
|
45
|
-
state_machine._make_control_mission_response()
|
|
46
|
-
)
|
|
47
|
-
|
|
48
|
-
state_machine.events.api_requests.pause_mission.response.trigger_event(
|
|
49
|
-
paused_mission_response
|
|
50
|
-
)
|
|
34
|
+
if not event.consume_event():
|
|
35
|
+
return None
|
|
51
36
|
|
|
52
|
-
|
|
53
|
-
|
|
37
|
+
state_machine.events.api_requests.pause_mission.response.trigger_event(
|
|
38
|
+
ControlMissionResponse(success=True)
|
|
39
|
+
)
|
|
54
40
|
|
|
55
|
-
|
|
56
|
-
return None
|
|
41
|
+
return state_machine.return_home_mission_paused # type: ignore
|
|
57
42
|
|
|
58
43
|
event_handlers: List[EventHandlerMapping] = [
|
|
59
44
|
EventHandlerMapping(
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import TYPE_CHECKING, List
|
|
1
|
+
from typing import TYPE_CHECKING, List, Optional
|
|
2
2
|
|
|
3
3
|
from isar.apis.models.models import LockdownResponse
|
|
4
4
|
from isar.config.settings import settings
|
|
@@ -18,23 +18,29 @@ class Recharging(EventHandlerBase):
|
|
|
18
18
|
|
|
19
19
|
def robot_battery_level_updated_handler(event: Event[float]):
|
|
20
20
|
battery_level: float = event.check()
|
|
21
|
-
if battery_level
|
|
22
|
-
return
|
|
23
|
-
|
|
21
|
+
if battery_level < settings.ROBOT_BATTERY_RECHARGE_THRESHOLD:
|
|
22
|
+
return None
|
|
23
|
+
|
|
24
|
+
return state_machine.robot_recharged # type: ignore
|
|
24
25
|
|
|
25
26
|
def robot_offline_handler(event: Event[RobotStatus]):
|
|
26
|
-
robot_status: RobotStatus = event.check()
|
|
27
|
+
robot_status: Optional[RobotStatus] = event.check()
|
|
28
|
+
|
|
29
|
+
if robot_status is None:
|
|
30
|
+
return None
|
|
31
|
+
|
|
27
32
|
if robot_status == RobotStatus.Offline:
|
|
28
33
|
return state_machine.robot_went_offline # type: ignore
|
|
29
34
|
|
|
30
35
|
def _send_to_lockdown_event_handler(event: Event[bool]):
|
|
31
36
|
should_lockdown: bool = event.consume_event()
|
|
32
|
-
if should_lockdown:
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
37
|
+
if not should_lockdown:
|
|
38
|
+
return None
|
|
39
|
+
|
|
40
|
+
events.api_requests.send_to_lockdown.response.trigger_event(
|
|
41
|
+
LockdownResponse(lockdown_started=True)
|
|
42
|
+
)
|
|
43
|
+
return state_machine.reached_lockdown # type: ignore
|
|
38
44
|
|
|
39
45
|
event_handlers: List[EventHandlerMapping] = [
|
|
40
46
|
EventHandlerMapping(
|
|
@@ -20,38 +20,42 @@ class ReturnHomePaused(EventHandlerBase):
|
|
|
20
20
|
event: Event[float],
|
|
21
21
|
) -> Optional[Callable]:
|
|
22
22
|
battery_level: float = event.check()
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
|
|
24
|
+
if battery_level >= settings.ROBOT_MISSION_BATTERY_START_THRESHOLD:
|
|
25
|
+
return None
|
|
26
|
+
|
|
27
|
+
return state_machine.resume # type: ignore
|
|
26
28
|
|
|
27
29
|
def _start_mission_event_handler(
|
|
28
30
|
event: Event[Mission],
|
|
29
31
|
) -> Optional[Callable]:
|
|
30
|
-
if event.has_event():
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
32
|
+
if not event.has_event():
|
|
33
|
+
return None
|
|
34
|
+
|
|
35
|
+
if not state_machine.battery_level_is_above_mission_start_threshold():
|
|
36
|
+
state_machine.events.api_requests.start_mission.request.consume_event()
|
|
37
|
+
response = MissionStartResponse(
|
|
38
|
+
mission_id=None,
|
|
39
|
+
mission_started=False,
|
|
40
|
+
mission_not_started_reason="Robot battery too low",
|
|
41
|
+
)
|
|
42
|
+
state_machine.events.api_requests.start_mission.response.trigger_event(
|
|
43
|
+
response
|
|
44
|
+
)
|
|
45
|
+
return None
|
|
46
|
+
return state_machine.stop_return_home # type: ignore
|
|
44
47
|
|
|
45
48
|
def _send_to_lockdown_event_handler(
|
|
46
49
|
event: Event[bool],
|
|
47
50
|
) -> Optional[Callable]:
|
|
48
51
|
should_lockdown: bool = event.consume_event()
|
|
49
|
-
if should_lockdown:
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
52
|
+
if not should_lockdown:
|
|
53
|
+
return None
|
|
54
|
+
|
|
55
|
+
events.api_requests.send_to_lockdown.response.trigger_event(
|
|
56
|
+
LockdownResponse(lockdown_started=True)
|
|
57
|
+
)
|
|
58
|
+
return state_machine.resume_lockdown # type: ignore
|
|
55
59
|
|
|
56
60
|
event_handlers: List[EventHandlerMapping] = [
|
|
57
61
|
EventHandlerMapping(
|
|
@@ -3,15 +3,10 @@ from typing import TYPE_CHECKING, Callable, List, Optional
|
|
|
3
3
|
from isar.apis.models.models import LockdownResponse, MissionStartResponse
|
|
4
4
|
from isar.eventhandlers.eventhandler import EventHandlerBase, EventHandlerMapping
|
|
5
5
|
from isar.models.events import Event
|
|
6
|
-
from isar.state_machine.utils.common_event_handlers import
|
|
7
|
-
|
|
8
|
-
mission_started_event_handler,
|
|
9
|
-
task_status_event_handler,
|
|
10
|
-
task_status_failed_event_handler,
|
|
11
|
-
)
|
|
12
|
-
from robot_interface.models.exceptions.robot_exceptions import ErrorMessage, ErrorReason
|
|
6
|
+
from isar.state_machine.utils.common_event_handlers import mission_started_event_handler
|
|
7
|
+
from robot_interface.models.exceptions.robot_exceptions import ErrorMessage
|
|
13
8
|
from robot_interface.models.mission.mission import Mission
|
|
14
|
-
from robot_interface.models.mission.status import
|
|
9
|
+
from robot_interface.models.mission.status import MissionStatus
|
|
15
10
|
|
|
16
11
|
if TYPE_CHECKING:
|
|
17
12
|
from isar.state_machine.state_machine import StateMachine
|
|
@@ -24,51 +19,74 @@ class ReturningHome(EventHandlerBase):
|
|
|
24
19
|
events = state_machine.events
|
|
25
20
|
|
|
26
21
|
def _pause_mission_event_handler(event: Event[bool]) -> Optional[Callable]:
|
|
27
|
-
if event.consume_event():
|
|
28
|
-
return
|
|
29
|
-
return None
|
|
30
|
-
|
|
31
|
-
def _handle_task_completed(status: TaskStatus):
|
|
32
|
-
if status != TaskStatus.Successful:
|
|
33
|
-
state_machine.current_mission.error_message = ErrorMessage(
|
|
34
|
-
error_reason=ErrorReason.RobotActionException,
|
|
35
|
-
error_description="Return home failed.",
|
|
36
|
-
)
|
|
37
|
-
self.failed_return_home_attemps += 1
|
|
38
|
-
return state_machine.return_home_failed # type: ignore
|
|
22
|
+
if not event.consume_event():
|
|
23
|
+
return None
|
|
39
24
|
|
|
40
|
-
|
|
41
|
-
return state_machine.starting_recharging # type: ignore
|
|
42
|
-
else:
|
|
43
|
-
return state_machine.returned_home # type: ignore
|
|
25
|
+
return state_machine.pause_return_home # type: ignore
|
|
44
26
|
|
|
45
27
|
def _start_mission_event_handler(
|
|
46
28
|
event: Event[Mission],
|
|
47
29
|
) -> Optional[Callable]:
|
|
48
|
-
if event.has_event():
|
|
30
|
+
if not event.has_event():
|
|
31
|
+
return None
|
|
32
|
+
|
|
33
|
+
if not state_machine.battery_level_is_above_mission_start_threshold():
|
|
34
|
+
state_machine.events.api_requests.start_mission.request.consume_event()
|
|
35
|
+
response = MissionStartResponse(
|
|
36
|
+
mission_id=None,
|
|
37
|
+
mission_started=False,
|
|
38
|
+
mission_not_started_reason="Robot battery too low",
|
|
39
|
+
)
|
|
40
|
+
state_machine.events.api_requests.start_mission.response.trigger_event(
|
|
41
|
+
response
|
|
42
|
+
)
|
|
43
|
+
return None
|
|
44
|
+
|
|
45
|
+
return state_machine.stop_return_home # type: ignore
|
|
46
|
+
|
|
47
|
+
def _mission_status_event_handler(
|
|
48
|
+
event: Event[MissionStatus],
|
|
49
|
+
) -> Optional[Callable]:
|
|
50
|
+
mission_status: Optional[MissionStatus] = event.consume_event()
|
|
51
|
+
|
|
52
|
+
if mission_status and mission_status not in [
|
|
53
|
+
MissionStatus.InProgress,
|
|
54
|
+
MissionStatus.NotStarted,
|
|
55
|
+
MissionStatus.Paused,
|
|
56
|
+
]:
|
|
57
|
+
if mission_status != MissionStatus.Successful:
|
|
58
|
+
self.failed_return_home_attemps += 1
|
|
59
|
+
return state_machine.return_home_failed # type: ignore
|
|
60
|
+
|
|
61
|
+
self.failed_return_home_attemps = 0
|
|
49
62
|
if not state_machine.battery_level_is_above_mission_start_threshold():
|
|
50
|
-
state_machine.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
mission_started=False,
|
|
54
|
-
mission_not_started_reason="Robot battery too low",
|
|
55
|
-
)
|
|
56
|
-
state_machine.events.api_requests.start_mission.response.trigger_event(
|
|
57
|
-
response
|
|
58
|
-
)
|
|
59
|
-
return None
|
|
60
|
-
return state_machine.stop_return_home # type: ignore
|
|
63
|
+
return state_machine.starting_recharging # type: ignore
|
|
64
|
+
else:
|
|
65
|
+
return state_machine.returned_home # type: ignore
|
|
61
66
|
return None
|
|
62
67
|
|
|
63
68
|
def _send_to_lockdown_event_handler(
|
|
64
69
|
event: Event[bool],
|
|
65
70
|
) -> Optional[Callable]:
|
|
66
71
|
should_lockdown: bool = event.consume_event()
|
|
67
|
-
if should_lockdown:
|
|
68
|
-
|
|
69
|
-
|
|
72
|
+
if not should_lockdown:
|
|
73
|
+
return None
|
|
74
|
+
|
|
75
|
+
events.api_requests.send_to_lockdown.response.trigger_event(
|
|
76
|
+
LockdownResponse(lockdown_started=True)
|
|
77
|
+
)
|
|
78
|
+
return state_machine.go_to_lockdown # type: ignore
|
|
79
|
+
|
|
80
|
+
def _mission_failed_event_handler(
|
|
81
|
+
event: Event[Optional[ErrorMessage]],
|
|
82
|
+
) -> Optional[Callable]:
|
|
83
|
+
mission_failed: Optional[ErrorMessage] = event.consume_event()
|
|
84
|
+
if mission_failed is not None:
|
|
85
|
+
state_machine.logger.warning(
|
|
86
|
+
f"Failed to initiate return home because: "
|
|
87
|
+
f"{mission_failed.error_description}"
|
|
70
88
|
)
|
|
71
|
-
return state_machine.
|
|
89
|
+
return state_machine.return_home_failed # type: ignore
|
|
72
90
|
return None
|
|
73
91
|
|
|
74
92
|
event_handlers: List[EventHandlerMapping] = [
|
|
@@ -87,9 +105,7 @@ class ReturningHome(EventHandlerBase):
|
|
|
87
105
|
EventHandlerMapping(
|
|
88
106
|
name="mission_failed_event",
|
|
89
107
|
event=events.robot_service_events.mission_failed,
|
|
90
|
-
handler=
|
|
91
|
-
state_machine, event
|
|
92
|
-
),
|
|
108
|
+
handler=_mission_failed_event_handler,
|
|
93
109
|
),
|
|
94
110
|
EventHandlerMapping(
|
|
95
111
|
name="start_mission_event",
|
|
@@ -97,18 +113,9 @@ class ReturningHome(EventHandlerBase):
|
|
|
97
113
|
handler=_start_mission_event_handler,
|
|
98
114
|
),
|
|
99
115
|
EventHandlerMapping(
|
|
100
|
-
name="
|
|
101
|
-
event=events.robot_service_events.
|
|
102
|
-
handler=
|
|
103
|
-
state_machine, _handle_task_completed, event
|
|
104
|
-
),
|
|
105
|
-
),
|
|
106
|
-
EventHandlerMapping(
|
|
107
|
-
name="task_status_event",
|
|
108
|
-
event=events.robot_service_events.task_status_updated,
|
|
109
|
-
handler=lambda event: task_status_event_handler(
|
|
110
|
-
state_machine, _handle_task_completed, event
|
|
111
|
-
),
|
|
116
|
+
name="mission_status_event",
|
|
117
|
+
event=events.robot_service_events.mission_status_updated,
|
|
118
|
+
handler=_mission_status_event_handler,
|
|
112
119
|
),
|
|
113
120
|
EventHandlerMapping(
|
|
114
121
|
name="send_to_lockdown_event",
|
|
@@ -4,7 +4,6 @@ from isar.apis.models.models import ControlMissionResponse
|
|
|
4
4
|
from isar.eventhandlers.eventhandler import EventHandlerBase, EventHandlerMapping
|
|
5
5
|
from isar.models.events import Event
|
|
6
6
|
from robot_interface.models.exceptions.robot_exceptions import ErrorMessage
|
|
7
|
-
from robot_interface.models.mission.status import MissionStatus, TaskStatus
|
|
8
7
|
|
|
9
8
|
if TYPE_CHECKING:
|
|
10
9
|
from isar.state_machine.state_machine import StateMachine
|
|
@@ -16,46 +15,29 @@ class Stopping(EventHandlerBase):
|
|
|
16
15
|
events = state_machine.events
|
|
17
16
|
|
|
18
17
|
def _stop_mission_cleanup() -> None:
|
|
19
|
-
if state_machine.current_mission is None:
|
|
20
|
-
state_machine._queue_empty_response()
|
|
21
|
-
state_machine.reset_state_machine()
|
|
22
|
-
return None
|
|
23
|
-
|
|
24
|
-
state_machine.current_mission.status = MissionStatus.Cancelled
|
|
25
|
-
|
|
26
|
-
for task in state_machine.current_mission.tasks:
|
|
27
|
-
if task.status in [
|
|
28
|
-
TaskStatus.NotStarted,
|
|
29
|
-
TaskStatus.InProgress,
|
|
30
|
-
TaskStatus.Paused,
|
|
31
|
-
]:
|
|
32
|
-
task.status = TaskStatus.Cancelled
|
|
33
|
-
|
|
34
|
-
stopped_mission_response: ControlMissionResponse = (
|
|
35
|
-
state_machine._make_control_mission_response()
|
|
36
|
-
)
|
|
37
18
|
state_machine.events.api_requests.stop_mission.response.trigger_event(
|
|
38
|
-
|
|
19
|
+
ControlMissionResponse(success=True)
|
|
39
20
|
)
|
|
40
|
-
state_machine.
|
|
41
|
-
state_machine._finalize()
|
|
21
|
+
state_machine.print_transitions()
|
|
42
22
|
return None
|
|
43
23
|
|
|
44
24
|
def _failed_stop_event_handler(
|
|
45
25
|
event: Event[ErrorMessage],
|
|
46
26
|
) -> Optional[Callable]:
|
|
47
27
|
error_message: Optional[ErrorMessage] = event.consume_event()
|
|
48
|
-
if error_message is
|
|
49
|
-
return
|
|
50
|
-
|
|
28
|
+
if error_message is None:
|
|
29
|
+
return None
|
|
30
|
+
|
|
31
|
+
return state_machine.mission_stopping_failed # type: ignore
|
|
51
32
|
|
|
52
33
|
def _successful_stop_event_handler(event: Event[bool]) -> Optional[Callable]:
|
|
53
|
-
if event.consume_event():
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
34
|
+
if not event.consume_event():
|
|
35
|
+
return None
|
|
36
|
+
|
|
37
|
+
_stop_mission_cleanup()
|
|
38
|
+
if not state_machine.battery_level_is_above_mission_start_threshold():
|
|
39
|
+
return state_machine.request_return_home # type: ignore
|
|
40
|
+
return state_machine.mission_stopped # type: ignore
|
|
59
41
|
|
|
60
42
|
event_handlers: List[EventHandlerMapping] = [
|
|
61
43
|
EventHandlerMapping(
|
|
@@ -4,7 +4,6 @@ from isar.apis.models.models import LockdownResponse
|
|
|
4
4
|
from isar.eventhandlers.eventhandler import EventHandlerBase, EventHandlerMapping
|
|
5
5
|
from isar.models.events import Event
|
|
6
6
|
from robot_interface.models.exceptions.robot_exceptions import ErrorMessage
|
|
7
|
-
from robot_interface.models.mission.status import MissionStatus, TaskStatus
|
|
8
7
|
|
|
9
8
|
if TYPE_CHECKING:
|
|
10
9
|
from isar.state_machine.state_machine import StateMachine
|
|
@@ -15,50 +14,31 @@ class StoppingGoToLockdown(EventHandlerBase):
|
|
|
15
14
|
def __init__(self, state_machine: "StateMachine"):
|
|
16
15
|
events = state_machine.events
|
|
17
16
|
|
|
18
|
-
def _stop_mission_cleanup() -> None:
|
|
19
|
-
if state_machine.current_mission is None:
|
|
20
|
-
state_machine._queue_empty_response()
|
|
21
|
-
state_machine.reset_state_machine()
|
|
22
|
-
return None
|
|
23
|
-
|
|
24
|
-
state_machine.current_mission.status = MissionStatus.Cancelled
|
|
25
|
-
|
|
26
|
-
for task in state_machine.current_mission.tasks:
|
|
27
|
-
if task.status in [
|
|
28
|
-
TaskStatus.NotStarted,
|
|
29
|
-
TaskStatus.InProgress,
|
|
30
|
-
TaskStatus.Paused,
|
|
31
|
-
]:
|
|
32
|
-
task.status = TaskStatus.Cancelled
|
|
33
|
-
|
|
34
|
-
state_machine.publish_task_status(task=state_machine.current_task)
|
|
35
|
-
return None
|
|
36
|
-
|
|
37
17
|
def _failed_stop_event_handler(
|
|
38
18
|
event: Event[ErrorMessage],
|
|
39
19
|
) -> Optional[Callable]:
|
|
40
20
|
error_message: Optional[ErrorMessage] = event.consume_event()
|
|
41
|
-
if error_message is
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
21
|
+
if error_message is None:
|
|
22
|
+
return None
|
|
23
|
+
|
|
24
|
+
events.api_requests.send_to_lockdown.response.trigger_event(
|
|
25
|
+
LockdownResponse(
|
|
26
|
+
lockdown_started=False,
|
|
27
|
+
failure_reason="Failed to stop ongoing mission",
|
|
47
28
|
)
|
|
48
|
-
|
|
49
|
-
return
|
|
29
|
+
)
|
|
30
|
+
return state_machine.mission_stopping_failed # type: ignore
|
|
50
31
|
|
|
51
32
|
def _successful_stop_event_handler(event: Event[bool]) -> Optional[Callable]:
|
|
52
|
-
if event.consume_event():
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
return None
|
|
33
|
+
if not event.consume_event():
|
|
34
|
+
return None
|
|
35
|
+
|
|
36
|
+
state_machine.publish_mission_aborted("Robot being sent to lockdown", True)
|
|
37
|
+
|
|
38
|
+
events.api_requests.send_to_lockdown.response.trigger_event(
|
|
39
|
+
LockdownResponse(lockdown_started=True)
|
|
40
|
+
)
|
|
41
|
+
return state_machine.request_lockdown_mission # type: ignore
|
|
62
42
|
|
|
63
43
|
event_handlers: List[EventHandlerMapping] = [
|
|
64
44
|
EventHandlerMapping(
|
|
@@ -21,38 +21,38 @@ class StoppingReturnHome(EventHandlerBase):
|
|
|
21
21
|
event: Event[ErrorMessage],
|
|
22
22
|
) -> Optional[Callable]:
|
|
23
23
|
error_message: Optional[ErrorMessage] = event.consume_event()
|
|
24
|
-
if error_message is
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
state_machine.events.api_requests.start_mission.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
24
|
+
if error_message is None:
|
|
25
|
+
return None
|
|
26
|
+
|
|
27
|
+
logger.warning(error_message.error_description)
|
|
28
|
+
mission: Mission = (
|
|
29
|
+
state_machine.events.api_requests.start_mission.request.consume_event()
|
|
30
|
+
)
|
|
31
|
+
state_machine.events.api_requests.start_mission.response.trigger_event(
|
|
32
|
+
MissionStartResponse(
|
|
33
|
+
mission_id=mission.id,
|
|
34
|
+
mission_started=False,
|
|
35
|
+
mission_not_started_reason="Failed to cancel return home mission",
|
|
35
36
|
)
|
|
36
|
-
|
|
37
|
-
return
|
|
37
|
+
)
|
|
38
|
+
return state_machine.return_home_mission_stopping_failed # type: ignore
|
|
38
39
|
|
|
39
40
|
def _successful_stop_event_handler(event: Event[bool]) -> Optional[Callable]:
|
|
40
|
-
if event.consume_event():
|
|
41
|
-
|
|
42
|
-
state_machine.events.api_requests.start_mission.request.consume_event()
|
|
43
|
-
)
|
|
41
|
+
if not event.consume_event():
|
|
42
|
+
return None
|
|
44
43
|
|
|
45
|
-
|
|
44
|
+
mission: Mission = (
|
|
45
|
+
state_machine.events.api_requests.start_mission.request.consume_event()
|
|
46
|
+
)
|
|
46
47
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
if mission:
|
|
49
|
+
state_machine.start_mission(mission=mission)
|
|
50
|
+
return state_machine.request_mission_start # type: ignore
|
|
50
51
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
return None
|
|
52
|
+
state_machine.logger.error(
|
|
53
|
+
"Stopped return home without a new mission to start"
|
|
54
|
+
)
|
|
55
|
+
return state_machine.request_return_home # type: ignore
|
|
56
56
|
|
|
57
57
|
event_handlers: List[EventHandlerMapping] = [
|
|
58
58
|
EventHandlerMapping(
|