From d0b691df0ee74863ca54ca697aa4d4212cf401a7 Mon Sep 17 00:00:00 2001 From: alex-ong Date: Sat, 26 Jan 2019 17:03:46 +1100 Subject: DO NOT USE - debounce successfully compiled. --- quantum/debounce/debounce_eager_pk.c | 123 +++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 quantum/debounce/debounce_eager_pk.c (limited to 'quantum/debounce/debounce_eager_pk.c') diff --git a/quantum/debounce/debounce_eager_pk.c b/quantum/debounce/debounce_eager_pk.c new file mode 100644 index 000000000..e6e8bfd31 --- /dev/null +++ b/quantum/debounce/debounce_eager_pk.c @@ -0,0 +1,123 @@ +/* +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; + } +} + + + +//Implementation of no debounce. -- cgit v1.2.3-24-g4f1b From 4d8733591f30a299d6ac99165c834162d2c08fd1 Mon Sep 17 00:00:00 2001 From: alex-ong Date: Sat, 26 Jan 2019 17:29:02 +1100 Subject: Working eager_pk --- quantum/debounce/debounce_eager_pk.c | 41 ++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 23 deletions(-) (limited to 'quantum/debounce/debounce_eager_pk.c') diff --git a/quantum/debounce/debounce_eager_pk.c b/quantum/debounce/debounce_eager_pk.c index e6e8bfd31..f1457496e 100644 --- a/quantum/debounce/debounce_eager_pk.c +++ b/quantum/debounce/debounce_eager_pk.c @@ -39,22 +39,16 @@ No further inputs are accepted until DEBOUNCE milliseconds have occurred. #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 update_debounce_counters(uint8_t num_rows, uint8_t current_time); +void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time); -void matrix_debounce_init(void) +void debounce_init(uint8_t num_rows) { - 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++) { @@ -65,25 +59,24 @@ void matrix_debounce_init(void) } } -void matrix_debounce(void) +void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) { uint8_t current_time = timer_read() % MAX_DEBOUNCE; - update_debounce_counters(current_time); - transfer_matrix_values(current_time); + update_debounce_counters(num_rows, current_time); + transfer_matrix_values(raw, cooked, num_rows, current_time); } //If the current time is > debounce counter, set the counter to enable input. -void update_debounce_counters(uint8_t current_time) +void update_debounce_counters(uint8_t num_rows, uint8_t current_time) { debounce_counter_t *debounce_pointer = debounce_counters; - for (uint8_t row = 0; row < MATRIX_ROWS; row++) + for (uint8_t row = 0; row < num_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) { + if (TIMER_DIFF(current_time, *debounce_pointer, MAX_DEBOUNCE) >= DEBOUNCE) { *debounce_pointer = DEBOUNCE_ELAPSED; } } @@ -93,13 +86,13 @@ void update_debounce_counters(uint8_t current_time) } // upload from raw_matrix to final matrix; -void transfer_matrix_values(uint8_t current_time) +void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time) { debounce_counter_t *debounce_pointer = debounce_counters; - for (uint8_t row = 0; row < MATRIX_ROWS; row++) + for (uint8_t row = 0; row < num_rows; row++) { - matrix_row_t existing_row = matrix_debounced[row]; - matrix_row_t raw_row = matrix_get_row(row); + matrix_row_t existing_row = cooked[row]; + matrix_row_t raw_row = raw[row]; for (uint8_t col = 0; col < MATRIX_COLS; col++) { @@ -114,10 +107,12 @@ void transfer_matrix_values(uint8_t current_time) } debounce_pointer++; } - matrix_debounced[row] = existing_row; + cooked[row] = existing_row; } } +bool debounce_active() +{ + return true; +} - -//Implementation of no debounce. -- cgit v1.2.3-24-g4f1b From 10cc4235155d0a039faf2dc5c2b1ebe513952c3c Mon Sep 17 00:00:00 2001 From: alex-ong Date: Sat, 26 Jan 2019 23:18:24 +1100 Subject: Malloc array in debounce_eager_pk, since split keyboards only use MATRIX_ROWS/2. --- quantum/debounce/debounce_eager_pk.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'quantum/debounce/debounce_eager_pk.c') diff --git a/quantum/debounce/debounce_eager_pk.c b/quantum/debounce/debounce_eager_pk.c index f1457496e..af11362ef 100644 --- a/quantum/debounce/debounce_eager_pk.c +++ b/quantum/debounce/debounce_eager_pk.c @@ -21,6 +21,7 @@ No further inputs are accepted until DEBOUNCE milliseconds have occurred. #include "debounce.h" #include "matrix.h" #include "timer.h" +#include #ifndef DEBOUNCE #define DEBOUNCE 5 @@ -39,7 +40,7 @@ No further inputs are accepted until DEBOUNCE milliseconds have occurred. #define debounce_counter_t uint8_t -static debounce_counter_t debounce_counters[MATRIX_ROWS*MATRIX_COLS]; +static debounce_counter_t *debounce_counters; #define DEBOUNCE_ELAPSED 251 #define MAX_DEBOUNCE (DEBOUNCE_ELAPSED - 1) @@ -47,10 +48,12 @@ static debounce_counter_t debounce_counters[MATRIX_ROWS*MATRIX_COLS]; void update_debounce_counters(uint8_t num_rows, uint8_t current_time); void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time); +//we use num_rows rather than MATRIX_ROWS to support split keyboards void debounce_init(uint8_t num_rows) { + debounce_counters = (debounce_counter_t*)malloc(num_rows*MATRIX_COLS * sizeof(debounce_counter_t)); int i = 0; - for (uint8_t r = 0; r < MATRIX_ROWS; r++) + for (uint8_t r = 0; r < num_rows; r++) { for (uint8_t c = 0; c < MATRIX_COLS; c++) { -- cgit v1.2.3-24-g4f1b From 562c0d702a326488d79963969ef71f2a52664cdc Mon Sep 17 00:00:00 2001 From: alex-ong Date: Sun, 27 Jan 2019 00:10:14 +1100 Subject: Fix compile error in debounce_eager_pk --- quantum/debounce/debounce_eager_pk.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'quantum/debounce/debounce_eager_pk.c') diff --git a/quantum/debounce/debounce_eager_pk.c b/quantum/debounce/debounce_eager_pk.c index af11362ef..b8ad09cee 100644 --- a/quantum/debounce/debounce_eager_pk.c +++ b/quantum/debounce/debounce_eager_pk.c @@ -18,9 +18,9 @@ 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" +#include "quantum.h" #include #ifndef DEBOUNCE @@ -114,7 +114,7 @@ void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t n } } -bool debounce_active() +bool debounce_active(void) { return true; } -- cgit v1.2.3-24-g4f1b