aboutsummaryrefslogtreecommitdiff
path: root/quantum/debounce
diff options
context:
space:
mode:
authorDrashna Jaelre <drashna@live.com>2019-07-09 11:09:54 -0700
committerGitHub <noreply@github.com>2019-07-09 11:09:54 -0700
commit37be1cb5130c5c9d93175bdd40176a84e8fe3a76 (patch)
tree83f2024550899ab95801a673c7d230a092f30c35 /quantum/debounce
parent207e50c5347adeb6d66c092d5f41d7dc52d4a166 (diff)
downloadqmk_firmware-37be1cb5130c5c9d93175bdd40176a84e8fe3a76.tar.gz
qmk_firmware-37be1cb5130c5c9d93175bdd40176a84e8fe3a76.zip
Fix debouncing issue for eager algorithms (#6081)
* Fix debouncing issue for eager algos * Fix up typo issue
Diffstat (limited to 'quantum/debounce')
-rw-r--r--quantum/debounce/eager_pk.c16
-rw-r--r--quantum/debounce/eager_pr.c17
2 files changed, 22 insertions, 11 deletions
diff --git a/quantum/debounce/eager_pk.c b/quantum/debounce/eager_pk.c
index aa0f63a9d..c07be18f8 100644
--- a/quantum/debounce/eager_pk.c
+++ b/quantum/debounce/eager_pk.c
@@ -39,6 +39,7 @@ No further inputs are accepted until DEBOUNCE milliseconds have occurred.
39 39
40static debounce_counter_t *debounce_counters; 40static debounce_counter_t *debounce_counters;
41static bool counters_need_update; 41static bool counters_need_update;
42static bool matrix_need_update;
42 43
43#define DEBOUNCE_ELAPSED 251 44#define DEBOUNCE_ELAPSED 251
44#define MAX_DEBOUNCE (DEBOUNCE_ELAPSED - 1) 45#define MAX_DEBOUNCE (DEBOUNCE_ELAPSED - 1)
@@ -63,7 +64,7 @@ void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool
63 update_debounce_counters(num_rows, current_time); 64 update_debounce_counters(num_rows, current_time);
64 } 65 }
65 66
66 if (changed) { 67 if (changed || matrix_need_update) {
67 transfer_matrix_values(raw, cooked, num_rows, current_time); 68 transfer_matrix_values(raw, cooked, num_rows, current_time);
68 } 69 }
69} 70}
@@ -88,16 +89,21 @@ void update_debounce_counters(uint8_t num_rows, uint8_t current_time) {
88 89
89// upload from raw_matrix to final matrix; 90// upload from raw_matrix to final matrix;
90void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time) { 91void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time) {
92 matrix_need_update = false;
91 debounce_counter_t *debounce_pointer = debounce_counters; 93 debounce_counter_t *debounce_pointer = debounce_counters;
92 for (uint8_t row = 0; row < num_rows; row++) { 94 for (uint8_t row = 0; row < num_rows; row++) {
93 matrix_row_t delta = raw[row] ^ cooked[row]; 95 matrix_row_t delta = raw[row] ^ cooked[row];
94 matrix_row_t existing_row = cooked[row]; 96 matrix_row_t existing_row = cooked[row];
95 for (uint8_t col = 0; col < MATRIX_COLS; col++) { 97 for (uint8_t col = 0; col < MATRIX_COLS; col++) {
96 matrix_row_t col_mask = (ROW_SHIFTER << col); 98 matrix_row_t col_mask = (ROW_SHIFTER << col);
97 if ((delta & col_mask) && *debounce_pointer == DEBOUNCE_ELAPSED) { 99 if (delta & col_mask) {
98 *debounce_pointer = current_time; 100 if (*debounce_pointer == DEBOUNCE_ELAPSED) {
99 counters_need_update = true; 101 *debounce_pointer = current_time;
100 existing_row ^= col_mask; // flip the bit. 102 counters_need_update = true;
103 existing_row ^= col_mask; // flip the bit.
104 } else {
105 matrix_need_update = true;
106 }
101 } 107 }
102 debounce_pointer++; 108 debounce_pointer++;
103 } 109 }
diff --git a/quantum/debounce/eager_pr.c b/quantum/debounce/eager_pr.c
index 26b17ed29..8dbfa3fcf 100644
--- a/quantum/debounce/eager_pr.c
+++ b/quantum/debounce/eager_pr.c
@@ -28,6 +28,7 @@ No further inputs are accepted until DEBOUNCE milliseconds have occurred.
28#endif 28#endif
29 29
30#define debounce_counter_t uint8_t 30#define debounce_counter_t uint8_t
31static bool matrix_need_update;
31 32
32static debounce_counter_t *debounce_counters; 33static debounce_counter_t *debounce_counters;
33static bool counters_need_update; 34static bool counters_need_update;
@@ -53,7 +54,7 @@ void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool
53 update_debounce_counters(num_rows, current_time); 54 update_debounce_counters(num_rows, current_time);
54 } 55 }
55 56
56 if (changed || (needed_update && !counters_need_update)) { 57 if (changed || (needed_update && !counters_need_update) || matrix_need_update) {
57 transfer_matrix_values(raw, cooked, num_rows, current_time); 58 transfer_matrix_values(raw, cooked, num_rows, current_time);
58 } 59 }
59} 60}
@@ -76,18 +77,22 @@ void update_debounce_counters(uint8_t num_rows, uint8_t current_time) {
76 77
77// upload from raw_matrix to final matrix; 78// upload from raw_matrix to final matrix;
78void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time) { 79void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time) {
80 matrix_need_update = false;
79 debounce_counter_t *debounce_pointer = debounce_counters; 81 debounce_counter_t *debounce_pointer = debounce_counters;
80 for (uint8_t row = 0; row < num_rows; row++) { 82 for (uint8_t row = 0; row < num_rows; row++) {
81 matrix_row_t existing_row = cooked[row]; 83 matrix_row_t existing_row = cooked[row];
82 matrix_row_t raw_row = raw[row]; 84 matrix_row_t raw_row = raw[row];
83 85
84 // determine new value basd on debounce pointer + raw value 86 // determine new value basd on debounce pointer + raw value
85 if (*debounce_pointer == DEBOUNCE_ELAPSED && (existing_row != raw_row)) { 87 if (existing_row != raw_row) {
86 *debounce_pointer = current_time; 88 if (*debounce_pointer == DEBOUNCE_ELAPSED) {
87 cooked[row] = raw_row; 89 *debounce_pointer = current_time;
88 counters_need_update = true; 90 cooked[row] = raw_row;
91 counters_need_update = true;
92 } else {
93 matrix_need_update = true;
94 }
89 } 95 }
90
91 debounce_pointer++; 96 debounce_pointer++;
92 } 97 }
93} 98}