diff options
Diffstat (limited to 'quantum/matrix_common.c')
| -rw-r--r-- | quantum/matrix_common.c | 81 | 
1 files changed, 70 insertions, 11 deletions
diff --git a/quantum/matrix_common.c b/quantum/matrix_common.c index 66c89970b1..79f77421e1 100644 --- a/quantum/matrix_common.c +++ b/quantum/matrix_common.c @@ -4,6 +4,14 @@  #include "wait.h"  #include "print.h"  #include "debug.h" +#ifdef SPLIT_KEYBOARD +#    include "split_common/split_util.h" +#    include "split_common/transactions.h" + +#    define ROWS_PER_HAND (MATRIX_ROWS / 2) +#else +#    define ROWS_PER_HAND (MATRIX_ROWS) +#endif  #ifndef MATRIX_IO_DELAY  #    define MATRIX_IO_DELAY 30 @@ -13,6 +21,11 @@  matrix_row_t raw_matrix[MATRIX_ROWS];  matrix_row_t matrix[MATRIX_ROWS]; +#ifdef SPLIT_KEYBOARD +// row offsets for each hand +uint8_t thisHand, thatHand; +#endif +  #ifdef MATRIX_MASKED  extern const matrix_row_t matrix_mask[];  #endif @@ -45,12 +58,6 @@ inline matrix_row_t matrix_get_row(uint8_t row) {  #endif  } -// Deprecated. -bool matrix_is_modified(void) { -    if (debounce_active()) return false; -    return true; -} -  #if (MATRIX_COLS <= 8)  #    define print_matrix_header() print("\nr/c 01234567\n")  #    define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) @@ -84,18 +91,61 @@ uint8_t matrix_key_count(void) {      return count;  } +#ifdef SPLIT_KEYBOARD +bool matrix_post_scan(void) { +    bool changed = false; +    if (is_keyboard_master()) { +        matrix_row_t slave_matrix[ROWS_PER_HAND] = {0}; +        if (transport_master_if_connected(matrix + thisHand, slave_matrix)) { +            for (int i = 0; i < ROWS_PER_HAND; ++i) { +                if (matrix[thatHand + i] != slave_matrix[i]) { +                    matrix[thatHand + i] = slave_matrix[i]; +                    changed              = true; +                } +            } +        } else { +            // reset other half if disconnected +            for (int i = 0; i < ROWS_PER_HAND; ++i) { +                matrix[thatHand + i] = 0; +                slave_matrix[i]      = 0; +            } + +            changed = true; +        } + +        matrix_scan_quantum(); +    } else { +        transport_slave(matrix + thatHand, matrix + thisHand); + +        matrix_slave_scan_kb(); +    } + +    return changed; +} +#endif +  /* `matrix_io_delay ()` exists for backwards compatibility. From now on, use matrix_output_unselect_delay(). */  __attribute__((weak)) void matrix_io_delay(void) { wait_us(MATRIX_IO_DELAY); } -  __attribute__((weak)) void matrix_output_select_delay(void) { waitInputPinDelay(); }  __attribute__((weak)) void matrix_output_unselect_delay(uint8_t line, bool key_pressed) { matrix_io_delay(); }  // CUSTOM MATRIX 'LITE'  __attribute__((weak)) void matrix_init_custom(void) {} -  __attribute__((weak)) bool matrix_scan_custom(matrix_row_t current_matrix[]) { return true; } +#ifdef SPLIT_KEYBOARD +__attribute__((weak)) void matrix_slave_scan_kb(void) { matrix_slave_scan_user(); } +__attribute__((weak)) void matrix_slave_scan_user(void) {} +#endif +  __attribute__((weak)) void matrix_init(void) { +#ifdef SPLIT_KEYBOARD +    split_pre_init(); + +    thisHand = isLeftHand ? 0 : (ROWS_PER_HAND); +    thatHand = ROWS_PER_HAND - thisHand; +#endif +      matrix_init_custom();      // initialize matrix state: all keys off @@ -104,17 +154,26 @@ __attribute__((weak)) void matrix_init(void) {          matrix[i]     = 0;      } -    debounce_init(MATRIX_ROWS); +    debounce_init(ROWS_PER_HAND);      matrix_init_quantum(); + +#ifdef SPLIT_KEYBOARD +    split_post_init(); +#endif  }  __attribute__((weak)) uint8_t matrix_scan(void) {      bool changed = matrix_scan_custom(raw_matrix); -    debounce(raw_matrix, matrix, MATRIX_ROWS, changed); - +#ifdef SPLIT_KEYBOARD +    debounce(raw_matrix, matrix + thisHand, ROWS_PER_HAND, changed); +    changed = (changed || matrix_post_scan()); +#else +    debounce(raw_matrix, matrix, ROWS_PER_HAND, changed);      matrix_scan_quantum(); +#endif +      return changed;  }  | 
