2017-11-17 19:59:54 +00:00
/*
Copyright 2017 Christopher Courtney < drashna @ live . com > @ drashna
This program is free software : you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation , either version 2 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
2017-11-07 05:11:08 +00:00
# include "drashna.h"
2018-06-01 05:11:06 +00:00
# include "tap_dances.h"
# include "rgb_stuff.h"
2017-11-07 05:11:08 +00:00
2018-05-02 15:39:46 +00:00
userspace_config_t userspace_config ;
2018-10-02 01:00:14 +00:00
uint16_t copy_paste_timer ;
2018-05-02 15:39:46 +00:00
// Helper Functions
2017-11-17 19:59:54 +00:00
2018-06-01 05:11:06 +00:00
// This block is for all of the gaming macros, as they were all doing
// the same thing, but with differring text sent.
bool send_game_macro ( const char * str , keyrecord_t * record , bool override ) {
if ( ! record - > event . pressed | | override ) {
2018-08-29 17:42:15 +00:00
uint16_t keycode ;
if ( userspace_config . is_overwatch ) {
keycode = KC_BSPC ;
} else {
keycode = KC_ENTER ;
}
2018-06-01 05:11:06 +00:00
clear_keyboard ( ) ;
2018-10-15 19:34:49 +00:00
tap_code ( keycode ) ;
2018-06-01 05:11:06 +00:00
wait_ms ( 50 ) ;
2018-07-17 01:04:32 +00:00
send_string_with_delay ( str , MACRO_TIMER ) ;
2018-06-01 05:11:06 +00:00
wait_ms ( 50 ) ;
2018-10-15 19:34:49 +00:00
tap_code ( KC_ENTER ) ;
2018-03-01 15:46:57 +00:00
}
2018-06-01 05:11:06 +00:00
if ( override ) wait_ms ( 3000 ) ;
return false ;
2018-03-01 15:46:57 +00:00
}
2018-07-17 01:04:32 +00:00
bool mod_key_press_timer ( uint16_t code , uint16_t mod_code , bool pressed ) {
static uint16_t this_timer ;
if ( pressed ) {
this_timer = timer_read ( ) ;
} else {
if ( timer_elapsed ( this_timer ) < TAPPING_TERM ) {
register_code ( code ) ;
unregister_code ( code ) ;
} else {
register_code ( mod_code ) ;
register_code ( code ) ;
unregister_code ( code ) ;
unregister_code ( mod_code ) ;
}
}
return false ;
}
bool mod_key_press ( uint16_t code , uint16_t mod_code , bool pressed , uint16_t this_timer ) {
if ( pressed ) {
this_timer = timer_read ( ) ;
} else {
if ( timer_elapsed ( this_timer ) < TAPPING_TERM ) {
register_code ( code ) ;
unregister_code ( code ) ;
} else {
register_code ( mod_code ) ;
register_code ( code ) ;
unregister_code ( code ) ;
unregister_code ( mod_code ) ;
}
}
return false ;
}
2017-11-17 19:59:54 +00:00
2017-11-11 03:58:53 +00:00
// Add reconfigurable functions here, for keymap customization
// This allows for a global, userspace functions, and continued
// customization of the keymap. Use _keymap instead of _user
// functions in the keymaps
2017-11-07 05:11:08 +00:00
__attribute__ ( ( weak ) )
void matrix_init_keymap ( void ) { }
2018-07-17 01:04:32 +00:00
__attribute__ ( ( weak ) )
void startup_keymap ( void ) { }
2018-08-29 17:42:15 +00:00
__attribute__ ( ( weak ) )
void shutdown_keymap ( void ) { }
2018-07-17 01:04:32 +00:00
__attribute__ ( ( weak ) )
void suspend_power_down_keymap ( void ) { }
__attribute__ ( ( weak ) )
void suspend_wakeup_init_keymap ( void ) { }
2017-11-07 05:11:08 +00:00
__attribute__ ( ( weak ) )
void matrix_scan_keymap ( void ) { }
__attribute__ ( ( weak ) )
bool process_record_keymap ( uint16_t keycode , keyrecord_t * record ) {
return true ;
}
2017-11-17 19:59:54 +00:00
2018-06-01 05:11:06 +00:00
__attribute__ ( ( weak ) )
bool process_record_secrets ( uint16_t keycode , keyrecord_t * record ) {
return true ;
}
2018-07-17 01:04:32 +00:00
2017-11-11 03:58:53 +00:00
__attribute__ ( ( weak ) )
uint32_t layer_state_set_keymap ( uint32_t state ) {
return state ;
}
2017-11-07 05:11:08 +00:00
2018-07-17 01:04:32 +00:00
__attribute__ ( ( weak ) )
uint32_t default_layer_state_set_keymap ( uint32_t state ) {
return state ;
}
2017-11-17 19:59:54 +00:00
__attribute__ ( ( weak ) )
void led_set_keymap ( uint8_t usb_led ) { }
2018-10-15 19:34:49 +00:00
__attribute__ ( ( weak ) )
void eeconfig_init_keymap ( void ) { }
2018-08-29 17:42:15 +00:00
2017-11-11 03:58:53 +00:00
// Call user matrix init, set default RGB colors and then
// call the keymap's init function
2017-11-07 05:11:08 +00:00
void matrix_init_user ( void ) {
2018-10-15 19:34:49 +00:00
userspace_config . raw = eeconfig_read_user ( ) ;
2018-06-01 05:11:06 +00:00
2018-05-16 02:34:34 +00:00
# ifdef BOOTLOADER_CATERINA
DDRD & = ~ ( 1 < < 5 ) ;
PORTD & = ~ ( 1 < < 5 ) ;
2017-11-07 05:11:08 +00:00
2018-05-16 02:34:34 +00:00
DDRB & = ~ ( 1 < < 0 ) ;
PORTB & = ~ ( 1 < < 0 ) ;
# endif
2018-06-01 05:11:06 +00:00
# if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
2018-10-02 01:00:14 +00:00
if ( eeprom_read_byte ( EECONFIG_UNICODEMODE ) ! = UC_WIN ) {
set_unicode_input_mode ( UC_WIN ) ;
}
2018-04-01 02:38:06 +00:00
# endif //UNICODE_ENABLE
2017-11-07 05:11:08 +00:00
matrix_init_keymap ( ) ;
}
2018-06-01 05:11:06 +00:00
2018-07-17 01:04:32 +00:00
void startup_user ( void ) {
# ifdef RGBLIGHT_ENABLE
matrix_init_rgb ( ) ;
# endif //RGBLIGHT_ENABLE
startup_keymap ( ) ;
}
2018-08-29 17:42:15 +00:00
void shutdown_user ( void ) {
# ifdef RGBLIGHT_ENABLE
rgblight_enable_noeeprom ( ) ;
rgblight_mode_noeeprom ( 1 ) ;
rgblight_setrgb_red ( ) ;
# endif // RGBLIGHT_ENABLE
# ifdef RGB_MATRIX_ENABLE
rgb_led led ;
for ( int i = 0 ; i < DRIVER_LED_TOTAL ; i + + ) {
led = g_rgb_leds [ i ] ;
if ( led . matrix_co . raw < 0xFF ) {
rgb_matrix_set_color ( i , 0xFF , 0x00 , 0x00 ) ;
}
}
# endif //RGB_MATRIX_ENABLE
shutdown_keymap ( ) ;
}
2018-10-02 01:00:14 +00:00
void suspend_power_down_user ( void ) {
2018-07-17 01:04:32 +00:00
suspend_power_down_keymap ( ) ;
}
2018-10-02 01:00:14 +00:00
void suspend_wakeup_init_user ( void ) {
2018-07-17 01:04:32 +00:00
suspend_wakeup_init_keymap ( ) ;
}
2018-06-01 05:11:06 +00:00
2018-03-25 20:01:15 +00:00
// No global matrix scan code, so just run keymap's matrix
2017-11-11 03:58:53 +00:00
// scan function
2017-11-07 05:11:08 +00:00
void matrix_scan_user ( void ) {
2018-07-17 01:04:32 +00:00
static bool has_ran_yet ;
if ( ! has_ran_yet ) {
has_ran_yet = true ;
startup_user ( ) ;
}
2018-05-02 15:39:46 +00:00
2017-11-17 19:59:54 +00:00
# ifdef TAP_DANCE_ENABLE // Run Diablo 3 macro checking code.
run_diablo_macro_check ( ) ;
2018-04-01 02:38:06 +00:00
# endif // TAP_DANCE_ENABLE
2018-05-02 15:39:46 +00:00
2018-06-01 05:11:06 +00:00
# ifdef RGBLIGHT_ENABLE
matrix_scan_rgb ( ) ;
# endif // RGBLIGHT_ENABLE
2017-11-07 05:11:08 +00:00
matrix_scan_keymap ( ) ;
}
2018-04-21 00:53:19 +00:00
2017-11-07 05:11:08 +00:00
2018-03-01 15:46:57 +00:00
2017-11-11 03:58:53 +00:00
// Defines actions tor my global custom keycodes. Defined in drashna.h file
2018-03-25 20:01:15 +00:00
// Then runs the _keymap's record handier if not processed here
2017-11-07 05:11:08 +00:00
bool process_record_user ( uint16_t keycode , keyrecord_t * record ) {
2018-01-17 19:28:23 +00:00
2018-04-01 02:38:06 +00:00
// If console is enabled, it will print the matrix position and status of each key pressed
2018-06-01 05:11:06 +00:00
# ifdef KEYLOGGER_ENABLE
2018-10-02 01:00:14 +00:00
# if defined(KEYBOARD_ergodox_ez) || defined(KEYBOARD_iris_rev2)
xprintf ( " KL: col: %u, row: %u, pressed: %u \n " , record - > event . key . row , record - > event . key . col , record - > event . pressed ) ;
# else
xprintf ( " KL: col: %u, row: %u, pressed: %u \n " , record - > event . key . col , record - > event . key . row , record - > event . pressed ) ;
# endif
2018-06-01 05:11:06 +00:00
# endif //KEYLOGGER_ENABLE
2018-01-17 19:28:23 +00:00
2017-11-07 05:11:08 +00:00
switch ( keycode ) {
case KC_QWERTY :
if ( record - > event . pressed ) {
2018-03-25 20:01:15 +00:00
set_single_persistent_default_layer ( _QWERTY ) ;
2017-11-07 05:11:08 +00:00
}
return false ;
break ;
case KC_COLEMAK :
if ( record - > event . pressed ) {
2018-03-25 20:01:15 +00:00
set_single_persistent_default_layer ( _COLEMAK ) ;
2017-11-07 05:11:08 +00:00
}
return false ;
break ;
case KC_DVORAK :
if ( record - > event . pressed ) {
2018-03-25 20:01:15 +00:00
set_single_persistent_default_layer ( _DVORAK ) ;
2017-11-07 05:11:08 +00:00
}
return false ;
break ;
case KC_WORKMAN :
if ( record - > event . pressed ) {
2018-03-25 20:01:15 +00:00
set_single_persistent_default_layer ( _WORKMAN ) ;
2017-11-07 05:11:08 +00:00
}
return false ;
break ;
2018-03-01 15:46:57 +00:00
case KC_MAKE : // Compiles the firmware, and adds the flash command based on keyboard bootloader
2017-11-07 05:11:08 +00:00
if ( ! record - > event . pressed ) {
2018-10-15 19:34:49 +00:00
uint8_t temp_mod = get_mods ( ) ;
clear_mods ( ) ;
send_string_with_delay_P ( PSTR ( " make " QMK_KEYBOARD " : " QMK_KEYMAP ) , 10 ) ;
if ( temp_mod & MODS_SHIFT_MASK ) {
send_string_with_delay_P ( PSTR (
2018-10-02 01:00:14 +00:00
# if defined(__ARM__)
" :dfu-util "
# elif defined(BOOTLOADER_DFU)
2018-03-01 15:46:57 +00:00
" :dfu "
# elif defined(BOOTLOADER_HALFKAY)
" :teensy "
# elif defined(BOOTLOADER_CATERINA)
" :avrdude "
2018-04-01 02:38:06 +00:00
# endif // bootloader options
2018-10-15 19:34:49 +00:00
) , 10 ) ;
}
if ( temp_mod & MODS_CTRL_MASK ) { send_string_with_delay_P ( PSTR ( " -j8 --output-sync " ) , 10 ) ; }
send_string_with_delay_P ( PSTR ( SS_TAP ( X_ENTER ) ) , 10 ) ;
set_mods ( temp_mod ) ;
2017-11-07 05:11:08 +00:00
}
return false ;
break ;
2018-03-25 20:01:15 +00:00
2018-03-01 15:46:57 +00:00
case EPRM : // Resets EEPROM
if ( record - > event . pressed ) {
eeconfig_init ( ) ;
2017-11-07 05:11:08 +00:00
}
return false ;
break ;
2018-03-01 15:46:57 +00:00
case VRSN : // Prints firmware version
if ( record - > event . pressed ) {
2018-07-17 01:04:32 +00:00
send_string_with_delay_P ( PSTR ( QMK_KEYBOARD " / " QMK_KEYMAP " @ " QMK_VERSION " , Built on: " QMK_BUILDDATE ) , MACRO_TIMER ) ;
2017-11-17 19:59:54 +00:00
}
2017-11-07 05:11:08 +00:00
return false ;
break ;
2018-03-25 20:01:15 +00:00
2018-06-01 05:11:06 +00:00
/* Code has been depreciated
case KC_SECRET_1 . . . KC_SECRET_5 : // Secrets! Externally defined strings, not stored in repo
if ( ! record - > event . pressed ) {
clear_oneshot_layer_state ( ONESHOT_OTHER_KEY_PRESSED ) ;
send_string ( decoy_secret [ keycode - KC_SECRET_1 ] ) ;
}
return false ;
break ;
*/
2018-03-01 15:46:57 +00:00
// These are a serious of gaming macros.
// Only enables for the viterbi, basically,
// to save on firmware space, since it's limited.
2018-06-01 05:11:06 +00:00
# ifdef MACROS_ENABLED
2018-03-01 15:46:57 +00:00
case KC_OVERWATCH : // Toggle's if we hit "ENTER" or "BACKSPACE" to input macros
2018-10-15 19:34:49 +00:00
if ( record - > event . pressed ) { userspace_config . is_overwatch ^ = 1 ; eeconfig_update_user ( userspace_config . raw ) ; }
2018-03-01 15:46:57 +00:00
# ifdef RGBLIGHT_ENABLE
2018-06-01 05:11:06 +00:00
userspace_config . is_overwatch ? rgblight_mode_noeeprom ( 17 ) : rgblight_mode_noeeprom ( 18 ) ;
2018-03-01 15:46:57 +00:00
# endif //RGBLIGHT_ENABLE
return false ; break ;
2018-03-25 20:01:15 +00:00
case KC_SALT :
return send_game_macro ( " Salt, salt, salt... " , record , false ) ;
2018-03-01 15:46:57 +00:00
case KC_MORESALT :
2018-03-25 20:01:15 +00:00
return send_game_macro ( " Please sir, can I have some more salt?! " , record , false ) ;
2018-03-01 15:46:57 +00:00
case KC_SALTHARD :
2018-03-25 20:01:15 +00:00
return send_game_macro ( " Your salt only makes me harder, and even more aggressive! " , record , false ) ;
2018-03-01 15:46:57 +00:00
case KC_GOODGAME :
2018-03-25 20:01:15 +00:00
return send_game_macro ( " Good game, everyone! " , record , false ) ;
2018-03-01 15:46:57 +00:00
case KC_GLHF :
2018-03-25 20:01:15 +00:00
return send_game_macro ( " Good luck, have fun!!! " , record , false ) ;
2018-03-01 15:46:57 +00:00
case KC_SYMM :
2018-03-25 20:01:15 +00:00
return send_game_macro ( " Left click to win! " , record , false ) ;
2017-11-07 05:11:08 +00:00
case KC_JUSTGAME :
2018-03-25 20:01:15 +00:00
return 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. " , record , false ) ;
2017-11-07 05:11:08 +00:00
case KC_TORB :
2018-03-25 20:01:15 +00:00
return send_game_macro ( " That was positively riveting! " , record , false ) ;
2017-11-07 05:11:08 +00:00
case KC_AIM :
2018-03-25 20:01:15 +00:00
send_game_macro ( " That aim is absolutely amazing. It's almost like you're a machine! " , record , true ) ;
return send_game_macro ( " Wait! That aim is TOO good! You're clearly using an aim hack! CHEATER! " , record , false ) ;
2017-11-17 19:59:54 +00:00
case KC_C9 :
2018-03-25 20:01:15 +00:00
return send_game_macro ( " OMG!!! C9!!! " , record , false ) ;
2017-11-17 19:59:54 +00:00
case KC_GGEZ :
2018-03-25 20:01:15 +00:00
return send_game_macro ( " That was a fantastic game, though it was a bit easy. Try harder next time! " , record , false ) ;
2018-06-01 05:11:06 +00:00
# endif // MACROS_ENABLED
2018-03-01 15:46:57 +00:00
2018-03-25 20:01:15 +00:00
case KC_DIABLO_CLEAR : // reset all Diablo timers, disabling them
2018-06-01 05:11:06 +00:00
# ifdef TAP_DANCE_ENABLE
2017-11-17 19:59:54 +00:00
if ( record - > event . pressed ) {
uint8_t dtime ;
for ( dtime = 0 ; dtime < 4 ; dtime + + ) {
diablo_key_time [ dtime ] = diablo_times [ 0 ] ;
}
}
2018-07-17 01:04:32 +00:00
# endif // TAP_DANCE_ENABLE
2018-03-01 15:46:57 +00:00
return false ; break ;
2018-04-21 00:53:19 +00:00
2018-05-09 01:46:29 +00:00
case KC_CCCV : // One key copy/paste
if ( record - > event . pressed ) {
copy_paste_timer = timer_read ( ) ;
} else {
if ( timer_elapsed ( copy_paste_timer ) > TAPPING_TERM ) { // Hold, copy
register_code ( KC_LCTL ) ;
2018-10-15 19:34:49 +00:00
tap_code ( KC_C ) ;
2018-05-09 01:46:29 +00:00
unregister_code ( KC_LCTL ) ;
} else { // Tap, paste
register_code ( KC_LCTL ) ;
2018-10-15 19:34:49 +00:00
tap_code ( KC_V ) ;
2018-05-09 01:46:29 +00:00
unregister_code ( KC_LCTL ) ;
}
}
return false ;
2018-05-02 15:39:46 +00:00
break ;
2018-04-21 00:53:19 +00:00
# ifdef UNICODE_ENABLE
2018-10-02 01:00:14 +00:00
case UC_FLIP : // (ノಠ痊ಠ)ノ彡┻━┻
2018-04-21 00:53:19 +00:00
if ( record - > event . pressed ) {
2018-10-02 01:00:14 +00:00
send_unicode_hex_string ( " 0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B " ) ;
2018-04-21 00:53:19 +00:00
}
return false ;
break ;
2018-10-02 01:00:14 +00:00
case UC_TABL : // ┬─┬ノ( º _ ºノ)
if ( record - > event . pressed ) {
send_unicode_hex_string ( " 252C 2500 252C 30CE 0028 0020 00BA 0020 005F 0020 00BA 30CE 0029 " ) ;
}
return false ;
break ;
case UC_SHRG : // ¯\_(ツ)_/¯
if ( record - > event . pressed ) {
send_unicode_hex_string ( " 00AF 005C 005F 0028 30C4 0029 005F 002F 00AF " ) ;
}
return false ;
break ;
case UC_DISA : // ಠ_ಠ
if ( record - > event . pressed ) {
send_unicode_hex_string ( " 0CA0 005F 0CA0 " ) ;
}
return false ;
break ;
# endif
2017-11-07 05:11:08 +00:00
}
2018-07-17 01:04:32 +00:00
return process_record_keymap ( keycode , record ) & &
# ifdef RGBLIGHT_ENABLE
process_record_user_rgb ( keycode , record ) & &
# endif // RGBLIGHT_ENABLE
process_record_secrets ( keycode , record ) ;
2017-11-07 05:11:08 +00:00
}
2018-03-01 15:46:57 +00:00
2018-05-02 15:39:46 +00:00
2017-11-11 03:58:53 +00:00
// 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
2017-11-17 19:59:54 +00:00
uint32_t layer_state_set_user ( uint32_t state ) {
2018-05-02 15:39:46 +00:00
state = update_tri_layer_state ( state , _RAISE , _LOWER , _ADJUST ) ;
# ifdef RGBLIGHT_ENABLE
2018-06-01 05:11:06 +00:00
state = layer_state_set_rgb ( state ) ;
2018-05-02 15:39:46 +00:00
# endif // RGBLIGHT_ENABLE
2017-11-11 03:58:53 +00:00
return layer_state_set_keymap ( state ) ;
2017-11-07 05:11:08 +00:00
}
2017-11-17 19:59:54 +00:00
2018-08-27 16:16:54 +00:00
uint32_t default_layer_state_set_user ( uint32_t state ) {
return default_layer_state_set_keymap ( state ) ;
2018-07-17 01:04:32 +00:00
}
2018-03-01 15:46:57 +00:00
// Any custom LED code goes here.
// So far, I only have keyboard specific code,
2018-03-25 20:01:15 +00:00
// So nothing goes here.
2018-03-01 15:46:57 +00:00
void led_set_user ( uint8_t usb_led ) {
led_set_keymap ( usb_led ) ;
}
2018-10-15 19:34:49 +00:00
void eeconfig_init_user ( void ) {
userspace_config . raw = 0 ;
2018-10-23 16:00:41 +00:00
userspace_config . rgb_layer_change = true ;
2018-10-15 19:34:49 +00:00
eeconfig_update_user ( userspace_config . raw ) ;
}
2018-10-27 18:53:50 +00:00
void bootmagic_lite ( void ) {
matrix_scan ( ) ;
# if defined(DEBOUNCING_DELAY) && DEBOUNCING_DELAY > 0
wait_ms ( DEBOUNCING_DELAY * 2 ) ;
# elif defined(DEBOUNCE) && DEBOUNCE > 0
wait_ms ( DEBOUNCE * 2 ) ;
# else
wait_ms ( 30 ) ;
# endif
matrix_scan ( ) ;
if ( matrix_get_row ( BOOTMAGIC_LITE_ROW ) & ( 1 < < BOOTMAGIC_LITE_COLUMN ) ) {
bootloader_jump ( ) ;
}
}