extension for indicating layer status with leds
This commit is contained in:
parent
57ba0fe8b2
commit
fd30b7a8d8
46
docs/extension_statusled.md
Normal file
46
docs/extension_statusled.md
Normal file
@ -0,0 +1,46 @@
|
||||
# Status LEDs
|
||||
|
||||
Indicate which layer you are on with ah array of single leds.
|
||||
|
||||
During startup the leds light up to indicte that the bootup is finished.
|
||||
|
||||
For the time being just a simple consecutive single led
|
||||
indicator. And when there are more layers than leds it
|
||||
wraps around to the first led again.
|
||||
(Also works for a single led, which just lights when any
|
||||
layer is active)
|
||||
|
||||
_Most of the code comes from the Mono color LED backlight extension_.
|
||||
|
||||
## Enabling the extension
|
||||
|
||||
To enable the extension you need to define a list of `led_pins`. It can be a list of a one, two or three pins.
|
||||
|
||||
```python
|
||||
from kmk.extensions.statusled import statusLED
|
||||
import board
|
||||
|
||||
statusLED = statusLED(led_pins=[board.GP0, board.GP1, board.GP2])
|
||||
keyboard.extensions.append(statusLED)
|
||||
```
|
||||
|
||||
## [Keycodes]
|
||||
|
||||
| Key | Aliases | Description |
|
||||
| ------------- | ------- | ------------------- |
|
||||
| `KC.SLED_INC` | | Increase Brightness |
|
||||
| `KC.SLED_DEC` | | Decrease Brightness |
|
||||
|
||||
## Configuration
|
||||
|
||||
All of these values can be set by default for when the keyboard boots.
|
||||
|
||||
```python
|
||||
from kmk.extensions.led import AnimationModes
|
||||
led_ext = LED(
|
||||
led_pin=led_pin,
|
||||
brightness=30,
|
||||
brightness_step=5,
|
||||
brightness_limit=100,
|
||||
)
|
||||
```
|
145
kmk/extensions/statusled.py
Normal file
145
kmk/extensions/statusled.py
Normal file
@ -0,0 +1,145 @@
|
||||
# Use this extension for showing layer status with three leds
|
||||
|
||||
import pwmio
|
||||
import time
|
||||
|
||||
from kmk.extensions import Extension, InvalidExtensionEnvironment
|
||||
from kmk.keys import make_key
|
||||
|
||||
|
||||
class statusLED(Extension):
|
||||
def __init__(
|
||||
self,
|
||||
led_pins,
|
||||
brightness=30,
|
||||
brightness_step=5,
|
||||
brightness_limit=100,
|
||||
):
|
||||
self._leds = []
|
||||
for led in led_pins:
|
||||
try:
|
||||
self._leds.append(pwmio.PWMOut(led))
|
||||
except Exception as e:
|
||||
print(e)
|
||||
raise InvalidExtensionEnvironment(
|
||||
"Unable to create pulseio.PWMOut() instance with provided led_pin"
|
||||
)
|
||||
self._led_count = len(self._leds)
|
||||
|
||||
self.brightness = brightness
|
||||
self._layer_last = -1
|
||||
|
||||
self.brightness_step = brightness_step
|
||||
self.brightness_limit = brightness_limit
|
||||
|
||||
make_key(names=("SLED_INC",), on_press=self._key_led_inc)
|
||||
make_key(names=("SLED_DEC",), on_press=self._key_led_dec)
|
||||
|
||||
def _layer_indicator(self, layer_active, *args, **kwargs):
|
||||
"""
|
||||
Indicates layer with leds
|
||||
|
||||
For the time being just a simple consecutive single led
|
||||
indicator. And when there are more layers than leds it
|
||||
wraps around to the first led again.
|
||||
(Also works for a single led, which just lights when any
|
||||
layer is active)
|
||||
"""
|
||||
|
||||
if self._layer_last != layer_active:
|
||||
led_last = 0 if self._layer_last == 0 else 1 + (self._layer_last - 1) % 3
|
||||
if layer_active > 0:
|
||||
led_active = 0 if layer_active == 0 else 1 + (layer_active - 1) % 3
|
||||
self.set_brightness(self.brightness, led_active)
|
||||
self.set_brightness(0, led_last)
|
||||
else:
|
||||
self.set_brightness(0, led_last)
|
||||
self._layer_last = layer_active
|
||||
|
||||
def __repr__(self):
|
||||
return "SLED({})".format(self._to_dict())
|
||||
|
||||
def _to_dict(self):
|
||||
return {
|
||||
"_brightness": self.brightness,
|
||||
"brightness_step": self.brightness_step,
|
||||
"brightness_limit": self.brightness_limit,
|
||||
}
|
||||
|
||||
def on_runtime_enable(self, sandbox):
|
||||
return
|
||||
|
||||
def on_runtime_disable(self, sandbox):
|
||||
return
|
||||
|
||||
def during_bootup(self, sandbox):
|
||||
'''Light up every single led once for 200 ms'''
|
||||
for i in range(self._led_count + 2):
|
||||
if i < self._led_count:
|
||||
self._leds[i].duty_cycle = int(self.brightness / 100 * 65535)
|
||||
i_off = i - 2
|
||||
if i_off >= 0 and i_off < self._led_count:
|
||||
self._leds[i_off].duty_cycle = int(0)
|
||||
time.sleep(0.1)
|
||||
for led in self._leds:
|
||||
led.duty_cycle = int(0)
|
||||
return
|
||||
|
||||
def before_matrix_scan(self, sandbox):
|
||||
return
|
||||
|
||||
def after_matrix_scan(self, sandbox):
|
||||
self._layer_indicator(sandbox.active_layers[0])
|
||||
return
|
||||
|
||||
def before_hid_send(self, sandbox):
|
||||
return
|
||||
|
||||
def after_hid_send(self, sandbox):
|
||||
return
|
||||
|
||||
def on_powersave_enable(self, sandbox):
|
||||
self.set_brightness(0)
|
||||
return
|
||||
|
||||
def on_powersave_disable(self, sandbox):
|
||||
self.set_brightness(self._brightness)
|
||||
self._leds[2].duty_cycle = int(50 / 100 * 65535)
|
||||
time.sleep(0.2)
|
||||
self._leds[2].duty_cycle = int(0)
|
||||
return
|
||||
|
||||
def set_brightness(self, percent, layer_id=-1):
|
||||
if layer_id < 0:
|
||||
for led in self._leds:
|
||||
led.duty_cycle = int(percent / 100 * 65535)
|
||||
else:
|
||||
self._leds[layer_id - 1].duty_cycle = int(percent / 100 * 65535)
|
||||
|
||||
def increase_brightness(self, step=None):
|
||||
if not step:
|
||||
self._brightness += self.brightness_step
|
||||
else:
|
||||
self._brightness += step
|
||||
|
||||
if self._brightness > 100:
|
||||
self._brightness = 100
|
||||
|
||||
self.set_brightness(self._brightness, self._layer_last)
|
||||
|
||||
def decrease_brightness(self, step=None):
|
||||
if not step:
|
||||
self._brightness -= self.brightness_step
|
||||
else:
|
||||
self._brightness -= step
|
||||
|
||||
if self._brightness < 0:
|
||||
self._brightness = 0
|
||||
|
||||
self.set_brightness(self._brightness, self._layer_last)
|
||||
|
||||
def _key_led_inc(self, *args, **kwargs):
|
||||
self.increase_brightness()
|
||||
|
||||
def _key_led_dec(self, *args, **kwargs):
|
||||
self.decrease_brightness()
|
Loading…
Reference in New Issue
Block a user