-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmode_manager.py
More file actions
132 lines (103 loc) · 5.13 KB
/
Copy pathmode_manager.py
File metadata and controls
132 lines (103 loc) · 5.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
from typing import Any, Dict, Optional
from commands.command_manager import CommandManager
from controllers.stand_controller import ControllerBase
from state_manager.obs_manager import ObservationManager
class ModeManager:
"""
A flexible mode management system that allows dynamic registration of modes (controllers).
Modes are defined as a dictionary of controllers, where the key is the mode name and the value is a dictionary of controllers.
"""
def __init__(self, logger=None, device="cuda:0"):
self._modes: Dict[str, Dict[str, ControllerBase]] = {}
self._current_mode: Optional[str] = None
self._current_submode: Optional[str] = None
self._mode_obs_managers: Dict[str, ObservationManager] = {}
self._submode_cmd_managers: Dict[str, CommandManager] = {}
self.logger = logger
self.device = device
def register_mode(self, mode_name: str, controllers: Dict[str, ControllerBase]):
"""
Register a new mode with individual observation manager and command manager for each submode.
:param mode_name: Name of the mode
:param controllers: Dictionary of controllers for this mode
"""
# Create an observation manager for each submode
obs_managers = {
submode_name: ObservationManager(logger=self.logger, device=self.device)
for submode_name in controllers.keys()
}
self._modes[mode_name] = controllers
self._mode_obs_managers[mode_name] = obs_managers
# Pass corresponding obs manager to each controller
for submode_name, controller in controllers.items():
if hasattr(controller, "set_obs_manager"):
controller.set_obs_manager(obs_managers[submode_name])
if hasattr(controller, "register_commands"):
self._submode_cmd_managers[submode_name] = CommandManager(logger=self.logger)
controller.set_cmd_manager(self._submode_cmd_managers[submode_name])
def set_mode(self, mode_name: str, submode: Optional[str] = None):
"""
Set the current mode and optional submode.
:param mode_name: Name of the mode to set
:param submode: Optional submode within the mode
:raises ValueError: If mode or submode is not registered
"""
if mode_name not in self._modes:
raise ValueError(f"Mode {mode_name} not registered")
if submode is not None and submode not in self._modes[mode_name]:
raise ValueError(f"Submode {submode} not registered for mode {mode_name}")
# Deactivate existing controller
if self._current_submode and self._current_mode:
controller = self._modes[self._current_mode][self._current_submode]
if hasattr(controller, "active"):
controller.active = False
self._current_mode = mode_name
self._current_submode = submode
if submode is not None:
self.logger.debug(f"Mode set to: {self._current_mode} - {self._current_submode}")
# Get the new controller
if self._current_submode:
controller = self._modes[self._current_mode][self._current_submode]
else:
controller = self._modes[self._current_mode].get("default", None)
# Run set_mode function if it exists in the controller
if controller and hasattr(controller, "set_mode"):
controller.set_mode()
else:
self.logger.debug(f"Mode set to: {self._current_mode}")
def get_active_controller(self) -> ControllerBase:
"""
Get the active controller based on current mode and submode.
:return: Active controller
:raises ValueError: If no mode is set
"""
if self._current_mode is None:
raise ValueError("No mode is currently set")
if self._current_submode:
return self._modes[self._current_mode][self._current_submode]
return self._modes[self._current_mode].get("default", None)
def get_active_obs_manager(self) -> ObservationManager:
"""
Get the observation manager for the current submode.
:return: Active observation manager
:raises ValueError: If no mode is set
"""
if self._current_mode is None:
raise ValueError("No mode is currently set")
# If no submode, use 'default' for the mode
if self._current_submode is None:
return self._mode_obs_managers[self._current_mode]["default"]
return self._mode_obs_managers[self._current_mode][self._current_submode]
def get_current_mode_info(self) -> Dict[str, Optional[str]]:
"""
Get current mode and submode information.
:return: Dictionary with current mode and submode
"""
return {"mode": self._current_mode, "submode": self._current_submode}
def get_mode_info(self, mode_name: str) -> Dict[str, Any]:
"""
Get mode and submode information for a given mode.
:param mode_name: Name of the mode
:return: Dictionary with mode and submode
"""
return {"mode": mode_name, "submode": list(self._modes[mode_name].keys())}