|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278 |
- #include <stdbool.h>
- #include <avr/io.h>
- #include <util/delay.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"
-
-
- #define MOUSE_MOVE_UNIT 10
- #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))
-
-
- // TODO: refactoring
- void proc_matrix(void) {
- static int mouse_repeat = 0;
-
- bool modified = false;
- int key_index = 0;
- uint8_t mouse_btn = 0;
- int8_t mouse_x = 0;
- int8_t mouse_y = 0;
- int8_t mouse_vwheel = 0;
- int8_t mouse_hwheel = 0;
- uint8_t fn_bits = 0;
-
- 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
- }
-
- if (matrix_has_ghost()) {
- // should send error?
- debug("matrix has ghost!!\n");
- return;
- }
-
- 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;
-
- // 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;
- }
-
- // 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 {
- if (key_index < 6)
- usb_keyboard_keys[key_index] = code;
- key_index++;
- }
- }
- }
-
- 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 (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();
- 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;
- }
- }
-
-
- // send mouse packet to host
- if (mouse_x || mouse_y || mouse_vwheel || mouse_hwheel || mouse_btn != mouse_buttons) {
- mouse_buttons = mouse_btn;
- if (mouse_x && mouse_y)
- usb_mouse_move(mouse_x*0.7, mouse_y*0.7, mouse_vwheel, mouse_hwheel);
- else
- usb_mouse_move(mouse_x, mouse_y, mouse_vwheel, mouse_hwheel);
- usb_mouse_print(mouse_x, mouse_y, mouse_vwheel, mouse_hwheel);
-
- // acceleration
- _delay_ms(MOUSE_DELAY_MS);
- mouse_repeat++;
- } else {
- mouse_repeat = 0;
- }
-
-
- // send key packet to host
- if (modified) {
- if (key_index > 6) {
- //Rollover
- }
- usb_keyboard_send();
- }
- }
|