[Keyboard] Wasdat matrix cleanup (#7909)

* Wasdat matrix cleanup

* Use _custom functions

* More deduping, and signature fix
This commit is contained in:
fauxpark 2020-01-18 15:01:17 +11:00 committed by Drashna Jaelre
parent 3dd43d9cab
commit 055e940f06
2 changed files with 54 additions and 194 deletions

View File

@ -17,34 +17,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
#include "wait.h" #include "wait.h"
#include "print.h"
#include "debug.h"
#include "util.h" #include "util.h"
#include "matrix.h" #include "matrix.h"
#include "debounce.h" #include "debounce.h"
#include "quantum.h" #include "quantum.h"
#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
#ifdef MATRIX_MASKED
extern const matrix_row_t matrix_mask[];
#endif
#ifdef DIRECT_PINS #ifdef DIRECT_PINS
static pin_t direct_pins[MATRIX_ROWS][MATRIX_COLS] = DIRECT_PINS; static pin_t direct_pins[MATRIX_ROWS][MATRIX_COLS] = DIRECT_PINS;
#elif (DIODE_DIRECTION == ROW2COL) || (DIODE_DIRECTION == COL2ROW) #elif (DIODE_DIRECTION == ROW2COL) || (DIODE_DIRECTION == COL2ROW)
@ -52,150 +29,58 @@ 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
/* matrix state(1:on, 0:off) */ // matrix code
static matrix_row_t raw_matrix[MATRIX_ROWS]; //raw values
static matrix_row_t matrix[MATRIX_ROWS]; //debounced values
__attribute__ ((weak))
void matrix_init_quantum(void) {
matrix_init_kb();
}
__attribute__ ((weak))
void matrix_scan_quantum(void) {
matrix_scan_kb();
}
__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) {
}
inline
uint8_t matrix_rows(void) {
return MATRIX_ROWS;
}
inline
uint8_t matrix_cols(void) {
return MATRIX_COLS;
}
//Deprecated.
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)
{
// Matrix mask lets you disable switches in the returned matrix data. For example, if you have a
// switch blocker installed and the switch is always pressed.
#ifdef MATRIX_MASKED
return matrix[row] & matrix_mask[row];
#else
return matrix[row];
#endif
}
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;
}
#ifdef DIRECT_PINS #ifdef DIRECT_PINS
static void init_pins(void) { static void init_pins(void) {
for (int row = 0; row < MATRIX_ROWS; row++) { for (int row = 0; row < MATRIX_ROWS; row++) {
for (int col = 0; col < MATRIX_COLS; col++) { for (int col = 0; col < MATRIX_COLS; col++) {
pin_t pin = direct_pins[row][col]; pin_t pin = direct_pins[row][col];
if (pin != NO_PIN) { if (pin != NO_PIN) {
setPinInputHigh(pin); setPinInputHigh(pin);
} }
}
} }
}
} }
static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) { 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]; matrix_row_t last_row_value = current_matrix[current_row];
current_matrix[current_row] = 0; current_matrix[current_row] = 0;
for (uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { for (uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) {
pin_t pin = direct_pins[current_row][col_index]; pin_t pin = direct_pins[current_row][col_index];
if (pin != NO_PIN) { 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);
}
} }
}
return (last_row_value != current_matrix[current_row]); return (last_row_value != current_matrix[current_row]);
} }
#elif (DIODE_DIRECTION == COL2ROW) #elif (DIODE_DIRECTION == COL2ROW)
static void select_row(uint8_t row) static void select_row(uint8_t row) {
{
setPinOutput(row_pins[row]); setPinOutput(row_pins[row]);
writePinLow(row_pins[row]); writePinLow(row_pins[row]);
} }
static void unselect_row(uint8_t row) static void unselect_row(uint8_t row) { setPinInputHigh(row_pins[row]); }
{
setPinInputHigh(row_pins[row]);
}
static void unselect_rows(void) static void unselect_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]);
} }
} }
static void init_pins(void) { static void init_pins(void) {
unselect_rows(); 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]);
} }
} }
static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) {
{
// Store last value of row prior to reading // Store last value of row prior to reading
matrix_row_t last_row_value = current_matrix[current_row]; matrix_row_t last_row_value = current_matrix[current_row];
@ -207,13 +92,13 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
wait_us(30); wait_us(30);
// For each col... // For each col...
for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { for (uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) {
// Select the col pin to read (active low) // Select the col pin to read (active low)
uint8_t pin_state = readPin(col_pins[col_index]); uint8_t pin_state = readPin(col_pins[col_index]);
// Populate the matrix row with the state of the col pin // Populate the matrix row with the state of the col pin
current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index); current_matrix[current_row] |= pin_state ? 0 : (MATRIX_ROW_SHIFTER << col_index);
} }
// Unselect row // Unselect row
@ -245,8 +130,7 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
* col 14: B7 * col 14: B7
* col 15: B3 * col 15: B3
*/ */
static void select_col(uint8_t col) static void select_col(uint8_t col) {
{
switch (col) { switch (col) {
case 0: case 0:
writePinLow(C7); writePinLow(C7);
@ -304,8 +188,7 @@ static void select_col(uint8_t col)
} }
} }
static void unselect_col(uint8_t col) static void unselect_col(uint8_t col) {
{
switch (col) { switch (col) {
case 0: case 0:
writePinHigh(C7); writePinHigh(C7);
@ -363,8 +246,7 @@ static void unselect_col(uint8_t col)
} }
} }
static void unselect_cols(void) static void unselect_cols(void) {
{
//Native //Native
setPinOutput(D3); setPinOutput(D3);
setPinOutput(D7); setPinOutput(D7);
@ -397,14 +279,13 @@ static void unselect_cols(void)
} }
static void init_pins(void) { static void init_pins(void) {
unselect_cols(); unselect_cols();
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]);
} }
} }
static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) {
{
bool matrix_changed = false; bool matrix_changed = false;
// Select col and wait for col selecton to stabilize // Select col and wait for col selecton to stabilize
@ -412,27 +293,21 @@ static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
wait_us(30); wait_us(30);
// For each row... // For each row...
for(uint8_t row_index = 0; row_index < MATRIX_ROWS; row_index++) for (uint8_t row_index = 0; row_index < MATRIX_ROWS; row_index++) {
{
// Store last value of row prior to reading // Store last value of row prior to reading
matrix_row_t last_row_value = current_matrix[row_index]; matrix_row_t last_row_value = current_matrix[row_index];
// Check row pin state // Check row pin state
if (readPin(row_pins[row_index]) == 0) if (readPin(row_pins[row_index]) == 0) {
{
// Pin LO, set col bit // Pin LO, set col bit
current_matrix[row_index] |= (ROW_SHIFTER << current_col); current_matrix[row_index] |= (MATRIX_ROW_SHIFTER << current_col);
} } else {
else
{
// Pin HI, clear col bit // Pin HI, clear 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 // Determine if the matrix changed state
if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) {
{
matrix_changed = true; matrix_changed = true;
} }
} }
@ -445,40 +320,25 @@ static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
#endif #endif
void matrix_init(void) { void matrix_init_custom(void) {
// initialize key pins // initialize key pins
init_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 matrix_scan_custom(matrix_row_t current_matrix[]) {
{ bool changed = false;
bool changed = false;
#if defined(DIRECT_PINS) || (DIODE_DIRECTION == COL2ROW) #if defined(DIRECT_PINS) || (DIODE_DIRECTION == COL2ROW)
// Set row, read cols // Set row, read cols
for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) { for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) {
changed |= read_cols_on_row(raw_matrix, current_row); changed |= read_cols_on_row(current_matrix, current_row);
} }
#elif (DIODE_DIRECTION == ROW2COL) #elif (DIODE_DIRECTION == ROW2COL)
// Set col, read rows // Set col, read rows
for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) {
changed |= read_rows_on_col(raw_matrix, current_col); changed |= read_rows_on_col(current_matrix, current_col);
} }
#endif #endif
debounce(raw_matrix, matrix, MATRIX_ROWS, changed); return changed;
matrix_scan_quantum();
return (uint8_t)changed;
} }

View File

@ -31,7 +31,7 @@ AUDIO_ENABLE = no # Audio output on port C6
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
HD44780_ENABLE = no # Enable support for HD44780 based LCDs HD44780_ENABLE = no # Enable support for HD44780 based LCDs
CUSTOM_MATRIX = yes CUSTOM_MATRIX = lite
SRC += matrix.c SRC += matrix.c
LAYOUTS = fullsize_ansi fullsize_iso tkl_ansi tkl_iso LAYOUTS = fullsize_ansi fullsize_iso tkl_ansi tkl_iso