47 lines
1.1 KiB
Python
47 lines
1.1 KiB
Python
"""Robot adapter registry.
|
|
|
|
Adding a robot (AgiBot X2, another vendor, a different TTS backend) means writing
|
|
one adapter and adding one line here. Nothing above this layer changes.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Callable, Dict
|
|
|
|
from ..config.settings import Settings
|
|
from .base import RobotAdapter, RobotError
|
|
|
|
|
|
def _mock(settings: Settings) -> RobotAdapter:
|
|
from .mock_robot import MockRobot
|
|
|
|
return MockRobot(settings)
|
|
|
|
|
|
def _agibot_a3(settings: Settings) -> RobotAdapter:
|
|
from .agibot_a3 import AgibotA3
|
|
|
|
return AgibotA3(settings)
|
|
|
|
|
|
_REGISTRY: Dict[str, Callable[[Settings], RobotAdapter]] = {
|
|
"mock": _mock,
|
|
"real": _agibot_a3,
|
|
}
|
|
|
|
|
|
def available_modes() -> list:
|
|
return sorted(_REGISTRY)
|
|
|
|
|
|
def create_robot(settings: Settings) -> RobotAdapter:
|
|
builder = _REGISTRY.get(settings.robot.mode)
|
|
if builder is None:
|
|
raise RobotError(
|
|
"unknown ROBOT_MODE '{0}'".format(settings.robot.mode),
|
|
user_message="Unknown ROBOT_MODE '{0}'. Valid values: {1}.".format(
|
|
settings.robot.mode, ", ".join(available_modes())
|
|
),
|
|
)
|
|
return builder(settings)
|