From aa6f838f53449a90cb57b1db658287cbac9fe3c2 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Wed, 12 Feb 2020 13:53:14 -0700 Subject: [PATCH] Add printscreen support as a combo --- src/board/system76/darp5/kbscan.c | 166 +++++++++++------- src/board/system76/darp5/keymap/default.c | 4 +- src/board/system76/galp3-c/kbscan.c | 181 +++++++++++++------- src/board/system76/galp3-c/keymap/default.c | 4 +- src/board/system76/galp3-c/keymap/jeremy.c | 4 +- src/board/system76/lemp9/kbscan.c | 181 +++++++++++++------- src/board/system76/lemp9/keymap/default.c | 4 +- src/board/system76/lemp9/keymap/jeremy.c | 4 +- 8 files changed, 348 insertions(+), 200 deletions(-) diff --git a/src/board/system76/darp5/kbscan.c b/src/board/system76/darp5/kbscan.c index 6752a6e..013368b 100644 --- a/src/board/system76/darp5/kbscan.c +++ b/src/board/system76/darp5/kbscan.c @@ -28,6 +28,72 @@ void kbscan_init(void) { // Debounce time in milliseconds #define DEBOUNCE_DELAY 20 +bool kbscan_press(uint16_t key, bool pressed, uint8_t * layer) { + switch (key & KT_MASK) { + case (KT_NORMAL): + if (kbscan_enabled) { + kbc_scancode(&KBC, key, pressed); + } + break; + case (KT_FN): + if (layer != NULL) { + if (pressed) *layer = 1; + else *layer = 0; + } else { + // In the case no layer can be set, reset bit + return false; + } + break; + case (KT_COMBO): + switch (key & 0xFF) { + case COMBO_PRINT_SCREEN: + if (kbscan_enabled) { + if (pressed) { + kbc_scancode(&KBC, K_E0 | 0x12, pressed); + kbc_scancode(&KBC, K_E0 | 0x7C, pressed); + } else { + kbc_scancode(&KBC, K_E0 | 0x7C, pressed); + kbc_scancode(&KBC, K_E0 | 0x12, pressed); + } + } + break; + } + break; + case (KT_SCI): + if (pressed) { + uint8_t sci = (uint8_t)(key & 0xFF); + + // HACK FOR HARDWARE HOTKEYS + switch (sci) { + case SCI_DISPLAY_TOGGLE: + gpio_set(&BKL_EN, !gpio_get(&BKL_EN)); + break; + case SCI_CAMERA_TOGGLE: + gpio_set(&CCD_EN, !gpio_get(&CCD_EN)); + break; + } + + if (!pmc_sci(&PMC_1, sci)) { + // In the case of ignored SCI, reset bit + return false; + } + } + break; + case (KT_SCI_EXTRA): + if (pressed) { + uint8_t sci = SCI_EXTRA; + sci_extra = (uint8_t)(key & 0xFF); + + if (!pmc_sci(&PMC_1, sci)) { + // In the case of ignored SCI, reset bit + return false; + } + } + break; + } + return true; +} + void kbscan_event(void) { static uint8_t kbscan_layer = 0; uint8_t layer = kbscan_layer; @@ -86,66 +152,37 @@ void kbscan_event(void) { bool new_b = new & (1 << j); bool last_b = last & (1 << j); if (new_b != last_b) { + bool reset = false; + // If debouncing if (debounce) { // Debounce presses and releases - if (new_b) { - // Restore bit, so that this press can be handled later - new &= ~(1 << j); - } else { - // Restore bit, so that this release can be handled later - new |= (1 << j); - } - // Skip processing of press - continue; + reset = true; } else { // Begin debounce debounce = true; debounce_time = time_get(); + + // Handle key press/release + uint16_t key = keymap(i, j, kbscan_layer); + if (key) { + DEBUG("KB %d, %d, %d = 0x%04X, %d\n", i, j, kbscan_layer, key, new_b); + if(!kbscan_press(key, new_b, &layer)){ + // In the case of ignored key press/release, reset bit + reset = true; + } + } else { + WARN("KB %d, %d, %d missing\n", i, j, kbscan_layer); + } } - uint16_t key = keymap(i, j, kbscan_layer); - DEBUG("KB %d, %d, %d = 0x%04X, %d\n", i, j, kbscan_layer, key, new_b); - if (!key) { - WARN("KB %d, %d, %d missing\n", i, j, kbscan_layer); - } - switch (key & KT_MASK) { - case (KT_FN): - if (new_b) layer = 1; - else layer = 0; - break; - case (KT_SCI_EXTRA): - if (new_b) { - uint8_t sci = SCI_EXTRA; - sci_extra = (uint8_t)(key & 0xFF); - if (!pmc_sci(&PMC_1, sci)) { - // In the case of ignored SCI, reset bit - new &= ~(1 << j); - } - } - break; - case (KT_SCI): - if (new_b) { - uint8_t sci = (uint8_t)(key & 0xFF); - - // HACK FOR HARDWARE HOTKEYS - switch (sci) { - case SCI_CAMERA_TOGGLE: - gpio_set(&CCD_EN, !gpio_get(&CCD_EN)); - break; - } - - if (!pmc_sci(&PMC_1, sci)) { - // In the case of ignored SCI, reset bit - new &= ~(1 << j); - } - } - break; - case (KT_NORMAL): - if (kbscan_enabled && key) { - kbc_scancode(&KBC, key, new_b); - } - break; + // Reset bit to last state + if (reset) { + if (last_b) { + new |= (1 << j); + } else { + new &= ~(1 << j); + } } } } @@ -167,14 +204,27 @@ void kbscan_event(void) { bool new_b = new & (1 << j); bool last_b = last & (1 << j); if (new_b != last_b) { + bool reset = false; + + // Handle key press/release uint16_t key = keymap(i, j, kbscan_layer); - DEBUG("KB %d, %d, %d = 0x%04X, %d\n", i, j, kbscan_layer, key, new_b); - switch (key & KT_MASK) { - case (KT_NORMAL): - if (kbscan_enabled && key) { - kbc_scancode(&KBC, key, new_b); - } - break; + if (key) { + DEBUG("KB %d, %d, %d = 0x%04X, %d\n", i, j, kbscan_layer, key, new_b); + if(!kbscan_press(key, new_b, NULL)){ + // In the case of ignored key press/release, reset bit + reset = true; + } + } else { + WARN("KB %d, %d, %d missing\n", i, j, kbscan_layer); + } + + // Reset bit to last state + if (reset) { + if (last_b) { + new |= (1 << j); + } else { + new &= ~(1 << j); + } } } } diff --git a/src/board/system76/darp5/keymap/default.c b/src/board/system76/darp5/keymap/default.c index a1b2b51..e9bde89 100644 --- a/src/board/system76/darp5/keymap/default.c +++ b/src/board/system76/darp5/keymap/default.c @@ -4,7 +4,7 @@ uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN] = { LAYOUT( - K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, 0 /*prtsc*/, K_INSERT, K_DEL, K_HOME, K_END, K_PGUP, K_PGDN, + K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_PRINT_SCREEN, K_INSERT, K_DEL, K_HOME, K_END, K_PGUP, K_PGDN, K_TICK, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_NUM_LOCK, K_NUM_SLASH, K_NUM_ASTERISK, K_NUM_MINUS, K_TAB, K_Q, K_W, K_E, K_R, K_T, K_Y, K_U, K_I, K_O, K_P, K_BRACE_OPEN, K_BRACE_CLOSE, K_BACKSLASH, K_NUM_7, K_NUM_8, K_NUM_9, K_NUM_PLUS, K_CAPS, K_A, K_S, K_D, K_F, K_G, K_H, K_J, K_K, K_L, K_SEMICOLON, K_QUOTE, K_ENTER, K_NUM_4, K_NUM_5, K_NUM_6, @@ -12,7 +12,7 @@ LAYOUT( K_LEFT_CTRL, KT_FN, K_LEFT_SUPER, K_LEFT_ALT, K_SPACE, K_RIGHT_ALT, K_APP, K_RIGHT_CTRL, K_LEFT, K_DOWN, K_RIGHT, K_NUM_0, K_NUM_PERIOD ), LAYOUT( - K_ESC, K_TOUCHPAD, K_F2, K_MUTE, K_F4, K_VOLUME_DOWN, K_VOLUME_UP, K_F7, KT_SCI | SCI_BRIGHTNESS_DOWN, KT_SCI | SCI_BRIGHTNESS_UP, KT_SCI | SCI_CAMERA_TOGGLE, KT_SCI | SCI_AIRPLANE_MODE, KT_SCI | SCI_SUSPEND, 0 /*prtsc*/, K_INSERT, K_DEL, K_HOME, K_END, K_PGUP, K_PGDN, + K_ESC, K_TOUCHPAD, KT_SCI | SCI_DISPLAY_TOGGLE, K_MUTE, K_F4, K_VOLUME_DOWN, K_VOLUME_UP, K_F7, KT_SCI | SCI_BRIGHTNESS_DOWN, KT_SCI | SCI_BRIGHTNESS_UP, KT_SCI | SCI_CAMERA_TOGGLE, KT_SCI | SCI_AIRPLANE_MODE, KT_SCI | SCI_SUSPEND, K_PRINT_SCREEN, K_INSERT, K_DEL, K_HOME, K_END, K_PGUP, K_PGDN, K_PLAY_PAUSE, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_NUM_LOCK, K_NUM_SLASH, K_NUM_ASTERISK, K_NUM_MINUS, K_TAB, K_Q, K_W, K_E, K_R, K_T, K_Y, K_U, K_I, K_O, K_P, K_BRACE_OPEN, K_BRACE_CLOSE, K_BACKSLASH, K_NUM_7, K_NUM_8, K_NUM_9, K_NUM_PLUS, K_CAPS, K_A, K_S, K_D, K_F, K_G, K_H, K_J, K_K, K_L, K_SEMICOLON, K_QUOTE, K_ENTER, K_NUM_4, K_NUM_5, K_NUM_6, diff --git a/src/board/system76/galp3-c/kbscan.c b/src/board/system76/galp3-c/kbscan.c index 787fbc4..77f2582 100644 --- a/src/board/system76/galp3-c/kbscan.c +++ b/src/board/system76/galp3-c/kbscan.c @@ -29,6 +29,79 @@ void kbscan_init(void) { // Debounce time in milliseconds #define DEBOUNCE_DELAY 20 +bool kbscan_press(uint16_t key, bool pressed, uint8_t * layer) { + switch (key & KT_MASK) { + case (KT_NORMAL): + if (kbscan_enabled) { + kbc_scancode(&KBC, key, pressed); + } + break; + case (KT_FN): + if (layer != NULL) { + if (pressed) *layer = 1; + else *layer = 0; + } else { + // In the case no layer can be set, reset bit + return false; + } + break; + case (KT_COMBO): + switch (key & 0xFF) { + case COMBO_PRINT_SCREEN: + if (kbscan_enabled) { + if (pressed) { + kbc_scancode(&KBC, K_E0 | 0x12, pressed); + kbc_scancode(&KBC, K_E0 | 0x7C, pressed); + } else { + kbc_scancode(&KBC, K_E0 | 0x7C, pressed); + kbc_scancode(&KBC, K_E0 | 0x12, pressed); + } + } + break; + } + break; + case (KT_SCI): + if (pressed) { + uint8_t sci = (uint8_t)(key & 0xFF); + + // HACK FOR HARDWARE HOTKEYS + switch (sci) { + case SCI_DISPLAY_TOGGLE: + gpio_set(&BKL_EN, !gpio_get(&BKL_EN)); + break; + case SCI_CAMERA_TOGGLE: + gpio_set(&CCD_EN, !gpio_get(&CCD_EN)); + break; + } + + if (!pmc_sci(&PMC_1, sci)) { + // In the case of ignored SCI, reset bit + return false; + } + } + break; + case (KT_SCI_EXTRA): + if (pressed) { + uint8_t sci = SCI_EXTRA; + sci_extra = (uint8_t)(key & 0xFF); + + // HACK FOR HARDWARE HOTKEYS + switch (sci_extra) { + case SCI_EXTRA_KBD_BKL: + kbled_set(kbled_get() + 1); + break; + } + + if (!pmc_sci(&PMC_1, sci)) { + // In the case of ignored SCI, reset bit + return false; + } + } + break; + } + return true; +} + void kbscan_event(void) { static uint8_t kbscan_layer = 0; uint8_t layer = kbscan_layer; @@ -78,74 +151,37 @@ void kbscan_event(void) { bool new_b = new & (1 << j); bool last_b = last & (1 << j); if (new_b != last_b) { + bool reset = false; + // If debouncing if (debounce) { // Debounce presses and releases - if (new_b) { - // Restore bit, so that this press can be handled later - new &= ~(1 << j); - } else { - // Restore bit, so that this release can be handled later - new |= (1 << j); - } - // Skip processing of press - continue; + reset = true; } else { // Begin debounce debounce = true; debounce_time = time_get(); + + // Handle key press/release + uint16_t key = keymap(i, j, kbscan_layer); + if (key) { + DEBUG("KB %d, %d, %d = 0x%04X, %d\n", i, j, kbscan_layer, key, new_b); + if(!kbscan_press(key, new_b, &layer)){ + // In the case of ignored key press/release, reset bit + reset = true; + } + } else { + WARN("KB %d, %d, %d missing\n", i, j, kbscan_layer); + } } - uint16_t key = keymap(i, j, kbscan_layer); - DEBUG("KB %d, %d, %d = 0x%04X, %d\n", i, j, kbscan_layer, key, new_b); - if (!key) { - WARN("KB %d, %d, %d missing\n", i, j, kbscan_layer); - } - switch (key & KT_MASK) { - case (KT_FN): - if (new_b) layer = 1; - else layer = 0; - break; - case (KT_SCI_EXTRA): - if (new_b) { - uint8_t sci = SCI_EXTRA; - sci_extra = (uint8_t)(key & 0xFF); - - // HACK FOR HARDWARE HOTKEYS - switch (sci_extra) { - case SCI_EXTRA_KBD_BKL: - kbled_set(kbled_get() + 1); - break; - } - - if (!pmc_sci(&PMC_1, sci)) { - // In the case of ignored SCI, reset bit - new &= ~(1 << j); - } - } - break; - case (KT_SCI): - if (new_b) { - uint8_t sci = (uint8_t)(key & 0xFF); - - // HACK FOR HARDWARE HOTKEYS - switch (sci) { - case SCI_CAMERA_TOGGLE: - gpio_set(&CCD_EN, !gpio_get(&CCD_EN)); - break; - } - - if (!pmc_sci(&PMC_1, sci)) { - // In the case of ignored SCI, reset bit - new &= ~(1 << j); - } - } - break; - case (KT_NORMAL): - if (kbscan_enabled && key) { - kbc_scancode(&KBC, key, new_b); - } - break; + // Reset bit to last state + if (reset) { + if (last_b) { + new |= (1 << j); + } else { + new &= ~(1 << j); + } } } } @@ -167,14 +203,27 @@ void kbscan_event(void) { bool new_b = new & (1 << j); bool last_b = last & (1 << j); if (new_b != last_b) { + bool reset = false; + + // Handle key press/release uint16_t key = keymap(i, j, kbscan_layer); - DEBUG("KB %d, %d, %d = 0x%04X, %d\n", i, j, kbscan_layer, key, new_b); - switch (key & KT_MASK) { - case (KT_NORMAL): - if (kbscan_enabled && key) { - kbc_scancode(&KBC, key, new_b); - } - break; + if (key) { + DEBUG("KB %d, %d, %d = 0x%04X, %d\n", i, j, kbscan_layer, key, new_b); + if(!kbscan_press(key, new_b, NULL)){ + // In the case of ignored key press/release, reset bit + reset = true; + } + } else { + WARN("KB %d, %d, %d missing\n", i, j, kbscan_layer); + } + + // Reset bit to last state + if (reset) { + if (last_b) { + new |= (1 << j); + } else { + new &= ~(1 << j); + } } } } diff --git a/src/board/system76/galp3-c/keymap/default.c b/src/board/system76/galp3-c/keymap/default.c index dacca19..431d96e 100644 --- a/src/board/system76/galp3-c/keymap/default.c +++ b/src/board/system76/galp3-c/keymap/default.c @@ -4,7 +4,7 @@ uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN] = { LAYOUT( - K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, 0 /*prtsc*/, 0 /* pause */, K_INSERT, K_DEL, + K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_PRINT_SCREEN, 0 /* pause */, K_INSERT, K_DEL, K_TICK, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_HOME, K_TAB, K_Q, K_W, K_E, K_R, K_T, K_Y, K_U, K_I, K_O, K_P, K_BRACE_OPEN, K_BRACE_CLOSE, K_BACKSLASH, K_PGUP, K_CAPS, K_A, K_S, K_D, K_F, K_G, K_H, K_J, K_K, K_L, K_SEMICOLON, K_QUOTE, K_ENTER, K_PGDN, @@ -12,7 +12,7 @@ LAYOUT( K_LEFT_CTRL, KT_FN, K_LEFT_SUPER, K_LEFT_ALT, K_SPACE, K_RIGHT_ALT, K_APP, K_RIGHT_CTRL, K_LEFT, K_DOWN, K_RIGHT ), LAYOUT( - K_ESC, K_TOUCHPAD, K_F2, K_MUTE, KT_SCI_EXTRA | SCI_EXTRA_KBD_BKL, K_VOLUME_DOWN, K_VOLUME_UP, K_F7, KT_SCI | SCI_BRIGHTNESS_DOWN, KT_SCI | SCI_BRIGHTNESS_UP, KT_SCI | SCI_CAMERA_TOGGLE, KT_SCI | SCI_AIRPLANE_MODE, KT_SCI | SCI_SUSPEND, 0 /*prtsc*/, 0 /*pause*/, K_INSERT, K_DEL, + K_ESC, K_TOUCHPAD, KT_SCI | SCI_DISPLAY_TOGGLE, K_MUTE, KT_SCI_EXTRA | SCI_EXTRA_KBD_BKL, K_VOLUME_DOWN, K_VOLUME_UP, K_F7, KT_SCI | SCI_BRIGHTNESS_DOWN, KT_SCI | SCI_BRIGHTNESS_UP, KT_SCI | SCI_CAMERA_TOGGLE, KT_SCI | SCI_AIRPLANE_MODE, KT_SCI | SCI_SUSPEND, K_PRINT_SCREEN, 0 /*pause*/, K_INSERT, K_DEL, K_PLAY_PAUSE, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_HOME, K_TAB, K_Q, K_W, K_E, K_R, K_T, K_Y, K_U, K_I, K_O, K_P, K_BRACE_OPEN, K_BRACE_CLOSE, K_BACKSLASH, K_PGUP, K_CAPS, K_A, K_S, K_D, K_F, K_G, K_H, K_J, K_K, K_L, K_SEMICOLON, K_QUOTE, K_ENTER, K_PGDN, diff --git a/src/board/system76/galp3-c/keymap/jeremy.c b/src/board/system76/galp3-c/keymap/jeremy.c index 340e295..4457689 100644 --- a/src/board/system76/galp3-c/keymap/jeremy.c +++ b/src/board/system76/galp3-c/keymap/jeremy.c @@ -4,7 +4,7 @@ uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN] = { LAYOUT( - K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, 0 /*prtsc*/, 0 /* pause */, K_INSERT, K_DEL, + K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_PRINT_SCREEN, 0 /* pause */, K_INSERT, K_DEL, K_TICK, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_HOME, K_TAB, K_Q, K_W, K_E, K_R, K_T, K_Y, K_U, K_I, K_O, K_P, K_BRACE_OPEN, K_BRACE_CLOSE, K_BACKSLASH, K_PGUP, KT_FN, K_A, K_S, K_D, K_F, K_G, K_H, K_J, K_K, K_L, K_SEMICOLON, K_QUOTE, K_ENTER, K_PGDN, @@ -12,7 +12,7 @@ LAYOUT( K_LEFT_CTRL, KT_FN, K_LEFT_ALT, K_LEFT_SUPER, K_SPACE, KT_FN, K_RIGHT_ALT, K_RIGHT_CTRL, K_LEFT, K_DOWN, K_RIGHT ), LAYOUT( - K_ESC, K_TOUCHPAD, K_F2, K_MUTE, KT_SCI_EXTRA | SCI_EXTRA_KBD_BKL, K_VOLUME_DOWN, K_VOLUME_UP, K_F7, KT_SCI | SCI_BRIGHTNESS_DOWN, KT_SCI | SCI_BRIGHTNESS_UP, KT_SCI | SCI_CAMERA_TOGGLE, KT_SCI | SCI_AIRPLANE_MODE, KT_SCI | SCI_SUSPEND, 0 /*prtsc*/, 0 /*pause*/, K_INSERT, K_DEL, + K_ESC, K_TOUCHPAD, KT_SCI | SCI_DISPLAY_TOGGLE, K_MUTE, KT_SCI_EXTRA | SCI_EXTRA_KBD_BKL, K_VOLUME_DOWN, K_VOLUME_UP, K_F7, KT_SCI | SCI_BRIGHTNESS_DOWN, KT_SCI | SCI_BRIGHTNESS_UP, KT_SCI | SCI_CAMERA_TOGGLE, KT_SCI | SCI_AIRPLANE_MODE, KT_SCI | SCI_SUSPEND, K_PRINT_SCREEN, 0 /*pause*/, K_INSERT, K_DEL, K_PLAY_PAUSE, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_HOME, K_TAB, K_Q, K_W, K_E, K_R, K_T, K_Y, K_PGUP, K_HOME, K_PGDN, K_P, K_BRACE_OPEN, K_BRACE_CLOSE, K_BACKSLASH, K_PGUP, KT_FN, K_A, K_S, K_D, K_F, K_G, K_LEFT, K_DOWN, K_UP, K_RIGHT, K_BKSP, K_DEL, K_ENTER, K_PGDN, diff --git a/src/board/system76/lemp9/kbscan.c b/src/board/system76/lemp9/kbscan.c index 787fbc4..77f2582 100644 --- a/src/board/system76/lemp9/kbscan.c +++ b/src/board/system76/lemp9/kbscan.c @@ -29,6 +29,79 @@ void kbscan_init(void) { // Debounce time in milliseconds #define DEBOUNCE_DELAY 20 +bool kbscan_press(uint16_t key, bool pressed, uint8_t * layer) { + switch (key & KT_MASK) { + case (KT_NORMAL): + if (kbscan_enabled) { + kbc_scancode(&KBC, key, pressed); + } + break; + case (KT_FN): + if (layer != NULL) { + if (pressed) *layer = 1; + else *layer = 0; + } else { + // In the case no layer can be set, reset bit + return false; + } + break; + case (KT_COMBO): + switch (key & 0xFF) { + case COMBO_PRINT_SCREEN: + if (kbscan_enabled) { + if (pressed) { + kbc_scancode(&KBC, K_E0 | 0x12, pressed); + kbc_scancode(&KBC, K_E0 | 0x7C, pressed); + } else { + kbc_scancode(&KBC, K_E0 | 0x7C, pressed); + kbc_scancode(&KBC, K_E0 | 0x12, pressed); + } + } + break; + } + break; + case (KT_SCI): + if (pressed) { + uint8_t sci = (uint8_t)(key & 0xFF); + + // HACK FOR HARDWARE HOTKEYS + switch (sci) { + case SCI_DISPLAY_TOGGLE: + gpio_set(&BKL_EN, !gpio_get(&BKL_EN)); + break; + case SCI_CAMERA_TOGGLE: + gpio_set(&CCD_EN, !gpio_get(&CCD_EN)); + break; + } + + if (!pmc_sci(&PMC_1, sci)) { + // In the case of ignored SCI, reset bit + return false; + } + } + break; + case (KT_SCI_EXTRA): + if (pressed) { + uint8_t sci = SCI_EXTRA; + sci_extra = (uint8_t)(key & 0xFF); + + // HACK FOR HARDWARE HOTKEYS + switch (sci_extra) { + case SCI_EXTRA_KBD_BKL: + kbled_set(kbled_get() + 1); + break; + } + + if (!pmc_sci(&PMC_1, sci)) { + // In the case of ignored SCI, reset bit + return false; + } + } + break; + } + return true; +} + void kbscan_event(void) { static uint8_t kbscan_layer = 0; uint8_t layer = kbscan_layer; @@ -78,74 +151,37 @@ void kbscan_event(void) { bool new_b = new & (1 << j); bool last_b = last & (1 << j); if (new_b != last_b) { + bool reset = false; + // If debouncing if (debounce) { // Debounce presses and releases - if (new_b) { - // Restore bit, so that this press can be handled later - new &= ~(1 << j); - } else { - // Restore bit, so that this release can be handled later - new |= (1 << j); - } - // Skip processing of press - continue; + reset = true; } else { // Begin debounce debounce = true; debounce_time = time_get(); + + // Handle key press/release + uint16_t key = keymap(i, j, kbscan_layer); + if (key) { + DEBUG("KB %d, %d, %d = 0x%04X, %d\n", i, j, kbscan_layer, key, new_b); + if(!kbscan_press(key, new_b, &layer)){ + // In the case of ignored key press/release, reset bit + reset = true; + } + } else { + WARN("KB %d, %d, %d missing\n", i, j, kbscan_layer); + } } - uint16_t key = keymap(i, j, kbscan_layer); - DEBUG("KB %d, %d, %d = 0x%04X, %d\n", i, j, kbscan_layer, key, new_b); - if (!key) { - WARN("KB %d, %d, %d missing\n", i, j, kbscan_layer); - } - switch (key & KT_MASK) { - case (KT_FN): - if (new_b) layer = 1; - else layer = 0; - break; - case (KT_SCI_EXTRA): - if (new_b) { - uint8_t sci = SCI_EXTRA; - sci_extra = (uint8_t)(key & 0xFF); - - // HACK FOR HARDWARE HOTKEYS - switch (sci_extra) { - case SCI_EXTRA_KBD_BKL: - kbled_set(kbled_get() + 1); - break; - } - - if (!pmc_sci(&PMC_1, sci)) { - // In the case of ignored SCI, reset bit - new &= ~(1 << j); - } - } - break; - case (KT_SCI): - if (new_b) { - uint8_t sci = (uint8_t)(key & 0xFF); - - // HACK FOR HARDWARE HOTKEYS - switch (sci) { - case SCI_CAMERA_TOGGLE: - gpio_set(&CCD_EN, !gpio_get(&CCD_EN)); - break; - } - - if (!pmc_sci(&PMC_1, sci)) { - // In the case of ignored SCI, reset bit - new &= ~(1 << j); - } - } - break; - case (KT_NORMAL): - if (kbscan_enabled && key) { - kbc_scancode(&KBC, key, new_b); - } - break; + // Reset bit to last state + if (reset) { + if (last_b) { + new |= (1 << j); + } else { + new &= ~(1 << j); + } } } } @@ -167,14 +203,27 @@ void kbscan_event(void) { bool new_b = new & (1 << j); bool last_b = last & (1 << j); if (new_b != last_b) { + bool reset = false; + + // Handle key press/release uint16_t key = keymap(i, j, kbscan_layer); - DEBUG("KB %d, %d, %d = 0x%04X, %d\n", i, j, kbscan_layer, key, new_b); - switch (key & KT_MASK) { - case (KT_NORMAL): - if (kbscan_enabled && key) { - kbc_scancode(&KBC, key, new_b); - } - break; + if (key) { + DEBUG("KB %d, %d, %d = 0x%04X, %d\n", i, j, kbscan_layer, key, new_b); + if(!kbscan_press(key, new_b, NULL)){ + // In the case of ignored key press/release, reset bit + reset = true; + } + } else { + WARN("KB %d, %d, %d missing\n", i, j, kbscan_layer); + } + + // Reset bit to last state + if (reset) { + if (last_b) { + new |= (1 << j); + } else { + new &= ~(1 << j); + } } } } diff --git a/src/board/system76/lemp9/keymap/default.c b/src/board/system76/lemp9/keymap/default.c index f12c68b..930ce7e 100644 --- a/src/board/system76/lemp9/keymap/default.c +++ b/src/board/system76/lemp9/keymap/default.c @@ -4,7 +4,7 @@ uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN] = { LAYOUT( - K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_HOME, K_END, 0 /*prtsc*/, K_DEL, + K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_HOME, K_END, K_PRINT_SCREEN, K_DEL, K_TICK, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_TAB, K_Q, K_W, K_E, K_R, K_T, K_Y, K_U, K_I, K_O, K_P, K_BRACE_OPEN, K_BRACE_CLOSE, K_BACKSLASH, K_CAPS, K_A, K_S, K_D, K_F, K_G, K_H, K_J, K_K, K_L, K_SEMICOLON, K_QUOTE, K_ENTER, @@ -13,7 +13,7 @@ LAYOUT( K_LEFT, K_DOWN, K_RIGHT ), LAYOUT( - K_ESC, K_TOUCHPAD, K_F2, K_MUTE, KT_SCI_EXTRA | SCI_EXTRA_KBD_BKL, K_VOLUME_DOWN, K_VOLUME_UP, K_F7, KT_SCI | SCI_BRIGHTNESS_DOWN, KT_SCI | SCI_BRIGHTNESS_UP, KT_SCI | SCI_CAMERA_TOGGLE, KT_SCI | SCI_AIRPLANE_MODE, KT_SCI | SCI_SUSPEND, K_HOME, K_END, 0 /*prtsc*/, K_DEL, + K_ESC, K_TOUCHPAD, KT_SCI | SCI_DISPLAY_TOGGLE, K_MUTE, KT_SCI_EXTRA | SCI_EXTRA_KBD_BKL, K_VOLUME_DOWN, K_VOLUME_UP, K_F7, KT_SCI | SCI_BRIGHTNESS_DOWN, KT_SCI | SCI_BRIGHTNESS_UP, KT_SCI | SCI_CAMERA_TOGGLE, KT_SCI | SCI_AIRPLANE_MODE, KT_SCI | SCI_SUSPEND, K_HOME, K_END, K_PRINT_SCREEN, K_DEL, K_PLAY_PAUSE, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_TAB, K_Q, K_W, K_E, K_R, K_T, K_Y, K_U, K_I, K_O, K_P, K_BRACE_OPEN, K_BRACE_CLOSE, K_BACKSLASH, K_CAPS, K_A, K_S, K_D, K_F, K_G, K_H, K_J, K_K, K_L, K_SEMICOLON, K_QUOTE, K_ENTER, diff --git a/src/board/system76/lemp9/keymap/jeremy.c b/src/board/system76/lemp9/keymap/jeremy.c index a1fd874..5be465a 100644 --- a/src/board/system76/lemp9/keymap/jeremy.c +++ b/src/board/system76/lemp9/keymap/jeremy.c @@ -4,7 +4,7 @@ uint16_t __code KEYMAP[KM_LAY][KM_OUT][KM_IN] = { LAYOUT( - K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_HOME, K_END, 0 /*prtsc*/, K_DEL, + K_ESC, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12, K_HOME, K_END, K_PRINT_SCREEN, K_DEL, K_TICK, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_TAB, K_Q, K_W, K_E, K_R, K_T, K_Y, K_U, K_I, K_O, K_P, K_BRACE_OPEN, K_BRACE_CLOSE, K_BACKSLASH, KT_FN, K_A, K_S, K_D, K_F, K_G, K_H, K_J, K_K, K_L, K_SEMICOLON, K_QUOTE, K_ENTER, @@ -13,7 +13,7 @@ LAYOUT( K_LEFT, K_DOWN, K_RIGHT ), LAYOUT( - K_ESC, K_TOUCHPAD, K_F2, K_MUTE, KT_SCI_EXTRA | SCI_EXTRA_KBD_BKL, K_VOLUME_DOWN, K_VOLUME_UP, K_F7, KT_SCI | SCI_BRIGHTNESS_DOWN, KT_SCI | SCI_BRIGHTNESS_UP, KT_SCI | SCI_CAMERA_TOGGLE, KT_SCI | SCI_AIRPLANE_MODE, KT_SCI | SCI_SUSPEND, K_HOME, K_END, 0 /*prtsc*/, K_DEL, + K_ESC, K_TOUCHPAD, KT_SCI | SCI_DISPLAY_TOGGLE, K_MUTE, KT_SCI_EXTRA | SCI_EXTRA_KBD_BKL, K_VOLUME_DOWN, K_VOLUME_UP, K_F7, KT_SCI | SCI_BRIGHTNESS_DOWN, KT_SCI | SCI_BRIGHTNESS_UP, KT_SCI | SCI_CAMERA_TOGGLE, KT_SCI | SCI_AIRPLANE_MODE, KT_SCI | SCI_SUSPEND, K_HOME, K_END, K_PRINT_SCREEN, K_DEL, K_PLAY_PAUSE, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_TAB, K_Q, K_W, K_E, K_R, K_T, K_Y, K_PGUP, K_HOME, K_PGDN, K_P, K_BRACE_OPEN, K_BRACE_CLOSE, K_BACKSLASH, KT_FN, K_A, K_S, K_D, K_F, K_G, K_LEFT, K_DOWN, K_UP, K_RIGHT, K_BKSP, K_DEL, K_ENTER,