Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Keep track of last matrix activity #10730

Merged
merged 3 commits into from
Jan 12, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 20 additions & 9 deletions quantum/split_common/matrix.c
Original file line number Diff line number Diff line change
Expand Up @@ -245,48 +245,59 @@ void matrix_init(void) {
split_post_init();
}

void matrix_post_scan(void) {
bool matrix_post_scan(void) {
bool changed = false;
if (is_keyboard_master()) {
static uint8_t error_count;

if (!transport_master(matrix + thatHand)) {
matrix_row_t slave_matrix[ROWS_PER_HAND] = {0};
if (!transport_master(slave_matrix)) {
error_count++;

if (error_count > ERROR_DISCONNECT_COUNT) {
// reset other half if disconnected
for (int i = 0; i < ROWS_PER_HAND; ++i) {
matrix[thatHand + i] = 0;
slave_matrix[i] = 0;
}
}
} else {
error_count = 0;
}

for (int i = 0; i < ROWS_PER_HAND; ++i) {
if (matrix[thatHand + i] != slave_matrix[i]) {
matrix[thatHand + i] = slave_matrix[i];
changed = true;
}
}

matrix_scan_quantum();
} else {
transport_slave(matrix + thisHand);

matrix_slave_scan_user();
}

return changed;
}

uint8_t matrix_scan(void) {
bool changed = false;
bool local_changed = false;

#if defined(DIRECT_PINS) || (DIODE_DIRECTION == COL2ROW)
// Set row, read cols
for (uint8_t current_row = 0; current_row < ROWS_PER_HAND; current_row++) {
changed |= read_cols_on_row(raw_matrix, current_row);
local_changed |= read_cols_on_row(raw_matrix, current_row);
}
#elif (DIODE_DIRECTION == ROW2COL)
// Set col, read rows
for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) {
changed |= read_rows_on_col(raw_matrix, current_col);
local_changed |= read_rows_on_col(raw_matrix, current_col);
}
#endif

debounce(raw_matrix, matrix + thisHand, ROWS_PER_HAND, changed);
debounce(raw_matrix, matrix + thisHand, ROWS_PER_HAND, local_changed);

matrix_post_scan();
return (uint8_t)changed;
bool remote_changed = matrix_post_scan();
return (uint8_t)(local_changed || remote_changed);
}
13 changes: 7 additions & 6 deletions tmk_core/common/keyboard.c
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
# include "dip_switch.h"
#endif

static uint32_t last_matrix_modification_time = 0;
uint32_t last_matrix_activity_time(void) { return last_matrix_modification_time; }
uint32_t last_matrix_activity_elapsed(void) { return timer_elapsed32(last_matrix_modification_time); }

// Only enable this if console is enabled to print to
#if defined(DEBUG_MATRIX_SCAN_RATE) && defined(CONSOLE_ENABLE)
static uint32_t matrix_timer = 0;
Expand Down Expand Up @@ -338,11 +342,8 @@ void keyboard_task(void) {
housekeeping_task_kb();
housekeeping_task_user();

#if defined(OLED_DRIVER_ENABLE) && !defined(OLED_DISABLE_TIMEOUT)
uint8_t ret = matrix_scan();
#else
matrix_scan();
#endif
uint8_t matrix_changed = matrix_scan();
if (matrix_changed) last_matrix_modification_time = timer_read32();

if (should_process_keypress()) {
for (uint8_t r = 0; r < MATRIX_ROWS; r++) {
Expand Down Expand Up @@ -409,7 +410,7 @@ void keyboard_task(void) {
oled_task();
# ifndef OLED_DISABLE_TIMEOUT
// Wake up oled if user is using those fabulous keys!
if (ret) oled_on();
if (matrix_changed) oled_on();
# endif
#endif

Expand Down
3 changes: 3 additions & 0 deletions tmk_core/common/keyboard.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,9 @@ void keyboard_post_init_user(void);
void housekeeping_task_kb(void);
void housekeeping_task_user(void);

uint32_t last_matrix_activity_time(void); // Timestamp of the last matrix activity
uint32_t last_matrix_activity_elapsed(void); // Number of milliseconds since the last matrix activity

#ifdef __cplusplus
}
#endif