matrix.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. #include <stdint.h>
  2. #include <stdbool.h>
  3. #include <string.h>
  4. #include "hal.h"
  5. #include "timer.h"
  6. #include "wait.h"
  7. #include "printf.h"
  8. #include "backlight.h"
  9. #include "matrix.h"
  10. #include "action.h"
  11. #include "keycode.h"
  12. #include <string.h>
  13. /*
  14. * col: { B11, B10, B2, B1, A7, B0 }
  15. * row: { A10, A9, A8, B15, C13, C14, C15, A2 }
  16. */
  17. /* matrix state(1:on, 0:off) */
  18. static matrix_row_t matrix[MATRIX_ROWS];
  19. static matrix_row_t matrix_debouncing[MATRIX_COLS];
  20. static bool debouncing = false;
  21. static uint16_t debouncing_time = 0;
  22. static uint8_t encoder_state = 0;
  23. static int8_t encoder_value = 0;
  24. static int8_t encoder_LUT[] = { 0, -1, 1, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 1, -1, 0 };
  25. __attribute__ ((weak))
  26. void matrix_init_user(void) {}
  27. __attribute__ ((weak))
  28. void matrix_scan_user(void) {}
  29. __attribute__ ((weak))
  30. void matrix_init_kb(void) {
  31. matrix_init_user();
  32. }
  33. __attribute__ ((weak))
  34. void matrix_scan_kb(void) {
  35. matrix_scan_user();
  36. }
  37. void matrix_init(void) {
  38. printf("matrix init\n");
  39. //debug_matrix = true;
  40. // dip switch setup
  41. palSetPadMode(GPIOB, 14, PAL_MODE_INPUT_PULLUP);
  42. palSetPadMode(GPIOA, 15, PAL_MODE_INPUT_PULLUP);
  43. palSetPadMode(GPIOA, 10, PAL_MODE_INPUT_PULLUP);
  44. palSetPadMode(GPIOB, 9, PAL_MODE_INPUT_PULLUP);
  45. // encoder setup
  46. palSetPadMode(GPIOB, 12, PAL_MODE_INPUT_PULLUP);
  47. palSetPadMode(GPIOB, 13, PAL_MODE_INPUT_PULLUP);
  48. encoder_state = (palReadPad(GPIOB, 12) << 0) | (palReadPad(GPIOB, 13) << 1);
  49. // actual matrix setup
  50. palSetPadMode(GPIOB, 11, PAL_MODE_OUTPUT_PUSHPULL);
  51. palSetPadMode(GPIOB, 10, PAL_MODE_OUTPUT_PUSHPULL);
  52. palSetPadMode(GPIOB, 2, PAL_MODE_OUTPUT_PUSHPULL);
  53. palSetPadMode(GPIOB, 1, PAL_MODE_OUTPUT_PUSHPULL);
  54. palSetPadMode(GPIOA, 7, PAL_MODE_OUTPUT_PUSHPULL);
  55. palSetPadMode(GPIOB, 0, PAL_MODE_OUTPUT_PUSHPULL);
  56. palSetPadMode(GPIOA, 10, PAL_MODE_INPUT_PULLDOWN);
  57. palSetPadMode(GPIOA, 9, PAL_MODE_INPUT_PULLDOWN);
  58. palSetPadMode(GPIOA, 8, PAL_MODE_INPUT_PULLDOWN);
  59. palSetPadMode(GPIOB, 15, PAL_MODE_INPUT_PULLDOWN);
  60. palSetPadMode(GPIOC, 13, PAL_MODE_INPUT_PULLDOWN);
  61. palSetPadMode(GPIOC, 14, PAL_MODE_INPUT_PULLDOWN);
  62. palSetPadMode(GPIOC, 15, PAL_MODE_INPUT_PULLDOWN);
  63. palSetPadMode(GPIOA, 2, PAL_MODE_INPUT_PULLDOWN);
  64. memset(matrix, 0, MATRIX_ROWS * sizeof(matrix_row_t));
  65. memset(matrix_debouncing, 0, MATRIX_COLS * sizeof(matrix_row_t));
  66. matrix_init_quantum();
  67. }
  68. __attribute__ ((weak))
  69. void encoder_update(bool clockwise) { }
  70. #ifndef ENCODER_RESOLUTION
  71. #define ENCODER_RESOLUTION 4
  72. #endif
  73. #define COUNTRECLOCKWISE 0
  74. #define CLOCKWISE 1
  75. uint8_t matrix_scan(void) {
  76. // encoder on B12 and B13
  77. encoder_state <<= 2;
  78. encoder_state |= (palReadPad(GPIOB, 12) << 0) | (palReadPad(GPIOB, 13) << 1);
  79. encoder_value += encoder_LUT[encoder_state & 0xF];
  80. if (encoder_value >= ENCODER_RESOLUTION) {
  81. encoder_update(COUNTRECLOCKWISE);
  82. }
  83. if (encoder_value <= -ENCODER_RESOLUTION) { // direction is arbitrary here, but this clockwise
  84. encoder_update(CLOCKWISE);
  85. }
  86. encoder_value %= ENCODER_RESOLUTION;
  87. // actual matrix
  88. for (int col = 0; col < MATRIX_COLS; col++) {
  89. matrix_row_t data = 0;
  90. // strobe col { B11, B10, B2, B1, A7, B0 }
  91. switch (col) {
  92. case 0: palSetPad(GPIOB, 11); break;
  93. case 1: palSetPad(GPIOB, 10); break;
  94. case 2: palSetPad(GPIOB, 2); break;
  95. case 3: palSetPad(GPIOB, 1); break;
  96. case 4: palSetPad(GPIOA, 7); break;
  97. case 5: palSetPad(GPIOB, 0); break;
  98. }
  99. // need wait to settle pin state
  100. wait_us(20);
  101. // read row data { A10, A9, A8, B15, C13, C14, C15, A2 }
  102. data = (
  103. (palReadPad(GPIOA, 10) << 0 ) |
  104. (palReadPad(GPIOA, 9) << 1 ) |
  105. (palReadPad(GPIOA, 8) << 2 ) |
  106. (palReadPad(GPIOB, 15) << 3 ) |
  107. (palReadPad(GPIOC, 13) << 4 ) |
  108. (palReadPad(GPIOC, 14) << 5 ) |
  109. (palReadPad(GPIOC, 15) << 6 ) |
  110. (palReadPad(GPIOA, 2) << 7 )
  111. );
  112. // unstrobe col { B11, B10, B2, B1, A7, B0 }
  113. switch (col) {
  114. case 0: palClearPad(GPIOB, 11); break;
  115. case 1: palClearPad(GPIOB, 10); break;
  116. case 2: palClearPad(GPIOB, 2); break;
  117. case 3: palClearPad(GPIOB, 1); break;
  118. case 4: palClearPad(GPIOA, 7); break;
  119. case 5: palClearPad(GPIOB, 0); break;
  120. }
  121. if (matrix_debouncing[col] != data) {
  122. matrix_debouncing[col] = data;
  123. debouncing = true;
  124. debouncing_time = timer_read();
  125. }
  126. }
  127. if (debouncing && timer_elapsed(debouncing_time) > DEBOUNCE) {
  128. for (int row = 0; row < MATRIX_ROWS; row++) {
  129. matrix[row] = 0;
  130. for (int col = 0; col < MATRIX_COLS; col++) {
  131. matrix[row] |= ((matrix_debouncing[col] & (1 << row) ? 1 : 0) << col);
  132. }
  133. }
  134. debouncing = false;
  135. }
  136. matrix_scan_quantum();
  137. return 1;
  138. }
  139. bool matrix_is_on(uint8_t row, uint8_t col) {
  140. return (matrix[row] & (1<<col));
  141. }
  142. matrix_row_t matrix_get_row(uint8_t row) {
  143. return matrix[row];
  144. }
  145. void matrix_print(void) {
  146. printf("\nr/c 01234567\n");
  147. for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
  148. printf("%X0: ", row);
  149. matrix_row_t data = matrix_get_row(row);
  150. for (int col = 0; col < MATRIX_COLS; col++) {
  151. if (data & (1<<col))
  152. printf("1");
  153. else
  154. printf("0");
  155. }
  156. printf("\n");
  157. }
  158. }