#!/usr/bin/env python # -*- coding: utf-8 -*- import board import busio from kmk.extensions.lock_status import LockStatus from kmk.extensions.display import Display, TextEntry, ImageEntry from kmk.extensions.display.ssd1306 import SSD1306 class NamedLayer(TextEntry): """ This is a named layer which return the name of the current mappng as text. """ def __init__(self, keyboard, *args, **kwargs): super().__init__(*args, **kwargs) self._text = None self.keyboard = keyboard @property def text(self): try: return self.keyboard.keymap[0].name except _: return self._text @text.setter def text(self, value): self._text = value class StatusLayer(TextEntry): """ This layer display a status """ def __init__(self, text, display, prop, *args, **kwargs): super().__init__(*args, **kwargs) self._text = text self.display = display self.property = prop @property def text(self): """ Return the name of the given property """ if getattr(self.display, self.property): return "" return f"{self._text}:Off" @text.setter def text(self, value): """ Ignore the text given """ pass class CustomDisplay(Display): """ Create a custom Display object which refresh the display everytime the layout is updated """ def __init__(self, *args, **kwargs): self.keyboard = None super().__init__(*args, **kwargs) self.status = LockStatus() self._prevLayers = None self.numlock = False def during_bootup(self, keyboard): super().during_bootup(keyboard) self.status.during_bootup(keyboard) self.keyboard = keyboard def after_hid_send(self, sandbox): self.status.after_hid_send(sandbox) if self.status.report_updated: self.numlock = self.status.get_num_lock() self.render(sandbox.active_layers[0]) def before_matrix_scan(self, sandbox): """ Override the default function with the layer name as a comparaison key """ super().before_matrix_scan(sandbox) if self.keyboard.keymap[0].name != self._prevLayers: self._prevLayers = self.keyboard.keymap[0].name self.render(sandbox.active_layers[0]) @property def timer_start(self): if self.keyboard: return self.keyboard.keymap[0].timer_start @timer_start.setter def timer_start(self, value): if self.keyboard: self.keyboard.keymap[0].timer_start = value def main(keyboard): driver = SSD1306( i2c=busio.I2C(board.SCL, board.SDA), ) display = CustomDisplay( display=driver, ) display.entries = [ NamedLayer(keyboard, text="", x=0, y=0), StatusLayer(text="Num", display=display, prop="numlock", x=0, y=20), ] keyboard.extensions.append(display)