made test for toggle key self sustained
This commit is contained in:
@@ -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]:
|
||||
|
||||
60
keytypes.py
60
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
|
||||
|
||||
4
tests.py
4
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)
|
||||
|
||||
Reference in New Issue
Block a user