changeset 62:685619eb3412

Completed the FACOM 6684 converter... Unfortunately, the protocol annoying, with only 3 keys having Press/Release signals. Some of the keys were only meant to be pressed once, and do not have repeat functionality. The current implementation is a bit slow, so some keys may get lost during USB sending. This is probably fixable, not sure if I want to spend the time on it though. There is a keyboard input protocol, but I'm not sure of what information can be transmitted to the keyboard. The terminal does send some information back and forth between the keyboard, but I'm unclear of the purpose, as I can never get any response out of the keyboard.
author Jacob Alexander <triplehaata@gmail.com>
date Sun, 20 Jan 2013 20:27:14 -0500
parents fed6681dc35f
children 5e5c3bfbcc1c
files Keymap/facom6684.h Scan/FACOM6684/scan_loop.c
diffstat 2 files changed, 344 insertions(+), 323 deletions(-) [+]
line wrap: on
line diff
--- a/Keymap/facom6684.h	Mon Jan 14 21:51:02 2013 -0500
+++ b/Keymap/facom6684.h	Sun Jan 20 20:27:14 2013 -0500
@@ -26,135 +26,135 @@
 
 
 // ----- Variables -----
-static uint8_t facom6684_ModifierMask[] = { 0x20, 0x2D, 0x2E, 0x30, 0x3E, 0x60 };
+static uint8_t facom6684_ModifierMask[] = { 0x22, 0x12, 0x05, 0x04, 0x03 };
 
 static uint8_t facom6684_DefaultMap[] = { 
 				0, // 0x00
 				0, // 0x01
-				0, // 0x02
-				0, // 0x03
-				0, // 0x04
-				0, // 0x05
+				KEY_SPACE, // 0x02
+				KEY_LEFT_ALT, // 0x03
+				KEY_RIGHT_ALT, // 0x04
+				KEY_LEFT_GUI, // 0x05
 				0, // 0x06
 				0, // 0x07
-				0, // 0x08
-				0, // 0x09
+				KEY_BACKSPACE, // 0x08
+				KEY_ENTER, // 0x09
 				0, // 0x0A
 				0, // 0x0B
-				0, // 0x0C
-				0, // 0x0D
-				0, // 0x0E
-				0, // 0x0F
+				KEYPAD_0, // 0x0C
+				KEYPAD_00, // 0x0D
+				KEYPAD_000, // 0x0E
+				KEYPAD_DECIMAL, // 0x0F
 				0, // 0x10
 				0, // 0x11
-				0, // 0x12
+				KEY_LEFT_SHIFT, // 0x12
 				0, // 0x13
-				0, // 0x14
-				0, // 0x15
-				0, // 0x16
-				0, // 0x17
-				0, // 0x18
-				0, // 0x19
-				0, // 0x1A
-				0, // 0x1B
-				0, // 0x1C
-				0, // 0x1D
-				0, // 0x1E
-				0, // 0x1F
-				KEY_LEFT_SHIFT, // 0x20
+				KEY_Z, // 0x14
+				KEY_X, // 0x15
+				KEY_C, // 0x16
+				KEY_V, // 0x17
+				KEY_B, // 0x18
+				KEY_N, // 0x19
+				KEY_M, // 0x1A
+				KEY_COMMA, // 0x1B
+				KEYPAD_1, // 0x1C
+				KEYPAD_2, // 0x1D
+				KEYPAD_3, // 0x1E
+				KEYPAD_ENTER, // 0x1F
+				0, // 0x20
 				0, // 0x21
-				KEY_Z, // 0x22
-				KEY_X, // 0x23
-				KEY_C, // 0x24
-				KEY_V, // 0x25
-				KEY_B, // 0x26
-				KEY_N, // 0x27
-				KEY_M, // 0x28
-				KEY_COMMA, // 0x29
-				KEY_PERIOD, // 0x2A
-				KEY_SLASH, // 0x2B
-				0, // 0x2C
-				KEY_RIGHT_SHIFT, // 0x2D
-				KEY_LEFT_ALT, // 0x2E
-				KEY_SPACE, // 0x2F
-				KEY_LEFT_CTRL, // 0x30
-				KEY_A, // 0x31
-				KEY_S, // 0x32
-				KEY_D, // 0x33
-				KEY_F, // 0x34
-				KEY_G, // 0x35
-				KEY_H, // 0x36
-				KEY_J, // 0x37
-				KEY_K, // 0x38
-				KEY_L, // 0x39
-				KEY_SEMICOLON, // 0x3A
-				KEY_QUOTE, // 0x3B
-				0, // 0x3C
-				KEY_ENTER, // 0x3D
-				KEY_RIGHT_GUI, // 0x3E
-				KEY_LEFT, // 0x3F (KEYPAD_1)
-				KEY_TAB, // 0x40
-				KEY_Q, // 0x41
-				KEY_W, // 0x42
-				KEY_E, // 0x43
-				KEY_R, // 0x44
-				KEY_T, // 0x45
-				KEY_Y, // 0x46
-				KEY_U, // 0x47
-				KEY_I, // 0x48
-				KEY_O, // 0x49
-				KEY_P, // 0x4A
-				KEY_LEFT_BRACE, // 0x4B
-				KEY_RIGHT_BRACE, // 0x4C
-				KEY_BACKSLASH, // 0x4D
-				KEY_DELETE, // 0x4E
-				KEYPAD_4, // 0x4F
-				KEY_ESC, // 0x50
-				KEY_1, // 0x51
-				KEY_2, // 0x52
-				KEY_3, // 0x53
-				KEY_4, // 0x54
-				KEY_5, // 0x55
-				KEY_6, // 0x56
-				KEY_7, // 0x57
-				KEY_8, // 0x58
-				KEY_9, // 0x59
-				KEY_0, // 0x5A
-				KEY_MINUS, // 0x5B
-				KEY_EQUAL, // 0x5C
-				KEY_TILDE, // 0x5D
-				KEY_BACKSPACE, // 0x5E
-				KEY_NUM_LOCK, // 0x5F
-				KEY_LEFT_GUI, // 0x60
-				KEY_HOME, // 0x61
-				KEY_END, // 0x62
-				KEY_INSERT, // 0x63
-				KEY_DELETE, // 0x64
-				KEY_F1, // 0x65
-				KEY_F2, // 0x66
-				KEY_F3, // 0x67
-				KEY_F4, // 0x68
-				KEY_F5, // 0x69
-				KEY_F6, // 0x6A
-				KEY_F7, // 0x6B
-				KEY_F8, // 0x6C
-				KEY_F9, // 0x6D
-				KEY_F10, // 0x6E
-				KEY_PRINTSCREEN, // 0x6F
-				KEY_PAGE_UP, // 0x70
-				KEY_PAGE_DOWN, // 0x71
-				KEY_F11, // 0x72
-				KEYPAD_7, // 0x73
-				KEYPAD_8, // 0x74
-				KEYPAD_9, // 0x75
-				KEY_UP, // 0x76 (KEYPAD_5)
-				KEYPAD_6, // 0x77
-				KEY_DOWN, // 0x78 (KEYPAD_2)
-				KEY_RIGHT, // 0x79 (KEYPAD_3)
-				KEYPAD_0, // 0x7A
-				KEYPAD_00, // 0x7B
-				KEYPAD_ENTER, // 0x7C
-				0, // 0x7D
+				KEY_LEFT_CTRL, // 0x22
+				KEY_A, // 0x23
+				KEY_S, // 0x24
+				KEY_D, // 0x25
+				KEY_F, // 0x26
+				KEY_G, // 0x27
+				KEY_H, // 0x28
+				KEY_J, // 0x29
+				KEY_K, // 0x2A
+				KEY_L, // 0x2B
+				KEYPAD_4, // 0x2C
+				KEYPAD_5, // 0x2D
+				KEYPAD_6, // 0x2E
+				KEYPAD_MINUS, // 0x2F
+				0, // 0x30
+				0, // 0x31
+				KEY_TAB, // 0x32
+				KEY_Q, // 0x33
+				KEY_W, // 0x34
+				KEY_E, // 0x35
+				KEY_R, // 0x36
+				KEY_T, // 0x37
+				KEY_Y, // 0x38
+				KEY_U, // 0x39
+				KEY_I, // 0x3A
+				KEY_O, // 0x3B
+				KEYPAD_7, // 0x3C
+				KEYPAD_8, // 0x3D
+				KEYPAD_9, // 0x3E
+				KEYPAD_TAB, // 0x3F
+				0, // 0x40
+				0, // 0x41
+				KEY_TILDE, // 0x42
+				KEY_1, // 0x43
+				KEY_2, // 0x44
+				KEY_3, // 0x45
+				KEY_4, // 0x46
+				KEY_5, // 0x47
+				KEY_6, // 0x48
+				KEY_7, // 0x49
+				KEY_8, // 0x4A
+				KEY_9, // 0x4B
+				0, // 0x4C
+				0, // 0x4D
+				KEYPAD_COMMA, // 0x4E
+				KEYPAD_SPACE, // 0x4F
+				KEY_F1, // 0x50
+				KEY_F2, // 0x51
+				KEY_F3, // 0x52
+				KEY_F4, // 0x53
+				KEY_F5, // 0x54
+				KEY_F6, // 0x55
+				KEY_F7, // 0x56
+				KEY_F8, // 0x57
+				KEY_0, // 0x58
+				KEY_P, // 0x59
+				KEY_SEMICOLON, // 0x5A
+				KEY_PERIOD, // 0x5B
+				0, // 0x5C
+				KEY_LEFT, // 0x5D
+				0, // 0x5E
+				0, // 0x5F
+				KEY_F13, // 0x60
+				KEY_F14, // 0x61
+				KEY_F15, // 0x62
+				KEY_F16, // 0x63
+				KEY_F17, // 0x64
+				KEY_F18, // 0x65
+				KEY_F9, // 0x66
+				KEY_F10, // 0x67
+				KEY_MINUS, // 0x68
+				KEY_LEFT_BRACE, // 0x69
+				KEY_QUOTE, // 0x6A
+				KEY_SLASH, // 0x6B
+				0, // 0x6C
+				KEY_DOWN, // 0x6D
+				0, // 0x6E
+				0, // 0x6F
+				KEY_F19, // 0x70
+				KEY_F20, // 0x71
+				KEY_F21, // 0x72
+				KEY_F22, // 0x73
+				KEY_F23, // 0x74
+				KEY_F24, // 0x75
+				KEY_F11, // 0x76
+				KEY_F12, // 0x77
+				KEY_EQUAL, // 0x78
+				KEY_RIGHT_BRACE, // 0x79
+				KEY_BACKSLASH, // 0x7A
+				KEY_UP, // 0x7B
+				0, // 0x7C
+				KEY_RIGHT, // 0x7D
 				0, // 0x7E
 				0, // 0x7F
 };
