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.

Files changed (49) hide show
  1. isar/apis/models/models.py +2 -5
  2. isar/config/settings.py +1 -8
  3. isar/models/events.py +9 -10
  4. isar/modules.py +5 -11
  5. isar/robot/robot.py +109 -24
  6. isar/robot/robot_monitor_mission.py +399 -0
  7. isar/robot/robot_status.py +0 -10
  8. isar/robot/robot_stop_mission.py +7 -7
  9. isar/robot/robot_upload_inspection.py +80 -0
  10. isar/services/utilities/scheduling_utilities.py +30 -10
  11. isar/state_machine/state_machine.py +7 -223
  12. isar/state_machine/states/await_next_mission.py +7 -6
  13. isar/state_machine/states/going_to_lockdown.py +29 -39
  14. isar/state_machine/states/home.py +11 -15
  15. isar/state_machine/states/intervention_needed.py +7 -6
  16. isar/state_machine/states/lockdown.py +8 -7
  17. isar/state_machine/states/monitor.py +39 -53
  18. isar/state_machine/states/paused.py +19 -17
  19. isar/state_machine/states/pausing.py +12 -27
  20. isar/state_machine/states/pausing_return_home.py +12 -27
  21. isar/state_machine/states/recharging.py +17 -11
  22. isar/state_machine/states/return_home_paused.py +27 -23
  23. isar/state_machine/states/returning_home.py +62 -55
  24. isar/state_machine/states/stopping.py +13 -31
  25. isar/state_machine/states/stopping_go_to_lockdown.py +18 -38
  26. isar/state_machine/states/stopping_return_home.py +26 -26
  27. isar/state_machine/states/unknown_status.py +7 -4
  28. isar/state_machine/transitions/functions/fail_mission.py +1 -9
  29. isar/state_machine/transitions/functions/finish_mission.py +2 -32
  30. isar/state_machine/transitions/functions/pause.py +8 -7
  31. isar/state_machine/transitions/functions/resume.py +3 -12
  32. isar/state_machine/transitions/functions/return_home.py +1 -16
  33. isar/state_machine/transitions/functions/robot_status.py +2 -12
  34. isar/state_machine/transitions/functions/start_mission.py +2 -44
  35. isar/state_machine/transitions/functions/stop.py +4 -33
  36. isar/state_machine/transitions/mission.py +2 -17
  37. isar/state_machine/transitions/return_home.py +3 -24
  38. isar/state_machine/utils/common_event_handlers.py +39 -122
  39. {isar-1.33.8.dist-info → isar-1.34.0.dist-info}/METADATA +2 -63
  40. {isar-1.33.8.dist-info → isar-1.34.0.dist-info}/RECORD +46 -47
  41. robot_interface/models/mission/task.py +0 -10
  42. robot_interface/robot_interface.py +25 -1
  43. isar/mission_planner/sequential_task_selector.py +0 -23
  44. isar/mission_planner/task_selector_interface.py +0 -31
  45. isar/robot/robot_task_status.py +0 -87
  46. {isar-1.33.8.dist-info → isar-1.34.0.dist-info}/WHEEL +0 -0
  47. {isar-1.33.8.dist-info → isar-1.34.0.dist-info}/entry_points.txt +0 -0
  48. {isar-1.33.8.dist-info → isar-1.34.0.dist-info}/licenses/LICENSE +0 -0
  49. {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 < settings.ROBOT_MISSION_BATTERY_START_THRESHOLD:
23
- state_machine.publish_mission_aborted(
24
- "Robot battery too low to continue mission", True
25
- )
26
- state_machine._finalize()
27
- state_machine.logger.warning(
28
- "Cancelling current mission due to low battery"
29
- )
30
- return state_machine.stop # type: ignore
31
- return None
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
- state_machine._finalize()
39
- state_machine.logger.warning(
40
- "Cancelling current mission due to robot going to lockdown"
41
- )
42
- return state_machine.stop_go_to_lockdown # type: ignore
43
- return None
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
- paused_mission_response: ControlMissionResponse = (
24
- state_machine._make_control_mission_response()
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
- paused_mission_response
26
+ ControlMissionResponse(
27
+ success=False, failure_reason=error_message.error_reason
28
+ )
29
29
  )
30
30
 
31
- state_machine.publish_mission_status()
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
- state_machine.publish_mission_status()
53
- state_machine.send_task_status()
37
+ state_machine.events.api_requests.pause_mission.response.trigger_event(
38
+ ControlMissionResponse(success=True)
39
+ )
54
40
 
55
- return state_machine.mission_paused # type:ignore
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
- paused_mission_response: ControlMissionResponse = (
24
- state_machine._make_control_mission_response()
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
- paused_mission_response
26
+ ControlMissionResponse(
27
+ success=False, failure_reason=error_message.error_reason
28
+ )
29
29
  )
30
30
 
31
- state_machine.publish_mission_status()
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
- state_machine.publish_mission_status()
53
- state_machine.send_task_status()
37
+ state_machine.events.api_requests.pause_mission.response.trigger_event(
38
+ ControlMissionResponse(success=True)
39
+ )
54
40
 
55
- return state_machine.return_home_mission_paused # type: ignore
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 >= settings.ROBOT_BATTERY_RECHARGE_THRESHOLD:
22
- return state_machine.robot_recharged # type: ignore
23
- return None
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
- events.api_requests.send_to_lockdown.response.trigger_event(
34
- LockdownResponse(lockdown_started=True)
35
- )
36
- return state_machine.reached_lockdown # type: ignore
37
- return None
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
- if battery_level < settings.ROBOT_MISSION_BATTERY_START_THRESHOLD:
24
- return state_machine.resume # type: ignore
25
- return None
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
- if not state_machine.battery_level_is_above_mission_start_threshold():
32
- state_machine.events.api_requests.start_mission.request.consume_event()
33
- response = MissionStartResponse(
34
- mission_id=None,
35
- mission_started=False,
36
- mission_not_started_reason="Robot battery too low",
37
- )
38
- state_machine.events.api_requests.start_mission.response.trigger_event(
39
- response
40
- )
41
- return None
42
- return state_machine.stop_return_home # type: ignore
43
- return None
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
- events.api_requests.send_to_lockdown.response.trigger_event(
51
- LockdownResponse(lockdown_started=True)
52
- )
53
- return state_machine.resume_lockdown # type: ignore
54
- return None
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
- mission_failed_event_handler,
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 TaskStatus
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 state_machine.pause_return_home # type: ignore
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
- if not state_machine.battery_level_is_above_mission_start_threshold():
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.events.api_requests.start_mission.request.consume_event()
51
- response = MissionStartResponse(
52
- mission_id=None,
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
- events.api_requests.send_to_lockdown.response.trigger_event(
69
- LockdownResponse(lockdown_started=True)
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.go_to_lockdown # type: ignore
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=lambda event: mission_failed_event_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="task_status_failed_event",
101
- event=events.robot_service_events.task_status_failed,
102
- handler=lambda event: task_status_failed_event_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
- stopped_mission_response
19
+ ControlMissionResponse(success=True)
39
20
  )
40
- state_machine.publish_task_status(task=state_machine.current_task)
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 not None:
49
- return state_machine.mission_stopping_failed # type: ignore
50
- return None
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
- _stop_mission_cleanup()
55
- if not state_machine.battery_level_is_above_mission_start_threshold():
56
- return state_machine.request_return_home # type: ignore
57
- return state_machine.mission_stopped # type: ignore
58
- return None
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 not None:
42
- events.api_requests.send_to_lockdown.response.trigger_event(
43
- LockdownResponse(
44
- lockdown_started=False,
45
- failure_reason="Failed to stop ongoing mission",
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
- return state_machine.mission_stopping_failed # type: ignore
49
- return None
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
- state_machine.publish_mission_aborted(
54
- "Robot being sent to lockdown", True
55
- )
56
- _stop_mission_cleanup()
57
- events.api_requests.send_to_lockdown.response.trigger_event(
58
- LockdownResponse(lockdown_started=True)
59
- )
60
- return state_machine.request_lockdown_mission # type: ignore
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 not None:
25
- logger.warning(error_message.error_description)
26
- mission: Mission = (
27
- state_machine.events.api_requests.start_mission.request.consume_event()
28
- )
29
- state_machine.events.api_requests.start_mission.response.trigger_event(
30
- MissionStartResponse(
31
- mission_id=mission.id,
32
- mission_started=False,
33
- mission_not_started_reason="Failed to cancel return home mission",
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
- return state_machine.return_home_mission_stopping_failed # type: ignore
37
- return None
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
- mission: Mission = (
42
- state_machine.events.api_requests.start_mission.request.consume_event()
43
- )
41
+ if not event.consume_event():
42
+ return None
44
43
 
45
- state_machine.reset_state_machine()
44
+ mission: Mission = (
45
+ state_machine.events.api_requests.start_mission.request.consume_event()
46
+ )
46
47
 
47
- if mission:
48
- state_machine.start_mission(mission=mission)
49
- return state_machine.request_mission_start # type: ignore
48
+ if mission:
49
+ state_machine.start_mission(mission=mission)
50
+ return state_machine.request_mission_start # type: ignore
50
51
 
51
- state_machine.logger.error(
52
- "Stopped return home without a new mission to start"
53
- )
54
- return state_machine.request_return_home # type: ignore
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(