X-Git-Url: https://git.friedersdorff.com/?a=blobdiff_plain;f=keyboard%2Fgh60%2Fmatrix.c;h=451e541a4f3e1480652268ba400828c71d0612c5;hb=c2e8c0d43ead80d466d6ca892378b4f46b2ff1b1;hp=1a774e17efc0f4287afb34e68d834d8c28912e62;hpb=67c64db1ccbc91393a4535636333ea55396c184d;p=max%2Ftmk_keyboard.git diff --git a/keyboard/gh60/matrix.c b/keyboard/gh60/matrix.c index 1a774e17..451e541a 100644 --- a/keyboard/gh60/matrix.c +++ b/keyboard/gh60/matrix.c @@ -25,38 +25,27 @@ along with this program. If not, see . #include "print.h" #include "debug.h" #include "util.h" +#include "timer.h" #include "matrix.h" #ifndef DEBOUNCE # define DEBOUNCE 5 #endif -static uint8_t debouncing = DEBOUNCE; +static bool debouncing = false; +static uint16_t debouncing_time = 0; -// matrix state buffer(1:on, 0:off) -static uint16_t *matrix; -static uint16_t *matrix_prev; -static uint16_t _matrix0[MATRIX_ROWS]; -static uint16_t _matrix1[MATRIX_ROWS]; -static uint16_t read_cols(void); +/* matrix state(1:on, 0:off) */ +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +static matrix_row_t read_cols(void); static void init_cols(void); static void unselect_rows(void); static void select_row(uint8_t row); -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - void matrix_init(void) { // initialize row and col @@ -64,94 +53,49 @@ void matrix_init(void) init_cols(); // initialize matrix state: all keys off - for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0; - for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0; - matrix = _matrix0; - matrix_prev = _matrix1; + for (uint8_t i=0; i < MATRIX_ROWS; i++) { + matrix[i] = 0; + matrix_debouncing[i] = 0; + } } uint8_t matrix_scan(void) { - if (!debouncing) { - uint16_t *tmp = matrix_prev; - matrix_prev = matrix; - matrix = tmp; - } - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - unselect_rows(); select_row(i); - _delay_us(1); // without this wait read unstable value. - uint16_t cols = read_cols(); - if (matrix[i] != cols) { - matrix[i] = cols; + _delay_us(1); // delay for settling + matrix_row_t cols = read_cols(); + if (matrix_debouncing[i] != cols) { if (debouncing) { - debug("bounce!: "); debug_hex(debouncing); print("\n"); + dprintf("bounce: %d %d@%02X\n", timer_elapsed(debouncing_time), i, matrix_debouncing[i]^cols); } - debouncing = DEBOUNCE; + matrix_debouncing[i] = cols; + debouncing = true; + debouncing_time = timer_read(); } + unselect_rows(); } - unselect_rows(); - - if (debouncing) { - debouncing--; - _delay_ms(1); // improved affect on bouncing - } - - return 1; -} -bool matrix_is_modified(void) -{ - if (debouncing) return false; - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - if (matrix[i] != matrix_prev[i]) { - return true; + if (debouncing && timer_elapsed(debouncing_time) >= DEBOUNCE) { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = matrix_debouncing[i]; } + debouncing = false; } - return false; -} - -inline -bool matrix_has_ghost(void) -{ - return false; -} -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & (1<