@ -45,7 +45,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
extern const matrix_row_t matrix_mask [ ] ;
# endif
# if (DIODE_DIRECTION == ROW2COL) || (DIODE_DIRECTION == COL2ROW)
# ifdef DIRECT_PINS
static pin_t direct_pins [ MATRIX_ROWS ] [ MATRIX_COLS ] = DIRECT_PINS ;
# elif (DIODE_DIRECTION == ROW2COL) || (DIODE_DIRECTION == COL2ROW)
static const pin_t row_pins [ MATRIX_ROWS ] = MATRIX_ROW_PINS ;
static const pin_t col_pins [ MATRIX_COLS ] = MATRIX_COL_PINS ;
# endif
@ -54,20 +56,6 @@ static const pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
static matrix_row_t raw_matrix [ MATRIX_ROWS ] ; //raw values
static matrix_row_t matrix [ MATRIX_ROWS ] ; //debounced values
# if (DIODE_DIRECTION == COL2ROW)
static void init_cols ( void ) ;
static bool read_cols_on_row ( matrix_row_t current_matrix [ ] , uint8_t current_row ) ;
static void unselect_rows ( void ) ;
static void select_row ( uint8_t row ) ;
static void unselect_row ( uint8_t row ) ;
# elif (DIODE_DIRECTION == ROW2COL)
static void init_rows ( void ) ;
static bool read_rows_on_col ( matrix_row_t current_matrix [ ] , uint8_t current_col ) ;
static void unselect_cols ( void ) ;
static void unselect_col ( uint8_t col ) ;
static void select_col ( uint8_t col ) ;
# endif
__attribute__ ( ( weak ) )
void matrix_init_quantum ( void ) {
matrix_init_kb ( ) ;
@ -106,49 +94,6 @@ uint8_t matrix_cols(void) {
return MATRIX_COLS ;
}
void matrix_init ( void ) {
// initialize row and col
# if (DIODE_DIRECTION == COL2ROW)
unselect_rows ( ) ;
init_cols ( ) ;
# elif (DIODE_DIRECTION == ROW2COL)
unselect_cols ( ) ;
init_rows ( ) ;
# endif
// initialize matrix state: all keys off
for ( uint8_t i = 0 ; i < MATRIX_ROWS ; i + + ) {
raw_matrix [ i ] = 0 ;
matrix [ i ] = 0 ;
}
debounce_init ( MATRIX_ROWS ) ;
matrix_init_quantum ( ) ;
}
uint8_t matrix_scan ( void )
{
bool changed = false ;
# if (DIODE_DIRECTION == COL2ROW)
// Set row, read cols
for ( uint8_t current_row = 0 ; current_row < MATRIX_ROWS ; current_row + + ) {
changed | = read_cols_on_row ( raw_matrix , current_row ) ;
}
# elif (DIODE_DIRECTION == ROW2COL)
// Set col, read rows
for ( uint8_t current_col = 0 ; current_col < MATRIX_COLS ; current_col + + ) {
changed | = read_rows_on_col ( raw_matrix , current_col ) ;
}
# endif
debounce ( raw_matrix , matrix , MATRIX_ROWS , changed ) ;
matrix_scan_quantum ( ) ;
return 1 ;
}
//Deprecated.
bool matrix_is_modified ( void )
{
@ -195,16 +140,60 @@ uint8_t matrix_key_count(void)
}
# ifdef DIRECT_PINS
static void init_pins ( void ) {
for ( int row = 0 ; row < MATRIX_ROWS ; row + + ) {
for ( int col = 0 ; col < MATRIX_COLS ; col + + ) {
pin_t pin = direct_pins [ row ] [ col ] ;
if ( pin ! = NO_PIN ) {
setPinInputHigh ( pin ) ;
}
}
}
}
# if (DIODE_DIRECTION == COL2ROW)
static bool read_cols_on_row ( matrix_row_t current_matrix [ ] , uint8_t current_row ) {
matrix_row_t last_row_value = current_matrix [ current_row ] ;
current_matrix [ current_row ] = 0 ;
static void init_cols ( void )
for ( uint8_t col_index = 0 ; col_index < MATRIX_COLS ; col_index + + ) {
pin_t pin = direct_pins [ current_row ] [ col_index ] ;
if ( pin ! = NO_PIN ) {
current_matrix [ current_row ] | = readPin ( pin ) ? 0 : ( ROW_SHIFTER < < col_index ) ;
}
}
return ( last_row_value ! = current_matrix [ current_row ] ) ;
}
# elif (DIODE_DIRECTION == COL2ROW)
static void select_row ( uint8_t row )
{
for ( uint8_t x = 0 ; x < MATRIX_COLS ; x + + ) {
setPinInputHigh ( col_pins [ x ] ) ;
setPinOutput ( row_pins [ row ] ) ;
writePinLow ( row_pins [ row ] ) ;
}
static void unselect_row ( uint8_t row )
{
setPinInputHigh ( row_pins [ row ] ) ;
}
static void unselect_rows ( void )
{
for ( uint8_t x = 0 ; x < MATRIX_ROWS ; x + + ) {
setPinInput ( row_pins [ x ] ) ;
}
}
static void init_pins ( void ) {
unselect_rows ( ) ;
for ( uint8_t x = 0 ; x < MATRIX_COLS ; x + + ) {
setPinInputHigh ( col_pins [ x ] ) ;
}
}
static bool read_cols_on_row ( matrix_row_t current_matrix [ ] , uint8_t current_row )
{
// Store last value of row prior to reading
@ -233,31 +222,31 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
return ( last_row_value ! = current_matrix [ current_row ] ) ;
}
static void select_row ( uint8_t row )
# elif (DIODE_DIRECTION == ROW2COL)
static void select_col ( uint8_t col )
{
setPinOutput ( row_pins [ row ] ) ;
writePinLow ( row_pins[ row ] ) ;
setPinOutput ( col_pins[ col ] ) ;
writePinLow ( col_pins[ col ] ) ;
}
static void unselect_ row( uint8_t row )
static void unselect_ col( uint8_t col )
{
setPinInputHigh ( row_pins[ row ] ) ;
setPinInputHigh ( col_pins[ col ] ) ;
}
static void unselect_ row s( void )
static void unselect_ col s( void )
{
for ( uint8_t x = 0 ; x < MATRIX_ ROW S; x + + ) {
setPinInput ( row _pins[ x ] ) ;
for ( uint8_t x = 0 ; x < MATRIX_ COL S; x + + ) {
setPinInput High( col _pins[ x ] ) ;
}
}
# elif (DIODE_DIRECTION == ROW2COL)
static void init_rows ( void )
{
for ( uint8_t x = 0 ; x < MATRIX_ROWS ; x + + ) {
setPinInputHigh ( row_pins [ x ] ) ;
}
static void init_pins ( void ) {
unselect_cols ( ) ;
for ( uint8_t x = 0 ; x < MATRIX_ROWS ; x + + ) {
setPinInputHigh ( row_pins [ x ] ) ;
}
}
static bool read_rows_on_col ( matrix_row_t current_matrix [ ] , uint8_t current_col )
@ -300,22 +289,42 @@ static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
return matrix_changed ;
}
static void select_col ( uint8_t col )
{
setPinOutput ( col_pins [ col ] ) ;
writePinLow ( col_pins [ col ] ) ;
}
# endif
static void unselect_col ( uint8_t col )
{
setPinInputHigh ( col_pins [ col ] ) ;
}
void matrix_init ( void ) {
static void unselect_cols ( void )
{
for ( uint8_t x = 0 ; x < MATRIX_COLS ; x + + ) {
setPinInputHigh ( col_pins [ x ] ) ;
// initialize key pins
init_pins ( ) ;
// initialize matrix state: all keys off
for ( uint8_t i = 0 ; i < MATRIX_ROWS ; i + + ) {
raw_matrix [ i ] = 0 ;
matrix [ i ] = 0 ;
}
debounce_init ( MATRIX_ROWS ) ;
matrix_init_quantum ( ) ;
}
uint8_t matrix_scan ( void )
{
bool changed = false ;
# if defined(DIRECT_PINS) || (DIODE_DIRECTION == COL2ROW)
// Set row, read cols
for ( uint8_t current_row = 0 ; current_row < MATRIX_ROWS ; current_row + + ) {
changed | = read_cols_on_row ( raw_matrix , current_row ) ;
}
# elif (DIODE_DIRECTION == ROW2COL)
// Set col, read rows
for ( uint8_t current_col = 0 ; current_col < MATRIX_COLS ; current_col + + ) {
changed | = read_rows_on_col ( raw_matrix , current_col ) ;
}
# endif
debounce ( raw_matrix , matrix , MATRIX_ROWS , changed ) ;
matrix_scan_quantum ( ) ;
return 1 ;
}