nenuscanner/leds.py

120 lines
2.2 KiB
Python

import gpiod
from . import config
class Leds:
def __enter__(self):
pass
def __exit__(self, *args):
pass
def on(self):
pass
def off(self):
pass
class GpioLed:
def __init__(self, gpio_pin: int):
self.gpio_pin = gpio_pin
self.led = None
def enter(self, chip: gpiod.Chip):
self.led = chip.get_line(self.gpio_pin)
self.led.request(consumer=str(self), type=gpiod.LINE_REQ_DIR_OUT)
self.off()
def exit(self):
self.off()
self.led.release()
self.led = None
def on(self):
self.led.set_value(1)
def off(self):
self.led.set_value(0)
def __str__(self):
return f'LED{self.gpio_pin:02}'
class GpioLeds(Leds):
def __init__(self, chip: str, gpio_pins: list[int]):
self.chip = gpiod.Chip(chip)
self.leds = []
for pin in gpio_pins:
self.leds.append(GpioLed(pin))
def __enter__(self):
for led in self.leds:
led.enter(self.chip)
return self
def __exit__(self, *args):
for led in self.leds:
led.exit()
def off(self):
for led in self.leds:
led.off()
def on(self):
for led in self.leds:
led.on()
class DummyLed:
def __init__(self, gpio_pin: int):
self.gpio_pin = gpio_pin
self.is_on = False
def enter(self):
pass
def exit(self):
pass
def on(self):
self.is_on = True
def off(self):
self.is_on = False
def __str__(self):
return f'LED{self.gpio_pin:02}'
class DummyLeds(Leds):
def __init__(self, gpio_pins: list[int]):
self.leds = []
for pin in gpio_pins:
self.leds.append(DummyLed(pin))
def __enter__(self):
for led in self.leds:
led.enter()
return self
def __exit__(self, *args):
for led in self.leds:
led.exit()
def off(self):
for led in self.leds:
led.off()
def on(self):
for led in self.leds:
led.on()
_leds = GpioLeds(config.GPIO_CHIP, config.LEDS_UUIDS) if config.GPIO_CHIP is not None else DummyLeds(config.LEDS_UUIDS)
def get() -> Leds:
return _leds