~ruther/qmk_firmware

3ae87b155531b4529970c65c7a92a7399ab0233f — dexter93 2 years ago db1eeea
core: allow locking the matrix state (#18852)

Co-authored-by: Sergey Vlasov <sigprof@gmail.com>
Co-authored-by: Stefan Kerkmann <karlk90@pm.me>
Co-authored-by: Nick Brassel <nick@tzarc.org>
2 files changed, 15 insertions(+), 1 deletions(-)

M quantum/keyboard.c
M quantum/matrix.h
M quantum/keyboard.c => quantum/keyboard.c +13 -1
@@ 252,6 252,14 @@ __attribute__((weak)) void keyboard_post_init_kb(void) {
    keyboard_post_init_user();
}

/** \brief matrix_can_read
 *
 * Allows overriding when matrix scanning operations should be executed.
 */
__attribute__((weak)) bool matrix_can_read(void) {
    return true;
}

/** \brief keyboard_setup
 *
 * FIXME: needs doc


@@ 449,10 457,14 @@ static inline void generate_tick_event(void) {
 * @return false Matrix didn't change
 */
static bool matrix_task(void) {
    if (!matrix_can_read()) {
        generate_tick_event();
        return false;
    }

    static matrix_row_t matrix_previous[MATRIX_ROWS];

    matrix_scan();

    bool matrix_changed = false;
    for (uint8_t row = 0; row < MATRIX_ROWS && !matrix_changed; row++) {
        matrix_changed |= matrix_previous[row] ^ matrix_get_row(row);

M quantum/matrix.h => quantum/matrix.h +2 -0
@@ 51,6 51,8 @@ void matrix_setup(void);
void matrix_init(void);
/* scan all key states on matrix */
uint8_t matrix_scan(void);
/* whether matrix scanning operations should be executed */
bool matrix_can_read(void);
/* whether a switch is on */
bool matrix_is_on(uint8_t row, uint8_t col);
/* matrix state on row */