X-Git-Url: https://git.friedersdorff.com/?a=blobdiff_plain;f=key_process.c;h=4367f471da8dd451941ccd97d4267efec6cc675f;hb=cf95d8308fe5ad852a30d50d2a81027ff1a067e0;hp=10cac032b145da8a81676fa3d3bd96a8103d6c59;hpb=4acc38751e9c8e90921773e6e5f5a100b0729d98;p=max%2Ftmk_keyboard.git diff --git a/key_process.c b/key_process.c index 10cac032..4367f471 100644 --- a/key_process.c +++ b/key_process.c @@ -1,138 +1,392 @@ -// TODO: clean unused headers #include #include -#include #include #include -#include "usb.h" -#include "usb_keyboard.h" -#include "usb_mouse.h" #include "print.h" -#include "matrix_skel.h" -#include "keymap.h" +#include "debug.h" +#include "timer.h" +#include "util.h" #include "jump_bootloader.h" - +#include "usb_keyboard.h" +#include "usb_keycodes.h" +#include "usb.h" +#include "layer.h" +#include "matrix_skel.h" +#include "keymap_skel.h" #include "key_process.h" - - -// for Teensy/Teensy++ 2.0 -#define LED_CONFIG (DDRD |= (1<<6)) -#define LED_ON (PORTD |= (1<<6)) -#define LED_OFF (PORTD &= ~(1<<6)) - -#define MOUSE_MOVE_UNIT 10 -#define MOUSE_DELAY_MS 200 -#define MOUSE_DELAY_ACC 5 +#ifdef MOUSEKEY_ENABLE +# include "mousekey.h" +#endif +#ifdef PS2_MOUSE_ENABLE +# include "ps2_mouse.h" +#endif +#ifdef USB_EXTRA_ENABLE +# include "usb_extra.h" +#endif +#ifdef USB_MOUSE_ENABLE +# include "usb_mouse.h" +#endif // TODO: refactoring void proc_matrix(void) { - static int mouse_repeat = 0; - bool modified = false; - //bool has_ghost = false; - int key_index = 0; - uint8_t mouse_btn = 0; - int8_t mouse_x = 0; - int8_t mouse_y = 0; - int8_t mouse_wheel = 0; - int8_t mouse_hwheel = 0; - int fn_bits = 0; + uint8_t fn_bits = 0; matrix_scan(); modified = matrix_is_modified(); - + if (modified) { - matrix_print(); - + if (debug_matrix) matrix_print(); +#ifdef DEBUG_LED // LED flash for debug - LED_CONFIG; - LED_ON; + DEBUG_LED_CONFIG; + DEBUG_LED_ON; +#endif } if (matrix_has_ghost()) { // should send error? - print("matrix has ghost!!\n"); + debug("matrix has ghost!!\n"); return; } - usb_keyboard_clear(); + usb_keyboard_swap_report(); + usb_keyboard_clear_report(); for (int row = 0; row < matrix_rows(); row++) { for (int col = 0; col < matrix_cols(); col++) { - if (matrix_get_row(row) & 1<= MS_UP) { - // mouse - if (code == MS_UP) mouse_y -= MOUSE_MOVE_UNIT + (mouse_repeat < 50 ? mouse_repeat/5 : 10); - if (code == MS_DOWN) mouse_y += MOUSE_MOVE_UNIT + (mouse_repeat < 50 ? mouse_repeat/5 : 10); - if (code == MS_LEFT) mouse_x -= MOUSE_MOVE_UNIT + (mouse_repeat < 50 ? mouse_repeat/5 : 10); - if (code == MS_RIGHT) mouse_x += MOUSE_MOVE_UNIT + (mouse_repeat < 50 ? mouse_repeat/5 : 10); - if (code == MS_BTN1) mouse_btn |= 1<<0; - if (code == MS_BTN2) mouse_btn |= 1<<1; - if (code == MS_BTN3) mouse_btn |= 1<<2; - if (code == MS_BTN4) mouse_btn |= 1<<3; - if (code == MS_BTN5) mouse_btn |= 1<<4; - if (code == MS_WH_UP) mouse_wheel += 1; - if (code == MS_WH_DOWN) mouse_wheel -= 1; - if (code == MS_WH_LEFT) mouse_hwheel -= 1; - if (code == MS_WH_RIGHT) mouse_hwheel += 1; - } else if (FN_0 <= code && code <= FN_7) { - fn_bits |= 1<<(code - FN_0); + _delay_ms(1000); + } +#endif + // normal key + else if (IS_KEY(code)) { + usb_keyboard_add_key(code); } else { - // normal keys - if (key_index < 6) - keyboard_keys[key_index] = code; - key_index++; + debug("ignore keycode: "); debug_hex(code); debug("\n"); } } } - keymap_fn_proc(fn_bits); - - // when 4 left modifier keys down - if (keyboard_modifier_keys == (MOD_LCTRL | MOD_LSHIFT | MOD_LALT | MOD_LGUI)) { - // cancel all keys - keyboard_modifier_keys = 0; - for (int i = 0; i < 6; i++) keyboard_keys[i] = KB_NO; - usb_keyboard_send(); - print("jump to bootloader...\n"); - _delay_ms(100); - jump_bootloader(); // not return + if (modified) { +#ifdef DEBUG_LED + // LED flash for debug + DEBUG_LED_CONFIG; + DEBUG_LED_OFF; +#endif } + layer_switching(fn_bits); - if (mouse_x || mouse_y || mouse_wheel || mouse_hwheel || mouse_btn != mouse_buttons) { - mouse_buttons = mouse_btn; - usb_mouse_move(mouse_x, mouse_y, mouse_wheel, mouse_hwheel); - usb_mouse_print(mouse_x, mouse_y, mouse_wheel, mouse_hwheel); + // TODO: clean code + // special mode for control, develop and debug + if (keymap_is_special_mode(fn_bits)) { + switch (usb_keyboard_get_key()) { + case KB_H: // help + usb_keyboard_clear_report(); + usb_keyboard_send(); + print_enable = true; + print("b: jump to bootloader\n"); + print("d: toggle debug enable\n"); + print("x: toggle matrix debug\n"); + print("k: toggle keyboard debug\n"); + print("m: toggle mouse debug\n"); + print("p: toggle print enable\n"); + print("v: print version\n"); + print("t: print timer count\n"); + print("s: print status\n"); + print("`: toggle protcol(boot/report)\n"); +#ifdef USB_NKRO_ENABLE + print("n: toggle USB_NKRO\n"); +#endif + print("Backspace: clear matrix\n"); + print("ESC: power down/wake up\n"); + print("0: switch to Layer0 \n"); + print("1: switch to Layer1 \n"); + print("2: switch to Layer2 \n"); + print("3: switch to Layer3 \n"); + print("4: switch to Layer4 \n"); +#ifdef PS2_MOUSE_ENABLE + print("[: ps2_mouse_init \n"); + print("]: ps2_mouse_read \n"); + print("\: ps2_mouse: on/off toggle \n"); +#endif + _delay_ms(500); + print_enable = false; + break; + case KB_BSPC: + usb_keyboard_clear_report(); + usb_keyboard_send(); + matrix_init(); + print("clear matrix\n"); + _delay_ms(500); + break; + case KB_0: + usb_keyboard_clear_report(); + usb_keyboard_send(); + print("current_layer: "); phex(current_layer); print("\n"); + print("default_layer: "); phex(default_layer); print("\n"); + current_layer = 0; + default_layer = 0; + print("switch to Layer0 \n"); + _delay_ms(500); + break; + case KB_1: + usb_keyboard_clear_report(); + usb_keyboard_send(); + print("current_layer: "); phex(current_layer); print("\n"); + print("default_layer: "); phex(default_layer); print("\n"); + current_layer = 1; + default_layer = 1; + print("switch to Layer1 \n"); + _delay_ms(500); + break; + case KB_2: + usb_keyboard_clear_report(); + usb_keyboard_send(); + print("current_layer: "); phex(current_layer); print("\n"); + print("default_layer: "); phex(default_layer); print("\n"); + current_layer = 2; + default_layer = 2; + print("switch to Layer2 \n"); + _delay_ms(500); + break; + case KB_3: + usb_keyboard_clear_report(); + usb_keyboard_send(); + print("current_layer: "); phex(current_layer); print("\n"); + print("default_layer: "); phex(default_layer); print("\n"); + current_layer = 3; + default_layer = 3; + print("switch to Layer3 \n"); + _delay_ms(500); + break; + case KB_4: + usb_keyboard_clear_report(); + usb_keyboard_send(); + print("current_layer: "); phex(current_layer); print("\n"); + print("default_layer: "); phex(default_layer); print("\n"); + current_layer = 4; + default_layer = 4; + print("switch to Layer4 \n"); + _delay_ms(500); + break; +#ifdef PS2_MOUSE_ENABLE + case KB_LBRC: + usb_keyboard_clear_report(); + usb_keyboard_send(); + print_enable = true; + print("ps2_mouse_init...\n"); + _delay_ms(500); + ps2_mouse_init(); + break; + case KB_RBRC: + usb_keyboard_clear_report(); + usb_keyboard_send(); + print_enable = true; + print("ps2_mouse_read[btn x y]: "); + _delay_ms(100); + ps2_mouse_read(); + phex(ps2_mouse_btn); print(" "); + phex(ps2_mouse_x); print(" "); + phex(ps2_mouse_y); print("\n"); + print("ps2_mouse_error_count: "); phex(ps2_mouse_error_count); print("\n"); + break; + case KB_BSLS: + ps2_mouse_enable = !ps2_mouse_enable; + print("ps2_mouse: "); + if (ps2_mouse_enable) + print("on"); + else + print("off"); + print("\n"); + _delay_ms(500); + break; +#endif + case KB_B: // bootloader + usb_keyboard_clear_report(); + usb_keyboard_send(); + print_enable = true; + print("jump to bootloader...\n"); + _delay_ms(1000); + jump_bootloader(); // not return + break; + case KB_D: // debug all toggle + usb_keyboard_clear_report(); + usb_keyboard_send(); + debug_enable = !debug_enable; + if (debug_enable) { + print_enable = true; + print("debug enabled.\n"); + //debug_matrix = true; + //debug_keyboard = true; + //debug_mouse = true; + } else { + print("debug disabled.\n"); + print_enable = false; + //debug_matrix = false; + //debug_keyboard = false; + //debug_mouse = false; + } + _delay_ms(1000); + break; + case KB_X: // debug matrix toggle + usb_keyboard_clear_report(); + usb_keyboard_send(); + debug_matrix = !debug_matrix; + if (debug_matrix) + print("debug matrix enabled.\n"); + else + print("debug matrix disabled.\n"); + _delay_ms(1000); + break; + case KB_K: // debug keyboard toggle + usb_keyboard_clear_report(); + usb_keyboard_send(); + debug_keyboard = !debug_keyboard; + if (debug_keyboard) + print("debug keyboard enabled.\n"); + else + print("debug keyboard disabled.\n"); + _delay_ms(1000); + break; + case KB_M: // debug mouse toggle + usb_keyboard_clear_report(); + usb_keyboard_send(); + debug_mouse = !debug_mouse; + if (debug_mouse) + print("debug mouse enabled.\n"); + else + print("debug mouse disabled.\n"); + _delay_ms(1000); + break; + case KB_V: // print version & information + usb_keyboard_clear_report(); + usb_keyboard_send(); + print_enable = true; + print(STR(DESCRIPTION) "\n"); + _delay_ms(1000); + break; + case KB_T: // print timer + usb_keyboard_clear_report(); + usb_keyboard_send(); + print_enable = true; + print("timer: "); phex16(timer_count); print("\n"); + _delay_ms(500); + break; + case KB_P: // print toggle + usb_keyboard_clear_report(); + usb_keyboard_send(); + if (print_enable) { + print("print disabled.\n"); + print_enable = false; + } else { + print_enable = true; + print("print enabled.\n"); + } + _delay_ms(1000); + break; + case KB_S: + usb_keyboard_clear_report(); + usb_keyboard_send(); + print("UDCON: "); phex(UDCON); print("\n"); + print("UDIEN: "); phex(UDIEN); print("\n"); + print("UDINT: "); phex(UDINT); print("\n"); + print("usb_keyboard_leds:"); phex(usb_keyboard_leds); print("\n"); + print("usb_keyboard_protocol:"); phex(usb_keyboard_protocol); print("\n"); + print("usb_keyboard_idle_config:"); phex(usb_keyboard_idle_config); print("\n"); + print("usb_keyboard_idle_count:"); phex(usb_keyboard_idle_count); print("\n"); +#ifdef USB_MOUSE_ENABLE + print("usb_mouse_protocol:"); phex(usb_mouse_protocol); print("\n"); +#endif + if (usb_keyboard_nkro) print("USB_NKRO: enabled\n"); else print("USB_NKRO: disabled\n"); + _delay_ms(500); + break; + case KB_GRV: + usb_keyboard_clear_report(); + usb_keyboard_send(); + usb_keyboard_protocol = !usb_keyboard_protocol; + print("keyboard protcol: "); + if (usb_keyboard_protocol) print("report"); else print("boot"); + print("\n"); - // acceleration - _delay_ms(MOUSE_DELAY_MS >> (mouse_repeat < MOUSE_DELAY_ACC ? mouse_repeat : MOUSE_DELAY_ACC)); - mouse_repeat++; - } else { - mouse_repeat = 0; +#ifdef USB_MOUSE_ENABLE + usb_mouse_protocol = !usb_mouse_protocol; + print("mouse protcol: "); + if (usb_mouse_protocol) print("report"); else print("boot"); + print("\n"); +#endif + _delay_ms(1000); + break; +#ifdef USB_NKRO_ENABLE + case KB_N: + usb_keyboard_clear_report(); + usb_keyboard_send(); + usb_keyboard_nkro = !usb_keyboard_nkro; + if (usb_keyboard_nkro) print("USB_NKRO: enabled\n"); else print("USB_NKRO: disabled\n"); + _delay_ms(1000); + break; +#endif +#ifdef USB_EXTRA_ENABLE + case KB_ESC: + usb_keyboard_clear_report(); + usb_keyboard_send(); + if (suspend && remote_wakeup) { + usb_remote_wakeup(); + } else { + usb_extra_system_send(SYSTEM_POWER_DOWN); + } + _delay_ms(1000); + break; +#endif + } } - // send keys to host if (modified) { - if (key_index > 6) { - //Rollover - } usb_keyboard_send(); - - usb_keyboard_print(); - // LED flash for debug - LED_CONFIG; - LED_OFF; } + +#ifdef MOUSEKEY_ENABLE + mousekey_usb_send(); +#endif + +#ifdef PS2_MOUSE_ENABLE + if (ps2_mouse_read() == 0) + ps2_mouse_usb_send(); +#endif }