2014-03-31 08:07:48 +00:00
/* Copyright (C) 2011-2012,2014 by Jacob Alexander
*
2011-09-29 06:25:51 +00:00
* Permission is hereby granted , free of charge , to any person obtaining a copy
* of this software and associated documentation files ( the " Software " ) , to deal
* in the Software without restriction , including without limitation the rights
* to use , copy , modify , merge , publish , distribute , sublicense , and / or sell
* copies of the Software , and to permit persons to whom the Software is
* furnished to do so , subject to the following conditions :
2014-03-31 08:07:48 +00:00
*
2011-09-29 06:25:51 +00:00
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software .
2014-03-31 08:07:48 +00:00
*
2011-09-29 06:25:51 +00:00
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
* LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM ,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE .
*/
2011-09-30 05:22:19 +00:00
// ----- Includes -----
2013-01-26 20:05:28 +00:00
// Compiler Includes
# include <Lib/ScanLib.h>
2011-10-16 03:01:46 +00:00
// Project Includes
# include <led.h>
2014-04-06 18:49:27 +00:00
# include <macro.h>
2011-10-16 03:01:46 +00:00
# include <print.h>
2011-09-30 05:22:19 +00:00
// Local Includes
# include "scan_loop.h"
2011-10-16 03:01:46 +00:00
# include "matrix_scan.h"
2011-09-30 05:22:19 +00:00
// ----- Defines -----
2011-09-29 06:25:51 +00:00
// Debouncing Defines
2012-10-04 19:07:06 +00:00
// Old
//#define SAMPLE_THRESHOLD 110
//#define MAX_SAMPLES 127 // Max is 127, reaching 128 is very bad
# define SAMPLE_THRESHOLD 6
# define MAX_SAMPLES 10 // Max is 127, reaching 128 is very bad
2011-09-30 05:22:19 +00:00
// ----- Macros -----
2011-09-29 06:25:51 +00:00
2011-09-30 05:22:19 +00:00
// ----- Variables -----
2011-09-29 06:25:51 +00:00
2011-11-29 06:20:04 +00:00
// 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 ;
2012-10-04 19:07:06 +00:00
volatile uint8_t KeyIndex_Add_InputSignal ; // Used to pass the (click/input value) to the keyboard for the clicker
2011-11-29 06:20:04 +00:00
2011-09-30 05:22:19 +00:00
// Keeps track of the number of scans, so we only do a debounce assess when it would be valid (as it throws away data)
2014-04-06 18:49:27 +00:00
uint8_t Scan_count = 0 ;
2011-09-29 06:25:51 +00:00
2011-10-16 03:01:46 +00:00
// This is where the matrix scan data is held, as well as debouncing is evaluated to, which (depending on the read value) is handled
// by the macro module
2013-01-27 03:30:36 +00:00
uint8_t KeyIndex_Array [ KEYBOARD_KEYS + 1 ] ;
2011-10-16 03:01:46 +00:00
2011-09-29 06:25:51 +00:00
2011-09-30 05:22:19 +00:00
// ----- Functions -----
2011-09-29 06:25:51 +00:00
2011-10-01 07:54:18 +00:00
// Setup
2014-04-06 18:49:27 +00:00
inline void Scan_setup ( )
2011-09-29 06:25:51 +00:00
{
2011-11-29 06:20:04 +00:00
matrix_pinSetup ( ( uint8_t * ) matrix_pinout , scanMode ) ;
2011-10-01 07:54:18 +00:00
}
2011-09-29 06:25:51 +00:00
2011-10-01 07:54:18 +00:00
// Main Detection Loop
2014-04-06 18:49:27 +00:00
inline uint8_t Scan_loop ( )
2011-10-01 07:54:18 +00:00
{
2011-09-30 05:22:19 +00:00
// Check count to see if the sample threshold may have been reached, otherwise collect more data
2014-04-06 18:49:27 +00:00
if ( Scan_count < MAX_SAMPLES )
2011-10-16 03:01:46 +00:00
{
matrix_scan ( ( uint8_t * ) matrix_pinout , KeyIndex_Array ) ;
2011-10-17 03:08:37 +00:00
// scanDual requires 2 passes, and thus needs more memory per matrix_scan pass
# if scanMode == scanDual
2014-04-06 18:49:27 +00:00
Scan_count + = 2 ;
2011-10-17 03:08:37 +00:00
# else
2014-04-06 18:49:27 +00:00
Scan_count + + ;
2011-10-17 03:08:37 +00:00
# endif
2011-10-16 03:01:46 +00:00
// Signal Main Detection Loop to continue scanning
return 0 ;
}
2011-09-29 06:25:51 +00:00
2011-09-30 05:22:19 +00:00
// Reset Sample Counter
2014-04-06 18:49:27 +00:00
Scan_count = 0 ;
2011-09-29 06:25:51 +00:00
2011-09-30 05:22:19 +00:00
// Assess debouncing sample table
2011-11-29 06:20:04 +00:00
// 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 )
{
2011-12-19 03:02:56 +00:00
// Debug output (keypress detected)
2014-04-06 18:49:27 +00:00
printHex ( key ) ;
print ( " " ) ;
2011-12-19 03:02:56 +00:00
// 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 )
{
2014-04-06 18:49:27 +00:00
Macro_bufferAdd ( key ) ;
2011-12-19 03:02:56 +00:00
break ;
}
// Key already in the buffer
if ( KeyIndex_Buffer [ c ] = = key )
break ;
}
2011-11-29 06:20:04 +00:00
KeyIndex_Array [ key ] = ( 1 < < 7 ) ;
}
else
{
2011-12-19 03:02:56 +00:00
// 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 ;
}
}
}
2011-11-29 06:20:04 +00:00
KeyIndex_Array [ key ] = 0x00 ;
}
2011-10-16 03:01:46 +00:00
// Ready to allow for USB send
return 1 ;
2011-09-29 06:25:51 +00:00
}
2011-12-19 03:02:56 +00:00
2014-04-06 18:49:27 +00:00
// Signal that the USB keycodes have been properly sent through the Output Module
inline void Scan_finishedWithUSBBuffer ( uint8_t sentKeys )
2011-12-19 03:02:56 +00:00
{
return ;
}
2014-04-06 18:49:27 +00:00
// Signal KeyIndex_Buffer that it has been fully processed using the macro module
inline void Scan_finishedWithBuffer ( uint8_t sentKeys )
2011-12-19 03:02:56 +00:00
{
return ;
}