From 3cf7f7322c24e3cab21d402f1a859b60df857603 Mon Sep 17 00:00:00 2001 From: Alex Ong Date: Wed, 29 Aug 2018 10:19:36 +1000 Subject: Removed "debounce_algo = manual" in all keyboards with CUSTOM_MATRIX = yes. --- tmk_core/common.mk | 17 +++- tmk_core/common/debounce.c | 22 +++++ tmk_core/common/debounce.h | 21 +++++ tmk_core/common/debounce/debounce_eager_pk.c | 124 +++++++++++++++++++++++++++ tmk_core/common/debounce/debounce_sym_g.c | 59 +++++++++++++ tmk_core/common/debounce/readme.md | 28 ++++++ tmk_core/common/keyboard.c | 22 ++--- 7 files changed, 276 insertions(+), 17 deletions(-) create mode 100644 tmk_core/common/debounce.c create mode 100644 tmk_core/common/debounce.h create mode 100644 tmk_core/common/debounce/debounce_eager_pk.c create mode 100644 tmk_core/common/debounce/debounce_sym_g.c create mode 100644 tmk_core/common/debounce/readme.md (limited to 'tmk_core') diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 3e407f157..72b2d3cc8 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -1,4 +1,5 @@ COMMON_DIR = common +DEBOUNCE = $(COMMON_DIR)/debounce ifeq ($(PLATFORM),AVR) PLATFORM_COMMON_DIR = $(COMMON_DIR)/avr else ifeq ($(PLATFORM),CHIBIOS) @@ -9,6 +10,7 @@ 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 \ @@ -39,7 +41,20 @@ 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 $(CUSTOM_MATRIX)), yes) + # Do nothing. Custom matrix code. +else 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 # default algorithm + TMK_COMMON_SRC += $(DEBOUNCE)/debounce_sym_g.c +endif # Option modules ifeq ($(strip $(BOOTMAGIC_ENABLE)), yes) diff --git a/tmk_core/common/debounce.c b/tmk_core/common/debounce.c new file mode 100644 index 000000000..406d2d0f3 --- /dev/null +++ b/tmk_core/common/debounce.c @@ -0,0 +1,22 @@ +/* +Copyright 2017 Alex Ong +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 . +*/ +#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 new file mode 100644 index 000000000..fe3effab3 --- /dev/null +++ b/tmk_core/common/debounce.h @@ -0,0 +1,21 @@ +#ifndef DEBOUNCE_H +#define DEBOUNCE_H +#include +#include +#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 new file mode 100644 index 000000000..984da0570 --- /dev/null +++ b/tmk_core/common/debounce/debounce_eager_pk.c @@ -0,0 +1,124 @@ +/* +Copyright 2017 Alex Ong +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 . +*/ + +/* +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 new file mode 100644 index 000000000..2fb7a589d --- /dev/null +++ b/tmk_core/common/debounce/debounce_sym_g.c @@ -0,0 +1,59 @@ +/* +Copyright 2017 Alex Ong +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 . +*/ + +/* +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 new file mode 100644 index 000000000..1a77d44df --- /dev/null +++ b/tmk_core/common/debounce/readme.md @@ -0,0 +1,28 @@ +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 13b3cb4c0..fe626efb3 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -18,6 +18,7 @@ along with this program. If not, see . #include #include "keyboard.h" #include "matrix.h" +#include "debounce.h" #include "keymap.h" #include "host.h" #include "led.h" @@ -157,6 +158,7 @@ void keyboard_init(void) { MCUCR |= _BV(JTD); #endif matrix_init(); + matrix_debounce_init(); #ifdef PS2_MOUSE_ENABLE ps2_mouse_init(); #endif @@ -206,9 +208,6 @@ void keyboard_init(void) { void keyboard_task(void) { static matrix_row_t matrix_prev[MATRIX_ROWS]; -#ifdef MATRIX_HAS_GHOST - // static matrix_row_t matrix_ghost[MATRIX_ROWS]; -#endif static uint8_t led_status = 0; matrix_row_t matrix_row = 0; matrix_row_t matrix_change = 0; @@ -217,24 +216,15 @@ void keyboard_task(void) #endif matrix_scan(); + matrix_debounce(); + if (is_keyboard_master()) { for (uint8_t r = 0; r < MATRIX_ROWS; r++) { - matrix_row = matrix_get_row(r); + matrix_row = matrix_debounce_get_row(r); matrix_change = matrix_row ^ matrix_prev[r]; if (matrix_change) { #ifdef MATRIX_HAS_GHOST - if (has_ghost_in_row(r, matrix_row)) { - /* Keep track of whether ghosted status has changed for - * debugging. But don't update matrix_prev until un-ghosted, or - * the last key would be lost. - */ - //if (debug_matrix && matrix_ghost[r] != matrix_row) { - // matrix_print(); - //} - //matrix_ghost[r] = matrix_row; - continue; - } - //matrix_ghost[r] = matrix_row; + if (has_ghost_in_row(r, matrix_row)) continue; #endif if (debug_matrix) matrix_print(); for (uint8_t c = 0; c < MATRIX_COLS; c++) { -- cgit v1.2.3-24-g4f1b From 4db27a2c7614c0aa5a0b46d8e1f5c5cc8216fd1c Mon Sep 17 00:00:00 2001 From: Alex Ong Date: Wed, 29 Aug 2018 10:45:53 +1000 Subject: Changed order of rules in TMK. Documented feature. --- tmk_core/common.mk | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'tmk_core') diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 72b2d3cc8..85f903fda 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -42,9 +42,7 @@ ifeq ($(PLATFORM),TEST) endif # Debounce Modules. If implemented in matrix.c, don't use these. -ifeq ($(strip $(CUSTOM_MATRIX)), yes) - # Do nothing. Custom matrix code. -else ifeq ($(strip $(SPLIT_KEYBOARD)), yes) +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 @@ -52,6 +50,8 @@ 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 -- cgit v1.2.3-24-g4f1b From 39ca330f103bf85fd29b0fb595469221c9c3680c Mon Sep 17 00:00:00 2001 From: alex-ong Date: Sat, 26 Jan 2019 16:56:01 +1100 Subject: DO NOT USE - Removed debounce from TMK. --- tmk_core/common.mk | 17 +--- tmk_core/common/debounce.c | 22 ----- tmk_core/common/debounce.h | 21 ----- tmk_core/common/debounce/debounce_eager_pk.c | 124 --------------------------- tmk_core/common/debounce/debounce_sym_g.c | 59 ------------- tmk_core/common/debounce/readme.md | 28 ------ tmk_core/common/keyboard.c | 9 +- 7 files changed, 4 insertions(+), 276 deletions(-) delete mode 100644 tmk_core/common/debounce.c delete mode 100644 tmk_core/common/debounce.h delete mode 100644 tmk_core/common/debounce/debounce_eager_pk.c delete mode 100644 tmk_core/common/debounce/debounce_sym_g.c delete mode 100644 tmk_core/common/debounce/readme.md (limited to 'tmk_core') diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 7a7b3928f..335a36cfe 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 406d2d0f3..000000000 --- a/tmk_core/common/debounce.c +++ /dev/null @@ -1,22 +0,0 @@ -/* -Copyright 2017 Alex Ong -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 . -*/ -#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 fe3effab3..000000000 --- a/tmk_core/common/debounce.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef DEBOUNCE_H -#define DEBOUNCE_H -#include -#include -#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 984da0570..000000000 --- a/tmk_core/common/debounce/debounce_eager_pk.c +++ /dev/null @@ -1,124 +0,0 @@ -/* -Copyright 2017 Alex Ong -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 . -*/ - -/* -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 2fb7a589d..000000000 --- a/tmk_core/common/debounce/debounce_sym_g.c +++ /dev/null @@ -1,59 +0,0 @@ -/* -Copyright 2017 Alex Ong -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 . -*/ - -/* -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 1a77d44df..000000000 --- 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 1bfd4c9cc..d22300116 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -18,7 +18,6 @@ along with this program. If not, see . #include #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 -- cgit v1.2.3-24-g4f1b From 574fc6444bf48d10317c72bc6a5c61f7e46938a3 Mon Sep 17 00:00:00 2001 From: alex-ong Date: Sat, 26 Jan 2019 17:38:52 +1100 Subject: Whitespace cleanup. --- tmk_core/common.mk | 2 +- tmk_core/common/keyboard.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'tmk_core') diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 335a36cfe..063115acb 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -1,5 +1,4 @@ COMMON_DIR = common - ifeq ($(PLATFORM),AVR) PLATFORM_COMMON_DIR = $(COMMON_DIR)/avr else ifeq ($(PLATFORM),CHIBIOS) @@ -62,6 +61,7 @@ ifeq ($(PLATFORM),TEST) endif + # Option modules BOOTMAGIC_ENABLE ?= no VALID_MAGIC_TYPES := yes full lite diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index d22300116..25be28d02 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -163,7 +163,7 @@ bool is_keyboard_master(void) { */ void keyboard_init(void) { timer_init(); - matrix_init(); + matrix_init(); #ifdef QWIIC_ENABLE qwiic_init(); #endif @@ -223,7 +223,7 @@ void keyboard_task(void) uint8_t keys_processed = 0; #endif - matrix_scan(); + matrix_scan(); if (is_keyboard_master()) { for (uint8_t r = 0; r < MATRIX_ROWS; r++) { @@ -231,7 +231,7 @@ void keyboard_task(void) matrix_change = matrix_row ^ matrix_prev[r]; if (matrix_change) { #ifdef MATRIX_HAS_GHOST - if (has_ghost_in_row(r, matrix_row)) continue; + if (has_ghost_in_row(r, matrix_row)) { continue; } #endif if (debug_matrix) matrix_print(); for (uint8_t c = 0; c < MATRIX_COLS; c++) { -- cgit v1.2.3-24-g4f1b