Co-authored-by: J. Nick Koston <nick@home-assistant.io>
81 lines
2.1 KiB
Python
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__)
|