Files
esphome-lsm6ds/esphome/components/hub75/boards/__init__.py
T
2025-12-05 18:51:32 +00:00

81 lines
2.1 KiB
Python

"""Board presets for HUB75 displays.
Each board preset defines standard pin mappings for HUB75 controller boards.
"""
from dataclasses import dataclass, field
import importlib
import pkgutil
from typing import ClassVar
class BoardRegistry:
"""Global registry for board configurations."""
_boards: ClassVar[dict[str, "BoardConfig"]] = {}
@classmethod
def register(cls, board: "BoardConfig") -> None:
"""Register a board configuration."""
cls._boards[board.name] = board
@classmethod
def get_boards(cls) -> dict[str, "BoardConfig"]:
"""Return all registered boards."""
return cls._boards
@dataclass
class BoardConfig:
"""Board configuration storing HUB75 pin mappings."""
name: str
r1_pin: int
g1_pin: int
b1_pin: int
r2_pin: int
g2_pin: int
b2_pin: int
a_pin: int
b_pin: int
c_pin: int
d_pin: int
e_pin: int | None
lat_pin: int
oe_pin: int
clk_pin: int
ignore_strapping_pins: tuple[str, ...] = () # e.g., ("a_pin", "clk_pin")
# Derived field for pin lookup
pins: dict[str, int | None] = field(default_factory=dict, init=False, repr=False)
def __post_init__(self):
"""Initialize derived fields and register board."""
self.name = self.name.lower()
self.pins = {
"r1": self.r1_pin,
"g1": self.g1_pin,
"b1": self.b1_pin,
"r2": self.r2_pin,
"g2": self.g2_pin,
"b2": self.b2_pin,
"a": self.a_pin,
"b": self.b_pin,
"c": self.c_pin,
"d": self.d_pin,
"e": self.e_pin,
"lat": self.lat_pin,
"oe": self.oe_pin,
"clk": self.clk_pin,
}
BoardRegistry.register(self)
def get_pin(self, pin_name: str) -> int | None:
"""Get pin number for a given pin name."""
return self.pins.get(pin_name)
# Dynamically import all board definition modules
for module_info in pkgutil.iter_modules(__path__):
importlib.import_module(f".{module_info.name}", package=__package__)