@@ -162,130 +162,130 @@
 static uint8_t facom6684_ColemakMap[] = {
 				0, // 0x00
 				0, // 0x01
-				0, // 0x02
-				0, // 0x03
-				0, // 0x04
-				0, // 0x05
+				KEY_SPACE, // 0x02
+				KEY_LEFT_ALT, // 0x03
+				KEY_RIGHT_ALT, // 0x04
+				KEY_LEFT_GUI, // 0x05
 				0, // 0x06
 				0, // 0x07
-				0, // 0x08
-				0, // 0x09
+				KEY_BACKSPACE, // 0x08
+				KEY_ENTER, // 0x09
 				0, // 0x0A
 				0, // 0x0B
-				0, // 0x0C
-				0, // 0x0D
-				0, // 0x0E
-				0, // 0x0F
+				KEYPAD_0, // 0x0C
+				KEYPAD_00, // 0x0D
+				KEYPAD_000, // 0x0E
+				KEYPAD_DECIMAL, // 0x0F
 				0, // 0x10
 				0, // 0x11
-				0, // 0x12
+				KEY_LEFT_SHIFT, // 0x12
 				0, // 0x13
-				0, // 0x14
-				0, // 0x15
-				0, // 0x16
-				0, // 0x17
-				0, // 0x18
-				0, // 0x19
-				0, // 0x1A
-				0, // 0x1B
-				0, // 0x1C
-				0, // 0x1D
-				0, // 0x1E
-				0, // 0x1F
-				KEY_LEFT_SHIFT, // 0x20
+				KEY_Z, // 0x14
+				KEY_X, // 0x15
+				KEY_C, // 0x16
+				KEY_V, // 0x17
+				KEY_B, // 0x18
+				KEY_K, // 0x19
+				KEY_M, // 0x1A
+				KEY_COMMA, // 0x1B
+				KEYPAD_1, // 0x1C
+				KEYPAD_2, // 0x1D
+				KEYPAD_3, // 0x1E
+				KEYPAD_ENTER, // 0x1F
+				0, // 0x20
 				0, // 0x21
-				KEY_Z, // 0x22
-				KEY_X, // 0x23
-				KEY_C, // 0x24
-				KEY_V, // 0x25
-				KEY_B, // 0x26
-				KEY_K, // 0x27
-				KEY_M, // 0x28
-				KEY_COMMA, // 0x29
-				KEY_PERIOD, // 0x2A
-				KEY_SLASH, // 0x2B
-				0, // 0x2C
-				KEY_RIGHT_SHIFT, // 0x2D
-				KEY_LEFT_ALT, // 0x2E
-				KEY_SPACE, // 0x2F
-				KEY_LEFT_CTRL, // 0x30
-				KEY_A, // 0x31
-				KEY_R, // 0x32
-				KEY_S, // 0x33
-				KEY_T, // 0x34
-				KEY_D, // 0x35
-				KEY_H, // 0x36
-				KEY_N, // 0x37
-				KEY_E, // 0x38
-				KEY_I, // 0x39
-				KEY_O, // 0x3A
-				KEY_QUOTE, // 0x3B
-				0, // 0x3C
-				KEY_ENTER, // 0x3D
-				KEY_RIGHT_GUI, // 0x3E
-				KEY_LEFT, // 0x3F (KEYPAD_1)
-				KEY_TAB, // 0x40
-				KEY_Q, // 0x41
-				KEY_W, // 0x42
-				KEY_F, // 0x43
-				KEY_P, // 0x44
-				KEY_G, // 0x45
-				KEY_J, // 0x46
-				KEY_L, // 0x47
-				KEY_U, // 0x48
-				KEY_Y, // 0x49
-				KEY_SEMICOLON, // 0x4A
-				KEY_LEFT_BRACE, // 0x4B
-				KEY_RIGHT_BRACE, // 0x4C
-				KEY_BACKSLASH, // 0x4D
-				KEY_DELETE, // 0x4E
-				KEYPAD_4, // 0x4F
-				KEY_ESC, // 0x50
-				KEY_1, // 0x51
-				KEY_2, // 0x52
-				KEY_3, // 0x53
-				KEY_4, // 0x54
-				KEY_5, // 0x55
-				KEY_6, // 0x56
-				KEY_7, // 0x57
-				KEY_8, // 0x58
-				KEY_9, // 0x59
-				KEY_0, // 0x5A
-				KEY_MINUS, // 0x5B
-				KEY_EQUAL, // 0x5C
-				KEY_TILDE, // 0x5D
-				KEY_BACKSPACE, // 0x5E
-				KEY_NUM_LOCK, // 0x5F
-				KEY_LEFT_GUI, // 0x60
-				KEY_HOME, // 0x61
-				KEY_END, // 0x62
-				KEY_INSERT, // 0x63
-				KEY_DELETE, // 0x64
-				KEY_F1, // 0x65
-				KEY_F2, // 0x66
-				KEY_F3, // 0x67
-				KEY_F4, // 0x68
-				KEY_F5, // 0x69
-				KEY_F6, // 0x6A
-				KEY_F7, // 0x6B
-				KEY_F8, // 0x6C
-				KEY_F9, // 0x6D
-				KEY_F10, // 0x6E
-				KEY_PRINTSCREEN, // 0x6F
-				KEY_PAGE_UP, // 0x70
-				KEY_PAGE_DOWN, // 0x71
-				KEY_F11, // 0x72
-				KEYPAD_7, // 0x73
-				KEYPAD_8, // 0x74
-				KEYPAD_9, // 0x75
-				KEY_UP, // 0x76 (KEYPAD_5)
-				KEYPAD_6, // 0x77
-				KEY_DOWN, // 0x78 (KEYPAD_2)
-				KEY_RIGHT, // 0x79 (KEYPAD_3)
-				KEYPAD_0, // 0x7A
-				KEYPAD_00, // 0x7B
-				KEYPAD_ENTER, // 0x7C
-				0, // 0x7D
+				KEY_LEFT_CTRL, // 0x22
+				KEY_A, // 0x23
+				KEY_R, // 0x24
+				KEY_S, // 0x25
+				KEY_T, // 0x26
+				KEY_D, // 0x27
+				KEY_H, // 0x28
+				KEY_N, // 0x29
+				KEY_E, // 0x2A
+				KEY_I, // 0x2B
+				KEYPAD_4, // 0x2C
+				KEYPAD_5, // 0x2D
+				KEYPAD_6, // 0x2E
+				KEYPAD_MINUS, // 0x2F
+				0, // 0x30
+				0, // 0x31
+				KEY_TAB, // 0x32
+				KEY_Q, // 0x33
+				KEY_W, // 0x34
+				KEY_F, // 0x35
+				KEY_P, // 0x36
+				KEY_G, // 0x37
+				KEY_J, // 0x38
+				KEY_L, // 0x39
+				KEY_U, // 0x3A
+				KEY_Y, // 0x3B
+				KEYPAD_7, // 0x3C
+				KEYPAD_8, // 0x3D
+				KEYPAD_9, // 0x3E
+				KEYPAD_TAB, // 0x3F
+				0, // 0x40
+				0, // 0x41
+				KEY_TILDE, // 0x42
+				KEY_1, // 0x43
+				KEY_2, // 0x44
+				KEY_3, // 0x45
+				KEY_4, // 0x46
+				KEY_5, // 0x47
+				KEY_6, // 0x48
+				KEY_7, // 0x49
+				KEY_8, // 0x4A
+				KEY_9, // 0x4B
+				0, // 0x4C
+				0, // 0x4D
+				KEYPAD_COMMA, // 0x4E
+				KEYPAD_SPACE, // 0x4F
+				KEY_F1, // 0x50
+				KEY_F2, // 0x51
+				KEY_F3, // 0x52
+				KEY_F4, // 0x53
+				KEY_F5, // 0x54
+				KEY_F6, // 0x55
+				KEY_F7, // 0x56
+				KEY_F8, // 0x57
+				KEY_0, // 0x58
+				KEY_SEMICOLON, // 0x59
+				KEY_O, // 0x5A
+				KEY_PERIOD, // 0x5B
+				0, // 0x5C
+				KEY_LEFT, // 0x5D
+				0, // 0x5E
+				0, // 0x5F
+				KEY_F13, // 0x60
+				KEY_F14, // 0x61
+				KEY_F15, // 0x62
+				KEY_F16, // 0x63
+				KEY_F17, // 0x64
+				KEY_F18, // 0x65
+				KEY_F9, // 0x66
+				KEY_F10, // 0x67
+				KEY_MINUS, // 0x68
+				KEY_LEFT_BRACE, // 0x69
+				KEY_QUOTE, // 0x6A
+				KEY_SLASH, // 0x6B
+				0, // 0x6C
+				KEY_DOWN, // 0x6D
+				0, // 0x6E
+				0, // 0x6F
+				KEY_F19, // 0x70
+				KEY_F20, // 0x71
+				KEY_F21, // 0x72
+				KEY_F22, // 0x73
+				KEY_F23, // 0x74
+				KEY_F24, // 0x75
+				KEY_F11, // 0x76
+				KEY_F12, // 0x77
+				KEY_EQUAL, // 0x78
+				KEY_RIGHT_BRACE, // 0x79
+				KEY_BACKSLASH, // 0x7A
+				KEY_UP, // 0x7B
+				0, // 0x7C
+				KEY_RIGHT, // 0x7D
 				0, // 0x7E
 				0, // 0x7F
 };
