@@ -29,7 +29,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
static void matrix_make(uint8_t code); | |||
static void matrix_break(uint8_t code); | |||
static void matrix_clear(void); | |||
/* | |||
@@ -155,8 +154,7 @@ static void matrix_break(uint8_t code) | |||
matrix[ROW(code)] &= ~(1<<COL(code)); | |||
} | |||
inline | |||
static void matrix_clear(void) | |||
void matrix_clear(void) | |||
{ | |||
for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; | |||
} |
@@ -29,10 +29,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
static void matrix_make(uint8_t code); | |||
static void matrix_break(uint8_t code); | |||
static void matrix_clear(void); | |||
#ifdef MATRIX_HAS_GHOST | |||
static bool matrix_has_ghost_in_row(uint8_t row); | |||
#endif | |||
/* | |||
@@ -71,18 +67,6 @@ static uint8_t matrix[MATRIX_ROWS]; | |||
static bool is_modified = false; | |||
inline | |||
uint8_t matrix_rows(void) | |||
{ | |||
return MATRIX_ROWS; | |||
} | |||
inline | |||
uint8_t matrix_cols(void) | |||
{ | |||
return MATRIX_COLS; | |||
} | |||
void matrix_init(void) | |||
{ | |||
debug_enable = true; | |||
@@ -398,23 +382,6 @@ uint8_t matrix_scan(void) | |||
return 1; | |||
} | |||
bool matrix_is_modified(void) | |||
{ | |||
return is_modified; | |||
} | |||
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) | |||
{ | |||
@@ -427,21 +394,6 @@ uint8_t matrix_get_row(uint8_t row) | |||
return matrix[row]; | |||
} | |||
void matrix_print(void) | |||
{ | |||
print("\nr/c 01234567\n"); | |||
for (uint8_t row = 0; row < matrix_rows(); row++) { | |||
phex(row); print(": "); | |||
pbin_reverse(matrix_get_row(row)); | |||
#ifdef MATRIX_HAS_GHOST | |||
if (matrix_has_ghost_in_row(row)) { | |||
print(" <ghost"); | |||
} | |||
#endif | |||
print("\n"); | |||
} | |||
} | |||
uint8_t matrix_key_count(void) | |||
{ | |||
uint8_t count = 0; | |||
@@ -451,23 +403,6 @@ uint8_t matrix_key_count(void) | |||
return count; | |||
} | |||
#ifdef MATRIX_HAS_GHOST | |||
inline | |||
static bool matrix_has_ghost_in_row(uint8_t row) | |||
{ | |||
// no ghost exists in case less than 2 keys on | |||
if (((matrix[row] - 1) & matrix[row]) == 0) | |||
return false; | |||
// 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]) | |||
return true; | |||
} | |||
return false; | |||
} | |||
#endif | |||
inline | |||
static void matrix_make(uint8_t code) | |||
@@ -487,8 +422,7 @@ static void matrix_break(uint8_t code) | |||
} | |||
} | |||
inline | |||
static void matrix_clear(void) | |||
void matrix_clear(void) | |||
{ | |||
for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; | |||
} |
@@ -28,7 +28,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
static void matrix_make(uint8_t code); | |||
static void matrix_break(uint8_t code); | |||
static void matrix_clear(void); | |||
#ifdef MATRIX_HAS_GHOST | |||
static bool matrix_has_ghost_in_row(uint8_t row); | |||
#endif | |||
@@ -326,8 +325,7 @@ static void matrix_break(uint8_t code) | |||
} | |||
} | |||
inline | |||
static void matrix_clear(void) | |||
void matrix_clear(void) | |||
{ | |||
for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; | |||
} |
@@ -1,6 +1,7 @@ | |||
COMMON_DIR = common | |||
SRC += $(COMMON_DIR)/host.c \ | |||
$(COMMON_DIR)/keyboard.c \ | |||
$(COMMON_DIR)/matrix.c \ | |||
$(COMMON_DIR)/action.c \ | |||
$(COMMON_DIR)/action_tapping.c \ | |||
$(COMMON_DIR)/action_macro.c \ |
@@ -105,8 +105,6 @@ void suspend_power_down(void) | |||
#endif | |||
} | |||
__attribute__ ((weak)) void matrix_power_up(void) {} | |||
__attribute__ ((weak)) void matrix_power_down(void) {} | |||
bool suspend_wakeup_condition(void) | |||
{ | |||
matrix_power_up(); | |||
@@ -122,7 +120,7 @@ bool suspend_wakeup_condition(void) | |||
void suspend_wakeup_init(void) | |||
{ | |||
// clear keyboard state | |||
matrix_init(); | |||
matrix_clear(); | |||
clear_keyboard(); | |||
#ifdef BACKLIGHT_ENABLE | |||
backlight_init(); |
@@ -63,7 +63,6 @@ static bool has_ghost_in_row(uint8_t row) | |||
#endif | |||
__attribute__ ((weak)) void matrix_setup(void) {} | |||
void keyboard_setup(void) | |||
{ | |||
matrix_setup(); |
@@ -0,0 +1,97 @@ | |||
/* | |||
Copyright 2016 Jun Wako <[email protected]> | |||
This program is free software: you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation, either version 2 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
*/ | |||
#include "print.h" | |||
#include "matrix.h" | |||
__attribute__ ((weak)) | |||
uint8_t matrix_rows(void) | |||
{ | |||
return MATRIX_ROWS; | |||
} | |||
__attribute__ ((weak)) | |||
uint8_t matrix_cols(void) | |||
{ | |||
return MATRIX_COLS; | |||
} | |||
__attribute__ ((weak)) | |||
void matrix_clear(void) | |||
{ | |||
matrix_init(); | |||
} | |||
__attribute__ ((weak)) | |||
void matrix_setup(void) {} | |||
__attribute__ ((weak)) | |||
bool matrix_is_on(uint8_t row, uint8_t col) | |||
{ | |||
return (matrix_get_row(row) & (1<<col)); | |||
} | |||
__attribute__ ((weak)) | |||
void matrix_print(void) | |||
{ | |||
#if (MATRIX_COLS <= 8) | |||
print("r/c 01234567\n"); | |||
#elif (MATRIX_COLS <= 16) | |||
print("r/c 0123456789ABCDEF\n"); | |||
#elif (MATRIX_COLS <= 32) | |||
print("r/c 0123456789ABCDEF0123456789ABCDEF\n"); | |||
#endif | |||
for (uint8_t row = 0; row < MATRIX_ROWS; row++) { | |||
xprintf("%02X:", row); | |||
#if (MATRIX_COLS <= 8) | |||
print_bin_reverse8(matrix_get_row(row)); | |||
#elif (MATRIX_COLS <= 16) | |||
print_bin_reverse16(matrix_get_row(row)); | |||
#elif (MATRIX_COLS <= 32) | |||
print_bin_reverse32(matrix_get_row(row)); | |||
#endif | |||
#ifdef MATRIX_HAS_GHOST | |||
if (matrix_has_ghost_in_row(row)) { | |||
print(" <ghost"); | |||
} | |||
#endif | |||
print("\n"); | |||
} | |||
} | |||
#ifdef MATRIX_HAS_GHOST | |||
__attribute__ ((weak)) | |||
bool matrix_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 | |||
__attribute__ ((weak)) void matrix_power_up(void) {} | |||
__attribute__ ((weak)) void matrix_power_down(void) {} |
@@ -57,7 +57,12 @@ bool matrix_is_on(uint8_t row, uint8_t col); | |||
matrix_row_t matrix_get_row(uint8_t row); | |||
/* print matrix for debug */ | |||
void matrix_print(void); | |||
/* clear matrix */ | |||
void matrix_clear(void); | |||
#ifdef MATRIX_HAS_GHOST | |||
bool matrix_has_ghost_in_row(uint8_t row); | |||
#endif | |||
/* power control */ | |||
void matrix_power_up(void); |
@@ -693,7 +693,7 @@ void hook_usb_suspend_entry(void) | |||
keyboard_led_stats = 0; | |||
led_set(keyboard_led_stats); | |||
matrix_init(); | |||
matrix_clear(); | |||
clear_keyboard(); | |||
#ifdef SLEEP_LED_ENABLE | |||
sleep_led_enable(); |