diff options
author | IBNobody <protospherex@gmail.com> | 2016-10-29 16:12:58 -0500 |
---|---|---|
committer | IBNobody <protospherex@gmail.com> | 2016-10-29 16:12:58 -0500 |
commit | f4030289744fc6dc82dd85c955070c0845813cc5 (patch) | |
tree | 8e61c9ea3da9d583ef4f8ac053ab1c540dcaaa16 /quantum/matrix.c | |
parent | e40c33f754a86c4dd7bd3c7b5c7efe822f2893bc (diff) | |
download | qmk_firmware-f4030289744fc6dc82dd85c955070c0845813cc5.tar.gz qmk_firmware-f4030289744fc6dc82dd85c955070c0845813cc5.zip |
added fixed debounce code
Diffstat (limited to 'quantum/matrix.c')
-rw-r--r-- | quantum/matrix.c | 143 |
1 files changed, 70 insertions, 73 deletions
diff --git a/quantum/matrix.c b/quantum/matrix.c index f45b251e4..3c488b417 100644 --- a/quantum/matrix.c +++ b/quantum/matrix.c | |||
@@ -25,6 +25,19 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
25 | #include "debug.h" | 25 | #include "debug.h" |
26 | #include "util.h" | 26 | #include "util.h" |
27 | #include "matrix.h" | 27 | #include "matrix.h" |
28 | #include "timer.h" | ||
29 | |||
30 | |||
31 | /* Set 0 if debouncing isn't needed */ | ||
32 | |||
33 | #ifndef DEBOUNCING_DELAY | ||
34 | # define DEBOUNCING_DELAY 5 | ||
35 | #endif | ||
36 | |||
37 | #if (DEBOUNCING_DELAY > 0) | ||
38 | static uint16_t debouncing_time; | ||
39 | static bool debouncing = false; | ||
40 | #endif | ||
28 | 41 | ||
29 | #if (MATRIX_COLS <= 8) | 42 | #if (MATRIX_COLS <= 8) |
30 | # define print_matrix_header() print("\nr/c 01234567\n") | 43 | # define print_matrix_header() print("\nr/c 01234567\n") |
@@ -44,15 +57,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
44 | #endif | 57 | #endif |
45 | 58 | ||
46 | #ifdef MATRIX_MASKED | 59 | #ifdef MATRIX_MASKED |
47 | extern const matrix_row_t matrix_mask[]; | 60 | extern const matrix_row_t matrix_mask[]; |
48 | #endif | ||
49 | |||
50 | /* Set 0 if debouncing isn't needed */ | ||
51 | |||
52 | #ifndef DEBOUNCING_DELAY | ||
53 | # define DEBOUNCING_DELAY 5 | ||
54 | #endif | 61 | #endif |
55 | static uint8_t debouncing = DEBOUNCING_DELAY; | ||
56 | 62 | ||
57 | static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; | 63 | static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; |
58 | static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; | 64 | static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; |
@@ -66,13 +72,13 @@ static matrix_row_t matrix_debouncing[MATRIX_ROWS]; | |||
66 | 72 | ||
67 | #if (DIODE_DIRECTION == COL2ROW) | 73 | #if (DIODE_DIRECTION == COL2ROW) |
68 | static void init_cols(void); | 74 | static void init_cols(void); |
69 | static void read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row); | 75 | static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row); |
70 | static void unselect_rows(void); | 76 | static void unselect_rows(void); |
71 | static void select_row(uint8_t row); | 77 | static void select_row(uint8_t row); |
72 | static void unselect_row(uint8_t row); | 78 | static void unselect_row(uint8_t row); |
73 | #else // ROW2COL | 79 | #else // ROW2COL |
74 | static void init_rows(void); | 80 | static void init_rows(void); |
75 | static void read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col); | 81 | static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col); |
76 | static void unselect_cols(void); | 82 | static void unselect_cols(void); |
77 | static void unselect_col(uint8_t col); | 83 | static void unselect_col(uint8_t col); |
78 | static void select_col(uint8_t col); | 84 | static void select_col(uint8_t col); |
@@ -174,83 +180,56 @@ uint8_t matrix_scan(void) | |||
174 | 180 | ||
175 | // Set row, read cols | 181 | // Set row, read cols |
176 | for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) { | 182 | for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) { |
177 | read_cols_on_row(matrix, current_row); | 183 | # if (DEBOUNCING_DELAY > 0) |
178 | } | 184 | bool matrix_changed = read_cols_on_row(matrix_debouncing, current_row); |
179 | 185 | ||
180 | // select_row(i); | 186 | if (matrix_changed) { |
181 | // wait_us(30); // without this wait read unstable value. | 187 | debouncing = true; |
182 | // matrix_row_t current_row = read_cols(); | 188 | debouncing_time = timer_read(); |
183 | // if (matrix_debouncing[i] != current_row) { | 189 | } |
184 | // matrix_debouncing[i] = current_row; | 190 | |
185 | // if (debouncing) { | 191 | # else |
186 | // debug("bounce!: "); debug_hex(debouncing); debug("\n"); | 192 | read_cols_on_row(matrix, current_row); |
187 | // } | 193 | # endif |
188 | // debouncing = DEBOUNCING_DELAY; | 194 | |
189 | // } | 195 | } |
190 | // unselect_row(i); | ||
191 | // } | ||
192 | |||
193 | // if (debouncing) { | ||
194 | // if (--debouncing) { | ||
195 | // wait_ms(1); | ||
196 | // } else { | ||
197 | // for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | ||
198 | // matrix[i] = matrix_debouncing[i]; | ||
199 | // } | ||
200 | // } | ||
201 | // } | ||
202 | 196 | ||
203 | #else // ROW2COL | 197 | #else // ROW2COL |
204 | 198 | ||
205 | // Set col, read rows | 199 | // Set col, read rows |
206 | for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { | 200 | for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { |
207 | read_rows_on_col(matrix, current_col); | 201 | # if (DEBOUNCING_DELAY > 0) |
208 | } | 202 | bool matrix_changed = read_rows_on_col(matrix_debouncing, current_col); |
203 | if (matrix_changed) { | ||
204 | debouncing = true; | ||
205 | debouncing_time = timer_read(); | ||
206 | } | ||
207 | # else | ||
208 | read_rows_on_col(matrix, current_col); | ||
209 | # endif | ||
209 | 210 | ||
210 | 211 | } | |
211 | // for (uint8_t i = 0; i < MATRIX_COLS; i++) { | ||
212 | // select_col(i); | ||
213 | // wait_us(30); // without this wait read unstable value. | ||
214 | // matrix_col_t current_col = read_rows(); | ||
215 | // if (matrix_transposed_debouncing[i] != current_col) { | ||
216 | // matrix_transposed_debouncing[i] = current_col; | ||
217 | // if (debouncing) { | ||
218 | // debug("bounce!: "); debug_hex(debouncing); debug("\n"); | ||
219 | // } | ||
220 | // debouncing = DEBOUNCING_DELAY; | ||
221 | // } | ||
222 | // unselect_col(i); | ||
223 | // } | ||
224 | |||
225 | // if (debouncing) { | ||
226 | // if (--debouncing) { | ||
227 | // wait_ms(1); | ||
228 | // } else { | ||
229 | // for (uint8_t i = 0; i < MATRIX_COLS; i++) { | ||
230 | // matrix_transposed[i] = matrix_transposed_debouncing[i]; | ||
231 | // } | ||
232 | // } | ||
233 | // } | ||
234 | |||
235 | // // Untranspose matrix | ||
236 | // for (uint8_t y = 0; y < MATRIX_ROWS; y++) { | ||
237 | // matrix_row_t row = 0; | ||
238 | // for (uint8_t x = 0; x < MATRIX_COLS; x++) { | ||
239 | // row |= ((matrix_transposed[x] & (1<<y)) >> y) << x; | ||
240 | // } | ||
241 | // matrix[y] = row; | ||
242 | // } | ||
243 | 212 | ||
244 | #endif | 213 | #endif |
245 | 214 | ||
215 | # if (DEBOUNCING_DELAY > 0) | ||
216 | if (debouncing && (timer_elapsed(debouncing_time) > DEBOUNCING_DELAY)) { | ||
217 | for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | ||
218 | matrix[i] = matrix_debouncing[i]; | ||
219 | } | ||
220 | debouncing = false; | ||
221 | } | ||
222 | # endif | ||
223 | |||
246 | matrix_scan_quantum(); | 224 | matrix_scan_quantum(); |
247 | // matrix_print(); | ||
248 | return 1; | 225 | return 1; |
249 | } | 226 | } |
250 | 227 | ||
251 | bool matrix_is_modified(void) | 228 | bool matrix_is_modified(void) |
252 | { | 229 | { |
230 | #if (DEBOUNCING_DELAY > 0) | ||
253 | if (debouncing) return false; | 231 | if (debouncing) return false; |
232 | #endif | ||
254 | return true; | 233 | return true; |
255 | } | 234 | } |
256 | 235 | ||
@@ -305,8 +284,11 @@ static void init_cols(void) | |||
305 | } | 284 | } |
306 | } | 285 | } |
307 | 286 | ||
308 | static void read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) | 287 | static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) |
309 | { | 288 | { |
289 | // Store last value of row prior to reading | ||
290 | matrix_row_t last_row_value = current_matrix[current_row]; | ||
291 | |||
310 | // Clear data in matrix row | 292 | // Clear data in matrix row |
311 | current_matrix[current_row] = 0; | 293 | current_matrix[current_row] = 0; |
312 | 294 | ||
@@ -327,6 +309,8 @@ static void read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) | |||
327 | 309 | ||
328 | // Unselect row | 310 | // Unselect row |
329 | unselect_row(current_row); | 311 | unselect_row(current_row); |
312 | |||
313 | return (last_row_value == current_matrix[current_row]); | ||
330 | } | 314 | } |
331 | 315 | ||
332 | static void select_row(uint8_t row) | 316 | static void select_row(uint8_t row) |
@@ -363,15 +347,20 @@ static void init_rows(void) | |||
363 | } | 347 | } |
364 | } | 348 | } |
365 | 349 | ||
366 | static void read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) | 350 | static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) |
367 | { | 351 | { |
352 | bool matrix_changed = false; | ||
368 | 353 | ||
369 | // Select col and wait for col selecton to stabilize | 354 | // Select col and wait for col selecton to stabilize |
370 | select_col(current_col); | 355 | select_col(current_col); |
371 | wait_us(30); | 356 | wait_us(30); |
372 | 357 | ||
373 | // For each row... | 358 | // For each row... |
374 | for(uint8_t row_index = 0; row_index < MATRIX_ROWS; row_index++) { | 359 | for(uint8_t row_index = 0; row_index < MATRIX_ROWS; row_index++) |
360 | { | ||
361 | |||
362 | // Store last value of row prior to reading | ||
363 | matrix_row_t last_row_value = current_matrix[row_index]; | ||
375 | 364 | ||
376 | // Check row pin state | 365 | // Check row pin state |
377 | if ((_SFR_IO8(row_pins[row_index] >> 4) & _BV(row_pins[row_index] & 0xF)) == 0) | 366 | if ((_SFR_IO8(row_pins[row_index] >> 4) & _BV(row_pins[row_index] & 0xF)) == 0) |
@@ -384,10 +373,18 @@ static void read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) | |||
384 | // Pin HI, clear col bit | 373 | // Pin HI, clear col bit |
385 | current_matrix[row_index] &= ~(ROW_SHIFTER << current_col); | 374 | current_matrix[row_index] &= ~(ROW_SHIFTER << current_col); |
386 | } | 375 | } |
376 | |||
377 | // Determine if the matrix changed state | ||
378 | if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) | ||
379 | { | ||
380 | matrix_changed = true; | ||
381 | } | ||
387 | } | 382 | } |
388 | 383 | ||
389 | // Unselect col | 384 | // Unselect col |
390 | unselect_col(current_col); | 385 | unselect_col(current_col); |
386 | |||
387 | return matrix_changed; | ||
391 | } | 388 | } |
392 | 389 | ||
393 | static void select_col(uint8_t col) | 390 | static void select_col(uint8_t col) |