From 65b448988469c105ab4c1dec054cf60e0c36b6e0 Mon Sep 17 00:00:00 2001 From: Jacob Alexander Date: Sun, 20 Jan 2013 22:23:28 -0500 Subject: [PATCH] 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) --- Keymap/facom6684.h | 32 ++++++++++----------- Macro/buffer/macro.c | 6 ++-- Scan/FACOM6684/scan_loop.c | 57 ++++++++++++++++++++++++++++---------- Scan/FACOM6684/scan_loop.h | 4 +-- USB/pjrc/usb_com.c | 2 +- 5 files changed, 64 insertions(+), 37 deletions(-) diff --git a/Keymap/facom6684.h b/Keymap/facom6684.h index 07e40cd..a1b4d3c 100644 --- a/Keymap/facom6684.h +++ b/Keymap/facom6684.h @@ -94,8 +94,8 @@ static uint8_t facom6684_DefaultMap[] = { 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 @@ static uint8_t facom6684_DefaultMap[] = { 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 @@ static uint8_t facom6684_DefaultMap[] = { 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 @@ static uint8_t facom6684_DefaultMap[] = { 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 @@ static uint8_t facom6684_ColemakMap[] = { 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 @@ static uint8_t facom6684_ColemakMap[] = { 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 @@ static uint8_t facom6684_ColemakMap[] = { 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 @@ static uint8_t facom6684_ColemakMap[] = { 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 }; diff --git a/Macro/buffer/macro.c b/Macro/buffer/macro.c index 4fcf4b1..eab23f3 100644 --- a/Macro/buffer/macro.c +++ b/Macro/buffer/macro.c @@ -52,7 +52,7 @@ static uint8_t Bootloader_ConditionSequence[] = {1,16,6,11}; // ----- Functions ----- -inline void macro_finishedWithBuffer(void) +inline void macro_finishedWithBuffer( uint8_t sentKeys ) { /* BudKeypad // Boot loader sequence state handler @@ -371,10 +371,10 @@ void keyPressBufferRead( uint8_t *modifiers, uint8_t numberOfModifiers, uint8_t } // 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) diff --git a/Scan/FACOM6684/scan_loop.c b/Scan/FACOM6684/scan_loop.c index 6fb8f76..c6c7bb0 100644 --- a/Scan/FACOM6684/scan_loop.c +++ b/Scan/FACOM6684/scan_loop.c @@ -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 @@ ISR(USART1_RX_vect) { 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 @@ ISR(USART1_RX_vect) print("\n"); processKeyValue( KeyBuffer[1], KeyBuffer[2] ); + + KeyBufferCount = 0; } else { @@ -133,6 +135,14 @@ inline void scan_setup() // 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 @@ void processKeyValue( uint8_t valueType, uint8_t keyValue ) break; // Modifier Key Release case 0x02: - removeKeyValue( keyValue ); + KeyBufferRemove[KeyBufferRemoveCount++] = keyValue; return; } @@ -212,30 +222,32 @@ uint8_t scan_sendData( uint8_t dataPayload ) } // 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 ); + + cli(); // Disable Interrupts -// 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; + 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 @@ void scan_finishedWithUSBBuffer( void ) 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 @@ void scan_finishedWithUSBBuffer( void ) // 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 @@ void scan_finishedWithUSBBuffer( void ) 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 @@ void scan_resetKeyboard( void ) _delay_ms( 50 ); KeyBufferCount = 0; + KeyBufferRemoveCount = 0; KeyIndex_BufferUsed = 0; } diff --git a/Scan/FACOM6684/scan_loop.h b/Scan/FACOM6684/scan_loop.h index cc6af59..cec677c 100644 --- a/Scan/FACOM6684/scan_loop.h +++ b/Scan/FACOM6684/scan_loop.h @@ -56,8 +56,8 @@ uint8_t scan_loop( void ); // 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 ); diff --git a/USB/pjrc/usb_com.c b/USB/pjrc/usb_com.c index 730ba21..a0d5de2 100644 --- a/USB/pjrc/usb_com.c +++ b/USB/pjrc/usb_com.c @@ -85,6 +85,6 @@ inline void usb_send(void) USBKeys_Sent = 0; // Signal Scan Module we are finishedA - scan_finishedWithUSBBuffer(); + scan_finishedWithUSBBuffer( USBKeys_Sent <= USBKeys_MaxSize ? USBKeys_Sent : USBKeys_MaxSize ); }