From 452d23da5267899933ca336ae91e7b297d5dfb0b Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 1 Mar 2018 07:46:57 -0800 Subject: Update to drashna keymaps and userspace (#2450) * Add OSL keycodes and macro handling * Re-add AVRDUDE target * Userspace document cleanup and commenting * Fix Orthodox keymap layout (cosmetic) * Add caveat for KEYMAP Macros * Minor tweaks * Enable Bootmagic in Ergodox EZ * Minor tweaks --- users/drashna/drashna.c | 350 ++++++++++++++++++++++-------------------------- 1 file changed, 163 insertions(+), 187 deletions(-) (limited to 'users/drashna/drashna.c') diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c index 0bf83cb9f..678570958 100644 --- a/users/drashna/drashna.c +++ b/users/drashna/drashna.c @@ -32,14 +32,27 @@ PROGMEM const char secret[][64] = { }; #endif +#ifdef AUDIO_ENABLE +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +float tone_workman[][2] = SONG(PLOVER_SOUND); +float tone_hackstartup[][2] = SONG(ONE_UP_SOUND); +#endif + #ifdef FAUXCLICKY_ENABLE float fauxclicky_pressed_note[2] = MUSICAL_NOTE(_A6, 2); // (_D4, 0.25); float fauxclicky_released_note[2] = MUSICAL_NOTE(_A6, 2); // (_C4, 0.125); #else float fauxclicky_pressed[][2] = SONG(E__NOTE(_A6)); // change to your tastes float fauxclicky_released[][2] = SONG(E__NOTE(_A6)); // change to your tastes -#endif -bool faux_click_enabled = true; +#endif + +bool faux_click_enabled = false; +bool is_overwatch = false; +#ifdef RGBLIGHT_ENABLE +bool rgb_layer_change = true; +#endif #ifdef TAP_DANCE_ENABLE //define diablo macro timer variables @@ -47,15 +60,11 @@ static uint16_t diablo_timer[4]; static uint8_t diablo_times[] = { 0, 1, 3, 5, 10, 30 }; static uint8_t diablo_key_time[4]; - bool check_dtimer(uint8_t dtimer) { // has the correct number of seconds elapsed (as defined by diablo_times) return (timer_elapsed(diablo_timer[dtimer]) < (diablo_key_time[dtimer] * 1000)) ? false : true; }; - - - // Cycle through the times for the macro, starting at 0, for disabled. // Max of six values, so don't exceed void diablo_tapdance_master(qk_tap_dance_state_t *state, void *user_data, uint8_t diablo_key) { @@ -68,26 +77,20 @@ void diablo_tapdance_master(qk_tap_dance_state_t *state, void *user_data, uint8_ } } - // Would rather have one function for all of this, but no idea how to do that... void diablo_tapdance1(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 0); } - void diablo_tapdance2(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 1); } - void diablo_tapdance3(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 2); } - void diablo_tapdance4(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 3); } - - //Tap Dance Definitions qk_tap_dance_action_t tap_dance_actions[] = { // tap once to disable, and more to enable timed micros @@ -97,14 +100,40 @@ qk_tap_dance_action_t tap_dance_actions[] = { [TD_D3_4] = ACTION_TAP_DANCE_FN(diablo_tapdance4), }; -#endif -#ifdef AUDIO_ENABLE -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -float tone_dvorak[][2] = SONG(DVORAK_SOUND); -float tone_colemak[][2] = SONG(COLEMAK_SOUND); -float tone_workman[][2] = SONG(PLOVER_SOUND); -float tone_hackstartup[][2] = SONG(ONE_UP_SOUND); +// Sends the key press to system, but only if on the Diablo layer +void send_diablo_keystroke(uint8_t diablo_key) { + if (biton32(layer_state) == _DIABLO) { + switch (diablo_key) { + case 0: + SEND_STRING("1"); + break; + case 1: + SEND_STRING("2"); + break; + case 2: + SEND_STRING("3"); + break; + case 3: + SEND_STRING("4"); + break; + } + } +} + +// Checks each of the 4 timers/keys to see if enough time has elapsed +// Runs the "send string" command if enough time has passed, and resets the timer. +void run_diablo_macro_check(void) { + uint8_t dtime; + + for (dtime = 0; dtime < 4; dtime++) { + if (check_dtimer(dtime) && diablo_key_time[dtime]) { + diablo_timer[dtime] = timer_read(); + send_diablo_keystroke(dtime); + } + } +} + #endif @@ -131,13 +160,6 @@ uint32_t layer_state_set_keymap (uint32_t state) { __attribute__ ((weak)) void led_set_keymap(uint8_t usb_led) {} -bool is_overwatch = false; -#ifdef RGBLIGHT_ENABLE -bool rgb_layer_change = true; -#endif - - - // Call user matrix init, set default RGB colors and then // call the keymap's init function @@ -166,50 +188,9 @@ void matrix_init_user(void) { rgblight_set_red; rgblight_mode(5); } -#endif -#ifdef AUDIO_ENABLE -// wait_ms(21); // gets rid of tick -// stop_all_notes(); -// PLAY_SONG(tone_hackstartup); #endif matrix_init_keymap(); } -#ifdef TAP_DANCE_ENABLE - -// Sends the key press to system, but only if on the Diablo layer -void send_diablo_keystroke(uint8_t diablo_key) { - if (biton32(layer_state) == _DIABLO) { - switch (diablo_key) { - case 0: - SEND_STRING("1"); - break; - case 1: - SEND_STRING("2"); - break; - case 2: - SEND_STRING("3"); - break; - case 3: - SEND_STRING("4"); - break; - } - } -} - -// Checks each of the 4 timers/keys to see if enough time has elapsed -// Runs the "send string" command if enough time has passed, and resets the timer. -void run_diablo_macro_check(void) { - uint8_t dtime; - - for (dtime = 0; dtime < 4; dtime++) { - if (check_dtimer(dtime) && diablo_key_time[dtime]) { - diablo_timer[dtime] = timer_read(); - send_diablo_keystroke(dtime); - } - } - -} -#endif // No global matrix scan code, so just run keymap's matix // scan function void matrix_scan_user(void) { @@ -219,11 +200,10 @@ void matrix_scan_user(void) { matrix_scan_keymap(); } -void led_set_user(uint8_t usb_led) { - led_set_keymap(usb_led); -} - +// This block is for all of the gaming macros, as they were all doing +// the same thing, but with differring text sent. void send_game_macro(const char *str) { + clear_keyboard(); register_code(is_overwatch ? KC_BSPC : KC_ENTER); unregister_code(is_overwatch ? KC_BSPC : KC_ENTER); wait_ms(50); @@ -232,21 +212,26 @@ void send_game_macro(const char *str) { unregister_code(KC_ENTER); } + +// Sent the default layer void persistent_default_layer_set(uint16_t default_layer) { eeconfig_update_default_layer(default_layer); default_layer_set(default_layer); } + // Defines actions tor my global custom keycodes. Defined in drashna.h file // Then runs the _keymap's recod handier if not processed here bool process_record_user(uint16_t keycode, keyrecord_t *record) { +// If console is enabled, it will print the matrix position and status of each key pressed #ifdef CONSOLE_ENABLE xprintf("KL: row: %u, column: %u, pressed: %u\n", record->event.key.col, record->event.key.row, record->event.pressed); -#endif +#endif //CONSOLE_ENABLE -#ifdef AUDIO_ENABLE - if (faux_click_enabled) { +// Run custom faux click code, but only if faux clicky is enabled +#ifdef AUDIO_ENABLE + if ( (faux_click_enabled && keycode != KC_FXCL) || (!faux_click_enabled && keycode == KC_FXCL) ) { if (record->event.pressed) { PLAY_SONG(fauxclicky_pressed); } else { @@ -254,14 +239,15 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { PLAY_SONG(fauxclicky_released); } } -#endif +#endif //AUDIO_ENABLE + switch (keycode) { case KC_QWERTY: if (record->event.pressed) { #ifdef AUDIO_ENABLE PLAY_SONG(tone_qwerty); -#endif +#endif //AUDIO_ENABLE persistent_default_layer_set(1UL << _QWERTY); } return false; @@ -270,7 +256,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (record->event.pressed) { #ifdef AUDIO_ENABLE PLAY_SONG(tone_colemak); -#endif +#endif //AUDIO_ENABLE persistent_default_layer_set(1UL << _COLEMAK); } return false; @@ -279,7 +265,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (record->event.pressed) { #ifdef AUDIO_ENABLE PLAY_SONG(tone_dvorak); -#endif +#endif //AUDIO_ENABLE persistent_default_layer_set(1UL << _DVORAK); } return false; @@ -288,11 +274,13 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (record->event.pressed) { #ifdef AUDIO_ENABLE PLAY_SONG(tone_workman); -#endif +#endif //AUDIO_ENABLE persistent_default_layer_set(1UL << _WORKMAN); } return false; break; + + case LOWER: if (record->event.pressed) { layer_on(_LOWER); @@ -324,85 +312,108 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; -#if !(defined(KEYBOARD_orthodox_rev1) || defined(KEYBOARD_orthodox_rev3) || defined(KEYBOARD_ergodox_ez)) - case KC_OVERWATCH: - if (record->event.pressed) { - is_overwatch = !is_overwatch; - } -#ifdef RGBLIGHT_ENABLE - is_overwatch ? rgblight_mode(17) : rgblight_mode(18); -#endif - return false; - break; - case KC_SALT: + + + case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader if (!record->event.pressed) { - send_game_macro("Salt, salt, salt..."); + SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP +#if (defined(BOOTLOADER_DFU) || defined(BOOTLOADER_LUFA_DFU) || defined(BOOTLOADER_QMK_DFU)) + ":dfu" +#elif defined(BOOTLOADER_HALFKAY) + ":teensy" +#elif defined(BOOTLOADER_CATERINA) + ":avrdude" +#endif + SS_TAP(X_ENTER)); } return false; break; - case KC_MORESALT: + case KC_RESET: // Custom RESET code that setr RGBLights to RED if (!record->event.pressed) { - send_game_macro("Please sir, can I have some more salt?!"); +#ifdef RGBLIGHT_ENABLE + rgblight_enable(); + rgblight_mode(1); + rgblight_setrgb(0xff, 0x00, 0x00); +#endif + reset_keyboard(); } return false; break; - case KC_SALTHARD: - if (!record->event.pressed) { - send_game_macro("Your salt only makes me harder, and even more aggressive!"); + case EPRM: // Resets EEPROM + if (record->event.pressed) { + eeconfig_init(); } return false; break; - case KC_GOODGAME: - if (!record->event.pressed) { - send_game_macro("Good game, everyone!"); + case VRSN: // Prints firmware version + if (record->event.pressed) { + SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); } return false; break; - case KC_GLHF: + case KC_SECRET_1 ... KC_SECRET_5: // Custom if (!record->event.pressed) { - send_game_macro("Good luck, have fun!!!"); + clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); + send_string_P(secret[keycode - KC_SECRET_1]); } return false; break; - case KC_SYMM: - if (!record->event.pressed) { - send_game_macro("Left click to win!"); - } + + +// These are a serious of gaming macros. +// Only enables for the viterbi, basically, +// to save on firmware space, since it's limited. +#if !(defined(KEYBOARD_orthodox_rev1) || defined(KEYBOARD_orthodox_rev3) || defined(KEYBOARD_ergodox_ez)) + + + case KC_OVERWATCH: // Toggle's if we hit "ENTER" or "BACKSPACE" to input macros + if (record->event.pressed) { is_overwatch = !is_overwatch; } +#ifdef RGBLIGHT_ENABLE + is_overwatch ? rgblight_mode(17) : rgblight_mode(18); +#endif //RGBLIGHT_ENABLE return false; break; + + case KC_SALT: + if (!record->event.pressed) { send_game_macro("Salt, salt, salt..."); } + return false; break; + case KC_MORESALT: + if (!record->event.pressed) { send_game_macro("Please sir, can I have some more salt?!"); } + return false; break; + case KC_SALTHARD: + if (!record->event.pressed) { send_game_macro("Your salt only makes me harder, and even more aggressive!"); } + return false; break; + case KC_GOODGAME: + if (!record->event.pressed) { send_game_macro("Good game, everyone!"); } + return false; break; + case KC_GLHF: + if (!record->event.pressed) { send_game_macro("Good luck, have fun!!!"); } + return false; break; + case KC_SYMM: + if (!record->event.pressed) { send_game_macro("Left click to win!"); } + return false; break; case KC_JUSTGAME: - if (!record->event.pressed) { - send_game_macro("It may be a game, but if you don't want to actually try, please go play AI, so that people that actually want to take the game seriously and \"get good\" have a place to do so without trolls like you throwing games."); - } - return false; - break; + if (!record->event.pressed) { send_game_macro("It may be a game, but if you don't want to actually try, please go play AI, so that people that actually want to take the game seriously and \"get good\" have a place to do so without trolls like you throwing games."); } + return false; break; case KC_TORB: - if (!record->event.pressed) { - send_game_macro("That was positively riveting!"); - } - return false; - break; + if (!record->event.pressed) { send_game_macro("That was positively riveting!"); } + return false; break; case KC_AIM: if (!record->event.pressed) { send_game_macro("That aim is absolutely amazing. It's almost like you're a machine!"); wait_ms(3000); send_game_macro("Wait! That aim is TOO good! You're clearly using an aim hack! CHEATER!"); } - return false; - break; + return false; break; case KC_C9: - if (!record->event.pressed) { - send_game_macro("OMG!!! C9!!!"); - } - return false; - break; + if (!record->event.pressed) { send_game_macro("OMG!!! C9!!!"); } + return false; break; case KC_GGEZ: - if (!record->event.pressed) { - send_game_macro("That was a fantastic game, though it was a bit easy. Try harder next time!"); - } - return false; - break; -#endif + if (!record->event.pressed) { send_game_macro("That was a fantastic game, though it was a bit easy. Try harder next time!"); } + return false; break; +#endif // !(defined(KEYBOARD_orthodox_rev1) || defined(KEYBOARD_orthodox_rev3) || defined(KEYBOARD_ergodox_ez)) + + #ifdef TAP_DANCE_ENABLE case KC_DIABLO_CLEAR: // reset all Diable timers, disabling them if (record->event.pressed) { @@ -412,78 +423,37 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { diablo_key_time[dtime] = diablo_times[0]; } } - return false; - break; -#endif - case KC_MAKE: - if (!record->event.pressed) { - SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP -#if (defined(BOOTLOADER_DFU) || defined(BOOTLOADER_LUFA_DFU) || defined(BOOTLOADER_QMK_DFU)) - ":dfu" -#elif defined(BOOTLOADER_HALFKAY) - ":teensy" -//#elif defined(BOOTLOADER_CATERINA) -// ":avrdude" -#endif - SS_TAP(X_ENTER)); - } - return false; - break; - case KC_RESET: - if (!record->event.pressed) { -#ifdef RGBLIGHT_ENABLE - rgblight_enable(); - rgblight_mode(1); - rgblight_setrgb(0xff, 0x00, 0x00); -#endif - reset_keyboard(); - } - return false; - break; - case EPRM: - if (record->event.pressed) { - eeconfig_init(); - } - return false; - break; - case VRSN: - if (record->event.pressed) { - SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); - } - return false; - break; - case KC_SECRET_1 ... KC_SECRET_5: - if (!record->event.pressed) { - send_string_P(secret[keycode - KC_SECRET_1]); - } - return false; - break; + return false; break; +#endif // TAP_DANCE_ENABLE + + case KC_FXCL: - if (!record->event.pressed) { + if (!record->event.pressed) { // Toggles the custom faux click code faux_click_enabled = !faux_click_enabled; } - return false; - break; - case KC_RGB_T: // Because I want the option to go back to normal RGB mode rather than always layer indication + return false; break; + case KC_RGB_T: // This allows me to use underglow as layer indication, or as normal #ifdef RGBLIGHT_ENABLE if (record->event.pressed) { rgb_layer_change = !rgb_layer_change; + if (rgb_layer_change) { + layer_state_set(layer_state); // This is needed to immediately set the layer color (looks beetter) + } } -#endif - return false; - break; +#endif // RGBLIGHT_ENABLE + return false; break; #ifdef RGBLIGHT_ENABLE case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // quantum_keycodes.h L400 for definitions if (record->event.pressed) { //This disrables layer indication, as it's assumed that if you're changing this ... you want that disabled rgb_layer_change = false; } - return true; - break; -#endif + return true; break; +#endif // RGBLIGHT_ENABLE } return process_record_keymap(keycode, record); } + // Runs state check and changes underglow color and animation // on layer change, no matter where the change was initiated // Then runs keymap's layer change check @@ -536,7 +506,7 @@ uint32_t layer_state_set_user(uint32_t state) { rgblight_set_green; rgblight_mode(2); break; - default: + default: // for any other layers, or the default layer if (default_layer & (1UL << _COLEMAK)) { rgblight_set_magenta; } @@ -549,9 +519,9 @@ uint32_t layer_state_set_user(uint32_t state) { else { rgblight_set_teal; } - if (biton32(state) == _MODS) { + if (biton32(state) == _MODS) { // If the non-OSM layer is enabled, then breathe rgblight_mode(2); - } else { + } else { // otherwise, stay solid rgblight_mode(1); } break; @@ -562,3 +532,9 @@ uint32_t layer_state_set_user(uint32_t state) { } +// Any custom LED code goes here. +// So far, I only have keyboard specific code, +// So nothing goes here. +void led_set_user(uint8_t usb_led) { + led_set_keymap(usb_led); +} -- cgit v1.2.3