isar 1.31.0__py3-none-any.whl → 1.32.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 (58) hide show
  1. isar/apis/api.py +18 -0
  2. isar/apis/schedule/scheduling_controller.py +16 -0
  3. isar/config/log.py +1 -2
  4. isar/config/logging.conf +9 -30
  5. isar/config/open_telemetry.py +2 -8
  6. isar/config/settings.py +4 -0
  7. isar/eventhandlers/eventhandler.py +93 -0
  8. isar/models/events.py +119 -0
  9. isar/modules.py +1 -1
  10. isar/robot/robot.py +16 -18
  11. isar/robot/robot_start_mission.py +8 -14
  12. isar/robot/robot_status.py +2 -3
  13. isar/robot/robot_stop_mission.py +3 -9
  14. isar/robot/robot_task_status.py +3 -7
  15. isar/script.py +9 -17
  16. isar/services/utilities/scheduling_utilities.py +45 -23
  17. isar/state_machine/state_machine.py +104 -9
  18. isar/state_machine/states/await_next_mission.py +46 -11
  19. isar/state_machine/states/blocked_protective_stop.py +24 -15
  20. isar/state_machine/states/home.py +40 -9
  21. isar/state_machine/states/intervention_needed.py +43 -0
  22. isar/state_machine/states/monitor.py +83 -12
  23. isar/state_machine/states/offline.py +25 -13
  24. isar/state_machine/states/paused.py +24 -38
  25. isar/state_machine/states/returning_home.py +75 -14
  26. isar/state_machine/states/robot_standing_still.py +41 -11
  27. isar/state_machine/states/stopping.py +52 -67
  28. isar/state_machine/states/unknown_status.py +37 -64
  29. isar/state_machine/states_enum.py +1 -0
  30. isar/state_machine/transitions/functions/fail_mission.py +7 -0
  31. isar/state_machine/transitions/functions/robot_status.py +4 -5
  32. isar/state_machine/transitions/functions/stop.py +3 -12
  33. isar/state_machine/transitions/mission.py +0 -6
  34. isar/state_machine/transitions/return_home.py +14 -2
  35. isar/state_machine/utils/common_event_handlers.py +166 -0
  36. isar/storage/uploader.py +1 -1
  37. {isar-1.31.0.dist-info → isar-1.32.0.dist-info}/METADATA +1 -1
  38. {isar-1.31.0.dist-info → isar-1.32.0.dist-info}/RECORD +44 -54
  39. robot_interface/models/mission/status.py +1 -0
  40. robot_interface/telemetry/payloads.py +8 -0
  41. isar/models/communication/__init__.py +0 -0
  42. isar/models/communication/message.py +0 -8
  43. isar/models/communication/queues/__init__.py +0 -0
  44. isar/models/communication/queues/events.py +0 -58
  45. isar/models/communication/queues/queue_io.py +0 -12
  46. isar/models/communication/queues/queue_timeout_error.py +0 -2
  47. isar/models/communication/queues/queue_utils.py +0 -38
  48. isar/models/communication/queues/status_queue.py +0 -22
  49. isar/models/mission_metadata/__init__.py +0 -0
  50. isar/services/service_connections/stid/__init__.py +0 -0
  51. isar/services/utilities/queue_utilities.py +0 -39
  52. isar/state_machine/generic_states/idle.py +0 -133
  53. isar/state_machine/generic_states/ongoing_mission.py +0 -309
  54. isar/state_machine/generic_states/robot_unavailable.py +0 -61
  55. {isar-1.31.0.dist-info → isar-1.32.0.dist-info}/WHEEL +0 -0
  56. {isar-1.31.0.dist-info → isar-1.32.0.dist-info}/entry_points.txt +0 -0
  57. {isar-1.31.0.dist-info → isar-1.32.0.dist-info}/licenses/LICENSE +0 -0
  58. {isar-1.31.0.dist-info → isar-1.32.0.dist-info}/top_level.txt +0 -0
@@ -1,22 +1,34 @@
1
- from typing import TYPE_CHECKING
1
+ from typing import TYPE_CHECKING, List
2
2
 
