@ -45,7 +45,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
extern const matrix_row_t matrix_mask [ ] ;
extern const matrix_row_t matrix_mask [ ] ;
# endif
# 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 row_pins [ MATRIX_ROWS ] = MATRIX_ROW_PINS ;
static const pin_t col_pins [ MATRIX_COLS ] = MATRIX_COL_PINS ;
static const pin_t col_pins [ MATRIX_COLS ] = MATRIX_COL_PINS ;
# endif
# 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 raw_matrix [ MATRIX_ROWS ] ; //raw values
static matrix_row_t matrix [ MATRIX_ROWS ] ; //debounced 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 ) )
__attribute__ ( ( weak ) )
void matrix_init_quantum ( void ) {
void matrix_init_quantum ( void ) {
matrix_init_kb ( ) ;
matrix_init_kb ( ) ;
@ -106,49 +94,6 @@ uint8_t matrix_cols(void) {
return MATRIX_COLS ;
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.
//Deprecated.
bool matrix_is_modified ( void )
bool matrix_is_modified ( void )
{
{
@ -195,11 +140,55 @@ 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 ) ;
}
}
}
}
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 ;
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)
# if (DIODE_DIRECTION == COL2ROW)
static void select_row ( uint8_t row )
{
setPinOutput ( row_pins [ row ] ) ;
writePinLow ( row_pins [ row ] ) ;
}
static void unselect_row ( uint8_t row )
{
setPinInputHigh ( row_pins [ row ] ) ;
}
static void init_cols ( void )
static void unselect_row s( 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 + + ) {
for ( uint8_t x = 0 ; x < MATRIX_COLS ; x + + ) {
setPinInputHigh ( col_pins [ x ] ) ;
setPinInputHigh ( col_pins [ x ] ) ;
}
}
@ -233,28 +222,28 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
return ( last_row_value ! = current_matrix [ 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 ] ) ;
setPinOutput ( col_pins[ col ] ) ;
writePinLow ( row_pins[ row ] ) ;
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 + + ) {
for ( uint8_t x = 0 ; x < MATRIX_ COL S; x + + ) {
setPinInput ( row _pins[ x ] ) ;
setPinInput High( col _pins[ x ] ) ;
}
}
}
}
# elif (DIODE_DIRECTION == ROW2COL)
static void init_pins ( void ) {
unselect_cols ( ) ;
static void init_rows ( void )
{
for ( uint8_t x = 0 ; x < MATRIX_ROWS ; x + + ) {
for ( uint8_t x = 0 ; x < MATRIX_ROWS ; x + + ) {
setPinInputHigh ( row_pins [ x ] ) ;
setPinInputHigh ( row_pins [ x ] ) ;
}
}
@ -300,22 +289,42 @@ static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
return matrix_changed ;
return matrix_changed ;
}
}
static void select_col ( uint8_t col )
# endif
{
setPinOutput ( col_pins [ col ] ) ;
void matrix_init ( void ) {
writePinLow ( col_pins [ col ] ) ;
// 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 ;
}
}
static void unselect_col ( uint8_t col )
debounce_init ( MATRIX_ROWS ) ;
{
setPinInputHigh ( col_pins [ col ] ) ;
matrix_init_quantum( ) ;
}
}
static void unselect_cols ( void )
uint8_t matrix_scan ( void )
{
{
for ( uint8_t x = 0 ; x < MATRIX_COLS ; x + + ) {
bool changed = false ;
setPinInputHigh ( col_pins [ x ] ) ;
# 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
# endif
debounce ( raw_matrix , matrix , MATRIX_ROWS , changed ) ;
matrix_scan_quantum ( ) ;
return 1 ;
}