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