3
- from transitions import State
4
-
5
- from isar.state_machine.generic_states.robot_unavailable import (
6
- RobotUnavailable,
7
- RobotUnavailableStates,
8
- )
3
+ from isar.eventhandlers.eventhandler import EventHandlerBase, EventHandlerMapping
4
+ from isar.models.events import Event
5
+ from robot_interface.models.mission.status import RobotStatus
9
6
 
10
7
  if TYPE_CHECKING:
11
8
  from isar.state_machine.state_machine import StateMachine
12
9
 
13
10
 
14
- class Offline(State, RobotUnavailable):
15
- def __init__(self, state_machine: "StateMachine") -> None:
16
- State.__init__(self, name="offline", on_enter=self.start, on_exit=self.stop)
11
+ class Offline(EventHandlerBase):
12
+
13
+ def __init__(self, state_machine: "StateMachine"):
14
+
15
+ shared_state = state_machine.shared_state
16
+
17
+ def _robot_status_event_handler(event: Event[RobotStatus]):
18
+ robot_status: RobotStatus = event.check()
19
+ if robot_status != RobotStatus.Offline:
20
+ return state_machine.robot_status_changed # type: ignore
21
+ return None
17
22
 
18
- RobotUnavailable.__init__(
19
- self,
23
+ event_handlers: List[EventHandlerMapping] = [
24
+ EventHandlerMapping(
25
+ name="robot_status_event",
26
+ event=shared_state.robot_status,
27
+ handler=_robot_status_event_handler,
28
+ ),
29
+ ]
30
+ super().__init__(
31
+ state_name="offline",
20
32
  state_machine=state_machine,
21
- state=RobotUnavailableStates.Offline,
33
+ event_handler_mappings=event_handlers,
22
34
  )
@@ -1,44 +1,30 @@
1
- import logging
2
- import time
3
- from typing import TYPE_CHECKING, Callable
1
+ from typing import TYPE_CHECKING, List
4
2
 
5
- from transitions import State
6
-
7
- from isar.models.communication.queues.queue_utils import check_for_event
3
+ from isar.eventhandlers.eventhandler import EventHandlerBase, EventHandlerMapping
8
4
 
9
5
  if TYPE_CHECKING:
10
6
  from isar.state_machine.state_machine import StateMachine
11
7
 
12
8
 
13
- class Paused(State):
14
- def __init__(self, state_machine: "StateMachine") -> None:
15
- super().__init__(name="paused", on_enter=self.start)
16
- self.state_machine: "StateMachine" = state_machine
17
- self.logger = logging.getLogger("state_machine")
18
- self.events = self.state_machine.events
19
- self.signal_state_machine_to_stop = state_machine.signal_state_machine_to_stop
20
-
21
- def start(self) -> None:
22
- self.state_machine.update_state()
23
- self._run()
24
-
25
- def _run(self) -> None:
26
- transition: Callable
27
- while True:
28
- if self.signal_state_machine_to_stop.is_set():
29
- self.logger.info(
30
- "Stopping state machine from %s state", self.__class__.__name__
31
- )
32
- break
33
-
34
- if check_for_event(self.events.api_requests.stop_mission.input):
35
- transition = self.state_machine.stop # type: ignore
36
- break
37
-
38
- if check_for_event(self.events.api_requests.resume_mission.input):
39
- transition = self.state_machine.resume # type: ignore
40
- break
41
-
42
- time.sleep(self.state_machine.sleep_time)
43
-
44
- transition()
9
+ class Paused(EventHandlerBase):
10
+
11
+ def __init__(self, state_machine: "StateMachine"):
12
+ events = state_machine.events
13
+
14
+ event_handlers: List[EventHandlerMapping] = [
15
+ EventHandlerMapping(
16
+ name="stop_mission_event",
17
+ event=events.api_requests.stop_mission.input,
18
+ handler=lambda event: state_machine.stop if event.consume_event() else None, # type: ignore
19
+ ),
20
+ EventHandlerMapping(
21
+ name="resume_mission_event",
22
+ event=events.api_requests.resume_mission.input,
23
+ handler=lambda event: state_machine.resume if event.consume_event() else None, # type: ignore
24
+ ),
25
+ ]
26
+ super().__init__(
27
+ state_name="paused",
28
+ state_machine=state_machine,
29
+ event_handler_mappings=event_handlers,
30
+ )
@@ -1,24 +1,85 @@
1
- from typing import TYPE_CHECKING
1
+ from typing import TYPE_CHECKING, Callable, List, Optional
2
2
 
3
- from transitions import State
4
-
5
- from isar.state_machine.generic_states.ongoing_mission import (
6
- OngoingMission,
7
- OngoingMissionStates,
3
+ from isar.eventhandlers.eventhandler import EventHandlerBase, EventHandlerMapping
4
+ from isar.models.events import Event
5
+ from isar.state_machine.utils.common_event_handlers import (
6
+ mission_failed_event_handler,
7
+ mission_started_event_handler,
8
+ stop_mission_event_handler,
9
+ task_status_event_handler,
10
+ task_status_failed_event_handler,
8
11
  )
12
+ from robot_interface.models.exceptions.robot_exceptions import ErrorMessage, ErrorReason
13
+ from robot_interface.models.mission.mission import Mission
14
+ from robot_interface.models.mission.status import TaskStatus
9
15
 
10
16
  if TYPE_CHECKING:
11
17
  from isar.state_machine.state_machine import StateMachine
12
18
 
13
19
 
14
- class ReturningHome(State, OngoingMission):
15
- def __init__(self, state_machine: "StateMachine") -> None:
16
- State.__init__(
17
- self, name="returning_home", on_enter=self.start, on_exit=self.stop
18
- )
20
+ class ReturningHome(EventHandlerBase):
21
+
22
+ def __init__(self, state_machine: "StateMachine"):
23
+ events = state_machine.events
24
+
25
+ def _handle_task_completed(status: TaskStatus):
26
+ if status != TaskStatus.Successful:
27
+ state_machine.current_mission.error_message = ErrorMessage(
28
+ error_reason=ErrorReason.RobotActionException,
29
+ error_description="Return home failed.",
30
+ )
31
+ return state_machine.return_home_failed # type: ignore
32
+ return state_machine.returned_home # type: ignore
33
+
34
+ def _start_mission_event_handler(
35
+ event: Event[Mission],
36
+ ) -> Optional[Callable]:
37
+ if event.has_event():
38
+ return state_machine.stop # type: ignore
39
+ return None
19
40
 
20
- OngoingMission.__init__(
21
- self,
41
+ event_handlers: List[EventHandlerMapping] = [
42
+ EventHandlerMapping(
43
+ name="stop_mission_event",
44
+ event=events.api_requests.stop_mission.input,
45
+ handler=lambda event: stop_mission_event_handler(state_machine, event),
46
+ ),
47
+ EventHandlerMapping(
48
+ name="mission_started_event",
49
+ event=events.robot_service_events.mission_started,
50
+ handler=lambda event: mission_started_event_handler(
51
+ state_machine, event
52
+ ),
53
+ ),
54
+ EventHandlerMapping(
55
+ name="mission_failed_event",
56
+ event=events.robot_service_events.mission_failed,
57
+ handler=lambda event: mission_failed_event_handler(
58
+ state_machine, event
59
+ ),
60
+ ),
61
+ EventHandlerMapping(
62
+ name="start_mission_event",
63
+ event=events.api_requests.start_mission.input,
64
+ handler=_start_mission_event_handler,
65
+ ),
66
+ EventHandlerMapping(
67
+ name="task_status_failed_event",
68
+ event=events.robot_service_events.task_status_failed,
69
+ handler=lambda event: task_status_failed_event_handler(
70
+ state_machine, _handle_task_completed, event
71
+ ),
72
+ ),
73
+ EventHandlerMapping(
74
+ name="task_status_event",
75
+ event=events.robot_service_events.task_status_updated,
76
+ handler=lambda event: task_status_event_handler(
77
+ state_machine, _handle_task_completed, event
78
+ ),
79
+ ),
80
+ ]
81
+ super().__init__(
82
+ state_name="returning_home",
22
83
  state_machine=state_machine,
23
- state=OngoingMissionStates.ReturningHome,
84
+ event_handler_mappings=event_handlers,
24
85
  )
@@ -1,20 +1,50 @@
1
- from typing import TYPE_CHECKING
1
+ from typing import TYPE_CHECKING, List
2
2
 
3
- from transitions import State
3
+ from isar.eventhandlers.eventhandler import EventHandlerBase, EventHandlerMapping
4
+ from isar.state_machine.utils.common_event_handlers import (
5
+ return_home_event_handler,
6
+ robot_status_event_handler,
7
+ start_mission_event_handler,
8
+ stop_mission_event_handler,
9
+ )
10
+ from robot_interface.models.mission.status import RobotStatus
4
11
 
5
12
  if TYPE_CHECKING:
6
13
  from isar.state_machine.state_machine import StateMachine
7
14
 
8
- from isar.state_machine.generic_states.idle import Idle, IdleStates
9
15
 
16
+ class RobotStandingStill(EventHandlerBase):
10
17
 
11
- class RobotStandingStill(State, Idle):
12
- def __init__(self, state_machine: "StateMachine") -> None:
13
- State.__init__(
14
- self, name="robot_standing_still", on_enter=self.start, on_exit=self.stop
15
- )
16
- Idle.__init__(
17
- self,
18
+ def __init__(self, state_machine: "StateMachine"):
19
+ events = state_machine.events
20
+ shared_state = state_machine.shared_state
21
+
22
+ event_handlers: List[EventHandlerMapping] = [
23
+ EventHandlerMapping(
24
+ name="start_mission_event",
25
+ event=events.api_requests.start_mission.input,
26
+ handler=lambda event: start_mission_event_handler(state_machine, event),
27
+ ),
28
+ EventHandlerMapping(
29
+ name="return_home_event",
30
+ event=events.api_requests.return_home.input,
31
+ handler=lambda event: return_home_event_handler(state_machine, event),
32
+ ),
33
+ EventHandlerMapping(
34
+ name="stop_mission_event",
35
+ event=events.api_requests.return_home.input,
36
+ handler=lambda event: stop_mission_event_handler(state_machine, event),
37
+ ),
38
+ EventHandlerMapping(
39
+ name="robot_status_event",
40
+ event=shared_state.robot_status,
41
+ handler=lambda event: robot_status_event_handler(
42
+ state_machine, RobotStatus.Available, event
43
+ ),
44
+ ),
45
+ ]
46
+ super().__init__(
47
+ state_name="robot_standing_still",
18
48
  state_machine=state_machine,
19
- state=IdleStates.RobotStandingStill,
49
+ event_handler_mappings=event_handlers,
20
50
  )
@@ -1,75 +1,60 @@
1
1
  import logging
2
- import time
3
- from queue import Queue
4
- from typing import TYPE_CHECKING, Optional
2
+ from typing import TYPE_CHECKING, Callable, List, Optional
5
3
 
6
- from transitions import State
7
-
8
- from isar.models.communication.queues.queue_utils import check_for_event
4
+ from isar.eventhandlers.eventhandler import EventHandlerBase, EventHandlerMapping
5
+ from isar.models.events import Event
9
6
  from robot_interface.models.exceptions.robot_exceptions import ErrorMessage
10
7
 
11
8
  if TYPE_CHECKING:
12
9
  from isar.state_machine.state_machine import StateMachine
13
10
 
14
11
 
15
- class Stopping(State):
16
- def __init__(self, state_machine: "StateMachine") -> None:
17
- super().__init__(name="stopping", on_enter=self.start, on_exit=self.stop)
18
- self.state_machine: "StateMachine" = state_machine
19
- self.logger = logging.getLogger("state_machine")
20
- self.events = self.state_machine.events
21
- self._count_number_retries: int = 0
22
- self.signal_state_machine_to_stop = state_machine.signal_state_machine_to_stop
23
- self.stopping_return_home_mission: bool = False
24
-
25
- def start(self) -> None:
26
- self.state_machine.update_state()
27
- if self.state_machine.current_mission is not None:
28
- self.stopping_return_home_mission = (
29
- self.state_machine.current_mission._is_return_to_home_mission()
30
- )
31
- self._run()
32
-
33
- def stop(self) -> None:
34
- self._count_number_retries = 0
35
- self.stopping_return_home_mission = False
36
-
37
- def _check_and_handle_failed_stop(self, event: Queue[ErrorMessage]) -> bool:
38
- error_message: Optional[ErrorMessage] = check_for_event(event)
39
- if error_message is not None:
40
- self.logger.warning(error_message.error_description)
41
- if self.stopping_return_home_mission:
42
- self.state_machine.return_home_mission_stopping_failed() # type: ignore
43
- else:
44
- self.state_machine.mission_stopping_failed() # type: ignore
45
- return True
46
- return False
47
-
48
- def _check_and_handle_successful_stop(self, event: Queue[bool]) -> bool:
49
- if check_for_event(event):
50
- if self.stopping_return_home_mission:
51
- self.state_machine.return_home_mission_stopped() # type: ignore
52
- else:
53
- self.state_machine.mission_stopped() # type: ignore
54
- return True
55
- return False
56
-
57
- def _run(self) -> None:
58
- while True:
59
- if self.signal_state_machine_to_stop.is_set():
60
- self.logger.info(
61
- "Stopping state machine from %s state", self.__class__.__name__
62
- )
63
- break
64
-
65
- if self._check_and_handle_failed_stop(
66
- self.events.robot_service_events.mission_failed_to_stop
67
- ):
68
- break
69
-
70
- if self._check_and_handle_successful_stop(
71
- self.events.robot_service_events.mission_successfully_stopped
72
- ):
73
- break
74
-
75
- time.sleep(self.state_machine.sleep_time)
12
+ class Stopping(EventHandlerBase):
13
+
14
+ def __init__(self, state_machine: "StateMachine"):
15
+ logger = logging.getLogger("state_machine")
16
+ events = state_machine.events
17
+
18
+ def _failed_stop_event_handler(
19
+ event: Event[ErrorMessage],
20
+ ) -> Optional[Callable]:
21
+ error_message: Optional[ErrorMessage] = event.consume_event()
22
+ if error_message is not None:
23
+ logger.warning(error_message.error_description)
24
+ if (
25
+ state_machine.current_mission is not None
26
+ and state_machine.current_mission._is_return_to_home_mission()
27
+ ):
28
+ return state_machine.return_home_mission_stopping_failed # type: ignore
29
+ else:
30
+ return state_machine.mission_stopping_failed # type: ignore
31
+ return None
32
+
33
+ def _successful_stop_event_handler(event: Event[bool]) -> Optional[Callable]:
34
+ if event.consume_event():
35
+ if (
36
+ state_machine.current_mission is not None
37
+ and state_machine.current_mission._is_return_to_home_mission()
38
+ ):
39
+ return state_machine.return_home_mission_stopped # type: ignore
40
+ else:
41
+ return state_machine.mission_stopped # type: ignore
42
+ return None
43
+
44
+ event_handlers: List[EventHandlerMapping] = [
45
+ EventHandlerMapping(
46
+ name="failed_stop_event",
47
+ event=events.robot_service_events.mission_failed_to_stop,
48
+ handler=_failed_stop_event_handler,
49
+ ),
50
+ EventHandlerMapping(
51
+ name="successful_stop_event",
52
+ event=events.robot_service_events.mission_successfully_stopped,
53
+ handler=_successful_stop_event_handler,
54
+ ),
55
+ ]
56
+ super().__init__(
57
+ state_name="stopping",
58
+ state_machine=state_machine,
59
+ event_handler_mappings=event_handlers,
60
+ )
@@ -1,74 +1,47 @@
1
- import logging
2
- import time
3
- from queue import Queue
4
- from typing import TYPE_CHECKING
1
+ from typing import TYPE_CHECKING, Callable, List, Optional
5
2
 
6
- from transitions import State
7
-
8
- from isar.models.communication.queues.queue_utils import (
9
- check_for_event,
10
- check_shared_state,
11
- )
12
- from isar.models.communication.queues.status_queue import StatusQueue
3
+ from isar.eventhandlers.eventhandler import EventHandlerBase, EventHandlerMapping
4
+ from isar.models.events import Event
5
+ from isar.state_machine.utils.common_event_handlers import stop_mission_event_handler
13
6
  from robot_interface.models.mission.status import RobotStatus
14
7
 
15
8
  if TYPE_CHECKING:
16
9
  from isar.state_machine.state_machine import StateMachine
17
10
 
18
11
 
19
- class UnknownStatus(State):
20
- def __init__(self, state_machine: "StateMachine") -> None:
21
- super().__init__(name="unknown_status", on_enter=self.start, on_exit=self.stop)
22
- self.state_machine: "StateMachine" = state_machine
23
- self.logger = logging.getLogger("state_machine")
24
- self.events = self.state_machine.events
25
- self.shared_state = self.state_machine.shared_state
26
- self.signal_state_machine_to_stop = state_machine.signal_state_machine_to_stop
27
-
28
- def start(self) -> None:
29
- self.state_machine.update_state()
30
- self._run()
31
-
32
- def stop(self) -> None:
33
- return
34
-
35
- def _check_and_handle_stop_mission_event(self, event: Queue) -> bool:
36
- if check_for_event(event) is not None:
37
- self.state_machine.stop() # type: ignore
38
- return True
39
- return False
40
-
41
- def _check_and_handle_robot_status_event(
42
- self, event: StatusQueue[RobotStatus]
43
- ) -> bool:
44
- robot_status: RobotStatus = check_shared_state(event)
45
- if (
46
- robot_status == RobotStatus.Home
47
- or robot_status == RobotStatus.Offline
48
- or robot_status == RobotStatus.BlockedProtectiveStop
49
- or robot_status == RobotStatus.Available
50
- ):
51
- self.state_machine.robot_status_changed() # type: ignore
52
- return True
12
+ class UnknownStatus(EventHandlerBase):
53
13
 
54
- return False
14
+ def __init__(self, state_machine: "StateMachine"):
15
+ events = state_machine.events
16
+ shared_state = state_machine.shared_state
55
17
 
56
- def _run(self) -> None:
57
- while True:
58
- if self.signal_state_machine_to_stop.is_set():
59
- self.logger.info(
60
- "Stopping state machine from %s state", self.__class__.__name__
61
- )
62
- break
63
-
64
- if self._check_and_handle_stop_mission_event(
65
- self.events.api_requests.stop_mission.input
66
- ):
67
- break
68
-
69
- if self._check_and_handle_robot_status_event(
70
- self.shared_state.robot_status
18
+ def _robot_status_event_handler(
19
+ event: Event[RobotStatus],
20
+ ) -> Optional[Callable]:
21
+ robot_status: RobotStatus = event.check()
22
+ if (
23
+ robot_status == RobotStatus.Home
24
+ or robot_status == RobotStatus.Offline
25
+ or robot_status == RobotStatus.BlockedProtectiveStop
26
+ or robot_status == RobotStatus.Available
71
27
  ):
72
- break
73
-
74
- time.sleep(self.state_machine.sleep_time)
28
+ return state_machine.robot_status_changed # type: ignore
29
+ return None
30
+
31
+ event_handlers: List[EventHandlerMapping] = [
32
+ EventHandlerMapping(
33
+ name="stop_mission_event",
34
+ event=events.api_requests.stop_mission.input,
35
+ handler=lambda event: stop_mission_event_handler(state_machine, event),
36
+ ),
37
+ EventHandlerMapping(
38
+ name="robot_status_event",
39
+ event=shared_state.robot_status,
40
+ handler=_robot_status_event_handler,
41
+ ),
42
+ ]
43
+ super().__init__(
44
+ state_name="unknown_status",
45
+ state_machine=state_machine,
46
+ event_handler_mappings=event_handlers,
47
+ )
@@ -12,6 +12,7 @@ class States(str, Enum):
12
12
  Offline = "offline"
13
13
  BlockedProtectiveStop = "blocked_protective_stop"
14
14
  UnknownStatus = "unknown_status"
15
+ InterventionNeeded = "intervention_needed"
15
16
 
16
17
  def __repr__(self):
17
18
  return self.value
@@ -11,3 +11,10 @@ def report_failed_mission_and_finalize(state_machine: "StateMachine") -> None:
11
11
  state_machine.current_mission.status = MissionStatus.Failed
12
12
  state_machine.publish_task_status(task=state_machine.current_task)
13
13
  state_machine._finalize()
14
+
15
+
16
+ def report_failed_return_home_and_intervention_needed(
17
+ state_machine: "StateMachine",
18
+ ) -> None:
19
+ error_message: str = "Return home failed."
20
+ state_machine.publish_intervention_needed(error_message=error_message)
@@ -1,6 +1,5 @@
1
1
  from typing import TYPE_CHECKING
2
2
 
3
- from isar.models.communication.queues.queue_utils import check_shared_state
4
3
  from robot_interface.models.mission.status import RobotStatus
5
4
 
6
5
  if TYPE_CHECKING:
@@ -8,20 +7,20 @@ if TYPE_CHECKING:
8
7
 
9
8
 
10
9
  def is_offline(state_machine: "StateMachine") -> bool:
11
- robot_status = check_shared_state(state_machine.shared_state.robot_status)
10
+ robot_status = state_machine.shared_state.robot_status.check()
12
11
  return robot_status == RobotStatus.Offline
13
12
 
14
13
 
15
14
  def is_available(state_machine: "StateMachine") -> bool:
16
- robot_status = check_shared_state(state_machine.shared_state.robot_status)
15
+ robot_status = state_machine.shared_state.robot_status.check()
17
16
  return robot_status == RobotStatus.Available
18
17
 
19
18
 
20
19
  def is_home(state_machine: "StateMachine") -> bool:
21
- robot_status = check_shared_state(state_machine.shared_state.robot_status)
20
+ robot_status = state_machine.shared_state.robot_status.check()
22
21
  return robot_status == RobotStatus.Home
23
22
 
24
23
 
25
24
  def is_blocked_protective_stop(state_machine: "StateMachine") -> bool:
26
- robot_status = check_shared_state(state_machine.shared_state.robot_status)
25
+ robot_status = state_machine.shared_state.robot_status.check()
27
26
  return robot_status == RobotStatus.BlockedProtectiveStop
@@ -1,10 +1,5 @@
1
1
  from typing import TYPE_CHECKING
2
2
 
3
- from isar.models.communication.queues.queue_utils import (
4
- check_for_event_without_consumption,
5
- trigger_event_without_data,
6
- )
7
-
8
3
  if TYPE_CHECKING:
9
4
  from isar.state_machine.state_machine import StateMachine
10
5
 
@@ -13,7 +8,7 @@ from robot_interface.models.mission.status import MissionStatus, TaskStatus
13
8
 
14
9
 
15
10
  def trigger_stop_mission_event(state_machine: "StateMachine") -> bool:
16
- trigger_event_without_data(state_machine.events.state_machine_events.stop_mission)
11
+ state_machine.events.state_machine_events.stop_mission.trigger_event(True)
17
12
  return True
18
13
 
19
14
 
@@ -56,9 +51,7 @@ def stop_return_home_mission_cleanup(state_machine: "StateMachine") -> bool:
56
51
  state_machine.reset_state_machine()
57
52
  return True
58
53
 
59
- if not check_for_event_without_consumption(
60
- state_machine.events.api_requests.start_mission.input
61
- ):
54
+ if not state_machine.events.api_requests.start_mission.input.has_event():
62
55
  state_machine.current_mission.status = MissionStatus.Cancelled
63
56
 
64
57
  for task in state_machine.current_mission.tasks:
@@ -81,9 +74,7 @@ def stop_return_home_mission_cleanup(state_machine: "StateMachine") -> bool:
81
74
 
82
75
 
83
76
  def stop_return_home_mission_failed(state_machine: "StateMachine") -> bool:
84
- if check_for_event_without_consumption(
85
- state_machine.events.api_requests.start_mission.input
86
- ):
77
+ if state_machine.events.api_requests.start_mission.input.has_event():
87
78
  return True
88
79
  stopped_mission_response: ControlMissionResponse = (
89
80
  state_machine._make_control_mission_response()
@@ -122,12 +122,6 @@ def get_mission_transitions(state_machine: "StateMachine") -> List[dict]:
122
122
  "dest": state_machine.home_state,
123
123
  "before": def_transition(state_machine, report_failed_mission_and_finalize),
124
124
  },
125
- {
126
- "trigger": "request_mission_start",
127
- "source": state_machine.returning_home_state,
128
- "dest": state_machine.returning_home_state,
129
- "before": def_transition(state_machine, report_failed_mission_and_finalize),
130
- },
131
125
  {
132
126
  "trigger": "mission_failed_to_start",
133
127
  "source": [state_machine.monitor_state, state_machine.returning_home_state],