aboutsummaryrefslogtreecommitdiff
path: root/quantum/quantum.c
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/quantum.c')
-rw-r--r--quantum/quantum.c470
1 files changed, 59 insertions, 411 deletions
diff --git a/quantum/quantum.c b/quantum/quantum.c
index 2e5e6376b..9cd50b11d 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -16,10 +16,6 @@
16 16
17#include "quantum.h" 17#include "quantum.h"
18 18
19#if !defined(RGBLIGHT_ENABLE) && !defined(RGB_MATRIX_ENABLE)
20# include "rgb.h"
21#endif
22
23#ifdef PROTOCOL_LUFA 19#ifdef PROTOCOL_LUFA
24# include "outputselect.h" 20# include "outputselect.h"
25#endif 21#endif
@@ -57,26 +53,13 @@ extern backlight_config_t backlight_config;
57# ifndef GOODBYE_SONG 53# ifndef GOODBYE_SONG
58# define GOODBYE_SONG SONG(GOODBYE_SOUND) 54# define GOODBYE_SONG SONG(GOODBYE_SOUND)
59# endif 55# endif
60# ifndef AG_NORM_SONG
61# define AG_NORM_SONG SONG(AG_NORM_SOUND)
62# endif
63# ifndef AG_SWAP_SONG
64# define AG_SWAP_SONG SONG(AG_SWAP_SOUND)
65# endif
66# ifndef CG_NORM_SONG
67# define CG_NORM_SONG SONG(AG_NORM_SOUND)
68# endif
69# ifndef CG_SWAP_SONG
70# define CG_SWAP_SONG SONG(AG_SWAP_SOUND)
71# endif
72float goodbye_song[][2] = GOODBYE_SONG; 56float goodbye_song[][2] = GOODBYE_SONG;
73float ag_norm_song[][2] = AG_NORM_SONG;
74float ag_swap_song[][2] = AG_SWAP_SONG;
75float cg_norm_song[][2] = CG_NORM_SONG;
76float cg_swap_song[][2] = CG_SWAP_SONG;
77# ifdef DEFAULT_LAYER_SONGS 57# ifdef DEFAULT_LAYER_SONGS
78float default_layer_songs[][16][2] = DEFAULT_LAYER_SONGS; 58float default_layer_songs[][16][2] = DEFAULT_LAYER_SONGS;
79# endif 59# endif
60# ifdef SENDSTRING_BELL
61float bell_song[][2] = SONG(TERMINAL_SOUND);
62# endif
80#endif 63#endif
81 64
82static void do_code16(uint16_t code, void (*f)(uint8_t)) { 65static void do_code16(uint16_t code, void (*f)(uint8_t)) {
@@ -164,11 +147,6 @@ void reset_keyboard(void) {
164 bootloader_jump(); 147 bootloader_jump();
165} 148}
166 149
167/* true if the last press of GRAVE_ESC was shifted (i.e. GUI or SHIFT were pressed), false otherwise.
168 * Used to ensure that the correct keycode is released if the key is released.
169 */
170static bool grave_esc_was_shifted = false;
171
172/* Convert record into usable keycode via the contained event. */ 150/* Convert record into usable keycode via the contained event. */
173uint16_t get_record_keycode(keyrecord_t *record) { return get_event_keycode(record->event); } 151uint16_t get_record_keycode(keyrecord_t *record) { return get_event_keycode(record->event); }
174 152
@@ -235,6 +213,9 @@ bool process_record_quantum(keyrecord_t *record) {
235#if defined(RGB_MATRIX_ENABLE) 213#if defined(RGB_MATRIX_ENABLE)
236 process_rgb_matrix(keycode, record) && 214 process_rgb_matrix(keycode, record) &&
237#endif 215#endif
216#if defined(VIA_ENABLE)
217 process_record_via(keycode, record) &&
218#endif
238 process_record_kb(keycode, record) && 219 process_record_kb(keycode, record) &&
239#if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED) 220#if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED)
240 process_midi(keycode, record) && 221 process_midi(keycode, record) &&
@@ -272,402 +253,77 @@ bool process_record_quantum(keyrecord_t *record) {
272#ifdef SPACE_CADET_ENABLE 253#ifdef SPACE_CADET_ENABLE
273 process_space_cadet(keycode, record) && 254 process_space_cadet(keycode, record) &&
274#endif 255#endif
256#ifdef MAGIC_KEYCODE_ENABLE
257 process_magic(keycode, record) &&
258#endif
259#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
260 process_rgb(keycode, record) &&
261#endif
275 true)) { 262 true)) {
276 return false; 263 return false;
277 } 264 }
278 265
279 // Shift / paren setup 266 if (record->event.pressed) {
280 267 switch (keycode) {
281 switch (keycode) { 268 case RESET:
282 case RESET:
283 if (record->event.pressed) {
284 reset_keyboard(); 269 reset_keyboard();
285 } 270 return false;
286 return false; 271#ifndef NO_DEBUG
287 case DEBUG: 272 case DEBUG:
288 if (record->event.pressed) {
289 debug_enable ^= 1; 273 debug_enable ^= 1;
290 if (debug_enable) { 274 if (debug_enable) {
291 print("DEBUG: enabled.\n"); 275 print("DEBUG: enabled.\n");
292 } else { 276 } else {
293 print("DEBUG: disabled.\n"); 277 print("DEBUG: disabled.\n");
294 } 278 }
295 } 279#endif
296 return false; 280 return false;
297 case EEPROM_RESET: 281 case EEPROM_RESET:
298 if (record->event.pressed) {
299 eeconfig_init(); 282 eeconfig_init();
300 } 283 return false;
301 return false;
302#ifdef FAUXCLICKY_ENABLE 284#ifdef FAUXCLICKY_ENABLE
303 case FC_TOG: 285 case FC_TOG:
304 if (record->event.pressed) {
305 FAUXCLICKY_TOGGLE; 286 FAUXCLICKY_TOGGLE;
306 } 287 return false;
307 return false; 288 case FC_ON:
308 case FC_ON:
309 if (record->event.pressed) {
310 FAUXCLICKY_ON; 289 FAUXCLICKY_ON;
311 } 290 return false;
312 return false; 291 case FC_OFF:
313 case FC_OFF:
314 if (record->event.pressed) {
315 FAUXCLICKY_OFF; 292 FAUXCLICKY_OFF;
316 } 293 return false;
317 return false;
318#endif 294#endif
319#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
320 case RGB_TOG:
321// Split keyboards need to trigger on key-up for edge-case issue
322# ifndef SPLIT_KEYBOARD
323 if (record->event.pressed) {
324# else
325 if (!record->event.pressed) {
326# endif
327 rgblight_toggle();
328 }
329 return false;
330 case RGB_MODE_FORWARD:
331 if (record->event.pressed) {
332 uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT));
333 if (shifted) {
334 rgblight_step_reverse();
335 } else {
336 rgblight_step();
337 }
338 }
339 return false;
340 case RGB_MODE_REVERSE:
341 if (record->event.pressed) {
342 uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT));
343 if (shifted) {
344 rgblight_step();
345 } else {
346 rgblight_step_reverse();
347 }
348 }
349 return false;
350 case RGB_HUI:
351// Split keyboards need to trigger on key-up for edge-case issue
352# ifndef SPLIT_KEYBOARD
353 if (record->event.pressed) {
354# else
355 if (!record->event.pressed) {
356# endif
357 rgblight_increase_hue();
358 }
359 return false;
360 case RGB_HUD:
361// Split keyboards need to trigger on key-up for edge-case issue
362# ifndef SPLIT_KEYBOARD
363 if (record->event.pressed) {
364# else
365 if (!record->event.pressed) {
366# endif
367 rgblight_decrease_hue();
368 }
369 return false;
370 case RGB_SAI:
371// Split keyboards need to trigger on key-up for edge-case issue
372# ifndef SPLIT_KEYBOARD
373 if (record->event.pressed) {
374# else
375 if (!record->event.pressed) {
376# endif
377 rgblight_increase_sat();
378 }
379 return false;
380 case RGB_SAD:
381// Split keyboards need to trigger on key-up for edge-case issue
382# ifndef SPLIT_KEYBOARD
383 if (record->event.pressed) {
384# else
385 if (!record->event.pressed) {
386# endif
387 rgblight_decrease_sat();
388 }
389 return false;
390 case RGB_VAI:
391// Split keyboards need to trigger on key-up for edge-case issue
392# ifndef SPLIT_KEYBOARD
393 if (record->event.pressed) {
394# else
395 if (!record->event.pressed) {
396# endif
397 rgblight_increase_val();
398 }
399 return false;
400 case RGB_VAD:
401// Split keyboards need to trigger on key-up for edge-case issue
402# ifndef SPLIT_KEYBOARD
403 if (record->event.pressed) {
404# else
405 if (!record->event.pressed) {
406# endif
407 rgblight_decrease_val();
408 }
409 return false;
410 case RGB_SPI:
411 if (record->event.pressed) {
412 rgblight_increase_speed();
413 }
414 return false;
415 case RGB_SPD:
416 if (record->event.pressed) {
417 rgblight_decrease_speed();
418 }
419 return false;
420 case RGB_MODE_PLAIN:
421 if (record->event.pressed) {
422 rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT);
423 }
424 return false;
425 case RGB_MODE_BREATHE:
426# ifdef RGBLIGHT_EFFECT_BREATHING
427 if (record->event.pressed) {
428 if ((RGBLIGHT_MODE_BREATHING <= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_BREATHING_end)) {
429 rgblight_step();
430 } else {
431 rgblight_mode(RGBLIGHT_MODE_BREATHING);
432 }
433 }
434# endif
435 return false;
436 case RGB_MODE_RAINBOW:
437# ifdef RGBLIGHT_EFFECT_RAINBOW_MOOD
438 if (record->event.pressed) {
439 if ((RGBLIGHT_MODE_RAINBOW_MOOD <= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_RAINBOW_MOOD_end)) {
440 rgblight_step();
441 } else {
442 rgblight_mode(RGBLIGHT_MODE_RAINBOW_MOOD);
443 }
444 }
445# endif
446 return false;
447 case RGB_MODE_SWIRL:
448# ifdef RGBLIGHT_EFFECT_RAINBOW_SWIRL
449 if (record->event.pressed) {
450 if ((RGBLIGHT_MODE_RAINBOW_SWIRL <= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_RAINBOW_SWIRL_end)) {
451 rgblight_step();
452 } else {
453 rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL);
454 }
455 }
456# endif
457 return false;
458 case RGB_MODE_SNAKE:
459# ifdef RGBLIGHT_EFFECT_SNAKE
460 if (record->event.pressed) {
461 if ((RGBLIGHT_MODE_SNAKE <= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_SNAKE_end)) {
462 rgblight_step();
463 } else {
464 rgblight_mode(RGBLIGHT_MODE_SNAKE);
465 }
466 }
467# endif
468 return false;
469 case RGB_MODE_KNIGHT:
470# ifdef RGBLIGHT_EFFECT_KNIGHT
471 if (record->event.pressed) {
472 if ((RGBLIGHT_MODE_KNIGHT <= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_KNIGHT_end)) {
473 rgblight_step();
474 } else {
475 rgblight_mode(RGBLIGHT_MODE_KNIGHT);
476 }
477 }
478# endif
479 return false;
480 case RGB_MODE_XMAS:
481# ifdef RGBLIGHT_EFFECT_CHRISTMAS
482 if (record->event.pressed) {
483 rgblight_mode(RGBLIGHT_MODE_CHRISTMAS);
484 }
485# endif
486 return false;
487 case RGB_MODE_GRADIENT:
488# ifdef RGBLIGHT_EFFECT_STATIC_GRADIENT
489 if (record->event.pressed) {
490 if ((RGBLIGHT_MODE_STATIC_GRADIENT <= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_STATIC_GRADIENT_end)) {
491 rgblight_step();
492 } else {
493 rgblight_mode(RGBLIGHT_MODE_STATIC_GRADIENT);
494 }
495 }
496# endif
497 return false;
498 case RGB_MODE_RGBTEST:
499# ifdef RGBLIGHT_EFFECT_RGB_TEST
500 if (record->event.pressed) {
501 rgblight_mode(RGBLIGHT_MODE_RGB_TEST);
502 }
503# endif
504 return false;
505#endif // defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
506#ifdef VELOCIKEY_ENABLE 295#ifdef VELOCIKEY_ENABLE
507 case VLK_TOG: 296 case VLK_TOG:
508 if (record->event.pressed) {
509 velocikey_toggle(); 297 velocikey_toggle();
510 } 298 return false;
511 return false;
512#endif 299#endif
513#ifdef PROTOCOL_LUFA 300#ifdef BLUETOOTH_ENABLE
514 case OUT_AUTO: 301 case OUT_AUTO:
515 if (record->event.pressed) {
516 set_output(OUTPUT_AUTO); 302 set_output(OUTPUT_AUTO);
517 } 303 return false;
518 return false; 304 case OUT_USB:
519 case OUT_USB:
520 if (record->event.pressed) {
521 set_output(OUTPUT_USB); 305 set_output(OUTPUT_USB);
522 } 306 return false;
523 return false; 307 case OUT_BT:
524# ifdef BLUETOOTH_ENABLE
525 case OUT_BT:
526 if (record->event.pressed) {
527 set_output(OUTPUT_BLUETOOTH); 308 set_output(OUTPUT_BLUETOOTH);
528 } 309 return false;
529 return false;
530# endif
531#endif
532 case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_TOGGLE_ALT_GUI:
533 case MAGIC_SWAP_LCTL_LGUI ... MAGIC_EE_HANDS_RIGHT:
534 if (record->event.pressed) {
535 // MAGIC actions (BOOTMAGIC without the boot)
536 if (!eeconfig_is_enabled()) {
537 eeconfig_init();
538 }
539 /* keymap config */
540 keymap_config.raw = eeconfig_read_keymap();
541 switch (keycode) {
542 case MAGIC_SWAP_CONTROL_CAPSLOCK:
543 keymap_config.swap_control_capslock = true;
544 break;
545 case MAGIC_CAPSLOCK_TO_CONTROL:
546 keymap_config.capslock_to_control = true;
547 break;
548 case MAGIC_SWAP_LALT_LGUI:
549 keymap_config.swap_lalt_lgui = true;
550 break;
551 case MAGIC_SWAP_RALT_RGUI:
552 keymap_config.swap_ralt_rgui = true;
553 break;
554 case MAGIC_SWAP_LCTL_LGUI:
555 keymap_config.swap_lctl_lgui = true;
556 break;
557 case MAGIC_SWAP_RCTL_RGUI:
558 keymap_config.swap_rctl_rgui = true;
559 break;
560 case MAGIC_NO_GUI:
561 keymap_config.no_gui = true;
562 break;
563 case MAGIC_SWAP_GRAVE_ESC:
564 keymap_config.swap_grave_esc = true;
565 break;
566 case MAGIC_SWAP_BACKSLASH_BACKSPACE:
567 keymap_config.swap_backslash_backspace = true;
568 break;
569 case MAGIC_HOST_NKRO:
570 clear_keyboard(); // clear first buffer to prevent stuck keys
571 keymap_config.nkro = true;
572 break;
573 case MAGIC_SWAP_ALT_GUI:
574 keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = true;
575#ifdef AUDIO_ENABLE
576 PLAY_SONG(ag_swap_song);
577#endif
578 break;
579 case MAGIC_SWAP_CTL_GUI:
580 keymap_config.swap_lctl_lgui = keymap_config.swap_rctl_rgui = true;
581#ifdef AUDIO_ENABLE
582 PLAY_SONG(cg_swap_song);
583#endif
584 break;
585 case MAGIC_UNSWAP_CONTROL_CAPSLOCK:
586 keymap_config.swap_control_capslock = false;
587 break;
588 case MAGIC_UNCAPSLOCK_TO_CONTROL:
589 keymap_config.capslock_to_control = false;
590 break;
591 case MAGIC_UNSWAP_LALT_LGUI:
592 keymap_config.swap_lalt_lgui = false;
593 break;
594 case MAGIC_UNSWAP_RALT_RGUI:
595 keymap_config.swap_ralt_rgui = false;
596 break;
597 case MAGIC_UNSWAP_LCTL_LGUI:
598 keymap_config.swap_lctl_lgui = false;
599 break;
600 case MAGIC_UNSWAP_RCTL_RGUI:
601 keymap_config.swap_rctl_rgui = false;
602 break;
603 case MAGIC_UNNO_GUI:
604 keymap_config.no_gui = false;
605 break;
606 case MAGIC_UNSWAP_GRAVE_ESC:
607 keymap_config.swap_grave_esc = false;
608 break;
609 case MAGIC_UNSWAP_BACKSLASH_BACKSPACE:
610 keymap_config.swap_backslash_backspace = false;
611 break;
612 case MAGIC_UNHOST_NKRO:
613 clear_keyboard(); // clear first buffer to prevent stuck keys
614 keymap_config.nkro = false;
615 break;
616 case MAGIC_UNSWAP_ALT_GUI:
617 keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = false;
618#ifdef AUDIO_ENABLE
619 PLAY_SONG(ag_norm_song);
620#endif
621 break;
622 case MAGIC_UNSWAP_CTL_GUI:
623 keymap_config.swap_lctl_lgui = keymap_config.swap_rctl_rgui = false;
624#ifdef AUDIO_ENABLE
625 PLAY_SONG(cg_norm_song);
626#endif 310#endif
627 break; 311#if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_BREATHING)
628 case MAGIC_TOGGLE_ALT_GUI: 312 case BL_BRTG:
629 keymap_config.swap_lalt_lgui = !keymap_config.swap_lalt_lgui; 313 backlight_toggle_breathing();
630 keymap_config.swap_ralt_rgui = keymap_config.swap_lalt_lgui;
631#ifdef AUDIO_ENABLE
632 if (keymap_config.swap_ralt_rgui) {
633 PLAY_SONG(ag_swap_song);
634 } else {
635 PLAY_SONG(ag_norm_song);
636 }
637#endif
638 break;
639 case MAGIC_TOGGLE_CTL_GUI:
640 keymap_config.swap_lctl_lgui = !keymap_config.swap_lctl_lgui;
641 keymap_config.swap_rctl_rgui = keymap_config.swap_lctl_lgui;
642#ifdef AUDIO_ENABLE
643 if (keymap_config.swap_rctl_rgui) {
644 PLAY_SONG(cg_swap_song);
645 } else {
646 PLAY_SONG(cg_norm_song);
647 }
648#endif
649 break;
650 case MAGIC_TOGGLE_NKRO:
651 clear_keyboard(); // clear first buffer to prevent stuck keys
652 keymap_config.nkro = !keymap_config.nkro;
653 break;
654 case MAGIC_EE_HANDS_LEFT:
655 eeconfig_update_handedness(true);
656 break;
657 case MAGIC_EE_HANDS_RIGHT:
658 eeconfig_update_handedness(false);
659 break;
660 default:
661 break;
662 }
663 eeconfig_update_keymap(keymap_config.raw);
664 clear_keyboard(); // clear to prevent stuck keys
665
666 return false; 314 return false;
667 } 315#endif
668 break; 316 }
317 }
669 318
319 // keycodes that depend on both pressed and non-pressed state
320 switch (keycode) {
670 case GRAVE_ESC: { 321 case GRAVE_ESC: {
322 /* true if the last press of GRAVE_ESC was shifted (i.e. GUI or SHIFT were pressed), false otherwise.
323 * Used to ensure that the correct keycode is released if the key is released.
324 */
325 static bool grave_esc_was_shifted = false;
326
671 uint8_t shifted = get_mods() & ((MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT) | MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI))); 327 uint8_t shifted = get_mods() & ((MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT) | MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI)));
672 328
673#ifdef GRAVE_ESC_ALT_OVERRIDE 329#ifdef GRAVE_ESC_ALT_OVERRIDE
@@ -710,15 +366,6 @@ bool process_record_quantum(keyrecord_t *record) {
710 send_keyboard_report(); 366 send_keyboard_report();
711 return false; 367 return false;
712 } 368 }
713
714#if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_BREATHING)
715 case BL_BRTG: {
716 if (record->event.pressed) {
717 backlight_toggle_breathing();
718 }
719 return false;
720 }
721#endif
722 } 369 }
723 370
724 return process_action_kb(record); 371 return process_action_kb(record);
@@ -829,6 +476,13 @@ void send_string_with_delay_P(const char *str, uint8_t interval) {
829} 476}
830 477
831void send_char(char ascii_code) { 478void send_char(char ascii_code) {
479#if defined(AUDIO_ENABLE) && defined(SENDSTRING_BELL)
480 if (ascii_code == '\a') { // BEL
481 PLAY_SONG(bell_song);
482 return;
483 }
484#endif
485
832 uint8_t keycode = pgm_read_byte(&ascii_to_keycode_lut[(uint8_t)ascii_code]); 486 uint8_t keycode = pgm_read_byte(&ascii_to_keycode_lut[(uint8_t)ascii_code]);
833 bool is_shifted = pgm_read_byte(&ascii_to_shift_lut[(uint8_t)ascii_code]); 487 bool is_shifted = pgm_read_byte(&ascii_to_shift_lut[(uint8_t)ascii_code]);
834 bool is_altgred = pgm_read_byte(&ascii_to_altgr_lut[(uint8_t)ascii_code]); 488 bool is_altgred = pgm_read_byte(&ascii_to_altgr_lut[(uint8_t)ascii_code]);
@@ -909,9 +563,7 @@ __attribute__((weak)) void bootmagic_lite(void) {
909 563
910 // We need multiple scans because debouncing can't be turned off. 564 // We need multiple scans because debouncing can't be turned off.
911 matrix_scan(); 565 matrix_scan();
912#if defined(DEBOUNCING_DELAY) && DEBOUNCING_DELAY > 0 566#if defined(DEBOUNCE) && DEBOUNCE > 0
913 wait_ms(DEBOUNCING_DELAY * 2);
914#elif defined(DEBOUNCE) && DEBOUNCE > 0
915 wait_ms(DEBOUNCE * 2); 567 wait_ms(DEBOUNCE * 2);
916#else 568#else
917 wait_ms(30); 569 wait_ms(30);
@@ -982,12 +634,8 @@ void matrix_scan_quantum() {
982 matrix_scan_combo(); 634 matrix_scan_combo();
983#endif 635#endif
984 636
985#if defined(BACKLIGHT_ENABLE) 637#ifdef LED_MATRIX_ENABLE
986# if defined(LED_MATRIX_ENABLE)
987 led_matrix_task(); 638 led_matrix_task();
988# elif defined(BACKLIGHT_PIN) || defined(BACKLIGHT_PINS)
989 backlight_task();
990# endif
991#endif 639#endif
992 640
993#ifdef RGB_MATRIX_ENABLE 641#ifdef RGB_MATRIX_ENABLE