X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=common%2Fkeyboard.c;h=9a809ff4a153dbfca52f1a248cb9e001e26cfd06;hb=1f96edaed60def1f513ddd8adcdfa3e12b971006;hp=25f32eb02f52a615adf4c44e016afb03a488ff4f;hpb=3d81d5221eac9ca9620ba9043a250dcb8371b22e;p=tmk_firmware.git diff --git a/common/keyboard.c b/common/keyboard.c index 25f32eb..9a809ff 100644 --- a/common/keyboard.c +++ b/common/keyboard.c @@ -1,5 +1,5 @@ /* -Copyright 2011 Jun Wako +Copyright 2011,2012,2013 Jun Wako 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 @@ -14,25 +14,46 @@ 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 . */ +#include #include "keyboard.h" -#include "host.h" -#include "layer.h" #include "matrix.h" +#include "keymap.h" +#include "host.h" #include "led.h" -#include "usb_keycodes.h" +#include "keycode.h" #include "timer.h" #include "print.h" #include "debug.h" #include "command.h" +#include "util.h" +#include "sendchar.h" +#include "bootmagic.h" +#include "eeconfig.h" +#include "backlight.h" #ifdef MOUSEKEY_ENABLE -#include "mousekey.h" +# include "mousekey.h" #endif -#ifdef EXTRAKEY_ENABLE -#include +#ifdef PS2_MOUSE_ENABLE +# include "ps2_mouse.h" #endif -static uint8_t last_leds = 0; +#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) @@ -42,155 +63,77 @@ void keyboard_init(void) #ifdef PS2_MOUSE_ENABLE ps2_mouse_init(); #endif -} -void keyboard_proc(void) -{ - uint8_t fn_bits = 0; -#ifdef EXTRAKEY_ENABLE - uint16_t consumer_code = 0; - uint16_t system_code = 0; +#ifdef BOOTMAGIC_ENABLE + bootmagic(); #endif - matrix_scan(); - - if (matrix_is_modified()) { - if (debug_matrix) matrix_print(); -#ifdef DEBUG_LED - // LED flash for debug - DEBUG_LED_CONFIG; - DEBUG_LED_ON; +#ifdef BACKLIGHT_ENABLE + backlight_init(); #endif - } +} - if (matrix_has_ghost()) { - // should send error? - debug("matrix has ghost!!\n"); - return; - } +/* + * Do keyboard routine jobs: scan mantrix, light LEDs, ... + * This is repeatedly called as fast as possible. + */ +void keyboard_task(void) +{ + static matrix_row_t matrix_prev[MATRIX_ROWS]; + static uint8_t led_status = 0; + matrix_row_t matrix_row = 0; + matrix_row_t matrix_change = 0; - host_swap_keyboard_report(); - host_clear_keyboard_report(); - for (int row = 0; row < matrix_rows(); row++) { - for (int col = 0; col < matrix_cols(); col++) { - if (!matrix_is_on(row, col)) continue; - - uint8_t code = layer_get_keycode(row, col); - if (code == KB_NO) { - // do nothing - } else if (IS_MOD(code)) { - host_add_mod_bit(MOD_BIT(code)); - } else if (IS_FN(code)) { - fn_bits |= FN_BIT(code); - } -// TODO: use table or something -#ifdef EXTRAKEY_ENABLE - // System Control - else if (code == KB_SYSTEM_POWER) { -#ifdef HOST_PJRC - if (suspend && remote_wakeup) { - usb_remote_wakeup(); - } -#endif - system_code = SYSTEM_POWER_DOWN; - } else if (code == KB_SYSTEM_SLEEP) { - system_code = SYSTEM_SLEEP; - } else if (code == KB_SYSTEM_WAKE) { - system_code = SYSTEM_WAKE_UP; - } - // Consumer Page - else if (code == KB_AUDIO_MUTE) { - consumer_code = AUDIO_MUTE; - } else if (code == KB_AUDIO_VOL_UP) { - consumer_code = AUDIO_VOL_UP; - } else if (code == KB_AUDIO_VOL_DOWN) { - consumer_code = AUDIO_VOL_DOWN; - } - else if (code == KB_MEDIA_NEXT_TRACK) { - consumer_code = TRANSPORT_NEXT_TRACK; - } else if (code == KB_MEDIA_PREV_TRACK) { - consumer_code = TRANSPORT_PREV_TRACK; - } else if (code == KB_MEDIA_STOP) { - consumer_code = TRANSPORT_STOP; - } else if (code == KB_MEDIA_PLAY_PAUSE) { - consumer_code = TRANSPORT_PLAY_PAUSE; - } else if (code == KB_MEDIA_SELECT) { - consumer_code = AL_CC_CONFIG; - } - else if (code == KB_MAIL) { - consumer_code = AL_EMAIL; - } else if (code == KB_CALCULATOR) { - consumer_code = AL_CALCULATOR; - } else if (code == KB_MY_COMPUTER) { - consumer_code = AL_LOCAL_BROWSER; - } - else if (code == KB_WWW_SEARCH) { - consumer_code = AC_SEARCH; - } else if (code == KB_WWW_HOME) { - consumer_code = AC_HOME; - } else if (code == KB_WWW_BACK) { - consumer_code = AC_BACK; - } else if (code == KB_WWW_FORWARD) { - consumer_code = AC_FORWARD; - } else if (code == KB_WWW_STOP) { - consumer_code = AC_STOP; - } else if (code == KB_WWW_REFRESH) { - consumer_code = AC_REFRESH; - } else if (code == KB_WWW_FAVORITES) { - consumer_code = AC_BOOKMARKS; - } -#endif - else if (IS_KEY(code)) { - host_add_key(code); - } -#ifdef MOUSEKEY_ENABLE - else if (IS_MOUSEKEY(code)) { - mousekey_decode(code); + matrix_scan(); + for (uint8_t r = 0; r < MATRIX_ROWS; r++) { + matrix_row = matrix_get_row(r); + 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 - else { - debug("ignore keycode: "); debug_hex(code); debug("\n"); + for (uint8_t c = 0; c < MATRIX_COLS; c++) { + if (matrix_change & ((matrix_row_t)1<