aboutsummaryrefslogtreecommitdiffstats
path: root/src/keymat.c
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2022-12-18 18:12:21 +0100
committerLouis Burda <quent.burda@gmail.com>2022-12-18 18:12:21 +0100
commit8e60c68eac5dbe749c80d1b42160ad1f7de42200 (patch)
tree31ee21c5ef4b31d2eac09909136d976b71771529 /src/keymat.c
parent4995cfc61e7d2d0c05cf493959456b5bc9a74f19 (diff)
downloadsxkbd-8e60c68eac5dbe749c80d1b42160ad1f7de42200.tar.gz
sxkbd-8e60c68eac5dbe749c80d1b42160ad1f7de42200.zip
Added layer switching and debouncing
Diffstat (limited to 'src/keymat.c')
-rw-r--r--src/keymat.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/src/keymat.c b/src/keymat.c
index f511a6b..ebdba3a 100644
--- a/src/keymat.c
+++ b/src/keymat.c
@@ -10,11 +10,11 @@
static const uint keymat_row_pins[] = { 4, 5, 6, 7 };
static const uint keymat_col_pins[] = { 29, 28, 27, 26, 22, 20 };
-static_assert(ARRLEN(keymat_row_pins) == KEY_ROWS);
+static_assert(ARRLEN(keymat_row_pins) == KEY_ROWS_HALF);
static_assert(ARRLEN(keymat_col_pins) == KEY_COLS);
-bool keymat_prev[KEY_ROWS * 2][KEY_COLS];
-bool keymat[KEY_ROWS * 2][KEY_COLS];
+bool keymat_prev[KEY_ROWS][KEY_COLS];
+bool keymat[KEY_ROWS][KEY_COLS];
void
keymat_init(void)
@@ -27,22 +27,26 @@ keymat_init(void)
gpio_pull_up(keymat_col_pins[x]);
}
- for (y = 0; y < KEY_ROWS; y++) {
+ for (y = 0; y < KEY_ROWS_HALF; y++) {
gpio_init(keymat_row_pins[y]);
gpio_set_dir(keymat_row_pins[y], GPIO_OUT);
}
}
void
+keymat_next(void)
+{
+ memcpy(keymat_prev, keymat, sizeof(keymat));
+}
+
+void
keymat_scan(void)
{
bool (*keymat_half)[KEY_COLS];
uint x, y;
- memcpy(keymat_prev, keymat, sizeof(keymat));
-
keymat_half = KEYMAT_HALF(SPLIT_SIDE);
- for (y = 0; y < KEY_ROWS; y++) {
+ 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++)
@@ -61,7 +65,7 @@ keymat_encode_half(int side)
mask = 0;
keymat_half = KEYMAT_HALF(side);
- for (y = 0; y < KEY_ROWS; y++) {
+ for (y = 0; y < KEY_ROWS_HALF; y++) {
for (x = 0; x < KEY_COLS; x++) {
if (keymat_half[y][x])
mask |= 1 << (y * KEY_COLS + x);
@@ -78,7 +82,7 @@ keymat_decode_half(int side, uint32_t mask)
uint x, y;
keymat_half = KEYMAT_HALF(side);
- for (y = 0; y < KEY_ROWS; y++) {
+ 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;
}