Compare commits

...

3 Commits

Author SHA1 Message Date
Stefan Kerkmann
c1ef88ea6f
Merge 71521d71c5 into 9c86583981 2024-11-19 18:24:13 -08:00
Stefan Kerkmann
71521d71c5 suspend: update wake up matrix after wake up delay
If USB_SUSPEND_WAKEUP_DELAY is set, the keyboard sleeps during wake up -
which can be up to multiple seconds. To not miss any key releases the
wake up matrix is updated with the current state of the matrix - only
resetting the keys that have been released.

Signed-off-by: Stefan Kerkmann <karlk90@pm.me>
2024-10-12 19:44:59 +02:00
Stefan Kerkmann
fe35558ec7 suspend: suppress wake up keypress
Waking the host from suspend is done by pressing any key on the
keyboard, the regular key codes assigned to the keys are not important
and must not be sent - otherwise they usually end up in password prompts
as ghost characters that have to be deleted again. This commit adds
suppression for all keys pressed at the time of wake up. Once a key is
released it functions as a regular key again.

Signed-off-by: Stefan Kerkmann <karlk90@pm.me>
2024-10-12 19:44:59 +02:00
6 changed files with 48 additions and 3 deletions

View File

@ -4,6 +4,8 @@
#include "suspend.h"
#include "matrix.h"
static matrix_row_t wakeup_matrix[MATRIX_ROWS];
// TODO: Move to more correct location
__attribute__((weak)) void matrix_power_up(void) {}
__attribute__((weak)) void matrix_power_down(void) {}
@ -44,8 +46,36 @@ bool suspend_wakeup_condition(void) {
matrix_power_up();
matrix_scan();
matrix_power_down();
bool wakeup = false;
for (uint8_t r = 0; r < MATRIX_ROWS; r++) {
if (matrix_get_row(r)) return true;
wakeup_matrix[r] = matrix_get_row(r);
wakeup |= wakeup_matrix[r] != 0;
}
return wakeup;
}
void wakeup_matrix_update(void) {
matrix_power_up();
matrix_scan();
matrix_power_down();
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
matrix_row_t matrix_row = matrix_get_row(row);
matrix_row_t col_mask = 1;
for (uint8_t col = 0; col < MATRIX_COLS; col++, col_mask <<= 1) {
wakeup_matrix_handle_key_event(row, col, matrix_row & col_mask);
}
}
}
bool keypress_is_wakeup_key(uint8_t row, uint8_t col) {
return (wakeup_matrix[row] & ((matrix_row_t)1 << col));
}
void wakeup_matrix_handle_key_event(uint8_t row, uint8_t col, bool pressed) {
if (!pressed) {
wakeup_matrix[row] &= ~((matrix_row_t)1 << col);
}
return false;
}

View File

@ -14,6 +14,10 @@ void suspend_power_down_user(void);
void suspend_power_down_kb(void);
void suspend_power_down_quantum(void);
bool keypress_is_wakeup_key(uint8_t row, uint8_t col);
void wakeup_matrix_update(void);
void wakeup_matrix_handle_key_event(uint8_t row, uint8_t col, bool pressed);
#ifndef USB_SUSPEND_WAKEUP_DELAY
# define USB_SUSPEND_WAKEUP_DELAY 0
#endif

View File

@ -32,6 +32,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "sendchar.h"
#include "eeconfig.h"
#include "action_layer.h"
#include "suspend.h"
#ifdef BOOTMAGIC_ENABLE
# include "bootmagic.h"
#endif
@ -505,6 +506,7 @@ void switch_events(uint8_t row, uint8_t col, bool pressed) {
#if defined(RGB_MATRIX_ENABLE)
rgb_matrix_handle_key_event(row, col, pressed);
#endif
wakeup_matrix_handle_key_event(row, col, pressed);
}
/**
@ -568,7 +570,7 @@ static bool matrix_task(void) {
if (row_changes & col_mask) {
const bool key_pressed = current_row & col_mask;
if (process_keypress) {
if (process_keypress && !keypress_is_wakeup_key(row, col)) {
action_exec(MAKE_KEYEVENT(row, col, key_pressed));
}

View File

@ -193,6 +193,9 @@ void protocol_pre_task(void) {
//
// Pause for a while to let things settle...
wait_ms(USB_SUSPEND_WAKEUP_DELAY);
// ...and then update the wakeup matrix again as the waking key
// might have been released during the delay
wakeup_matrix_update();
# endif
}
}

View File

@ -836,6 +836,9 @@ void protocol_pre_task(void) {
//
// Pause for a while to let things settle...
wait_ms(USB_SUSPEND_WAKEUP_DELAY);
// ...and then update the wakeup matrix again as the waking key
// might have been released during the delay
wakeup_matrix_update();
# endif
}
}

View File

@ -145,6 +145,9 @@ void protocol_pre_task(void) {
//
// Pause for a while to let things settle...
wait_ms(USB_SUSPEND_WAKEUP_DELAY);
// ...and then update the wakeup matrix again as the waking key
// might have been released during the delay
wakeup_matrix_update();
# endif
}
}