changeset 434:eae9fd6acc9a

Fixed ghosting matrix check (did send bad keys on release), now using also ghost_old state
author CryHam <cryham@gmail.com>
date Sun, 08 May 2016 09:31:48 +0200
parents 7bc4c6249dff
children d4388d80d651
files Scan/MatrixARM/matrix_scan.c
diffstat 1 files changed, 11 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/Scan/MatrixARM/matrix_scan.c	Tue Mar 22 19:51:43 2016 -0700
+++ b/Scan/MatrixARM/matrix_scan.c	Sun May 08 09:31:48 2016 +0200
@@ -80,6 +80,7 @@
 
 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 @@
 	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 @@
 	// 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 @@
 			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 @@
 			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 @@
 				// 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 @@
 
 			// 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