#define ADHSM 7
-#define RIGHT_JUSTIFY 0
-#define LEFT_JUSTIFY (0xff)
-
-// set left or right justification here:
-#define JUSTIFY_ADC RIGHT_JUSTIFY
-#define ADLAR_MASK (1 << ADLAR)
-
-#ifdef JUSTIFY_ADC
-#define ADLAR_BITS ((ADLAR_MASK) & (JUSTIFY_ADC))
-#else // defaults to right justification.
+// Right justification of ADLAR
#define ADLAR_BITS 0
-#endif
// full muxmask
#define FULL_MUX_MASK ((1 << MUX0) | (1 << MUX1) | (1 << MUX2) | (1 << MUX3) | (1 << MUX4))
// Number of consecutive samples required to pass debounce
#define DEBOUNCE_THRESHOLD 5
+// Scans to remain idle after all keys were release before starting averaging
+// XXX So this makes the initial keypresses fast,
+// but it's still possible to lose a keypress if you press at the wrong time -HaaTa
+#define KEY_IDLE_SCANS 30000
+
+// Total number of muxes/sense lines available
#define MUXES_COUNT 8
#define MUXES_COUNT_XSHIFT 3
-#define WARMUP_LOOPS ( 2048 )
+// Number of warm-up loops before starting to scan keys
+#define WARMUP_LOOPS ( 1024 )
#define WARMUP_STOP (WARMUP_LOOPS - 1)
#define SAMPLE_CONTROL 3
// mix in 1/4 of the current average to the running average. -> (@mux_mix = 2)
#define MUX_MIX 2
-#define IDLE_COUNT_MASK 0xff
#define IDLE_COUNT_SHIFT 8
// av = (av << shift) - av + sample; av >>= shift
uint16_t samples[MAX_STROBES][MUXES_COUNT]; // Overall table of cap sense ADC values
uint16_t sampleMax[MAX_STROBES][MUXES_COUNT]; // Records the max seen ADC value
-uint8_t key_activity = 0; // Increments for each detected key per each full scan of the keyboard, it is reset before each full scan
-uint8_t key_release = 0; // Indicates if going from key press state to release state (some keys pressed to no keys pressed)
+uint8_t key_activity = 0; // Increments for each detected key per each full scan of the keyboard, it is reset before each full scan
+uint16_t key_idle = 0; // Defines how scans after all keys were released before starting averaging again
+uint8_t key_release = 0; // Indicates if going from key press state to release state (some keys pressed to no keys pressed)
uint16_t threshold = THRESHOLD;
// No keypress, accumulate averages
if( !key_activity )
{
- // Average Debugging
- if ( enableAvgDebug )
+ // Only start averaging once the idle counter has counted down to 0
+ if ( key_idle == 0 )
{
- print("\033[1mAvg\033[0m: ");
- }
+ // Average Debugging
+ if ( enableAvgDebug )
+ {
+ print("\033[1mAvg\033[0m: ");
+ }
- // aggregate
- for ( uint8_t i = 0; i < KEY_COUNT; ++i )
- {
- uint16_t acc = keys_averages_acc[i];
- //uint16_t acc = keys_averages_acc[i] >> IDLE_COUNT_SHIFT; // XXX This fixes things... -HaaTa
- uint32_t av = keys_averages[i];
+ // aggregate
+ for ( uint8_t i = 0; i < KEY_COUNT; ++i )
+ {
+ uint16_t acc = keys_averages_acc[i];
+ //uint16_t acc = keys_averages_acc[i] >> IDLE_COUNT_SHIFT; // XXX This fixes things... -HaaTa
+ uint32_t av = keys_averages[i];
- av = (av << KEYS_AVERAGES_MIX_SHIFT) - av + acc;
- av >>= KEYS_AVERAGES_MIX_SHIFT;
+ av = (av << KEYS_AVERAGES_MIX_SHIFT) - av + acc;
+ av >>= KEYS_AVERAGES_MIX_SHIFT;
- keys_averages[i] = av;
- keys_averages_acc[i] = 0;
+ keys_averages[i] = av;
+ keys_averages_acc[i] = 0;
+
+ // Average Debugging
+ if ( enableAvgDebug && av > 0 )
+ {
+ printHex( av );
+ print(" ");
+ }
+ }
// Average Debugging
- if ( enableAvgDebug && av > 0 )
+ if ( enableAvgDebug )
{
- printHex( av );
- print(" ");
+ print( NL );
}
- }
- // Average Debugging
- if ( enableAvgDebug )
+ // No key presses detected, set key_release indicator
+ key_release = 1;
+ }
+ // Otherwise decrement the idle counter
+ else
{
- print( NL );
+ key_idle--;
}
-
- // No key presses detected, set key_release indicator
- key_release = 1;
}
// Keypresses, reset accumulators
else if ( key_release )
{
column |= bit;
key_activity++; // No longer idle, stop averaging ADC data
+ key_idle = KEY_IDLE_SCANS; // Reset idle count-down
// Only register keypresses once the warmup is complete, or not enough debounce info
if ( keys_debounce[key] <= DEBOUNCE_THRESHOLD )