implement led backlight for multiple pwm channels
This commit is contained in:
parent
aa01da7e1d
commit
9e8b8376c5
@ -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()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user