static void matrix_make(uint8_t code); | static void matrix_make(uint8_t code); | ||||
static void matrix_break(uint8_t code); | static void matrix_break(uint8_t code); | ||||
static void matrix_clear(void); | |||||
/* | /* | ||||
matrix[ROW(code)] &= ~(1<<COL(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; | for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; | ||||
} | } |
static void matrix_make(uint8_t code); | static void matrix_make(uint8_t code); | ||||
static void matrix_break(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 | |||||
/* | /* | ||||
static bool is_modified = false; | 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) | void matrix_init(void) | ||||
{ | { | ||||
debug_enable = true; | debug_enable = true; | ||||
return 1; | 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 | inline | ||||
bool matrix_is_on(uint8_t row, uint8_t col) | bool matrix_is_on(uint8_t row, uint8_t col) | ||||
{ | { | ||||
return matrix[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 matrix_key_count(void) | ||||
{ | { | ||||
uint8_t count = 0; | uint8_t count = 0; | ||||
return count; | 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 | inline | ||||
static void matrix_make(uint8_t code) | static void matrix_make(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; | for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; | ||||
} | } |
static void matrix_make(uint8_t code); | static void matrix_make(uint8_t code); | ||||
static void matrix_break(uint8_t code); | static void matrix_break(uint8_t code); | ||||
static void matrix_clear(void); | |||||
#ifdef MATRIX_HAS_GHOST | #ifdef MATRIX_HAS_GHOST | ||||
static bool matrix_has_ghost_in_row(uint8_t row); | static bool matrix_has_ghost_in_row(uint8_t row); | ||||
#endif | #endif | ||||
} | } | ||||
} | } | ||||
inline | |||||
static void matrix_clear(void) | |||||
void matrix_clear(void) | |||||
{ | { | ||||
for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; | for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; | ||||
} | } |
COMMON_DIR = common | COMMON_DIR = common | ||||
SRC += $(COMMON_DIR)/host.c \ | SRC += $(COMMON_DIR)/host.c \ | ||||
$(COMMON_DIR)/keyboard.c \ | $(COMMON_DIR)/keyboard.c \ | ||||
$(COMMON_DIR)/matrix.c \ | |||||
$(COMMON_DIR)/action.c \ | $(COMMON_DIR)/action.c \ | ||||
$(COMMON_DIR)/action_tapping.c \ | $(COMMON_DIR)/action_tapping.c \ | ||||
$(COMMON_DIR)/action_macro.c \ | $(COMMON_DIR)/action_macro.c \ |
#endif | #endif | ||||
} | } | ||||
__attribute__ ((weak)) void matrix_power_up(void) {} | |||||
__attribute__ ((weak)) void matrix_power_down(void) {} | |||||
bool suspend_wakeup_condition(void) | bool suspend_wakeup_condition(void) | ||||
{ | { | ||||
matrix_power_up(); | matrix_power_up(); | ||||
void suspend_wakeup_init(void) | void suspend_wakeup_init(void) | ||||
{ | { | ||||
// clear keyboard state | // clear keyboard state | ||||
matrix_init(); | |||||
matrix_clear(); | |||||
clear_keyboard(); | clear_keyboard(); | ||||
#ifdef BACKLIGHT_ENABLE | #ifdef BACKLIGHT_ENABLE | ||||
backlight_init(); | backlight_init(); |
#endif | #endif | ||||
__attribute__ ((weak)) void matrix_setup(void) {} | |||||
void keyboard_setup(void) | void keyboard_setup(void) | ||||
{ | { | ||||
matrix_setup(); | matrix_setup(); |
/* | |||||
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) {} |
matrix_row_t matrix_get_row(uint8_t row); | matrix_row_t matrix_get_row(uint8_t row); | ||||
/* print matrix for debug */ | /* print matrix for debug */ | ||||
void matrix_print(void); | 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 */ | /* power control */ | ||||
void matrix_power_up(void); | void matrix_power_up(void); |
keyboard_led_stats = 0; | keyboard_led_stats = 0; | ||||
led_set(keyboard_led_stats); | led_set(keyboard_led_stats); | ||||
matrix_init(); | |||||
matrix_clear(); | |||||
clear_keyboard(); | clear_keyboard(); | ||||
#ifdef SLEEP_LED_ENABLE | #ifdef SLEEP_LED_ENABLE | ||||
sleep_led_enable(); | sleep_led_enable(); |