From 108b0d3e8e2d3f5f0f705f7e266e395d6876f264 Mon Sep 17 00:00:00 2001 From: Jacob Alexander Date: Sun, 18 Dec 2011 19:02:56 -0800 Subject: [PATCH] Cleaning up the BudKeypad module for the Buffered Macro Module - Fixed key repeat rate issues - Added the recent function additions to the scan module API --- CMakeLists.txt | 4 +-- Scan/matrix/matrix_scan.c | 2 -- Scan/matrix/scan_loop.c | 56 ++++++++++++++++++++++++++++++++++- Scan/matrix/scan_loop.h | 11 +++++++ USB/pjrc/usb_keyboard_debug.c | 4 +-- setup.cmake | 2 +- 6 files changed, 71 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 44b9141..9b4e935 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -64,8 +64,8 @@ set( SRCS #| "atmega32u4" # Teensy 2.0 #| "at90usb646" # Teensy++ 1.0 #| "at90usb1286" # Teensy++ 2.0 -#set( MCU "atmega32u4" ) -set( MCU "at90usb1286" ) +set( MCU "atmega32u4" ) +#set( MCU "at90usb1286" ) #| Compiler flag to set the C Standard level. diff --git a/Scan/matrix/matrix_scan.c b/Scan/matrix/matrix_scan.c index 5071cce..605d9e9 100644 --- a/Scan/matrix/matrix_scan.c +++ b/Scan/matrix/matrix_scan.c @@ -76,7 +76,6 @@ scanCode = matrix[row*(MAX_ROW_SIZE+1)+col]; \ if ( scanCode && !( pin & ( 1 << ( matrix[0*(MAX_ROW_SIZE+1)+col] % 10 ) ) ) ) \ { \ - warn_print("YAY!"); \ detectArray[scanCode]++; \ } \ break @@ -243,7 +242,6 @@ inline void matrix_scan( uint8_t *matrix, uint8_t *detectArray ) // Scan over the pins for each of the columns, and using the pin alias to determine which pin to set // (e.g. / 10 is for the pin name (A,B,C,etc.) and % 10 is for the position of the pin (A1,A2,etc.)) switch ( matrix[0*(MAX_ROW_SIZE+1)+col] / 10 ) - REG_SET(port##pin); break; \ { #if defined(__AVR_AT90USB1286__) case 0: // PINA diff --git a/Scan/matrix/scan_loop.c b/Scan/matrix/scan_loop.c index a7389a6..ead1375 100644 --- a/Scan/matrix/scan_loop.c +++ b/Scan/matrix/scan_loop.c @@ -103,11 +103,51 @@ inline uint8_t scan_loop() // This should be resetting VERY quickly, cutting off a potentially valid keypress is not an issue for ( uint8_t key = 1; key < KeyIndex_Size + 1; key++ ) if ( ( KeyIndex_Array[key] & ~(1 << 7) ) > SAMPLE_THRESHOLD ) { - bufferAdd( key ); + // Debug output (keypress detected) + char tmpStr[6]; + hexToStr( key, tmpStr ); + dPrintStrs( tmpStr, " " ); + + // Add the key to the buffer, if it isn't already in the current Key Buffer + for ( uint8_t c = 0; c < KeyIndex_BufferUsed + 1; c++ ) + { + // Key isn't in the buffer yet + if ( c == KeyIndex_BufferUsed ) + { + bufferAdd( key ); + break; + } + + // Key already in the buffer + if ( KeyIndex_Buffer[c] == key ) + break; + } + KeyIndex_Array[key] = (1 << 7); } else { + // Remove the key from the buffer only if it was previously known to be pressed + if ( KeyIndex_Array[key] & (1 << 7 ) ) + { + // Check for the released key, and shift the other keys lower on the buffer + for ( uint8_t c = 0; c < KeyIndex_BufferUsed; c++ ) + { + // Key to release found + if ( KeyIndex_Buffer[c] == key ) + { + // Shift keys from c position + for ( uint8_t k = c; k < KeyIndex_BufferUsed - 1; k++ ) + KeyIndex_Buffer[k] = KeyIndex_Buffer[k + 1]; + + // Decrement Buffer + KeyIndex_BufferUsed--; + + break; + } + } + } + KeyIndex_Array[key] = 0x00; } @@ -115,3 +155,17 @@ inline uint8_t scan_loop() return 1; } + +// Signal that the keys have been properly sent over USB +inline void scan_finishedWithUSBBuffer( void ) +{ + return; +} + + +// Signal KeyIndex_Buffer that it has been fully scanned using the macro module +inline void scan_finishedWithBuffer( void ) +{ + return; +} + diff --git a/Scan/matrix/scan_loop.h b/Scan/matrix/scan_loop.h index 3897c9c..f78e71c 100644 --- a/Scan/matrix/scan_loop.h +++ b/Scan/matrix/scan_loop.h @@ -58,5 +58,16 @@ extern volatile uint8_t KeyIndex_BufferUsed; void scan_setup( void ); 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_lockKeyboard( void ); +void scan_unlockKeyboard( void ); +void scan_resetKeyboard( void ); + + #endif // __SCAN_LOOP_H diff --git a/USB/pjrc/usb_keyboard_debug.c b/USB/pjrc/usb_keyboard_debug.c index 1043e6a..6aec93f 100644 --- a/USB/pjrc/usb_keyboard_debug.c +++ b/USB/pjrc/usb_keyboard_debug.c @@ -135,8 +135,8 @@ static const uint8_t PROGMEM keyboard_hid_report_desc[] = { }; static const uint8_t PROGMEM debug_hid_report_desc[] = { - //0x06, 0x30, 0xFF, // Usage Page 0xFF31 (vendor defined) - 0x06, 0x31, 0xFF, // Usage Page 0xFF31 (vendor defined) + 0x06, 0x30, 0xFF, // Usage Page 0xFF31 (vendor defined) + //0x06, 0x31, 0xFF, // Usage Page 0xFF31 (vendor defined) 0x09, 0x74, // Usage 0x74 0xA1, 0x53, // Collection 0x53 0x75, 0x08, // report size = 8 bits diff --git a/setup.cmake b/setup.cmake index c3c1567..c3eb2a2 100644 --- a/setup.cmake +++ b/setup.cmake @@ -20,7 +20,7 @@ #| Please the {Scan,Macro,USB,Debug}/module.txt for information on the modules and how to create new ones ##| Deals with acquiring the keypress information and turning it into a key index -set( ScanModule "EpsonQX-10" ) +set( ScanModule "BudKeypad" ) ##| Uses the key index and potentially applies special conditions to it, mapping it to a usb key code set( MacroModule "buffer" )