瀏覽代碼

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)
simple
Jacob Alexander 11 年之前
父節點
當前提交
65b4489884
共有 5 個檔案被更改,包括 64 行新增37 行删除
  1. 16
    16
      Keymap/facom6684.h
  2. 3
    3
      Macro/buffer/macro.c
  3. 42
    15
      Scan/FACOM6684/scan_loop.c
  4. 2
    2
      Scan/FACOM6684/scan_loop.h
  5. 1
    1
      USB/pjrc/usb_com.c

+ 16
- 16
Keymap/facom6684.h 查看文件

KEYPAD_9, // 0x3E KEYPAD_9, // 0x3E
KEYPAD_TAB, // 0x3F KEYPAD_TAB, // 0x3F
0, // 0x40 0, // 0x40
0, // 0x41
KEY_TILDE, // 0x42
KEY_TILDE, // 0x41
KEY_ESC, // 0x42
KEY_1, // 0x43 KEY_1, // 0x43
KEY_2, // 0x44 KEY_2, // 0x44
KEY_3, // 0x45 KEY_3, // 0x45
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
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
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[] = {
KEYPAD_9, // 0x3E KEYPAD_9, // 0x3E
KEYPAD_TAB, // 0x3F KEYPAD_TAB, // 0x3F
0, // 0x40 0, // 0x40
0, // 0x41
KEY_TILDE, // 0x42
KEY_TILDE, // 0x41
KEY_ESC, // 0x42
KEY_1, // 0x43 KEY_1, // 0x43
KEY_2, // 0x44 KEY_2, // 0x44
KEY_3, // 0x45 KEY_3, // 0x45
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
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
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
}; };





+ 3
- 3
Macro/buffer/macro.c 查看文件



// ----- 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
} }


// 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)

+ 42
- 15
Scan/FACOM6684/scan_loop.c 查看文件

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;






{ {
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++ )
{ {
print("\n"); print("\n");


processKeyValue( KeyBuffer[1], KeyBuffer[2] ); processKeyValue( KeyBuffer[1], KeyBuffer[2] );

KeyBufferCount = 0;
} }
else else
{ {
// 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;
} }


break; break;
// Modifier Key Release // Modifier Key Release
case 0x02: case 0x02:
removeKeyValue( keyValue );
KeyBufferRemove[KeyBufferRemoveCount++] = keyValue;
return; return;
} }


} }


// 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
case 0x30: case 0x30:
case 0x31: case 0x31:
case 0x40: case 0x40:
case 0x41:
latchBuffer[latched++] = KeyIndex_Buffer[c];
//case 0x41: // XXX Being used as ESC
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:
// 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 )
{ {
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
_delay_ms( 50 ); _delay_ms( 50 );


KeyBufferCount = 0; KeyBufferCount = 0;
KeyBufferRemoveCount = 0;
KeyIndex_BufferUsed = 0; KeyIndex_BufferUsed = 0;
} }



+ 2
- 2
Scan/FACOM6684/scan_loop.h 查看文件

// 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_finishedWithUSBBuffer( void );
void scan_finishedWithBuffer( uint8_t sentKeys );
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 );

+ 1
- 1
USB/pjrc/usb_com.c 查看文件

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 );
} }