@ -14,10 +14,6 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program . If not , see < http : / / www . gnu . org / licenses / > .
*/
/*
* scan matrix
*/
# include <stdint.h>
# include <stdbool.h>
# include "wait.h"
@ -33,23 +29,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
# include "encoder.h"
# endif
# if (MATRIX_COLS <= 8)
# define print_matrix_header() print("\nr / c 01234567\n")
# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row))
# define matrix_bitpop(i) bitpop(matrix[i])
# define ROW_SHIFTER ((uint8_t)1)
# elif (MATRIX_COLS <= 16)
# define print_matrix_header() print("\nr / c 0123456789ABCDEF\n")
# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row))
# define matrix_bitpop(i) bitpop16(matrix[i])
# define ROW_SHIFTER ((uint16_t)1)
# elif (MATRIX_COLS <= 32)
# define print_matrix_header() print("\nr / c 0123456789ABCDEF0123456789ABCDEF\n")
# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row))
# define matrix_bitpop(i) bitpop32(matrix[i])
# define ROW_SHIFTER ((uint32_t)1)
# endif
# define ERROR_DISCONNECT_COUNT 5
# define ROWS_PER_HAND (MATRIX_ROWS / 2)
@ -62,58 +41,21 @@ static pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
# endif
/* matrix state(1:on, 0:off) */
static matrix_row_t matrix [ MATRIX_ROWS ] ;
static matrix_row_t raw_ matrix[ ROWS_PER_HAND ] ;
static matrix_row_t raw_ matrix[ MATRIX_ROWS ] ; / / raw values
static matrix_row_t matrix [ MATRIX_ ROWS] ; / / debounced values
/ / row offsets for each hand
uint8_t thisHand , thatHand ;
/ / user - defined overridable functions
__attribute__ ( ( weak ) ) void matrix_init_kb ( void ) { matrix_init_user ( ) ; }
__attribute__ ( ( weak ) ) void matrix_scan_kb ( void ) { matrix_scan_user ( ) ; }
__attribute__ ( ( weak ) ) void matrix_init_user ( void ) { }
__attribute__ ( ( weak ) ) void matrix_scan_user ( void ) { }
__attribute__ ( ( weak ) ) void matrix_slave_scan_user ( void ) { }
/ / helper functions
inline uint8_t matrix_rows ( void ) { return MATRIX_ROWS ; }
inline uint8_t matrix_cols ( void ) { return MATRIX_COLS ; }
bool matrix_is_modified ( void ) {
if ( debounce_active ( ) ) return false ;
return true ;
}
inline bool matrix_is_on ( uint8_t row , uint8_t col ) { return ( matrix [ row ] & ( ( matrix_row_t ) 1 < < col ) ) ; }
inline matrix_row_t matrix_get_row ( uint8_t row ) { return matrix [ row ] ; }
void matrix_print ( void ) {
print_matrix_header ( ) ;
for ( uint8_t row = 0 ; row < MATRIX_ROWS ; row + + ) {
phex ( row ) ;
print ( " : " ) ;
print_matrix_row ( row ) ;
print ( " \n " ) ;
}
}
uint8_t matrix_key_count ( void ) {
uint8_t count = 0 ;
for ( uint8_t i = 0 ; i < MATRIX_ROWS ; i + + ) {
count + = matrix_bitpop ( i ) ;
}
return count ;
}
/ / matrix code
# ifdef DIRECT_PINS
@ -136,7 +78,7 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
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 ) ;
current_matrix [ current_row ] | = readPin ( pin ) ? 0 : ( MATRIX_ ROW_SHIFTER < < col_index ) ;
}
}
@ -179,7 +121,7 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
/ / For each col . . .
for ( uint8_t col_index = 0 ; col_index < MATRIX_COLS ; col_index + + ) {
/ / Populate the matrix row with the state of the col pin
current_matrix [ current_row ] | = readPin ( col_pins [ col_index ] ) ? 0 : ( ROW_SHIFTER < < col_index ) ;
current_matrix [ current_row ] | = readPin ( col_pins [ col_index ] ) ? 0 : ( MATRIX_ ROW_SHIFTER < < col_index ) ;
}
/ / Unselect row
@ -225,10 +167,10 @@ static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
/ / Check row pin state
if ( readPin ( row_pins [ row_index ] ) ) {
/ / Pin HI , clear col bit
current_matrix [ row_index ] & = ~ ( ROW_SHIFTER < < current_col ) ;
current_matrix [ row_index ] & = ~ ( MATRIX_ ROW_SHIFTER < < current_col ) ;
} else {
/ / Pin LO , set col bit
current_matrix [ row_index ] | = ( ROW_SHIFTER < < current_col ) ;
current_matrix [ row_index ] | = ( MATRIX_ ROW_SHIFTER < < current_col ) ;
}
/ / Determine if the matrix changed state
@ -280,7 +222,8 @@ void matrix_init(void) {
/ / initialize matrix state : all keys off
for ( uint8_t i = 0 ; i < MATRIX_ROWS ; i + + ) {
matrix [ i ] = 0 ;
raw_matrix [ i ] = 0 ;
matrix [ i ] = 0 ;
}
debounce_init ( ROWS_PER_HAND ) ;
@ -288,29 +231,7 @@ void matrix_init(void) {
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 < ROWS_PER_HAND ; 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 + thisHand , ROWS_PER_HAND , changed ) ;
return ( uint8_t ) changed ;
}
uint8_t matrix_scan ( void ) {
uint8_t ret = _matrix_scan ( ) ;
void matrix_post_scan ( void ) {
if ( is_keyboard_master ( ) ) {
static uint8_t error_count ;
@ -335,6 +256,25 @@ uint8_t matrix_scan(void) {
# endif
matrix_slave_scan_user ( ) ;
}
}
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 < ROWS_PER_HAND ; 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
return ret ;
debounce ( raw_matrix , matrix + thisHand , ROWS_PER_HAND , changed ) ;
matrix_post_scan ( ) ;
return ( uint8_t ) changed ;
}