From 546458e3688a32723b0086fae066a1897c6c9c3a Mon Sep 17 00:00:00 2001 From: Tim Crawford Date: Mon, 24 Jul 2023 17:17:49 -0600 Subject: [PATCH] kbscan: Return early if debouncing A single timer is used for debouncing all keys, so there is no reason to perform any operations if the matrix is being debounced. Just return early and remove some of the convoluted logic. Signed-off-by: Tim Crawford --- src/board/system76/common/kbscan.c | 81 ++++++++++++++---------------- 1 file changed, 37 insertions(+), 44 deletions(-) diff --git a/src/board/system76/common/kbscan.c b/src/board/system76/common/kbscan.c index 124fa92..2b57248 100644 --- a/src/board/system76/common/kbscan.c +++ b/src/board/system76/common/kbscan.c @@ -328,8 +328,11 @@ void kbscan_event(void) { if (debounce) { uint32_t time = time_get(); if ((time - debounce_time) >= DEBOUNCE_DELAY) { - // Finish debounce + // Debounce time elapsed: Read new state debounce = false; + } else { + // If still debouncing, don't do anything. + return; } } @@ -338,11 +341,11 @@ void kbscan_event(void) { uint8_t last = kbscan_matrix[i]; if (new != last) { if (kbscan_has_ghost_in_row(i, new)) { - kbscan_ghost[i] = true; continue; - } else if (kbscan_ghost[i]) { - kbscan_ghost[i] = false; - // Debounce to allow remaining ghosts to settle. + } + + // Some key has changed state: Start debounce + if (!debounce) { debounce = true; debounce_time = time_get(); } @@ -356,49 +359,39 @@ void kbscan_event(void) { if (new_b != last_b) { bool reset = false; - // If debouncing - if (debounce) { - // Debounce presses and releases - reset = true; - } else { - // Begin debounce - debounce = true; - debounce_time = time_get(); + // Check keys used for config reset + if (matrix_position_is_esc(i, j)) + kbscan_esc_held = new_b; + if (matrix_position_is_fn(i, j)) + kbscan_fn_held = new_b; - // Check keys used for config reset - if (matrix_position_is_esc(i, j)) - kbscan_esc_held = new_b; - if (matrix_position_is_fn(i, j)) - kbscan_fn_held = new_b; + // Handle key press/release + if (new_b) { + // On a press, cache the layer the key was pressed on + kbscan_last_layer[i][j] = kbscan_layer; + } + uint8_t key_layer = kbscan_last_layer[i][j]; + uint16_t key = 0; + keymap_get(key_layer, i, j, &key); + if (key) { + DEBUG("KB %d, %d, %d = 0x%04X, %d\n", i, j, key_layer, key, new_b); + if (!kbscan_press(key, new_b, &layer)) { + // In the case of ignored key press/release, reset bit + reset = true; + } - // Handle key press/release if (new_b) { - // On a press, cache the layer the key was pressed on - kbscan_last_layer[i][j] = kbscan_layer; - } - uint8_t key_layer = kbscan_last_layer[i][j]; - uint16_t key = 0; - keymap_get(key_layer, i, j, &key); - if (key) { - DEBUG("KB %d, %d, %d = 0x%04X, %d\n", i, j, key_layer, key, new_b); - if (!kbscan_press(key, new_b, &layer)) { - // In the case of ignored key press/release, reset bit - reset = true; - } - - if (new_b) { - // New key pressed, update last key - repeat_key = key; - repeat_key_time = time_get(); - repeat = false; - } else if (key == repeat_key) { - // Repeat key was released - repeat_key = 0; - repeat = false; - } - } else { - WARN("KB %d, %d, %d missing\n", i, j, kbscan_layer); + // New key pressed, update last key + repeat_key = key; + repeat_key_time = time_get(); + repeat = false; + } else if (key == repeat_key) { + // Repeat key was released + repeat_key = 0; + repeat = false; } + } else { + WARN("KB %d, %d, %d missing\n", i, j, kbscan_layer); } // Reset bit to last state