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 | ||