diff options
| author | Louis Burda <quent.burda@gmail.com> | 2024-08-10 02:32:33 +0200 |
|---|---|---|
| committer | Louis Burda <quent.burda@gmail.com> | 2024-08-10 02:32:33 +0200 |
| commit | 4c462d0af136c244e2c2edf6f464c5f495f5b870 (patch) | |
| tree | 64c318c976e5bf3665a9d99a553b23fe4ae61d3a /src/keymat.c | |
| parent | 8e0fad10878f0e81b8ed4d00187309c5ba96287d (diff) | |
| download | sxkbd-4c462d0af136c244e2c2edf6f464c5f495f5b870.tar.gz sxkbd-4c462d0af136c244e2c2edf6f464c5f495f5b870.zip | |
Switch to event-triggered messaging
Diffstat (limited to 'src/keymat.c')
| -rw-r--r-- | src/keymat.c | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/src/keymat.c b/src/keymat.c index 4b78e16..a51bd52 100644 --- a/src/keymat.c +++ b/src/keymat.c @@ -2,13 +2,17 @@ #include "keymap.h" #include "split.h" +#include "util.h" + +#include "bsp/board.h" #include "pico/types.h" #include "hardware/gpio.h" #include "hardware/timer.h" -#include "util.h" #include <string.h> +#define DEBOUNCE_MS 5 + #ifdef BAD_GPIO_MITIGATION static const uint keymat_row_pins[] = { 4, 9, 6, 7 }; #else @@ -22,6 +26,8 @@ static_assert(ARRLEN(keymat_col_pins) == KEY_COLS); bool keymat_prev[KEY_ROWS][KEY_COLS]; bool keymat[KEY_ROWS][KEY_COLS]; +static uint32_t keymat_modt[KEY_ROWS_HALF][KEY_COLS]; + void keymat_init(void) { @@ -44,27 +50,37 @@ keymat_init(void) } } -void -keymat_next(void) -{ - memcpy(keymat_prev, keymat, sizeof(keymat)); -} - -void +bool keymat_scan(void) { bool (*keymat_half)[KEY_COLS]; + bool state, modified; + uint32_t now_ms; uint x, y; - keymat_half = KEYMAT_HALF(SPLIT_SIDE); + now_ms = board_millis(); + modified = false; + + memcpy(keymat_prev, keymat, sizeof(keymat)); + keymat_half = KEYMAT_HALF(keymat, SPLIT_SIDE); for (y = 0; y < KEY_ROWS_HALF; y++) { gpio_put(keymat_row_pins[y], 0); busy_wait_us(5); - for (x = 0; x < KEY_COLS; x++) - keymat_half[y][x] = !gpio_get(keymat_col_pins[x]); + for (x = 0; x < KEY_COLS; x++) { + if (keymat_modt[y][x] > now_ms - DEBOUNCE_MS) + continue; + state = !gpio_get(keymat_col_pins[x]); + if (state != keymat_half[y][x]) { + modified = true; + keymat_half[y][x] = state; + keymat_modt[y][x] = now_ms; + } + } gpio_put(keymat_row_pins[y], 1); busy_wait_us(5); } + + return modified; } uint32_t @@ -75,7 +91,7 @@ keymat_encode_half(int side) uint x, y; mask = 0; - keymat_half = KEYMAT_HALF(side); + keymat_half = KEYMAT_HALF(keymat, side); for (y = 0; y < KEY_ROWS_HALF; y++) { for (x = 0; x < KEY_COLS; x++) { if (keymat_half[y][x]) @@ -92,7 +108,7 @@ keymat_decode_half(int side, uint32_t mask) bool (*keymat_half)[KEY_COLS]; uint x, y; - keymat_half = KEYMAT_HALF(side); + keymat_half = KEYMAT_HALF(keymat, side); for (y = 0; y < KEY_ROWS_HALF; y++) { for (x = 0; x < KEY_COLS; x++) { keymat_half[y][x] = (mask >> (y * KEY_COLS + x)) & 1; |
