X-Git-Url: https://git.friedersdorff.com/?a=blobdiff_plain;f=key_process.c;h=c23d17277bbc0510c66721aa55f461a887ee7369;hb=37ced39ae2ecfc945c21526faffb2449577bbeb7;hp=4a9e81b75616a06b1962a9d0b059a76382a0fc42;hpb=9d7979931e0037fc5ddc77a2cb895eb055501f34;p=max%2Ftmk_keyboard.git diff --git a/key_process.c b/key_process.c index 4a9e81b7..c23d1727 100644 --- a/key_process.c +++ b/key_process.c @@ -1,174 +1,288 @@ -// 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.h" -#include "keymap.h" +#include "debug.h" +#include "timer.h" +#include "util.h" #include "jump_bootloader.h" - +#include "usb_keyboard.h" +#include "usb_mouse.h" +#include "usb_extra.h" +#include "usb_keycodes.h" +#include "usb.h" +#include "layer.h" +#include "matrix_skel.h" +#include "keymap_skel.h" +#include "controller.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 - +#define MOUSE_MOVE_ACCEL (mouse_repeat < 50 ? mouse_repeat/5 : 10) +#ifndef MOUSE_DELAY_TIME +# define MOUSE_DELAY_TIME 255 +#endif +#define MOUSE_DELAY_MS (MOUSE_DELAY_TIME >> (mouse_repeat < 5 ? mouse_repeat : 4)) -static void print_matrix(void); -static void print_keys(void); -static void print_mouse(int8_t mouse_x, int8_t mouse_y, int8_t wheel_v, int8_t wheel_h); +// TODO: refactoring void proc_matrix(void) { static int mouse_repeat = 0; bool modified = false; - bool has_ghost = false; - int layer = 0; - 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_vwheel = 0; int8_t mouse_hwheel = 0; + uint8_t fn_bits = 0; - matrix_scan(); - modified = matrix_is_modified(); - has_ghost = matrix_has_ghost(); - layer = get_layer(); + matrix_scan(); + modified = matrix_is_modified(); + + if (modified) { + if (debug_matrix) matrix_print(); +#ifdef DEBUG_LED + // LED flash for debug + DEBUG_LED_CONFIG; + DEBUG_LED_ON; +#endif + } - // print matrix state for debug - if (modified) { - print_matrix(); + if (matrix_has_ghost()) { + // should send error? + debug("matrix has ghost!!\n"); + return; + } - // LED flash for debug - LED_CONFIG; - LED_ON; - } + 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_is_on(row, col)) continue; - keyboard_modifier_keys = 0; - for (int i = 0; i < 6; i++) keyboard_keys[i] = KB_NO; - key_index = 0; - mouse_btn = 0; - mouse_x = 0; - mouse_y = 0; - mouse_wheel = 0; - mouse_hwheel = 0; - - // convert matrix state to HID report - for (int row = 0; row < MATRIX_ROWS; row++) { - for (int col = 0; col < MATRIX_COLS; col++) { - if (matrix[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 { - // normal keys - if (key_index < 6) - keyboard_keys[key_index] = code; - key_index++; - } + // TODO: clean code + uint8_t code = layer_get_keycode(row, col); + if (code == KB_NO) { + // do nothing + } else if (IS_MOD(code)) { + usb_keyboard_mods |= MOD_BIT(code); + } else if (IS_FN(code)) { + fn_bits |= FN_BIT(code); + } else if (IS_MOUSE(code)) { + if (code == MS_UP) mouse_y -= MOUSE_MOVE_UNIT + MOUSE_MOVE_ACCEL; + if (code == MS_DOWN) mouse_y += MOUSE_MOVE_UNIT + MOUSE_MOVE_ACCEL; + if (code == MS_LEFT) mouse_x -= MOUSE_MOVE_UNIT + MOUSE_MOVE_ACCEL; + if (code == MS_RGHT) mouse_x += MOUSE_MOVE_UNIT + MOUSE_MOVE_ACCEL; + if (code == MS_BTN1) mouse_btn |= BIT_BTN1; + if (code == MS_BTN2) mouse_btn |= BIT_BTN2; + if (code == MS_BTN3) mouse_btn |= BIT_BTN3; + if (code == MS_BTN4) mouse_btn |= BIT_BTN4; + if (code == MS_BTN5) mouse_btn |= BIT_BTN5; + if (code == MS_WH_U) mouse_vwheel += 1; + if (code == MS_WH_D) mouse_vwheel -= 1; + if (code == MS_WH_L) mouse_hwheel -= 1; + if (code == MS_WH_R) mouse_hwheel += 1; } - } - - if (!has_ghost) { - // 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"); + // audio control & system control + else if (code == KB_MUTE) { + usb_extra_audio_send(AUDIO_MUTE); + usb_extra_audio_send(0); + _delay_ms(500); + } else if (code == KB_VOLU) { + usb_extra_audio_send(AUDIO_VOL_UP); + usb_extra_audio_send(0); _delay_ms(100); - jump_bootloader(); // not return + } else if (code == KB_VOLD) { + usb_extra_audio_send(AUDIO_VOL_DOWN); + usb_extra_audio_send(0); + _delay_ms(100); + } else if (code == KB_PWR) { + if (suspend && remote_wakeup) { + usb_remote_wakeup(); + } else { + usb_extra_system_send(SYSTEM_POWER_DOWN); + } + _delay_ms(1000); } - 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); - print_mouse(mouse_x, mouse_y, mouse_wheel, mouse_hwheel); - key_sent = true; - - // acceleration - _delay_ms(MOUSE_DELAY_MS >> (mouse_repeat < MOUSE_DELAY_ACC ? mouse_repeat : MOUSE_DELAY_ACC)); - mouse_repeat++; - } else { - mouse_repeat = 0; + // normal keys + else { + // TODO: fix ugly code + int8_t i = 0; + int8_t empty = -1; + for (; i < KEYBOARD_REPORT_MAX; i++) { + if (usb_keyboard_keys_prev[i] == code) { + usb_keyboard_keys[i] = code; + break; + } else if (empty == -1 && usb_keyboard_keys_prev[i] == 0 && usb_keyboard_keys[i] == 0) { + empty = i; + } + } + if (i == KEYBOARD_REPORT_MAX) { + if (empty != -1) { + usb_keyboard_keys[empty] = code; + } + } } + } + } + + if (modified) { +#ifdef DEBUG_LED + // LED flash for debug + DEBUG_LED_CONFIG; + DEBUG_LED_OFF; +#endif + } + layer_switching(fn_bits); - // send keys to host - if (modified) { - if (key_index > 6) { - //Rollover + // TODO: clean code + // when 4 left modifier keys down + if (keymap_is_special_mode(fn_bits)) { + switch (usb_keyboard_keys[0]) { + case KB_H: // help + print_enable = true; + print("b: jump to bootloader\n"); + print("d: debug print toggle\n"); + print("x: matrix debug toggle\n"); + print("k: keyboard debug toggle\n"); + print("m: mouse debug toggle\n"); + print("p: print enable toggle\n"); + print("v: print version\n"); + print("t: print timer count\n"); + print("r: print registers\n"); + print("ESC: power down/wake up\n"); + _delay_ms(500); + print_enable = false; + break; + 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(); - if (keyboard_keys[0]) - key_sent = true; - - print_keys(); - // LED flash for debug - LED_CONFIG; - LED_OFF; - } + 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_R: + usb_keyboard_clear_report(); + usb_keyboard_send(); + print("UDIEN: "); phex(UDIEN); print("\n"); + print("UDINT: "); phex(UDINT); print("\n"); + _delay_ms(1000); + break; + 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; } -} + } -static void print_matrix(void) { - print("\nr/c 01234567\n"); - for (int row = 0; row < MATRIX_ROWS; row++) { - phex(row); print(": "); - pbin_reverse(matrix[row]); - if (matrix_has_ghost_in_row(row)) { - print("