42 lines
1.5 KiB
Python
42 lines
1.5 KiB
Python
from .arm_state import ArmState
|
|
|
|
class ControllerManager:
|
|
def __init__(self, state: ArmState):
|
|
self.state = state
|
|
self.controllers = {}
|
|
self.current_controller = None
|
|
|
|
def add_controller(self, controller_class, name, config_path):
|
|
if name not in self.controllers:
|
|
self.controllers[name] = controller_class(name,self.state,config_path)
|
|
else:
|
|
raise ValueError(f"Controller {name} already exists")
|
|
|
|
def remove_controller(self, name):
|
|
if name in self.controllers:
|
|
del self.controllers[name]
|
|
if self.current_controller == self.controllers.get(name):
|
|
self.current_controller = None
|
|
else:
|
|
raise ValueError(f"Controller {name} does not exist")
|
|
|
|
def switch_controller(self, name):
|
|
if name in self.controllers:
|
|
self.current_controller = self.controllers[name]
|
|
else:
|
|
raise ValueError(f"Controller {name} does not exist")
|
|
|
|
def __getattr__(self, name):
|
|
if self.current_controller:
|
|
method = getattr(self.current_controller, name, None)
|
|
if method:
|
|
return method
|
|
else:
|
|
raise AttributeError(f"'{type(self.current_controller).__name__}' object has no attribute '{name}'")
|
|
else:
|
|
raise RuntimeError("No current controller is set")
|
|
|
|
|
|
def step(self,dt):
|
|
if self.current_controller:
|
|
self.current_controller.step(dt) |