diff --git a/kmk/firmware.py b/kmk/firmware.py index f33f6e6..6ba2399 100644 --- a/kmk/firmware.py +++ b/kmk/firmware.py @@ -94,26 +94,28 @@ class Firmware: print("Firin' lazers. Keyboard is booted.") while True: - update = self.matrix.scan_for_pressed() + for update in self.matrix.scan_for_pressed(): + if update is not None: + self._state.matrix_changed( + update[0], + update[1], + update[2], + ) - if update is not None: - self._state.matrix_changed( - update[0], - update[1], - update[2], - ) + if self._state.hid_pending: + self._send_hid() - if self._state.hid_pending: - self._send_hid() - - for key in self._state.pending_keys: - self._send_key(key) - self._state.pending_key_handled() - - if self._state.macro_pending: - for key in self._state.macro_pending(self): + for key in self._state.pending_keys: self._send_key(key) + self._state.pending_key_handled() - self._state.resolve_macro() + if self._state.macro_pending: + for key in self._state.macro_pending(self): + self._send_key(key) + + self._state.resolve_macro() + + if self.debug_enabled: + print('New State: {}'.format(self._state._to_dict())) gc.collect() diff --git a/kmk/internal_state.py b/kmk/internal_state.py index c2309cc..054bd9c 100644 --- a/kmk/internal_state.py +++ b/kmk/internal_state.py @@ -1,5 +1,6 @@ from kmk.keycodes import FIRST_KMK_INTERNAL_KEYCODE, Keycodes, RawKeycodes from kmk.kmktime import sleep_ms, ticks_diff, ticks_ms +from kmk.util import intify_coordinate GESC_TRIGGERS = { Keycodes.Modifiers.KC_LSHIFT, Keycodes.Modifiers.KC_RSHIFT, @@ -9,6 +10,7 @@ GESC_TRIGGERS = { class InternalState: keys_pressed = set() + coord_keys_pressed = {} pending_keys = [] macro_pending = None leader_pending = None @@ -52,8 +54,6 @@ class InternalState: ret = { 'keys_pressed': self.keys_pressed, 'active_layers': self.active_layers, - 'unicode_mode': self.unicode_mode, - 'tap_time': self.config.tap_time, 'leader_mode_history': self.leader_mode_history, 'start_time': self.start_time, } @@ -69,17 +69,18 @@ class InternalState: if not layer_key or layer_key == Keycodes.KMK.KC_TRNS: continue - if layer_key == Keycodes.KMK.KC_NO: - return layer_key + if self.config.debug_enabled: + print('Resolved key: {}'.format(layer_key)) return layer_key def matrix_changed(self, row, col, is_pressed): if self.config.debug_enabled: print('Matrix changed (col, row, pressed?): {}, {}, {}'.format( - row, col, is_pressed, + col, row, is_pressed, )) + int_coord = intify_coordinate(row, col) kc_changed = self._find_key_in_map(row, col) if kc_changed is None: @@ -94,8 +95,11 @@ class InternalState: else: if is_pressed: self.keys_pressed.add(kc_changed) + self.coord_keys_pressed[int_coord] = kc_changed else: self.keys_pressed.discard(kc_changed) + self.keys_pressed.discard(self.coord_keys_pressed[int_coord]) + self.coord_keys_pressed[int_coord] = None self.hid_pending = True diff --git a/kmk/matrix.py b/kmk/matrix.py index 4c16d63..448ca73 100644 --- a/kmk/matrix.py +++ b/kmk/matrix.py @@ -1,6 +1,7 @@ import digitalio from kmk.consts import DiodeOrientation +from kmk.util import intify_coordinate class MatrixScanner: @@ -47,8 +48,8 @@ class MatrixScanner: self.swap_indicies = {} if swap_indicies is not None: for k, v in swap_indicies.items(): - self.swap_indicies[self._intify_coordinate(*k)] = v - self.swap_indicies[self._intify_coordinate(*v)] = k + self.swap_indicies[intify_coordinate(*k)] = v + self.swap_indicies[intify_coordinate(*v)] = k self.rollover_cols_every_rows = rollover_cols_every_rows if self.rollover_cols_every_rows is None: @@ -58,9 +59,6 @@ class MatrixScanner: self.state = bytearray(self.len_state_arrays) self.report = bytearray(3) - def _intify_coordinate(self, row, col): - return row << 8 | col - def scan_for_pressed(self): ba_idx = 0 any_changed = False @@ -85,7 +83,7 @@ class MatrixScanner: self.report[0] = oidx self.report[1] = iidx - swap_src = self._intify_coordinate(self.report[0], self.report[1]) + swap_src = intify_coordinate(self.report[0], self.report[1]) if swap_src in self.swap_indicies: tgt_row, tgt_col = self.swap_indicies[swap_src] self.report[0] = tgt_row @@ -94,14 +92,12 @@ class MatrixScanner: self.report[2] = new_val self.state[ba_idx] = new_val any_changed = True - break + + yield self.report ba_idx += 1 opin.value(False) - if any_changed: - break - - if any_changed: - return self.report + if not any_changed: + yield None diff --git a/kmk/util.py b/kmk/util.py index fa7f608..c53c505 100644 --- a/kmk/util.py +++ b/kmk/util.py @@ -1,3 +1,7 @@ +def intify_coordinate(row, col): + return row << 8 | col + + def get_wide_ordinal(char): if len(char) != 2: return ord(char)