# HG changeset patch # User Jacob Alexander # Date 1425709095 28800 # Node ID c856f826bd490d3b8ec09caf465ea81a11ee0e5e # Parent 39f84a6033501b8fa1c29a6a325da9152724a02a Adding DebounceThrottleDiv define to slow down the debounce rate. By default: DebounceThrottleDiv = 0; This is the default infinity behaviour right now (may be changed in the future). Increasing DebounceThrottleDiv will increase the scan rate divider. DebounceThrottleDiv = 1; # Scans half as much DebounceThrottleDiv = 2; # Scans a quarter as much DebounceThrottleDiv = 3; # Scans an eigth as much etc. For ARM based uCs (like the Infinity) the maximum divider is 32. diff -r 39f84a603350 -r c856f826bd49 Scan/MatrixARM/capabilities.kll --- a/Scan/MatrixARM/capabilities.kll Mon Mar 02 01:58:53 2015 -0800 +++ b/Scan/MatrixARM/capabilities.kll Fri Mar 06 22:18:15 2015 -0800 @@ -18,3 +18,17 @@ DebounceDivThreshold = 0xFFFF; # Default debounce #DebounceDivThreshold = 0xFFFFFFFF; # Max debounce +# This defines how often the matrix is scanned +# By, default the key matrix is scanned once per macro processing loop +# For fast uCs and bouncy switches, this can be non-ideal +# 0 - Bit-shift of 0 +# 1 - Bit-shift of 1 (i.e. divide by 2) +# 2 - Bit-shift of 2 (i.e. divide by 4) +# 3 - Bit-shift of 3 (i.e. divide by 8) +# etc. +# Depending on the architecture, this is either a maximum of 16 or 32 +# Increasing this value will increase switch latency +DebounceThrottleDiv => DebounceThrottleDiv_define; +DebounceThrottleDiv = 0; # Default +#DebounceThrottleDiv = 2; # /4 divider + diff -r 39f84a603350 -r c856f826bd49 Scan/MatrixARM/matrix_scan.c --- a/Scan/MatrixARM/matrix_scan.c Mon Mar 02 01:58:53 2015 -0800 +++ b/Scan/MatrixARM/matrix_scan.c Fri Mar 06 22:18:15 2015 -0800 @@ -26,6 +26,7 @@ // Project Includes #include +#include #include #include #include @@ -38,6 +39,14 @@ +// ----- Defines ----- + +#if ( DebounceThrottleDiv_define > 0 ) +nat_ptr_t Matrix_divCounter = 0; +#endif + + + // ----- Function Declarations ----- // CLI Functions @@ -232,6 +241,15 @@ // NOTE: scanNum should be reset to 0 after a USB send (to reset all the counters) void Matrix_scan( uint16_t scanNum ) { +#if ( DebounceThrottleDiv_define > 0 ) + // Scan-rate throttling + // By scanning using a divider, the scan rate slowed down + // DebounceThrottleDiv_define == 1 means -> /2 or half scan rate + // This helps with bouncy switches on fast uCs + if ( !( Matrix_divCounter++ & (1 << ( DebounceThrottleDiv_define - 1 )) ) ) + return; +#endif + // Increment stats counters if ( scanNum > matrixMaxScans ) matrixMaxScans = scanNum; if ( scanNum == 0 )