Source code for go2.core.registry

from dataclasses import dataclass
from enum import Enum, auto
from typing import Dict, Generic, Optional, Type, TypeVar

from .module import DogModule
from ..modules.audio import AudioModule
from ..modules.input import InputModule
from ..modules.lidar import LIDARModule
from ..modules.movement import MovementModule
from ..modules.ocr import OCRModule
from ..modules.video import VideoModule
from ..hardware.hardware_type import HardwareType


T = TypeVar('T', bound=DogModule)

[docs] class ExecutionMode(Enum): """ Enumeration passed upon creation of a :class:`~core.controller.Go2Controller` instance. Dicates the available modules based on system installed packages. Installation for all dependencies can be found here: https://github.com/7Swaize/go2-control/blob/main/docs/public/install/installation.md """ BASIC = auto() #: Restricts access to the :class:`~core.registry.ModuleType.LIDAR` module. ADVANCED = auto() #: Allows access to **ALL** modules.
[docs] class ModuleType(Enum): """ Enumeration of all supported default module categories. This enum is used by the module registry to identify and construct modules dynamically. """ VIDEO = auto() MOVEMENT = auto() INPUT = auto() OCR = auto() AUDIO = auto() LIDAR = auto()
[docs] @dataclass class ModuleDescriptor(Generic[T]): """ Descriptor linking a module type to its implementation. Contains all metadata required to construct and display a module in the system. """ _module_type: ModuleType #: Enum identifying the module _module_class: Type[T] #: Concrete implementation class _display_name: str #: Human-readable name _requires_native_hardware: bool = False #: Whether this module requires native hardware support _requires_advanced_execution: bool = False #: Whether this module requires an advanced execution mode def _create_instance(self, *args, **kwargs) -> T: """Instantiate the module.""" return self._module_class(*args, **kwargs)
[docs] class ModuleRegistry: """ Central registry for all available modules. The registry maps ``ModuleType`` values to their corresponding implementations and metadata. It is responsible for controlling which modules are available based on system configuration. Notes ----- - This is an internal system component. - Modules are registered at startup. """ _descriptors: Dict[ModuleType, ModuleDescriptor] = {} @classmethod def _register(cls, descriptor: ModuleDescriptor) -> None: """ Register a module descriptor. Parameters ---------- descriptor : ModuleDescriptor Descriptor to register. """ cls._descriptors[descriptor._module_type] = descriptor
[docs] @classmethod def get_descriptor(cls, module_type: ModuleType) -> Optional[ModuleDescriptor]: """Retrieve the descriptor for a module type.""" return cls._descriptors.get(module_type)
[docs] @classmethod def get_class(cls, module_type: ModuleType) -> Optional[Type[DogModule]]: """Retrieve the implementation class for a module type.""" descriptor = cls._descriptors.get(module_type) return descriptor._module_class if descriptor else None
[docs] @classmethod def is_registered(cls, module_type: ModuleType) -> bool: """Check whether a module type is registered.""" return module_type in cls._descriptors
def _register_all_default_modules(): """ Register all default system modules. This function is called automatically at import time to populate the module registry with all built-in modules. """ ModuleRegistry._register(ModuleDescriptor( ModuleType.VIDEO, VideoModule, "Video Capture", _requires_native_hardware=False, _requires_advanced_execution=False )) ModuleRegistry._register(ModuleDescriptor( ModuleType.MOVEMENT, MovementModule, "Movement Control", _requires_native_hardware=False, _requires_advanced_execution=False )) ModuleRegistry._register(ModuleDescriptor( ModuleType.OCR, OCRModule, "Optical Character Recognition", _requires_native_hardware=False, _requires_advanced_execution=False, )) ModuleRegistry._register(ModuleDescriptor( ModuleType.AUDIO, AudioModule, "Text-to-Speech", _requires_native_hardware=False, _requires_advanced_execution=False )) ModuleRegistry._register(ModuleDescriptor( ModuleType.INPUT, InputModule, "Controller Input", _requires_native_hardware=True, _requires_advanced_execution=False )) ModuleRegistry._register(ModuleDescriptor( ModuleType.LIDAR, LIDARModule, "LIDAR Capture", _requires_native_hardware=False, _requires_advanced_execution=True )) _register_all_default_modules()