diff --git a/Keymap/facom6684.h b/Keymap/facom6684.h index 5812dc8..07e40cd 100644 --- a/Keymap/facom6684.h +++ b/Keymap/facom6684.h @@ -26,135 +26,135 @@ // ----- Variables ----- -static uint8_t facom6684_ModifierMask[] = { 0x20, 0x2D, 0x2E, 0x30, 0x3E, 0x60 }; +static uint8_t facom6684_ModifierMask[] = { 0x22, 0x12, 0x05, 0x04, 0x03 }; static uint8_t facom6684_DefaultMap[] = { 0, // 0x00 0, // 0x01 - 0, // 0x02 - 0, // 0x03 - 0, // 0x04 - 0, // 0x05 + KEY_SPACE, // 0x02 + KEY_LEFT_ALT, // 0x03 + KEY_RIGHT_ALT, // 0x04 + KEY_LEFT_GUI, // 0x05 0, // 0x06 0, // 0x07 - 0, // 0x08 - 0, // 0x09 + KEY_BACKSPACE, // 0x08 + KEY_ENTER, // 0x09 0, // 0x0A 0, // 0x0B - 0, // 0x0C - 0, // 0x0D - 0, // 0x0E - 0, // 0x0F + KEYPAD_0, // 0x0C + KEYPAD_00, // 0x0D + KEYPAD_000, // 0x0E + KEYPAD_DECIMAL, // 0x0F 0, // 0x10 0, // 0x11 - 0, // 0x12 + KEY_LEFT_SHIFT, // 0x12 0, // 0x13 - 0, // 0x14 - 0, // 0x15 - 0, // 0x16 - 0, // 0x17 - 0, // 0x18 - 0, // 0x19 - 0, // 0x1A - 0, // 0x1B - 0, // 0x1C - 0, // 0x1D - 0, // 0x1E - 0, // 0x1F - KEY_LEFT_SHIFT, // 0x20 + KEY_Z, // 0x14 + KEY_X, // 0x15 + KEY_C, // 0x16 + KEY_V, // 0x17 + KEY_B, // 0x18 + KEY_N, // 0x19 + KEY_M, // 0x1A + KEY_COMMA, // 0x1B + KEYPAD_1, // 0x1C + KEYPAD_2, // 0x1D + KEYPAD_3, // 0x1E + KEYPAD_ENTER, // 0x1F + 0, // 0x20 0, // 0x21 - KEY_Z, // 0x22 - KEY_X, // 0x23 - KEY_C, // 0x24 - KEY_V, // 0x25 - KEY_B, // 0x26 - KEY_N, // 0x27 - KEY_M, // 0x28 - KEY_COMMA, // 0x29 - KEY_PERIOD, // 0x2A - KEY_SLASH, // 0x2B - 0, // 0x2C - KEY_RIGHT_SHIFT, // 0x2D - KEY_LEFT_ALT, // 0x2E - KEY_SPACE, // 0x2F - KEY_LEFT_CTRL, // 0x30 - KEY_A, // 0x31 - KEY_S, // 0x32 - KEY_D, // 0x33 - KEY_F, // 0x34 - KEY_G, // 0x35 - KEY_H, // 0x36 - KEY_J, // 0x37 - KEY_K, // 0x38 - KEY_L, // 0x39 - KEY_SEMICOLON, // 0x3A - KEY_QUOTE, // 0x3B - 0, // 0x3C - KEY_ENTER, // 0x3D - KEY_RIGHT_GUI, // 0x3E - KEY_LEFT, // 0x3F (KEYPAD_1) - KEY_TAB, // 0x40 - KEY_Q, // 0x41 - KEY_W, // 0x42 - KEY_E, // 0x43 - KEY_R, // 0x44 - KEY_T, // 0x45 - KEY_Y, // 0x46 - KEY_U, // 0x47 - KEY_I, // 0x48 - KEY_O, // 0x49 - KEY_P, // 0x4A - KEY_LEFT_BRACE, // 0x4B - KEY_RIGHT_BRACE, // 0x4C - KEY_BACKSLASH, // 0x4D - KEY_DELETE, // 0x4E - KEYPAD_4, // 0x4F - KEY_ESC, // 0x50 - KEY_1, // 0x51 - KEY_2, // 0x52 - KEY_3, // 0x53 - KEY_4, // 0x54 - KEY_5, // 0x55 - KEY_6, // 0x56 - KEY_7, // 0x57 - KEY_8, // 0x58 - KEY_9, // 0x59 - KEY_0, // 0x5A - KEY_MINUS, // 0x5B - KEY_EQUAL, // 0x5C - KEY_TILDE, // 0x5D - KEY_BACKSPACE, // 0x5E - KEY_NUM_LOCK, // 0x5F - KEY_LEFT_GUI, // 0x60 - KEY_HOME, // 0x61 - KEY_END, // 0x62 - KEY_INSERT, // 0x63 - KEY_DELETE, // 0x64 - KEY_F1, // 0x65 - KEY_F2, // 0x66 - KEY_F3, // 0x67 - KEY_F4, // 0x68 - KEY_F5, // 0x69 - KEY_F6, // 0x6A - KEY_F7, // 0x6B - KEY_F8, // 0x6C - KEY_F9, // 0x6D - KEY_F10, // 0x6E - KEY_PRINTSCREEN, // 0x6F - KEY_PAGE_UP, // 0x70 - KEY_PAGE_DOWN, // 0x71 - KEY_F11, // 0x72 - KEYPAD_7, // 0x73 - KEYPAD_8, // 0x74 - KEYPAD_9, // 0x75 - KEY_UP, // 0x76 (KEYPAD_5) - KEYPAD_6, // 0x77 - KEY_DOWN, // 0x78 (KEYPAD_2) - KEY_RIGHT, // 0x79 (KEYPAD_3) - KEYPAD_0, // 0x7A - KEYPAD_00, // 0x7B - KEYPAD_ENTER, // 0x7C - 0, // 0x7D + KEY_LEFT_CTRL, // 0x22 + KEY_A, // 0x23 + KEY_S, // 0x24 + KEY_D, // 0x25 + KEY_F, // 0x26 + KEY_G, // 0x27 + KEY_H, // 0x28 + KEY_J, // 0x29 + KEY_K, // 0x2A + KEY_L, // 0x2B + KEYPAD_4, // 0x2C + KEYPAD_5, // 0x2D + KEYPAD_6, // 0x2E + KEYPAD_MINUS, // 0x2F + 0, // 0x30 + 0, // 0x31 + KEY_TAB, // 0x32 + KEY_Q, // 0x33 + KEY_W, // 0x34 + KEY_E, // 0x35 + KEY_R, // 0x36 + KEY_T, // 0x37 + KEY_Y, // 0x38 + KEY_U, // 0x39 + KEY_I, // 0x3A + KEY_O, // 0x3B + KEYPAD_7, // 0x3C + KEYPAD_8, // 0x3D + KEYPAD_9, // 0x3E + KEYPAD_TAB, // 0x3F + 0, // 0x40 + 0, // 0x41 + KEY_TILDE, // 0x42 + KEY_1, // 0x43 + KEY_2, // 0x44 + KEY_3, // 0x45 + KEY_4, // 0x46 + KEY_5, // 0x47 + KEY_6, // 0x48 + KEY_7, // 0x49 + KEY_8, // 0x4A + KEY_9, // 0x4B + 0, // 0x4C + 0, // 0x4D + KEYPAD_COMMA, // 0x4E + KEYPAD_SPACE, // 0x4F + KEY_F1, // 0x50 + KEY_F2, // 0x51 + KEY_F3, // 0x52 + KEY_F4, // 0x53 + KEY_F5, // 0x54 + KEY_F6, // 0x55 + KEY_F7, // 0x56 + KEY_F8, // 0x57 + KEY_0, // 0x58 + KEY_P, // 0x59 + KEY_SEMICOLON, // 0x5A + KEY_PERIOD, // 0x5B + 0, // 0x5C + KEY_LEFT, // 0x5D + 0, // 0x5E + 0, // 0x5F + KEY_F13, // 0x60 + KEY_F14, // 0x61 + KEY_F15, // 0x62 + KEY_F16, // 0x63 + KEY_F17, // 0x64 + KEY_F18, // 0x65 + KEY_F9, // 0x66 + KEY_F10, // 0x67 + KEY_MINUS, // 0x68 + KEY_LEFT_BRACE, // 0x69 + KEY_QUOTE, // 0x6A + KEY_SLASH, // 0x6B + 0, // 0x6C + KEY_DOWN, // 0x6D + 0, // 0x6E + 0, // 0x6F + KEY_F19, // 0x70 + KEY_F20, // 0x71 + KEY_F21, // 0x72 + KEY_F22, // 0x73 + KEY_F23, // 0x74 + KEY_F24, // 0x75 + KEY_F11, // 0x76 + KEY_F12, // 0x77 + KEY_EQUAL, // 0x78 + KEY_RIGHT_BRACE, // 0x79 + KEY_BACKSLASH, // 0x7A + KEY_UP, // 0x7B + 0, // 0x7C + KEY_RIGHT, // 0x7D 0, // 0x7E 0, // 0x7F }; @@ -162,130 +162,130 @@ static uint8_t facom6684_DefaultMap[] = { static uint8_t facom6684_ColemakMap[] = { 0, // 0x00 0, // 0x01 - 0, // 0x02 - 0, // 0x03 - 0, // 0x04 - 0, // 0x05 + KEY_SPACE, // 0x02 + KEY_LEFT_ALT, // 0x03 + KEY_RIGHT_ALT, // 0x04 + KEY_LEFT_GUI, // 0x05 0, // 0x06 0, // 0x07 - 0, // 0x08 - 0, // 0x09 + KEY_BACKSPACE, // 0x08 + KEY_ENTER, // 0x09 0, // 0x0A 0, // 0x0B - 0, // 0x0C - 0, // 0x0D - 0, // 0x0E - 0, // 0x0F + KEYPAD_0, // 0x0C + KEYPAD_00, // 0x0D + KEYPAD_000, // 0x0E + KEYPAD_DECIMAL, // 0x0F 0, // 0x10 0, // 0x11 - 0, // 0x12 + KEY_LEFT_SHIFT, // 0x12 0, // 0x13 - 0, // 0x14 - 0, // 0x15 - 0, // 0x16 - 0, // 0x17 - 0, // 0x18 - 0, // 0x19 - 0, // 0x1A - 0, // 0x1B - 0, // 0x1C - 0, // 0x1D - 0, // 0x1E - 0, // 0x1F - KEY_LEFT_SHIFT, // 0x20 + KEY_Z, // 0x14 + KEY_X, // 0x15 + KEY_C, // 0x16 + KEY_V, // 0x17 + KEY_B, // 0x18 + KEY_K, // 0x19 + KEY_M, // 0x1A + KEY_COMMA, // 0x1B + KEYPAD_1, // 0x1C + KEYPAD_2, // 0x1D + KEYPAD_3, // 0x1E + KEYPAD_ENTER, // 0x1F + 0, // 0x20 0, // 0x21 - KEY_Z, // 0x22 - KEY_X, // 0x23 - KEY_C, // 0x24 - KEY_V, // 0x25 - KEY_B, // 0x26 - KEY_K, // 0x27 - KEY_M, // 0x28 - KEY_COMMA, // 0x29 - KEY_PERIOD, // 0x2A - KEY_SLASH, // 0x2B - 0, // 0x2C - KEY_RIGHT_SHIFT, // 0x2D - KEY_LEFT_ALT, // 0x2E - KEY_SPACE, // 0x2F - KEY_LEFT_CTRL, // 0x30 - KEY_A, // 0x31 - KEY_R, // 0x32 - KEY_S, // 0x33 - KEY_T, // 0x34 - KEY_D, // 0x35 - KEY_H, // 0x36 - KEY_N, // 0x37 - KEY_E, // 0x38 - KEY_I, // 0x39 - KEY_O, // 0x3A - KEY_QUOTE, // 0x3B - 0, // 0x3C - KEY_ENTER, // 0x3D - KEY_RIGHT_GUI, // 0x3E - KEY_LEFT, // 0x3F (KEYPAD_1) - KEY_TAB, // 0x40 - KEY_Q, // 0x41 - KEY_W, // 0x42 - KEY_F, // 0x43 - KEY_P, // 0x44 - KEY_G, // 0x45 - KEY_J, // 0x46 - KEY_L, // 0x47 - KEY_U, // 0x48 - KEY_Y, // 0x49 - KEY_SEMICOLON, // 0x4A - KEY_LEFT_BRACE, // 0x4B - KEY_RIGHT_BRACE, // 0x4C - KEY_BACKSLASH, // 0x4D - KEY_DELETE, // 0x4E - KEYPAD_4, // 0x4F - KEY_ESC, // 0x50 - KEY_1, // 0x51 - KEY_2, // 0x52 - KEY_3, // 0x53 - KEY_4, // 0x54 - KEY_5, // 0x55 - KEY_6, // 0x56 - KEY_7, // 0x57 - KEY_8, // 0x58 - KEY_9, // 0x59 - KEY_0, // 0x5A - KEY_MINUS, // 0x5B - KEY_EQUAL, // 0x5C - KEY_TILDE, // 0x5D - KEY_BACKSPACE, // 0x5E - KEY_NUM_LOCK, // 0x5F - KEY_LEFT_GUI, // 0x60 - KEY_HOME, // 0x61 - KEY_END, // 0x62 - KEY_INSERT, // 0x63 - KEY_DELETE, // 0x64 - KEY_F1, // 0x65 - KEY_F2, // 0x66 - KEY_F3, // 0x67 - KEY_F4, // 0x68 - KEY_F5, // 0x69 - KEY_F6, // 0x6A - KEY_F7, // 0x6B - KEY_F8, // 0x6C - KEY_F9, // 0x6D - KEY_F10, // 0x6E - KEY_PRINTSCREEN, // 0x6F - KEY_PAGE_UP, // 0x70 - KEY_PAGE_DOWN, // 0x71 - KEY_F11, // 0x72 - KEYPAD_7, // 0x73 - KEYPAD_8, // 0x74 - KEYPAD_9, // 0x75 - KEY_UP, // 0x76 (KEYPAD_5) - KEYPAD_6, // 0x77 - KEY_DOWN, // 0x78 (KEYPAD_2) - KEY_RIGHT, // 0x79 (KEYPAD_3) - KEYPAD_0, // 0x7A - KEYPAD_00, // 0x7B - KEYPAD_ENTER, // 0x7C - 0, // 0x7D + KEY_LEFT_CTRL, // 0x22 + KEY_A, // 0x23 + KEY_R, // 0x24 + KEY_S, // 0x25 + KEY_T, // 0x26 + KEY_D, // 0x27 + KEY_H, // 0x28 + KEY_N, // 0x29 + KEY_E, // 0x2A + KEY_I, // 0x2B + KEYPAD_4, // 0x2C + KEYPAD_5, // 0x2D + KEYPAD_6, // 0x2E + KEYPAD_MINUS, // 0x2F + 0, // 0x30 + 0, // 0x31 + KEY_TAB, // 0x32 + KEY_Q, // 0x33 + KEY_W, // 0x34 + KEY_F, // 0x35 + KEY_P, // 0x36 + KEY_G, // 0x37 + KEY_J, // 0x38 + KEY_L, // 0x39 + KEY_U, // 0x3A + KEY_Y, // 0x3B + KEYPAD_7, // 0x3C + KEYPAD_8, // 0x3D + KEYPAD_9, // 0x3E + KEYPAD_TAB, // 0x3F + 0, // 0x40 + 0, // 0x41 + KEY_TILDE, // 0x42 + KEY_1, // 0x43 + KEY_2, // 0x44 + KEY_3, // 0x45 + KEY_4, // 0x46 + KEY_5, // 0x47 + KEY_6, // 0x48 + KEY_7, // 0x49 + KEY_8, // 0x4A + KEY_9, // 0x4B + 0, // 0x4C + 0, // 0x4D + KEYPAD_COMMA, // 0x4E + KEYPAD_SPACE, // 0x4F + KEY_F1, // 0x50 + KEY_F2, // 0x51 + KEY_F3, // 0x52 + KEY_F4, // 0x53 + KEY_F5, // 0x54 + KEY_F6, // 0x55 + KEY_F7, // 0x56 + KEY_F8, // 0x57 + KEY_0, // 0x58 + KEY_SEMICOLON, // 0x59 + KEY_O, // 0x5A + KEY_PERIOD, // 0x5B + 0, // 0x5C + KEY_LEFT, // 0x5D + 0, // 0x5E + 0, // 0x5F + KEY_F13, // 0x60 + KEY_F14, // 0x61 + KEY_F15, // 0x62 + KEY_F16, // 0x63 + KEY_F17, // 0x64 + KEY_F18, // 0x65 + KEY_F9, // 0x66 + KEY_F10, // 0x67 + KEY_MINUS, // 0x68 + KEY_LEFT_BRACE, // 0x69 + KEY_QUOTE, // 0x6A + KEY_SLASH, // 0x6B + 0, // 0x6C + KEY_DOWN, // 0x6D + 0, // 0x6E + 0, // 0x6F + KEY_F19, // 0x70 + KEY_F20, // 0x71 + KEY_F21, // 0x72 + KEY_F22, // 0x73 + KEY_F23, // 0x74 + KEY_F24, // 0x75 + KEY_F11, // 0x76 + KEY_F12, // 0x77 + KEY_EQUAL, // 0x78 + KEY_RIGHT_BRACE, // 0x79 + KEY_BACKSLASH, // 0x7A + KEY_UP, // 0x7B + 0, // 0x7C + KEY_RIGHT, // 0x7D 0, // 0x7E 0, // 0x7F }; diff --git a/Scan/FACOM6684/scan_loop.c b/Scan/FACOM6684/scan_loop.c index 9d48d4d..6fb8f76 100644 --- a/Scan/FACOM6684/scan_loop.c +++ b/Scan/FACOM6684/scan_loop.c @@ -37,11 +37,6 @@ // ----- Defines ----- -// Pinout Defines -#define HOLD_PORT PORTD -#define HOLD_DDR DDRD -#define HOLD_PIN 3 - // ----- Macros ----- @@ -57,17 +52,15 @@ // Buffer used to inform the macro processing module which keys have been detected as pressed volatile uint8_t KeyIndex_Buffer[KEYBOARD_BUFFER]; volatile uint8_t KeyIndex_BufferUsed; -volatile uint8_t KeyIndex_Add_InputSignal; // Used to pass the (click/input value) to the keyboard for the clicker - -// Buffer Signals -volatile uint8_t BufferReadyToClear; +static uint8_t KeyBuffer[3]; +static uint8_t KeyBufferCount = 0; // ----- Function Declarations ----- -void processKeyValue( uint8_t keyValue ); +void processKeyValue( uint8_t valueType, uint8_t keyValue ); void removeKeyValue( uint8_t keyValue ); @@ -79,38 +72,29 @@ ISR(USART1_RX_vect) { cli(); // Disable Interrupts - uint8_t keyValue = 0x00; - uint8_t keyState = 0x00; - // Read the scancode packet from the USART (1st to 8th bits) - keyValue = UDR1; + // Read part of the scan code (3 8bit chunks) from USART + KeyBuffer[KeyBufferCount] = UDR1; - // Read the release/press bit (9th bit) XXX Unnecessary, and wrong it seems, parity bit? or something else? - keyState = UCSR1B & 0x02; - - // High bit of keyValue, also represents press/release - keyState = keyValue & 0x80 ? 0x00 : 0x02; - - // Debug - char tmpStr[6]; - hexToStr( keyValue & 0x7F, tmpStr ); - - // Process the scancode - switch ( keyState ) + if ( KeyBufferCount >= 2 ) { - case 0x00: // Released - dPrintStrs( tmpStr, "R " ); // Debug + KeyBufferCount = 0; - // Remove key from press buffer - removeKeyValue( keyValue & 0x7F ); - break; + // Debug + for ( uint8_t c = 0; c <= 2; c++ ) + { + // Debug + char tmpStr[6]; + hexToStr( KeyBuffer[c], tmpStr ); + dPrintStrs( tmpStr, " " ); // Debug + } + print("\n"); - case 0x02: // Pressed - dPrintStrs( tmpStr, "P " ); // Debug - - // New key to process - processKeyValue( keyValue & 0x7F ); - break; + processKeyValue( KeyBuffer[1], KeyBuffer[2] ); + } + else + { + KeyBufferCount++; } sei(); // Re-enable Interrupts @@ -128,29 +112,18 @@ inline void scan_setup() // Setup baud rate // 16 MHz / ( 16 * Baud ) = UBRR - // Baud <- 0.823284 ms per bit, thus 1000 / 0.823284 = 1214.65004 -> 823.2824 - // Thus baud setting = 823 - uint16_t baud = 823; // Max setting of 4095 + // Baud: 4817 -> 16 MHz / ( 16 * 4817 ) = 207.5981 + // Thus baud setting = 208 + uint16_t baud = 208; // Max setting of 4095 UBRR1H = (uint8_t)(baud >> 8); UBRR1L = (uint8_t)baud; - // Enable the receiver, and RX Complete Interrupt as well as 9 bit data - UCSR1B = 0x94; + // Enable the receiver, transmitter, and RX Complete Interrupt + UCSR1B = 0x98; - // The transmitter is only to be enabled when needed - // Set the pin to be pull-up otherwise (use the lowered voltage inverter in order to sink) - HOLD_DDR &= ~(1 << HOLD_PIN); - HOLD_PORT |= (1 << HOLD_PIN); - - // Set frame format: 9 data, 1 stop bit, no parity + // Set frame format: 8 data, 1 stop bit, odd parity // Asynchrounous USART mode - UCSR1C = 0x06; - - // Initially buffer doesn't need to be cleared (it's empty...) - BufferReadyToClear = 0; - - // InputSignal is off by default - KeyIndex_Add_InputSignal = 0x00; + UCSR1C = 0x36; // Reset the keyboard before scanning, we might be in a wierd state scan_resetKeyboard(); @@ -158,39 +131,40 @@ inline void scan_setup() // Main Detection Loop -// Not needed for the BETKB, this is just a busy loop inline uint8_t scan_loop() { return 0; } -void processKeyValue( uint8_t keyValue ) +void processKeyValue( uint8_t valueType, uint8_t keyValue ) { - // Interpret scan code - switch ( keyValue ) + switch ( valueType ) { - case 0x00: // Break code from input? + // Single Key Press + case 0x00: break; - default: - // Make sure the key isn't already in the buffer - for ( uint8_t c = 0; c < KeyIndex_BufferUsed + 1; c++ ) + // Repeated Key Press + case 0x01: + break; + // Modifier Key Release + case 0x02: + removeKeyValue( keyValue ); + return; + } + + // Make sure the key isn't already in the buffer + for ( uint8_t c = 0; c < KeyIndex_BufferUsed + 1; c++ ) + { + // Key isn't in the buffer yet + if ( c == KeyIndex_BufferUsed ) { - // Key isn't in the buffer yet - if ( c == KeyIndex_BufferUsed ) - { - bufferAdd( keyValue ); - - // Only send data if enabled - if ( KeyIndex_Add_InputSignal ) - scan_sendData( KeyIndex_Add_InputSignal ); - break; - } - - // Key already in the buffer - if ( KeyIndex_Buffer[c] == keyValue ) - break; + bufferAdd( keyValue ); + break; } - break; + + // Key already in the buffer + if ( KeyIndex_Buffer[c] == keyValue ) + break; } } @@ -227,9 +201,6 @@ void removeKeyValue( uint8_t keyValue ) // Send data uint8_t scan_sendData( uint8_t dataPayload ) { - // Enable the USART Transmitter - UCSR1B |= (1 << 3); - // Debug char tmpStr[6]; hexToStr( dataPayload, tmpStr ); @@ -237,12 +208,6 @@ uint8_t scan_sendData( uint8_t dataPayload ) UDR1 = dataPayload; - // Wait for the payload - _delay_us( 800 ); - - // Disable the USART Transmitter - UCSR1B &= ~(1 << 3); - return 0; } @@ -254,15 +219,68 @@ void scan_finishedWithBuffer( void ) // 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; + + // Clean out all keys except "special" keys (designated modifiers) + for ( uint8_t c = 0; c < KeyIndex_BufferUsed; c++ ) + { + switch ( KeyIndex_Buffer[c] ) + { + // 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]; + break; + // Latched Keys, only released if a non-modifier is pressed along with it + // NOTE: This keys do not have a built in repeating + case 0x00: + case 0x01: + case 0x03: + case 0x0B: + case 0x22: + case 0x10: + case 0x11: + case 0x20: + case 0x21: + case 0x30: + case 0x31: + case 0x40: + case 0x41: + latchBuffer[latched++] = KeyIndex_Buffer[c]; + break; + // Allow the scancode to be removed, normal keys + default: + normal++; + break; + } + } + + // Reset the buffer counter + KeyIndex_BufferUsed = filled; + + // Only "re-add" the latched keys if they weren't used + if ( latched > 0 && normal == 0 ) + { + for ( uint8_t c = 0; c < latched; c++ ) + { + bufferAdd( latchBuffer[c] ); + } + } } // Reset/Hold keyboard -// NOTE: Does nothing with the BETKB +// NOTE: Does nothing with the FACOM6684 void scan_lockKeyboard( void ) { } -// NOTE: Does nothing with the BETKB +// NOTE: Does nothing with the FACOM6684 void scan_unlockKeyboard( void ) { } @@ -272,5 +290,8 @@ void scan_resetKeyboard( void ) { // Not a calculated valued... _delay_ms( 50 ); + + KeyBufferCount = 0; + KeyIndex_BufferUsed = 0; }