diff options
Diffstat (limited to 'keyboards/preonic/keymaps/zach/zach_common_functions.c')
| -rw-r--r-- | keyboards/preonic/keymaps/zach/zach_common_functions.c | 447 |
1 files changed, 447 insertions, 0 deletions
diff --git a/keyboards/preonic/keymaps/zach/zach_common_functions.c b/keyboards/preonic/keymaps/zach/zach_common_functions.c new file mode 100644 index 000000000..2c47b2289 --- /dev/null +++ b/keyboards/preonic/keymaps/zach/zach_common_functions.c | |||
| @@ -0,0 +1,447 @@ | |||
| 1 | #ifndef ZACH_COMMON_FUNCTIONS | ||
| 2 | #define ZACH_COMMON_FUNCTIONS | ||
| 3 | #include "eeconfig.h" | ||
| 4 | #include "action_layer.h" | ||
| 5 | #include "keymap_colemak.h" | ||
| 6 | extern keymap_config_t keymap_config; | ||
| 7 | |||
| 8 | // Fillers to make layering more clear | ||
| 9 | #define _______ KC_TRNS | ||
| 10 | #define XXXXXXX KC_NO | ||
| 11 | #define C(n) RCTL(n) | ||
| 12 | #define CADKEY RCTL(RALT(KC_DEL)) | ||
| 13 | |||
| 14 | void tap(uint16_t keycode){ | ||
| 15 | register_code(keycode); | ||
| 16 | unregister_code(keycode); | ||
| 17 | }; | ||
| 18 | |||
| 19 | void persistant_default_layer_set(uint16_t default_layer){ | ||
| 20 | eeconfig_update_default_layer(default_layer); | ||
| 21 | default_layer_set(default_layer); | ||
| 22 | }; | ||
| 23 | |||
| 24 | // Automatic number generation of important keywords | ||
| 25 | enum my_keycodes{ | ||
| 26 | // Layer numbers | ||
| 27 | _COLEMAK = 0, | ||
| 28 | _SWCOLE, | ||
| 29 | _RAISE, | ||
| 30 | _LOWER, | ||
| 31 | _ADJUST, | ||
| 32 | _UNICODES, | ||
| 33 | // These use process_record_user() | ||
| 34 | COLEMAK = SAFE_RANGE, | ||
| 35 | SWCOLE, | ||
| 36 | LOWER, | ||
| 37 | RAISE, | ||
| 38 | SHFT_CAP, | ||
| 39 | CTRLB, | ||
| 40 | CPYPST, | ||
| 41 | FACE, | ||
| 42 | UNIWIN, | ||
| 43 | UNILIN, | ||
| 44 | DISFACE, | ||
| 45 | TFLIP, | ||
| 46 | TPUT, | ||
| 47 | SHRUG, | ||
| 48 | RANDIG, | ||
| 49 | // Tap_Dance nums | ||
| 50 | RAI = 0, | ||
| 51 | LOW, | ||
| 52 | SUP | ||
| 53 | }; | ||
| 54 | |||
| 55 | #ifdef AUDIO_ENABLE | ||
| 56 | #include "audio.h" | ||
| 57 | float tone_startup[][2] = SONG(STARTUP_SOUND); | ||
| 58 | float tone_goodbye[][2] = SONG(GOODBYE_SOUND); | ||
| 59 | float tone_colemak[][2] = SONG(COLEMAK_SOUND); | ||
| 60 | float tone_swcole[][2] = SONG(QWERTY_SOUND); | ||
| 61 | float tone_capslock_on[][2] = SONG(CAPS_LOCK_ON_SOUND); | ||
| 62 | float tone_capslock_off[][2] = SONG(CAPS_LOCK_OFF_SOUND); | ||
| 63 | float tone_ctrl_mod[][2] = SONG(COIN_SOUND); | ||
| 64 | float tone_copy[][2] = SONG(SCROLL_LOCK_ON_SOUND); | ||
| 65 | float tone_paste[][2] = SONG(SCROLL_LOCK_OFF_SOUND); | ||
| 66 | float uniwin[][2] = SONG(UNICODE_WINDOWS); | ||
| 67 | float unilin[][2] = SONG(UNICODE_LINUX); | ||
| 68 | #endif | ||
| 69 | |||
| 70 | #ifdef TAP_DANCE_ENABLE | ||
| 71 | #define TAPPING_TERM 200 | ||
| 72 | |||
| 73 | void dance_raise_press(qk_tap_dance_state_t *state, void *user_data){// Called on each tap | ||
| 74 | switch(state->count){ // Only turn the layer on once | ||
| 75 | case 1: | ||
| 76 | layer_off(_UNICODES); | ||
| 77 | layer_on(_RAISE); | ||
| 78 | update_tri_layer(_LOWER, _RAISE, _ADJUST); | ||
| 79 | break; | ||
| 80 | } | ||
| 81 | }; | ||
| 82 | void dance_raise_lift(qk_tap_dance_state_t *state, void *user_data){ // Called on release | ||
| 83 | switch(state->count){ | ||
| 84 | case 1: // Normal action. Turn off layers | ||
| 85 | layer_off(_RAISE); | ||
| 86 | update_tri_layer(_LOWER, _RAISE, _ADJUST); | ||
| 87 | layer_off(_UNICODES); | ||
| 88 | break; | ||
| 89 | } | ||
| 90 | }; | ||
| 91 | ///////////////////////////////////////////////////////////////////// | ||
| 92 | void dance_lower_press(qk_tap_dance_state_t *state, void *user_data){// Called on tap | ||
| 93 | switch(state->count){ | ||
| 94 | case 1: // Turn on lower | ||
| 95 | layer_off(_UNICODES); | ||
| 96 | layer_on(_LOWER); | ||
| 97 | update_tri_layer(_LOWER, _RAISE, _ADJUST); | ||
| 98 | break; | ||
| 99 | } | ||
| 100 | }; | ||
| 101 | void dance_lower_lift(qk_tap_dance_state_t *state, void *user_data){ // Called on release | ||
| 102 | switch(state->count){ | ||
| 103 | case 1: // Normal action. Turn off layers | ||
| 104 | layer_off(_LOWER); | ||
| 105 | update_tri_layer(_LOWER, _RAISE, _ADJUST); | ||
| 106 | layer_off(_UNICODES); | ||
| 107 | break; | ||
| 108 | case 2: // Turn on _UNICODES layer | ||
| 109 | layer_off(_LOWER); | ||
| 110 | update_tri_layer(_LOWER, _RAISE, _ADJUST); | ||
| 111 | layer_on(_UNICODES); | ||
| 112 | #ifdef AUDIO_ENABLE | ||
| 113 | PLAY_NOTE_ARRAY(tone_ctrl_mod, false, 0); | ||
| 114 | #endif | ||
| 115 | break; | ||
| 116 | } | ||
| 117 | }; | ||
| 118 | ///////////////////////////////////////////////////////////////////// | ||
| 119 | void dance_super_press(qk_tap_dance_state_t *state, void *user_data){ // Called on down | ||
| 120 | if(state->count == 1){ | ||
| 121 | register_code(KC_LGUI); | ||
| 122 | } | ||
| 123 | } | ||
| 124 | void dance_super_done(qk_tap_dance_state_t *state, void *user_data){ // Called on timeout | ||
| 125 | switch(state->count){ | ||
| 126 | case 2: | ||
| 127 | register_code(KC_LGUI); | ||
| 128 | tap(KC_L); | ||
| 129 | unregister_code(KC_LGUI); | ||
| 130 | break; | ||
| 131 | } | ||
| 132 | } | ||
| 133 | void dance_super_lift(qk_tap_dance_state_t *state, void *user_data){ // Called on up | ||
| 134 | unregister_code(KC_LGUI); | ||
| 135 | } | ||
| 136 | |||
| 137 | qk_tap_dance_action_t tap_dance_actions[] = { | ||
| 138 | [RAI] = ACTION_TAP_DANCE_FN_ADVANCED(dance_raise_press, NULL, dance_raise_lift), | ||
| 139 | [LOW] = ACTION_TAP_DANCE_FN_ADVANCED(dance_lower_press, NULL, dance_lower_lift), | ||
| 140 | [SUP] = ACTION_TAP_DANCE_FN_ADVANCED(dance_super_press, dance_super_done, dance_super_lift) | ||
| 141 | }; | ||
| 142 | #endif | ||
| 143 | |||
| 144 | //#ifdef UNICODE_ENABLE | ||
| 145 | // Unicode shortcuts | ||
| 146 | #define IBANG X(0x203D) | ||
| 147 | #define RAROW X(0x2192) | ||
| 148 | #define LAROW X(0x2190) | ||
| 149 | #define DEGREE X(0x00B0) | ||
| 150 | #define OMEGA X(0x03A9) | ||
| 151 | #define WOMEGA X(0x03C9) | ||
| 152 | #define MICRO X(0x00B5) | ||
| 153 | #define PLUMIN X(0x00B1) | ||
| 154 | #define SUPA2 X(0x00B2) | ||
| 155 | #define ROMAN1 X(0x2160) | ||
| 156 | #define ROMAN2 X(0x2161) | ||
| 157 | #define ROMAN3 X(0x2162) | ||
| 158 | #define ROMAN4 X(0x2163) | ||
| 159 | #define ROMAN5 X(0x2164) | ||
| 160 | #define ROMAN6 X(0x2165) | ||
| 161 | #define ROMAN7 X(0x2166) | ||
| 162 | #define roman1 X(0x2170) | ||
| 163 | #define roman2 X(0x2171) | ||
| 164 | #define roman3 X(0x2172) | ||
| 165 | #define roman4 X(0x2173) | ||
| 166 | #define roman5 X(0x2174) | ||
| 167 | #define roman6 X(0x2175) | ||
| 168 | #define roman7 X(0x2176) | ||
| 169 | |||
| 170 | #ifdef UNICODEMAP_ENABLE // For Unicode characters larger than 0x8000. Send with X(<unicode>) | ||
| 171 | enum Ext_Unicode{ | ||
| 172 | PENGUIN = 0, | ||
| 173 | BOAR, | ||
| 174 | MONKEY, | ||
| 175 | DRAGON, | ||
| 176 | CHICK, | ||
| 177 | TUMBLER | ||
| 178 | }; | ||
| 179 | const uint32_t PROGMEM unicode_map[] = { | ||
| 180 | [PENGUIN] = 0x1F427, | ||
| 181 | [BOAR] = 0x1F417, | ||
| 182 | [MONKEY] = 0x1F412, | ||
| 183 | [DRAGON] = 0x1F409, | ||
| 184 | [CHICK] = 0x1F425, | ||
| 185 | [TUMBLER] = 0x1F943 | ||
| 186 | }; | ||
| 187 | #define PENGY X(PENGUIN) | ||
| 188 | #define BOARY X(BOAR) | ||
| 189 | #define MNKY X(MONKEY) | ||
| 190 | #define DRGN X(DRAGON) | ||
| 191 | #define DUCK X(CHICK) | ||
| 192 | #define TMBL X(TUMBLER) | ||
| 193 | #endif | ||
| 194 | |||
| 195 | //#endif | ||
| 196 | |||
| 197 | static uint16_t key_timer; | ||
| 198 | static uint8_t caps_status = 0; | ||
| 199 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { | ||
| 200 | switch (keycode) { | ||
| 201 | case COLEMAK: | ||
| 202 | if(record->event.pressed){ | ||
| 203 | persistant_default_layer_set(1UL<<_COLEMAK); | ||
| 204 | #ifdef AUDIO_ENABLE | ||
| 205 | PLAY_NOTE_ARRAY(tone_colemak, false, 0); | ||
| 206 | #endif | ||
| 207 | } | ||
| 208 | return false; | ||
| 209 | break; | ||
| 210 | case SWCOLE: | ||
| 211 | if(record->event.pressed){ | ||
| 212 | persistant_default_layer_set(1UL<<_SWCOLE); | ||
| 213 | #ifdef AUDIO_ENABLE | ||
| 214 | PLAY_NOTE_ARRAY(tone_swcole, false, 0); | ||
| 215 | #endif | ||
| 216 | } | ||
| 217 | return false; | ||
| 218 | break; | ||
| 219 | case RAISE: | ||
| 220 | if(record->event.pressed){ | ||
| 221 | layer_on(_RAISE); | ||
| 222 | update_tri_layer(_LOWER, _RAISE, _ADJUST); | ||
| 223 | } else { | ||
| 224 | layer_off(_RAISE); | ||
| 225 | update_tri_layer(_LOWER, _RAISE, _ADJUST); | ||
| 226 | } | ||
| 227 | return false; | ||
| 228 | break; | ||
| 229 | case LOWER: | ||
| 230 | if(record->event.pressed){ | ||
| 231 | layer_on(_LOWER); | ||
| 232 | update_tri_layer(_LOWER, _RAISE, _ADJUST); | ||
| 233 | } else { | ||
| 234 | layer_off(_LOWER); | ||
| 235 | update_tri_layer(_LOWER, _RAISE, _ADJUST); | ||
| 236 | } | ||
| 237 | return false; | ||
| 238 | break; | ||
| 239 | case SHFT_CAP: | ||
| 240 | if(record->event.pressed){ | ||
| 241 | key_timer = timer_read(); // if the key is being pressed, we start the timer. | ||
| 242 | register_code(KC_LSHIFT); | ||
| 243 | } else { // this means the key was just released (tap or "held down") | ||
| 244 | if(timer_elapsed(key_timer) < 152){ // Time in ms, the threshold we pick for counting something as a tap. | ||
| 245 | tap(KC_CAPS); | ||
| 246 | if(caps_status == 0){ | ||
| 247 | caps_status = 1; | ||
| 248 | #ifdef AUDIO_ENABLE | ||
| 249 | PLAY_NOTE_ARRAY(tone_capslock_on, false, 0); | ||
| 250 | #endif | ||
| 251 | } else { | ||
| 252 | caps_status = 0; | ||
| 253 | #ifdef AUDIO_ENABLE | ||
| 254 | PLAY_NOTE_ARRAY(tone_capslock_off, false, 0); | ||
| 255 | #endif | ||
| 256 | } | ||
| 257 | } | ||
| 258 | unregister_code(KC_LSHIFT); | ||
| 259 | } | ||
| 260 | return false; | ||
| 261 | break; | ||
| 262 | case CTRLB: // Control-B on tap (bold) | ||
| 263 | if(record->event.pressed){ | ||
| 264 | key_timer = timer_read(); // if the key is being pressed, we start the timer. | ||
| 265 | register_code(KC_LCTL); | ||
| 266 | } else { // this means the key was just released (tap or "held down") | ||
| 267 | if (timer_elapsed(key_timer) < 152) { // Time in ms, the threshold we pick for counting something as a tap. | ||
| 268 | tap(KC_B); | ||
| 269 | #ifdef AUDIO_ENABLE | ||
| 270 | PLAY_NOTE_ARRAY(tone_ctrl_mod, false, 0); | ||
| 271 | #endif | ||
| 272 | #ifdef BACKLIGHT_BREATHING | ||
| 273 | breathing_speed_set(2); | ||
| 274 | breathing_pulse(); | ||
| 275 | #endif | ||
| 276 | } | ||
| 277 | unregister_code(KC_LCTL); | ||
| 278 | } | ||
| 279 | return false; | ||
| 280 | break; | ||
| 281 | case CPYPST: // One key copy/paste | ||
| 282 | if(record->event.pressed){ | ||
| 283 | key_timer = timer_read(); | ||
| 284 | } else { | ||
| 285 | if (timer_elapsed(key_timer) > 152) { // Hold, copy | ||
| 286 | register_code(KC_LCTL); | ||
| 287 | tap(KC_C); | ||
| 288 | unregister_code(KC_LCTL); | ||
| 289 | #ifdef AUDIO_ENABLE | ||
| 290 | PLAY_NOTE_ARRAY(tone_copy, false, 0); | ||
| 291 | #endif | ||
| 292 | } else { // Tap, paste | ||
| 293 | register_code(KC_LCTL); | ||
| 294 | tap(KC_V); | ||
| 295 | unregister_code(KC_LCTL); | ||
| 296 | #ifdef AUDIO_ENABLE | ||
| 297 | PLAY_NOTE_ARRAY(tone_paste, false, 0); | ||
| 298 | #endif | ||
| 299 | } | ||
| 300 | } | ||
| 301 | return false; | ||
| 302 | break; | ||
| 303 | #ifdef UNICODE_ENABLE | ||
| 304 | case UNIWIN: | ||
| 305 | if(record->event.pressed){ | ||
| 306 | set_unicode_input_mode(UC_WIN); | ||
| 307 | #ifdef AUDIO_ENABLE | ||
| 308 | PLAY_NOTE_ARRAY(uniwin, false, 0); | ||
| 309 | #endif | ||
| 310 | } | ||
| 311 | return false; | ||
| 312 | break; | ||
| 313 | case UNILIN: | ||
| 314 | if(record->event.pressed){ | ||
| 315 | set_unicode_input_mode(UC_LNX); | ||
| 316 | #ifdef AUDIO_ENABLE | ||
| 317 | PLAY_NOTE_ARRAY(unilin, false, 0); | ||
| 318 | #endif | ||
| 319 | } | ||
| 320 | return false; | ||
| 321 | break; | ||
| 322 | case DISFACE: // ಠ_ಠ | ||
| 323 | if(record->event.pressed){ | ||
| 324 | process_unicode((0x0CA0|QK_UNICODE), record); // Eye | ||
| 325 | register_code(KC_RSFT); | ||
| 326 | tap(KC_MINS); | ||
| 327 | unregister_code(KC_RSFT); | ||
| 328 | process_unicode((0x0CA0|QK_UNICODE), record); // Eye | ||
| 329 | } | ||
| 330 | return false; | ||
| 331 | break; | ||
| 332 | case TFLIP: // (╯°□°)╯ ︵ ┻━┻ | ||
| 333 | if(record->event.pressed){ | ||
| 334 | register_code(KC_RSFT); | ||
| 335 | tap(KC_9); | ||
| 336 | unregister_code(KC_RSFT); | ||
| 337 | process_unicode((0x256F|QK_UNICODE), record); // Arm | ||
| 338 | process_unicode((0x00B0|QK_UNICODE), record); // Eye | ||
| 339 | process_unicode((0x25A1|QK_UNICODE), record); // Mouth | ||
| 340 | process_unicode((0x00B0|QK_UNICODE), record); // Eye | ||
| 341 | register_code(KC_RSFT); | ||
| 342 | tap(KC_0); | ||
| 343 | unregister_code(KC_RSFT); | ||
| 344 | process_unicode((0x256F|QK_UNICODE), record); // Arm | ||
| 345 | tap(KC_SPC); | ||
| 346 | process_unicode((0x0361|QK_UNICODE), record); // Flippy | ||
| 347 | tap(KC_SPC); | ||
| 348 | process_unicode((0x253B|QK_UNICODE), record); // Table | ||
| 349 | process_unicode((0x2501|QK_UNICODE), record); // Table | ||
| 350 | process_unicode((0x253B|QK_UNICODE), record); // Table | ||
| 351 | } | ||
| 352 | return false; | ||
| 353 | break; | ||
| 354 | case TPUT: // ┬──┬ ノ( ゜-゜ノ) | ||
| 355 | if(record->event.pressed){ | ||
| 356 | process_unicode((0x252C|QK_UNICODE), record); // Table | ||
| 357 | process_unicode((0x2500|QK_UNICODE), record); // Table | ||
| 358 | process_unicode((0x2500|QK_UNICODE), record); // Table | ||
| 359 | process_unicode((0x252C|QK_UNICODE), record); // Table | ||
| 360 | tap(KC_SPC); | ||
| 361 | process_unicode((0x30CE|QK_UNICODE), record); // Arm | ||
| 362 | register_code(KC_RSFT); | ||
| 363 | tap(KC_9); | ||
| 364 | unregister_code(KC_RSFT); | ||
| 365 | tap(KC_SPC); | ||
| 366 | process_unicode((0x309C|QK_UNICODE), record); // Eye | ||
| 367 | tap(KC_MINS); | ||
| 368 | process_unicode((0x309C|QK_UNICODE), record); // Eye | ||
| 369 | process_unicode((0x30CE|QK_UNICODE), record); // Arm | ||
| 370 | register_code(KC_RSFT); | ||
| 371 | tap(KC_0); | ||
| 372 | unregister_code(KC_RSFT); | ||
| 373 | } | ||
| 374 | return false; | ||
| 375 | break; | ||
| 376 | case SHRUG: // ¯\_(ツ)_/¯ | ||
| 377 | if(record->event.pressed){ | ||
| 378 | process_unicode((0x00AF|QK_UNICODE), record); // Hand | ||
| 379 | tap(KC_BSLS); // Arm | ||
| 380 | register_code(KC_RSFT); | ||
| 381 | tap(KC_UNDS); // Arm | ||
| 382 | tap(KC_LPRN); // Head | ||
| 383 | unregister_code(KC_RSFT); | ||
| 384 | process_unicode((0x30C4|QK_UNICODE), record); // Face | ||
| 385 | register_code(KC_RSFT); | ||
| 386 | tap(KC_RPRN); // Head | ||
| 387 | tap(KC_UNDS); // Arm | ||
| 388 | unregister_code(KC_RSFT); | ||
| 389 | tap(KC_SLSH); // Arm | ||
| 390 | process_unicode((0x00AF|QK_UNICODE), record); // Hand | ||
| 391 | } | ||
| 392 | return false; | ||
| 393 | break; | ||
| 394 | #endif | ||
| 395 | case FACE: // (o_O) | ||
| 396 | if(record->event.pressed){ | ||
| 397 | register_code(KC_RSFT); | ||
| 398 | tap(KC_LPRN); | ||
| 399 | unregister_code(KC_RSFT); | ||
| 400 | tap(KC_O); | ||
| 401 | register_code(KC_RSFT); | ||
| 402 | tap(KC_UNDS); | ||
| 403 | tap(KC_O); | ||
| 404 | tap(KC_RPRN); | ||
| 405 | unregister_code(KC_RSFT); | ||
| 406 | } | ||
| 407 | return false; | ||
| 408 | break; | ||
| 409 | case RANDIG: | ||
| 410 | if (record->event.pressed) { | ||
| 411 | tap_random_base64(); | ||
| 412 | } | ||
| 413 | return false; | ||
| 414 | break; | ||
| 415 | } | ||
| 416 | return true; | ||
| 417 | }; | ||
| 418 | |||
| 419 | void matrix_init_user(void){ // Run once at startup | ||
| 420 | #ifdef AUDIO_ENABLE | ||
| 421 | _delay_ms(50); // gets rid of tick | ||
| 422 | PLAY_NOTE_ARRAY(tone_startup, false, 0); | ||
| 423 | #endif | ||
| 424 | } | ||
| 425 | |||
| 426 | #ifdef AUDIO_ENABLE | ||
| 427 | void play_goodbye_tone(void){ | ||
| 428 | PLAY_NOTE_ARRAY(tone_goodbye, false, 0); | ||
| 429 | _delay_ms(150); | ||
| 430 | } | ||
| 431 | |||
| 432 | void shutdown_user(){ | ||
| 433 | PLAY_NOTE_ARRAY(tone_goodbye, false, 0); | ||
| 434 | _delay_ms(150); | ||
| 435 | stop_all_notes(); | ||
| 436 | } | ||
| 437 | |||
| 438 | void music_on_user(void){ // Run when the music layer is turned on | ||
| 439 | PLAY_NOTE_ARRAY(tone_startup, false, 0); | ||
| 440 | } | ||
| 441 | |||
| 442 | void music_off_user(void){ // Run when music is turned off | ||
| 443 | PLAY_NOTE_ARRAY(tone_goodbye, false, 0); | ||
| 444 | } | ||
| 445 | #endif | ||
| 446 | |||
| 447 | #endif | ||
