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 void tap_code16(uint16_t code) {
136 register_code16(code);
137 #if TAP_CODE_DELAY > 0
138 wait_ms(TAP_CODE_DELAY);
140 unregister_code16(code);
143 __attribute__ ((weak))
144 bool process_action_kb(keyrecord_t *record) {
148 __attribute__ ((weak))
149 bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
150 return process_record_user(keycode, record);
153 __attribute__ ((weak))
154 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
158 void reset_keyboard(void) {
160 #if defined(MIDI_ENABLE) && defined(MIDI_BASIC)
161 process_midi_all_notes_off();
164 #ifndef NO_MUSIC_MODE
165 music_all_notes_off();
167 uint16_t timer_start = timer_read();
168 PLAY_SONG(goodbye_song);
170 while(timer_elapsed(timer_start) < 250)
177 // this is also done later in bootloader.c - not sure if it's neccesary here
178 #ifdef BOOTLOADER_CATERINA
179 *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific
184 // Shift / paren setup
187 #define LSPO_KEY KC_9
190 #define RSPC_KEY KC_0
193 // Shift / Enter setup
195 #define SFTENT_KEY KC_ENT
198 static bool shift_interrupted[2] = {0, 0};
199 static uint16_t scs_timer[2] = {0, 0};
201 /* true if the last press of GRAVE_ESC was shifted (i.e. GUI or SHIFT were pressed), false otherwise.
202 * Used to ensure that the correct keycode is released if the key is released.
204 static bool grave_esc_was_shifted = false;
206 bool process_record_quantum(keyrecord_t *record) {
208 /* This gets the keycode from the key pressed */
209 keypos_t key = record->event.key;
212 #if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE)
213 /* TODO: Use store_or_get_action() or a similar function. */
214 if (!disable_action_cache) {
217 if (record->event.pressed) {
218 layer = layer_switch_get_layer(key);
219 update_source_layers_cache(key, layer);
221 layer = read_source_layers_cache(key);
223 keycode = keymap_key_to_keycode(layer, key);
226 keycode = keymap_key_to_keycode(layer_switch_get_layer(key), key);
228 // This is how you use actions here
229 // if (keycode == KC_LEAD) {
231 // action.code = ACTION_DEFAULT_LAYER_SET(0);
232 // process_action(record, action);
236 #ifdef TAP_DANCE_ENABLE
237 preprocess_tap_dance(keycode, record);
241 #if defined(KEY_LOCK_ENABLE)
242 // Must run first to be able to mask key_up events.
243 process_key_lock(&keycode, record) &&
245 #if defined(AUDIO_ENABLE) && defined(AUDIO_CLICKY)
246 process_clicky(keycode, record) &&
247 #endif //AUDIO_CLICKY
248 process_record_kb(keycode, record) &&
249 #if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_KEYPRESSES)
250 process_rgb_matrix(keycode, record) &&
252 #if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED)
253 process_midi(keycode, record) &&
256 process_audio(keycode, record) &&
259 process_steno(keycode, record) &&
261 #if ( defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC))) && !defined(NO_MUSIC_MODE)
262 process_music(keycode, record) &&
264 #ifdef TAP_DANCE_ENABLE
265 process_tap_dance(keycode, record) &&
268 process_leader(keycode, record) &&
271 process_combo(keycode, record) &&
273 #ifdef UNICODE_ENABLE
274 process_unicode(keycode, record) &&
277 process_ucis(keycode, record) &&
279 #ifdef PRINTING_ENABLE
280 process_printer(keycode, record) &&
282 #ifdef AUTO_SHIFT_ENABLE
283 process_auto_shift(keycode, record) &&
285 #ifdef UNICODEMAP_ENABLE
286 process_unicode_map(keycode, record) &&
288 #ifdef TERMINAL_ENABLE
289 process_terminal(keycode, record) &&
295 // Shift / paren setup
299 if (record->event.pressed) {
304 if (record->event.pressed) {
306 print("DEBUG: enabled.\n");
310 if (record->event.pressed) {
314 #ifdef FAUXCLICKY_ENABLE
316 if (record->event.pressed) {
321 if (record->event.pressed) {
326 if (record->event.pressed) {
331 #if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
333 // Split keyboards need to trigger on key-up for edge-case issue
334 #ifndef SPLIT_KEYBOARD
335 if (record->event.pressed) {
337 if (!record->event.pressed) {
340 #ifdef SPLIT_KEYBOARD
345 case RGB_MODE_FORWARD:
346 if (record->event.pressed) {
347 uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT));
349 rgblight_step_reverse();
354 #ifdef SPLIT_KEYBOARD
359 case RGB_MODE_REVERSE:
360 if (record->event.pressed) {
361 uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT));
366 rgblight_step_reverse();
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_increase_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_decrease_hue();
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_increase_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_decrease_sat();
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_increase_val();
433 #ifdef SPLIT_KEYBOARD
439 // Split keyboards need to trigger on key-up for edge-case issue
440 #ifndef SPLIT_KEYBOARD
441 if (record->event.pressed) {
443 if (!record->event.pressed) {
445 rgblight_decrease_val();
446 #ifdef SPLIT_KEYBOARD
452 if (record->event.pressed) {
453 rgblight_increase_speed();
457 if (record->event.pressed) {
458 rgblight_decrease_speed();
462 if (record->event.pressed) {
463 rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT);
464 #ifdef SPLIT_KEYBOARD
469 case RGB_MODE_BREATHE:
470 #ifdef RGBLIGHT_EFFECT_BREATHING
471 if (record->event.pressed) {
472 if ((RGBLIGHT_MODE_BREATHING <= rgblight_get_mode()) &&
473 (rgblight_get_mode() < RGBLIGHT_MODE_BREATHING_end)) {
476 rgblight_mode(RGBLIGHT_MODE_BREATHING);
481 case RGB_MODE_RAINBOW:
482 #ifdef RGBLIGHT_EFFECT_RAINBOW_MOOD
483 if (record->event.pressed) {
484 if ((RGBLIGHT_MODE_RAINBOW_MOOD <= rgblight_get_mode()) &&
485 (rgblight_get_mode() < RGBLIGHT_MODE_RAINBOW_MOOD_end)) {
488 rgblight_mode(RGBLIGHT_MODE_RAINBOW_MOOD);
494 #ifdef RGBLIGHT_EFFECT_RAINBOW_SWIRL
495 if (record->event.pressed) {
496 if ((RGBLIGHT_MODE_RAINBOW_SWIRL <= rgblight_get_mode()) &&
497 (rgblight_get_mode() < RGBLIGHT_MODE_RAINBOW_SWIRL_end)) {
500 rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL);
506 #ifdef RGBLIGHT_EFFECT_SNAKE
507 if (record->event.pressed) {
508 if ((RGBLIGHT_MODE_SNAKE <= rgblight_get_mode()) &&
509 (rgblight_get_mode() < RGBLIGHT_MODE_SNAKE_end)) {
512 rgblight_mode(RGBLIGHT_MODE_SNAKE);
517 case RGB_MODE_KNIGHT:
518 #ifdef RGBLIGHT_EFFECT_KNIGHT
519 if (record->event.pressed) {
520 if ((RGBLIGHT_MODE_KNIGHT <= rgblight_get_mode()) &&
521 (rgblight_get_mode() < RGBLIGHT_MODE_KNIGHT_end)) {
524 rgblight_mode(RGBLIGHT_MODE_KNIGHT);
530 #ifdef RGBLIGHT_EFFECT_CHRISTMAS
531 if (record->event.pressed) {
532 rgblight_mode(RGBLIGHT_MODE_CHRISTMAS);
536 case RGB_MODE_GRADIENT:
537 #ifdef RGBLIGHT_EFFECT_STATIC_GRADIENT
538 if (record->event.pressed) {
539 if ((RGBLIGHT_MODE_STATIC_GRADIENT <= rgblight_get_mode()) &&
540 (rgblight_get_mode() < RGBLIGHT_MODE_STATIC_GRADIENT_end)) {
543 rgblight_mode(RGBLIGHT_MODE_STATIC_GRADIENT);
548 case RGB_MODE_RGBTEST:
549 #ifdef RGBLIGHT_EFFECT_RGB_TEST
550 if (record->event.pressed) {
551 rgblight_mode(RGBLIGHT_MODE_RGB_TEST);
555 #endif // defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
558 if (record->event.pressed) {
559 set_output(OUTPUT_AUTO);
563 if (record->event.pressed) {
564 set_output(OUTPUT_USB);
567 #ifdef BLUETOOTH_ENABLE
569 if (record->event.pressed) {
570 set_output(OUTPUT_BLUETOOTH);
575 case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_TOGGLE_NKRO:
576 if (record->event.pressed) {
577 // MAGIC actions (BOOTMAGIC without the boot)
578 if (!eeconfig_is_enabled()) {
582 keymap_config.raw = eeconfig_read_keymap();
585 case MAGIC_SWAP_CONTROL_CAPSLOCK:
586 keymap_config.swap_control_capslock = true;
588 case MAGIC_CAPSLOCK_TO_CONTROL:
589 keymap_config.capslock_to_control = true;
591 case MAGIC_SWAP_LALT_LGUI:
592 keymap_config.swap_lalt_lgui = true;
594 case MAGIC_SWAP_RALT_RGUI:
595 keymap_config.swap_ralt_rgui = true;
598 keymap_config.no_gui = true;
600 case MAGIC_SWAP_GRAVE_ESC:
601 keymap_config.swap_grave_esc = true;
603 case MAGIC_SWAP_BACKSLASH_BACKSPACE:
604 keymap_config.swap_backslash_backspace = true;
606 case MAGIC_HOST_NKRO:
607 keymap_config.nkro = true;
609 case MAGIC_SWAP_ALT_GUI:
610 keymap_config.swap_lalt_lgui = true;
611 keymap_config.swap_ralt_rgui = true;
613 PLAY_SONG(ag_swap_song);
616 case MAGIC_UNSWAP_CONTROL_CAPSLOCK:
617 keymap_config.swap_control_capslock = false;
619 case MAGIC_UNCAPSLOCK_TO_CONTROL:
620 keymap_config.capslock_to_control = false;
622 case MAGIC_UNSWAP_LALT_LGUI:
623 keymap_config.swap_lalt_lgui = false;
625 case MAGIC_UNSWAP_RALT_RGUI:
626 keymap_config.swap_ralt_rgui = false;
629 keymap_config.no_gui = false;
631 case MAGIC_UNSWAP_GRAVE_ESC:
632 keymap_config.swap_grave_esc = false;
634 case MAGIC_UNSWAP_BACKSLASH_BACKSPACE:
635 keymap_config.swap_backslash_backspace = false;
637 case MAGIC_UNHOST_NKRO:
638 keymap_config.nkro = false;
640 case MAGIC_UNSWAP_ALT_GUI:
641 keymap_config.swap_lalt_lgui = false;
642 keymap_config.swap_ralt_rgui = false;
644 PLAY_SONG(ag_norm_song);
647 case MAGIC_TOGGLE_ALT_GUI:
648 keymap_config.swap_lalt_lgui = !keymap_config.swap_lalt_lgui;
649 keymap_config.swap_ralt_rgui = !keymap_config.swap_ralt_rgui;
651 if (keymap_config.swap_ralt_rgui) {
652 PLAY_SONG(ag_swap_song);
654 PLAY_SONG(ag_norm_song);
658 case MAGIC_TOGGLE_NKRO:
659 keymap_config.nkro = !keymap_config.nkro;
664 eeconfig_update_keymap(keymap_config.raw);
665 clear_keyboard(); // clear to prevent stuck keys
671 if (record->event.pressed) {
672 shift_interrupted[0] = false;
673 scs_timer[0] = timer_read ();
674 register_mods(MOD_BIT(KC_LSFT));
677 #ifdef DISABLE_SPACE_CADET_ROLLOVER
678 if (get_mods() & MOD_BIT(KC_RSFT)) {
679 shift_interrupted[0] = true;
680 shift_interrupted[1] = true;
683 if (!shift_interrupted[0] && timer_elapsed(scs_timer[0]) < TAPPING_TERM) {
684 register_code(LSPO_KEY);
685 unregister_code(LSPO_KEY);
687 unregister_mods(MOD_BIT(KC_LSFT));
693 if (record->event.pressed) {
694 shift_interrupted[1] = false;
695 scs_timer[1] = timer_read ();
696 register_mods(MOD_BIT(KC_RSFT));
699 #ifdef DISABLE_SPACE_CADET_ROLLOVER
700 if (get_mods() & MOD_BIT(KC_LSFT)) {
701 shift_interrupted[0] = true;
702 shift_interrupted[1] = true;
705 if (!shift_interrupted[1] && timer_elapsed(scs_timer[1]) < TAPPING_TERM) {
706 register_code(RSPC_KEY);
707 unregister_code(RSPC_KEY);
709 unregister_mods(MOD_BIT(KC_RSFT));
715 if (record->event.pressed) {
716 shift_interrupted[1] = false;
717 scs_timer[1] = timer_read ();
718 register_mods(MOD_BIT(KC_RSFT));
720 else if (!shift_interrupted[1] && timer_elapsed(scs_timer[1]) < TAPPING_TERM) {
721 unregister_mods(MOD_BIT(KC_RSFT));
722 register_code(SFTENT_KEY);
723 unregister_code(SFTENT_KEY);
726 unregister_mods(MOD_BIT(KC_RSFT));
732 uint8_t shifted = get_mods() & ((MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)
733 |MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)));
735 #ifdef GRAVE_ESC_ALT_OVERRIDE
736 // if ALT is pressed, ESC is always sent
737 // this is handy for the cmd+opt+esc shortcut on macOS, among other things.
738 if (get_mods() & (MOD_BIT(KC_LALT) | MOD_BIT(KC_RALT))) {
743 #ifdef GRAVE_ESC_CTRL_OVERRIDE
744 // if CTRL is pressed, ESC is always sent
745 // this is handy for the ctrl+shift+esc shortcut on windows, among other things.
746 if (get_mods() & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL))) {
751 #ifdef GRAVE_ESC_GUI_OVERRIDE
752 // if GUI is pressed, ESC is always sent
753 if (get_mods() & (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI))) {
758 #ifdef GRAVE_ESC_SHIFT_OVERRIDE
759 // if SHIFT is pressed, ESC is always sent
760 if (get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
765 if (record->event.pressed) {
766 grave_esc_was_shifted = shifted;
767 add_key(shifted ? KC_GRAVE : KC_ESCAPE);
770 del_key(grave_esc_was_shifted ? KC_GRAVE : KC_ESCAPE);
773 send_keyboard_report();
777 #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_BREATHING)
779 if (record->event.pressed)
786 shift_interrupted[0] = true;
787 shift_interrupted[1] = true;
792 return process_action_kb(record);
795 __attribute__ ((weak))
796 const bool ascii_to_shift_lut[0x80] PROGMEM = {
797 0, 0, 0, 0, 0, 0, 0, 0,
798 0, 0, 0, 0, 0, 0, 0, 0,
799 0, 0, 0, 0, 0, 0, 0, 0,
800 0, 0, 0, 0, 0, 0, 0, 0,
801 0, 1, 1, 1, 1, 1, 1, 0,
802 1, 1, 1, 1, 0, 0, 0, 0,
803 0, 0, 0, 0, 0, 0, 0, 0,
804 0, 0, 1, 0, 1, 0, 1, 1,
805 1, 1, 1, 1, 1, 1, 1, 1,
806 1, 1, 1, 1, 1, 1, 1, 1,
807 1, 1, 1, 1, 1, 1, 1, 1,
808 1, 1, 1, 0, 0, 0, 1, 1,
809 0, 0, 0, 0, 0, 0, 0, 0,
810 0, 0, 0, 0, 0, 0, 0, 0,
811 0, 0, 0, 0, 0, 0, 0, 0,
812 0, 0, 0, 1, 1, 1, 1, 0
815 __attribute__ ((weak))
816 const uint8_t ascii_to_keycode_lut[0x80] PROGMEM = {
817 0, 0, 0, 0, 0, 0, 0, 0,
818 KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0,
819 0, 0, 0, 0, 0, 0, 0, 0,
820 0, 0, 0, KC_ESC, 0, 0, 0, 0,
821 KC_SPC, KC_1, KC_QUOT, KC_3, KC_4, KC_5, KC_7, KC_QUOT,
822 KC_9, KC_0, KC_8, KC_EQL, KC_COMM, KC_MINS, KC_DOT, KC_SLSH,
823 KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
824 KC_8, KC_9, KC_SCLN, KC_SCLN, KC_COMM, KC_EQL, KC_DOT, KC_SLSH,
825 KC_2, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
826 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
827 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
828 KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_6, KC_MINS,
829 KC_GRV, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
830 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
831 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
832 KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL
835 void send_string(const char *str) {
836 send_string_with_delay(str, 0);
839 void send_string_P(const char *str) {
840 send_string_with_delay_P(str, 0);
843 void send_string_with_delay(const char *str, uint8_t interval) {
845 char ascii_code = *str;
846 if (!ascii_code) break;
847 if (ascii_code == 1) {
849 uint8_t keycode = *(++str);
850 register_code(keycode);
851 unregister_code(keycode);
852 } else if (ascii_code == 2) {
854 uint8_t keycode = *(++str);
855 register_code(keycode);
856 } else if (ascii_code == 3) {
858 uint8_t keycode = *(++str);
859 unregister_code(keycode);
861 send_char(ascii_code);
865 { uint8_t ms = interval; while (ms--) wait_ms(1); }
869 void send_string_with_delay_P(const char *str, uint8_t interval) {
871 char ascii_code = pgm_read_byte(str);
872 if (!ascii_code) break;
873 if (ascii_code == 1) {
875 uint8_t keycode = pgm_read_byte(++str);
876 register_code(keycode);
877 unregister_code(keycode);
878 } else if (ascii_code == 2) {
880 uint8_t keycode = pgm_read_byte(++str);
881 register_code(keycode);
882 } else if (ascii_code == 3) {
884 uint8_t keycode = pgm_read_byte(++str);
885 unregister_code(keycode);
887 send_char(ascii_code);
891 { uint8_t ms = interval; while (ms--) wait_ms(1); }
895 void send_char(char ascii_code) {
897 keycode = pgm_read_byte(&ascii_to_keycode_lut[(uint8_t)ascii_code]);
898 if (pgm_read_byte(&ascii_to_shift_lut[(uint8_t)ascii_code])) {
899 register_code(KC_LSFT);
900 register_code(keycode);
901 unregister_code(keycode);
902 unregister_code(KC_LSFT);
904 register_code(keycode);
905 unregister_code(keycode);
909 void set_single_persistent_default_layer(uint8_t default_layer) {
910 #if defined(AUDIO_ENABLE) && defined(DEFAULT_LAYER_SONGS)
911 PLAY_SONG(default_layer_songs[default_layer]);
913 eeconfig_update_default_layer(1U<<default_layer);
914 default_layer_set(1U<<default_layer);
917 uint32_t update_tri_layer_state(uint32_t state, uint8_t layer1, uint8_t layer2, uint8_t layer3) {
918 uint32_t mask12 = (1UL << layer1) | (1UL << layer2);
919 uint32_t mask3 = 1UL << layer3;
920 return (state & mask12) == mask12 ? (state | mask3) : (state & ~mask3);
923 void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
924 layer_state_set(update_tri_layer_state(layer_state, layer1, layer2, layer3));
927 void tap_random_base64(void) {
928 #if defined(__AVR_ATmega32U4__)
929 uint8_t key = (TCNT0 + TCNT1 + TCNT3 + TCNT4) % 64;
931 uint8_t key = rand() % 64;
935 register_code(KC_LSFT);
936 register_code(key + KC_A);
937 unregister_code(key + KC_A);
938 unregister_code(KC_LSFT);
941 register_code(key - 26 + KC_A);
942 unregister_code(key - 26 + KC_A);
946 unregister_code(KC_0);
949 register_code(key - 53 + KC_1);
950 unregister_code(key - 53 + KC_1);
953 register_code(KC_LSFT);
954 register_code(KC_EQL);
955 unregister_code(KC_EQL);
956 unregister_code(KC_LSFT);
959 register_code(KC_SLSH);
960 unregister_code(KC_SLSH);
965 __attribute__((weak))
966 void bootmagic_lite(void) {
967 // The lite version of TMK's bootmagic based on Wilba.
968 // 100% less potential for accidentally making the
969 // keyboard do stupid things.
971 // We need multiple scans because debouncing can't be turned off.
973 #if defined(DEBOUNCING_DELAY) && DEBOUNCING_DELAY > 0
974 wait_ms(DEBOUNCING_DELAY * 2);
975 #elif defined(DEBOUNCE) && DEBOUNCE > 0
976 wait_ms(DEBOUNCE * 2);
982 // If the Esc and space bar are held down on power up,
983 // reset the EEPROM valid state and jump to bootloader.
984 // Assumes Esc is at [0,0].
985 // This isn't very generalized, but we need something that doesn't
986 // rely on user's keymaps in firmware or EEPROM.
987 if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) {
989 // Jump to bootloader.
994 void matrix_init_quantum() {
995 #ifdef BOOTMAGIC_LITE
998 if (!eeconfig_is_enabled()) {
1001 #ifdef BACKLIGHT_ENABLE
1002 backlight_init_ports();
1007 #ifdef RGB_MATRIX_ENABLE
1010 #ifdef ENCODER_ENABLE
1016 uint8_t rgb_matrix_task_counter = 0;
1018 #ifndef RGB_MATRIX_SKIP_FRAMES
1019 #define RGB_MATRIX_SKIP_FRAMES 1
1022 void matrix_scan_quantum() {
1023 #if defined(AUDIO_ENABLE) && !defined(NO_MUSIC_MODE)
1024 matrix_scan_music();
1027 #ifdef TAP_DANCE_ENABLE
1028 matrix_scan_tap_dance();
1032 matrix_scan_combo();
1035 #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_PIN)
1039 #ifdef RGB_MATRIX_ENABLE
1041 if (rgb_matrix_task_counter == 0) {
1042 rgb_matrix_update_pwm_buffers();
1044 rgb_matrix_task_counter = ((rgb_matrix_task_counter + 1) % (RGB_MATRIX_SKIP_FRAMES + 1));
1047 #ifdef ENCODER_ENABLE
1053 #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_PIN)
1055 static const uint8_t backlight_pin = BACKLIGHT_PIN;
1057 // depending on the pin, we use a different output compare unit
1058 #if BACKLIGHT_PIN == B7
1059 # define TCCRxA TCCR1A
1060 # define TCCRxB TCCR1B
1061 # define COMxx1 COM1C1
1062 # define OCRxx OCR1C
1064 #elif BACKLIGHT_PIN == B6
1065 # define TCCRxA TCCR1A
1066 # define TCCRxB TCCR1B
1067 # define COMxx1 COM1B1
1068 # define OCRxx OCR1B
1070 #elif BACKLIGHT_PIN == B5
1071 # define TCCRxA TCCR1A
1072 # define TCCRxB TCCR1B
1073 # define COMxx1 COM1A1
1074 # define OCRxx OCR1A
1076 #elif BACKLIGHT_PIN == C6
1077 # define TCCRxA TCCR3A
1078 # define TCCRxB TCCR3B
1079 # define COMxx1 COM1A1
1080 # define OCRxx OCR3A
1083 # define NO_HARDWARE_PWM
1086 #ifndef BACKLIGHT_ON_STATE
1087 #define BACKLIGHT_ON_STATE 0
1090 #ifdef NO_HARDWARE_PWM // pwm through software
1092 __attribute__ ((weak))
1093 void backlight_init_ports(void)
1095 // Setup backlight pin as output and output to on state.
1097 _SFR_IO8((backlight_pin >> 4) + 1) |= _BV(backlight_pin & 0xF);
1098 #if BACKLIGHT_ON_STATE == 0
1100 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
1103 _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
1107 __attribute__ ((weak))
1108 void backlight_set(uint8_t level) {}
1110 uint8_t backlight_tick = 0;
1112 #ifndef BACKLIGHT_CUSTOM_DRIVER
1113 void backlight_task(void) {
1114 if ((0xFFFF >> ((BACKLIGHT_LEVELS - get_backlight_level()) * ((BACKLIGHT_LEVELS + 1) / 2))) & (1 << backlight_tick)) {
1115 #if BACKLIGHT_ON_STATE == 0
1117 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
1120 _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
1123 #if BACKLIGHT_ON_STATE == 0
1125 _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
1128 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
1131 backlight_tick = (backlight_tick + 1) % 16;
1135 #ifdef BACKLIGHT_BREATHING
1136 #ifndef BACKLIGHT_CUSTOM_DRIVER
1137 #error "Backlight breathing only available with hardware PWM. Please disable."
1141 #else // pwm through timer
1143 #define TIMER_TOP 0xFFFFU
1145 // See http://jared.geek.nz/2013/feb/linear-led-pwm
1146 static uint16_t cie_lightness(uint16_t v) {
1147 if (v <= 5243) // if below 8% of max
1148 return v / 9; // same as dividing by 900%
1150 uint32_t y = (((uint32_t) v + 10486) << 8) / (10486 + 0xFFFFUL); // add 16% of max and compare
1151 // to get a useful result with integer division, we shift left in the expression above
1152 // and revert what we've done again after squaring.
1154 if (y > 0xFFFFUL) // prevent overflow
1157 return (uint16_t) y;
1161 // range for val is [0..TIMER_TOP]. PWM pin is high while the timer count is below val.
1162 static inline void set_pwm(uint16_t val) {
1166 #ifndef BACKLIGHT_CUSTOM_DRIVER
1167 __attribute__ ((weak))
1168 void backlight_set(uint8_t level) {
1169 if (level > BACKLIGHT_LEVELS)
1170 level = BACKLIGHT_LEVELS;
1173 // Turn off PWM control on backlight pin
1174 TCCRxA &= ~(_BV(COMxx1));
1176 // Turn on PWM control of backlight pin
1177 TCCRxA |= _BV(COMxx1);
1179 // Set the brightness
1180 set_pwm(cie_lightness(TIMER_TOP * (uint32_t)level / BACKLIGHT_LEVELS));
1183 void backlight_task(void) {}
1184 #endif // BACKLIGHT_CUSTOM_DRIVER
1186 #ifdef BACKLIGHT_BREATHING
1188 #define BREATHING_NO_HALT 0
1189 #define BREATHING_HALT_OFF 1
1190 #define BREATHING_HALT_ON 2
1191 #define BREATHING_STEPS 128
1193 static uint8_t breathing_period = BREATHING_PERIOD;
1194 static uint8_t breathing_halt = BREATHING_NO_HALT;
1195 static uint16_t breathing_counter = 0;
1197 bool is_breathing(void) {
1198 return !!(TIMSK1 & _BV(TOIE1));
1201 #define breathing_interrupt_enable() do {TIMSK1 |= _BV(TOIE1);} while (0)
1202 #define breathing_interrupt_disable() do {TIMSK1 &= ~_BV(TOIE1);} while (0)
1203 #define breathing_min() do {breathing_counter = 0;} while (0)
1204 #define breathing_max() do {breathing_counter = breathing_period * 244 / 2;} while (0)
1206 void breathing_enable(void)
1208 breathing_counter = 0;
1209 breathing_halt = BREATHING_NO_HALT;
1210 breathing_interrupt_enable();
1213 void breathing_pulse(void)
1215 if (get_backlight_level() == 0)
1219 breathing_halt = BREATHING_HALT_ON;
1220 breathing_interrupt_enable();
1223 void breathing_disable(void)
1225 breathing_interrupt_disable();
1226 // Restore backlight level
1227 backlight_set(get_backlight_level());
1230 void breathing_self_disable(void)
1232 if (get_backlight_level() == 0)
1233 breathing_halt = BREATHING_HALT_OFF;
1235 breathing_halt = BREATHING_HALT_ON;
1238 void breathing_toggle(void) {
1240 breathing_disable();
1245 void breathing_period_set(uint8_t value)
1249 breathing_period = value;
1252 void breathing_period_default(void) {
1253 breathing_period_set(BREATHING_PERIOD);
1256 void breathing_period_inc(void)
1258 breathing_period_set(breathing_period+1);
1261 void breathing_period_dec(void)
1263 breathing_period_set(breathing_period-1);
1266 /* To generate breathing curve in python:
1267 * from math import sin, pi; [int(sin(x/128.0*pi)**4*255) for x in range(128)]
1269 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};
1271 // Use this before the cie_lightness function.
1272 static inline uint16_t scale_backlight(uint16_t v) {
1273 return v / BACKLIGHT_LEVELS * get_backlight_level();
1276 /* Assuming a 16MHz CPU clock and a timer that resets at 64k (ICR1), the following interrupt handler will run
1277 * about 244 times per second.
1279 ISR(TIMER1_OVF_vect)
1281 uint16_t interval = (uint16_t) breathing_period * 244 / BREATHING_STEPS;
1282 // resetting after one period to prevent ugly reset at overflow.
1283 breathing_counter = (breathing_counter + 1) % (breathing_period * 244);
1284 uint8_t index = breathing_counter / interval % BREATHING_STEPS;
1286 if (((breathing_halt == BREATHING_HALT_ON) && (index == BREATHING_STEPS / 2)) ||
1287 ((breathing_halt == BREATHING_HALT_OFF) && (index == BREATHING_STEPS - 1)))
1289 breathing_interrupt_disable();
1292 set_pwm(cie_lightness(scale_backlight((uint16_t) pgm_read_byte(&breathing_table[index]) * 0x0101U)));
1295 #endif // BACKLIGHT_BREATHING
1297 __attribute__ ((weak))
1298 void backlight_init_ports(void)
1300 // Setup backlight pin as output and output to on state.
1302 _SFR_IO8((backlight_pin >> 4) + 1) |= _BV(backlight_pin & 0xF);
1303 #if BACKLIGHT_ON_STATE == 0
1305 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
1308 _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
1310 // I could write a wall of text here to explain... but TL;DW
1311 // Go read the ATmega32u4 datasheet.
1312 // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on
1314 // Pin PB7 = OCR1C (Timer 1, Channel C)
1315 // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0
1316 // (i.e. start high, go low when counter matches.)
1317 // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0
1318 // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1
1322 "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 [..]."
1323 "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)."
1325 TCCRxA = _BV(COMxx1) | _BV(WGM11); // = 0b00001010;
1326 TCCRxB = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
1327 // Use full 16-bit resolution. Counter counts to ICR1 before reset to 0.
1331 #ifdef BACKLIGHT_BREATHING
1336 #endif // NO_HARDWARE_PWM
1340 __attribute__ ((weak))
1341 void backlight_init_ports(void) {}
1343 __attribute__ ((weak))
1344 void backlight_set(uint8_t level) {}
1348 #ifdef HD44780_ENABLED
1349 #include "hd44780.h"
1353 // Functions for spitting out values
1356 void send_dword(uint32_t number) { // this might not actually work
1357 uint16_t word = (number >> 16);
1359 send_word(number & 0xFFFFUL);
1362 void send_word(uint16_t number) {
1363 uint8_t byte = number >> 8;
1365 send_byte(number & 0xFF);
1368 void send_byte(uint8_t number) {
1369 uint8_t nibble = number >> 4;
1370 send_nibble(nibble);
1371 send_nibble(number & 0xF);
1374 void send_nibble(uint8_t number) {
1377 register_code(KC_0);
1378 unregister_code(KC_0);
1381 register_code(KC_1 + (number - 1));
1382 unregister_code(KC_1 + (number - 1));
1385 register_code(KC_A + (number - 0xA));
1386 unregister_code(KC_A + (number - 0xA));
1392 __attribute__((weak))
1393 uint16_t hex_to_keycode(uint8_t hex)
1398 } else if (hex < 0xA) {
1399 return KC_1 + (hex - 0x1);
1401 return KC_A + (hex - 0xA);
1405 void api_send_unicode(uint32_t unicode) {
1408 dword_to_bytes(unicode, chunk);
1409 MT_SEND_DATA(DT_UNICODE, chunk, 5);
1413 __attribute__ ((weak))
1414 void led_set_user(uint8_t usb_led) {
1418 __attribute__ ((weak))
1419 void led_set_kb(uint8_t usb_led) {
1420 led_set_user(usb_led);
1423 __attribute__ ((weak))
1424 void led_init_ports(void)
1429 __attribute__ ((weak))
1430 void led_set(uint8_t usb_led)
1435 // // Using PE6 Caps Lock LED
1436 // if (usb_led & (1<<USB_LED_CAPS_LOCK))
1446 // PORTE &= ~(1<<6);
1449 led_set_kb(usb_led);
1453 //------------------------------------------------------------------------------
1454 // Override these functions in your keymap file to play different tunes on
1455 // different events such as startup and bootloader jump
1457 __attribute__ ((weak))
1458 void startup_user() {}
1460 __attribute__ ((weak))
1461 void shutdown_user() {}
1463 //------------------------------------------------------------------------------