changeset 36:00a06e011158

Pre Tandy1000 overhaul
author Jacob Alexander <triplehaata@gmail.com>
date Mon, 28 Nov 2011 22:20:04 -0800
parents 45fcd87055d2
children 7f65034538ea
files CMakeLists.txt Debug/full/setup.cmake Debug/led/setup.cmake Debug/print/setup.cmake Keymap/tandy1000.h Scan/HeathZenith/matrix.h Scan/MicroSwitch8304/scan_loop.c Scan/MicroSwitch8304/scan_loop.h Scan/Tandy1000/scan_loop.c Scan/Tandy1000/scan_loop.h Scan/Tandy1000/setup.cmake Scan/matrix/matrix_scan.c Scan/matrix/matrix_scan.h Scan/matrix/scan_loop.c Scan/matrix/scan_loop.h USB/pjrc/usb_keyboard_debug.c setup.cmake
diffstat 17 files changed, 197 insertions(+), 109 deletions(-) [+]
line wrap: on
line diff
--- 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.
--- 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(
--- 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
 #
 
--- 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
 #
 
--- 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,
--- 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    },
 
 
 
--- 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 );
+}
+
--- 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
--- 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 <avr/interrupt.h>
+#include <avr/io.h>
+#include <util/delay.h>
 
 // Project Includes
 #include <led.h>
@@ -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
+}
 
--- 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
 
--- 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
 )
 
--- 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 <avr/io.h>
+#include <util/delay.h>
 
 // Project Includes
 #include <print.h>
@@ -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++ ) 
--- 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
--- 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;
--- 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;
 
 
 
--- 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
--- 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"  )