changeset 154:a2be5e8fc3d7

Adding strobe detection. - This requires that no strobes are floating. On Rev. 0.4, pins D1 and D0 of the teensy must be manually connected to GND On Rev. 0.2, when not using the 18 pin connector, pin C6 and C7 must be manually connected to GND - Added a problem keys cli command, this is very useful to see which keys were disabled at startup because they looked like test points (the fastest way to get the keys to re-enable is to take off a keycap and jiggle the spring)
author Jacob Alexander <haata@kiibohd.com>
date Fri, 25 Apr 2014 01:08:15 -0700
parents 0f8218554421
children 7b4155f3b1b7
files Scan/DPH/scan_loop.c
diffstat 1 files changed, 108 insertions(+), 95 deletions(-) [+]
line wrap: on
line diff
--- a/Scan/DPH/scan_loop.c	Sun Apr 20 01:08:02 2014 -0700
+++ b/Scan/DPH/scan_loop.c	Fri Apr 25 01:08:15 2014 -0700
@@ -120,11 +120,12 @@
 // ----- Function Declarations -----
 
 // CLI Functions
-void cliFunc_avgDebug  ( char* args );
-void cliFunc_echo      ( char* args );
-void cliFunc_keyDebug  ( char* args );
-void cliFunc_pressDebug( char* args );
-void cliFunc_senseDebug( char* args );
+void cliFunc_avgDebug   ( char* args );
+void cliFunc_echo       ( char* args );
+void cliFunc_keyDebug   ( char* args );
+void cliFunc_pressDebug ( char* args );
+void cliFunc_problemKeys( char* args );
+void cliFunc_senseDebug ( char* args );
 
 // Debug Functions
 void dumpSenseTable();
@@ -153,11 +154,12 @@
 // Scan Module command dictionary
 char*       scanCLIDictName = "DPH Module Commands";
 CLIDictItem scanCLIDict[] = {
-	{ "echo",       "Example command, echos the arguments.", cliFunc_echo },
-	{ "avgDebug",   "Enables/Disables averaging results." NL "\t\tDisplays each average, starting from Key 0x00, ignoring 0 valued averages.", cliFunc_avgDebug },
-	{ "keyDebug",   "Enables/Disables long debug for each keypress." NL "\t\tkeycode - [strobe:mux] : sense val : threshold+delta=total : margin", cliFunc_keyDebug },
-	{ "pressDebug", "Enables/Disables short debug for each keypress.", cliFunc_pressDebug },
-	{ "senseDebug", "Prints out the current sense table N times." NL "\t\tsense:max sense:delta", cliFunc_senseDebug },
+	{ "echo",        "Example command, echos the arguments.", cliFunc_echo },
+	{ "avgDebug",    "Enables/Disables averaging results." NL "\t\tDisplays each average, starting from Key 0x00, ignoring 0 valued averages.", cliFunc_avgDebug },
+	{ "keyDebug",    "Enables/Disables long debug for each keypress." NL "\t\tkeycode - [strobe:mux] : sense val : threshold+delta=total : margin", cliFunc_keyDebug },
+	{ "pressDebug",  "Enables/Disables short debug for each keypress.", cliFunc_pressDebug },
+	{ "problemKeys", "Display current list of problem keys,", cliFunc_problemKeys },
+	{ "senseDebug",  "Prints out the current sense table N times." NL "\t\tsense:max sense:delta", cliFunc_senseDebug },
 	{ 0, 0, 0 } // Null entry for dictionary end
 };
 
@@ -206,9 +208,77 @@
 	// Register Scan CLI dictionary
 	CLI_registerDictionary( scanCLIDict, scanCLIDictName );
 
-	// TODO dfj code...needs cleanup + commenting...
-	setup_ADC();
+	// Scan for active strobes
+	// NOTE1: On IBM PCBs, each strobe line that is *NOT* used is connected to GND.
+	//       This means, the strobe GPIO can be set to Tri-State pull-up to detect which strobe lines are not used.
+	// NOTE2: This will *NOT* detect floating strobes.
+	// NOTE3: Rev 0.4, the strobe numbers are reversed, so D0 is actually strobe 0 and C7 is strobe 17
+	DDRC  = 0;
+	PORTC = C_MASK;
+	DDRD  = 0;
+	PORTD = D_MASK;
+	DDRE  = 0;
+	PORTE = E_MASK;
+
+	// Initially there are 0 strobes
+	total_strobes = 0;
+
+	// Iterate over each the strobes
+	for ( uint8_t strobe = 0; strobe < MAX_STROBES; strobe++ )
+	{
+		uint8_t detected = 0;
+
+		// If PIN is high, then strobe is *NOT* connected to GND and may be a strobe
+		switch ( strobe )
+		{
 
+		// Strobe Mappings
+		//              Rev  Rev
+		//              0.2  0.4
+#ifndef REV0_4_DEBUG // XXX These pins should be reworked, and connect to GND on Rev 0.4
+		case 0:  // D0   0   n/c
+		case 1:  // D1   1   n/c
+#endif
+		case 2:  // D2   2   15
+		case 3:  // D3   3   14
+		case 4:  // D4   4   13
+		case 5:  // D5   5   12
+		case 6:  // D6   6   11
+		case 7:  // D7   7   10
+			detected = PIND & (1 << strobe);
+			break;
+
+		case 8:  // E0   8    9
+		case 9:  // E1   9    8
+			detected = PINE & (1 << (strobe - 8));
+			break;
+
+		case 10: // C0  10    7
+		case 11: // C1  11    6
+		case 12: // C2  12    5
+		case 13: // C3  13    4
+		case 14: // C4  14    3
+		case 15: // C5  15    2
+#ifndef REV0_2_DEBUG // XXX If not using the 18 pin connector on Rev 0.2, rework these pins to GND
+		case 16: // C6  16    1
+		case 17: // C7  17    0
+#endif
+			detected = PINC & (1 << (strobe - 10));
+			break;
+
+		default:
+			break;
+		}
+
+		// Potential strobe line detected
+		if ( detected )
+		{
+			strobe_map[total_strobes] = strobe;
+			total_strobes++;
+		}
+	}
+
+	// Setup Pins for Strobing
 	DDRC  = C_MASK;
 	PORTC = 0;
 	DDRD  = D_MASK;
