]> git.donarmstrong.com Git - kiibohd-controller.git/commitdiff
Fixing slow key issues with the FACOM converter
authorJacob Alexander <triplehaata@gmail.com>
Mon, 21 Jan 2013 03:23:28 +0000 (22:23 -0500)
committerJacob Alexander <triplehaata@gmail.com>
Mon, 21 Jan 2013 03:23:28 +0000 (22:23 -0500)
- 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
Macro/buffer/macro.c
Scan/FACOM6684/scan_loop.c
Scan/FACOM6684/scan_loop.h
USB/pjrc/usb_com.c

index 07e40cd54451bbbe65a7cd032d172ff16456ac97..a1b4d3cffdacb60dbd13ef61cdd5326cbcb9e268 100644 (file)
@@ -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
 };
 
 
index 4fcf4b1f39804f8147bfcb65beb8fbd2a9143d32..eab23f33ee60e26985ff3379bd1d1e77fdd85577 100644 (file)
@@ -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)
index 6fb8f7658e3aadef1ebee31ac8d0fa70830e5774..c6c7bb0a20dc824a1f108f77fdc0b385fca0378b 100644 (file)
 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;
 }
 
index cc6af5941ae04778c4e54032e268292e8b977e73..cec677cc261e585cde22cbac40c5015f0dbaaf79 100644 (file)
@@ -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 );
index 730ba2107553e7af35c43426dab75975bd68dd3d..a0d5de2d357c72e431417572931b2ad030c4b50d 100644 (file)
@@ -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 );
 }