diff options
Diffstat (limited to 'quantum/matrix.c')
| -rw-r--r-- | quantum/matrix.c | 79 |
1 files changed, 18 insertions, 61 deletions
diff --git a/quantum/matrix.c b/quantum/matrix.c index 9b5ce33d2..49a184569 100644 --- a/quantum/matrix.c +++ b/quantum/matrix.c | |||
| @@ -21,21 +21,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
| 21 | #include "debug.h" | 21 | #include "debug.h" |
| 22 | #include "util.h" | 22 | #include "util.h" |
| 23 | #include "matrix.h" | 23 | #include "matrix.h" |
| 24 | #include "timer.h" | 24 | #include "debounce.h" |
| 25 | #include "quantum.h" | 25 | #include "quantum.h" |
| 26 | 26 | ||
| 27 | |||
| 28 | /* Set 0 if debouncing isn't needed */ | ||
| 29 | |||
| 30 | #ifndef DEBOUNCING_DELAY | ||
| 31 | # define DEBOUNCING_DELAY 5 | ||
| 32 | #endif | ||
| 33 | |||
| 34 | #if (DEBOUNCING_DELAY > 0) | ||
| 35 | static uint16_t debouncing_time; | ||
| 36 | static bool debouncing = false; | ||
| 37 | #endif | ||
| 38 | |||
| 39 | #if (MATRIX_COLS <= 8) | 27 | #if (MATRIX_COLS <= 8) |
| 40 | # define print_matrix_header() print("\nr/c 01234567\n") | 28 | # define print_matrix_header() print("\nr/c 01234567\n") |
| 41 | # define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) | 29 | # define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) |
| @@ -63,9 +51,9 @@ static const pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; | |||
| 63 | #endif | 51 | #endif |
| 64 | 52 | ||
| 65 | /* matrix state(1:on, 0:off) */ | 53 | /* matrix state(1:on, 0:off) */ |
| 66 | static matrix_row_t matrix[MATRIX_ROWS]; | 54 | static matrix_row_t raw_matrix[MATRIX_ROWS]; |
| 67 | 55 | ||
| 68 | static matrix_row_t matrix_debouncing[MATRIX_ROWS]; | 56 | static matrix_row_t matrix[MATRIX_ROWS]; |
| 69 | 57 | ||
| 70 | 58 | ||
| 71 | #if (DIODE_DIRECTION == COL2ROW) | 59 | #if (DIODE_DIRECTION == COL2ROW) |
| @@ -157,70 +145,39 @@ void matrix_init(void) { | |||
| 157 | 145 | ||
| 158 | // initialize matrix state: all keys off | 146 | // initialize matrix state: all keys off |
| 159 | for (uint8_t i=0; i < MATRIX_ROWS; i++) { | 147 | for (uint8_t i=0; i < MATRIX_ROWS; i++) { |
| 148 | raw_matrix[i] = 0; | ||
| 160 | matrix[i] = 0; | 149 | matrix[i] = 0; |
| 161 | matrix_debouncing[i] = 0; | ||
| 162 | } | 150 | } |
| 151 | debounce_init(MATRIX_ROWS); | ||
| 163 | 152 | ||
| 164 | matrix_init_quantum(); | 153 | matrix_init_quantum(); |
| 165 | } | 154 | } |
| 166 | 155 | ||
| 167 | uint8_t matrix_scan(void) | 156 | uint8_t matrix_scan(void) |
| 168 | { | 157 | { |
| 158 | bool changed = false; | ||
| 169 | 159 | ||
| 170 | #if (DIODE_DIRECTION == COL2ROW) | 160 | #if (DIODE_DIRECTION == COL2ROW) |
| 171 | 161 | // Set row, read cols | |
| 172 | // Set row, read cols | 162 | for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) { |
| 173 | for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) { | 163 | changed |= read_cols_on_row(raw_matrix, current_row); |
| 174 | # if (DEBOUNCING_DELAY > 0) | 164 | } |
| 175 | bool matrix_changed = read_cols_on_row(matrix_debouncing, current_row); | ||
| 176 | |||
| 177 | if (matrix_changed) { | ||
| 178 | debouncing = true; | ||
| 179 | debouncing_time = timer_read(); | ||
| 180 | } | ||
| 181 | |||
| 182 | # else | ||
| 183 | read_cols_on_row(matrix, current_row); | ||
| 184 | # endif | ||
| 185 | |||
| 186 | } | ||
| 187 | |||
| 188 | #elif (DIODE_DIRECTION == ROW2COL) | 165 | #elif (DIODE_DIRECTION == ROW2COL) |
| 189 | 166 | // Set col, read rows | |
| 190 | // Set col, read rows | 167 | for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { |
| 191 | for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { | 168 | changed |= read_rows_on_col(raw_matrix, current_col); |
| 192 | # if (DEBOUNCING_DELAY > 0) | 169 | } |
| 193 | bool matrix_changed = read_rows_on_col(matrix_debouncing, current_col); | ||
| 194 | if (matrix_changed) { | ||
| 195 | debouncing = true; | ||
| 196 | debouncing_time = timer_read(); | ||
| 197 | } | ||
| 198 | # else | ||
| 199 | read_rows_on_col(matrix, current_col); | ||
| 200 | # endif | ||
| 201 | |||
| 202 | } | ||
| 203 | |||
| 204 | #endif | 170 | #endif |
| 205 | 171 | ||
| 206 | # if (DEBOUNCING_DELAY > 0) | 172 | debounce(raw_matrix, matrix, MATRIX_ROWS, changed); |
| 207 | if (debouncing && (timer_elapsed(debouncing_time) > DEBOUNCING_DELAY)) { | ||
| 208 | for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | ||
| 209 | matrix[i] = matrix_debouncing[i]; | ||
| 210 | } | ||
| 211 | debouncing = false; | ||
| 212 | } | ||
| 213 | # endif | ||
| 214 | 173 | ||
| 215 | matrix_scan_quantum(); | 174 | matrix_scan_quantum(); |
| 216 | return 1; | 175 | return 1; |
| 217 | } | 176 | } |
| 218 | 177 | ||
| 219 | bool matrix_is_modified(void) | 178 | bool matrix_is_modified(void) |
| 220 | { | 179 | { |
| 221 | #if (DEBOUNCING_DELAY > 0) | 180 | if (debounce_active()) return false; |
| 222 | if (debouncing) return false; | ||
| 223 | #endif | ||
| 224 | return true; | 181 | return true; |
| 225 | } | 182 | } |
| 226 | 183 | ||
