Selaa lähdekoodia

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 10 vuotta sitten
vanhempi
commit
b52e29582a
1 muutettua tiedostoa jossa 13 lisäystä ja 2 poistoa
  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)
 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){