X-Git-Url: https://git.friedersdorff.com/?a=blobdiff_plain;f=key_process.c;h=c23d17277bbc0510c66721aa55f461a887ee7369;hb=37ced39ae2ecfc945c21526faffb2449577bbeb7;hp=9ba0d83a16b698d690e53f6c93baf74d29ef3001;hpb=6c3b9a2ded1afcf4a6bbc69878f52088f4c1a0e8;p=max%2Ftmk_keyboard.git diff --git a/key_process.c b/key_process.c index 9ba0d83a..c23d1727 100644 --- a/key_process.c +++ b/key_process.c @@ -1,17 +1,20 @@ #include #include #include -#include "usb_keyboard.h" -#include "usb_mouse.h" -#include "usb_keycodes.h" #include "print.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" @@ -29,8 +32,6 @@ 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; @@ -40,7 +41,7 @@ void proc_matrix(void) { matrix_scan(); modified = matrix_is_modified(); - + if (modified) { if (debug_matrix) matrix_print(); #ifdef DEBUG_LED @@ -56,52 +57,111 @@ void proc_matrix(void) { 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_is_on(row, col)) continue; - uint8_t code = keymap_get_keycode(row, col); + // TODO: clean code + uint8_t code = layer_get_keycode(row, col); if (code == KB_NO) { // do nothing } else if (IS_MOD(code)) { - keyboard_modifier_keys |= MOD_BIT(code); + usb_keyboard_mods |= MOD_BIT(code); + } else if (IS_FN(code)) { + fn_bits |= FN_BIT(code); } else if (IS_MOUSE(code)) { - // mouse - 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_RIGHT) - mouse_x += MOUSE_MOVE_UNIT + MOUSE_MOVE_ACCEL; + 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_UP) mouse_vwheel += 1; - if (code == MS_WH_DOWN) mouse_vwheel -= 1; - if (code == MS_WH_LEFT) mouse_hwheel -= 1; - if (code == MS_WH_RIGHT) mouse_hwheel += 1; - } else if (IS_FN(code)) { - fn_bits |= FN_BIT(code); - } else { - // normal keys - if (key_index < 6) - keyboard_keys[key_index] = code; - key_index++; + 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; + } + + // 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); + } 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); + } + + // 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; + } + } } } } - keymap_fn_proc(fn_bits); + if (modified) { +#ifdef DEBUG_LED + // LED flash for debug + DEBUG_LED_CONFIG; + DEBUG_LED_OFF; +#endif + } + + layer_switching(fn_bits); + + // TODO: clean code // when 4 left modifier keys down if (keymap_is_special_mode(fn_bits)) { - switch (keyboard_keys[0]) { - case KB_B: // bootloader - usb_keyboard_clear(); + 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"); @@ -109,12 +169,12 @@ void proc_matrix(void) { jump_bootloader(); // not return break; case KB_D: // debug all toggle - usb_keyboard_clear(); + usb_keyboard_clear_report(); usb_keyboard_send(); debug_enable = !debug_enable; if (debug_enable) { - print("debug enabled.\n"); print_enable = true; + print("debug enabled.\n"); debug_matrix = true; debug_keyboard = true; debug_mouse = true; @@ -128,7 +188,7 @@ void proc_matrix(void) { _delay_ms(1000); break; case KB_X: // debug matrix toggle - usb_keyboard_clear(); + usb_keyboard_clear_report(); usb_keyboard_send(); debug_matrix = !debug_matrix; if (debug_matrix) @@ -138,7 +198,7 @@ void proc_matrix(void) { _delay_ms(1000); break; case KB_K: // debug keyboard toggle - usb_keyboard_clear(); + usb_keyboard_clear_report(); usb_keyboard_send(); debug_keyboard = !debug_keyboard; if (debug_keyboard) @@ -148,7 +208,7 @@ void proc_matrix(void) { _delay_ms(1000); break; case KB_M: // debug mouse toggle - usb_keyboard_clear(); + usb_keyboard_clear_report(); usb_keyboard_send(); debug_mouse = !debug_mouse; if (debug_mouse) @@ -158,11 +218,48 @@ void proc_matrix(void) { _delay_ms(1000); break; case KB_V: // print version & information - usb_keyboard_clear(); + 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; } } @@ -186,15 +283,6 @@ void proc_matrix(void) { // send key packet to host if (modified) { - if (key_index > 6) { - //Rollover - } usb_keyboard_send(); - usb_keyboard_print(); -#ifdef DEBUG_LED - // LED flash for debug - DEBUG_LED_CONFIG; - DEBUG_LED_OFF; -#endif } }