implement led backlight for multiple pwm channels

This commit is contained in:
xs5871 2021-12-04 18:02:56 +00:00 committed by Kyle Brown
parent aa01da7e1d
commit 9e8b8376c5

View File

@ -2,7 +2,12 @@ import pwmio
from math import e, exp, pi, sin from math import e, exp, pi, sin
from kmk.extensions import Extension, InvalidExtensionEnvironment from kmk.extensions import Extension, InvalidExtensionEnvironment
from kmk.keys import make_key from kmk.keys import make_argumented_key, make_key
class LEDKeyMeta:
def __init__(self, *leds):
self.leds = leds
class AnimationModes: class AnimationModes:
@ -25,12 +30,16 @@ class LED(Extension):
user_animation=None, user_animation=None,
val=100, val=100,
): ):
self._leds = []
try: try:
self._led = pwmio.PWMOut(led_pin) if not isinstance(led_pin, list):
led_pin = [led_pin]
for pin in led_pin:
self._leds.append(pwmio.PWMOut(pin))
except Exception as e: except Exception as e:
print(e) print(e)
raise InvalidExtensionEnvironment( raise InvalidExtensionEnvironment(
'Unable to create pulseio.PWMOut() instance with provided led_pin' f'Unable to create pwmio.PWMOut() instance with provided led_pin "{pin}"'
) )
self._brightness = 0 self._brightness = 0
@ -48,9 +57,21 @@ class LED(Extension):
if user_animation is not None: if user_animation is not None:
self.user_animation = user_animation self.user_animation = user_animation
make_key(names=('LED_TOG',), on_press=self._key_led_tog) make_argumented_key(
make_key(names=('LED_INC',), on_press=self._key_led_inc) names=('LED_TOG',),
make_key(names=('LED_DEC',), on_press=self._key_led_dec) validator=self._led_key_validator,
on_press=self._key_led_tog,
)
make_argumented_key(
names=('LED_INC',),
validator=self._led_key_validator,
on_press=self._key_led_inc,
)
make_argumented_key(
names=('LED_DEC',),
validator=self._led_key_validator,
on_press=self._key_led_dec,
)
make_key(names=('LED_ANI',), on_press=self._key_led_ani) make_key(names=('LED_ANI',), on_press=self._key_led_ani)
make_key(names=('LED_AND',), on_press=self._key_led_and) make_key(names=('LED_AND',), on_press=self._key_led_and)
make_key( make_key(
@ -109,30 +130,38 @@ class LED(Extension):
self._effect_init = False self._effect_init = False
return self return self
def set_brightness(self, percent): def set_brightness(self, percent, leds=None):
self._led.duty_cycle = int(percent / 100 * 65535) leds = leds or range(0, len(self._leds))
for i in leds:
self._leds[i].duty_cycle = int(percent / 100 * 65535)
def increase_brightness(self, step=None): def increase_brightness(self, step=None, leds=None):
if not step: leds = leds or range(0, len(self._leds))
self._brightness += self.brightness_step for i in leds:
else: brightness = int(self._leds[i].duty_cycle / 65535 * 100)
self._brightness += step if not step:
brightness += self.brightness_step
else:
brightness += step
if self._brightness > 100: if brightness > 100:
self._brightness = 100 brightness = 100
self.set_brightness(self._brightness) self.set_brightness(brightness, [i])
def decrease_brightness(self, step=None): def decrease_brightness(self, step=None, leds=None):
if not step: leds = leds or range(0, len(self._leds))
self._brightness -= self.brightness_step for i in leds:
else: brightness = int(self._leds[i].duty_cycle / 65535 * 100)
self._brightness -= step if not step:
brightness -= self.brightness_step
else:
brightness -= step
if self._brightness < 0: if brightness < 0:
self._brightness = 0 brightness = 0
self.set_brightness(self._brightness) self.set_brightness(brightness, [i])
def off(self): def off(self):
self.set_brightness(0) self.set_brightness(0)
@ -190,17 +219,23 @@ class LED(Extension):
else: else:
self.off() self.off()
def _led_key_validator(self, *leds):
if leds:
for led in leds:
assert self._leds[led]
return LEDKeyMeta(*leds)
def _key_led_tog(self, *args, **kwargs): def _key_led_tog(self, *args, **kwargs):
if self.animation_mode == AnimationModes.STATIC_STANDBY: if self.animation_mode == AnimationModes.STATIC_STANDBY:
self.animation_mode = AnimationModes.STATIC self.animation_mode = AnimationModes.STATIC
self._enabled = not self._enabled self._enabled = not self._enabled
def _key_led_inc(self, *args, **kwargs): def _key_led_inc(self, key, *args, **kwargs):
self.increase_brightness() self.increase_brightness(leds=key.meta.leds)
def _key_led_dec(self, *args, **kwargs): def _key_led_dec(self, key, *args, **kwargs):
self.decrease_brightness() self.decrease_brightness(leds=key.meta.leds)
def _key_led_ani(self, *args, **kwargs): def _key_led_ani(self, *args, **kwargs):
self.increase_ani() self.increase_ani()