broke out layer led function and started on debouncing

This commit is contained in:
2022-01-12 20:34:56 +01:00
parent 260d9a3483
commit 38c95b587c
4 changed files with 43 additions and 39 deletions

63
keyboard.py Normal file → Executable file
View File

@@ -149,7 +149,6 @@ class Keyboard:
self.layer = LayerState()
self.led = RGBLED(rgb_pins)
self.led.indicate_boot()
if debug_repl:
print("Done initializing keyboard")
@@ -207,36 +206,6 @@ class Keyboard:
def get_key(self, layer_index, key_index) -> KeyBase:
return self.keymap[layer_index][key_index]
def start(self):
if self.debug_repl:
print("Starting keyboard")
try:
self._initialize_session_values()
if self.debug_repl:
print("Keyboard started")
while True:
for pin in self.pins:
layer = self.layer.get()
key = self.keymap[layer][pin.index]
key.handle(self, pin)
layer = self.layer.get()
if len(self.layer_colors) >= (layer + 1):
self.led.set(self.layer_colors[layer])
else:
self.led.off()
if self.pressed_keys != self.pressed_keys_last_cycle:
self.send_nkro_report()
self.pressed_keys_last_cycle = set(self.pressed_keys)
except Exception as e:
if self.debug_repl:
raise e
print(f"Exception thrown: {e}, restarting..")
self.led.indicate_exception()
time.sleep(1)
self.led.indicate_boot()
self.start()
def add_keycode_to_report(self, keycode: int):
self.pressed_keys.add(keycode)
@@ -247,6 +216,13 @@ class Keyboard:
# silently pass errors when same keycode has been issued twice
pass
def _update_layer_led(self) -> None:
layer = self.layer.get()
if len(self.layer_colors) >= (layer + 1):
self.led.set(self.layer_colors[layer])
else:
self.led.off()
# todo: add boot mode
def send_nkro_report(self):
"""Sends the USB HID NKRO keyboard report."""
@@ -262,3 +238,28 @@ class Keyboard:
if code & 0x00ff:
report_bitmap[code >> 3] |= 1 << (code & 0x7)
self.keyboard_device.send_report(report)
def start(self):
if self.debug_repl:
print("Starting keyboard")
self.led.indicate_boot()
try:
self._initialize_session_values()
if self.debug_repl:
print("Keyboard started")
while True:
for pin in self.pins:
key = self.get_key(self.layer.get(), pin.index)
key.handle(self, pin)
self._update_layer_led()
if self.pressed_keys != self.pressed_keys_last_cycle:
self.send_nkro_report()
self.pressed_keys_last_cycle = set(self.pressed_keys)
except Exception as e:
if self.debug_repl:
raise e
print(f"Exception thrown: {e}, restarting..")
self.led.indicate_exception()
time.sleep(1)
self.start()

0
keycodes.py Normal file → Executable file
View File

19
keytypes.py Normal file → Executable file
View File

@@ -120,8 +120,18 @@ 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 = self.events.current
current_key_event, previous_key_event = self.events.current, self.events.previous
next_key_event = None
if current_key_event == KeyEvent.SOFT_RELEASED:
if previous_key_event == KeyEvent.RELEASED:
return self._set_event(KeyEvent.RELEASED)
if next_pin_event == PinEvent.RELEASED:
return self._set_event(KeyEvent.RELEASED)
if previous_key_event == KeyEvent.PRESSED_ or next_pin_event == PinEvent.PRESSED:
return self._set_event(KeyEvent.SOFT_RELEASED)
return self._set_event(KeyEvent.NO_EVENT)
if current_key_event == KeyEvent.NO_EVENT:
if next_pin_event == PinEvent.NO_EVENT:
next_key_event = KeyEvent.NO_EVENT
@@ -143,13 +153,6 @@ class KeycodeBase(KeyBase):
next_key_event = KeyEvent.RELEASED
if next_pin_event == PinEvent.PRESSED:
next_key_event = KeyEvent.NO_EVENT
if current_key_event == KeyEvent.SOFT_RELEASED:
if next_pin_event == PinEvent.NO_EVENT:
next_key_event = KeyEvent.NO_EVENT
if next_pin_event == PinEvent.RELEASED:
next_key_event = KeyEvent.RELEASED
if next_pin_event == PinEvent.PRESSED:
next_key_event = KeyEvent.NO_EVENT
return self._set_event(next_key_event)

0
tests.py Normal file → Executable file
View File