mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-31 13:22:31 +01:00 
			
		
		
		
	Removed "debounce_algo = manual" in all keyboards with CUSTOM_MATRIX = yes.
This commit is contained in:
		
							parent
							
								
									9bd6d6112d
								
							
						
					
					
						commit
						3cf7f7322c
					
				| @ -27,17 +27,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>. | |||||||
| #include "timer.h" | #include "timer.h" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* Set 0 if debouncing isn't needed */ |  | ||||||
| 
 |  | ||||||
| #ifndef DEBOUNCING_DELAY |  | ||||||
| #   define DEBOUNCING_DELAY 5 |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| #if (DEBOUNCING_DELAY > 0) |  | ||||||
|     static uint16_t debouncing_time; |  | ||||||
|     static bool debouncing = false; |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| #if (MATRIX_COLS <= 8) | #if (MATRIX_COLS <= 8) | ||||||
| #    define print_matrix_header()  print("\nr/c 01234567\n") | #    define print_matrix_header()  print("\nr/c 01234567\n") | ||||||
| #    define print_matrix_row(row)  print_bin_reverse8(matrix_get_row(row)) | #    define print_matrix_row(row)  print_bin_reverse8(matrix_get_row(row)) | ||||||
| @ -67,8 +56,6 @@ static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; | |||||||
| /* matrix state(1:on, 0:off) */ | /* matrix state(1:on, 0:off) */ | ||||||
| static matrix_row_t matrix[MATRIX_ROWS]; | static matrix_row_t matrix[MATRIX_ROWS]; | ||||||
| 
 | 
 | ||||||
