diff --git a/boards/kyria/main.py b/boards/kyria/main.py index 6969ffa..30e8f36 100644 --- a/boards/kyria/main.py +++ b/boards/kyria/main.py @@ -38,14 +38,14 @@ keyboard.extensions.append(rgb_ext) oled_ext = Oled( OledData( - labels=[ + entries=[ OledData.oled_text_entry(text="Kyria v1.4", x=0, y=0), OledData.oled_text_entry(text="KB2040", x=0, y=10), OledData.oled_text_entry(text="Layer: ", x=0, y=20), - OledData.oled_text_entry(text="BASE", x=42, y=20, layer=0), - OledData.oled_text_entry(text="LOWER", x=0, y=30, layer=3), - OledData.oled_text_entry(text="RAISE", x=42, y=20, layer=4), - OledData.oled_text_entry(text="ADJUST", x=42, y=20, layer=6), + OledData.oled_text_entry(text="BASE", x=40, y=20, layer=0), + OledData.oled_text_entry(text="LOWER", x=40, y=20, layer=3), + OledData.oled_text_entry(text="RAISE", x=40, y=20, layer=4), + OledData.oled_text_entry(text="ADJUST", x=40, y=20, layer=6), ] ), oHeight=64, diff --git a/kmk/extensions/oled.py b/kmk/extensions/oled.py index 5d9d124..d2593ae 100644 --- a/kmk/extensions/oled.py +++ b/kmk/extensions/oled.py @@ -7,27 +7,49 @@ import adafruit_displayio_ssd1306 import displayio import terminalio from adafruit_display_text import label - from kmk.extensions import Extension -DISPLAY_OFFSET = 10 +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, - labels=None, + entries=None, ): - if labels != None: - self.data = labels + if entries != None: + self.data = entries + + @staticmethod + def oled_text_entry(x=0, y=0, text="", layer=None): + return { + 0: text, + 1: x, + 2: y, + 3: layer, + 4: OledEntryType.TXT, + } + @staticmethod + def oled_image_entry(x=0, y=0, image="", layer=None): + odb = displayio.OnDiskBitmap(image) + return { + 0: odb, + 1: x, + 2: y, + 3: layer, + 4: OledEntryType.IMG, + } class Oled(Extension): def __init__( self, views, - oWidth=128, - oHeight=32, + width=128, + height=32, flip: bool = False, device_address=0x3C, brightness=0.8, @@ -35,8 +57,8 @@ class Oled(Extension): displayio.release_displays() self.rotation = 180 if flip else 0 self._views = views.data - self._width = oWidth - self._height = oHeight + self._width = width + self._height = height self._prevLayers = 0 self._device_address = device_address self._brightness = brightness @@ -49,37 +71,25 @@ class Oled(Extension): names=('OLED_BRD',), on_press=self._oled_brd, on_release=handler_passthrough ) - @staticmethod - def oled_text_entry(x=0, y=0, text="", layer=None): - return { - 0: label.Label( - terminalio.FONT, - text=text, - color=0xFFFFFF, - x=x, - y=y + DISPLAY_OFFSET, - ), - 1: layer, - } - - @staticmethod - def oled_image_entry(x=0, y=0, image="", layer=None): - odb = displayio.OnDiskBitmap(image) - return { - 0: displayio.TileGrid( - odb, pixel_shader=odb.pixel_shader, x=x, y=y + DISPLAY_OFFSET - ), - 1: layer, - } - def render_oled(self, layer): splash = displayio.Group() - self._display.show(splash) - print(f"views={self._views}, layer={layer}") + for view in self._views: - if view[1] == layer or view[1] == None: - splash.append(view[0]) + 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, + )) + 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 + )) gc.collect() + self._display.show(splash) def updateOLED(self, sandbox): self.render_oled(sandbox.active_layers[0]) @@ -120,17 +130,17 @@ 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 return def on_powersave_disable(self, sandbox): + 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._display.brightness = self._display.brightness + 0.1 if self._display.brightness < 0.9 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._display.brightness = self._display.brightness - 0.1 if self._display.brightness > 0.1 else 0.1 + self._brightness = self._display.brightness # Save current brightness