--- a/Scan/FACOM6684/scan_loop.c	Mon Jan 14 21:51:02 2013 -0500
+++ b/Scan/FACOM6684/scan_loop.c	Sun Jan 20 20:27:14 2013 -0500
@@ -37,11 +37,6 @@
 
 // ----- Defines -----
 
-// Pinout Defines
-#define HOLD_PORT PORTD
-#define HOLD_DDR   DDRD
-#define HOLD_PIN      3
-
 
 // ----- Macros -----
 
@@ -57,17 +52,15 @@
 // Buffer used to inform the macro processing module which keys have been detected as pressed
 volatile uint8_t KeyIndex_Buffer[KEYBOARD_BUFFER];
 volatile uint8_t KeyIndex_BufferUsed;
-volatile uint8_t KeyIndex_Add_InputSignal; // Used to pass the (click/input value) to the keyboard for the clicker
 
-
-// Buffer Signals
-volatile uint8_t BufferReadyToClear;
+static uint8_t KeyBuffer[3];
+static uint8_t KeyBufferCount = 0;
 
 
 
 // ----- Function Declarations -----
 
-void processKeyValue( uint8_t keyValue );
+void processKeyValue( uint8_t valueType, uint8_t keyValue );
 void  removeKeyValue( uint8_t keyValue );
 
 