| static matrix_row_t matrix_debouncing[MATRIX_ROWS]; |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| #if (DIODE_DIRECTION == COL2ROW) | #if (DIODE_DIRECTION == COL2ROW) | ||||||
|     static void init_cols(void); |     static void init_cols(void); | ||||||
| @ -122,30 +109,6 @@ uint8_t matrix_cols(void) { | |||||||
|     return MATRIX_COLS; |     return MATRIX_COLS; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // void matrix_power_up(void) {
 |  | ||||||
| // #if (DIODE_DIRECTION == COL2ROW)
 |  | ||||||
| //     for (int8_t r = MATRIX_ROWS - 1; r >= 0; --r) {
 |  | ||||||
| //         /* DDRxn */
 |  | ||||||
| //         _SFR_IO8((row_pins[r] >> 4) + 1) |= _BV(row_pins[r] & 0xF);
 |  | ||||||
| //         toggle_row(r);
 |  | ||||||
| //     }
 |  | ||||||
| //     for (int8_t c = MATRIX_COLS - 1; c >= 0; --c) {
 |  | ||||||
| //         /* PORTxn */
 |  | ||||||
| //         _SFR_IO8((col_pins[c] >> 4) + 2) |= _BV(col_pins[c] & 0xF);
 |  | ||||||
| //     }
 |  | ||||||
| // #elif (DIODE_DIRECTION == ROW2COL)
 |  | ||||||
| //     for (int8_t c = MATRIX_COLS - 1; c >= 0; --c) {
 |  | ||||||
| //         /* DDRxn */
 |  | ||||||
| //         _SFR_IO8((col_pins[c] >> 4) + 1) |= _BV(col_pins[c] & 0xF);
 |  | ||||||
| //         toggle_col(c);
 |  | ||||||
| //     }
 |  | ||||||
| //     for (int8_t r = MATRIX_ROWS - 1; r >= 0; --r) {
 |  | ||||||
| //         /* PORTxn */
 |  | ||||||
| //         _SFR_IO8((row_pins[r] >> 4) + 2) |= _BV(row_pins[r] & 0xF);
 |  | ||||||
| //     }
 |  | ||||||
| // #endif
 |  | ||||||
| // }
 |  | ||||||
| 
 |  | ||||||
| void matrix_init(void) { | void matrix_init(void) { | ||||||
| 
 | 
 | ||||||
|     // initialize row and col
 |     // initialize row and col
 | ||||||
| @ -160,7 +123,6 @@ void matrix_init(void) { | |||||||
|     // initialize matrix state: all keys off
 |     // initialize matrix state: all keys off
 | ||||||
|     for (uint8_t i=0; i < MATRIX_ROWS; i++) { |     for (uint8_t i=0; i < MATRIX_ROWS; i++) { | ||||||
|         matrix[i] = 0; |         matrix[i] = 0; | ||||||
|         matrix_debouncing[i] = 0; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     matrix_init_quantum(); |     matrix_init_quantum(); | ||||||
| @ -170,59 +132,24 @@ uint8_t matrix_scan(void) | |||||||
| { | { | ||||||
| 
 | 
 | ||||||
| #if (DIODE_DIRECTION == COL2ROW) | #if (DIODE_DIRECTION == COL2ROW) | ||||||
| 
 |  | ||||||
|     // Set row, read cols
 |     // Set row, read cols
 | ||||||
|     for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) { |     for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) { | ||||||
| #       if (DEBOUNCING_DELAY > 0) |  | ||||||
|             bool matrix_changed = read_cols_on_row(matrix_debouncing, current_row); |  | ||||||
| 
 |  | ||||||
|             if (matrix_changed) { |  | ||||||
|                 debouncing = true; |  | ||||||
|                 debouncing_time = timer_read(); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
| #       else |  | ||||||
|         read_cols_on_row(matrix, current_row); |         read_cols_on_row(matrix, current_row); | ||||||
| #       endif |  | ||||||
| 
 |  | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
| #elif (DIODE_DIRECTION == ROW2COL) | #elif (DIODE_DIRECTION == ROW2COL) | ||||||
| 
 |  | ||||||
|     // Set col, read rows
 |     // Set col, read rows
 | ||||||
|     for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { |     for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { | ||||||
| #       if (DEBOUNCING_DELAY > 0) |  | ||||||
|             bool matrix_changed = read_rows_on_col(matrix_debouncing, current_col); |  | ||||||
|             if (matrix_changed) { |  | ||||||
|                 debouncing = true; |  | ||||||
|                 debouncing_time = timer_read(); |  | ||||||
|             } |  | ||||||
| #       else |  | ||||||
|         read_rows_on_col(matrix, current_col); |         read_rows_on_col(matrix, current_col); | ||||||
| #       endif |  | ||||||
| 
 |  | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #   if (DEBOUNCING_DELAY > 0) |  | ||||||
|         if (debouncing && (timer_elapsed(debouncing_time) > DEBOUNCING_DELAY)) { |  | ||||||
|             for (uint8_t i = 0; i < MATRIX_ROWS; i++) { |  | ||||||
|                 matrix[i] = matrix_debouncing[i]; |  | ||||||
|             } |  | ||||||
|             debouncing = false; |  | ||||||
|         } |  | ||||||
| #   endif |  | ||||||
| 
 |  | ||||||
|     matrix_scan_quantum(); |     matrix_scan_quantum(); | ||||||
|     return 1; |     return 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | //Deprecated.
 | ||||||
| bool matrix_is_modified(void) | bool matrix_is_modified(void) | ||||||
| { | { | ||||||
| #if (DEBOUNCING_DELAY > 0) |  | ||||||
|     if (debouncing) return false; |  | ||||||
| #endif |  | ||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,4 +1,5 @@ | |||||||
| COMMON_DIR = common | COMMON_DIR = common | ||||||
|  | DEBOUNCE = $(COMMON_DIR)/debounce | ||||||
| ifeq ($(PLATFORM),AVR) | ifeq ($(PLATFORM),AVR) | ||||||
| 	PLATFORM_COMMON_DIR = $(COMMON_DIR)/avr | 	PLATFORM_COMMON_DIR = $(COMMON_DIR)/avr | ||||||
| else ifeq ($(PLATFORM),CHIBIOS) | else ifeq ($(PLATFORM),CHIBIOS) | ||||||
| @ -9,6 +10,7 @@ endif | |||||||
| 
 | 
 | ||||||
| TMK_COMMON_SRC +=	$(COMMON_DIR)/host.c \
 | TMK_COMMON_SRC +=	$(COMMON_DIR)/host.c \
 | ||||||
| 	$(COMMON_DIR)/keyboard.c \
 | 	$(COMMON_DIR)/keyboard.c \
 | ||||||
|  | 	$(COMMON_DIR)/debounce.c \
 | ||||||
| 	$(COMMON_DIR)/action.c \
 | 	$(COMMON_DIR)/action.c \
 | ||||||
| 	$(COMMON_DIR)/action_tapping.c \
 | 	$(COMMON_DIR)/action_tapping.c \
 | ||||||
| 	$(COMMON_DIR)/action_macro.c \
 | 	$(COMMON_DIR)/action_macro.c \
 | ||||||
| @ -39,7 +41,20 @@ ifeq ($(PLATFORM),TEST) | |||||||
| 	TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom.c | 	TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom.c | ||||||
| endif | 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
 | # Option modules
 | ||||||
| ifeq ($(strip $(BOOTMAGIC_ENABLE)), yes) | ifeq ($(strip $(BOOTMAGIC_ENABLE)), yes) | ||||||
|  | |||||||
							
								
								
									
										22
									
								
								tmk_core/common/debounce.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								tmk_core/common/debounce.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | /*
 | ||||||
|  | Copyright 2017 Alex Ong<the.onga@gmail.com> | ||||||
|  | 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 <http://www.gnu.org/licenses/>.
 | ||||||
|  | */ | ||||||
|  | #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); | ||||||
|  | } | ||||||
							
								
								
									
										21
									
								
								tmk_core/common/debounce.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								tmk_core/common/debounce.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | |||||||
|  | #ifndef DEBOUNCE_H | ||||||
|  | #define DEBOUNCE_H | ||||||
|  | #include <stdbool.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | #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 | ||||||
							
								
								
									
										124
									
								
								tmk_core/common/debounce/debounce_eager_pk.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								tmk_core/common/debounce/debounce_eager_pk.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,124 @@ | |||||||
|  | /*
 | ||||||
|  | Copyright 2017 Alex Ong<the.onga@gmail.com> | ||||||
|  | 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 <http://www.gnu.org/licenses/>.
 | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  | 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]; | ||||||
|  | } | ||||||
							
								
								
									
										59
									
								
								tmk_core/common/debounce/debounce_sym_g.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								tmk_core/common/debounce/debounce_sym_g.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,59 @@ | |||||||
|  | /*
 | ||||||
|  | Copyright 2017 Alex Ong<the.onga@gmail.com> | ||||||
|  | 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 <http://www.gnu.org/licenses/>.
 | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  | 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]; | ||||||
|  | } | ||||||
							
								
								
									
										28
									
								
								tmk_core/common/debounce/readme.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								tmk_core/common/debounce/readme.md
									
									
									
									
									
										Normal file
									
								
							| @ -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! | ||||||
| @ -18,6 +18,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>. | |||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
| #include "keyboard.h" | #include "keyboard.h" | ||||||
| #include "matrix.h" | #include "matrix.h" | ||||||
|  | #include "debounce.h" | ||||||
| #include "keymap.h" | #include "keymap.h" | ||||||
| #include "host.h" | #include "host.h" | ||||||
| #include "led.h" | #include "led.h" | ||||||
| @ -157,6 +158,7 @@ void keyboard_init(void) { | |||||||
|   MCUCR |= _BV(JTD); |   MCUCR |= _BV(JTD); | ||||||
| #endif | #endif | ||||||
|     matrix_init(); |     matrix_init(); | ||||||
|  |     matrix_debounce_init(); | ||||||
| #ifdef PS2_MOUSE_ENABLE | #ifdef PS2_MOUSE_ENABLE | ||||||
|     ps2_mouse_init(); |     ps2_mouse_init(); | ||||||
| #endif | #endif | ||||||
| @ -206,9 +208,6 @@ void keyboard_init(void) { | |||||||
| void keyboard_task(void) | void keyboard_task(void) | ||||||
| { | { | ||||||
|     static matrix_row_t matrix_prev[MATRIX_ROWS]; |     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; |     static uint8_t led_status = 0; | ||||||
|     matrix_row_t matrix_row = 0; |     matrix_row_t matrix_row = 0; | ||||||
|     matrix_row_t matrix_change = 0; |     matrix_row_t matrix_change = 0; | ||||||
| @ -217,24 +216,15 @@ void keyboard_task(void) | |||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|     matrix_scan(); |     matrix_scan(); | ||||||
|  |     matrix_debounce(); | ||||||
|  | 
 | ||||||
|     if (is_keyboard_master()) { |     if (is_keyboard_master()) { | ||||||
|         for (uint8_t r = 0; r < MATRIX_ROWS; r++) { |         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]; |             matrix_change = matrix_row ^ matrix_prev[r]; | ||||||
|             if (matrix_change) { |             if (matrix_change) { | ||||||
| #ifdef MATRIX_HAS_GHOST | #ifdef MATRIX_HAS_GHOST | ||||||
|                 if (has_ghost_in_row(r, matrix_row)) { |                 if (has_ghost_in_row(r, matrix_row)) continue; | ||||||
|                     /* 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;
 |  | ||||||
| #endif | #endif | ||||||
|                 if (debug_matrix) matrix_print(); |                 if (debug_matrix) matrix_print(); | ||||||
|                 for (uint8_t c = 0; c < MATRIX_COLS; c++) { |                 for (uint8_t c = 0; c < MATRIX_COLS; c++) { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Alex Ong
						Alex Ong