"""High-level switch service selecting native/mock backend driver.""" from __future__ import annotations from dataclasses import dataclass, field from python_app.hardware_full.switch_drivers import ( H7992Driver, HMC349ADriver, MockSwitchDriver, SwitchDriverProtocol, ) @dataclass(slots=True) class SwitchService: """Facade around concrete switch drivers.""" name: str positions: int mode: str = "mock" driver: str = "h7992" gpio_chip: str = "/dev/gpiochip0" pin_a: int = 17 pin_b: int = 27 invert_logic: bool = False default_position: int = 0 _driver: SwitchDriverProtocol = field(init=False, repr=False) def __post_init__(self) -> None: """Create underlying driver based on configured mode and type.""" self._driver = self._build_driver() def open(self) -> None: """Open underlying switch driver resources.""" self._driver.open() def close(self) -> None: """Close underlying switch driver resources.""" self._driver.close() def switch_to(self, position: int) -> None: """Switch to requested position.""" self._driver.switch_to(position) @property def current_position(self) -> int: """Return current switch position reported by backend driver.""" return self._driver.current_position def _build_driver(self) -> SwitchDriverProtocol: """Instantiate concrete driver according to configured mode and driver kind.""" mode = self.mode.strip().lower() driver_kind = self.driver.strip().lower() if mode == "mock": return MockSwitchDriver( name=self.name, positions=self.positions, default_position=self.default_position, ) if mode != "native": raise RuntimeError(f"Unsupported switch mode: {self.mode}") if driver_kind == "h7992": return H7992Driver( name=self.name, positions=self.positions, default_position=self.default_position, gpio_chip=self.gpio_chip, pin_a=self.pin_a, pin_b=self.pin_b, ) if driver_kind == "hmc349a": return HMC349ADriver( name=self.name, positions=self.positions, default_position=self.default_position, gpio_chip=self.gpio_chip, pin_a=self.pin_a, invert_logic=self.invert_logic, ) raise RuntimeError(f"Unsupported switch driver: {self.driver}")