Improve anti-ghosting behavior for fast typing

Keypresses would be forgotten if they began while ghosting, even if they
were still pressed after ghosting ended.
This commit is contained in:
Michael Tharp 2014-12-14 12:50:47 -05:00 committed by Jun Wako
parent bd24de44b7
commit b52e29582a

View File

@ -87,6 +87,9 @@ 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;
@ -96,13 +99,21 @@ void keyboard_task(void)
matrix_row = matrix_get_row(r); matrix_row = matrix_get_row(r);
matrix_change = matrix_row ^ matrix_prev[r]; matrix_change = matrix_row ^ matrix_prev[r];
if (matrix_change) { if (matrix_change) {
if (debug_matrix) matrix_print();
#ifdef MATRIX_HAS_GHOST #ifdef MATRIX_HAS_GHOST
if (has_ghost_in_row(r)) { if (has_ghost_in_row(r)) {
matrix_prev[r] = matrix_row; /* 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; continue;
} }
matrix_ghost[r] = matrix_row;
#endif #endif
if (debug_matrix) matrix_print();
for (uint8_t c = 0; c < MATRIX_COLS; c++) { for (uint8_t c = 0; c < MATRIX_COLS; c++) {
if (matrix_change & ((matrix_row_t)1<<c)) { if (matrix_change & ((matrix_row_t)1<<c)) {
action_exec((keyevent_t){ action_exec((keyevent_t){