changeset 63:5e5c3bfbcc1c

Fixing slow key issues with the FACOM converter - Required some small API changes, shouldn't affect any other Scan modules (addition of a parameter) - Still have the latching annoyances for some of the modifiers - Swapped Esc and Tilde for convenience - Removed the old Esc key from the latch list (no one needs 13 latches anyways...) - Added the control cluster mappings (Insert, Delete, Home, End, PgUp, PgDn) - All other misc keys are currently un-assigned if a keycap legend doesn't map to anything known (e.g. blank keys, 000 and 00 are mapped, but your OS probably doesn't know what they mean :P)
author Jacob Alexander <triplehaata@gmail.com>
date Sun, 20 Jan 2013 22:23:28 -0500
parents 685619eb3412
children 9765cca59700
files Keymap/facom6684.h Macro/buffer/macro.c Scan/FACOM6684/scan_loop.c Scan/FACOM6684/scan_loop.h USB/pjrc/usb_com.c
diffstat 5 files changed, 64 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/Keymap/facom6684.h	Sun Jan 20 20:27:14 2013 -0500
+++ b/Keymap/facom6684.h	Sun Jan 20 22:23:28 2013 -0500
@@ -94,8 +94,8 @@
 				KEYPAD_9, // 0x3E
 				KEYPAD_TAB, // 0x3F
 				0, // 0x40
-				0, // 0x41
-				KEY_TILDE, // 0x42
+				KEY_TILDE, // 0x41
+				KEY_ESC, // 0x42
 				KEY_1, // 0x43
 				KEY_2, // 0x44
 				KEY_3, // 0x45
@@ -121,10 +121,10 @@
 				KEY_P, // 0x59
 				KEY_SEMICOLON, // 0x5A
 				KEY_PERIOD, // 0x5B
-				0, // 0x5C
+				KEY_INSERT, // 0x5C
 				KEY_LEFT, // 0x5D
 				0, // 0x5E
-				0, // 0x5F
+				KEY_DELETE, // 0x5F
 				KEY_F13, // 0x60
 				KEY_F14, // 0x61
 				KEY_F15, // 0x62
@@ -137,10 +137,10 @@
 				KEY_LEFT_BRACE, // 0x69
 				KEY_QUOTE, // 0x6A
 				KEY_SLASH, // 0x6B
-				0, // 0x6C
+				KEY_HOME, // 0x6C
 				KEY_DOWN, // 0x6D
 				0, // 0x6E
-				0, // 0x6F
+				KEY_END, // 0x6F
 				KEY_F19, // 0x70
 				KEY_F20, // 0x71
 				KEY_F21, // 0x72
@@ -153,10 +153,10 @@
 				KEY_RIGHT_BRACE, // 0x79
 				KEY_BACKSLASH, // 0x7A
 				KEY_UP, // 0x7B
-				0, // 0x7C
+				KEY_PAGE_UP, // 0x7C
 				KEY_RIGHT, // 0x7D
 				0, // 0x7E
-				0, // 0x7F
+				KEY_PAGE_DOWN, // 0x7F
 };
 
 static uint8_t facom6684_ColemakMap[] = {
@@ -225,8 +225,8 @@
 				KEYPAD_9, // 0x3E
 				KEYPAD_TAB, // 0x3F
 				0, // 0x40
-				0, // 0x41
-				KEY_TILDE, // 0x42
+				KEY_TILDE, // 0x41
+				KEY_ESC, // 0x42
 				KEY_1, // 0x43
 				KEY_2, // 0x44
 				KEY_3, // 0x45
@@ -252,10 +252,10 @@
 				KEY_SEMICOLON, // 0x59
 				KEY_O, // 0x5A
 				KEY_PERIOD, // 0x5B
-				0, // 0x5C
+				KEY_INSERT, // 0x5C
 				KEY_LEFT, // 0x5D
 				0, // 0x5E
-				0, // 0x5F
+				KEY_DELETE, // 0x5F
 				KEY_F13, // 0x60
 				KEY_F14, // 0x61
 				KEY_F15, // 0x62
@@ -268,10 +268,10 @@
 				KEY_LEFT_BRACE, // 0x69
 				KEY_QUOTE, // 0x6A
 				KEY_SLASH, // 0x6B
-				0, // 0x6C
+				KEY_HOME, // 0x6C
 				KEY_DOWN, // 0x6D
 				0, // 0x6E
-				0, // 0x6F
+				KEY_END, // 0x6F
 				KEY_F19, // 0x70
 				KEY_F20, // 0x71
 				KEY_F21, // 0x72
@@ -284,10 +284,10 @@
 				KEY_RIGHT_BRACE, // 0x79
 				KEY_BACKSLASH, // 0x7A
 				KEY_UP, // 0x7B
-				0, // 0x7C
+				KEY_PAGE_UP, // 0x7C
 				KEY_RIGHT, // 0x7D
 				0, // 0x7E
-				0, // 0x7F
+				KEY_PAGE_DOWN, // 0x7F
 };
 
 
