Add support for changing OLED brightness.

This commit is contained in:
Jan Lindblom 2022-08-03 15:23:50 +03:00 committed by Jk Jensen
parent 6a427a2876
commit 58567b825c
No known key found for this signature in database
GPG Key ID: 3AEC4983A7541FEA
2 changed files with 48 additions and 24 deletions

View File

@ -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(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.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.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_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, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS, KC.TRNS,
], ],
] ]

View File

@ -9,12 +9,14 @@ import terminalio
from adafruit_display_text import label from adafruit_display_text import label
from kmk.extensions import Extension 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: class OledEntryType:
TXT = 0 TXT = 0
IMG = 1 IMG = 1
class OledData: class OledData:
def __init__( def __init__(
self, self,
@ -22,7 +24,7 @@ class OledData:
): ):
if entries != None: if entries != None:
self.data = entries self.data = entries
@staticmethod @staticmethod
def oled_text_entry(x=0, y=0, text="", layer=None): def oled_text_entry(x=0, y=0, text="", layer=None):
return { return {
@ -44,6 +46,7 @@ class OledData:
4: OledEntryType.IMG, 4: OledEntryType.IMG,
} }
class Oled(Extension): class Oled(Extension):
def __init__( def __init__(
self, self,
@ -53,6 +56,7 @@ class Oled(Extension):
flip: bool = False, flip: bool = False,
device_address=0x3C, device_address=0x3C,
brightness=0.8, brightness=0.8,
brightness_step=0.1,
): ):
displayio.release_displays() displayio.release_displays()
self.rotation = 180 if flip else 0 self.rotation = 180 if flip else 0
@ -62,32 +66,40 @@ class Oled(Extension):
self._prevLayers = 0 self._prevLayers = 0
self._device_address = device_address self._device_address = device_address
self._brightness = brightness self._brightness = brightness
self._brightness_step = brightness_step
gc.collect() gc.collect()
make_key( 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( 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): def render_oled(self, layer):
splash = displayio.Group() splash = displayio.Group()
for view in self._views: for view in self._views:
if view[3] == layer or view[3] == None: if view[3] == layer or view[3] == None:
if view[4] == OledEntryType.TXT: if view[4] == OledEntryType.TXT:
splash.append(label.Label( splash.append(
terminalio.FONT, label.Label(
text=view[0], terminalio.FONT,
color=0xFFFFFF, text=view[0],
x=view[1], color=0xFFFFFF,
y=view[2] + DISPLAY_OFFSET, x=view[1],
)) y=view[2] + DISPLAY_OFFSET,
)
)
elif view[4] == OledEntryType.IMG: elif view[4] == OledEntryType.IMG:
splash.append(displayio.TileGrid( splash.append(
view[0], pixel_shader=view[0].pixel_shader, x=view[1], y=view[2] + DISPLAY_OFFSET displayio.TileGrid(
)) view[0],
pixel_shader=view[0].pixel_shader,
x=view[1],
y=view[2] + DISPLAY_OFFSET,
)
)
gc.collect() gc.collect()
self._display.show(splash) self._display.show(splash)
@ -130,17 +142,29 @@ class Oled(Extension):
return return
def on_powersave_enable(self, sandbox): 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 return
def on_powersave_disable(self, sandbox): 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 return
def _oled_bri(self, *args, **kwargs): 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._brightness = self._display.brightness # Save current 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): 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._brightness = self._display.brightness # Save current 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