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 #include "backlight.h"
27 extern backlight_config_t backlight_config;
29 #ifdef FAUXCLICKY_ENABLE
30 #include "fauxclicky.h"
35 #define GOODBYE_SONG SONG(GOODBYE_SOUND)
38 #define AG_NORM_SONG SONG(AG_NORM_SOUND)
41 #define AG_SWAP_SONG SONG(AG_SWAP_SOUND)
43 float goodbye_song[][2] = GOODBYE_SONG;
44 float ag_norm_song[][2] = AG_NORM_SONG;
45 float ag_swap_song[][2] = AG_SWAP_SONG;
46 #ifdef DEFAULT_LAYER_SONGS
47 float default_layer_songs[][16][2] = DEFAULT_LAYER_SONGS;
51 static void do_code16 (uint16_t code, void (*f) (uint8_t)) {
53 case QK_MODS ... QK_MODS_MAX:
68 if (code < QK_RMODS_MIN) return;
80 static inline void qk_register_weak_mods(uint8_t kc) {
81 add_weak_mods(MOD_BIT(kc));
82 send_keyboard_report();
85 static inline void qk_unregister_weak_mods(uint8_t kc) {
86 del_weak_mods(MOD_BIT(kc));
87 send_keyboard_report();
90 static inline void qk_register_mods(uint8_t kc) {
91 add_weak_mods(MOD_BIT(kc));
92 send_keyboard_report();
95 static inline void qk_unregister_mods(uint8_t kc) {
96 del_weak_mods(MOD_BIT(kc));
97 send_keyboard_report();
100 void register_code16 (uint16_t code) {
101 if (IS_MOD(code) || code == KC_NO) {
102 do_code16 (code, qk_register_mods);
104 do_code16 (code, qk_register_weak_mods);
106 register_code (code);
109 void unregister_code16 (uint16_t code) {
110 unregister_code (code);
111 if (IS_MOD(code) || code == KC_NO) {
112 do_code16 (code, qk_unregister_mods);
114 do_code16 (code, qk_unregister_weak_mods);
118 __attribute__ ((weak))
119 bool process_action_kb(keyrecord_t *record) {
123 __attribute__ ((weak))
124 bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
125 return process_record_user(keycode, record);
128 __attribute__ ((weak))
129 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
133 void reset_keyboard(void) {
135 #if defined(MIDI_ENABLE) && defined(MIDI_BASIC)
136 process_midi_all_notes_off();
138 #if defined(AUDIO_ENABLE)
139 music_all_notes_off();
140 uint16_t timer_start = timer_read();
141 PLAY_SONG(goodbye_song);
143 while(timer_elapsed(timer_start) < 250)
149 // this is also done later in bootloader.c - not sure if it's neccesary here
150 #ifdef BOOTLOADER_CATERINA
151 *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific
156 // Shift / paren setup
159 #define LSPO_KEY KC_9
162 #define RSPC_KEY KC_0
165 static bool shift_interrupted[2] = {0, 0};
166 static uint16_t scs_timer[2] = {0, 0};
168 /* true if the last press of GRAVE_ESC was shifted (i.e. GUI or SHIFT were pressed), false otherwise.
169 * Used to ensure that the correct keycode is released if the key is released.
171 static bool grave_esc_was_shifted = false;
173 bool process_record_quantum(keyrecord_t *record) {
175 /* This gets the keycode from the key pressed */
176 keypos_t key = record->event.key;
179 #if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
180 /* TODO: Use store_or_get_action() or a similar function. */
181 if (!disable_action_cache) {
184 if (record->event.pressed) {
185 layer = layer_switch_get_layer(key);
186 update_source_layers_cache(key, layer);
188 layer = read_source_layers_cache(key);
190 keycode = keymap_key_to_keycode(layer, key);
193 keycode = keymap_key_to_keycode(layer_switch_get_layer(key), key);
195 // This is how you use actions here
196 // if (keycode == KC_LEAD) {
198 // action.code = ACTION_DEFAULT_LAYER_SET(0);
199 // process_action(record, action);
204 #if defined(KEY_LOCK_ENABLE)
205 // Must run first to be able to mask key_up events.
206 process_key_lock(&keycode, record) &&
208 process_record_kb(keycode, record) &&
209 #if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED)
210 process_midi(keycode, record) &&
213 process_audio(keycode, record) &&
216 process_steno(keycode, record) &&
218 #if defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC))
219 process_music(keycode, record) &&
221 #ifdef TAP_DANCE_ENABLE
222 process_tap_dance(keycode, record) &&
224 #ifndef DISABLE_LEADER
225 process_leader(keycode, record) &&
227 #ifndef DISABLE_CHORDING
228 process_chording(keycode, record) &&
231 process_combo(keycode, record) &&
233 #ifdef UNICODE_ENABLE
234 process_unicode(keycode, record) &&
237 process_ucis(keycode, record) &&
239 #ifdef PRINTING_ENABLE
240 process_printer(keycode, record) &&
242 #ifdef AUTO_SHIFT_ENABLE
243 process_auto_shift(keycode, record) &&
245 #ifdef UNICODEMAP_ENABLE
246 process_unicode_map(keycode, record) &&
248 #ifdef TERMINAL_ENABLE
249 process_terminal(keycode, record) &&
255 // Shift / paren setup
259 if (record->event.pressed) {
264 if (record->event.pressed) {
266 print("DEBUG: enabled.\n");
269 #ifdef FAUXCLICKY_ENABLE
271 if (record->event.pressed) {
276 if (record->event.pressed) {
281 if (record->event.pressed) {
286 #ifdef RGBLIGHT_ENABLE
288 if (record->event.pressed) {
292 case RGB_MODE_FORWARD:
293 if (record->event.pressed) {
294 uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT));
296 rgblight_step_reverse();
303 case RGB_MODE_REVERSE:
304 if (record->event.pressed) {
305 uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT));
310 rgblight_step_reverse();
315 if (record->event.pressed) {
316 rgblight_increase_hue();
320 if (record->event.pressed) {
321 rgblight_decrease_hue();
325 if (record->event.pressed) {
326 rgblight_increase_sat();
330 if (record->event.pressed) {
331 rgblight_decrease_sat();
335 if (record->event.pressed) {
336 rgblight_increase_val();
340 if (record->event.pressed) {
341 rgblight_decrease_val();
345 if (record->event.pressed) {
349 case RGB_MODE_BREATHE:
350 if (record->event.pressed) {
351 if ((2 <= rgblight_get_mode()) && (rgblight_get_mode() < 5)) {
358 case RGB_MODE_RAINBOW:
359 if (record->event.pressed) {
360 if ((6 <= rgblight_get_mode()) && (rgblight_get_mode() < 8)) {
368 if (record->event.pressed) {
369 if ((9 <= rgblight_get_mode()) && (rgblight_get_mode() < 14)) {
377 if (record->event.pressed) {
378 if ((15 <= rgblight_get_mode()) && (rgblight_get_mode() < 20)) {
385 case RGB_MODE_KNIGHT:
386 if (record->event.pressed) {
387 if ((21 <= rgblight_get_mode()) && (rgblight_get_mode() < 23)) {
395 if (record->event.pressed) {
399 case RGB_MODE_GRADIENT:
400 if (record->event.pressed) {
401 if ((25 <= rgblight_get_mode()) && (rgblight_get_mode() < 34)) {
411 if (record->event.pressed) {
412 set_output(OUTPUT_AUTO);
416 if (record->event.pressed) {
417 set_output(OUTPUT_USB);
420 #ifdef BLUETOOTH_ENABLE
422 if (record->event.pressed) {
423 set_output(OUTPUT_BLUETOOTH);
428 case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_TOGGLE_NKRO:
429 if (record->event.pressed) {
430 // MAGIC actions (BOOTMAGIC without the boot)
431 if (!eeconfig_is_enabled()) {
435 keymap_config.raw = eeconfig_read_keymap();
438 case MAGIC_SWAP_CONTROL_CAPSLOCK:
439 keymap_config.swap_control_capslock = true;
441 case MAGIC_CAPSLOCK_TO_CONTROL:
442 keymap_config.capslock_to_control = true;
444 case MAGIC_SWAP_LALT_LGUI:
445 keymap_config.swap_lalt_lgui = true;
447 case MAGIC_SWAP_RALT_RGUI:
448 keymap_config.swap_ralt_rgui = true;
451 keymap_config.no_gui = true;
453 case MAGIC_SWAP_GRAVE_ESC:
454 keymap_config.swap_grave_esc = true;
456 case MAGIC_SWAP_BACKSLASH_BACKSPACE:
457 keymap_config.swap_backslash_backspace = true;
459 case MAGIC_HOST_NKRO:
460 keymap_config.nkro = true;
462 case MAGIC_SWAP_ALT_GUI:
463 keymap_config.swap_lalt_lgui = true;
464 keymap_config.swap_ralt_rgui = true;
466 PLAY_SONG(ag_swap_song);
469 case MAGIC_UNSWAP_CONTROL_CAPSLOCK:
470 keymap_config.swap_control_capslock = false;
472 case MAGIC_UNCAPSLOCK_TO_CONTROL:
473 keymap_config.capslock_to_control = false;
475 case MAGIC_UNSWAP_LALT_LGUI:
476 keymap_config.swap_lalt_lgui = false;
478 case MAGIC_UNSWAP_RALT_RGUI:
479 keymap_config.swap_ralt_rgui = false;
482 keymap_config.no_gui = false;
484 case MAGIC_UNSWAP_GRAVE_ESC:
485 keymap_config.swap_grave_esc = false;
487 case MAGIC_UNSWAP_BACKSLASH_BACKSPACE:
488 keymap_config.swap_backslash_backspace = false;
490 case MAGIC_UNHOST_NKRO:
491 keymap_config.nkro = false;
493 case MAGIC_UNSWAP_ALT_GUI:
494 keymap_config.swap_lalt_lgui = false;
495 keymap_config.swap_ralt_rgui = false;
497 PLAY_SONG(ag_norm_song);
500 case MAGIC_TOGGLE_NKRO:
501 keymap_config.nkro = !keymap_config.nkro;
506 eeconfig_update_keymap(keymap_config.raw);
507 clear_keyboard(); // clear to prevent stuck keys
513 if (record->event.pressed) {
514 shift_interrupted[0] = false;
515 scs_timer[0] = timer_read ();
516 register_mods(MOD_BIT(KC_LSFT));
519 #ifdef DISABLE_SPACE_CADET_ROLLOVER
520 if (get_mods() & MOD_BIT(KC_RSFT)) {
521 shift_interrupted[0] = true;
522 shift_interrupted[1] = true;
525 if (!shift_interrupted[0] && timer_elapsed(scs_timer[0]) < TAPPING_TERM) {
526 register_code(LSPO_KEY);
527 unregister_code(LSPO_KEY);
529 unregister_mods(MOD_BIT(KC_LSFT));
535 if (record->event.pressed) {
536 shift_interrupted[1] = false;
537 scs_timer[1] = timer_read ();
538 register_mods(MOD_BIT(KC_RSFT));
541 #ifdef DISABLE_SPACE_CADET_ROLLOVER
542 if (get_mods() & MOD_BIT(KC_LSFT)) {
543 shift_interrupted[0] = true;
544 shift_interrupted[1] = true;
547 if (!shift_interrupted[1] && timer_elapsed(scs_timer[1]) < TAPPING_TERM) {
548 register_code(RSPC_KEY);
549 unregister_code(RSPC_KEY);
551 unregister_mods(MOD_BIT(KC_RSFT));
556 uint8_t shifted = get_mods() & ((MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)
557 |MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)));
559 #ifdef GRAVE_ESC_ALT_OVERRIDE
560 // if ALT is pressed, ESC is always sent
561 // this is handy for the cmd+opt+esc shortcut on macOS, among other things.
562 if (get_mods() & (MOD_BIT(KC_LALT) | MOD_BIT(KC_RALT))) {
567 #ifdef GRAVE_ESC_CTRL_OVERRIDE
568 // if CTRL is pressed, ESC is always sent
569 // this is handy for the ctrl+shift+esc shortcut on windows, among other things.
570 if (get_mods() & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL))) {
575 #ifdef GRAVE_ESC_GUI_OVERRIDE
576 // if GUI is pressed, ESC is always sent
577 if (get_mods() & (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI))) {
582 #ifdef GRAVE_ESC_SHIFT_OVERRIDE
583 // if SHIFT is pressed, ESC is always sent
584 if (get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
589 if (record->event.pressed) {
590 grave_esc_was_shifted = shifted;
591 add_key(shifted ? KC_GRAVE : KC_ESCAPE);
594 del_key(grave_esc_was_shifted ? KC_GRAVE : KC_ESCAPE);
597 send_keyboard_report();
600 shift_interrupted[0] = true;
601 shift_interrupted[1] = true;
606 return process_action_kb(record);
609 __attribute__ ((weak))
610 const bool ascii_to_shift_lut[0x80] PROGMEM = {
611 0, 0, 0, 0, 0, 0, 0, 0,
612 0, 0, 0, 0, 0, 0, 0, 0,
613 0, 0, 0, 0, 0, 0, 0, 0,
614 0, 0, 0, 0, 0, 0, 0, 0,
615 0, 1, 1, 1, 1, 1, 1, 0,
616 1, 1, 1, 1, 0, 0, 0, 0,
617 0, 0, 0, 0, 0, 0, 0, 0,
618 0, 0, 1, 0, 1, 0, 1, 1,
619 1, 1, 1, 1, 1, 1, 1, 1,
620 1, 1, 1, 1, 1, 1, 1, 1,
621 1, 1, 1, 1, 1, 1, 1, 1,
622 1, 1, 1, 0, 0, 0, 1, 1,
623 0, 0, 0, 0, 0, 0, 0, 0,
624 0, 0, 0, 0, 0, 0, 0, 0,
625 0, 0, 0, 0, 0, 0, 0, 0,
626 0, 0, 0, 1, 1, 1, 1, 0
629 __attribute__ ((weak))
630 const uint8_t ascii_to_keycode_lut[0x80] PROGMEM = {
631 0, 0, 0, 0, 0, 0, 0, 0,
632 KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0,
633 0, 0, 0, 0, 0, 0, 0, 0,
634 0, 0, 0, KC_ESC, 0, 0, 0, 0,
635 KC_SPC, KC_1, KC_QUOT, KC_3, KC_4, KC_5, KC_7, KC_QUOT,
636 KC_9, KC_0, KC_8, KC_EQL, KC_COMM, KC_MINS, KC_DOT, KC_SLSH,
637 KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
638 KC_8, KC_9, KC_SCLN, KC_SCLN, KC_COMM, KC_EQL, KC_DOT, KC_SLSH,
639 KC_2, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
640 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
641 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
642 KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_6, KC_MINS,
643 KC_GRV, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
644 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
645 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
646 KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL
649 void send_string(const char *str) {
650 send_string_with_delay(str, 0);
653 void send_string_P(const char *str) {
654 send_string_with_delay_P(str, 0);
657 void send_string_with_delay(const char *str, uint8_t interval) {
659 char ascii_code = *str;
660 if (!ascii_code) break;
661 if (ascii_code == 1) {
663 uint8_t keycode = *(++str);
664 register_code(keycode);
665 unregister_code(keycode);
666 } else if (ascii_code == 2) {
668 uint8_t keycode = *(++str);
669 register_code(keycode);
670 } else if (ascii_code == 3) {
672 uint8_t keycode = *(++str);
673 unregister_code(keycode);
675 send_char(ascii_code);
679 { uint8_t ms = interval; while (ms--) wait_ms(1); }
683 void send_string_with_delay_P(const char *str, uint8_t interval) {
685 char ascii_code = pgm_read_byte(str);
686 if (!ascii_code) break;
687 if (ascii_code == 1) {
689 uint8_t keycode = pgm_read_byte(++str);
690 register_code(keycode);
691 unregister_code(keycode);
692 } else if (ascii_code == 2) {
694 uint8_t keycode = pgm_read_byte(++str);
695 register_code(keycode);
696 } else if (ascii_code == 3) {
698 uint8_t keycode = pgm_read_byte(++str);
699 unregister_code(keycode);
701 send_char(ascii_code);
705 { uint8_t ms = interval; while (ms--) wait_ms(1); }
709 void send_char(char ascii_code) {
711 keycode = pgm_read_byte(&ascii_to_keycode_lut[(uint8_t)ascii_code]);
712 if (pgm_read_byte(&ascii_to_shift_lut[(uint8_t)ascii_code])) {
713 register_code(KC_LSFT);
714 register_code(keycode);
715 unregister_code(keycode);
716 unregister_code(KC_LSFT);
718 register_code(keycode);
719 unregister_code(keycode);
723 void set_single_persistent_default_layer(uint8_t default_layer) {
724 #if defined(AUDIO_ENABLE) && defined(DEFAULT_LAYER_SONGS)
725 PLAY_SONG(default_layer_songs[default_layer]);
727 eeconfig_update_default_layer(1U<<default_layer);
728 default_layer_set(1U<<default_layer);
731 void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
732 if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
739 void tap_random_base64(void) {
740 #if defined(__AVR_ATmega32U4__)
741 uint8_t key = (TCNT0 + TCNT1 + TCNT3 + TCNT4) % 64;
743 uint8_t key = rand() % 64;
747 register_code(KC_LSFT);
748 register_code(key + KC_A);
749 unregister_code(key + KC_A);
750 unregister_code(KC_LSFT);
753 register_code(key - 26 + KC_A);
754 unregister_code(key - 26 + KC_A);
758 unregister_code(KC_0);
761 register_code(key - 53 + KC_1);
762 unregister_code(key - 53 + KC_1);
765 register_code(KC_LSFT);
766 register_code(KC_EQL);
767 unregister_code(KC_EQL);
768 unregister_code(KC_LSFT);
771 register_code(KC_SLSH);
772 unregister_code(KC_SLSH);
777 void matrix_init_quantum() {
778 #ifdef BACKLIGHT_ENABLE
779 backlight_init_ports();
787 void matrix_scan_quantum() {
792 #ifdef TAP_DANCE_ENABLE
793 matrix_scan_tap_dance();
800 #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_PIN)
807 #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_PIN)
809 static const uint8_t backlight_pin = BACKLIGHT_PIN;
811 #if BACKLIGHT_PIN == B7
812 # define COM1x1 COM1C1
814 #elif BACKLIGHT_PIN == B6
815 # define COM1x1 COM1B1
817 #elif BACKLIGHT_PIN == B5
818 # define COM1x1 COM1A1
821 # define NO_BACKLIGHT_CLOCK
824 #ifndef BACKLIGHT_ON_STATE
825 #define BACKLIGHT_ON_STATE 0
828 __attribute__ ((weak))
829 void backlight_init_ports(void)
832 // Setup backlight pin as output and output to on state.
834 _SFR_IO8((backlight_pin >> 4) + 1) |= _BV(backlight_pin & 0xF);
835 #if BACKLIGHT_ON_STATE == 0
837 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
840 _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
843 #ifndef NO_BACKLIGHT_CLOCK
844 // Use full 16-bit resolution.
847 // I could write a wall of text here to explain... but TL;DW
848 // Go read the ATmega32u4 datasheet.
849 // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on
851 // Pin PB7 = OCR1C (Timer 1, Channel C)
852 // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0
853 // (i.e. start high, go low when counter matches.)
854 // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0
855 // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1
857 TCCR1A = _BV(COM1x1) | _BV(WGM11); // = 0b00001010;
858 TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
862 #ifdef BACKLIGHT_BREATHING
863 breathing_defaults();
867 __attribute__ ((weak))
868 void backlight_set(uint8_t level)
870 // Prevent backlight blink on lowest level
871 // #if BACKLIGHT_ON_STATE == 0
873 // _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
876 // _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
880 #ifndef NO_BACKLIGHT_CLOCK
881 // Turn off PWM control on backlight pin, revert to output low.
882 TCCR1A &= ~(_BV(COM1x1));
885 // #if BACKLIGHT_ON_STATE == 0
887 // _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
890 // _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
894 #ifndef NO_BACKLIGHT_CLOCK
895 else if ( level == BACKLIGHT_LEVELS ) {
896 // Turn on PWM control of backlight pin
897 TCCR1A |= _BV(COM1x1);
898 // Set the brightness
902 // Turn on PWM control of backlight pin
903 TCCR1A |= _BV(COM1x1);
904 // Set the brightness
905 OCR1x = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2));
909 #ifdef BACKLIGHT_BREATHING
910 breathing_intensity_default();
914 uint8_t backlight_tick = 0;
916 void backlight_task(void) {
917 #ifdef NO_BACKLIGHT_CLOCK
918 if ((0xFFFF >> ((BACKLIGHT_LEVELS - backlight_config.level) * ((BACKLIGHT_LEVELS + 1) / 2))) & (1 << backlight_tick)) {
919 #if BACKLIGHT_ON_STATE == 0
921 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
924 _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
927 #if BACKLIGHT_ON_STATE == 0
929 _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
932 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
935 backlight_tick = (backlight_tick + 1) % 16;
939 #ifdef BACKLIGHT_BREATHING
941 #ifdef NO_BACKLIGHT_CLOCK
942 void breathing_defaults(void) {}
943 void breathing_intensity_default(void) {}
946 #define BREATHING_NO_HALT 0
947 #define BREATHING_HALT_OFF 1
948 #define BREATHING_HALT_ON 2
950 static uint8_t breath_intensity;
951 static uint8_t breath_speed;
952 static uint16_t breathing_index;
953 static uint8_t breathing_halt;
955 void breathing_enable(void)
957 if (get_backlight_level() == 0)
963 // Set breathing_index to be at the midpoint (brightest point)
964 breathing_index = 0x20 << breath_speed;
967 breathing_halt = BREATHING_NO_HALT;
969 // Enable breathing interrupt
970 TIMSK1 |= _BV(OCIE1A);
973 void breathing_pulse(void)
975 if (get_backlight_level() == 0)
981 // Set breathing_index to be at the midpoint + 1 (brightest point)
982 breathing_index = 0x21 << breath_speed;
985 breathing_halt = BREATHING_HALT_ON;
987 // Enable breathing interrupt
988 TIMSK1 |= _BV(OCIE1A);
991 void breathing_disable(void)
993 // Disable breathing interrupt
994 TIMSK1 &= ~_BV(OCIE1A);
995 backlight_set(get_backlight_level());
998 void breathing_self_disable(void)
1000 if (get_backlight_level() == 0)
1002 breathing_halt = BREATHING_HALT_OFF;
1006 breathing_halt = BREATHING_HALT_ON;
1009 //backlight_set(get_backlight_level());
1012 void breathing_toggle(void)
1014 if (!is_breathing())
1016 if (get_backlight_level() == 0)
1018 breathing_index = 0;
1022 // Set breathing_index to be at the midpoint + 1 (brightest point)
1023 breathing_index = 0x21 << breath_speed;
1026 breathing_halt = BREATHING_NO_HALT;
1029 // Toggle breathing interrupt
1030 TIMSK1 ^= _BV(OCIE1A);
1032 // Restore backlight level
1033 if (!is_breathing())
1035 backlight_set(get_backlight_level());
1039 bool is_breathing(void)
1041 return (TIMSK1 && _BV(OCIE1A));
1044 void breathing_intensity_default(void)
1046 //breath_intensity = (uint8_t)((uint16_t)100 * (uint16_t)get_backlight_level() / (uint16_t)BACKLIGHT_LEVELS);
1047 breath_intensity = ((BACKLIGHT_LEVELS - get_backlight_level()) * ((BACKLIGHT_LEVELS + 1) / 2));
1050 void breathing_intensity_set(uint8_t value)
1052 breath_intensity = value;
1055 void breathing_speed_default(void)
1060 void breathing_speed_set(uint8_t value)
1062 bool is_breathing_now = is_breathing();
1063 uint8_t old_breath_speed = breath_speed;
1065 if (is_breathing_now)
1067 // Disable breathing interrupt
1068 TIMSK1 &= ~_BV(OCIE1A);
1071 breath_speed = value;
1073 if (is_breathing_now)
1075 // Adjust index to account for new speed
1076 breathing_index = (( (uint8_t)( (breathing_index) >> old_breath_speed ) ) & 0x3F) << breath_speed;
1078 // Enable breathing interrupt
1079 TIMSK1 |= _BV(OCIE1A);
1084 void breathing_speed_inc(uint8_t value)
1086 if ((uint16_t)(breath_speed - value) > 10 )
1088 breathing_speed_set(0);
1092 breathing_speed_set(breath_speed - value);
1096 void breathing_speed_dec(uint8_t value)
1098 if ((uint16_t)(breath_speed + value) > 10 )
1100 breathing_speed_set(10);
1104 breathing_speed_set(breath_speed + value);
1108 void breathing_defaults(void)
1110 breathing_intensity_default();
1111 breathing_speed_default();
1112 breathing_halt = BREATHING_NO_HALT;
1115 /* Breathing Sleep LED brighness(PWM On period) table
1116 * (64[steps] * 4[duration]) / 64[PWM periods/s] = 4 second breath cycle
1118 * http://www.wolframalpha.com/input/?i=%28sin%28+x%2F64*pi%29**8+*+255%2C+x%3D0+to+63
1119 * (0..63).each {|x| p ((sin(x/64.0*PI)**8)*255).to_i }
1121 static const uint8_t breathing_table[64] PROGMEM = {
1122 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 6, 10,
1123 15, 23, 32, 44, 58, 74, 93, 113, 135, 157, 179, 199, 218, 233, 245, 252,
1124 255, 252, 245, 233, 218, 199, 179, 157, 135, 113, 93, 74, 58, 44, 32, 23,
1125 15, 10, 6, 4, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1128 ISR(TIMER1_COMPA_vect)
1130 // OCR1x = (pgm_read_byte(&breathing_table[ ( (uint8_t)( (breathing_index++) >> breath_speed ) ) & 0x3F ] )) * breath_intensity;
1133 uint8_t local_index = ( (uint8_t)( (breathing_index++) >> breath_speed ) ) & 0x3F;
1135 if (((breathing_halt == BREATHING_HALT_ON) && (local_index == 0x20)) || ((breathing_halt == BREATHING_HALT_OFF) && (local_index == 0x3F)))
1137 // Disable breathing interrupt
1138 TIMSK1 &= ~_BV(OCIE1A);
1141 OCR1x = (uint16_t)(((uint16_t)pgm_read_byte(&breathing_table[local_index]) * 257)) >> breath_intensity;
1145 #endif // NO_BACKLIGHT_CLOCK
1150 __attribute__ ((weak))
1151 void backlight_init_ports(void)
1156 __attribute__ ((weak))
1157 void backlight_set(uint8_t level)
1165 // Functions for spitting out values
1168 void send_dword(uint32_t number) { // this might not actually work
1169 uint16_t word = (number >> 16);
1171 send_word(number & 0xFFFFUL);
1174 void send_word(uint16_t number) {
1175 uint8_t byte = number >> 8;
1177 send_byte(number & 0xFF);
1180 void send_byte(uint8_t number) {
1181 uint8_t nibble = number >> 4;
1182 send_nibble(nibble);
1183 send_nibble(number & 0xF);
1186 void send_nibble(uint8_t number) {
1189 register_code(KC_0);
1190 unregister_code(KC_0);
1193 register_code(KC_1 + (number - 1));
1194 unregister_code(KC_1 + (number - 1));
1197 register_code(KC_A + (number - 0xA));
1198 unregister_code(KC_A + (number - 0xA));
1204 __attribute__((weak))
1205 uint16_t hex_to_keycode(uint8_t hex)
1210 } else if (hex < 0xA) {
1211 return KC_1 + (hex - 0x1);
1213 return KC_A + (hex - 0xA);
1217 void api_send_unicode(uint32_t unicode) {
1220 dword_to_bytes(unicode, chunk);
1221 MT_SEND_DATA(DT_UNICODE, chunk, 5);
1225 __attribute__ ((weak))
1226 void led_set_user(uint8_t usb_led) {
1230 __attribute__ ((weak))
1231 void led_set_kb(uint8_t usb_led) {
1232 led_set_user(usb_led);
1235 __attribute__ ((weak))
1236 void led_init_ports(void)
1241 __attribute__ ((weak))
1242 void led_set(uint8_t usb_led)
1247 // // Using PE6 Caps Lock LED
1248 // if (usb_led & (1<<USB_LED_CAPS_LOCK))
1258 // PORTE &= ~(1<<6);
1261 led_set_kb(usb_led);
1265 //------------------------------------------------------------------------------
1266 // Override these functions in your keymap file to play different tunes on
1267 // different events such as startup and bootloader jump
1269 __attribute__ ((weak))
1270 void startup_user() {}
1272 __attribute__ ((weak))
1273 void shutdown_user() {}
1275 //------------------------------------------------------------------------------