]>
git.gir.st - tmk_keyboard.git/blob - adb/matrix.c
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 //print("adb_host_kbd_recv: "); phex16(codes); print("\n");
83 if (codes
== 0) { // no keys
85 } else if (key0
== 0xFF && key1
!= 0xFF) { // error
88 _matrix_is_modified
= true;
90 if (key1
!= 0xFF) // key1 is 0xFF when no second key.
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
);