X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=common%2Fcommand.c;h=971ef7f0af4ba9f4ba1cbd5a80c4327818b424f9;hb=47bc3016d36cbfd83904fff5947acb6436dd37c3;hp=e325a5d847e144c3ba1c6d384f1b17fbb04ac2b6;hpb=f4125707399d11a7d80587659c464b9bcddb8c56;p=tmk_firmware.git diff --git a/common/command.c b/common/command.c index e325a5d..971ef7f 100644 --- a/common/command.c +++ b/common/command.c @@ -17,148 +17,320 @@ along with this program. If not, see . #include #include #include -#include "usb_keycodes.h" +#include "keycode.h" #include "host.h" +#include "keymap.h" #include "print.h" #include "debug.h" #include "util.h" #include "timer.h" -#include "layer.h" -#include "matrix.h" +#include "keyboard.h" #include "bootloader.h" +#include "action_layer.h" +#include "action_util.h" +#include "eeconfig.h" +#include "sleep_led.h" +#include "led.h" #include "command.h" +#include "backlight.h" -#ifdef HOST_PJRC +#ifdef MOUSEKEY_ENABLE +#include "mousekey.h" +#endif + +#ifdef PROTOCOL_PJRC # include "usb_keyboard.h" # ifdef EXTRAKEY_ENABLE # include "usb_extra.h" # endif #endif -#ifdef HOST_VUSB +#ifdef PROTOCOL_VUSB # include "usbdrv.h" #endif -static uint8_t command_common(void); -static void help(void); -static void switch_layer(uint8_t layer); +static bool command_common(uint8_t code); +static void command_common_help(void); +static bool command_console(uint8_t code); +static void command_console_help(void); +#ifdef MOUSEKEY_ENABLE +static bool mousekey_console(uint8_t code); +static void mousekey_console_help(void); +#endif -static bool last_print_enable; +static uint8_t numkey2num(uint8_t code); +static void switch_default_layer(uint8_t layer); -uint8_t command_proc(void) -{ - uint8_t processed = 0; - last_print_enable = print_enable; - if (!IS_COMMAND()) - return 0; +command_state_t command_state = ONESHOT; + - print_enable = true; - if (command_extra() || command_common()) { - processed = 1; - _delay_ms(500); +bool command_proc(uint8_t code) +{ + switch (command_state) { + case ONESHOT: + if (!IS_COMMAND()) + return false; + return (command_extra(code) || command_common(code)); + break; + case CONSOLE: + if (IS_COMMAND()) + return (command_extra(code) || command_common(code)); + else + return (command_console_extra(code) || command_console(code)); + break; +#ifdef MOUSEKEY_ENABLE + case MOUSEKEY: + mousekey_console(code); + break; +#endif + default: + command_state = ONESHOT; + return false; } - print_enable = last_print_enable; - return processed; + return true; } -/* This allows to define extra commands. return 0 when not processed. */ -uint8_t command_extra(void) __attribute__ ((weak)); -uint8_t command_extra(void) +/* TODO: Refactoring is needed. */ +/* This allows to define extra commands. return false when not processed. */ +bool command_extra(uint8_t code) __attribute__ ((weak)); +bool command_extra(uint8_t code) { - return 0; + return false; +} + +bool command_console_extra(uint8_t code) __attribute__ ((weak)); +bool command_console_extra(uint8_t code) +{ + return false; +} + + +/*********************************************************** + * Command common + ***********************************************************/ +static void command_common_help(void) +{ + print("\n\n----- Command Help -----\n"); + print("c: enter console mode\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"); +#ifdef SLEEP_LED_ENABLE + print("z: toggle sleep LED test\n"); +#endif + print("v: print device version & info\n"); + print("t: print timer count\n"); + print("s: print status\n"); + print("e: print eeprom config\n"); +#ifdef NKRO_ENABLE + print("n: toggle NKRO\n"); +#endif + print("0/F10: switch to Layer0 \n"); + print("1/F1: switch to Layer1 \n"); + print("2/F2: switch to Layer2 \n"); + print("3/F3: switch to Layer3 \n"); + print("4/F4: switch to Layer4 \n"); + print("PScr: power down/remote wake-up\n"); + print("Caps: Lock Keyboard(Child Proof)\n"); + print("Paus: jump to bootloader\n"); } +#ifdef BOOTMAGIC_ENABLE +static void print_eeconfig(void) +{ + print("default_layer: "); print_dec(eeconfig_read_default_layer()); print("\n"); + + debug_config_t dc; + dc.raw = eeconfig_read_debug(); + print("debug_config.raw: "); print_hex8(dc.raw); print("\n"); + print(".enable: "); print_dec(dc.enable); print("\n"); + print(".matrix: "); print_dec(dc.matrix); print("\n"); + print(".keyboard: "); print_dec(dc.keyboard); print("\n"); + print(".mouse: "); print_dec(dc.mouse); print("\n"); + + keymap_config_t kc; + kc.raw = eeconfig_read_keymap(); + print("keymap_config.raw: "); print_hex8(kc.raw); print("\n"); + print(".swap_control_capslock: "); print_dec(kc.swap_control_capslock); print("\n"); + print(".capslock_to_control: "); print_dec(kc.capslock_to_control); print("\n"); + print(".swap_lalt_lgui: "); print_dec(kc.swap_lalt_lgui); print("\n"); + print(".swap_ralt_rgui: "); print_dec(kc.swap_ralt_rgui); print("\n"); + print(".no_gui: "); print_dec(kc.no_gui); print("\n"); + print(".swap_grave_esc: "); print_dec(kc.swap_grave_esc); print("\n"); + print(".swap_backslash_backspace: "); print_dec(kc.swap_backslash_backspace); print("\n"); + print(".nkro: "); print_dec(kc.nkro); print("\n"); -static uint8_t command_common(void) +#ifdef BACKLIGHT_ENABLE + backlight_config_t bc; + bc.raw = eeconfig_read_backlight(); + print("backlight_config.raw: "); print_hex8(bc.raw); print("\n"); + print(".enable: "); print_dec(bc.enable); print("\n"); + print(".level: "); print_dec(bc.level); print("\n"); +#endif +} +#endif + +static bool command_common(uint8_t code) { - switch (host_get_first_key()) { - case KB_H: - help(); - break; - case KB_B: - host_clear_keyboard_report(); - host_send_keyboard_report(); - print("jump to bootloader... "); + static host_driver_t *host_driver = 0; + switch (code) { +#ifdef SLEEP_LED_ENABLE + case KC_Z: + // test breathing sleep LED + print("Sleep LED test\n"); + sleep_led_toggle(); + led_set(host_keyboard_leds()); + break; +#endif +#ifdef BOOTMAGIC_ENABLE + case KC_E: + print("eeconfig:\n"); + print_eeconfig(); + break; +#endif + case KC_CAPSLOCK: + if (host_get_driver()) { + host_driver = host_get_driver(); + host_set_driver(0); + print("Locked.\n"); + } else { + host_set_driver(host_driver); + print("Unlocked.\n"); + } + break; + case KC_H: + case KC_SLASH: /* ? */ + command_common_help(); + break; + case KC_C: + debug_matrix = false; + debug_keyboard = false; + debug_mouse = false; + debug_enable = false; + command_console_help(); + print("\nEnter Console Mode\n"); + print("C> "); + command_state = CONSOLE; + break; + case KC_PAUSE: + clear_keyboard(); + print("\n\nJump to bootloader... "); _delay_ms(1000); bootloader_jump(); // not return print("not supported.\n"); break; - case KB_D: - debug_enable = !debug_enable; + case KC_D: if (debug_enable) { - last_print_enable = true; - print("debug enabled.\n"); - debug_matrix = true; - debug_keyboard = true; - debug_mouse = true; - } else { - print("debug disabled.\n"); - last_print_enable = false; - debug_matrix = false; + print("\nDEBUG: disabled.\n"); + debug_matrix = false; debug_keyboard = false; - debug_mouse = false; + debug_mouse = false; + debug_enable = false; + } else { + print("\nDEBUG: enabled.\n"); + debug_enable = true; } break; - case KB_X: // debug matrix toggle + case KC_X: // debug matrix toggle debug_matrix = !debug_matrix; - if (debug_matrix) - print("debug matrix enabled.\n"); - else - print("debug matrix disabled.\n"); + if (debug_matrix) { + print("\nDEBUG: matrix enabled.\n"); + debug_enable = true; + } else { + print("\nDEBUG: matrix disabled.\n"); + } break; - case KB_K: // debug keyboard toggle + case KC_K: // debug keyboard toggle debug_keyboard = !debug_keyboard; - if (debug_keyboard) - print("debug keyboard enabled.\n"); - else - print("debug keyboard disabled.\n"); + if (debug_keyboard) { + print("\nDEBUG: keyboard enabled.\n"); + debug_enable = true; + } else { + print("\nDEBUG: keyboard disabled.\n"); + } break; - case KB_M: // debug mouse toggle + case KC_M: // debug mouse toggle debug_mouse = !debug_mouse; - if (debug_mouse) - print("debug mouse enabled.\n"); - else - print("debug mouse disabled.\n"); - break; - case KB_V: // print version & information - print(STR(DESCRIPTION) "\n"); - break; - case KB_T: // print timer - print("timer: "); phex16(timer_count); print("\n"); - break; - case KB_P: // print toggle - if (last_print_enable) { - print("print disabled.\n"); - last_print_enable = false; + if (debug_mouse) { + print("\nDEBUG: mouse enabled.\n"); + debug_enable = true; } else { - last_print_enable = true; - print("print enabled.\n"); + print("\nDEBUG: mouse disabled.\n"); } break; - case KB_S: -#ifdef HOST_PJRC - 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"); + case KC_V: // print version & information + print("\n\n----- Version -----\n"); + print("DESC: " STR(DESCRIPTION) "\n"); + print("VID: " STR(VENDOR_ID) "(" STR(MANUFACTURER) ") " + "PID: " STR(PRODUCT_ID) "(" STR(PRODUCT) ") " + "VER: " STR(DEVICE_VER) "\n"); + print("BUILD: " STR(VERSION) " (" __TIME__ " " __DATE__ ")\n"); + /* build options */ + print("OPTIONS:" +#ifdef PROTOCOL_PJRC + " PJRC" +#endif +#ifdef PROTOCOL_LUFA + " LUFA" +#endif +#ifdef PROTOCOL_VUSB + " VUSB" +#endif +#ifdef BOOTMAGIC_ENABLE + " BOOTMAGIC" +#endif +#ifdef MOUSEKEY_ENABLE + " MOUSEKEY" +#endif +#ifdef EXTRAKEY_ENABLE + " EXTRAKEY" +#endif +#ifdef CONSOLE_ENABLE + " CONSOLE" +#endif +#ifdef COMMAND_ENABLE + " COMMAND" +#endif +#ifdef NKRO_ENABLE + " NKRO" +#endif +#ifdef KEYMAP_SECTION_ENABLE + " KEYMAP_SECTION" +#endif + " " STR(BOOTLOADER_SIZE) "\n"); + + print("GCC: " STR(__GNUC__) "." STR(__GNUC_MINOR__) "." STR(__GNUC_PATCHLEVEL__) + " AVR-LIBC: " __AVR_LIBC_VERSION_STRING__ + " AVR_ARCH: avr" STR(__AVR_ARCH__) "\n"); + break; + case KC_T: // print timer + print_val_hex32(timer_count); + break; + case KC_S: + print("\n\n----- Status -----\n"); + print_val_hex8(host_keyboard_leds()); + print_val_hex8(keyboard_protocol); + print_val_hex8(keyboard_idle); +#ifdef PROTOCOL_PJRC + print_val_hex8(UDCON); + print_val_hex8(UDIEN); + print_val_hex8(UDINT); + print_val_hex8(usb_keyboard_leds); + print_val_hex8(usb_keyboard_idle_count); #endif -#ifdef HOST_VUSB +#ifdef PROTOCOL_PJRC # if USB_COUNT_SOF - print("usbSofCount: "); phex(usbSofCount); print("\n"); + print_val_hex8(usbSofCount); # endif #endif break; #ifdef NKRO_ENABLE - case KB_N: - // send empty report before change - host_clear_keyboard_report(); - host_send_keyboard_report(); + case KC_N: + clear_keyboard(); //Prevents stuck keys. keyboard_nkro = !keyboard_nkro; if (keyboard_nkro) print("NKRO: enabled\n"); @@ -167,10 +339,9 @@ static uint8_t command_common(void) break; #endif #ifdef EXTRAKEY_ENABLE - case KB_ESC: - host_clear_keyboard_report(); - host_send_keyboard_report(); -#ifdef HOST_PJRC + case KC_PSCREEN: + // TODO: Power key should take this feature? otherwise any key during suspend. +#ifdef PROTOCOL_PJRC if (suspend && remote_wakeup) { usb_remote_wakeup(); } else { @@ -180,64 +351,293 @@ static uint8_t command_common(void) } #else host_system_send(SYSTEM_POWER_DOWN); + _delay_ms(100); host_system_send(0); _delay_ms(500); #endif break; #endif - case KB_BSPC: - matrix_init(); - print("clear matrix\n"); + case KC_ESC: + case KC_GRV: + case KC_0: + switch_default_layer(0); break; - case KB_0: - switch_layer(0); + case KC_1 ... KC_9: + switch_default_layer((code - KC_1) + 1); break; - case KB_1: - switch_layer(1); + case KC_F1 ... KC_F12: + switch_default_layer((code - KC_F1) + 1); break; - case KB_2: - switch_layer(2); + default: + print("?"); + return false; + } + return true; +} + + +/*********************************************************** + * Command console + ***********************************************************/ +static void command_console_help(void) +{ + print("\n\n----- Console Help -----\n"); + print("ESC/q: quit\n"); +#ifdef MOUSEKEY_ENABLE + print("m: mousekey\n"); +#endif +} + +static bool command_console(uint8_t code) +{ + switch (code) { + case KC_H: + case KC_SLASH: /* ? */ + command_console_help(); + break; + case KC_Q: + case KC_ESC: + print("\nQuit Console Mode\n"); + command_state = ONESHOT; + return false; +#ifdef MOUSEKEY_ENABLE + case KC_M: + mousekey_console_help(); + print("\nEnter Mousekey Console\n"); + print("M0>"); + command_state = MOUSEKEY; + return true; +#endif + default: + print("?"); + return false; + } + print("C> "); + return true; +} + + +#ifdef MOUSEKEY_ENABLE +/*********************************************************** + * Mousekey console + ***********************************************************/ +static uint8_t mousekey_param = 0; + +static void mousekey_param_print(void) +{ + print("\n\n----- Mousekey Parameters -----\n"); + print("1: mk_delay(*10ms): "); pdec(mk_delay); print("\n"); + print("2: mk_interval(ms): "); pdec(mk_interval); print("\n"); + print("3: mk_max_speed: "); pdec(mk_max_speed); print("\n"); + print("4: mk_time_to_max: "); pdec(mk_time_to_max); print("\n"); + print("5: mk_wheel_max_speed: "); pdec(mk_wheel_max_speed); print("\n"); + print("6: mk_wheel_time_to_max: "); pdec(mk_wheel_time_to_max); print("\n"); +} + +#define PRINT_SET_VAL(v) print(#v " = "); print_dec(v); print("\n"); +static void mousekey_param_inc(uint8_t param, uint8_t inc) +{ + switch (param) { + case 1: + if (mk_delay + inc < UINT8_MAX) + mk_delay += inc; + else + mk_delay = UINT8_MAX; + PRINT_SET_VAL(mk_delay); + break; + case 2: + if (mk_interval + inc < UINT8_MAX) + mk_interval += inc; + else + mk_interval = UINT8_MAX; + PRINT_SET_VAL(mk_interval); + break; + case 3: + if (mk_max_speed + inc < UINT8_MAX) + mk_max_speed += inc; + else + mk_max_speed = UINT8_MAX; + PRINT_SET_VAL(mk_max_speed); + break; + case 4: + if (mk_time_to_max + inc < UINT8_MAX) + mk_time_to_max += inc; + else + mk_time_to_max = UINT8_MAX; + PRINT_SET_VAL(mk_time_to_max); + break; + case 5: + if (mk_wheel_max_speed + inc < UINT8_MAX) + mk_wheel_max_speed += inc; + else + mk_wheel_max_speed = UINT8_MAX; + PRINT_SET_VAL(mk_wheel_max_speed); + break; + case 6: + if (mk_wheel_time_to_max + inc < UINT8_MAX) + mk_wheel_time_to_max += inc; + else + mk_wheel_time_to_max = UINT8_MAX; + PRINT_SET_VAL(mk_wheel_time_to_max); + break; + } +} + +static void mousekey_param_dec(uint8_t param, uint8_t dec) +{ + switch (param) { + case 1: + if (mk_delay > dec) + mk_delay -= dec; + else + mk_delay = 0; + PRINT_SET_VAL(mk_delay); break; - case KB_3: - switch_layer(3); + case 2: + if (mk_interval > dec) + mk_interval -= dec; + else + mk_interval = 0; + PRINT_SET_VAL(mk_interval); + break; + case 3: + if (mk_max_speed > dec) + mk_max_speed -= dec; + else + mk_max_speed = 0; + PRINT_SET_VAL(mk_max_speed); break; - case KB_4: - switch_layer(4); + case 4: + if (mk_time_to_max > dec) + mk_time_to_max -= dec; + else + mk_time_to_max = 0; + PRINT_SET_VAL(mk_time_to_max); + break; + case 5: + if (mk_wheel_max_speed > dec) + mk_wheel_max_speed -= dec; + else + mk_wheel_max_speed = 0; + PRINT_SET_VAL(mk_wheel_max_speed); + break; + case 6: + if (mk_wheel_time_to_max > dec) + mk_wheel_time_to_max -= dec; + else + mk_wheel_time_to_max = 0; + PRINT_SET_VAL(mk_wheel_time_to_max); + break; + } +} + +static void mousekey_console_help(void) +{ + print("\n\n----- Mousekey Parameters Help -----\n"); + print("ESC/q: quit\n"); + print("1: select mk_delay(*10ms)\n"); + print("2: select mk_interval(ms)\n"); + print("3: select mk_max_speed\n"); + print("4: select mk_time_to_max\n"); + print("5: select mk_wheel_max_speed\n"); + print("6: select mk_wheel_time_to_max\n"); + print("p: print prameters\n"); + print("d: set default values\n"); + print("up: increase prameters(+1)\n"); + print("down: decrease prameters(-1)\n"); + print("pgup: increase prameters(+10)\n"); + print("pgdown: decrease prameters(-10)\n"); + print("\nspeed = delta * max_speed * (repeat / time_to_max)\n"); + print("where delta: cursor="); pdec(MOUSEKEY_MOVE_DELTA); + print(", wheel="); pdec(MOUSEKEY_WHEEL_DELTA); print("\n"); + print("See http://en.wikipedia.org/wiki/Mouse_keys\n"); +} + +static bool mousekey_console(uint8_t code) +{ + switch (code) { + case KC_H: + case KC_SLASH: /* ? */ + mousekey_console_help(); + break; + case KC_Q: + case KC_ESC: + mousekey_param = 0; + print("\nQuit Mousekey Console\n"); + print("C> "); + command_state = CONSOLE; + return false; + case KC_P: + mousekey_param_print(); + break; + case KC_1: + case KC_2: + case KC_3: + case KC_4: + case KC_5: + case KC_6: + case KC_7: + case KC_8: + case KC_9: + case KC_0: + mousekey_param = numkey2num(code); + print("selected parameter: "); pdec(mousekey_param); print("\n"); + break; + case KC_UP: + mousekey_param_inc(mousekey_param, 1); + break; + case KC_DOWN: + mousekey_param_dec(mousekey_param, 1); + break; + case KC_PGUP: + mousekey_param_inc(mousekey_param, 10); + break; + case KC_PGDN: + mousekey_param_dec(mousekey_param, 10); + break; + case KC_D: + mk_delay = MOUSEKEY_DELAY/10; + mk_interval = MOUSEKEY_INTERVAL; + mk_max_speed = MOUSEKEY_MAX_SPEED; + mk_time_to_max = MOUSEKEY_TIME_TO_MAX; + mk_wheel_max_speed = MOUSEKEY_WHEEL_MAX_SPEED; + mk_wheel_time_to_max = MOUSEKEY_WHEEL_TIME_TO_MAX; + print("set default values.\n"); break; default: - return 0; + print("?"); + return false; } - return 1; + print("M"); pdec(mousekey_param); print("> "); + return true; } +#endif -static void help(void) + +/*********************************************************** + * Utilities + ***********************************************************/ +static uint8_t numkey2num(uint8_t code) { - 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"); -#ifdef NKRO_ENABLE - print("n: toggle 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"); + switch (code) { + case KC_1: return 1; + case KC_2: return 2; + case KC_3: return 3; + case KC_4: return 4; + case KC_5: return 5; + case KC_6: return 6; + case KC_7: return 7; + case KC_8: return 8; + case KC_9: return 9; + case KC_0: return 0; + } + return 0; } -static void switch_layer(uint8_t layer) +static void switch_default_layer(uint8_t layer) { - print("current_layer: "); phex(current_layer); print("\n"); - print("default_layer: "); phex(default_layer); print("\n"); - current_layer = layer; - default_layer = layer; - print("switch to Layer: "); phex(layer); print("\n"); + print("switch_default_layer: "); print_dec(biton32(default_layer_state)); + print(" to "); print_dec(layer); print("\n"); + default_layer_set(1UL<