diff options
author | Florian Didron <fdidron@users.noreply.github.com> | 2019-04-18 09:57:19 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-04-18 09:57:19 +0900 |
commit | 12c061118929179ebd2c3088141a6fb3d949ac9c (patch) | |
tree | 425ac8a1d3a1adc527bbcecc084a866cc0580bbc | |
parent | e26b21baf4831567eb5a1d19faa43af4f3c1b62d (diff) | |
parent | 54a7f66aee4cbb8400b49e4dfad4b1126cc71fb9 (diff) |
Merge branch 'master' into fix/combo_logic
-rw-r--r-- | changelog.md | 3 | ||||
-rw-r--r-- | quantum/debounce/eager_pk.c | 89 | ||||
-rw-r--r-- | quantum/debounce/eager_pr.c | 74 |
3 files changed, 74 insertions, 92 deletions
diff --git a/changelog.md b/changelog.md index 1eeccc6f0c..f77962d384 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,4 @@ 04-12-2019 - Add AltGr/RALT support to Send String (qmk#4046) -04-12-2019 - Port DIRECT_PINS from split_common/matrix.c to matrix.c (qmk#5091) +04-12-2019 - Port DIRECT_PINS from split_common/matrix.c to matrix.c (qmk#5091) +04-12-2019 - Enhancement for Eager debouncing (and Ergodox EZ host sleep fix) (qmk#5621) 04-16-2019 - Fix logic for Combo feature (qmk#5610) diff --git a/quantum/debounce/eager_pk.c b/quantum/debounce/eager_pk.c index b8ad09cee3..aa0f63a9d4 100644 --- a/quantum/debounce/eager_pk.c +++ b/quantum/debounce/eager_pk.c @@ -24,23 +24,21 @@ No further inputs are accepted until DEBOUNCE milliseconds have occurred. #include <stdlib.h> #ifndef DEBOUNCE - #define DEBOUNCE 5 +# define DEBOUNCE 5 #endif - #if (MATRIX_COLS <= 8) -# define ROW_SHIFTER ((uint8_t)1) +# define ROW_SHIFTER ((uint8_t)1) #elif (MATRIX_COLS <= 16) -# define ROW_SHIFTER ((uint16_t)1) +# define ROW_SHIFTER ((uint16_t)1) #elif (MATRIX_COLS <= 32) -# define ROW_SHIFTER ((uint32_t)1) +# define ROW_SHIFTER ((uint32_t)1) #endif - - #define debounce_counter_t uint8_t static debounce_counter_t *debounce_counters; +static bool counters_need_update; #define DEBOUNCE_ELAPSED 251 #define MAX_DEBOUNCE (DEBOUNCE_ELAPSED - 1) @@ -48,39 +46,39 @@ static debounce_counter_t *debounce_counters; 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 < num_rows; r++) - { - for (uint8_t c = 0; c < MATRIX_COLS; c++) - { +// 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 < num_rows; r++) { + for (uint8_t c = 0; c < MATRIX_COLS; c++) { debounce_counters[i++] = DEBOUNCE_ELAPSED; } } } -void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) -{ +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(num_rows, current_time); - transfer_matrix_values(raw, cooked, num_rows, current_time); + if (counters_need_update) { + update_debounce_counters(num_rows, current_time); + } + + if (changed) { + 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 num_rows, uint8_t current_time) -{ +// If the current time is > debounce counter, set the counter to enable input. +void update_debounce_counters(uint8_t num_rows, uint8_t current_time) { + counters_need_update = false; debounce_counter_t *debounce_pointer = debounce_counters; - for (uint8_t row = 0; row < num_rows; row++) - { - for (uint8_t col = 0; col < MATRIX_COLS; col++) - { - if (*debounce_pointer != DEBOUNCE_ELAPSED) - { + 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) >= DEBOUNCE) { *debounce_pointer = DEBOUNCE_ELAPSED; + } else { + counters_need_update = true; } } debounce_pointer++; @@ -89,33 +87,22 @@ void update_debounce_counters(uint8_t num_rows, uint8_t current_time) } // upload from raw_matrix to final matrix; -void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], 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) { debounce_counter_t *debounce_pointer = debounce_counters; - for (uint8_t row = 0; row < num_rows; row++) - { - matrix_row_t existing_row = cooked[row]; - matrix_row_t raw_row = raw[row]; - - for (uint8_t col = 0; col < MATRIX_COLS; col++) - { + for (uint8_t row = 0; row < num_rows; row++) { + matrix_row_t delta = raw[row] ^ cooked[row]; + matrix_row_t existing_row = cooked[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. + if ((delta & col_mask) && *debounce_pointer == DEBOUNCE_ELAPSED) { + *debounce_pointer = current_time; + counters_need_update = true; + existing_row ^= col_mask; // flip the bit. } debounce_pointer++; } cooked[row] = existing_row; - } -} - -bool debounce_active(void) -{ - return true; + } } +bool debounce_active(void) { return true; } diff --git a/quantum/debounce/eager_pr.c b/quantum/debounce/eager_pr.c index 9eb9480a79..5b460f6630 100644 --- a/quantum/debounce/eager_pr.c +++ b/quantum/debounce/eager_pr.c @@ -24,13 +24,13 @@ No further inputs are accepted until DEBOUNCE milliseconds have occurred. #include <stdlib.h> #ifndef DEBOUNCE - #define DEBOUNCE 5 +# define DEBOUNCE 5 #endif - #define debounce_counter_t uint8_t static debounce_counter_t *debounce_counters; +static bool counters_need_update; #define DEBOUNCE_ELAPSED 251 #define MAX_DEBOUNCE (DEBOUNCE_ELAPSED - 1) @@ -38,33 +38,35 @@ static debounce_counter_t *debounce_counters; 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*sizeof(debounce_counter_t)); - for (uint8_t r = 0; r < num_rows; r++) - { +// 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 * sizeof(debounce_counter_t)); + for (uint8_t r = 0; r < num_rows; r++) { debounce_counters[r] = DEBOUNCE_ELAPSED; } } -void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) -{ +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(num_rows, current_time); - transfer_matrix_values(raw, cooked, num_rows, current_time); + if (counters_need_update) { + update_debounce_counters(num_rows, current_time); + } + + if (changed) { + 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 num_rows, uint8_t current_time) -{ +// If the current time is > debounce counter, set the counter to enable input. +void update_debounce_counters(uint8_t num_rows, uint8_t current_time) { + counters_need_update = false; debounce_counter_t *debounce_pointer = debounce_counters; - for (uint8_t row = 0; row < num_rows; row++) - { - if (*debounce_pointer != DEBOUNCE_ELAPSED) - { + for (uint8_t row = 0; row < num_rows; row++) { + if (*debounce_pointer != DEBOUNCE_ELAPSED) { if (TIMER_DIFF(current_time, *debounce_pointer, MAX_DEBOUNCE) >= DEBOUNCE) { *debounce_pointer = DEBOUNCE_ELAPSED; + } else { + counters_need_update = true; } } debounce_pointer++; @@ -72,29 +74,21 @@ void update_debounce_counters(uint8_t num_rows, uint8_t current_time) } // upload from raw_matrix to final matrix; -void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], 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) { debounce_counter_t *debounce_pointer = debounce_counters; - for (uint8_t row = 0; row < num_rows; row++) - { - matrix_row_t existing_row = cooked[row]; - matrix_row_t raw_row = raw[row]; - - //determine new value basd on debounce pointer + raw value - if (*debounce_pointer == DEBOUNCE_ELAPSED && - (existing_row != raw_row)) - { - *debounce_pointer = current_time; - existing_row = raw_row; + for (uint8_t row = 0; row < num_rows; row++) { + matrix_row_t existing_row = cooked[row]; + matrix_row_t raw_row = raw[row]; + + // determine new value basd on debounce pointer + raw value + if (*debounce_pointer == DEBOUNCE_ELAPSED && (existing_row != raw_row)) { + *debounce_pointer = current_time; + cooked[row] = raw_row; + counters_need_update = true; } - cooked[row] = existing_row; - - debounce_pointer++; - } -} -bool debounce_active(void) -{ - return true; + debounce_pointer++; + } } +bool debounce_active(void) { return true; } |