From 6de0aef90b5bb2c73fd0f192eb79bf81e2fb6715 Mon Sep 17 00:00:00 2001 From: Sébastien Dailly Date: Sun, 20 Jul 2025 21:46:40 +0200 Subject: Refresh the screen when receiving a change from the host --- code.py | 5 ++--- json_layer.py | 17 ++++++++++++++++- oled.py | 10 +++++++++- serial_conn.py | 17 ++++++++++++----- 4 files changed, 39 insertions(+), 10 deletions(-) diff --git a/code.py b/code.py index a738543..a232644 100644 --- a/code.py +++ b/code.py @@ -1,10 +1,9 @@ import board -from supervisor import runtime import json -from serial_conn import Client +from supervisor import runtime import oled -from supervisor import runtime +from serial_conn import Client # Do not reload the application when the files are changed runtime.autoreload = False diff --git a/json_layer.py b/json_layer.py index 8d12681..9e98fc3 100644 --- a/json_layer.py +++ b/json_layer.py @@ -8,6 +8,7 @@ # +from supervisor import ticks_ms from kmk.keys import Key, KC from kmk.modules.macros import Delay, Macros, Tap @@ -83,11 +84,15 @@ operators["no_press"] = no_press class Layer(object): """ Layer as an object. This class gives the property name in addition of the keymap list + + This layer keep a track of the last time the layer was updated. This is + used as timer in order to put the device in sleep mode or not. """ def __init__(self): - self.name = "" self.keys = [] + self._name = "" + self.timer_start = ticks_ms() def load(self, json_data): """ Load the json dictionnary into the layer. The dictionnary shall be @@ -101,6 +106,7 @@ class Layer(object): The dictionnary must be one of the operators declared above. """ + self.timer_start = ticks_ms() for name, keys in json_data.items(): self.name = name self.keys = list(map(key_of_json, keys)) @@ -114,3 +120,12 @@ class Layer(object): """ Compare two layer by the name only """ return self.name == other.name + + @property + def name(self): + return self._name + + @name.setter + def name(self, value): + self.timer_start = ticks_ms() + self._name = value diff --git a/oled.py b/oled.py index 4db0436..ab4c917 100644 --- a/oled.py +++ b/oled.py @@ -34,6 +34,7 @@ class CustomDisplay(Display): layout is updated """ def __init__(self, *args, **kwargs): + self.keyboard = None super().__init__(*args, **kwargs) self._prevLayers = None @@ -47,12 +48,19 @@ class CustomDisplay(Display): """ super().before_matrix_scan(sandbox) if self.keyboard.keymap[0].name != self._prevLayers: - self.timer_start = ticks_ms() self._prevLayers = self.keyboard.keymap[0].name self.render(sandbox.active_layers[0]) return + @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): diff --git a/serial_conn.py b/serial_conn.py index 0775ba0..a781d64 100644 --- a/serial_conn.py +++ b/serial_conn.py @@ -9,6 +9,9 @@ class Client(Module): the json command. """ + def __init__(self): + self.last_name = None + def during_bootup(self, keyboard): try: # Do not set any timeout, we check before reading a string if there @@ -23,13 +26,17 @@ class Client(Module): def before_hid_send(self, keyboard): # Serial.data isn't initialized yet. - if not data: - return - - if not data.connected: - keyboard.keymap[0].name = "Disconnected" + if not data or not data.connected: + current_name = keyboard.keymap[0].name + if current_name != "Disconnected": + self.last_name = current_name + keyboard.keymap[0].name = "Disconnected" time.sleep(1) return + if self.last_name is not None: + keyboard.keymap[0].name = self.last_name + self.last_name = None + # Nothing to parse. if data.in_waiting <= 0: -- cgit v1.2.3