From e8a5f7a4b6d71eca1060c52ffd22aec55a8d24f0 Mon Sep 17 00:00:00 2001 From: Zackarias Montell Date: Sun, 9 Jan 2022 21:04:14 +0100 Subject: [PATCH] made test for toggle key self sustained --- keyboard.py | 2 +- keytypes.py | 60 ++++++++++++++--------------------------------------- tests.py | 4 ++-- 3 files changed, 18 insertions(+), 48 deletions(-) diff --git a/keyboard.py b/keyboard.py index 4610b39..055ee2e 100644 --- a/keyboard.py +++ b/keyboard.py @@ -151,10 +151,10 @@ class Keyboard: print("Done initializing keyboard") def _initialize_keymap(self, keymap: list[list[KeyBase]]) -> list[list[KeyBase]]: - test_keymap(keymap, True) for layer in keymap: for key in layer: key.enrich(layer.index(key), keymap.index(layer)) + test_keymap(keymap, True) return keymap def initialize_hid(self) -> tuple[usb_hid.Device, usb_hid.Device]: diff --git a/keytypes.py b/keytypes.py index 590b4df..c9ca517 100644 --- a/keytypes.py +++ b/keytypes.py @@ -94,7 +94,7 @@ class KeycodeBase(KeyBase): def self_test(self, keymap): raise NotImplementedError - def soft_release(self, keyboard, pin): + def soft_release(self, keyboard): if self.events.current != KeyEvent.PRESSED_: return self._set_event(KeyEvent.SOFT_RELEASED) @@ -102,7 +102,7 @@ class KeycodeBase(KeyBase): def _consume_next_event(self, pin) -> bool: """Returns: a boolean representing if the event property was updated with a new event or not""" next_pin_event = pin.read_event() - current_key_event, previous_key_event = self.events.current, self.events.previous + current_key_event = self.events.current next_key_event = None if current_key_event == KeyEvent.NO_EVENT: if next_pin_event == PinEvent.NO_EVENT: @@ -210,6 +210,11 @@ class Toggle(LayerKeyBase): return self._set_event(KeyEvent.NO_EVENT) # Then handle each event transition emulating a trigger key + if current_key_event == KeyEvent.RELEASED: + if next_pin_event == PinEvent.PRESSED: + return self._set_event(KeyEvent.PRESSED_TOGGLED_ON) + if next_pin_event == PinEvent.RELEASED: + return self._set_event(KeyEvent.NO_EVENT) if current_key_event == KeyEvent.PRESSED_TOGGLED_ON: if next_pin_event == PinEvent.PRESSED: return self._set_event(KeyEvent.NO_EVENT) @@ -225,11 +230,6 @@ class Toggle(LayerKeyBase): return self._set_event(KeyEvent.NO_EVENT) if next_pin_event == PinEvent.RELEASED: return self._set_event(KeyEvent.RELEASED) - if current_key_event == KeyEvent.RELEASED: - if next_pin_event == PinEvent.PRESSED: - return self._set_event(KeyEvent.PRESSED_TOGGLED_ON) - if next_pin_event == PinEvent.RELEASED: - return self._set_event(KeyEvent.NO_EVENT) raise NotImplementedError() @@ -254,6 +254,7 @@ class Toggle(LayerKeyBase): return if current == KeyEvent.RELEASED: return + raise NotImplementedError() def handle(self, keyboard, pin: Pin): @@ -261,8 +262,12 @@ class Toggle(LayerKeyBase): return self._handle_event(keyboard, pin) - def self_test(self, keymap: list[list[object]]): - raise NotImplementedError() + def self_test(self, keymap: list[list[KeyBase]]): + key_on_layer_to_switch_to = keymap[self.layer_to_switch_to][self.key_index] + if key_on_layer_to_switch_to is self: + return + raise Exception( + f"Toggle layer key must have an identical Toggle layer key on layer[{self.layer_to_switch_to}] key[{self.key_index}]") def soft_release(self, keyboard): pressed = self.events.current not in [ @@ -271,48 +276,13 @@ class Toggle(LayerKeyBase): return self._set_event(KeyEvent.SOFT_RELEASED) - # todo: Release all keys not the same as the old layer - # todo: Debounce old toggle when pressing new toggle - # if type(key) is Toggle: - # if currentlyPressed and not previouslyToggled and not previouslyToggledReleased and not previouslyUntoggledPressed: - # self.toggled_layer = key.layer - # self.held_layer = None - # self.pin_states_last_cycle[pin_index] = ( - # __TOGGLED_PRESSED, key) - # for i in range(len(self.pin_states_last_cycle)): - # if i == pin_index or len(self.pin_states_last_cycle[i]) == 1: - # continue - # value, last_keycode = self.pin_states_last_cycle[i] - # if type(last_keycode) is Toggle: - # self.pin_states_last_cycle[i] = ( - # __UNPRESSED,) - # if type(last_keycode) is Hold: - # self.held_layer = None - # self.pin_states_last_cycle[i] = ( - # __DEBOUNCE,) - # continue - # if not currentlyPressed and previouslyToggled: - # self.pin_states_last_cycle[pin_index] = ( - # __TOGGLED_RELEASED, key) - # continue - # if currentlyPressed and previouslyToggledReleased: - # self.toggled_layer = 0 - # self.pin_states_last_cycle[pin_index] = ( - # __UNTOGGLED_PRESSED, key) - # continue - # if not currentlyPressed and previouslyUntoggledPressed: - # self.pin_states_last_cycle[pin_index] = ( - # __UNPRESSED,) - # continue -# - class Hold(LayerKeyBase): def __init__(self, layer: int): allowed_events = [KeyEvent.SOFT_RELEASED] super().__init__(layer, allowed_events) - def soft_release(self, keyboard, pin): + def soft_release(self, keyboard): pass # todo: Release all keys not the same as the old layer diff --git a/tests.py b/tests.py index 50b08b3..d71c3e6 100644 --- a/tests.py +++ b/tests.py @@ -1,4 +1,4 @@ -from keytypes import Keycode, Modifier +from keytypes import Keycode, Modifier, Toggle def test_keymap(keymap: list[list], output: bool = False) -> None: @@ -6,7 +6,7 @@ def test_keymap(keymap: list[list], output: bool = False) -> None: print("Testing keymap for errors") for layer in keymap: for key in layer: - if isinstance(key, Keycode) or isinstance(key, Modifier): + if isinstance(key, Keycode) or isinstance(key, Modifier) or isinstance(key, Toggle): print( f"[{keymap.index(layer)}][{layer.index(key)}] {key.__class__.__name__}", end=": ") key.self_test(keymap)