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"
47 #define GOODBYE_SONG SONG(GOODBYE_SOUND)
50 #define AG_NORM_SONG SONG(AG_NORM_SOUND)
53 #define AG_SWAP_SONG SONG(AG_SWAP_SOUND)
55 float goodbye_song[][2] = GOODBYE_SONG;
56 float ag_norm_song[][2] = AG_NORM_SONG;
57 float ag_swap_song[][2] = AG_SWAP_SONG;
58 #ifdef DEFAULT_LAYER_SONGS
59 float default_layer_songs[][16][2] = DEFAULT_LAYER_SONGS;
63 static void do_code16 (uint16_t code, void (*f) (uint8_t)) {
65 case QK_MODS ... QK_MODS_MAX:
80 if (code < QK_RMODS_MIN) return;
92 static inline void qk_register_weak_mods(uint8_t kc) {
93 add_weak_mods(MOD_BIT(kc));
94 send_keyboard_report();
97 static inline void qk_unregister_weak_mods(uint8_t kc) {
98 del_weak_mods(MOD_BIT(kc));
99 send_keyboard_report();
102 static inline void qk_register_mods(uint8_t kc) {
103 add_weak_mods(MOD_BIT(kc));
104 send_keyboard_report();
107 static inline void qk_unregister_mods(uint8_t kc) {
108 del_weak_mods(MOD_BIT(kc));
109 send_keyboard_report();
112 void register_code16 (uint16_t code) {
113 if (IS_MOD(code) || code == KC_NO) {
114 do_code16 (code, qk_register_mods);
116 do_code16 (code, qk_register_weak_mods);
118 register_code (code);
121 void unregister_code16 (uint16_t code) {
122 unregister_code (code);
123 if (IS_MOD(code) || code == KC_NO) {
124 do_code16 (code, qk_unregister_mods);
126 do_code16 (code, qk_unregister_weak_mods);
130 __attribute__ ((weak))
131 bool process_action_kb(keyrecord_t *record) {
135 __attribute__ ((weak))
136 bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
137 return process_record_user(keycode, record);
140 __attribute__ ((weak))
141 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
145 void reset_keyboard(void) {
147 #if defined(MIDI_ENABLE) && defined(MIDI_BASIC)
148 process_midi_all_notes_off();
151 #ifndef NO_MUSIC_MODE
152 music_all_notes_off();
154 uint16_t timer_start = timer_read();
155 PLAY_SONG(goodbye_song);
157 while(timer_elapsed(timer_start) < 250)
163 // this is also done later in bootloader.c - not sure if it's neccesary here
164 #ifdef BOOTLOADER_CATERINA
165 *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific
170 // Shift / paren setup
173 #define LSPO_KEY KC_9
176 #define RSPC_KEY KC_0
179 // Shift / Enter setup
181 #define SFTENT_KEY KC_ENT
184 static bool shift_interrupted[2] = {0, 0};
185 static uint16_t scs_timer[2] = {0, 0};
187 /* true if the last press of GRAVE_ESC was shifted (i.e. GUI or SHIFT were pressed), false otherwise.
188 * Used to ensure that the correct keycode is released if the key is released.
190 static bool grave_esc_was_shifted = false;
192 bool process_record_quantum(keyrecord_t *record) {
194 /* This gets the keycode from the key pressed */
195 keypos_t key = record->event.key;
198 #if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
199 /* TODO: Use store_or_get_action() or a similar function. */
200 if (!disable_action_cache) {
203 if (record->event.pressed) {
204 layer = layer_switch_get_layer(key);
205 update_source_layers_cache(key, layer);
207 layer = read_source_layers_cache(key);
209 keycode = keymap_key_to_keycode(layer, key);
212 keycode = keymap_key_to_keycode(layer_switch_get_layer(key), key);
214 // This is how you use actions here
215 // if (keycode == KC_LEAD) {
217 // action.code = ACTION_DEFAULT_LAYER_SET(0);
218 // process_action(record, action);
222 #ifdef TAP_DANCE_ENABLE
223 preprocess_tap_dance(keycode, record);
227 #if defined(KEY_LOCK_ENABLE)
228 // Must run first to be able to mask key_up events.
229 process_key_lock(&keycode, record) &&
231 #if defined(AUDIO_ENABLE) && defined(AUDIO_CLICKY)
232 process_clicky(keycode, record) &&
233 #endif //AUDIO_CLICKY
234 process_record_kb(keycode, record) &&
235 #if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_KEYPRESSES)
236 process_rgb_matrix(keycode, record) &&
238 #if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED)
239 process_midi(keycode, record) &&
242 process_audio(keycode, record) &&
245 process_steno(keycode, record) &&
247 #if ( defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC))) && !defined(NO_MUSIC_MODE)
248 process_music(keycode, record) &&
250 #ifdef TAP_DANCE_ENABLE
251 process_tap_dance(keycode, record) &&
253 #ifndef DISABLE_LEADER
254 process_leader(keycode, record) &&
256 #ifndef DISABLE_CHORDING
257 process_chording(keycode, record) &&
260 process_combo(keycode, record) &&
262 #ifdef UNICODE_ENABLE
263 process_unicode(keycode, record) &&
266 process_ucis(keycode, record) &&
268 #ifdef PRINTING_ENABLE
269 process_printer(keycode, record) &&
271 #ifdef AUTO_SHIFT_ENABLE
272 process_auto_shift(keycode, record) &&
274 #ifdef UNICODEMAP_ENABLE
275 process_unicode_map(keycode, record) &&
277 #ifdef TERMINAL_ENABLE
278 process_terminal(keycode, record) &&
284 // Shift / paren setup
288 if (record->event.pressed) {
293 if (record->event.pressed) {
295 print("DEBUG: enabled.\n");
298 #ifdef FAUXCLICKY_ENABLE
300 if (record->event.pressed) {
305 if (record->event.pressed) {
310 if (record->event.pressed) {
315 #if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
317 // Split keyboards need to trigger on key-up for edge-case issue
318 #ifndef SPLIT_KEYBOARD
319 if (record->event.pressed) {
321 if (!record->event.pressed) {
324 #ifdef SPLIT_KEYBOARD
329 case RGB_MODE_FORWARD:
330 if (record->event.pressed) {
331 uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT));
333 rgblight_step_reverse();
338 #ifdef SPLIT_KEYBOARD
343 case RGB_MODE_REVERSE:
344 if (record->event.pressed) {
345 uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT));
350 rgblight_step_reverse();
352 #ifdef SPLIT_KEYBOARD
358 // Split keyboards need to trigger on key-up for edge-case issue
359 #ifndef SPLIT_KEYBOARD
360 if (record->event.pressed) {
362 if (!record->event.pressed) {
364 rgblight_increase_hue();
365 #ifdef SPLIT_KEYBOARD
371 // Split keyboards need to trigger on key-up for edge-case issue
372 #ifndef SPLIT_KEYBOARD
373 if (record->event.pressed) {
375 if (!record->event.pressed) {
377 rgblight_decrease_hue();
378 #ifdef SPLIT_KEYBOARD
384 // Split keyboards need to trigger on key-up for edge-case issue
385 #ifndef SPLIT_KEYBOARD
386 if (record->event.pressed) {
388 if (!record->event.pressed) {
390 rgblight_increase_sat();
391 #ifdef SPLIT_KEYBOARD
397 // Split keyboards need to trigger on key-up for edge-case issue
398 #ifndef SPLIT_KEYBOARD
399 if (record->event.pressed) {
401 if (!record->event.pressed) {
403 rgblight_decrease_sat();
404 #ifdef SPLIT_KEYBOARD
410 // Split keyboards need to trigger on key-up for edge-case issue
411 #ifndef SPLIT_KEYBOARD
412 if (record->event.pressed) {
414 if (!record->event.pressed) {
416 rgblight_increase_val();
417 #ifdef SPLIT_KEYBOARD
423 // Split keyboards need to trigger on key-up for edge-case issue
424 #ifndef SPLIT_KEYBOARD
425 if (record->event.pressed) {
427 if (!record->event.pressed) {
429 rgblight_decrease_val();
430 #ifdef SPLIT_KEYBOARD
436 if (record->event.pressed) {
437 rgblight_increase_speed();
441 if (record->event.pressed) {
442 rgblight_decrease_speed();
446 if (record->event.pressed) {
448 #ifdef SPLIT_KEYBOARD
453 case RGB_MODE_BREATHE:
454 if (record->event.pressed) {
455 if ((2 <= rgblight_get_mode()) && (rgblight_get_mode() < 5)) {
462 case RGB_MODE_RAINBOW:
463 if (record->event.pressed) {
464 if ((6 <= rgblight_get_mode()) && (rgblight_get_mode() < 8)) {
472 if (record->event.pressed) {
473 if ((9 <= rgblight_get_mode()) && (rgblight_get_mode() < 14)) {
481 if (record->event.pressed) {
482 if ((15 <= rgblight_get_mode()) && (rgblight_get_mode() < 20)) {
489 case RGB_MODE_KNIGHT:
490 if (record->event.pressed) {
491 if ((21 <= rgblight_get_mode()) && (rgblight_get_mode() < 23)) {
499 if (record->event.pressed) {
503 case RGB_MODE_GRADIENT:
504 if (record->event.pressed) {
505 if ((25 <= rgblight_get_mode()) && (rgblight_get_mode() < 34)) {
512 case RGB_MODE_RGBTEST:
513 if (record->event.pressed) {
517 #endif // defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
520 if (record->event.pressed) {
521 set_output(OUTPUT_AUTO);
525 if (record->event.pressed) {
526 set_output(OUTPUT_USB);
529 #ifdef BLUETOOTH_ENABLE
531 if (record->event.pressed) {
532 set_output(OUTPUT_BLUETOOTH);
537 case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_TOGGLE_NKRO:
538 if (record->event.pressed) {
539 // MAGIC actions (BOOTMAGIC without the boot)
540 if (!eeconfig_is_enabled()) {
544 keymap_config.raw = eeconfig_read_keymap();
547 case MAGIC_SWAP_CONTROL_CAPSLOCK:
548 keymap_config.swap_control_capslock = true;
550 case MAGIC_CAPSLOCK_TO_CONTROL:
551 keymap_config.capslock_to_control = true;
553 case MAGIC_SWAP_LALT_LGUI:
554 keymap_config.swap_lalt_lgui = true;
556 case MAGIC_SWAP_RALT_RGUI:
557 keymap_config.swap_ralt_rgui = true;
560 keymap_config.no_gui = true;
562 case MAGIC_SWAP_GRAVE_ESC:
563 keymap_config.swap_grave_esc = true;
565 case MAGIC_SWAP_BACKSLASH_BACKSPACE:
566 keymap_config.swap_backslash_backspace = true;
568 case MAGIC_HOST_NKRO:
569 keymap_config.nkro = true;
571 case MAGIC_SWAP_ALT_GUI:
572 keymap_config.swap_lalt_lgui = true;
573 keymap_config.swap_ralt_rgui = true;
575 PLAY_SONG(ag_swap_song);
578 case MAGIC_UNSWAP_CONTROL_CAPSLOCK:
579 keymap_config.swap_control_capslock = false;
581 case MAGIC_UNCAPSLOCK_TO_CONTROL:
582 keymap_config.capslock_to_control = false;
584 case MAGIC_UNSWAP_LALT_LGUI:
585 keymap_config.swap_lalt_lgui = false;
587 case MAGIC_UNSWAP_RALT_RGUI:
588 keymap_config.swap_ralt_rgui = false;
591 keymap_config.no_gui = false;
593 case MAGIC_UNSWAP_GRAVE_ESC:
594 keymap_config.swap_grave_esc = false;
596 case MAGIC_UNSWAP_BACKSLASH_BACKSPACE:
597 keymap_config.swap_backslash_backspace = false;
599 case MAGIC_UNHOST_NKRO:
600 keymap_config.nkro = false;
602 case MAGIC_UNSWAP_ALT_GUI:
603 keymap_config.swap_lalt_lgui = false;
604 keymap_config.swap_ralt_rgui = false;
606 PLAY_SONG(ag_norm_song);
609 case MAGIC_TOGGLE_NKRO:
610 keymap_config.nkro = !keymap_config.nkro;
615 eeconfig_update_keymap(keymap_config.raw);
616 clear_keyboard(); // clear to prevent stuck keys
622 if (record->event.pressed) {
623 shift_interrupted[0] = false;
624 scs_timer[0] = timer_read ();
625 register_mods(MOD_BIT(KC_LSFT));
628 #ifdef DISABLE_SPACE_CADET_ROLLOVER
629 if (get_mods() & MOD_BIT(KC_RSFT)) {
630 shift_interrupted[0] = true;
631 shift_interrupted[1] = true;
634 if (!shift_interrupted[0] && timer_elapsed(scs_timer[0]) < TAPPING_TERM) {
635 register_code(LSPO_KEY);
636 unregister_code(LSPO_KEY);
638 unregister_mods(MOD_BIT(KC_LSFT));
644 if (record->event.pressed) {
645 shift_interrupted[1] = false;
646 scs_timer[1] = timer_read ();
647 register_mods(MOD_BIT(KC_RSFT));
650 #ifdef DISABLE_SPACE_CADET_ROLLOVER
651 if (get_mods() & MOD_BIT(KC_LSFT)) {
652 shift_interrupted[0] = true;
653 shift_interrupted[1] = true;
656 if (!shift_interrupted[1] && timer_elapsed(scs_timer[1]) < TAPPING_TERM) {
657 register_code(RSPC_KEY);
658 unregister_code(RSPC_KEY);
660 unregister_mods(MOD_BIT(KC_RSFT));
666 if (record->event.pressed) {
667 shift_interrupted[1] = false;
668 scs_timer[1] = timer_read ();
669 register_mods(MOD_BIT(KC_RSFT));
671 else if (!shift_interrupted[1] && timer_elapsed(scs_timer[1]) < TAPPING_TERM) {
672 unregister_mods(MOD_BIT(KC_RSFT));
673 register_code(SFTENT_KEY);
674 unregister_code(SFTENT_KEY);
677 unregister_mods(MOD_BIT(KC_RSFT));
683 uint8_t shifted = get_mods() & ((MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)
684 |MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)));
686 #ifdef GRAVE_ESC_ALT_OVERRIDE
687 // if ALT is pressed, ESC is always sent
688 // this is handy for the cmd+opt+esc shortcut on macOS, among other things.
689 if (get_mods() & (MOD_BIT(KC_LALT) | MOD_BIT(KC_RALT))) {
694 #ifdef GRAVE_ESC_CTRL_OVERRIDE
695 // if CTRL is pressed, ESC is always sent
696 // this is handy for the ctrl+shift+esc shortcut on windows, among other things.
697 if (get_mods() & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL))) {
702 #ifdef GRAVE_ESC_GUI_OVERRIDE
703 // if GUI is pressed, ESC is always sent
704 if (get_mods() & (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI))) {
709 #ifdef GRAVE_ESC_SHIFT_OVERRIDE
710 // if SHIFT is pressed, ESC is always sent
711 if (get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
716 if (record->event.pressed) {
717 grave_esc_was_shifted = shifted;
718 add_key(shifted ? KC_GRAVE : KC_ESCAPE);
721 del_key(grave_esc_was_shifted ? KC_GRAVE : KC_ESCAPE);
724 send_keyboard_report();
728 #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_BREATHING)
730 if (record->event.pressed)
737 shift_interrupted[0] = true;
738 shift_interrupted[1] = true;
743 return process_action_kb(record);
746 __attribute__ ((weak))
747 const bool ascii_to_shift_lut[0x80] PROGMEM = {
748 0, 0, 0, 0, 0, 0, 0, 0,
749 0, 0, 0, 0, 0, 0, 0, 0,
750 0, 0, 0, 0, 0, 0, 0, 0,
751 0, 0, 0, 0, 0, 0, 0, 0,
752 0, 1, 1, 1, 1, 1, 1, 0,
753 1, 1, 1, 1, 0, 0, 0, 0,
754 0, 0, 0, 0, 0, 0, 0, 0,
755 0, 0, 1, 0, 1, 0, 1, 1,
756 1, 1, 1, 1, 1, 1, 1, 1,
757 1, 1, 1, 1, 1, 1, 1, 1,
758 1, 1, 1, 1, 1, 1, 1, 1,
759 1, 1, 1, 0, 0, 0, 1, 1,
760 0, 0, 0, 0, 0, 0, 0, 0,
761 0, 0, 0, 0, 0, 0, 0, 0,
762 0, 0, 0, 0, 0, 0, 0, 0,
763 0, 0, 0, 1, 1, 1, 1, 0
766 __attribute__ ((weak))
767 const uint8_t ascii_to_keycode_lut[0x80] PROGMEM = {
768 0, 0, 0, 0, 0, 0, 0, 0,
769 KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0,
770 0, 0, 0, 0, 0, 0, 0, 0,
771 0, 0, 0, KC_ESC, 0, 0, 0, 0,
772 KC_SPC, KC_1, KC_QUOT, KC_3, KC_4, KC_5, KC_7, KC_QUOT,
773 KC_9, KC_0, KC_8, KC_EQL, KC_COMM, KC_MINS, KC_DOT, KC_SLSH,
774 KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
775 KC_8, KC_9, KC_SCLN, KC_SCLN, KC_COMM, KC_EQL, KC_DOT, KC_SLSH,
776 KC_2, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
777 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
778 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
779 KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_6, KC_MINS,
780 KC_GRV, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
781 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
782 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
783 KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL
786 void send_string(const char *str) {
787 send_string_with_delay(str, 0);
790 void send_string_P(const char *str) {
791 send_string_with_delay_P(str, 0);
794 void send_string_with_delay(const char *str, uint8_t interval) {
796 char ascii_code = *str;
797 if (!ascii_code) break;
798 if (ascii_code == 1) {
800 uint8_t keycode = *(++str);
801 register_code(keycode);
802 unregister_code(keycode);
803 } else if (ascii_code == 2) {
805 uint8_t keycode = *(++str);
806 register_code(keycode);
807 } else if (ascii_code == 3) {
809 uint8_t keycode = *(++str);
810 unregister_code(keycode);
812 send_char(ascii_code);
816 { uint8_t ms = interval; while (ms--) wait_ms(1); }
820 void send_string_with_delay_P(const char *str, uint8_t interval) {
822 char ascii_code = pgm_read_byte(str);
823 if (!ascii_code) break;
824 if (ascii_code == 1) {
826 uint8_t keycode = pgm_read_byte(++str);
827 register_code(keycode);
828 unregister_code(keycode);
829 } else if (ascii_code == 2) {
831 uint8_t keycode = pgm_read_byte(++str);
832 register_code(keycode);
833 } else if (ascii_code == 3) {
835 uint8_t keycode = pgm_read_byte(++str);
836 unregister_code(keycode);
838 send_char(ascii_code);
842 { uint8_t ms = interval; while (ms--) wait_ms(1); }
846 void send_char(char ascii_code) {
848 keycode = pgm_read_byte(&ascii_to_keycode_lut[(uint8_t)ascii_code]);
849 if (pgm_read_byte(&ascii_to_shift_lut[(uint8_t)ascii_code])) {
850 register_code(KC_LSFT);
851 register_code(keycode);
852 unregister_code(keycode);
853 unregister_code(KC_LSFT);
855 register_code(keycode);
856 unregister_code(keycode);
860 void set_single_persistent_default_layer(uint8_t default_layer) {
861 #if defined(AUDIO_ENABLE) && defined(DEFAULT_LAYER_SONGS)
862 PLAY_SONG(default_layer_songs[default_layer]);
864 eeconfig_update_default_layer(1U<<default_layer);
865 default_layer_set(1U<<default_layer);
868 uint32_t update_tri_layer_state(uint32_t state, uint8_t layer1, uint8_t layer2, uint8_t layer3) {
869 uint32_t mask12 = (1UL << layer1) | (1UL << layer2);
870 uint32_t mask3 = 1UL << layer3;
871 return (state & mask12) == mask12 ? (state | mask3) : (state & ~mask3);
874 void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
875 layer_state_set(update_tri_layer_state(layer_state, layer1, layer2, layer3));
878 void tap_random_base64(void) {
879 #if defined(__AVR_ATmega32U4__)
880 uint8_t key = (TCNT0 + TCNT1 + TCNT3 + TCNT4) % 64;
882 uint8_t key = rand() % 64;
886 register_code(KC_LSFT);
887 register_code(key + KC_A);
888 unregister_code(key + KC_A);
889 unregister_code(KC_LSFT);
892 register_code(key - 26 + KC_A);
893 unregister_code(key - 26 + KC_A);
897 unregister_code(KC_0);
900 register_code(key - 53 + KC_1);
901 unregister_code(key - 53 + KC_1);
904 register_code(KC_LSFT);
905 register_code(KC_EQL);
906 unregister_code(KC_EQL);
907 unregister_code(KC_LSFT);
910 register_code(KC_SLSH);
911 unregister_code(KC_SLSH);
916 void matrix_init_quantum() {
917 #ifdef BACKLIGHT_ENABLE
918 backlight_init_ports();
923 #ifdef RGB_MATRIX_ENABLE
929 uint8_t rgb_matrix_task_counter = 0;
931 #ifndef RGB_MATRIX_SKIP_FRAMES
932 #define RGB_MATRIX_SKIP_FRAMES 1
935 void matrix_scan_quantum() {
936 #if defined(AUDIO_ENABLE) && !defined(NO_MUSIC_MODE)
940 #ifdef TAP_DANCE_ENABLE
941 matrix_scan_tap_dance();
948 #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_PIN)
952 #ifdef RGB_MATRIX_ENABLE
954 if (rgb_matrix_task_counter == 0) {
955 rgb_matrix_update_pwm_buffers();
957 rgb_matrix_task_counter = ((rgb_matrix_task_counter + 1) % (RGB_MATRIX_SKIP_FRAMES + 1));
962 #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_PIN)
964 static const uint8_t backlight_pin = BACKLIGHT_PIN;
966 // depending on the pin, we use a different output compare unit
967 #if BACKLIGHT_PIN == B7
968 # define TCCRxA TCCR1A
969 # define TCCRxB TCCR1B
970 # define COMxx1 COM1C1
973 #elif BACKLIGHT_PIN == B6
974 # define TCCRxA TCCR1A
975 # define TCCRxB TCCR1B
976 # define COMxx1 COM1B1
979 #elif BACKLIGHT_PIN == B5
980 # define TCCRxA TCCR1A
981 # define TCCRxB TCCR1B
982 # define COMxx1 COM1A1
985 #elif BACKLIGHT_PIN == C6
986 # define TCCRxA TCCR3A
987 # define TCCRxB TCCR3B
988 # define COMxx1 COM1A1
992 # define NO_HARDWARE_PWM
995 #ifndef BACKLIGHT_ON_STATE
996 #define BACKLIGHT_ON_STATE 0
999 #ifdef NO_HARDWARE_PWM // pwm through software
1001 __attribute__ ((weak))
1002 void backlight_init_ports(void)
1004 // Setup backlight pin as output and output to on state.
1006 _SFR_IO8((backlight_pin >> 4) + 1) |= _BV(backlight_pin & 0xF);
1007 #if BACKLIGHT_ON_STATE == 0
1009 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
1012 _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
1016 __attribute__ ((weak))
1017 void backlight_set(uint8_t level) {}
1019 uint8_t backlight_tick = 0;
1021 #ifndef BACKLIGHT_CUSTOM_DRIVER
1022 void backlight_task(void) {
1023 if ((0xFFFF >> ((BACKLIGHT_LEVELS - get_backlight_level()) * ((BACKLIGHT_LEVELS + 1) / 2))) & (1 << backlight_tick)) {
1024 #if BACKLIGHT_ON_STATE == 0
1026 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
1029 _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
1032 #if BACKLIGHT_ON_STATE == 0
1034 _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
1037 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
1040 backlight_tick = (backlight_tick + 1) % 16;
1044 #ifdef BACKLIGHT_BREATHING
1045 #ifndef BACKLIGHT_CUSTOM_DRIVER
1046 #error "Backlight breathing only available with hardware PWM. Please disable."
1050 #else // pwm through timer
1052 #define TIMER_TOP 0xFFFFU
1054 // See http://jared.geek.nz/2013/feb/linear-led-pwm
1055 static uint16_t cie_lightness(uint16_t v) {
1056 if (v <= 5243) // if below 8% of max
1057 return v / 9; // same as dividing by 900%
1059 uint32_t y = (((uint32_t) v + 10486) << 8) / (10486 + 0xFFFFUL); // add 16% of max and compare
1060 // to get a useful result with integer division, we shift left in the expression above
1061 // and revert what we've done again after squaring.
1063 if (y > 0xFFFFUL) // prevent overflow
1066 return (uint16_t) y;
1070 // range for val is [0..TIMER_TOP]. PWM pin is high while the timer count is below val.
1071 static inline void set_pwm(uint16_t val) {
1075 #ifndef BACKLIGHT_CUSTOM_DRIVER
1076 __attribute__ ((weak))
1077 void backlight_set(uint8_t level) {
1078 if (level > BACKLIGHT_LEVELS)
1079 level = BACKLIGHT_LEVELS;
1082 // Turn off PWM control on backlight pin
1083 TCCRxA &= ~(_BV(COMxx1));
1085 // Turn on PWM control of backlight pin
1086 TCCRxA |= _BV(COMxx1);
1088 // Set the brightness
1089 set_pwm(cie_lightness(TIMER_TOP * (uint32_t)level / BACKLIGHT_LEVELS));
1092 void backlight_task(void) {}
1093 #endif // BACKLIGHT_CUSTOM_DRIVER
1095 #ifdef BACKLIGHT_BREATHING
1097 #define BREATHING_NO_HALT 0
1098 #define BREATHING_HALT_OFF 1
1099 #define BREATHING_HALT_ON 2
1100 #define BREATHING_STEPS 128
1102 static uint8_t breathing_period = BREATHING_PERIOD;
1103 static uint8_t breathing_halt = BREATHING_NO_HALT;
1104 static uint16_t breathing_counter = 0;
1106 bool is_breathing(void) {
1107 return !!(TIMSK1 & _BV(TOIE1));
1110 #define breathing_interrupt_enable() do {TIMSK1 |= _BV(TOIE1);} while (0)
1111 #define breathing_interrupt_disable() do {TIMSK1 &= ~_BV(TOIE1);} while (0)
1112 #define breathing_min() do {breathing_counter = 0;} while (0)
1113 #define breathing_max() do {breathing_counter = breathing_period * 244 / 2;} while (0)
1115 void breathing_enable(void)
1117 breathing_counter = 0;
1118 breathing_halt = BREATHING_NO_HALT;
1119 breathing_interrupt_enable();
1122 void breathing_pulse(void)
1124 if (get_backlight_level() == 0)
1128 breathing_halt = BREATHING_HALT_ON;
1129 breathing_interrupt_enable();
1132 void breathing_disable(void)
1134 breathing_interrupt_disable();
1135 // Restore backlight level
1136 backlight_set(get_backlight_level());
1139 void breathing_self_disable(void)
1141 if (get_backlight_level() == 0)
1142 breathing_halt = BREATHING_HALT_OFF;
1144 breathing_halt = BREATHING_HALT_ON;
1147 void breathing_toggle(void) {
1149 breathing_disable();
1154 void breathing_period_set(uint8_t value)
1158 breathing_period = value;
1161 void breathing_period_default(void) {
1162 breathing_period_set(BREATHING_PERIOD);
1165 void breathing_period_inc(void)
1167 breathing_period_set(breathing_period+1);
1170 void breathing_period_dec(void)
1172 breathing_period_set(breathing_period-1);
1175 /* To generate breathing curve in python:
1176 * from math import sin, pi; [int(sin(x/128.0*pi)**4*255) for x in range(128)]
1178 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};
1180 // Use this before the cie_lightness function.
1181 static inline uint16_t scale_backlight(uint16_t v) {
1182 return v / BACKLIGHT_LEVELS * get_backlight_level();
1185 /* Assuming a 16MHz CPU clock and a timer that resets at 64k (ICR1), the following interrupt handler will run
1186 * about 244 times per second.
1188 ISR(TIMER1_OVF_vect)
1190 uint16_t interval = (uint16_t) breathing_period * 244 / BREATHING_STEPS;
1191 // resetting after one period to prevent ugly reset at overflow.
1192 breathing_counter = (breathing_counter + 1) % (breathing_period * 244);
1193 uint8_t index = breathing_counter / interval % BREATHING_STEPS;
1195 if (((breathing_halt == BREATHING_HALT_ON) && (index == BREATHING_STEPS / 2)) ||
1196 ((breathing_halt == BREATHING_HALT_OFF) && (index == BREATHING_STEPS - 1)))
1198 breathing_interrupt_disable();
1201 set_pwm(cie_lightness(scale_backlight((uint16_t) pgm_read_byte(&breathing_table[index]) * 0x0101U)));
1204 #endif // BACKLIGHT_BREATHING
1206 __attribute__ ((weak))
1207 void backlight_init_ports(void)
1209 // Setup backlight pin as output and output to on state.
1211 _SFR_IO8((backlight_pin >> 4) + 1) |= _BV(backlight_pin & 0xF);
1212 #if BACKLIGHT_ON_STATE == 0
1214 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
1217 _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
1219 // I could write a wall of text here to explain... but TL;DW
1220 // Go read the ATmega32u4 datasheet.
1221 // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on
1223 // Pin PB7 = OCR1C (Timer 1, Channel C)
1224 // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0
1225 // (i.e. start high, go low when counter matches.)
1226 // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0
1227 // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1
1231 "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 [..]."
1232 "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)."
1234 TCCRxA = _BV(COMxx1) | _BV(WGM11); // = 0b00001010;
1235 TCCRxB = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
1236 // Use full 16-bit resolution. Counter counts to ICR1 before reset to 0.
1240 #ifdef BACKLIGHT_BREATHING
1245 #endif // NO_HARDWARE_PWM
1249 __attribute__ ((weak))
1250 void backlight_init_ports(void) {}
1252 __attribute__ ((weak))
1253 void backlight_set(uint8_t level) {}
1257 #ifdef HD44780_ENABLED
1258 #include "hd44780.h"
1262 // Functions for spitting out values
1265 void send_dword(uint32_t number) { // this might not actually work
1266 uint16_t word = (number >> 16);
1268 send_word(number & 0xFFFFUL);
1271 void send_word(uint16_t number) {
1272 uint8_t byte = number >> 8;
1274 send_byte(number & 0xFF);
1277 void send_byte(uint8_t number) {
1278 uint8_t nibble = number >> 4;
1279 send_nibble(nibble);
1280 send_nibble(number & 0xF);
1283 void send_nibble(uint8_t number) {
1286 register_code(KC_0);
1287 unregister_code(KC_0);
1290 register_code(KC_1 + (number - 1));
1291 unregister_code(KC_1 + (number - 1));
1294 register_code(KC_A + (number - 0xA));
1295 unregister_code(KC_A + (number - 0xA));
1301 __attribute__((weak))
1302 uint16_t hex_to_keycode(uint8_t hex)
1307 } else if (hex < 0xA) {
1308 return KC_1 + (hex - 0x1);
1310 return KC_A + (hex - 0xA);
1314 void api_send_unicode(uint32_t unicode) {
1317 dword_to_bytes(unicode, chunk);
1318 MT_SEND_DATA(DT_UNICODE, chunk, 5);
1322 __attribute__ ((weak))
1323 void led_set_user(uint8_t usb_led) {
1327 __attribute__ ((weak))
1328 void led_set_kb(uint8_t usb_led) {
1329 led_set_user(usb_led);
1332 __attribute__ ((weak))
1333 void led_init_ports(void)
1338 __attribute__ ((weak))
1339 void led_set(uint8_t usb_led)
1344 // // Using PE6 Caps Lock LED
1345 // if (usb_led & (1<<USB_LED_CAPS_LOCK))
1355 // PORTE &= ~(1<<6);
1358 led_set_kb(usb_led);
1362 //------------------------------------------------------------------------------
1363 // Override these functions in your keymap file to play different tunes on
1364 // different events such as startup and bootloader jump
1366 __attribute__ ((weak))
1367 void startup_user() {}
1369 __attribute__ ((weak))
1370 void shutdown_user() {}
1372 //------------------------------------------------------------------------------