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)
This commit is contained in:
parent
db01d733b7
commit
65b4489884
@ -94,8 +94,8 @@ static uint8_t facom6684_DefaultMap[] = {
|
|||||||
KEYPAD_9, // 0x3E
|
KEYPAD_9, // 0x3E
|
||||||
KEYPAD_TAB, // 0x3F
|
KEYPAD_TAB, // 0x3F
|
||||||
0, // 0x40
|
0, // 0x40
|
||||||
0, // 0x41
|
KEY_TILDE, // 0x41
|
||||||
KEY_TILDE, // 0x42
|
KEY_ESC, // 0x42
|
||||||
KEY_1, // 0x43
|
KEY_1, // 0x43
|
||||||
KEY_2, // 0x44
|
KEY_2, // 0x44
|
||||||
KEY_3, // 0x45
|
KEY_3, // 0x45
|
||||||
@ -121,10 +121,10 @@ static uint8_t facom6684_DefaultMap[] = {
|
|||||||
KEY_P, // 0x59
|
KEY_P, // 0x59
|
||||||
KEY_SEMICOLON, // 0x5A
|
KEY_SEMICOLON, // 0x5A
|
||||||
KEY_PERIOD, // 0x5B
|
KEY_PERIOD, // 0x5B
|
||||||
0, // 0x5C
|
KEY_INSERT, // 0x5C
|
||||||
KEY_LEFT, // 0x5D
|
KEY_LEFT, // 0x5D
|
||||||
0, // 0x5E
|
0, // 0x5E
|
||||||
0, // 0x5F
|
KEY_DELETE, // 0x5F
|
||||||
KEY_F13, // 0x60
|
KEY_F13, // 0x60
|
||||||
KEY_F14, // 0x61
|
KEY_F14, // 0x61
|
||||||
KEY_F15, // 0x62
|
KEY_F15, // 0x62
|
||||||
@ -137,10 +137,10 @@ static uint8_t facom6684_DefaultMap[] = {
|
|||||||
KEY_LEFT_BRACE, // 0x69
|
KEY_LEFT_BRACE, // 0x69
|
||||||
KEY_QUOTE, // 0x6A
|
KEY_QUOTE, // 0x6A
|
||||||
KEY_SLASH, // 0x6B
|
KEY_SLASH, // 0x6B
|
||||||
0, // 0x6C
|
KEY_HOME, // 0x6C
|
||||||
KEY_DOWN, // 0x6D
|
KEY_DOWN, // 0x6D
|
||||||
0, // 0x6E
|
0, // 0x6E
|
||||||
0, // 0x6F
|
KEY_END, // 0x6F
|
||||||
KEY_F19, // 0x70
|
KEY_F19, // 0x70
|
||||||
KEY_F20, // 0x71
|
KEY_F20, // 0x71
|
||||||
KEY_F21, // 0x72
|
KEY_F21, // 0x72
|
||||||
@ -153,10 +153,10 @@ static uint8_t facom6684_DefaultMap[] = {
|
|||||||
KEY_RIGHT_BRACE, // 0x79
|
KEY_RIGHT_BRACE, // 0x79
|
||||||
KEY_BACKSLASH, // 0x7A
|
KEY_BACKSLASH, // 0x7A
|
||||||
KEY_UP, // 0x7B
|
KEY_UP, // 0x7B
|
||||||
0, // 0x7C
|
KEY_PAGE_UP, // 0x7C
|
||||||
KEY_RIGHT, // 0x7D
|
KEY_RIGHT, // 0x7D
|
||||||
0, // 0x7E
|
0, // 0x7E
|
||||||
0, // 0x7F
|
KEY_PAGE_DOWN, // 0x7F
|
||||||
};
|
};
|
||||||
|
|
||||||
static uint8_t facom6684_ColemakMap[] = {
|
static uint8_t facom6684_ColemakMap[] = {
|
||||||
@ -225,8 +225,8 @@ static uint8_t facom6684_ColemakMap[] = {
|
|||||||
KEYPAD_9, // 0x3E
|
KEYPAD_9, // 0x3E
|
||||||
KEYPAD_TAB, // 0x3F
|
KEYPAD_TAB, // 0x3F
|
||||||
0, // 0x40
|
0, // 0x40
|
||||||
0, // 0x41
|
KEY_TILDE, // 0x41
|
||||||
KEY_TILDE, // 0x42
|
KEY_ESC, // 0x42
|
||||||
KEY_1, // 0x43
|
KEY_1, // 0x43
|
||||||
KEY_2, // 0x44
|
KEY_2, // 0x44
|
||||||
KEY_3, // 0x45
|
KEY_3, // 0x45
|
||||||
@ -252,10 +252,10 @@ static uint8_t facom6684_ColemakMap[] = {
|
|||||||
KEY_SEMICOLON, // 0x59
|
KEY_SEMICOLON, // 0x59
|
||||||
KEY_O, // 0x5A
|
KEY_O, // 0x5A
|
||||||
KEY_PERIOD, // 0x5B
|
KEY_PERIOD, // 0x5B
|
||||||
0, // 0x5C
|
KEY_INSERT, // 0x5C
|
||||||
KEY_LEFT, // 0x5D
|
KEY_LEFT, // 0x5D
|
||||||
0, // 0x5E
|
0, // 0x5E
|
||||||
0, // 0x5F
|
KEY_DELETE, // 0x5F
|
||||||
KEY_F13, // 0x60
|
KEY_F13, // 0x60
|
||||||
KEY_F14, // 0x61
|
KEY_F14, // 0x61
|
||||||
KEY_F15, // 0x62
|
KEY_F15, // 0x62
|
||||||
@ -268,10 +268,10 @@ static uint8_t facom6684_ColemakMap[] = {
|
|||||||
KEY_LEFT_BRACE, // 0x69
|
KEY_LEFT_BRACE, // 0x69
|
||||||
KEY_QUOTE, // 0x6A
|
KEY_QUOTE, // 0x6A
|
||||||
KEY_SLASH, // 0x6B
|
KEY_SLASH, // 0x6B
|
||||||
0, // 0x6C
|
KEY_HOME, // 0x6C
|
||||||
KEY_DOWN, // 0x6D
|
KEY_DOWN, // 0x6D
|
||||||
0, // 0x6E
|
0, // 0x6E
|
||||||
0, // 0x6F
|
KEY_END, // 0x6F
|
||||||
KEY_F19, // 0x70
|
KEY_F19, // 0x70
|
||||||
KEY_F20, // 0x71
|
KEY_F20, // 0x71
|
||||||
KEY_F21, // 0x72
|
KEY_F21, // 0x72
|
||||||
@ -284,10 +284,10 @@ static uint8_t facom6684_ColemakMap[] = {
|
|||||||
KEY_RIGHT_BRACE, // 0x79
|
KEY_RIGHT_BRACE, // 0x79
|
||||||
KEY_BACKSLASH, // 0x7A
|
KEY_BACKSLASH, // 0x7A
|
||||||
KEY_UP, // 0x7B
|
KEY_UP, // 0x7B
|
||||||
0, // 0x7C
|
KEY_PAGE_UP, // 0x7C
|
||||||
KEY_RIGHT, // 0x7D
|
KEY_RIGHT, // 0x7D
|
||||||
0, // 0x7E
|
0, // 0x7E
|
||||||
0, // 0x7F
|
KEY_PAGE_DOWN, // 0x7F
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ static uint8_t Bootloader_ConditionSequence[] = {1,16,6,11};
|
|||||||
|
|
||||||
// ----- Functions -----
|
// ----- Functions -----
|
||||||
|
|
||||||
inline void macro_finishedWithBuffer(void)
|
inline void macro_finishedWithBuffer( uint8_t sentKeys )
|
||||||
{
|
{
|
||||||
/* BudKeypad
|
/* BudKeypad
|
||||||
// Boot loader sequence state handler
|
// 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
|
// 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
|
// Signal buffer that we've used it
|
||||||
scan_finishedWithBuffer();
|
scan_finishedWithBuffer( KeyIndex_BufferUsed );
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void process_macros(void)
|
inline void process_macros(void)
|
||||||
|
@ -53,8 +53,11 @@
|
|||||||
volatile uint8_t KeyIndex_Buffer[KEYBOARD_BUFFER];
|
volatile uint8_t KeyIndex_Buffer[KEYBOARD_BUFFER];
|
||||||
volatile uint8_t KeyIndex_BufferUsed;
|
volatile uint8_t KeyIndex_BufferUsed;
|
||||||
|
|
||||||
|
volatile uint8_t KeyBufferRemove[6];
|
||||||
|
volatile uint8_t KeyBufferRemoveCount = 0;
|
||||||
|
|
||||||
static uint8_t KeyBuffer[3];
|
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
|
cli(); // Disable Interrupts
|
||||||
|
|
||||||
|
|
||||||
// Read part of the scan code (3 8bit chunks) from USART
|
// Read part of the scan code (3 8bit chunks) from USART
|
||||||
KeyBuffer[KeyBufferCount] = UDR1;
|
KeyBuffer[KeyBufferCount] = UDR1;
|
||||||
|
|
||||||
if ( KeyBufferCount >= 2 )
|
if ( KeyBufferCount >= 2 )
|
||||||
{
|
{
|
||||||
KeyBufferCount = 0;
|
|
||||||
|
|
||||||
// Debug
|
// Debug
|
||||||
for ( uint8_t c = 0; c <= 2; c++ )
|
for ( uint8_t c = 0; c <= 2; c++ )
|
||||||
{
|
{
|
||||||
@ -91,6 +91,8 @@ ISR(USART1_RX_vect)
|
|||||||
print("\n");
|
print("\n");
|
||||||
|
|
||||||
processKeyValue( KeyBuffer[1], KeyBuffer[2] );
|
processKeyValue( KeyBuffer[1], KeyBuffer[2] );
|
||||||
|
|
||||||
|
KeyBufferCount = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -133,6 +135,14 @@ inline void scan_setup()
|
|||||||
// Main Detection Loop
|
// Main Detection Loop
|
||||||
inline uint8_t scan_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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -148,7 +158,7 @@ void processKeyValue( uint8_t valueType, uint8_t keyValue )
|
|||||||
break;
|
break;
|
||||||
// Modifier Key Release
|
// Modifier Key Release
|
||||||
case 0x02:
|
case 0x02:
|
||||||
removeKeyValue( keyValue );
|
KeyBufferRemove[KeyBufferRemoveCount++] = keyValue;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -212,30 +222,32 @@ uint8_t scan_sendData( uint8_t dataPayload )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Signal KeyIndex_Buffer that it has been properly read
|
// 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
|
// Count for number of modifiers to maintain in the buffer
|
||||||
uint8_t filled = 0;
|
uint8_t filled = 0;
|
||||||
uint8_t latched = 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 latchBuffer[13]; // There are only 13 keys that can possibly be latched at the same time...
|
||||||
uint8_t normal = 0;
|
uint8_t normal = 0;
|
||||||
|
uint8_t prevBuffer = KeyIndex_BufferUsed;
|
||||||
|
|
||||||
// Clean out all keys except "special" keys (designated modifiers)
|
// 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
|
// Dedicated Modifier Keys
|
||||||
// NOTE: Both shifts are represented as the same scan code
|
// NOTE: Both shifts are represented as the same scan code
|
||||||
case 0x04:
|
case 0x04:
|
||||||
case 0x05:
|
case 0x05:
|
||||||
case 0x12:
|
case 0x12:
|
||||||
KeyIndex_Buffer[filled++] = KeyIndex_Buffer[c];
|
KeyIndex_Buffer[filled++] = KeyIndex_Buffer[key];
|
||||||
break;
|
break;
|
||||||
// Latched Keys, only released if a non-modifier is pressed along with it
|
// Latched Keys, only released if a non-modifier is pressed along with it
|
||||||
// NOTE: This keys do not have a built in repeating
|
// NOTE: This keys do not have a built in repeating
|
||||||
@ -251,8 +263,8 @@ void scan_finishedWithUSBBuffer( void )
|
|||||||
case 0x30:
|
case 0x30:
|
||||||
case 0x31:
|
case 0x31:
|
||||||
case 0x40:
|
case 0x40:
|
||||||
case 0x41:
|
//case 0x41: // XXX Being used as ESC
|
||||||
latchBuffer[latched++] = KeyIndex_Buffer[c];
|
latchBuffer[latched++] = KeyIndex_Buffer[key];
|
||||||
break;
|
break;
|
||||||
// Allow the scancode to be removed, normal keys
|
// Allow the scancode to be removed, normal keys
|
||||||
default:
|
default:
|
||||||
@ -264,6 +276,13 @@ void scan_finishedWithUSBBuffer( void )
|
|||||||
// Reset the buffer counter
|
// Reset the buffer counter
|
||||||
KeyIndex_BufferUsed = filled;
|
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
|
// Only "re-add" the latched keys if they weren't used
|
||||||
if ( latched > 0 && normal == 0 )
|
if ( latched > 0 && normal == 0 )
|
||||||
{
|
{
|
||||||
@ -272,6 +291,13 @@ void scan_finishedWithUSBBuffer( void )
|
|||||||
bufferAdd( latchBuffer[c] );
|
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
|
// Reset/Hold keyboard
|
||||||
@ -292,6 +318,7 @@ void scan_resetKeyboard( void )
|
|||||||
_delay_ms( 50 );
|
_delay_ms( 50 );
|
||||||
|
|
||||||
KeyBufferCount = 0;
|
KeyBufferCount = 0;
|
||||||
|
KeyBufferRemoveCount = 0;
|
||||||
KeyIndex_BufferUsed = 0;
|
KeyIndex_BufferUsed = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,8 +56,8 @@ uint8_t scan_loop( void );
|
|||||||
// Functions available to macro.c
|
// Functions available to macro.c
|
||||||
uint8_t scan_sendData( uint8_t dataPayload );
|
uint8_t scan_sendData( uint8_t dataPayload );
|
||||||
|
|
||||||
void scan_finishedWithBuffer( void );
|
void scan_finishedWithBuffer( uint8_t sentKeys );
|
||||||
void scan_finishedWithUSBBuffer( void );
|
void scan_finishedWithUSBBuffer( uint8_t sentKeys );
|
||||||
void scan_lockKeyboard( void );
|
void scan_lockKeyboard( void );
|
||||||
void scan_unlockKeyboard( void );
|
void scan_unlockKeyboard( void );
|
||||||
void scan_resetKeyboard( void );
|
void scan_resetKeyboard( void );
|
||||||
|
@ -85,6 +85,6 @@ inline void usb_send(void)
|
|||||||
USBKeys_Sent = 0;
|
USBKeys_Sent = 0;
|
||||||
|
|
||||||
// Signal Scan Module we are finishedA
|
// Signal Scan Module we are finishedA
|
||||||
scan_finishedWithUSBBuffer();
|
scan_finishedWithUSBBuffer( USBKeys_Sent <= USBKeys_MaxSize ? USBKeys_Sent : USBKeys_MaxSize );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user