1 /* Copyright 2016-2017 Jack Humbert
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #include "outputselect.h"
23 #define TAPPING_TERM 200
26 #ifndef BREATHING_PERIOD
27 #define BREATHING_PERIOD 6
30 #include "backlight.h"
31 extern backlight_config_t backlight_config;
33 #ifdef FAUXCLICKY_ENABLE
34 #include "fauxclicky.h"
42 #include "process_midi.h"
52 #define GOODBYE_SONG SONG(GOODBYE_SOUND)
55 #define AG_NORM_SONG SONG(AG_NORM_SOUND)
58 #define AG_SWAP_SONG SONG(AG_SWAP_SOUND)
60 float goodbye_song[][2] = GOODBYE_SONG;
61 float ag_norm_song[][2] = AG_NORM_SONG;
62 float ag_swap_song[][2] = AG_SWAP_SONG;
63 #ifdef DEFAULT_LAYER_SONGS
64 float default_layer_songs[][16][2] = DEFAULT_LAYER_SONGS;
68 static void do_code16 (uint16_t code, void (*f) (uint8_t)) {
70 case QK_MODS ... QK_MODS_MAX:
85 if (code < QK_RMODS_MIN) return;
97 static inline void qk_register_weak_mods(uint8_t kc) {
98 add_weak_mods(MOD_BIT(kc));
99 send_keyboard_report();
102 static inline void qk_unregister_weak_mods(uint8_t kc) {
103 del_weak_mods(MOD_BIT(kc));
104 send_keyboard_report();
107 static inline void qk_register_mods(uint8_t kc) {
108 add_weak_mods(MOD_BIT(kc));
109 send_keyboard_report();
112 static inline void qk_unregister_mods(uint8_t kc) {
113 del_weak_mods(MOD_BIT(kc));
114 send_keyboard_report();
117 void register_code16 (uint16_t code) {
118 if (IS_MOD(code) || code == KC_NO) {
119 do_code16 (code, qk_register_mods);
121 do_code16 (code, qk_register_weak_mods);
123 register_code (code);
126 void unregister_code16 (uint16_t code) {
127 unregister_code (code);
128 if (IS_MOD(code) || code == KC_NO) {
129 do_code16 (code, qk_unregister_mods);
131 do_code16 (code, qk_unregister_weak_mods);
135 __attribute__ ((weak))
136 bool process_action_kb(keyrecord_t *record) {
140 __attribute__ ((weak))
141 bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
142 return process_record_user(keycode, record);
145 __attribute__ ((weak))
146 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
150 void reset_keyboard(void) {
152 #if defined(MIDI_ENABLE) && defined(MIDI_BASIC)
153 process_midi_all_notes_off();
156 #ifndef NO_MUSIC_MODE
157 music_all_notes_off();
159 uint16_t timer_start = timer_read();
160 PLAY_SONG(goodbye_song);
162 while(timer_elapsed(timer_start) < 250)
169 // this is also done later in bootloader.c - not sure if it's neccesary here
170 #ifdef BOOTLOADER_CATERINA
171 *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific
176 // Shift / paren setup
179 #define LSPO_KEY KC_9
182 #define RSPC_KEY KC_0
185 // Shift / Enter setup
187 #define SFTENT_KEY KC_ENT
190 static bool shift_interrupted[2] = {0, 0};
191 static uint16_t scs_timer[2] = {0, 0};
193 /* true if the last press of GRAVE_ESC was shifted (i.e. GUI or SHIFT were pressed), false otherwise.
194 * Used to ensure that the correct keycode is released if the key is released.
196 static bool grave_esc_was_shifted = false;
198 bool process_record_quantum(keyrecord_t *record) {
200 /* This gets the keycode from the key pressed */
201 keypos_t key = record->event.key;
204 #if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE)
205 /* TODO: Use store_or_get_action() or a similar function. */
206 if (!disable_action_cache) {
209 if (record->event.pressed) {
210 layer = layer_switch_get_layer(key);
211 update_source_layers_cache(key, layer);
213 layer = read_source_layers_cache(key);
215 keycode = keymap_key_to_keycode(layer, key);
218 keycode = keymap_key_to_keycode(layer_switch_get_layer(key), key);
220 // This is how you use actions here
221 // if (keycode == KC_LEAD) {
223 // action.code = ACTION_DEFAULT_LAYER_SET(0);
224 // process_action(record, action);
228 #ifdef TAP_DANCE_ENABLE
229 preprocess_tap_dance(keycode, record);
233 #if defined(KEY_LOCK_ENABLE)
234 // Must run first to be able to mask key_up events.
235 process_key_lock(&keycode, record) &&
237 #if defined(AUDIO_ENABLE) && defined(AUDIO_CLICKY)
238 process_clicky(keycode, record) &&
239 #endif //AUDIO_CLICKY
240 process_record_kb(keycode, record) &&
241 #if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_KEYPRESSES)
242 process_rgb_matrix(keycode, record) &&
244 #if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED)
245 process_midi(keycode, record) &&
248 process_audio(keycode, record) &&
251 process_steno(keycode, record) &&
253 #if ( defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC))) && !defined(NO_MUSIC_MODE)
254 process_music(keycode, record) &&
256 #ifdef TAP_DANCE_ENABLE
257 process_tap_dance(keycode, record) &&
260 process_leader(keycode, record) &&
263 process_combo(keycode, record) &&
265 #ifdef UNICODE_ENABLE
266 process_unicode(keycode, record) &&
269 process_ucis(keycode, record) &&
271 #ifdef PRINTING_ENABLE
272 process_printer(keycode, record) &&
274 #ifdef AUTO_SHIFT_ENABLE
275 process_auto_shift(keycode, record) &&
277 #ifdef UNICODEMAP_ENABLE
278 process_unicode_map(keycode, record) &&
280 #ifdef TERMINAL_ENABLE
281 process_terminal(keycode, record) &&
287 // Shift / paren setup
291 if (record->event.pressed) {
296 if (record->event.pressed) {
298 print("DEBUG: enabled.\n");
301 #ifdef FAUXCLICKY_ENABLE
303 if (record->event.pressed) {
308 if (record->event.pressed) {
313 if (record->event.pressed) {
318 #if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
320 // Split keyboards need to trigger on key-up for edge-case issue
321 #ifndef SPLIT_KEYBOARD
322 if (record->event.pressed) {
324 if (!record->event.pressed) {
327 #ifdef SPLIT_KEYBOARD
332 case RGB_MODE_FORWARD:
333 if (record->event.pressed) {
334 uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT));
336 rgblight_step_reverse();
341 #ifdef SPLIT_KEYBOARD
346 case RGB_MODE_REVERSE:
347 if (record->event.pressed) {
348 uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT));
353 rgblight_step_reverse();
355 #ifdef SPLIT_KEYBOARD
361 // Split keyboards need to trigger on key-up for edge-case issue
362 #ifndef SPLIT_KEYBOARD
363 if (record->event.pressed) {
365 if (!record->event.pressed) {
367 rgblight_increase_hue();
368 #ifdef SPLIT_KEYBOARD
374 // Split keyboards need to trigger on key-up for edge-case issue
375 #ifndef SPLIT_KEYBOARD
376 if (record->event.pressed) {
378 if (!record->event.pressed) {
380 rgblight_decrease_hue();
381 #ifdef SPLIT_KEYBOARD
387 // Split keyboards need to trigger on key-up for edge-case issue
388 #ifndef SPLIT_KEYBOARD
389 if (record->event.pressed) {
391 if (!record->event.pressed) {
393 rgblight_increase_sat();
394 #ifdef SPLIT_KEYBOARD
400 // Split keyboards need to trigger on key-up for edge-case issue
401 #ifndef SPLIT_KEYBOARD
402 if (record->event.pressed) {
404 if (!record->event.pressed) {
406 rgblight_decrease_sat();
407 #ifdef SPLIT_KEYBOARD
413 // Split keyboards need to trigger on key-up for edge-case issue
414 #ifndef SPLIT_KEYBOARD
415 if (record->event.pressed) {
417 if (!record->event.pressed) {
419 rgblight_increase_val();
420 #ifdef SPLIT_KEYBOARD
426 // Split keyboards need to trigger on key-up for edge-case issue
427 #ifndef SPLIT_KEYBOARD
428 if (record->event.pressed) {
430 if (!record->event.pressed) {
432 rgblight_decrease_val();
433 #ifdef SPLIT_KEYBOARD
439 if (record->event.pressed) {
440 rgblight_increase_speed();
444 if (record->event.pressed) {
445 rgblight_decrease_speed();
449 if (record->event.pressed) {
450 rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT);
451 #ifdef SPLIT_KEYBOARD
456 case RGB_MODE_BREATHE:
457 #ifdef RGBLIGHT_EFFECT_BREATHING
458 if (record->event.pressed) {
459 if ((RGBLIGHT_MODE_BREATHING <= rgblight_get_mode()) &&
460 (rgblight_get_mode() < RGBLIGHT_MODE_BREATHING_end)) {
463 rgblight_mode(RGBLIGHT_MODE_BREATHING);
468 case RGB_MODE_RAINBOW:
469 #ifdef RGBLIGHT_EFFECT_RAINBOW_MOOD
470 if (record->event.pressed) {
471 if ((RGBLIGHT_MODE_RAINBOW_MOOD <= rgblight_get_mode()) &&
472 (rgblight_get_mode() < RGBLIGHT_MODE_RAINBOW_MOOD_end)) {
475 rgblight_mode(RGBLIGHT_MODE_RAINBOW_MOOD);
481 #ifdef RGBLIGHT_EFFECT_RAINBOW_SWIRL
482 if (record->event.pressed) {
483 if ((RGBLIGHT_MODE_RAINBOW_SWIRL <= rgblight_get_mode()) &&
484 (rgblight_get_mode() < RGBLIGHT_MODE_RAINBOW_SWIRL_end)) {
487 rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL);
493 #ifdef RGBLIGHT_EFFECT_SNAKE
494 if (record->event.pressed) {
495 if ((RGBLIGHT_MODE_SNAKE <= rgblight_get_mode()) &&
496 (rgblight_get_mode() < RGBLIGHT_MODE_SNAKE_end)) {
499 rgblight_mode(RGBLIGHT_MODE_SNAKE);
504 case RGB_MODE_KNIGHT:
505 #ifdef RGBLIGHT_EFFECT_KNIGHT
506 if (record->event.pressed) {
507 if ((RGBLIGHT_MODE_KNIGHT <= rgblight_get_mode()) &&
508 (rgblight_get_mode() < RGBLIGHT_MODE_KNIGHT_end)) {
511 rgblight_mode(RGBLIGHT_MODE_KNIGHT);
517 #ifdef RGBLIGHT_EFFECT_CHRISTMAS
518 if (record->event.pressed) {
519 rgblight_mode(RGBLIGHT_MODE_CHRISTMAS);
523 case RGB_MODE_GRADIENT:
524 #ifdef RGBLIGHT_EFFECT_STATIC_GRADIENT
525 if (record->event.pressed) {
526 if ((RGBLIGHT_MODE_STATIC_GRADIENT <= rgblight_get_mode()) &&
527 (rgblight_get_mode() < RGBLIGHT_MODE_STATIC_GRADIENT_end)) {
530 rgblight_mode(RGBLIGHT_MODE_STATIC_GRADIENT);
535 case RGB_MODE_RGBTEST:
536 #ifdef RGBLIGHT_EFFECT_RGB_TEST
537 if (record->event.pressed) {
538 rgblight_mode(RGBLIGHT_MODE_RGB_TEST);
542 #endif // defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
545 if (record->event.pressed) {
546 set_output(OUTPUT_AUTO);
550 if (record->event.pressed) {
551 set_output(OUTPUT_USB);
554 #ifdef BLUETOOTH_ENABLE
556 if (record->event.pressed) {
557 set_output(OUTPUT_BLUETOOTH);
562 case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_TOGGLE_NKRO:
563 if (record->event.pressed) {
564 // MAGIC actions (BOOTMAGIC without the boot)
565 if (!eeconfig_is_enabled()) {
569 keymap_config.raw = eeconfig_read_keymap();
572 case MAGIC_SWAP_CONTROL_CAPSLOCK:
573 keymap_config.swap_control_capslock = true;
575 case MAGIC_CAPSLOCK_TO_CONTROL:
576 keymap_config.capslock_to_control = true;
578 case MAGIC_SWAP_LALT_LGUI:
579 keymap_config.swap_lalt_lgui = true;
581 case MAGIC_SWAP_RALT_RGUI:
582 keymap_config.swap_ralt_rgui = true;
585 keymap_config.no_gui = true;
587 case MAGIC_SWAP_GRAVE_ESC:
588 keymap_config.swap_grave_esc = true;
590 case MAGIC_SWAP_BACKSLASH_BACKSPACE:
591 keymap_config.swap_backslash_backspace = true;
593 case MAGIC_HOST_NKRO:
594 keymap_config.nkro = true;
596 case MAGIC_SWAP_ALT_GUI:
597 keymap_config.swap_lalt_lgui = true;
598 keymap_config.swap_ralt_rgui = true;
600 PLAY_SONG(ag_swap_song);
603 case MAGIC_UNSWAP_CONTROL_CAPSLOCK:
604 keymap_config.swap_control_capslock = false;
606 case MAGIC_UNCAPSLOCK_TO_CONTROL:
607 keymap_config.capslock_to_control = false;
609 case MAGIC_UNSWAP_LALT_LGUI:
610 keymap_config.swap_lalt_lgui = false;
612 case MAGIC_UNSWAP_RALT_RGUI:
613 keymap_config.swap_ralt_rgui = false;
616 keymap_config.no_gui = false;
618 case MAGIC_UNSWAP_GRAVE_ESC:
619 keymap_config.swap_grave_esc = false;
621 case MAGIC_UNSWAP_BACKSLASH_BACKSPACE:
622 keymap_config.swap_backslash_backspace = false;
624 case MAGIC_UNHOST_NKRO:
625 keymap_config.nkro = false;
627 case MAGIC_UNSWAP_ALT_GUI:
628 keymap_config.swap_lalt_lgui = false;
629 keymap_config.swap_ralt_rgui = false;
631 PLAY_SONG(ag_norm_song);
634 case MAGIC_TOGGLE_ALT_GUI:
635 keymap_config.swap_lalt_lgui = !keymap_config.swap_lalt_lgui;
636 keymap_config.swap_ralt_rgui = !keymap_config.swap_ralt_rgui;
638 if (keymap_config.swap_ralt_rgui) {
639 PLAY_SONG(ag_swap_song);
641 PLAY_SONG(ag_norm_song);
645 case MAGIC_TOGGLE_NKRO:
646 keymap_config.nkro = !keymap_config.nkro;
651 eeconfig_update_keymap(keymap_config.raw);
652 clear_keyboard(); // clear to prevent stuck keys
658 if (record->event.pressed) {
659 shift_interrupted[0] = false;
660 scs_timer[0] = timer_read ();
661 register_mods(MOD_BIT(KC_LSFT));
664 #ifdef DISABLE_SPACE_CADET_ROLLOVER
665 if (get_mods() & MOD_BIT(KC_RSFT)) {
666 shift_interrupted[0] = true;
667 shift_interrupted[1] = true;
670 if (!shift_interrupted[0] && timer_elapsed(scs_timer[0]) < TAPPING_TERM) {
671 register_code(LSPO_KEY);
672 unregister_code(LSPO_KEY);
674 unregister_mods(MOD_BIT(KC_LSFT));
680 if (record->event.pressed) {
681 shift_interrupted[1] = false;
682 scs_timer[1] = timer_read ();
683 register_mods(MOD_BIT(KC_RSFT));
686 #ifdef DISABLE_SPACE_CADET_ROLLOVER
687 if (get_mods() & MOD_BIT(KC_LSFT)) {
688 shift_interrupted[0] = true;
689 shift_interrupted[1] = true;
692 if (!shift_interrupted[1] && timer_elapsed(scs_timer[1]) < TAPPING_TERM) {
693 register_code(RSPC_KEY);
694 unregister_code(RSPC_KEY);
696 unregister_mods(MOD_BIT(KC_RSFT));
702 if (record->event.pressed) {
703 shift_interrupted[1] = false;
704 scs_timer[1] = timer_read ();
705 register_mods(MOD_BIT(KC_RSFT));
707 else if (!shift_interrupted[1] && timer_elapsed(scs_timer[1]) < TAPPING_TERM) {
708 unregister_mods(MOD_BIT(KC_RSFT));
709 register_code(SFTENT_KEY);
710 unregister_code(SFTENT_KEY);
713 unregister_mods(MOD_BIT(KC_RSFT));
719 uint8_t shifted = get_mods() & ((MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)
720 |MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)));
722 #ifdef GRAVE_ESC_ALT_OVERRIDE
723 // if ALT is pressed, ESC is always sent
724 // this is handy for the cmd+opt+esc shortcut on macOS, among other things.
725 if (get_mods() & (MOD_BIT(KC_LALT) | MOD_BIT(KC_RALT))) {
730 #ifdef GRAVE_ESC_CTRL_OVERRIDE
731 // if CTRL is pressed, ESC is always sent
732 // this is handy for the ctrl+shift+esc shortcut on windows, among other things.
733 if (get_mods() & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL))) {
738 #ifdef GRAVE_ESC_GUI_OVERRIDE
739 // if GUI is pressed, ESC is always sent
740 if (get_mods() & (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI))) {
745 #ifdef GRAVE_ESC_SHIFT_OVERRIDE
746 // if SHIFT is pressed, ESC is always sent
747 if (get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
752 if (record->event.pressed) {
753 grave_esc_was_shifted = shifted;
754 add_key(shifted ? KC_GRAVE : KC_ESCAPE);
757 del_key(grave_esc_was_shifted ? KC_GRAVE : KC_ESCAPE);
760 send_keyboard_report();
764 #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_BREATHING)
766 if (record->event.pressed)
773 shift_interrupted[0] = true;
774 shift_interrupted[1] = true;
779 return process_action_kb(record);
782 __attribute__ ((weak))
783 const bool ascii_to_shift_lut[0x80] PROGMEM = {
784 0, 0, 0, 0, 0, 0, 0, 0,
785 0, 0, 0, 0, 0, 0, 0, 0,
786 0, 0, 0, 0, 0, 0, 0, 0,
787 0, 0, 0, 0, 0, 0, 0, 0,
788 0, 1, 1, 1, 1, 1, 1, 0,
789 1, 1, 1, 1, 0, 0, 0, 0,
790 0, 0, 0, 0, 0, 0, 0, 0,
791 0, 0, 1, 0, 1, 0, 1, 1,
792 1, 1, 1, 1, 1, 1, 1, 1,
793 1, 1, 1, 1, 1, 1, 1, 1,
794 1, 1, 1, 1, 1, 1, 1, 1,
795 1, 1, 1, 0, 0, 0, 1, 1,
796 0, 0, 0, 0, 0, 0, 0, 0,
797 0, 0, 0, 0, 0, 0, 0, 0,
798 0, 0, 0, 0, 0, 0, 0, 0,
799 0, 0, 0, 1, 1, 1, 1, 0
802 __attribute__ ((weak))
803 const uint8_t ascii_to_keycode_lut[0x80] PROGMEM = {
804 0, 0, 0, 0, 0, 0, 0, 0,
805 KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0,
806 0, 0, 0, 0, 0, 0, 0, 0,
807 0, 0, 0, KC_ESC, 0, 0, 0, 0,
808 KC_SPC, KC_1, KC_QUOT, KC_3, KC_4, KC_5, KC_7, KC_QUOT,
809 KC_9, KC_0, KC_8, KC_EQL, KC_COMM, KC_MINS, KC_DOT, KC_SLSH,
810 KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
811 KC_8, KC_9, KC_SCLN, KC_SCLN, KC_COMM, KC_EQL, KC_DOT, KC_SLSH,
812 KC_2, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
813 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
814 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
815 KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_6, KC_MINS,
816 KC_GRV, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
817 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
818 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
819 KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL
822 void send_string(const char *str) {
823 send_string_with_delay(str, 0);
826 void send_string_P(const char *str) {
827 send_string_with_delay_P(str, 0);
830 void send_string_with_delay(const char *str, uint8_t interval) {
832 char ascii_code = *str;
833 if (!ascii_code) break;
834 if (ascii_code == 1) {
836 uint8_t keycode = *(++str);
837 register_code(keycode);
838 unregister_code(keycode);
839 } else if (ascii_code == 2) {
841 uint8_t keycode = *(++str);
842 register_code(keycode);
843 } else if (ascii_code == 3) {
845 uint8_t keycode = *(++str);
846 unregister_code(keycode);
848 send_char(ascii_code);
852 { uint8_t ms = interval; while (ms--) wait_ms(1); }
856 void send_string_with_delay_P(const char *str, uint8_t interval) {
858 char ascii_code = pgm_read_byte(str);
859 if (!ascii_code) break;
860 if (ascii_code == 1) {
862 uint8_t keycode = pgm_read_byte(++str);
863 register_code(keycode);
864 unregister_code(keycode);
865 } else if (ascii_code == 2) {
867 uint8_t keycode = pgm_read_byte(++str);
868 register_code(keycode);
869 } else if (ascii_code == 3) {
871 uint8_t keycode = pgm_read_byte(++str);
872 unregister_code(keycode);
874 send_char(ascii_code);
878 { uint8_t ms = interval; while (ms--) wait_ms(1); }
882 void send_char(char ascii_code) {
884 keycode = pgm_read_byte(&ascii_to_keycode_lut[(uint8_t)ascii_code]);
885 if (pgm_read_byte(&ascii_to_shift_lut[(uint8_t)ascii_code])) {
886 register_code(KC_LSFT);
887 register_code(keycode);
888 unregister_code(keycode);
889 unregister_code(KC_LSFT);
891 register_code(keycode);
892 unregister_code(keycode);
896 void set_single_persistent_default_layer(uint8_t default_layer) {
897 #if defined(AUDIO_ENABLE) && defined(DEFAULT_LAYER_SONGS)
898 PLAY_SONG(default_layer_songs[default_layer]);
900 eeconfig_update_default_layer(1U<<default_layer);
901 default_layer_set(1U<<default_layer);
904 uint32_t update_tri_layer_state(uint32_t state, uint8_t layer1, uint8_t layer2, uint8_t layer3) {
905 uint32_t mask12 = (1UL << layer1) | (1UL << layer2);
906 uint32_t mask3 = 1UL << layer3;
907 return (state & mask12) == mask12 ? (state | mask3) : (state & ~mask3);
910 void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
911 layer_state_set(update_tri_layer_state(layer_state, layer1, layer2, layer3));
914 void tap_random_base64(void) {
915 #if defined(__AVR_ATmega32U4__)
916 uint8_t key = (TCNT0 + TCNT1 + TCNT3 + TCNT4) % 64;
918 uint8_t key = rand() % 64;
922 register_code(KC_LSFT);
923 register_code(key + KC_A);
924 unregister_code(key + KC_A);
925 unregister_code(KC_LSFT);
928 register_code(key - 26 + KC_A);
929 unregister_code(key - 26 + KC_A);
933 unregister_code(KC_0);
936 register_code(key - 53 + KC_1);
937 unregister_code(key - 53 + KC_1);
940 register_code(KC_LSFT);
941 register_code(KC_EQL);
942 unregister_code(KC_EQL);
943 unregister_code(KC_LSFT);
946 register_code(KC_SLSH);
947 unregister_code(KC_SLSH);
952 __attribute__((weak))
953 void bootmagic_lite(void) {
954 // The lite version of TMK's bootmagic based on Wilba.
955 // 100% less potential for accidentally making the
956 // keyboard do stupid things.
958 // We need multiple scans because debouncing can't be turned off.
960 #if defined(DEBOUNCING_DELAY) && DEBOUNCING_DELAY > 0
961 wait_ms(DEBOUNCING_DELAY * 2);
962 #elif defined(DEBOUNCE) && DEBOUNCE > 0
963 wait_ms(DEBOUNCE * 2);
969 // If the Esc and space bar are held down on power up,
970 // reset the EEPROM valid state and jump to bootloader.
971 // Assumes Esc is at [0,0].
972 // This isn't very generalized, but we need something that doesn't
973 // rely on user's keymaps in firmware or EEPROM.
974 if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) {
976 // Jump to bootloader.
981 void matrix_init_quantum() {
982 #ifdef BOOTMAGIC_LITE
985 if (!eeconfig_is_enabled()) {
988 #ifdef BACKLIGHT_ENABLE
989 backlight_init_ports();
994 #ifdef RGB_MATRIX_ENABLE
997 #ifdef ENCODER_ENABLE
1003 uint8_t rgb_matrix_task_counter = 0;
1005 #ifndef RGB_MATRIX_SKIP_FRAMES
1006 #define RGB_MATRIX_SKIP_FRAMES 1
1009 void matrix_scan_quantum() {
1010 #if defined(AUDIO_ENABLE) && !defined(NO_MUSIC_MODE)
1011 matrix_scan_music();
1014 #ifdef TAP_DANCE_ENABLE
1015 matrix_scan_tap_dance();
1019 matrix_scan_combo();
1022 #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_PIN)
1026 #ifdef RGB_MATRIX_ENABLE
1028 if (rgb_matrix_task_counter == 0) {
1029 rgb_matrix_update_pwm_buffers();
1031 rgb_matrix_task_counter = ((rgb_matrix_task_counter + 1) % (RGB_MATRIX_SKIP_FRAMES + 1));
1034 #ifdef ENCODER_ENABLE
1040 #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_PIN)
1042 static const uint8_t backlight_pin = BACKLIGHT_PIN;
1044 // depending on the pin, we use a different output compare unit
1045 #if BACKLIGHT_PIN == B7
1046 # define TCCRxA TCCR1A
1047 # define TCCRxB TCCR1B
1048 # define COMxx1 COM1C1
1049 # define OCRxx OCR1C
1051 #elif BACKLIGHT_PIN == B6
1052 # define TCCRxA TCCR1A
1053 # define TCCRxB TCCR1B
1054 # define COMxx1 COM1B1
1055 # define OCRxx OCR1B
1057 #elif BACKLIGHT_PIN == B5
1058 # define TCCRxA TCCR1A
1059 # define TCCRxB TCCR1B
1060 # define COMxx1 COM1A1
1061 # define OCRxx OCR1A
1063 #elif BACKLIGHT_PIN == C6
1064 # define TCCRxA TCCR3A
1065 # define TCCRxB TCCR3B
1066 # define COMxx1 COM1A1
1067 # define OCRxx OCR3A
1070 # define NO_HARDWARE_PWM
1073 #ifndef BACKLIGHT_ON_STATE
1074 #define BACKLIGHT_ON_STATE 0
1077 #ifdef NO_HARDWARE_PWM // pwm through software
1079 __attribute__ ((weak))
1080 void backlight_init_ports(void)
1082 // Setup backlight pin as output and output to on state.
1084 _SFR_IO8((backlight_pin >> 4) + 1) |= _BV(backlight_pin & 0xF);
1085 #if BACKLIGHT_ON_STATE == 0
1087 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
1090 _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
1094 __attribute__ ((weak))
1095 void backlight_set(uint8_t level) {}
1097 uint8_t backlight_tick = 0;
1099 #ifndef BACKLIGHT_CUSTOM_DRIVER
1100 void backlight_task(void) {
1101 if ((0xFFFF >> ((BACKLIGHT_LEVELS - get_backlight_level()) * ((BACKLIGHT_LEVELS + 1) / 2))) & (1 << backlight_tick)) {
1102 #if BACKLIGHT_ON_STATE == 0
1104 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
1107 _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
1110 #if BACKLIGHT_ON_STATE == 0
1112 _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
1115 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
1118 backlight_tick = (backlight_tick + 1) % 16;
1122 #ifdef BACKLIGHT_BREATHING
1123 #ifndef BACKLIGHT_CUSTOM_DRIVER
1124 #error "Backlight breathing only available with hardware PWM. Please disable."
1128 #else // pwm through timer
1130 #define TIMER_TOP 0xFFFFU
1132 // See http://jared.geek.nz/2013/feb/linear-led-pwm
1133 static uint16_t cie_lightness(uint16_t v) {
1134 if (v <= 5243) // if below 8% of max
1135 return v / 9; // same as dividing by 900%
1137 uint32_t y = (((uint32_t) v + 10486) << 8) / (10486 + 0xFFFFUL); // add 16% of max and compare
1138 // to get a useful result with integer division, we shift left in the expression above
1139 // and revert what we've done again after squaring.
1141 if (y > 0xFFFFUL) // prevent overflow
1144 return (uint16_t) y;
1148 // range for val is [0..TIMER_TOP]. PWM pin is high while the timer count is below val.
1149 static inline void set_pwm(uint16_t val) {
1153 #ifndef BACKLIGHT_CUSTOM_DRIVER
1154 __attribute__ ((weak))
1155 void backlight_set(uint8_t level) {
1156 if (level > BACKLIGHT_LEVELS)
1157 level = BACKLIGHT_LEVELS;
1160 // Turn off PWM control on backlight pin
1161 TCCRxA &= ~(_BV(COMxx1));
1163 // Turn on PWM control of backlight pin
1164 TCCRxA |= _BV(COMxx1);
1166 // Set the brightness
1167 set_pwm(cie_lightness(TIMER_TOP * (uint32_t)level / BACKLIGHT_LEVELS));
1170 void backlight_task(void) {}
1171 #endif // BACKLIGHT_CUSTOM_DRIVER
1173 #ifdef BACKLIGHT_BREATHING
1175 #define BREATHING_NO_HALT 0
1176 #define BREATHING_HALT_OFF 1
1177 #define BREATHING_HALT_ON 2
1178 #define BREATHING_STEPS 128
1180 static uint8_t breathing_period = BREATHING_PERIOD;
1181 static uint8_t breathing_halt = BREATHING_NO_HALT;
1182 static uint16_t breathing_counter = 0;
1184 bool is_breathing(void) {
1185 return !!(TIMSK1 & _BV(TOIE1));
1188 #define breathing_interrupt_enable() do {TIMSK1 |= _BV(TOIE1);} while (0)
1189 #define breathing_interrupt_disable() do {TIMSK1 &= ~_BV(TOIE1);} while (0)
1190 #define breathing_min() do {breathing_counter = 0;} while (0)
1191 #define breathing_max() do {breathing_counter = breathing_period * 244 / 2;} while (0)
1193 void breathing_enable(void)
1195 breathing_counter = 0;
1196 breathing_halt = BREATHING_NO_HALT;
1197 breathing_interrupt_enable();
1200 void breathing_pulse(void)
1202 if (get_backlight_level() == 0)
1206 breathing_halt = BREATHING_HALT_ON;
1207 breathing_interrupt_enable();
1210 void breathing_disable(void)
1212 breathing_interrupt_disable();
1213 // Restore backlight level
1214 backlight_set(get_backlight_level());
1217 void breathing_self_disable(void)
1219 if (get_backlight_level() == 0)
1220 breathing_halt = BREATHING_HALT_OFF;
1222 breathing_halt = BREATHING_HALT_ON;
1225 void breathing_toggle(void) {
1227 breathing_disable();
1232 void breathing_period_set(uint8_t value)
1236 breathing_period = value;
1239 void breathing_period_default(void) {
1240 breathing_period_set(BREATHING_PERIOD);
1243 void breathing_period_inc(void)
1245 breathing_period_set(breathing_period+1);
1248 void breathing_period_dec(void)
1250 breathing_period_set(breathing_period-1);
1253 /* To generate breathing curve in python:
1254 * from math import sin, pi; [int(sin(x/128.0*pi)**4*255) for x in range(128)]
1256 static const uint8_t breathing_table[BREATHING_STEPS] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 17, 20, 24, 28, 32, 36, 41, 46, 51, 57, 63, 70, 76, 83, 91, 98, 106, 113, 121, 129, 138, 146, 154, 162, 170, 178, 185, 193, 200, 207, 213, 220, 225, 231, 235, 240, 244, 247, 250, 252, 253, 254, 255, 254, 253, 252, 250, 247, 244, 240, 235, 231, 225, 220, 213, 207, 200, 193, 185, 178, 170, 162, 154, 146, 138, 129, 121, 113, 106, 98, 91, 83, 76, 70, 63, 57, 51, 46, 41, 36, 32, 28, 24, 20, 17, 15, 12, 10, 8, 6, 5, 4, 3, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1258 // Use this before the cie_lightness function.
1259 static inline uint16_t scale_backlight(uint16_t v) {
1260 return v / BACKLIGHT_LEVELS * get_backlight_level();
1263 /* Assuming a 16MHz CPU clock and a timer that resets at 64k (ICR1), the following interrupt handler will run
1264 * about 244 times per second.
1266 ISR(TIMER1_OVF_vect)
1268 uint16_t interval = (uint16_t) breathing_period * 244 / BREATHING_STEPS;
1269 // resetting after one period to prevent ugly reset at overflow.
1270 breathing_counter = (breathing_counter + 1) % (breathing_period * 244);
1271 uint8_t index = breathing_counter / interval % BREATHING_STEPS;
1273 if (((breathing_halt == BREATHING_HALT_ON) && (index == BREATHING_STEPS / 2)) ||
1274 ((breathing_halt == BREATHING_HALT_OFF) && (index == BREATHING_STEPS - 1)))
1276 breathing_interrupt_disable();
1279 set_pwm(cie_lightness(scale_backlight((uint16_t) pgm_read_byte(&breathing_table[index]) * 0x0101U)));
1282 #endif // BACKLIGHT_BREATHING
1284 __attribute__ ((weak))
1285 void backlight_init_ports(void)
1287 // Setup backlight pin as output and output to on state.
1289 _SFR_IO8((backlight_pin >> 4) + 1) |= _BV(backlight_pin & 0xF);
1290 #if BACKLIGHT_ON_STATE == 0
1292 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
1295 _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
1297 // I could write a wall of text here to explain... but TL;DW
1298 // Go read the ATmega32u4 datasheet.
1299 // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on
1301 // Pin PB7 = OCR1C (Timer 1, Channel C)
1302 // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0
1303 // (i.e. start high, go low when counter matches.)
1304 // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0
1305 // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1
1309 "In fast PWM mode, the compare units allow generation of PWM waveforms on the OCnx pins. Setting the COMnx1:0 bits to two will produce a non-inverted PWM [..]."
1310 "In fast PWM mode the counter is incremented until the counter value matches either one of the fixed values 0x00FF, 0x01FF, or 0x03FF (WGMn3:0 = 5, 6, or 7), the value in ICRn (WGMn3:0 = 14), or the value in OCRnA (WGMn3:0 = 15)."
1312 TCCRxA = _BV(COMxx1) | _BV(WGM11); // = 0b00001010;
1313 TCCRxB = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
1314 // Use full 16-bit resolution. Counter counts to ICR1 before reset to 0.
1318 #ifdef BACKLIGHT_BREATHING
1323 #endif // NO_HARDWARE_PWM
1327 __attribute__ ((weak))
1328 void backlight_init_ports(void) {}
1330 __attribute__ ((weak))
1331 void backlight_set(uint8_t level) {}
1335 #ifdef HD44780_ENABLED
1336 #include "hd44780.h"
1340 // Functions for spitting out values
1343 void send_dword(uint32_t number) { // this might not actually work
1344 uint16_t word = (number >> 16);
1346 send_word(number & 0xFFFFUL);
1349 void send_word(uint16_t number) {
1350 uint8_t byte = number >> 8;
1352 send_byte(number & 0xFF);
1355 void send_byte(uint8_t number) {
1356 uint8_t nibble = number >> 4;
1357 send_nibble(nibble);
1358 send_nibble(number & 0xF);
1361 void send_nibble(uint8_t number) {
1364 register_code(KC_0);
1365 unregister_code(KC_0);
1368 register_code(KC_1 + (number - 1));
1369 unregister_code(KC_1 + (number - 1));
1372 register_code(KC_A + (number - 0xA));
1373 unregister_code(KC_A + (number - 0xA));
1379 __attribute__((weak))
1380 uint16_t hex_to_keycode(uint8_t hex)
1385 } else if (hex < 0xA) {
1386 return KC_1 + (hex - 0x1);
1388 return KC_A + (hex - 0xA);
1392 void api_send_unicode(uint32_t unicode) {
1395 dword_to_bytes(unicode, chunk);
1396 MT_SEND_DATA(DT_UNICODE, chunk, 5);
1400 __attribute__ ((weak))
1401 void led_set_user(uint8_t usb_led) {
1405 __attribute__ ((weak))
1406 void led_set_kb(uint8_t usb_led) {
1407 led_set_user(usb_led);
1410 __attribute__ ((weak))
1411 void led_init_ports(void)
1416 __attribute__ ((weak))
1417 void led_set(uint8_t usb_led)
1422 // // Using PE6 Caps Lock LED
1423 // if (usb_led & (1<<USB_LED_CAPS_LOCK))
1433 // PORTE &= ~(1<<6);
1436 led_set_kb(usb_led);
1440 //------------------------------------------------------------------------------
1441 // Override these functions in your keymap file to play different tunes on
1442 // different events such as startup and bootloader jump
1444 __attribute__ ((weak))
1445 void startup_user() {}
1447 __attribute__ ((weak))
1448 void shutdown_user() {}
1450 //------------------------------------------------------------------------------