]> git.donarmstrong.com Git - kiibohd-controller.git/blobdiff - Scan/MatrixARM/matrix_scan.c
Fixed ghosting matrix check (did send bad keys on release), now using also ghost_old...
[kiibohd-controller.git] / Scan / MatrixARM / matrix_scan.c
index 7d8897b6a5041195febe57f044746e6ac4dc5a91..76f758349e390c1a7426d3beeda766dfd5946b5c 100644 (file)
@@ -80,6 +80,7 @@ KeyGhost Matrix_ghostArray[ Matrix_colsNum * Matrix_rowsNum ];
 
 uint8_t col_use[Matrix_colsNum], row_use[Matrix_rowsNum];  // used count
 uint8_t col_ghost[Matrix_colsNum], row_ghost[Matrix_rowsNum];  // marked as having ghost if 1
+uint8_t col_ghost_old[Matrix_colsNum], row_ghost_old[Matrix_rowsNum];  // old ghost state
 #endif
 
 
@@ -211,12 +212,18 @@ void Matrix_setup()
        for ( uint8_t pin = 0; pin < Matrix_colsNum; pin++ )
        {
                Matrix_pin( Matrix_cols[ pin ], Type_StrobeSetup );
+               col_use[pin] = 0;
+               col_ghost[pin] = 0;
+               col_ghost_old[pin] = 0;
        }
 
        // Setup Sense Pins
        for ( uint8_t pin = 0; pin < Matrix_rowsNum; pin++ )
        {
                Matrix_pin( Matrix_rows[ pin ], Type_SenseSetup );
+               row_use[pin] = 0;
+               row_ghost[pin] = 0;
+               row_ghost_old[pin] = 0;
        }
 
        // Clear out Debounce Array
@@ -448,7 +455,6 @@ void Matrix_scan( uint16_t scanNum )
        // strobe = column, sense = row
 
        // Count (rows) use for columns
-       //print("C ");
        for ( uint8_t col = 0; col < Matrix_colsNum; col++ )
        {
                uint8_t used = 0;
@@ -459,13 +465,12 @@ void Matrix_scan( uint16_t scanNum )
                        if ( keyOn(state->curState) )
                                used++;
                }
-               //printInt8(used);
                col_use[col] = used;
+               col_ghost_old[col] = col_ghost[col];
                col_ghost[col] = 0;  // clear
        }
 
        // Count (columns) use for rows
-       //print("  R ");
        for ( uint8_t row = 0; row < Matrix_rowsNum; row++ )
        {
                uint8_t used = 0;
@@ -476,14 +481,13 @@ void Matrix_scan( uint16_t scanNum )
                        if ( keyOn(state->curState) )
                                used++;
                }
-               //printInt8(used);
                row_use[row] = used;
+               row_ghost_old[row] = row_ghost[row];
                row_ghost[row] = 0;  // clear
        }
 
        // Check if matrix has ghost
        // Happens when key is pressed and some other key is pressed in same row and another in same column
-       //print("  G ");
        for ( uint8_t col = 0; col < Matrix_colsNum; col++ )
        {
                for ( uint8_t row = 0; row < Matrix_rowsNum; row++ )
@@ -495,11 +499,9 @@ void Matrix_scan( uint16_t scanNum )
                                // mark col and row as having ghost
                                col_ghost[col] = 1;
                                row_ghost[row] = 1;
-                               //print(" ");  printInt8(col);  print(",");  printInt8(row);
                        }
                }
        }
-       //print( NL );
 
        // Send keys
        for ( uint8_t col = 0; col < Matrix_colsNum; col++ )
@@ -512,6 +514,8 @@ void Matrix_scan( uint16_t scanNum )
 
                        // col or row is ghosting (crossed)
                        uint8_t ghost = (col_ghost[col] > 0 || row_ghost[row] > 0) ? 1 : 0;
+                       uint8_t ghost_old = (col_ghost_old[col] > 0 || row_ghost_old[row] > 0) ? 1 : 0;
+                       ghost = ghost || ghost_old ? 1 : 0;
 
                        st->prev = st->cur;  // previous
                        // save state if no ghost or outside ghosted area