Quellcode durchsuchen

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.
Michael Tharp vor 10 Jahren
Ursprung
Commit
b52e29582a
1 geänderte Dateien mit 13 neuen und 2 gelöschten Zeilen
  1. 13 2
      tmk_core/common/keyboard.c

+ 13 - 2
tmk_core/common/keyboard.c

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