@@ -216,89 +286,8 @@
 	DDRE  = E_MASK;
 	PORTE = 0 ;
 
-	// Hardcoded strobes for debugging
-	// Strobes start at 0 and go to 17 (18), not all Model Fs use all of the available strobes
-	// The single row ribbon connector Model Fs only have a max of 16 strobes
-#define KEYPAD_50KEY
-//#define KISHSAVER_STROBE
-//#define KISHSAVER_OLD_STROBE
-//#define TERMINAL_6110668_OLD_STROBE
-//#define UNSAVER_OLD_STROBE
-#ifdef KISHSAVER_OLD_STROBE
-	total_strobes = 9;
-
-	strobe_map[0] = 2; // Kishsaver doesn't use strobe 0 and 1
-	strobe_map[1] = 3;
-	strobe_map[2] = 4;
-	strobe_map[3] = 5;
-	strobe_map[4] = 6;
-	strobe_map[5] = 7;
-	strobe_map[6] = 8;
-	strobe_map[7] = 9;
-	strobe_map[8] = 15; // Test point strobe (3 test points, sense 1, 4, 5)
-#elif defined(KISHSAVER_STROBE)
-	total_strobes = 9;
-
-	strobe_map[0] = 15; // Kishsaver doesn't use strobe 0 and 1
-	strobe_map[1] = 14;
-	strobe_map[2] = 13;
-	strobe_map[3] = 12;
-	strobe_map[4] = 11;
-	strobe_map[5] = 10;
-	strobe_map[6] = 9;
-	strobe_map[7] = 8;
-	strobe_map[8] = 2; // Test point strobe (3 test points, sense 1, 4, 5)
-#elif defined(KEYPAD_50KEY)
-	total_strobes = 8;
-
-	strobe_map[0] = 14;
-	strobe_map[1] = 13;
-	strobe_map[2] = 12;
-	strobe_map[3] = 11;
-	strobe_map[4] = 10;
-	strobe_map[5] = 9;
-	strobe_map[6] = 8;
-	strobe_map[7] = 0;
-#elif defined(TERMINAL_6110668_OLD_STROBE)
-	total_strobes = 16;
-
-	strobe_map[0] = 0;
-	strobe_map[1] = 1;
-	strobe_map[2] = 2;
-	strobe_map[3] = 3;
-	strobe_map[4] = 4;
-	strobe_map[5] = 5;
-	strobe_map[6] = 6;
-	strobe_map[7] = 7;
-	strobe_map[8] = 8;
-	strobe_map[9] = 9;
-	strobe_map[10] = 10;
-	strobe_map[11] = 11;
-	strobe_map[12] = 12;
-	strobe_map[13] = 13;
-	strobe_map[14] = 14;
-	strobe_map[15] = 15;
-#elif defined(UNSAVER_OLD_STROBE)
-	total_strobes = 14;
-
-	strobe_map[0] = 0;
-	strobe_map[1] = 1;
-	strobe_map[2] = 2;
-	strobe_map[3] = 3;
-	strobe_map[4] = 4;
-	strobe_map[5] = 5;
-	strobe_map[6] = 6;
-	strobe_map[7] = 7;
-	strobe_map[8] = 8;
-	strobe_map[9] = 9;
-	strobe_map[10] = 10;
-	strobe_map[11] = 11;
-	strobe_map[12] = 12;
-	strobe_map[13] = 13;
-#else
-	// Strobe detection
-	// TODO
-#endif
+	// Initialize ADC
+	setup_ADC();
 
 	// Reset debounce table
 	for ( int i = 0; i < KEY_COUNT; ++i )
@@ -992,6 +981,30 @@
 	}
 }
 
+void cliFunc_problemKeys( char* args )
+{
+	print( NL );
+
+	uint8_t count = 0;
+
+	// Args ignored, just displaying
+	// Display problem keys, and the sense value at the time
+	for ( uint8_t key = 0; key < KEY_COUNT; key++ )
+	{
+		if ( keys_problem[key] )
+		{
+			if ( count++ == 0 )
+			{
+				warn_msg("Problem keys: ");
+			}
+			printHex( key );
+			print(" (");
+			printHex( keys_problem[key] );
+			print(")   "  );
+		}
+	}
+}
+
 void cliFunc_senseDebug( char* args )
 {
 	// Parse code from argument