From 58567b825cb366ad21e4ff7de9f8b7d20e858816 Mon Sep 17 00:00:00 2001 From: Jan Lindblom Date: Wed, 3 Aug 2022 15:23:50 +0300 Subject: [PATCH] Add support for changing OLED brightness. --- boards/kyria/main.py | 4 +-- kmk/extensions/oled.py | 68 ++++++++++++++++++++++++++++-------------- 2 files changed, 48 insertions(+), 24 deletions(-) diff --git a/boards/kyria/main.py b/boards/kyria/main.py index 30e8f36..23235d9 100644 --- a/boards/kyria/main.py +++ b/boards/kyria/main.py @@ -101,8 +101,8 @@ keyboard.keymap = [ ], [ KC.TRNS, KC.TRNS, KC.TRNS, KC.DF(0), KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, - KC.TRNS, KC.TRNS, KC.TRNS, KC.DF(1), KC.TRNS, KC.TRNS, KC.RGB_TOG, KC.RGB_SAI, KC.RGB_HUI, KC.RGB_VAI, KC.RGB_M_P, KC.TRNS, - KC.TRNS, KC.TRNS, KC.TRNS, KC.DF(2), KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.RGB_SAD, KC.RGB_HUD, KC.RGB_VAD, KC.RGB_M_P, KC.TRNS, + KC.TRNS, KC.OLED_BRI, KC.TRNS, KC.DF(1), KC.TRNS, KC.TRNS, KC.RGB_TOG, KC.RGB_SAI, KC.RGB_HUI, KC.RGB_VAI, KC.RGB_M_P, KC.TRNS, + KC.TRNS, KC.OLED_BRD, KC.TRNS, KC.DF(2), KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.RGB_SAD, KC.RGB_HUD, KC.RGB_VAD, KC.RGB_M_P, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, ], ] diff --git a/kmk/extensions/oled.py b/kmk/extensions/oled.py index d2593ae..8bc9945 100644 --- a/kmk/extensions/oled.py +++ b/kmk/extensions/oled.py @@ -9,12 +9,14 @@ import terminalio from adafruit_display_text import label from kmk.extensions import Extension -DISPLAY_OFFSET = 4 # Used to calculate a new zero level since SSD1306 is clipped. +DISPLAY_OFFSET = 4 # Used to calculate a new zero level since SSD1306 is clipped. + class OledEntryType: TXT = 0 IMG = 1 + class OledData: def __init__( self, @@ -22,7 +24,7 @@ class OledData: ): if entries != None: self.data = entries - + @staticmethod def oled_text_entry(x=0, y=0, text="", layer=None): return { @@ -44,6 +46,7 @@ class OledData: 4: OledEntryType.IMG, } + class Oled(Extension): def __init__( self, @@ -53,6 +56,7 @@ class Oled(Extension): flip: bool = False, device_address=0x3C, brightness=0.8, + brightness_step=0.1, ): displayio.release_displays() self.rotation = 180 if flip else 0 @@ -62,32 +66,40 @@ class Oled(Extension): self._prevLayers = 0 self._device_address = device_address self._brightness = brightness + self._brightness_step = brightness_step gc.collect() make_key( - names=('OLED_BRI',), on_press=self._oled_bri, on_release=handler_passthrough + names=("OLED_BRI",), on_press=self._oled_bri, on_release=handler_passthrough ) make_key( - names=('OLED_BRD',), on_press=self._oled_brd, on_release=handler_passthrough + names=("OLED_BRD",), on_press=self._oled_brd, on_release=handler_passthrough ) def render_oled(self, layer): splash = displayio.Group() - + for view in self._views: if view[3] == layer or view[3] == None: if view[4] == OledEntryType.TXT: - splash.append(label.Label( - terminalio.FONT, - text=view[0], - color=0xFFFFFF, - x=view[1], - y=view[2] + DISPLAY_OFFSET, - )) + splash.append( + label.Label( + terminalio.FONT, + text=view[0], + color=0xFFFFFF, + x=view[1], + y=view[2] + DISPLAY_OFFSET, + ) + ) elif view[4] == OledEntryType.IMG: - splash.append(displayio.TileGrid( - view[0], pixel_shader=view[0].pixel_shader, x=view[1], y=view[2] + DISPLAY_OFFSET - )) + splash.append( + displayio.TileGrid( + view[0], + pixel_shader=view[0].pixel_shader, + x=view[1], + y=view[2] + DISPLAY_OFFSET, + ) + ) gc.collect() self._display.show(splash) @@ -130,17 +142,29 @@ class Oled(Extension): return def on_powersave_enable(self, sandbox): - self._display.brightness = self._display.brightness / 2 if self._display.brightness > 0.5 else 0.2 + self._display.brightness = ( + self._display.brightness / 2 if self._display.brightness > 0.5 else 0.2 + ) return def on_powersave_disable(self, sandbox): - self._display.brightness = self._brightness # Restore brightness to default or previous value + self._display.brightness = ( + self._brightness + ) # Restore brightness to default or previous value return - + def _oled_bri(self, *args, **kwargs): - self._display.brightness = self._display.brightness + 0.1 if self._display.brightness < 0.9 else 1.0 - self._brightness = self._display.brightness # Save current brightness + self._display.brightness = ( + self._display.brightness + self._brightness_step + if self._display.brightness + self._brightness_step <= 1.0 + else 1.0 + ) + self._brightness = self._display.brightness # Save current brightness def _oled_brd(self, *args, **kwargs): - self._display.brightness = self._display.brightness - 0.1 if self._display.brightness > 0.1 else 0.1 - self._brightness = self._display.brightness # Save current brightness + self._display.brightness = ( + self._display.brightness - self._brightness_step + if self._display.brightness - self._brightness_step >= 0.1 + else 0.1 + ) + self._brightness = self._display.brightness # Save current brightness