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