# HG changeset patch # User Jacob Alexander # Date 1322547604 28800 # Node ID 00a06e0111589f3f8309a8e1335ae177afba17e7 # Parent 45fcd87055d2605dec240fd2d26bed24700acf64 Pre Tandy1000 overhaul diff -r 45fcd87055d2 -r 00a06e011158 CMakeLists.txt --- a/CMakeLists.txt Sun Nov 13 02:09:04 2011 -0800 +++ b/CMakeLists.txt Mon Nov 28 22:20:04 2011 -0800 @@ -64,7 +64,7 @@ #| "atmega32u4" # Teensy 2.0 #| "at90usb646" # Teensy++ 1.0 #| "at90usb1286" # Teensy++ 2.0 -set( MCU "atmega32u4" ) +set( MCU "at90usb1286" ) #| Compiler flag to set the C Standard level. diff -r 45fcd87055d2 -r 00a06e011158 Debug/full/setup.cmake --- a/Debug/full/setup.cmake Sun Nov 13 02:09:04 2011 -0800 +++ b/Debug/full/setup.cmake Mon Nov 28 22:20:04 2011 -0800 @@ -19,6 +19,13 @@ ### +# Setup File Dependencies +# +add_file_dependencies( ../led/led.c ../led/led.h ) +add_file_dependencies( ../led/print.c ../led/print.h ) + + +### # Module Specific Options # add_definitions( diff -r 45fcd87055d2 -r 00a06e011158 Debug/led/setup.cmake --- a/Debug/led/setup.cmake Sun Nov 13 02:09:04 2011 -0800 +++ b/Debug/led/setup.cmake Mon Nov 28 22:20:04 2011 -0800 @@ -17,6 +17,12 @@ ### +# Setup File Dependencies +# +add_file_dependencies( ../led/led.c ../led/led.h ) + + +### # Module Specific Options # diff -r 45fcd87055d2 -r 00a06e011158 Debug/print/setup.cmake --- a/Debug/print/setup.cmake Sun Nov 13 02:09:04 2011 -0800 +++ b/Debug/print/setup.cmake Mon Nov 28 22:20:04 2011 -0800 @@ -17,6 +17,12 @@ ### +# Setup File Dependencies +# +add_file_dependencies( ../led/print.c ../led/print.h ) + + +### # Module Specific Options # diff -r 45fcd87055d2 -r 00a06e011158 Keymap/tandy1000.h --- a/Keymap/tandy1000.h Sun Nov 13 02:09:04 2011 -0800 +++ b/Keymap/tandy1000.h Mon Nov 28 22:20:04 2011 -0800 @@ -27,9 +27,9 @@ // ----- Variables ----- -static uint8_t tandy1000_modifierMask[] = { 0x1D, 0x2A, 0x36, 0x38, 0x46 }; +static uint8_t tandy1000_ModifierMask[] = { 0x1D, 0x2A, 0x36, 0x38, 0x46 }; -static uint8_t tandy1000_map[] = { 0, +static uint8_t tandy1000_DefaultMap[] = { 0, KEY_ESC, KEY_1, KEY_2, @@ -122,7 +122,7 @@ KEY_F12, // 0x5A }; -static uint8_t tandy1000_colemak[] = { 0, +static uint8_t tandy1000_ColemakMap[] = { 0, KEY_ESC, KEY_1, KEY_2, diff -r 45fcd87055d2 -r 00a06e011158 Scan/HeathZenith/matrix.h --- a/Scan/HeathZenith/matrix.h Sun Nov 13 02:09:04 2011 -0800 +++ b/Scan/HeathZenith/matrix.h Mon Nov 28 22:20:04 2011 -0800 @@ -46,18 +46,18 @@ static const uint8_t matrix_pinout[][MAX_ROW_SIZE + 1] = { -// TODO Pinout +// Bread-board debug pinout // Note: Pins 49 and 60 are connected together, by row AND column, why? dunno...(shift) - { scanMode, pinF0, pinF4, pinB7, pinD3, pinF5, pinF1, pinD1, pinD2, pinE0, pinE1, pinE2, pinE3 }, - { pinF6, 1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0 }, - { pinF7, 16, 15, 14, 13, 12, 11, 10, 9, 0, 0, 0, 0 }, - { pinB2, 17, 18, 19, 20, 21, 22, 23, 24, 0, 0, 0, 0 }, - { pinD0, 32, 31, 30, 29, 28, 27, 26, 25, 0, 0, 0, 0 }, - { pinB6, 35, 36, 37, 38, 39, 40, 41, 42, 0, 0, 0, 0 }, - { pinB3, 47, 61, 46, 45, 44, 43, 58, 0, 0, 0, 0, 0 }, - { pinA0, 50, 51, 52, 53, 54, 55, 56, 57, 0, 0, 0, 0 }, - { pinB0, 62, 63, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0 }, - { pinB0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 34, 48, 49 }, + { scanMode, pinC6, pinC5, pinC4, pinC3, pinC2, pinE1, pinC0, pinC1, pinD7, pinE0, pinD6, pinC7 }, + { pinF3, 1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0 }, + { pinE7, 16, 15, 14, 13, 12, 11, 10, 9, 0, 0, 0, 0 }, + { pinB4, 17, 18, 19, 20, 21, 22, 23, 24, 0, 0, 0, 0 }, + { pinB0, 32, 31, 30, 29, 28, 27, 26, 25, 0, 0, 0, 0 }, + { pinB2, 35, 36, 37, 38, 39, 40, 41, 42, 0, 0, 0, 0 }, + { pinB1, 47, 61, 46, 45, 44, 43, 58, 0, 0, 0, 0, 0 }, + { pinB5, 50, 51, 52, 53, 54, 55, 56, 57, 0, 0, 0, 0 }, + { pinE6, 62, 63, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0 }, + { pinB6, 0, 0, 0, 0, 0, 0, 0, 0, 33, 34, 48, 49 }, diff -r 45fcd87055d2 -r 00a06e011158 Scan/MicroSwitch8304/scan_loop.c --- a/Scan/MicroSwitch8304/scan_loop.c Sun Nov 13 02:09:04 2011 -0800 +++ b/Scan/MicroSwitch8304/scan_loop.c Mon Nov 28 22:20:04 2011 -0800 @@ -94,6 +94,10 @@ // Initially buffer doesn't need to be cleared (it's empty...) BufferReadyToClear = 0; + + // Reset the keyboard before scanning, we might be in a wierd state + // Note: This should be run asap, but we need the USART setup to run this command on the 8304 + scan_resetKeyboard(); } @@ -223,3 +227,10 @@ SET_RESET(); } +// Reset Keyboard +void scan_resetKeyboard( void ) +{ + // Reset command for the 8304 + scan_sendData( 0x92 ); +} + diff -r 45fcd87055d2 -r 00a06e011158 Scan/MicroSwitch8304/scan_loop.h --- a/Scan/MicroSwitch8304/scan_loop.h Sun Nov 13 02:09:04 2011 -0800 +++ b/Scan/MicroSwitch8304/scan_loop.h Mon Nov 28 22:20:04 2011 -0800 @@ -33,7 +33,7 @@ // ----- Defines ----- -#define KEYBOARD_SIZE 0x62 // 76 - Size of the array space for the keyboard(max index) +#define KEYBOARD_SIZE 0x62 // 98 - Size of the array space for the keyboard(max index) #define KEYBOARD_BUFFER 24 // Max number of key signals to buffer @@ -58,6 +58,7 @@ void scan_finishedWithBuffer( void ); void scan_lockKeyboard( void ); void scan_unlockKeyboard( void ); +void scan_resetKeyboard( void ); #endif // __SCAN_LOOP_H diff -r 45fcd87055d2 -r 00a06e011158 Scan/Tandy1000/scan_loop.c --- a/Scan/Tandy1000/scan_loop.c Sun Nov 13 02:09:04 2011 -0800 +++ b/Scan/Tandy1000/scan_loop.c Mon Nov 28 22:20:04 2011 -0800 @@ -23,6 +23,8 @@ // AVR Includes #include +#include +#include // Project Includes #include @@ -53,17 +55,24 @@ // ----- Macros ----- + #define READ_CLK CLK_READ & (1 << CLK_PIN) ? 1 : 0 #define READ_DATA DATA_READ & (1 << DATA_PIN) ? 0 : 1 #define UNSET_INTR() INTR_DDR &= ~(1 << INTR_PIN) #define SET_INTR() INTR_DDR |= (1 << INTR_PIN) +#define bufferAdd(byte) \ + if ( KeyIndex_BufferUsed < KEYBOARD_BUFFER ) \ + KeyIndex_Buffer[KeyIndex_BufferUsed++] = byte // ----- Variables ----- -uint8_t KeyIndex_Array[KEYBOARD_SIZE + 1]; +// 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; + // Scan Code Retrieval Variables uint8_t inputData = 0xFF; @@ -76,6 +85,12 @@ // Setup inline void scan_setup() { + // Initially reset the keyboard (just in case we are in a wierd state) + scan_resetKeyboard(); + + // Setup SPI for data input using the clock and data inputs + // TODO + /* // Setup inputs CLK_DDR &= ~(1 << CLK_PIN); DATA_DDR &= ~(1 << DATA_PIN); @@ -83,22 +98,14 @@ // Setup Pull-up's CLK_PORT &= ~(1 << CLK_PIN); // (CLK) DATA_PORT &= ~(1 << DATA_PIN); // (/DATA) + */ // Setup Keyboard Interrupt INTR_DDR &= ~(1 << INTR_PIN); INTR_PORT &= ~(1 << INTR_PIN); - /* Interrupt Style (Not working fully) - cli(); - // Setup interrupt on the CLK pin TODO Better defines - EICRA |= 0x03; // Rising Edge Interrupt - EIMSK |= (1 << INT0); - - // Setup interrupt on the DATA pin TODO Better defines - EICRA |= 0x08; // Falling Edge Interrupt - EIMSK |= (1 << INT1); - sei(); - */ + // Setup Keyboard Reset Line + // TODO } @@ -212,28 +219,35 @@ return packet_index; } -// Detection interrupt, signalled by a clock pulse from CLK_PIN -ISR(INT0_vect) +// Send data +// XXX Not used with the Tandy1000 +uint8_t scan_sendData( uint8_t dataPayload ) { - //cli(); // Disable Interrupts + return 0; +} - // Append 1 bit of data - //inputData &= ~(READ_DATA << packet_index); - packet_index++; - - //sei(); // Re-enable Interrupts +// Signal KeyIndex_Buffer that it has been properly read +// TODO +void scan_finishedWithBuffer( void ) +{ } -// Data Detected -ISR(INT1_vect) +// Reset/Hold keyboard +// Warning! This will cause the keyboard to not send any data, so you can't disable with a keypress +// The Tandy 1000 keyboard has a dedicated hold/processor interrupt line +void scan_lockKeyboard( void ) { - // Append 1 bit of data - inputData &= ~(1 << packet_index); - packet_index++; - - // Disable Clk Signal (Not needed if there's a data signal) - EIFR |= (1 << INTF0); + UNSET_INTR(); } +void scan_unlockKeyboard( void ) +{ + SET_INTR(); +} +// Reset Keyboard +void scan_resetKeyboard( void ) +{ + // TODO Tandy1000 has a dedicated reset line +} diff -r 45fcd87055d2 -r 00a06e011158 Scan/Tandy1000/scan_loop.h --- a/Scan/Tandy1000/scan_loop.h Sun Nov 13 02:09:04 2011 -0800 +++ b/Scan/Tandy1000/scan_loop.h Mon Nov 28 22:20:04 2011 -0800 @@ -34,22 +34,32 @@ // ----- Defines ----- #define KEYBOARD_SIZE 0x5A // 90 - Size of the array space for the keyboardr(max index) +#define KEYBOARD_BUFFER 24 // Max number of key signals to buffer // ----- Variables ----- -// NOTE: Highest Bit: Valid keypress (0x80 is valid keypress) -// Other Bits: Pressed state sample counter -extern uint8_t KeyIndex_Array [KEYBOARD_SIZE + 1]; - static const uint8_t KeyIndex_Size = KEYBOARD_SIZE; +extern volatile uint8_t KeyIndex_Buffer[KEYBOARD_BUFFER]; +extern volatile uint8_t KeyIndex_BufferUsed; // ----- Functions ----- +// Functions used by main.c 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_lockKeyboard( void ); +void scan_unlockKeyboard( void ); +void scan_resetKeyboard( void ); + + #endif // __SCAN_LOOP_H diff -r 45fcd87055d2 -r 00a06e011158 Scan/Tandy1000/setup.cmake --- a/Scan/Tandy1000/setup.cmake Sun Nov 13 02:09:04 2011 -0800 +++ b/Scan/Tandy1000/setup.cmake Mon Nov 28 22:20:04 2011 -0800 @@ -23,7 +23,8 @@ #| Keymap Settings add_definitions( - -DMODIFIER_MASK=tandy1000_modifierMask - -DKEYINDEX_MASK=tandy1000_colemak + -DMODIFIER_MASK=tandy1000_ModifierMask + -DKEYINDEX_MASK=tandy1000_ColemakMap + #-DKEYINDEX_MASK=tandy1000_DefaultMap ) diff -r 45fcd87055d2 -r 00a06e011158 Scan/matrix/matrix_scan.c --- a/Scan/matrix/matrix_scan.c Sun Nov 13 02:09:04 2011 -0800 +++ b/Scan/matrix/matrix_scan.c Mon Nov 28 22:20:04 2011 -0800 @@ -23,6 +23,7 @@ // AVR Includes #include +#include // Project Includes #include @@ -40,9 +41,19 @@ // -- pinSetup Macros -- #define REG_SET(reg) reg |= (1 << ( matrix[row*(MAX_ROW_SIZE+1)+col] % 10 ) ) -#define PIN_SET_COL(pin) \ - switch ( scanMode ) { \ +#define PIN_SET_COL(pin,scan) \ + switch ( scan ) { \ case scanCol: \ + case scanRow_powrCol: \ + case scanDual: \ + REG_SET(port##pin); break; \ + case scanCol_powrRow: REG_SET(ddr##pin); REG_SET(port##pin); break; \ + } \ + break + +#define PIN_SET_ROW(pin,scan) \ + switch ( scan ) { \ + case scanRow: \ case scanCol_powrRow: \ case scanDual: \ REG_SET(port##pin); break; \ @@ -50,16 +61,6 @@ } \ break -#define PIN_SET_ROW(pin) \ - switch ( scanMode ) { \ - case scanRow: \ - case scanRow_powrCol: \ - case scanDual: \ - REG_SET(port##pin); break; \ - case scanCol_powrRow: REG_SET(ddr##pin); REG_SET(port##pin); break; \ - } \ - break - #define PIN_CASE(pinLetter) \ case pin##pinLetter##0: \ case pin##pinLetter##1: \ @@ -74,7 +75,10 @@ #define PIN_TEST_COL(pin) \ 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 // -- Row Scan Macros -- @@ -109,7 +113,7 @@ // ----- Functions ----- // Goes through the defined matrix and matrix mode, and sets the initial state of all of the available pins -inline void matrix_pinSetup( uint8_t *matrix ) +void matrix_pinSetup( uint8_t *matrix, uint8_t scanType ) { // Setup the variables uint8_t portA = 0x00; @@ -136,17 +140,17 @@ switch ( matrix[row*(MAX_ROW_SIZE+1)+col] ) { PIN_CASE(A): - PIN_SET_ROW(A); + PIN_SET_ROW(A, scanType); PIN_CASE(B): - PIN_SET_ROW(B); + PIN_SET_ROW(B, scanType); PIN_CASE(C): - PIN_SET_ROW(C); + PIN_SET_ROW(C, scanType); PIN_CASE(D): - PIN_SET_ROW(D); + PIN_SET_ROW(D, scanType); PIN_CASE(E): - PIN_SET_ROW(E); + PIN_SET_ROW(E, scanType); PIN_CASE(F): - PIN_SET_ROW(F); + PIN_SET_ROW(F, scanType); default: continue; @@ -160,17 +164,17 @@ switch ( matrix[row*(MAX_ROW_SIZE+1)+col] ) { PIN_CASE(A): - PIN_SET_COL(A); + PIN_SET_COL(A, scanType); PIN_CASE(B): - PIN_SET_COL(B); + PIN_SET_COL(B, scanType); PIN_CASE(C): - PIN_SET_COL(C); + PIN_SET_COL(C, scanType); PIN_CASE(D): - PIN_SET_COL(D); + PIN_SET_COL(D, scanType); PIN_CASE(E): - PIN_SET_COL(E); + PIN_SET_COL(E, scanType); PIN_CASE(F): - PIN_SET_COL(F); + PIN_SET_COL(F, scanType); default: continue; @@ -178,26 +182,30 @@ } // Pin Status - char tmpStr[6]; - info_print("Initial Matrix Pin Setup"); - info_print(" ddrA ddrB ddrC ddrD ddrE ddrF"); - print(" "); - hexToStr_op( ddrA, tmpStr, 2 ); dPrintStrs( " 0x", tmpStr ); - hexToStr_op( ddrB, tmpStr, 2 ); dPrintStrs( " 0x", tmpStr ); - hexToStr_op( ddrC, tmpStr, 2 ); dPrintStrs( " 0x", tmpStr ); - hexToStr_op( ddrD, tmpStr, 2 ); dPrintStrs( " 0x", tmpStr ); - hexToStr_op( ddrE, tmpStr, 2 ); dPrintStrs( " 0x", tmpStr ); - hexToStr_op( ddrF, tmpStr, 2 ); dPrintStrs( " 0x", tmpStr ); - print("\n"); - info_print("portA portB portC portD portE portF"); - print(" "); - hexToStr_op( portA, tmpStr, 2 ); dPrintStrs( " 0x", tmpStr ); - hexToStr_op( portB, tmpStr, 2 ); dPrintStrs( " 0x", tmpStr ); - hexToStr_op( portC, tmpStr, 2 ); dPrintStrs( " 0x", tmpStr ); - hexToStr_op( portD, tmpStr, 2 ); dPrintStrs( " 0x", tmpStr ); - hexToStr_op( portE, tmpStr, 2 ); dPrintStrs( " 0x", tmpStr ); - hexToStr_op( portF, tmpStr, 2 ); dPrintStrs( " 0x", tmpStr ); - print("\n"); + if ( scanType == scanMode ) + { + char tmpStr[6]; + info_print("Initial Matrix Pin Setup"); + info_print(" ddrA ddrB ddrC ddrD ddrE ddrF"); + print(" "); + hexToStr_op( ddrA, tmpStr, 2 ); dPrintStrs( " 0x", tmpStr ); + hexToStr_op( ddrB, tmpStr, 2 ); dPrintStrs( " 0x", tmpStr ); + hexToStr_op( ddrC, tmpStr, 2 ); dPrintStrs( " 0x", tmpStr ); + hexToStr_op( ddrD, tmpStr, 2 ); dPrintStrs( " 0x", tmpStr ); + hexToStr_op( ddrE, tmpStr, 2 ); dPrintStrs( " 0x", tmpStr ); + hexToStr_op( ddrF, tmpStr, 2 ); dPrintStrs( " 0x", tmpStr ); + print("\n"); + info_print("portA portB portC portD portE portF"); + print(" "); + hexToStr_op( portA, tmpStr, 2 ); dPrintStrs( " 0x", tmpStr ); + hexToStr_op( portB, tmpStr, 2 ); dPrintStrs( " 0x", tmpStr ); + hexToStr_op( portC, tmpStr, 2 ); dPrintStrs( " 0x", tmpStr ); + hexToStr_op( portD, tmpStr, 2 ); dPrintStrs( " 0x", tmpStr ); + hexToStr_op( portE, tmpStr, 2 ); dPrintStrs( " 0x", tmpStr ); + hexToStr_op( portF, tmpStr, 2 ); dPrintStrs( " 0x", tmpStr ); + print("\n"); + int8ToStr( scanType, tmpStr ); + } // Setting the pins #if defined(__AVR_AT90USB1286__) @@ -235,6 +243,7 @@ // 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 @@ -285,6 +294,8 @@ // Dual Scan #if scanMode == scanDual // First do a scan of all of the columns, marking each one + matrix_pinSetup( matrix, scanCol_powrRow ); + _delay_us( 1 ); for ( ; row < (MAX_COL_SIZE+1); row++ ) for ( ; col < (MAX_ROW_SIZE+1); col++ ) { // Scan over the pins for each of the columns, and using the pin alias to determine which pin to set @@ -310,6 +321,8 @@ // Next, do a scan of all of the rows, clearing any "vague" keys (only detected on row, but not column, or vice-versa) // And marking any keys that are detected on the row and column + matrix_pinSetup( matrix, scanRow_powrCol ); + _delay_us( 1 ); col = 1; row = 1; for ( ; col < (MAX_ROW_SIZE+1); col++ ) for ( ; row < (MAX_COL_SIZE+1); row++ ) diff -r 45fcd87055d2 -r 00a06e011158 Scan/matrix/matrix_scan.h --- a/Scan/matrix/matrix_scan.h Sun Nov 13 02:09:04 2011 -0800 +++ b/Scan/matrix/matrix_scan.h Mon Nov 28 22:20:04 2011 -0800 @@ -108,7 +108,7 @@ // ----- Functions ----- -void matrix_pinSetup( uint8_t *matrix ); +void matrix_pinSetup( uint8_t *matrix, uint8_t scanType ); void matrix_scan( uint8_t *matrix, uint8_t *detectArray ); #endif // __MATRIX_SCAN_H diff -r 45fcd87055d2 -r 00a06e011158 Scan/matrix/scan_loop.c --- a/Scan/matrix/scan_loop.c Sun Nov 13 02:09:04 2011 -0800 +++ b/Scan/matrix/scan_loop.c Mon Nov 28 22:20:04 2011 -0800 @@ -44,17 +44,20 @@ // ----- Macros ----- -// Loop over all of the sampled keys of the given array -// If the number of samples is higher than the sample threshold, flag the high bit, clear otherwise -// This should be resetting VERY quickly, cutting off a potentially valid keypress is not an issue -#define DEBOUNCE_ASSESS(table,size) \ - for ( uint8_t key = 1; key < size + 1; key++ ) \ - table[key] = ( table[key] & ~(1 << 7) ) > SAMPLE_THRESHOLD ? (1 << 7) : 0x00 +// Make sure we haven't overflowed the buffer +#define bufferAdd(byte) \ + if ( KeyIndex_BufferUsed < KEYBOARD_BUFFER ) \ + KeyIndex_Buffer[KeyIndex_BufferUsed++] = byte // ----- Variables ----- +// 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; + + // Keeps track of the number of scans, so we only do a debounce assess when it would be valid (as it throws away data) uint8_t scan_count = 0; @@ -69,7 +72,7 @@ // Setup inline void scan_setup() { - matrix_pinSetup( (uint8_t*)matrix_pinout ); + matrix_pinSetup( (uint8_t*)matrix_pinout, scanMode ); } // Main Detection Loop @@ -95,7 +98,18 @@ scan_count = 0; // Assess debouncing sample table - DEBOUNCE_ASSESS( KeyIndex_Array, KeyIndex_Size ); + // Loop over all of the sampled keys of the given array + // If the number of samples is higher than the sample threshold, flag the high bit, clear otherwise + // 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 ); + KeyIndex_Array[key] = (1 << 7); + } + else + { + KeyIndex_Array[key] = 0x00; + } // Ready to allow for USB send return 1; diff -r 45fcd87055d2 -r 00a06e011158 Scan/matrix/scan_loop.h --- a/Scan/matrix/scan_loop.h Sun Nov 13 02:09:04 2011 -0800 +++ b/Scan/matrix/scan_loop.h Mon Nov 28 22:20:04 2011 -0800 @@ -37,14 +37,19 @@ // ----- Defines ----- +#define KEYBOARD_BUFFER 24 // Max number of key signals to buffer + // ----- Variables ----- // NOTE: Highest Bit: Valid keypress (0x80 is valid keypress) // Other Bits: Pressed state sample counter -extern uint8_t KeyIndex_Array [KEYBOARD_SIZE + 1]; - static const uint8_t KeyIndex_Size = KEYBOARD_SIZE; +extern uint8_t KeyIndex_Array [KEYBOARD_SIZE + 1]; + static const uint8_t KeyIndex_Size = KEYBOARD_SIZE; + +extern volatile uint8_t KeyIndex_Buffer[KEYBOARD_BUFFER]; +extern volatile uint8_t KeyIndex_BufferUsed; diff -r 45fcd87055d2 -r 00a06e011158 USB/pjrc/usb_keyboard_debug.c --- a/USB/pjrc/usb_keyboard_debug.c Sun Nov 13 02:09:04 2011 -0800 +++ b/USB/pjrc/usb_keyboard_debug.c Mon Nov 28 22:20:04 2011 -0800 @@ -135,8 +135,8 @@ }; 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 -r 45fcd87055d2 -r 00a06e011158 setup.cmake --- a/setup.cmake Sun Nov 13 02:09:04 2011 -0800 +++ b/setup.cmake Mon Nov 28 22:20:04 2011 -0800 @@ -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 "MicroSwitch8304" ) +set( ScanModule "SonyNEWS" ) ##| Uses the key index and potentially applies special conditions to it, mapping it to a usb key code set( MacroModule "buffer" )