--- a/Macro/buffer/macro.c	Sun Jan 20 20:27:14 2013 -0500
+++ b/Macro/buffer/macro.c	Sun Jan 20 22:23:28 2013 -0500
@@ -52,7 +52,7 @@
 
 // ----- Functions -----
 
-inline void macro_finishedWithBuffer(void)
+inline void macro_finishedWithBuffer( uint8_t sentKeys )
 {
 	/* BudKeypad
 	// Boot loader sequence state handler
@@ -371,10 +371,10 @@
 	}
 
 	// Signal Macro processor that all of the buffered keys have been processed
-	macro_finishedWithBuffer();
+	macro_finishedWithBuffer( KeyIndex_BufferUsed );
 
 	// Signal buffer that we've used it
-	scan_finishedWithBuffer();
+	scan_finishedWithBuffer( KeyIndex_BufferUsed );
 }
 
 inline void process_macros(void)
--- a/Scan/FACOM6684/scan_loop.c	Sun Jan 20 20:27:14 2013 -0500
+++ b/Scan/FACOM6684/scan_loop.c	Sun Jan 20 22:23:28 2013 -0500
@@ -53,8 +53,11 @@
 volatile uint8_t KeyIndex_Buffer[KEYBOARD_BUFFER];
 volatile uint8_t KeyIndex_BufferUsed;
 
+volatile uint8_t KeyBufferRemove[6];
+volatile uint8_t KeyBufferRemoveCount = 0;
+
 static uint8_t KeyBuffer[3];
-static uint8_t KeyBufferCount = 0;
+volatile static uint8_t KeyBufferCount = 0;
 
 
 
@@ -72,14 +75,11 @@
 {
 	cli(); // Disable Interrupts
 
-
 	// Read part of the scan code (3 8bit chunks) from USART
 	KeyBuffer[KeyBufferCount] = UDR1;
 
 	if ( KeyBufferCount >= 2 )
 	{
-		KeyBufferCount = 0;
-
 		// Debug
 		for ( uint8_t c = 0; c <= 2; c++ )
 		{
@@ -91,6 +91,8 @@
 		print("\n");
 
 		processKeyValue( KeyBuffer[1], KeyBuffer[2] );
+
+		KeyBufferCount = 0;
 	}
 	else
 	{
@@ -133,6 +135,14 @@
 // Main Detection Loop
 inline uint8_t scan_loop()
 {
+	// Remove any "released keys", this is delayed due to buffer release synchronization issues
+	for ( uint8_t c = 0; c < KeyBufferRemoveCount; c++ )
+	{
+		removeKeyValue( KeyBufferRemove[c] );
+	}
+
+	KeyBufferRemoveCount = 0;
+
 	return 0;
 }
 
@@ -148,7 +158,7 @@
 		break;
 	// Modifier Key Release
 	case 0x02:
-		removeKeyValue( keyValue );
+		KeyBufferRemove[KeyBufferRemoveCount++] = keyValue;
 		return;
 	}
 
@@ -212,30 +222,32 @@
 }
 
 // Signal KeyIndex_Buffer that it has been properly read
-void scan_finishedWithBuffer( void )
+void scan_finishedWithBuffer( uint8_t sentKeys )
 {
-}
+	// Make sure we aren't in the middle of a receiving a new scancode
+	while ( KeyBufferCount != 0 );
 
-// Signal that the keys have been properly sent over USB
-void scan_finishedWithUSBBuffer( void )
-{
+	cli(); // Disable Interrupts
+
 	// Count for number of modifiers to maintain in the buffer
 	uint8_t filled = 0;
 	uint8_t latched = 0;
 	uint8_t latchBuffer[13]; // There are only 13 keys that can possibly be latched at the same time...
 	uint8_t normal = 0;
+	uint8_t prevBuffer = KeyIndex_BufferUsed;
 
 	// Clean out all keys except "special" keys (designated modifiers)
-	for ( uint8_t c = 0; c < KeyIndex_BufferUsed; c++ )
+	uint8_t key;
+	for ( key = 0; key < sentKeys; key++ )
 	{
-		switch ( KeyIndex_Buffer[c] )
+		switch ( KeyIndex_Buffer[key] )
 		{
 		// Dedicated Modifier Keys
 		// NOTE: Both shifts are represented as the same scan code
 		case 0x04:
 		case 0x05:
 		case 0x12:
-			KeyIndex_Buffer[filled++] = KeyIndex_Buffer[c];
+			KeyIndex_Buffer[filled++] = KeyIndex_Buffer[key];
 			break;
 		// Latched Keys, only released if a non-modifier is pressed along with it
 		// NOTE: This keys do not have a built in repeating
@@ -251,8 +263,8 @@
 		case 0x30:
 		case 0x31:
 		case 0x40:
-		case 0x41:
-			latchBuffer[latched++] = KeyIndex_Buffer[c];
+		//case 0x41: // XXX Being used as ESC
+			latchBuffer[latched++] = KeyIndex_Buffer[key];
 			break;
 		// Allow the scancode to be removed, normal keys
 		default:
@@ -264,6 +276,13 @@
 	// Reset the buffer counter
 	KeyIndex_BufferUsed = filled;
 
+	// Add back lost keys, so they are processed on the next USB send
+	for ( ; key < prevBuffer; key++ )
+	{
+		bufferAdd( KeyIndex_Buffer[key] );
+		info_print("Re-appending lost key after USB send...");
+	}
+
 	// Only "re-add" the latched keys if they weren't used
 	if ( latched > 0 && normal == 0 )
 	{
@@ -272,6 +291,13 @@
 			bufferAdd( latchBuffer[c] );
 		}
 	}
+
+	sei(); // Re-enable Interrupts
+}
+
+// Signal that the keys have been properly sent over USB
+void scan_finishedWithUSBBuffer( uint8_t sentKeys )
+{
 }
 
 // Reset/Hold keyboard
@@ -292,6 +318,7 @@
 	_delay_ms( 50 );
 
 	KeyBufferCount = 0;
+	KeyBufferRemoveCount = 0;
 	KeyIndex_BufferUsed = 0;
 }
 
--- a/Scan/FACOM6684/scan_loop.h	Sun Jan 20 20:27:14 2013 -0500
+++ b/Scan/FACOM6684/scan_loop.h	Sun Jan 20 22:23:28 2013 -0500
@@ -56,8 +56,8 @@
 // Functions available to macro.c
 uint8_t scan_sendData( uint8_t dataPayload );
 
-void scan_finishedWithBuffer( void );
-void scan_finishedWithUSBBuffer( void );
+void scan_finishedWithBuffer( uint8_t sentKeys );
+void scan_finishedWithUSBBuffer( uint8_t sentKeys );
 void scan_lockKeyboard( void );
 void scan_unlockKeyboard( void );
 void scan_resetKeyboard( void );
--- a/USB/pjrc/usb_com.c	Sun Jan 20 20:27:14 2013 -0500
+++ b/USB/pjrc/usb_com.c	Sun Jan 20 22:23:28 2013 -0500
@@ -85,6 +85,6 @@
 		USBKeys_Sent      = 0;
 
 		// Signal Scan Module we are finishedA
-		scan_finishedWithUSBBuffer();
+		scan_finishedWithUSBBuffer( USBKeys_Sent <= USBKeys_MaxSize ? USBKeys_Sent : USBKeys_MaxSize );
 }