diff options
-rw-r--r-- | tmk_core/common.mk | 17 | ||||
-rw-r--r-- | tmk_core/common/debounce.c | 22 | ||||
-rw-r--r-- | tmk_core/common/debounce.h | 21 | ||||
-rw-r--r-- | tmk_core/common/debounce/debounce_eager_pk.c | 124 | ||||
-rw-r--r-- | tmk_core/common/debounce/debounce_sym_g.c | 59 | ||||
-rw-r--r-- | tmk_core/common/debounce/readme.md | 28 | ||||
-rw-r--r-- | tmk_core/common/keyboard.c | 9 |
7 files changed, 4 insertions, 276 deletions
diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 7a7b3928f4..335a36cfe7 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -1,5 +1,5 @@ COMMON_DIR = common -DEBOUNCE = $(COMMON_DIR)/debounce + ifeq ($(PLATFORM),AVR) PLATFORM_COMMON_DIR = $(COMMON_DIR)/avr else ifeq ($(PLATFORM),CHIBIOS) @@ -12,7 +12,6 @@ endif TMK_COMMON_SRC += $(COMMON_DIR)/host.c \ $(COMMON_DIR)/keyboard.c \ - $(COMMON_DIR)/debounce.c \ $(COMMON_DIR)/action.c \ $(COMMON_DIR)/action_tapping.c \ $(COMMON_DIR)/action_macro.c \ @@ -62,20 +61,6 @@ ifeq ($(PLATFORM),TEST) TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom.c endif -# Debounce Modules. If implemented in matrix.c, don't use these. -ifeq ($(strip $(SPLIT_KEYBOARD)), yes) - # Do nothing, debouncing is inside matrix.c inside split_common -else ifeq ($(strip $(DEBOUNCE_ALGO)), manual) - # Do nothing. do your debouncing in matrix.c -else ifeq ($(strip $(DEBOUNCE_ALGO)), sym_g) - TMK_COMMON_SRC += $(DEBOUNCE)/debounce_sym_g.c -else ifeq ($(strip $(DEBOUNCE_ALGO)), eager_pk) - TMK_COMMON_SRC += $(DEBOUNCE)/debounce_eager_pk.c -else ifeq ($(strip $(CUSTOM_MATRIX)), yes) - # Do nothing. Custom matrix code. -else # default algorithm - TMK_COMMON_SRC += $(DEBOUNCE)/debounce_sym_g.c -endif # Option modules BOOTMAGIC_ENABLE ?= no diff --git a/tmk_core/common/debounce.c b/tmk_core/common/debounce.c deleted file mode 100644 index 406d2d0f38..0000000000 --- a/tmk_core/common/debounce.c +++ /dev/null @@ -1,22 +0,0 @@ -/* -Copyright 2017 Alex Ong<the.onga@gmail.com> -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ -#include "debounce.h" -#include "matrix.h" -//Default implementation - no debouncing -__attribute__((weak)) void matrix_debounce_init(void) {} -__attribute__((weak)) void matrix_debounce(void) {} -__attribute__((weak)) matrix_row_t matrix_debounce_get_row(uint8_t row) -{ - return matrix_get_row(row); -} diff --git a/tmk_core/common/debounce.h b/tmk_core/common/debounce.h deleted file mode 100644 index fe3effab32..0000000000 --- a/tmk_core/common/debounce.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef DEBOUNCE_H -#define DEBOUNCE_H -#include <stdbool.h> -#include <stdint.h> -#include "matrix.h" -#ifdef __cplusplus -extern "C" { -#endif - /* called to initialize any data stores your implementation has*/ - void matrix_debounce_init(void); - /* call this every keyboard_task to debounce the matrix*/ - void matrix_debounce(void); - /* matrix state on row */ - matrix_row_t matrix_debounce_get_row(uint8_t row); - /* whether a switch is on */ - bool matrix_debounce_is_on(uint8_t row, uint8_t col); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/tmk_core/common/debounce/debounce_eager_pk.c b/tmk_core/common/debounce/debounce_eager_pk.c deleted file mode 100644 index 984da0570a..0000000000 --- a/tmk_core/common/debounce/debounce_eager_pk.c +++ /dev/null @@ -1,124 +0,0 @@ -/* -Copyright 2017 Alex Ong<the.onga@gmail.com> -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -/* -Basic per-key algorithm. Uses an 8-bit counter per key. -After pressing a key, it immediately changes state, and sets a counter. -No further inputs are accepted until DEBOUNCE milliseconds have occurred. -*/ - -#include "debounce.h" -#include "matrix.h" -#include "timer.h" - -#ifndef DEBOUNCE - #define DEBOUNCE 5 -#endif - - -#if (MATRIX_COLS <= 8) -# define ROW_SHIFTER ((uint8_t)1) -#elif (MATRIX_COLS <= 16) -# define ROW_SHIFTER ((uint16_t)1) -#elif (MATRIX_COLS <= 32) -# define ROW_SHIFTER ((uint32_t)1) -#endif - - - -#define debounce_counter_t uint8_t - -static matrix_row_t matrix_debounced[MATRIX_ROWS]; -static debounce_counter_t debounce_counters[MATRIX_ROWS*MATRIX_COLS]; - -#define DEBOUNCE_ELAPSED 251 -#define MAX_DEBOUNCE (DEBOUNCE_ELAPSED - 1) - -void update_debounce_counters(uint8_t current_time); -void transfer_matrix_values(uint8_t current_time); - -void matrix_debounce_init(void) -{ - for (uint8_t r = 0; r < MATRIX_ROWS; r++) - { - matrix_debounced[r] = 0; - } - - int i = 0; - for (uint8_t r = 0; r < MATRIX_ROWS; r++) - { - for (uint8_t c = 0; c < MATRIX_COLS; c++) - { - debounce_counters[i++] = DEBOUNCE_ELAPSED; - } - } -} - -void matrix_debounce(void) -{ - uint8_t current_time = timer_read() % MAX_DEBOUNCE; - update_debounce_counters(current_time); - transfer_matrix_values(current_time); -} - -//If the current time is > debounce counter, set the counter to enable input. -void update_debounce_counters(uint8_t current_time) -{ - debounce_counter_t *debounce_pointer = debounce_counters; - for (uint8_t row = 0; row < MATRIX_ROWS; row++) - { - for (uint8_t col = 0; col < MATRIX_COLS; col++) - { - if (*debounce_pointer != DEBOUNCE_ELAPSED) - { - if (TIMER_DIFF(current_time, *debounce_pointer, MAX_DEBOUNCE) >= - DEBOUNCING_DELAY) { - *debounce_pointer = DEBOUNCE_ELAPSED; - } - } - debounce_pointer++; - } - } -} - -// upload from raw_matrix to final matrix; -void transfer_matrix_values(uint8_t current_time) -{ - debounce_counter_t *debounce_pointer = debounce_counters; - for (uint8_t row = 0; row < MATRIX_ROWS; row++) - { - matrix_row_t existing_row = matrix_debounced[row]; - matrix_row_t raw_row = matrix_get_row(row); - - for (uint8_t col = 0; col < MATRIX_COLS; col++) - { - matrix_row_t col_mask = (ROW_SHIFTER << col); - bool final_value = raw_row & col_mask; - bool existing_value = existing_row & col_mask; - if (*debounce_pointer == DEBOUNCE_ELAPSED && - (existing_value != final_value)) - { - *debounce_pointer = current_time; - existing_row ^= col_mask; //flip the bit. - } - debounce_pointer++; - } - matrix_debounced[row] = existing_row; - } -} - -matrix_row_t matrix_debounce_get_row(uint8_t row) -{ - return matrix_debounced[row]; -} diff --git a/tmk_core/common/debounce/debounce_sym_g.c b/tmk_core/common/debounce/debounce_sym_g.c deleted file mode 100644 index 2fb7a589d7..0000000000 --- a/tmk_core/common/debounce/debounce_sym_g.c +++ /dev/null @@ -1,59 +0,0 @@ -/* -Copyright 2017 Alex Ong<the.onga@gmail.com> -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -/* -Basic global debounce algorithm. Used in 99% of keyboards at time of implementation -When no state changes have occured for DEBOUNCE milliseconds, we push the state. -*/ -#include "debounce.h" -#include "matrix.h" -#include "timer.h" -#ifndef DEBOUNCE - #define DEBOUNCE 5 -#endif -static matrix_row_t matrix_debounced[MATRIX_ROWS]; -static bool debouncing = false; -static uint16_t debouncing_time; - -void matrix_debounce_init(void) -{ - for (uint8_t r = 0; r < MATRIX_ROWS; r++) - { - matrix_debounced[r] = 0; - } -} - -void matrix_debounce(void) -{ - for (uint8_t r = 0; r < MATRIX_ROWS; r++) - { - matrix_row_t raw = matrix_get_row(r); - if (raw != matrix_debounced[r]) - { - debouncing = true; - debouncing_time = timer_read(); - } - } - if (debouncing && timer_elapsed(debouncing_time) > DEBOUNCE) { - for (int i = 0; i < MATRIX_ROWS; i++) { - matrix_debounced[i] = matrix_get_row(i); - } - debouncing = false; - } -} - -matrix_row_t matrix_debounce_get_row(uint8_t row) -{ - return matrix_debounced[row]; -} diff --git a/tmk_core/common/debounce/readme.md b/tmk_core/common/debounce/readme.md deleted file mode 100644 index 1a77d44df5..0000000000 --- a/tmk_core/common/debounce/readme.md +++ /dev/null @@ -1,28 +0,0 @@ -Debounce algorithms belong in this folder. -Here are a few ideas - -1) Global vs Per-Key vs Per-Row - * Global - one timer for all keys. Any key change state affects global timer - * Per key - one timer per key - * Per row - one timer per row - -2) Eager vs symmetric vs assymetric - * Eager - any key change is reported immediately. All further inputs for DEBOUNCE ms are ignored. - * Symmetric - wait for no changes for DEBOUNCE ms before reporting change - * Assymetric - wait for different times depending on key-down/key-up. E.g. Eager key-down, DEBOUNCE ms key up. - -3) Timestamp vs cycles - * old old old code waits n cycles, decreasing count by one each matrix_scan - * newer code stores the millisecond the change occurred, and does subraction to figure out time elapsed. - * Timestamps are superior, i don't think cycles will ever be used again once upgraded. - -The default algorithm is symmetric and global. -Here are a few that could be implemented: - -debounce_sym_g.c -debounce_sym_pk.c -debounce_sym_pr.c -debounce_sym_pr_cycles.c //currently used in ergo-dox -debounce_eager_g.c -debounce_eager_pk.c -debounce_eager_pr.c //could be used in ergo-dox! diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index 1bfd4c9cca..d223001160 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -18,7 +18,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include <stdint.h> #include "keyboard.h" #include "matrix.h" -#include "debounce.h" #include "keymap.h" #include "host.h" #include "led.h" @@ -164,8 +163,7 @@ bool is_keyboard_master(void) { */ void keyboard_init(void) { timer_init(); - matrix_init(); - matrix_debounce_init(); + matrix_init(); #ifdef QWIIC_ENABLE qwiic_init(); #endif @@ -225,12 +223,11 @@ void keyboard_task(void) uint8_t keys_processed = 0; #endif - matrix_scan(); - matrix_debounce(); + matrix_scan(); if (is_keyboard_master()) { for (uint8_t r = 0; r < MATRIX_ROWS; r++) { - matrix_row = matrix_debounce_get_row(r); + matrix_row = matrix_get_row(r); matrix_change = matrix_row ^ matrix_prev[r]; if (matrix_change) { #ifdef MATRIX_HAS_GHOST |