@@ -34,6 +34,24 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
#endif | |||
#ifdef MATRIX_HAS_GHOST | |||
static bool has_ghost_in_row(uint8_t row) | |||
{ | |||
matrix_row_t matrix_row = matrix_get_row(row); | |||
// No ghost exists when less than 2 keys are down on the row | |||
if (((matrix_row - 1) & matrix_row) == 0) | |||
return false; | |||
// Ghost occurs when the row shares column line with other row | |||
for (uint8_t i=0; i < MATRIX_ROWS; i++) { | |||
if (i != row && (matrix_get_row(i) & matrix_row)) | |||
return true; | |||
} | |||
return false; | |||
} | |||
#endif | |||
void keyboard_init(void) | |||
{ | |||
// TODO: configuration of sendchar impl | |||
@@ -81,7 +99,12 @@ void keyboard_task(void) | |||
matrix_change = matrix_row ^ matrix_prev[r]; | |||
if (matrix_change) { | |||
if (debug_matrix) matrix_print(); | |||
#ifdef MATRIX_HAS_GHOST | |||
if (has_ghost_in_row(r)) { | |||
matrix_prev[r] = matrix_row; | |||
continue; | |||
} | |||
#endif | |||
for (uint8_t c = 0; c < MATRIX_COLS; c++) { | |||
if (matrix_change & ((matrix_row_t)1<<c)) { | |||
action_exec((keyevent_t){ |
@@ -45,14 +45,10 @@ void matrix_init(void); | |||
uint8_t matrix_scan(void); | |||
/* whether modified from previous scan. used after matrix_scan. */ | |||
bool matrix_is_modified(void); | |||
/* whether ghosting occur on matrix. */ | |||
bool matrix_has_ghost(void); | |||
/* whether a swtich is on */ | |||
bool matrix_is_on(uint8_t row, uint8_t col); | |||
/* matrix state on row */ | |||
matrix_row_t matrix_get_row(uint8_t row); | |||
/* count keys pressed */ | |||
uint8_t matrix_key_count(void); | |||
/* print matrix for debug */ | |||
void matrix_print(void); | |||
@@ -99,6 +99,7 @@ F_USB = $(F_CPU) | |||
# | |||
MOUSEKEY_ENABLE = yes # Mouse keys | |||
EXTRAKEY_ENABLE = yes # Audio control and System control | |||
CONSOLE_ENABLE = yes # Console for debug | |||
#NKRO_ENABLE = yes # USB Nkey Rollover | |||
#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support | |||
@@ -147,18 +147,6 @@ bool matrix_is_modified(void) | |||
return false; | |||
} | |||
inline | |||
bool matrix_has_ghost(void) | |||
{ | |||
#ifdef MATRIX_HAS_GHOST | |||
for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | |||
if (matrix_has_ghost_in_row(i)) | |||
return true; | |||
} | |||
#endif | |||
return false; | |||
} | |||
inline | |||
bool matrix_is_on(uint8_t row, uint8_t col) | |||
{ | |||
@@ -194,19 +182,6 @@ void matrix_print(void) | |||
} | |||
} | |||
uint8_t matrix_key_count(void) | |||
{ | |||
uint8_t count = 0; | |||
for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | |||
#if (MATRIX_COLS <= 8) | |||
count += bitpop(matrix[i]); | |||
#else | |||
count += bitpop16(matrix[i]); | |||
#endif | |||
} | |||
return count; | |||
} | |||
#ifdef MATRIX_HAS_GHOST | |||
inline | |||
static bool matrix_has_ghost_in_row(uint8_t row) | |||
@@ -217,7 +192,7 @@ static bool matrix_has_ghost_in_row(uint8_t row) | |||
// ghost exists in case same state as other row | |||
for (uint8_t i=0; i < MATRIX_ROWS; i++) { | |||
if (i != row && (matrix[i] & matrix[row]) == matrix[row]) | |||
if (i != row && (matrix[i] & matrix[row])) | |||
return true; | |||
} | |||
return false; |