custom_matrix_helper.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #include <stdint.h>
  2. #include <stdbool.h>
  3. #include "wait.h"
  4. #include "print.h"
  5. #include "debug.h"
  6. #include "util.h"
  7. #include "matrix.h"
  8. #include "debounce.h"
  9. #include "quantum.h"
  10. //_____COMMON__________________________________________________________________
  11. // user-defined overridable functions
  12. __attribute__((weak)) void matrix_init_kb(void) { matrix_init_user(); }
  13. __attribute__((weak)) void matrix_scan_kb(void) { matrix_scan_user(); }
  14. __attribute__((weak)) void matrix_init_user(void) {}
  15. __attribute__((weak)) void matrix_scan_user(void) {}
  16. //_____COULD BE COMMON_________________________________________________________
  17. /* matrix state(1:on, 0:off) */
  18. /*static*/ matrix_row_t raw_matrix[MATRIX_ROWS];
  19. /*static*/ matrix_row_t matrix[MATRIX_ROWS];
  20. #if (MATRIX_COLS <= 8)
  21. # define print_matrix_header() print("\nr/c 01234567\n")
  22. # define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row))
  23. # define matrix_bitpop(i) bitpop(matrix[i])
  24. # define ROW_SHIFTER ((uint8_t)1)
  25. #elif (MATRIX_COLS <= 16)
  26. # define print_matrix_header() print("\nr/c 0123456789ABCDEF\n")
  27. # define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row))
  28. # define matrix_bitpop(i) bitpop16(matrix[i])
  29. # define ROW_SHIFTER ((uint16_t)1)
  30. #elif (MATRIX_COLS <= 32)
  31. # define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
  32. # define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row))
  33. # define matrix_bitpop(i) bitpop32(matrix[i])
  34. # define ROW_SHIFTER ((uint32_t)1)
  35. #endif
  36. __attribute__ ((weak))
  37. uint8_t matrix_rows(void) {
  38. return MATRIX_ROWS;
  39. }
  40. __attribute__ ((weak))
  41. uint8_t matrix_cols(void) {
  42. return MATRIX_COLS;
  43. }
  44. __attribute__ ((weak))
  45. matrix_row_t matrix_get_row(uint8_t row) {
  46. return matrix[row];
  47. }
  48. __attribute__ ((weak))
  49. uint8_t matrix_key_count(void) {
  50. uint8_t count = 0;
  51. for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
  52. count += matrix_bitpop(i);
  53. }
  54. return count;
  55. }
  56. __attribute__ ((weak))
  57. void matrix_print(void) {
  58. print_matrix_header();
  59. for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
  60. phex(row); print(": ");
  61. print_matrix_row(row);
  62. print("\n");
  63. }
  64. }
  65. //_____CUSTOM MATRIX 'LITE'____________________________________________________
  66. __attribute__ ((weak))
  67. void custom_matrix_init(void) {
  68. }
  69. __attribute__ ((weak))
  70. bool custom_matrix_scan(matrix_row_t current_matrix[]) {
  71. bool changed = true;
  72. return changed;
  73. }
  74. __attribute__ ((weak))
  75. void matrix_init(void) {
  76. custom_matrix_init();
  77. // initialize matrix state: all keys off
  78. for (uint8_t i=0; i < MATRIX_ROWS; i++) {
  79. raw_matrix[i] = 0;
  80. matrix[i] = 0;
  81. }
  82. debounce_init(MATRIX_ROWS);
  83. matrix_init_quantum();
  84. }
  85. __attribute__ ((weak))
  86. uint8_t matrix_scan(void) {
  87. bool changed = custom_matrix_scan(raw_matrix);
  88. debounce(raw_matrix, matrix, MATRIX_ROWS, changed);
  89. matrix_scan_quantum();
  90. return 1;
  91. }