@@ -79,38 +72,29 @@
 {
 	cli(); // Disable Interrupts
 
-	uint8_t keyValue = 0x00;
-	uint8_t keyState = 0x00;
 
-	// Read the scancode packet from the USART (1st to 8th bits)
-	keyValue = UDR1;
+	// Read part of the scan code (3 8bit chunks) from USART
+	KeyBuffer[KeyBufferCount] = UDR1;
 
-	// Read the release/press bit (9th bit) XXX Unnecessary, and wrong it seems, parity bit? or something else?
-	keyState = UCSR1B & 0x02;
-
-	// High bit of keyValue, also represents press/release
-	keyState = keyValue & 0x80 ? 0x00 : 0x02;
-
-	// Debug
-	char tmpStr[6];
-	hexToStr( keyValue & 0x7F, tmpStr );
+	if ( KeyBufferCount >= 2 )
+	{
+		KeyBufferCount = 0;
 
-	// Process the scancode
-	switch ( keyState )
-	{
-	case 0x00: // Released
-		dPrintStrs( tmpStr, "R  " ); // Debug
+		// Debug
+		for ( uint8_t c = 0; c <= 2; c++ )
+		{
+			// Debug
+			char tmpStr[6];
+			hexToStr( KeyBuffer[c], tmpStr );
+			dPrintStrs( tmpStr, " " ); // Debug
+		}
+		print("\n");
 
-		// Remove key from press buffer
-		removeKeyValue( keyValue & 0x7F );
-		break;
-
-	case 0x02: // Pressed
-		dPrintStrs( tmpStr, "P " ); // Debug
-
-		// New key to process
-		processKeyValue( keyValue & 0x7F );
-		break;
+		processKeyValue( KeyBuffer[1], KeyBuffer[2] );
+	}
+	else
+	{
+		KeyBufferCount++;
 	}
 
 	sei(); // Re-enable Interrupts
@@ -128,29 +112,18 @@
 	
 	// Setup baud rate
 	// 16 MHz / ( 16 * Baud ) = UBRR
-	// Baud <- 0.823284 ms per bit, thus 1000 / 0.823284 = 1214.65004 -> 823.2824
-	// Thus baud setting = 823
-	uint16_t baud = 823; // Max setting of 4095
+	// Baud: 4817 -> 16 MHz / ( 16 * 4817 ) = 207.5981
+	// Thus baud setting = 208
+	uint16_t baud = 208; // Max setting of 4095
 	UBRR1H = (uint8_t)(baud >> 8);
 	UBRR1L = (uint8_t)baud;
 
-	// Enable the receiver, and RX Complete Interrupt as well as 9 bit data
-	UCSR1B = 0x94;
-
-	// The transmitter is only to be enabled when needed
-	// Set the pin to be pull-up otherwise (use the lowered voltage inverter in order to sink)
-	HOLD_DDR  &= ~(1 << HOLD_PIN);
-	HOLD_PORT |=  (1 << HOLD_PIN);
+	// Enable the receiver, transmitter, and RX Complete Interrupt
+	UCSR1B = 0x98;
 
-	// Set frame format: 9 data, 1 stop bit, no parity
+	// Set frame format: 8 data, 1 stop bit, odd parity
 	// Asynchrounous USART mode
-	UCSR1C = 0x06;
-
-	// Initially buffer doesn't need to be cleared (it's empty...)
-	BufferReadyToClear = 0;
-
-	// InputSignal is off by default
-	KeyIndex_Add_InputSignal = 0x00;
+	UCSR1C = 0x36;
 
 	// Reset the keyboard before scanning, we might be in a wierd state
 	scan_resetKeyboard();
@@ -158,39 +131,40 @@
 
 
 // Main Detection Loop
-// Not needed for the BETKB, this is just a busy loop
 inline uint8_t scan_loop()
 {
 	return 0;
 }
 
-void processKeyValue( uint8_t keyValue )
+void processKeyValue( uint8_t valueType, uint8_t keyValue )
 {
-	// Interpret scan code
-	switch ( keyValue )
+	switch ( valueType )
 	{
-	case 0x00: // Break code from input?
+	// Single Key Press
+	case 0x00:
+		break;
+	// Repeated Key Press
+	case 0x01:
 		break;
-	default:
-		// Make sure the key isn't already in the buffer
-		for ( uint8_t c = 0; c < KeyIndex_BufferUsed + 1; c++ )
+	// Modifier Key Release
+	case 0x02:
+		removeKeyValue( keyValue );
+		return;
+	}
+
+	// Make sure the key isn't already in the buffer
+	for ( uint8_t c = 0; c < KeyIndex_BufferUsed + 1; c++ )
+	{
+		// Key isn't in the buffer yet
+		if ( c == KeyIndex_BufferUsed )
 		{
-			// Key isn't in the buffer yet
-			if ( c == KeyIndex_BufferUsed )
-			{
-				bufferAdd( keyValue );
+			bufferAdd( keyValue );
+			break;
+		}
 
-				// Only send data if enabled
-				if ( KeyIndex_Add_InputSignal )
-					scan_sendData( KeyIndex_Add_InputSignal );
-				break;
-			}
-
-			// Key already in the buffer
-			if ( KeyIndex_Buffer[c] == keyValue )
-				break;
-		}
-		break;
+		// Key already in the buffer
+		if ( KeyIndex_Buffer[c] == keyValue )
+			break;
 	}
 }
 
@@ -227,9 +201,6 @@
 // Send data 
 uint8_t scan_sendData( uint8_t dataPayload )
 {
-	// Enable the USART Transmitter
-	UCSR1B |=  (1 << 3);
-
 	// Debug
 	char tmpStr[6];
 	hexToStr( dataPayload, tmpStr );
@@ -237,12 +208,6 @@
 
 	UDR1 = dataPayload;
 
-	// Wait for the payload
-	_delay_us( 800 );
-
-	// Disable the USART Transmitter
-	UCSR1B &= ~(1 << 3);
-
 	return 0;
 }
 
@@ -254,15 +219,68 @@
 // Signal that the keys have been properly sent over USB
 void scan_finishedWithUSBBuffer( void )
 {
+	// 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;
+
+	// Clean out all keys except "special" keys (designated modifiers)
+	for ( uint8_t c = 0; c < KeyIndex_BufferUsed; c++ )
+	{
+		switch ( KeyIndex_Buffer[c] )
+		{
+		// 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];
+			break;
+		// Latched Keys, only released if a non-modifier is pressed along with it
+		// NOTE: This keys do not have a built in repeating
+		case 0x00:
+		case 0x01:
+		case 0x03:
+		case 0x0B:
+		case 0x22:
+		case 0x10:
+		case 0x11:
+		case 0x20:
+		case 0x21:
+		case 0x30:
+		case 0x31:
+		case 0x40:
+		case 0x41:
+			latchBuffer[latched++] = KeyIndex_Buffer[c];
+			break;
+		// Allow the scancode to be removed, normal keys
+		default:
+			normal++;
+			break;
+		}
+	}
+
+	// Reset the buffer counter
+	KeyIndex_BufferUsed = filled;
+
+	// Only "re-add" the latched keys if they weren't used
+	if ( latched > 0 && normal == 0 )
+	{
+		for ( uint8_t c = 0; c < latched; c++ )
+		{
+			bufferAdd( latchBuffer[c] );
+		}
+	}
 }
 
 // Reset/Hold keyboard
-// NOTE: Does nothing with the BETKB
+// NOTE: Does nothing with the FACOM6684
 void scan_lockKeyboard( void )
 {
 }
 
-// NOTE: Does nothing with the BETKB
+// NOTE: Does nothing with the FACOM6684
 void scan_unlockKeyboard( void )
 {
 }
@@ -272,5 +290,8 @@
 {
 	// Not a calculated valued...
 	_delay_ms( 50 );
+
+	KeyBufferCount = 0;
+	KeyIndex_BufferUsed = 0;
 }