Files
portal/leds/strips.py
Jimmy 5094c7bcee Add portal web simulator, SPI bridges, and Pico firmware updates.
Bring the five-panel hex portal online with a browser 3D/schematic preview, Pi SPI backends, and renamed multi-panel Pico UDP firmware.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-30 14:54:51 +12:00

80 lines
2.1 KiB
Python

"""Control two WS2812 strips with board-appropriate defaults."""
from __future__ import annotations
from leds.config import StripConfig, default_dual_strip_configs
from leds.strip import LedStrip
class LedStrips:
"""Drive two WS2812 strips. Use default configs or pass StripConfig per strip."""
def __init__(
self,
count0: int,
count1: int,
*,
config0: StripConfig | None = None,
config1: StripConfig | None = None,
brightness: float = 1.0,
) -> None:
if config0 is None or config1 is None:
defaults = default_dual_strip_configs(
count0, count1, brightness=brightness
)
config0 = config0 or defaults[0]
config1 = config1 or defaults[1]
self._strips = (
_strip_from_config(config0),
_strip_from_config(config1),
)
@property
def strip0(self) -> LedStrip:
return self._strips[0]
@property
def strip1(self) -> LedStrip:
return self._strips[1]
def __getitem__(self, index: int) -> LedStrip:
if index not in (0, 1):
raise IndexError("strip index must be 0 or 1")
return self._strips[index]
def show(self) -> None:
for strip in self._strips:
strip.show()
def clear(self) -> None:
for strip in self._strips:
strip.clear()
def close(self) -> None:
for strip in self._strips:
strip.close()
def __enter__(self) -> LedStrips:
return self
def __exit__(self, *_exc) -> None:
self.close()
def _strip_from_config(config: StripConfig) -> LedStrip:
return LedStrip(
config.count,
backend=config.backend,
pin=config.pin,
channel=config.channel,
device=config.device,
brightness=config.brightness,
spi_bus=config.spi_bus,
spi_device=config.spi_device,
spi_max_speed_hz=config.spi_max_speed_hz,
wire_order=config.wire_order,
passthrough=config.passthrough,
swap_rg=config.swap_rg,
)