You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
3.1 KiB

  1. #include "matrix.h"
  2. #include "debounce.h"
  3. #include "wait.h"
  4. #include "print.h"
  5. #include "debug.h"
  6. #ifndef MATRIX_IO_DELAY
  7. # define MATRIX_IO_DELAY 30
  8. #endif
  9. /* matrix state(1:on, 0:off) */
  10. matrix_row_t raw_matrix[MATRIX_ROWS];
  11. matrix_row_t matrix[MATRIX_ROWS];
  12. #ifdef MATRIX_MASKED
  13. extern const matrix_row_t matrix_mask[];
  14. #endif
  15. // user-defined overridable functions
  16. __attribute__((weak)) void matrix_init_kb(void) { matrix_init_user(); }
  17. __attribute__((weak)) void matrix_scan_kb(void) { matrix_scan_user(); }
  18. __attribute__((weak)) void matrix_init_user(void) {}
  19. __attribute__((weak)) void matrix_scan_user(void) {}
  20. // helper functions
  21. inline uint8_t matrix_rows(void) { return MATRIX_ROWS; }
  22. inline uint8_t matrix_cols(void) { return MATRIX_COLS; }
  23. inline bool matrix_is_on(uint8_t row, uint8_t col) { return (matrix[row] & ((matrix_row_t)1 << col)); }
  24. inline matrix_row_t matrix_get_row(uint8_t row) {
  25. // Matrix mask lets you disable switches in the returned matrix data. For example, if you have a
  26. // switch blocker installed and the switch is always pressed.
  27. #ifdef MATRIX_MASKED
  28. return matrix[row] & matrix_mask[row];
  29. #else
  30. return matrix[row];
  31. #endif
  32. }
  33. // Deprecated.
  34. bool matrix_is_modified(void) {
  35. if (debounce_active()) return false;
  36. return true;
  37. }
  38. #if (MATRIX_COLS <= 8)
  39. # define print_matrix_header() print("\nr/c 01234567\n")
  40. # define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row))
  41. # define matrix_bitpop(row) bitpop(matrix_get_row(row))
  42. #elif (MATRIX_COLS <= 16)
  43. # define print_matrix_header() print("\nr/c 0123456789ABCDEF\n")
  44. # define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row))
  45. # define matrix_bitpop(row) bitpop16(matrix_get_row(row))
  46. #elif (MATRIX_COLS <= 32)
  47. # define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
  48. # define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row))
  49. # define matrix_bitpop(row) bitpop32(matrix_get_row(row))
  50. #endif
  51. void matrix_print(void) {
  52. print_matrix_header();
  53. for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
  54. phex(row);
  55. print(": ");
  56. print_matrix_row(row);
  57. print("\n");
  58. }
  59. }
  60. uint8_t matrix_key_count(void) {
  61. uint8_t count = 0;
  62. for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
  63. count += matrix_bitpop(i);
  64. }
  65. return count;
  66. }
  67. __attribute__((weak)) void matrix_io_delay(void) { wait_us(MATRIX_IO_DELAY); }
  68. // CUSTOM MATRIX 'LITE'
  69. __attribute__((weak)) void matrix_init_custom(void) {}
  70. __attribute__((weak)) bool matrix_scan_custom(matrix_row_t current_matrix[]) { return true; }
  71. __attribute__((weak)) void matrix_init(void) {
  72. matrix_init_custom();
  73. // initialize matrix state: all keys off
  74. for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
  75. raw_matrix[i] = 0;
  76. matrix[i] = 0;
  77. }
  78. debounce_init(MATRIX_ROWS);
  79. matrix_init_quantum();
  80. }
  81. __attribute__((weak)) uint8_t matrix_scan(void) {
  82. bool changed = matrix_scan_custom(raw_matrix);
  83. debounce(raw_matrix, matrix, MATRIX_ROWS, changed);
  84. matrix_scan_quantum();
  85. return changed;
  86. }