From bcde30ff9e322278ebeb316bfa34af0328680bcf Mon Sep 17 00:00:00 2001 From: Sébastien Dailly Date: Fri, 16 Oct 2026 14:05:33 +0200 Subject: pylint review + ergol key mapping --- boot.py | 5 ++- ergol.py | 43 +++++++++++++++++++++ json_layer.py | 17 ++++++--- kmk_frnb.py | 117 +++++++++++---------------------------------------------- layout.py | 8 ++-- oled.py | 46 +++++++++++++++++++++-- serial_conn.py | 8 ++-- 7 files changed, 130 insertions(+), 114 deletions(-) create mode 100644 ergol.py diff --git a/boot.py b/boot.py index 3f2dfb2..1aa21e5 100644 --- a/boot.py +++ b/boot.py @@ -1,8 +1,9 @@ import usb_cdc -usb_cdc.enable(data=True) - import layout import storage + +usb_cdc.enable(data=True) + if layout.check_key(): print("Key pressed") storage.remount("/", readonly=False) diff --git a/ergol.py b/ergol.py new file mode 100644 index 0000000..df282af --- /dev/null +++ b/ergol.py @@ -0,0 +1,43 @@ +from kmk.keys import make_key +from kmk.keys import ModifierKey, KeyboardKey + +make_key(code=4, names=("A",), constructor=KeyboardKey) +make_key(code=5, names=("B",), constructor=KeyboardKey) +make_key(code=26, names=("C",), constructor=KeyboardKey) +make_key(code=12, names=("D",), constructor=KeyboardKey) +make_key(code=7, names=("E",), constructor=KeyboardKey) +make_key(code=10, names=("F",), constructor=KeyboardKey) +make_key(code=54, names=("G",), constructor=KeyboardKey) +make_key(code=16, names=("H",), constructor=KeyboardKey) +make_key(code=15, names=("I",), constructor=KeyboardKey) +make_key(code=48, names=("J",), constructor=KeyboardKey) + +make_key(code=56, names=("K",), constructor=KeyboardKey) +make_key(code=11, names=("L",), constructor=KeyboardKey) +make_key(code=24, names=("M",), constructor=KeyboardKey) +make_key(code=09, names=("N",), constructor=KeyboardKey) +make_key(code=8, names=("O",), constructor=KeyboardKey) +make_key(code=21, names=("P",), constructor=KeyboardKey) +make_key(code=20, names=("Q",), constructor=KeyboardKey) + + +make_key(code=13, names=("R",), constructor=KeyboardKey) +make_key(code=22, names=("S",), constructor=KeyboardKey) +make_key(code=14, names=("T",), constructor=KeyboardKey) +make_key(code=51, names=("U",), constructor=KeyboardKey) +make_key(code=25, names=("V",), constructor=KeyboardKey) +make_key(code=23, names=("W",), constructor=KeyboardKey) +make_key(code=27, names=("X",), constructor=KeyboardKey) +make_key(code=19, names=("Y",), constructor=KeyboardKey) +make_key(code=29, names=("Z",), constructor=KeyboardKey) + +make_key(code=39, names=("ZERO",), constructor=KeyboardKey) +make_key(code=30, names=("ONE",), constructor=KeyboardKey) +make_key(code=31, names=("TWO",), constructor=KeyboardKey) +make_key(code=32, names=("THREE",), constructor=KeyboardKey) +make_key(code=33, names=("FOUR",), constructor=KeyboardKey) +make_key(code=34, names=("FIVE",), constructor=KeyboardKey) +make_key(code=35, names=("SIX",), constructor=KeyboardKey) +make_key(code=36, names=("SEVEN",), constructor=KeyboardKey) +make_key(code=37, names=("EIGHT",), constructor=KeyboardKey) +make_key(code=38, names=("NINE",), constructor=KeyboardKey) diff --git a/json_layer.py b/json_layer.py index 9e98fc3..acc78d7 100644 --- a/json_layer.py +++ b/json_layer.py @@ -24,6 +24,7 @@ from kmk.modules.macros import Delay, Macros, Tap # I do not define it yet, only declare it. operators = {} + def key_of_json(element, inside=False): """ Create the key from the key name. The value can be either a string or a list. If the parameter is a @@ -39,7 +40,7 @@ def key_of_json(element, inside=False): key = key_of_json(hd) if len(tl) != 0: # Chainable key / recursive function - return key( key_of_json(tl) ) + return key(key_of_json(tl)) else: return key if isinstance(element, dict): @@ -47,6 +48,7 @@ def key_of_json(element, inside=False): return operators[key](value) return + def encode_macro(element): """ Encode the result of the function key_of_json in order to build a macro of this @@ -58,6 +60,7 @@ def encode_macro(element): return Tap(key) return key + def sequence(element): """ Convert a list of keys into a sequence of them. """ @@ -66,20 +69,24 @@ def sequence(element): # Send the list as arguments to the function return KC.MACRO(*seq) + def no_release(element): key = key_of_json(element) return key(no_release=True) + def no_press(element): key = key_of_json(element) return key(no_press=True) + # Now I can define the dictionnary -operators["key"] = key_of_json -operators["chain"] = key_of_json -operators["seq"] = sequence +operators["key"] = key_of_json +operators["chain"] = key_of_json +operators["seq"] = sequence operators["no_release"] = no_release -operators["no_press"] = no_press +operators["no_press"] = no_press + class Layer(object): """ Layer as an object. diff --git a/kmk_frnb.py b/kmk_frnb.py index a16c806..0c3a588 100644 --- a/kmk_frnb.py +++ b/kmk_frnb.py @@ -1,5 +1,6 @@ from kmk.keys import make_key from kmk.keys import ModifierKey, KeyboardKey +from ergol import * # Modifier keys make_key(code=0x01, names=("CONTROL", "^"), constructor=ModifierKey) @@ -9,19 +10,8 @@ make_key(code=0x08, names=("LEFT_GUI", "WINDOWS"), constructor=ModifierKey) make_key(code=0x40, names=("RIGHT_ALT", "ALTGR"), constructor=ModifierKey) make_key(code=0x20, names=("RIGHT_SHIFT",), constructor=ModifierKey) make_key(code=0x80, names=("RIGHT_GUI",), constructor=ModifierKey) -#SHIFT=make_key(code=225, names=("SHIFT",)) -#WINDOWS=make_key(code=0x08, names=("WINDOWS",)) - -make_key(code=39, names=("ZERO",), constructor=KeyboardKey) -make_key(code=30, names=("ONE",), constructor=KeyboardKey) -make_key(code=31, names=("TWO",), constructor=KeyboardKey) -make_key(code=32, names=("THREE",), constructor=KeyboardKey) -make_key(code=33, names=("FOUR",), constructor=KeyboardKey) -make_key(code=34, names=("FIVE",), constructor=KeyboardKey) -make_key(code=35, names=("SIX",), constructor=KeyboardKey) -make_key(code=36, names=("SEVEN",), constructor=KeyboardKey) -make_key(code=37, names=("EIGHT",), constructor=KeyboardKey) -make_key(code=38, names=("NINE",), constructor=KeyboardKey) +# SHIFT=make_key(code=225, names=("SHIFT",)) +# WINDOWS=make_key(code=0x08, names=("WINDOWS",)) make_key(code=80, names=("LEFT_ARROW",), constructor=KeyboardKey) make_key(code=79, names=("RIGHT_ARROW",), constructor=KeyboardKey) @@ -30,98 +20,35 @@ make_key(code=81, names=("DOWN_ARROW",), constructor=KeyboardKey) make_key(code=78, names=("PAGE_DOWN",), constructor=KeyboardKey) make_key(code=75, names=("PAGE_UP",), constructor=KeyboardKey) -make_key(code=4, names=("A",), constructor=KeyboardKey) -make_key(code=20, names=("B",), constructor=KeyboardKey) -make_key(code=11, names=("C",), constructor=KeyboardKey) -make_key(code=12, names=("D",), constructor=KeyboardKey) -make_key(code=9, names=("E",), constructor=KeyboardKey) -make_key(code=56, names=("F",), constructor=KeyboardKey) -make_key(code=54, names=("G",), constructor=KeyboardKey) -make_key(code=55, names=("H",), constructor=KeyboardKey) -make_key(code=7, names=("I",), constructor=KeyboardKey) -make_key(code=19, names=("J",), constructor=KeyboardKey) -make_key(code=5, names=("K",), constructor=KeyboardKey) -make_key(code=18, names=("L",), constructor=KeyboardKey) -make_key(code=52, names=("M",), constructor=KeyboardKey) -make_key(code=51, names=("N",), constructor=KeyboardKey) -make_key(code=21, names=("O",), constructor=KeyboardKey) -make_key(code=8, names=("P",), constructor=KeyboardKey) -make_key(code=16, names=("Q",), constructor=KeyboardKey) -make_key(code=15, names=("R",), constructor=KeyboardKey) -make_key(code=14, names=("S",), constructor=KeyboardKey) -make_key(code=13, names=("T",), constructor=KeyboardKey) -make_key(code=22, names=("U",), constructor=KeyboardKey) -make_key(code=24, names=("V",), constructor=KeyboardKey) -make_key(code=48, names=("W",), constructor=KeyboardKey) -make_key(code=6, names=("X",), constructor=KeyboardKey) -make_key(code=27, names=("Y",), constructor=KeyboardKey) -make_key(code=47, names=("Z",), constructor=KeyboardKey) - -make_key(code=89, names=("KEYPAD_ONE", "KP_0"), constructor=KeyboardKey) -make_key(code=98, names=("KEYPAD_ZERO", "KP_1"), constructor=KeyboardKey) -make_key(code=90, names=("KEYPAD_TWO", "KP_2"), constructor=KeyboardKey) -make_key(code=91, names=("KEYPAD_THREE","KP_3"), constructor=KeyboardKey) -make_key(code=92, names=("KEYPAD_FOUR", "KP_4"), constructor=KeyboardKey) -make_key(code=93, names=("KEYPAD_FIVE", "KP_5"), constructor=KeyboardKey) -make_key(code=94, names=("KEYPAD_SIX", "KP_6"), constructor=KeyboardKey) -make_key(code=95, names=("KEYPAD_SEVEN","KP_7"), constructor=KeyboardKey) -make_key(code=96, names=("KEYPAD_EIGHT","KP_8"), constructor=KeyboardKey) -make_key(code=97, names=("KEYPAD_NINE", "KP_9"), constructor=KeyboardKey) -make_key(code=86, names=("KEYPAD_MINUS","KP_MINUS"), constructor=KeyboardKey) -make_key(code=99, names=("KEYPAD_PERIOD","KP_DOT"), constructor=KeyboardKey) +make_key(code=89, names=("KEYPAD_ONE", "KP_0"), constructor=KeyboardKey) +make_key(code=98, names=("KEYPAD_ZERO", "KP_1"), constructor=KeyboardKey) +make_key(code=90, names=("KEYPAD_TWO", "KP_2"), constructor=KeyboardKey) +make_key(code=91, names=("KEYPAD_THREE", "KP_3"), constructor=KeyboardKey) +make_key(code=92, names=("KEYPAD_FOUR", "KP_4"), constructor=KeyboardKey) +make_key(code=93, names=("KEYPAD_FIVE", "KP_5"), constructor=KeyboardKey) +make_key(code=94, names=("KEYPAD_SIX", "KP_6"), constructor=KeyboardKey) +make_key(code=95, names=("KEYPAD_SEVEN", "KP_7"), constructor=KeyboardKey) +make_key(code=96, names=("KEYPAD_EIGHT", "KP_8"), constructor=KeyboardKey) +make_key(code=97, names=("KEYPAD_NINE", "KP_9"), constructor=KeyboardKey) +make_key(code=86, names=("KEYPAD_MINUS", "KP_MINUS"), constructor=KeyboardKey) +make_key(code=99, names=("KEYPAD_PERIOD", "KP_DOT"), constructor=KeyboardKey) make_key(code=87, names=("KEYPAD_PLUS", "KP_PLUS"), constructor=KeyboardKey) -make_key(code=85, names=("KEYPAD_ASTERISK","KP_ASTERISK"), constructor=KeyboardKey) -make_key(code=84, names=("KEYPAD_FORWARD_SLASH","KP_SLASH"), constructor=KeyboardKey) +make_key(code=85, names=("KEYPAD_ASTERISK", "KP_ASTERISK"), constructor=KeyboardKey) +make_key(code=84, names=("KEYPAD_FORWARD_SLASH", "KP_SLASH"), constructor=KeyboardKey) make_key(code=83, names=("KEYPAD_NUMLOCK", "NUM_LOCK"), constructor=KeyboardKey) -make_key(code=40, names=("RETURN","ENTER"), constructor=KeyboardKey) +make_key(code=40, names=("RETURN", "ENTER"), constructor=KeyboardKey) make_key(code=44, names=("SPACE", "SPACEBAR"), constructor=KeyboardKey) +make_key(code=227, names=("GUI",), constructor=KeyboardKey) +make_key(code=74, names=("HOME",), constructor=KeyboardKey) +make_key(code=73, names=("INSERT",), constructor=KeyboardKey) make_key(code=101, names=("APPLICATION",), constructor=KeyboardKey) -make_key(code=26, names=("Accent_aigu",), constructor=KeyboardKey) -make_key(code=28, names=("Accent_circonflexe",), constructor=KeyboardKey) -make_key(code=23, names=("Accent_grave",), constructor=KeyboardKey) -make_key(code=49, names=("BACKSLASH",), constructor=KeyboardKey) -make_key(code=42, names=("BACKSPACE",), constructor=KeyboardKey) -make_key(code=47, names=("Barre_couvrante",), constructor=KeyboardKey) -make_key(code=18, names=("Barre_oblique_couvrante",), constructor=KeyboardKey) -make_key(code=15, names=("Brève",), constructor=KeyboardKey) -make_key(code=57, names=("CAPS_LOCK",), constructor=KeyboardKey) -make_key(code=10, names=("COMMA",), constructor=KeyboardKey) -make_key(code=227, names=("COMMAND",), constructor=KeyboardKey) -make_key(code=24, names=("Caron",), constructor=KeyboardKey) -make_key(code=11, names=("Cédille",), constructor=KeyboardKey) make_key(code=76, names=("DELETE",), constructor=KeyboardKey) make_key(code=77, names=("END",), constructor=KeyboardKey) -make_key(code=46, names=("EQUALS",), constructor=KeyboardKey) make_key(code=41, names=("ESCAPE",), constructor=KeyboardKey) -make_key(code=13, names=("Exposants",), constructor=KeyboardKey) -make_key(code=23, names=("FORWARD_SLASH",), constructor=KeyboardKey) -make_key(code=17, names=("GRAVE_ACCENT",), constructor=KeyboardKey) -make_key(code=227, names=("GUI",), constructor=KeyboardKey) -make_key(code=74, names=("HOME",), constructor=KeyboardKey) -make_key(code=73, names=("INSERT",), constructor=KeyboardKey) -make_key(code=29, names=("RIGHT_BRACKET",), constructor=KeyboardKey) -make_key(code=28, names=("LEFT_BRACKET",), constructor=KeyboardKey) -make_key(code=14, names=("Latin_et_ponctuation",), constructor=KeyboardKey) -make_key(code=54, names=("Lettres_grecques",), constructor=KeyboardKey) -make_key(code=45, names=("MINUS",), constructor=KeyboardKey) -make_key(code=52, names=("Macron",), constructor=KeyboardKey) -make_key(code=100, names=("OEM_102",), constructor=KeyboardKey) -make_key(code=226, names=("OPTION",), constructor=KeyboardKey) -make_key(code=56, names=("Ogonek",), constructor=KeyboardKey) -make_key(code=72, names=("PAUSE",), constructor=KeyboardKey) -make_key(code=25, names=("PERIOD",), constructor=KeyboardKey) -make_key(code=70, names=("PRINT_SCREEN",), constructor=KeyboardKey) -make_key(code=55, names=("Point_souscrit",), constructor=KeyboardKey) -make_key(code=53, names=("QUOTE",), constructor=KeyboardKey) -make_key(code=26, names=("SEMICOLON",), constructor=KeyboardKey) -make_key(code=71, names=("SCROLL_LOCK",), constructor=KeyboardKey) -make_key(code=12, names=("Symboles_scientifiques",), constructor=KeyboardKey) -make_key(code=16, names=("Rond_en_chef",), constructor=KeyboardKey) +make_key(code=227, names=("COMMAND",), constructor=KeyboardKey) make_key(code=43, names=("TAB",), constructor=KeyboardKey) -make_key(code=51, names=("Tilde",), constructor=KeyboardKey) -make_key(code=7, names=("Tréma",), constructor=KeyboardKey) make_key(code=58, names=("F1",), constructor=KeyboardKey) make_key(code=59, names=("F2",), constructor=KeyboardKey) diff --git a/layout.py b/layout.py index 3dfb828..4bc0eb1 100644 --- a/layout.py +++ b/layout.py @@ -1,16 +1,15 @@ # Describe the layout used in the keyboard # import board -from digitalio import Pull +from digitalio import DigitalInOut, Direction, Pull from kmk.scanners import DiodeOrientation -col_pins = (board.GP26,board.GP27,board.GP28,board.GP29) -row_pins = (board.GP22,board.GP20,board.GP23,board.GP21) +col_pins = (board.GP26, board.GP27, board.GP28, board.GP29) +row_pins = (board.GP22, board.GP20, board.GP23, board.GP21) diode_orientation = DiodeOrientation.ROW2COL -from digitalio import DigitalInOut, Direction, Pull def check_key(): """ Check if a key is pressed and return True if so. @@ -38,6 +37,7 @@ def check_key(): return result return False + def set_keyboard(keyboard): """ Initialize the kmk keyboard with the values defined here. """ diff --git a/oled.py b/oled.py index ab4c917..91a6818 100644 --- a/oled.py +++ b/oled.py @@ -4,12 +4,14 @@ 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 -from supervisor import ticks_ms + class NamedLayer(TextEntry): - """ This is a named layer which return the name of the current mappng as text. + """ This is a named layer which return the name of the current mappng as + text. """ def __init__(self, keyboard, *args, **kwargs): @@ -21,7 +23,7 @@ class NamedLayer(TextEntry): def text(self): try: return self.keyboard.keymap[0].name - except: + except _: return self._text @text.setter @@ -29,6 +31,31 @@ class NamedLayer(TextEntry): 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 @@ -36,12 +63,22 @@ class CustomDisplay(Display): 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 @@ -50,7 +87,6 @@ class CustomDisplay(Display): if self.keyboard.keymap[0].name != self._prevLayers: self._prevLayers = self.keyboard.keymap[0].name self.render(sandbox.active_layers[0]) - return @property def timer_start(self): @@ -62,6 +98,7 @@ class CustomDisplay(Display): if self.keyboard: self.keyboard.keymap[0].timer_start = value + def main(keyboard): driver = SSD1306( @@ -73,5 +110,6 @@ def main(keyboard): ) display.entries = [ NamedLayer(keyboard, text="", x=0, y=0), + StatusLayer(text="Num", display=display, prop="numlock", x=0, y=20), ] keyboard.extensions.append(display) diff --git a/serial_conn.py b/serial_conn.py index a781d64..7645563 100644 --- a/serial_conn.py +++ b/serial_conn.py @@ -4,6 +4,7 @@ import time from kmk.modules import Module from usb_cdc import data + class Client(Module): """ Listen the connections from host, and apply the actions depending of the json command. @@ -31,13 +32,12 @@ class Client(Module): if current_name != "Disconnected": self.last_name = current_name keyboard.keymap[0].name = "Disconnected" - time.sleep(1) + # 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: return @@ -53,7 +53,7 @@ class Client(Module): jdata = json.loads(content) except ValueError as err: # In circuitPython, json error are reported as ValueError. - # seet https://docs.circuitpython.org/en/latest/docs/library/json.html#json.load + # see https://docs.circuitpython.org/en/latest/docs/library/json.html#json.load print(err, line) return @@ -61,7 +61,7 @@ class Client(Module): # direct raw layer instruction if this does not work. actions = { - "layer" : lambda x : keyboard.keymap[0].load(x), + "layer": lambda x: keyboard.keymap[0].load(x), } try: -- cgit v1.2.3