Skip to content

Commit 77f6fa7

Browse files
committed
Remove unecessary state class inheritance
1 parent 5e697c7 commit 77f6fa7

51 files changed

Lines changed: 1074 additions & 1187 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/isar/state_machine/state.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
import logging
22
import time
3-
from abc import ABC
43
from collections.abc import Callable
54
from copy import deepcopy
65
from dataclasses import dataclass
7-
from typing import Any, TypeVar
6+
from typing import Any
87

98
from isar.config.settings import settings
109
from isar.models.events import EmptyMessage, Event, Events
1110
from isar.state_machine.states_enum import States
1211

13-
T_state_co = TypeVar("T_state_co", bound="State", covariant=True)
14-
Transition = Callable[[Events], T_state_co]
12+
Transition = Callable[[Events], "State"]
1513

1614

1715
@dataclass
@@ -27,7 +25,7 @@ class TimeoutHandlerMapping:
2725
handler: Callable[[], Transition | None]
2826

2927

30-
class State(ABC):
28+
class State:
3129
def __init__(
3230
self,
3331
signal_exit_event: Event[EmptyMessage],

src/isar/state_machine/states/await_next_mission.py

Lines changed: 43 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -16,59 +16,55 @@
1616
from robot_interface.models.mission.mission import Mission
1717

1818

19-
class AwaitNextMission(State):
19+
def AwaitNextMission(events: Events) -> State:
2020

21-
def __init__(self, events: Events):
22-
23-
event_handlers: list[EventHandlerMapping] = [
24-
EventHandlerMapping[Mission](
25-
event=events.api_requests.start_mission.request,
26-
handler=lambda mission: Monitor.transition_and_start_mission(
27-
mission, True
28-
),
29-
),
30-
EventHandlerMapping[EmptyMessage](
31-
event=events.api_requests.return_home.request,
32-
handler=lambda _: ReturningHome.transition_and_start_mission(True),
33-
),
34-
EventHandlerMapping[str](
35-
event=events.api_requests.stop_mission.request,
36-
handler=lambda mission_id: Stopping.transition_and_trigger_stop_and_respond_to_API(
37-
mission_id
38-
),
39-
),
40-
EventHandlerMapping[EmptyMessage](
41-
event=events.api_requests.send_to_lockdown.request,
42-
handler=lambda _: GoingToLockdown.transition_and_start_mission_and_report_to_api(),
21+
event_handlers: list[EventHandlerMapping] = [
22+
EventHandlerMapping[Mission](
23+
event=events.api_requests.start_mission.request,
24+
handler=lambda mission: Monitor.transition_and_start_mission(mission, True),
25+
),
26+
EventHandlerMapping[EmptyMessage](
27+
event=events.api_requests.return_home.request,
28+
handler=lambda _: ReturningHome.transition_and_start_mission(True),
29+
),
30+
EventHandlerMapping[str](
31+
event=events.api_requests.stop_mission.request,
32+
handler=lambda mission_id: Stopping.transition_and_trigger_stop_and_respond_to_API(
33+
mission_id
4334
),
44-
EventHandlerMapping[EmptyMessage](
45-
event=events.robot_service_events.battery_below_mission_threshold,
46-
handler=lambda _: GoingToRecharging.transition_and_start_return_home(),
47-
),
48-
EventHandlerMapping[EmptyMessage](
49-
event=events.api_requests.set_maintenance_mode.request,
50-
handler=lambda _: Maintenance.transition_and_reply_to_API(),
51-
),
52-
]
35+
),
36+
EventHandlerMapping[EmptyMessage](
37+
event=events.api_requests.send_to_lockdown.request,
38+
handler=lambda _: GoingToLockdown.transition_and_start_mission_and_report_to_api(),
39+
),
40+
EventHandlerMapping[EmptyMessage](
41+
event=events.robot_service_events.battery_below_mission_threshold,
42+
handler=lambda _: GoingToRecharging.transition_and_start_return_home(),
43+
),
44+
EventHandlerMapping[EmptyMessage](
45+
event=events.api_requests.set_maintenance_mode.request,
46+
handler=lambda _: Maintenance.transition_and_reply_to_API(),
47+
),
48+
]
5349

54-
timers: list[TimeoutHandlerMapping] = [
55-
TimeoutHandlerMapping(
56-
name="should_return_home_timer",
57-
timeout_in_seconds=settings.RETURN_HOME_DELAY,
58-
handler=lambda: ReturningHome.transition_and_start_mission(),
59-
)
60-
]
61-
62-
super().__init__(
63-
state_name=States.AwaitNextMission,
64-
signal_exit_event=events.signal_state_machine_exit,
65-
event_handler_mappings=event_handlers,
66-
timers=timers,
50+
timers: list[TimeoutHandlerMapping] = [
51+
TimeoutHandlerMapping(
52+
name="should_return_home_timer",
53+
timeout_in_seconds=settings.RETURN_HOME_DELAY,
54+
handler=lambda: ReturningHome.transition_and_start_mission(),
6755
)
56+
]
57+
58+
return State(
59+
state_name=States.AwaitNextMission,
60+
signal_exit_event=events.signal_state_machine_exit,
61+
event_handler_mappings=event_handlers,
62+
timers=timers,
63+
)
6864

6965

70-
def transition() -> Transition[AwaitNextMission]:
71-
def _transition(events: Events) -> AwaitNextMission:
66+
def transition() -> Transition:
67+
def _transition(events: Events) -> State:
7268
return AwaitNextMission(events)
7369

7470
return _transition

src/isar/state_machine/states/going_to_lockdown.py

Lines changed: 28 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -8,37 +8,33 @@
88
from robot_interface.models.mission.mission import ReturnHomeMission
99

1010

11-
class GoingToLockdown(State):
12-
13-
def __init__(self, events: Events):
14-
15-
event_handlers: list[EventHandlerMapping] = [
16-
EventHandlerMapping[ErrorMessage](
17-
event=events.robot_service_events.mission_failed,
18-
handler=lambda _: InterventionNeeded.transition(
19-
"Lockdown mission failed"
20-
),
21-
),
22-
EventHandlerMapping[EmptyMessage](
23-
event=events.robot_service_events.mission_failed_to_resume,
24-
handler=lambda _: InterventionNeeded.transition(
25-
"Failed to resume return to home mission"
26-
),
27-
),
28-
EventHandlerMapping[EmptyMessage](
29-
event=events.robot_service_events.mission_succeeded,
30-
handler=lambda _: Lockdown.transition_without_responding_to_api(),
11+
def GoingToLockdown(events: Events) -> State:
12+
13+
event_handlers: list[EventHandlerMapping] = [
14+
EventHandlerMapping[ErrorMessage](
15+
event=events.robot_service_events.mission_failed,
16+
handler=lambda _: InterventionNeeded.transition("Lockdown mission failed"),
17+
),
18+
EventHandlerMapping[EmptyMessage](
19+
event=events.robot_service_events.mission_failed_to_resume,
20+
handler=lambda _: InterventionNeeded.transition(
21+
"Failed to resume return to home mission"
3122
),
32-
]
33-
super().__init__(
34-
state_name=States.GoingToLockdown,
35-
signal_exit_event=events.signal_state_machine_exit,
36-
event_handler_mappings=event_handlers,
37-
)
38-
39-
40-
def transition_and_start_mission_and_report_to_api() -> Transition[GoingToLockdown]:
41-
def _transition(events: Events) -> GoingToLockdown:
23+
),
24+
EventHandlerMapping[EmptyMessage](
25+
event=events.robot_service_events.mission_succeeded,
26+
handler=lambda _: Lockdown.transition_without_responding_to_api(),
27+
),
28+
]
29+
return State(
30+
state_name=States.GoingToLockdown,
31+
signal_exit_event=events.signal_state_machine_exit,
32+
event_handler_mappings=event_handlers,
33+
)
34+
35+
36+
def transition_and_start_mission_and_report_to_api() -> Transition:
37+
def _transition(events: Events) -> State:
4238
events.api_requests.send_to_lockdown.response.trigger_event(
4339
LockdownResponse(lockdown_started=True)
4440
)
@@ -52,8 +48,8 @@ def _transition(events: Events) -> GoingToLockdown:
5248
return _transition
5349

5450

55-
def transition_to_existing_mission_and_report_to_api() -> Transition[GoingToLockdown]:
56-
def _transition(events: Events) -> GoingToLockdown:
51+
def transition_to_existing_mission_and_report_to_api() -> Transition:
52+
def _transition(events: Events) -> State:
5753
events.api_requests.send_to_lockdown.response.trigger_event(
5854
LockdownResponse(lockdown_started=True)
5955
)

src/isar/state_machine/states/going_to_recharging.py

Lines changed: 27 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -8,35 +8,33 @@
88
from robot_interface.models.mission.mission import ReturnHomeMission
99

1010

11-
class GoingToRecharging(State):
11+
def GoingToRecharging(events: Events) -> State:
1212

13-
def __init__(self, events: Events):
14-
15-
event_handlers: list[EventHandlerMapping] = [
16-
EventHandlerMapping[ErrorMessage](
17-
event=events.robot_service_events.mission_failed,
18-
handler=lambda _: InterventionNeeded.transition(
19-
"Return home to recharge failed"
20-
),
21-
),
22-
EventHandlerMapping[EmptyMessage](
23-
event=events.robot_service_events.mission_succeeded,
24-
handler=lambda _: Recharging.transition(),
25-
),
26-
EventHandlerMapping[EmptyMessage](
27-
event=events.api_requests.send_to_lockdown.request,
28-
handler=lambda _: GoingToLockdown.transition_to_existing_mission_and_report_to_api(),
13+
event_handlers: list[EventHandlerMapping] = [
14+
EventHandlerMapping[ErrorMessage](
15+
event=events.robot_service_events.mission_failed,
16+
handler=lambda _: InterventionNeeded.transition(
17+
"Return home to recharge failed"
2918
),
30-
]
31-
super().__init__(
32-
state_name=States.GoingToRecharging,
33-
signal_exit_event=events.signal_state_machine_exit,
34-
event_handler_mappings=event_handlers,
35-
)
36-
37-
38-
def transition_and_start_return_home() -> Transition[GoingToRecharging]:
39-
def _transition(events: Events) -> GoingToRecharging:
19+
),
20+
EventHandlerMapping[EmptyMessage](
21+
event=events.robot_service_events.mission_succeeded,
22+
handler=lambda _: Recharging.transition(),
23+
),
24+
EventHandlerMapping[EmptyMessage](
25+
event=events.api_requests.send_to_lockdown.request,
26+
handler=lambda _: GoingToLockdown.transition_to_existing_mission_and_report_to_api(),
27+
),
28+
]
29+
return State(
30+
state_name=States.GoingToRecharging,
31+
signal_exit_event=events.signal_state_machine_exit,
32+
event_handler_mappings=event_handlers,
33+
)
34+
35+
36+
def transition_and_start_return_home() -> Transition:
37+
def _transition(events: Events) -> State:
4038
events.robot_service_events.mission_failed.clear_event()
4139
events.robot_service_events.mission_succeeded.clear_event()
4240

@@ -46,8 +44,8 @@ def _transition(events: Events) -> GoingToRecharging:
4644
return _transition
4745

4846

49-
def transition_to_existing_mission() -> Transition[GoingToRecharging]:
50-
def _transition(events: Events) -> GoingToRecharging:
47+
def transition_to_existing_mission() -> Transition:
48+
def _transition(events: Events) -> State:
5149
return GoingToRecharging(events)
5250

5351
return _transition

src/isar/state_machine/states/going_to_recharging_with_mission.py

Lines changed: 49 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -12,66 +12,64 @@
1212
from robot_interface.models.mission.status import MissionStatus
1313

1414

15-
class GoingToRechargingWithMission(State):
15+
def GoingToRechargingWithMission(events: Events, mission: AbortedMission) -> State:
1616

17-
def __init__(self, events: Events, mission: AbortedMission):
17+
def _mission_failed_event_handler(
18+
error_message: ErrorMessage,
19+
) -> Transition:
20+
publish_mission_status(
21+
events.mqtt_queue,
22+
mission.id,
23+
MissionStatus.Failed,
24+
error_message,
25+
)
26+
return InterventionNeeded.transition("Return home to recharge failed")
1827

19-
def _mission_failed_event_handler(
20-
error_message: ErrorMessage,
21-
) -> Transition[InterventionNeeded.InterventionNeeded]:
22-
publish_mission_status(
23-
events.mqtt_queue,
24-
mission.id,
25-
MissionStatus.Failed,
26-
error_message,
28+
def _stop_mission_event_handler(
29+
stop_mission_id: str,
30+
) -> Transition | None:
31+
if mission.id == stop_mission_id or stop_mission_id == "":
32+
events.api_requests.stop_mission.response.trigger_event(
33+
ControlMissionResponse(success=True)
2734
)
28-
return InterventionNeeded.transition("Return home to recharge failed")
29-
30-
def _stop_mission_event_handler(
31-
stop_mission_id: str,
32-
) -> Transition[GoingToRecharging.GoingToRecharging] | None:
33-
if mission.id == stop_mission_id or stop_mission_id == "":
34-
events.api_requests.stop_mission.response.trigger_event(
35-
ControlMissionResponse(success=True)
36-
)
37-
return GoingToRecharging.transition_to_existing_mission()
38-
else:
39-
events.api_requests.stop_mission.response.trigger_event(
40-
ControlMissionResponse(
41-
success=False, failure_reason="Mission not found"
42-
)
35+
return GoingToRecharging.transition_to_existing_mission()
36+
else:
37+
events.api_requests.stop_mission.response.trigger_event(
38+
ControlMissionResponse(
39+
success=False, failure_reason="Mission not found"
4340
)
44-
return None
41+
)
42+
return None
4543

46-
event_handlers: list[EventHandlerMapping] = [
47-
EventHandlerMapping[ErrorMessage](
48-
event=events.robot_service_events.mission_failed,
49-
handler=_mission_failed_event_handler,
50-
),
51-
EventHandlerMapping[EmptyMessage](
52-
event=events.robot_service_events.mission_succeeded,
53-
handler=lambda _: RechargingWithMission.transition(mission),
54-
),
55-
EventHandlerMapping[EmptyMessage](
56-
event=events.api_requests.send_to_lockdown.request,
57-
handler=lambda _: GoingToLockdown.transition_to_existing_mission_and_report_to_api(),
58-
),
59-
EventHandlerMapping[str](
60-
event=events.api_requests.stop_mission.request,
61-
handler=_stop_mission_event_handler,
62-
),
63-
]
64-
super().__init__(
65-
state_name=States.GoingToRechargingWithMission,
66-
signal_exit_event=events.signal_state_machine_exit,
67-
event_handler_mappings=event_handlers,
68-
)
44+
event_handlers: list[EventHandlerMapping] = [
45+
EventHandlerMapping[ErrorMessage](
46+
event=events.robot_service_events.mission_failed,
47+
handler=_mission_failed_event_handler,
48+
),
49+
EventHandlerMapping[EmptyMessage](
50+
event=events.robot_service_events.mission_succeeded,
51+
handler=lambda _: RechargingWithMission.transition(mission),
52+
),
53+
EventHandlerMapping[EmptyMessage](
54+
event=events.api_requests.send_to_lockdown.request,
55+
handler=lambda _: GoingToLockdown.transition_to_existing_mission_and_report_to_api(),
56+
),
57+
EventHandlerMapping[str](
58+
event=events.api_requests.stop_mission.request,
59+
handler=_stop_mission_event_handler,
60+
),
61+
]
62+
return State(
63+
state_name=States.GoingToRechargingWithMission,
64+
signal_exit_event=events.signal_state_machine_exit,
65+
event_handler_mappings=event_handlers,
66+
)
6967

7068

7169
def transition_and_start_return_home(
7270
mission: AbortedMission,
73-
) -> Transition[GoingToRechargingWithMission]:
74-
def _transition(events: Events) -> GoingToRechargingWithMission:
71+
) -> Transition:
72+
def _transition(events: Events) -> State:
7573
events.robot_service_events.mission_failed.clear_event()
7674
events.robot_service_events.mission_succeeded.clear_event()
7775

0 commit comments

Comments
 (0)