7 #include <util/delay.h>
12 #include "matrix_skel.h"
15 #if (MATRIX_COLS > 16)
16 # error "MATRIX_COLS must not exceed 16"
18 #if (MATRIX_ROWS > 255)
19 # error "MATRIX_ROWS must not exceed 255"
23 static bool _matrix_is_modified = false;
25 // matrix state buffer(1:on, 0:off)
26 #if (MATRIX_COLS <= 8)
27 static uint8_t *matrix;
28 static uint8_t _matrix0[MATRIX_ROWS];
30 static uint16_t *matrix;
31 static uint16_t _matrix0[MATRIX_ROWS];
34 #ifdef MATRIX_HAS_GHOST
35 static bool matrix_has_ghost_in_row(uint8_t row);
37 static void _register_key(uint8_t key);
41 uint8_t matrix_rows(void)
47 uint8_t matrix_cols(void)
52 void matrix_init(void)
56 // initialize matrix state: all keys off
57 for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0x00;
63 debug_keyboard = true;
65 print("debug enabled.\n");
69 uint8_t matrix_scan(void)
74 _matrix_is_modified = false;
76 codes = adb_host_kbd_recv();
80 if (codes == 0) { // no keys
82 } else if (key0 == 0xFF && key1 != 0xFF) { // error
85 _matrix_is_modified = true;
87 if (key1 != 0xFF) // key1 is 0xFF when no second key.
91 if (debug_matrix && matrix_is_modified()) {
92 print("adb_host_kbd_recv: "); phex16(codes); print("\n");
97 bool matrix_is_modified(void)
99 return _matrix_is_modified;
103 bool matrix_has_ghost(void)
105 #ifdef MATRIX_HAS_GHOST
106 for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
107 if (matrix_has_ghost_in_row(i))
115 bool matrix_is_on(uint8_t row, uint8_t col)
117 return (matrix[row] & (1<<col));
121 #if (MATRIX_COLS <= 8)
122 uint8_t matrix_get_row(uint8_t row)
124 uint16_t matrix_get_row(uint8_t row)
130 void matrix_print(void)
132 #if (MATRIX_COLS <= 8)
133 print("\nr/c 01234567\n");
135 print("\nr/c 0123456789ABCDEF\n");
137 for (uint8_t row = 0; row < matrix_rows(); row++) {
138 phex(row); print(": ");
139 #if (MATRIX_COLS <= 8)
140 pbin_reverse(matrix_get_row(row));
142 pbin_reverse16(matrix_get_row(row));
144 #ifdef MATRIX_HAS_GHOST
145 if (matrix_has_ghost_in_row(row)) {
153 uint8_t matrix_key_count(void)
156 for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
157 #if (MATRIX_COLS <= 8)
158 count += bitpop(matrix[i]);
160 count += bitpop16(matrix[i]);
166 #ifdef MATRIX_HAS_GHOST
168 static bool matrix_has_ghost_in_row(uint8_t row)
170 // no ghost exists in case less than 2 keys on
171 if (((matrix[row] - 1) & matrix[row]) == 0)
174 // ghost exists in case same state as other row
175 for (uint8_t i=0; i < MATRIX_ROWS; i++) {
176 if (i != row && (matrix[i] & matrix[row]) == matrix[row])
184 static void _register_key(uint8_t key)
190 matrix[row] &= ~(1<<col);
192 matrix[row] |= (1<<col);