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 // Shift / Enter setup
167 #define SFTENT_KEY KC_ENT
170 static bool shift_interrupted[2] = {0, 0};
171 static uint16_t scs_timer[2] = {0, 0};
173 /* true if the last press of GRAVE_ESC was shifted (i.e. GUI or SHIFT were pressed), false otherwise.
174 * Used to ensure that the correct keycode is released if the key is released.
176 static bool grave_esc_was_shifted = false;
178 bool process_record_quantum(keyrecord_t *record) {
180 /* This gets the keycode from the key pressed */
181 keypos_t key = record->event.key;
184 #if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
185 /* TODO: Use store_or_get_action() or a similar function. */
186 if (!disable_action_cache) {
189 if (record->event.pressed) {
190 layer = layer_switch_get_layer(key);
191 update_source_layers_cache(key, layer);
193 layer = read_source_layers_cache(key);
195 keycode = keymap_key_to_keycode(layer, key);
198 keycode = keymap_key_to_keycode(layer_switch_get_layer(key), key);
200 // This is how you use actions here
201 // if (keycode == KC_LEAD) {
203 // action.code = ACTION_DEFAULT_LAYER_SET(0);
204 // process_action(record, action);
209 #if defined(KEY_LOCK_ENABLE)
210 // Must run first to be able to mask key_up events.
211 process_key_lock(&keycode, record) &&
213 process_record_kb(keycode, record) &&
214 #if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED)
215 process_midi(keycode, record) &&
218 process_audio(keycode, record) &&
221 process_steno(keycode, record) &&
223 #if defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC))
224 process_music(keycode, record) &&
226 #ifdef TAP_DANCE_ENABLE
227 process_tap_dance(keycode, record) &&
229 #ifndef DISABLE_LEADER
230 process_leader(keycode, record) &&
232 #ifndef DISABLE_CHORDING
233 process_chording(keycode, record) &&
236 process_combo(keycode, record) &&
238 #ifdef UNICODE_ENABLE
239 process_unicode(keycode, record) &&
242 process_ucis(keycode, record) &&
244 #ifdef PRINTING_ENABLE
245 process_printer(keycode, record) &&
247 #ifdef AUTO_SHIFT_ENABLE
248 process_auto_shift(keycode, record) &&
250 #ifdef UNICODEMAP_ENABLE
251 process_unicode_map(keycode, record) &&
253 #ifdef TERMINAL_ENABLE
254 process_terminal(keycode, record) &&
260 // Shift / paren setup
264 if (record->event.pressed) {
269 if (record->event.pressed) {
271 print("DEBUG: enabled.\n");
274 #ifdef FAUXCLICKY_ENABLE
276 if (record->event.pressed) {
281 if (record->event.pressed) {
286 if (record->event.pressed) {
291 #ifdef RGBLIGHT_ENABLE
293 if (record->event.pressed) {
297 case RGB_MODE_FORWARD:
298 if (record->event.pressed) {
299 uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT));
301 rgblight_step_reverse();
308 case RGB_MODE_REVERSE:
309 if (record->event.pressed) {
310 uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT));
315 rgblight_step_reverse();
320 if (record->event.pressed) {
321 rgblight_increase_hue();
325 if (record->event.pressed) {
326 rgblight_decrease_hue();
330 if (record->event.pressed) {
331 rgblight_increase_sat();
335 if (record->event.pressed) {
336 rgblight_decrease_sat();
340 if (record->event.pressed) {
341 rgblight_increase_val();
345 if (record->event.pressed) {
346 rgblight_decrease_val();
350 if (record->event.pressed) {
354 case RGB_MODE_BREATHE:
355 if (record->event.pressed) {
356 if ((2 <= rgblight_get_mode()) && (rgblight_get_mode() < 5)) {
363 case RGB_MODE_RAINBOW:
364 if (record->event.pressed) {
365 if ((6 <= rgblight_get_mode()) && (rgblight_get_mode() < 8)) {
373 if (record->event.pressed) {
374 if ((9 <= rgblight_get_mode()) && (rgblight_get_mode() < 14)) {
382 if (record->event.pressed) {
383 if ((15 <= rgblight_get_mode()) && (rgblight_get_mode() < 20)) {
390 case RGB_MODE_KNIGHT:
391 if (record->event.pressed) {
392 if ((21 <= rgblight_get_mode()) && (rgblight_get_mode() < 23)) {
400 if (record->event.pressed) {
404 case RGB_MODE_GRADIENT:
405 if (record->event.pressed) {
406 if ((25 <= rgblight_get_mode()) && (rgblight_get_mode() < 34)) {
416 if (record->event.pressed) {
417 set_output(OUTPUT_AUTO);
421 if (record->event.pressed) {
422 set_output(OUTPUT_USB);
425 #ifdef BLUETOOTH_ENABLE
427 if (record->event.pressed) {
428 set_output(OUTPUT_BLUETOOTH);
433 case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_TOGGLE_NKRO:
434 if (record->event.pressed) {
435 // MAGIC actions (BOOTMAGIC without the boot)
436 if (!eeconfig_is_enabled()) {
440 keymap_config.raw = eeconfig_read_keymap();
443 case MAGIC_SWAP_CONTROL_CAPSLOCK:
444 keymap_config.swap_control_capslock = true;
446 case MAGIC_CAPSLOCK_TO_CONTROL:
447 keymap_config.capslock_to_control = true;
449 case MAGIC_SWAP_LALT_LGUI:
450 keymap_config.swap_lalt_lgui = true;
452 case MAGIC_SWAP_RALT_RGUI:
453 keymap_config.swap_ralt_rgui = true;
456 keymap_config.no_gui = true;
458 case MAGIC_SWAP_GRAVE_ESC:
459 keymap_config.swap_grave_esc = true;
461 case MAGIC_SWAP_BACKSLASH_BACKSPACE:
462 keymap_config.swap_backslash_backspace = true;
464 case MAGIC_HOST_NKRO:
465 keymap_config.nkro = true;
467 case MAGIC_SWAP_ALT_GUI:
468 keymap_config.swap_lalt_lgui = true;
469 keymap_config.swap_ralt_rgui = true;
471 PLAY_SONG(ag_swap_song);
474 case MAGIC_UNSWAP_CONTROL_CAPSLOCK:
475 keymap_config.swap_control_capslock = false;
477 case MAGIC_UNCAPSLOCK_TO_CONTROL:
478 keymap_config.capslock_to_control = false;
480 case MAGIC_UNSWAP_LALT_LGUI:
481 keymap_config.swap_lalt_lgui = false;
483 case MAGIC_UNSWAP_RALT_RGUI:
484 keymap_config.swap_ralt_rgui = false;
487 keymap_config.no_gui = false;
489 case MAGIC_UNSWAP_GRAVE_ESC:
490 keymap_config.swap_grave_esc = false;
492 case MAGIC_UNSWAP_BACKSLASH_BACKSPACE:
493 keymap_config.swap_backslash_backspace = false;
495 case MAGIC_UNHOST_NKRO:
496 keymap_config.nkro = false;
498 case MAGIC_UNSWAP_ALT_GUI:
499 keymap_config.swap_lalt_lgui = false;
500 keymap_config.swap_ralt_rgui = false;
502 PLAY_SONG(ag_norm_song);
505 case MAGIC_TOGGLE_NKRO:
506 keymap_config.nkro = !keymap_config.nkro;
511 eeconfig_update_keymap(keymap_config.raw);
512 clear_keyboard(); // clear to prevent stuck keys
518 if (record->event.pressed) {
519 shift_interrupted[0] = false;
520 scs_timer[0] = timer_read ();
521 register_mods(MOD_BIT(KC_LSFT));
524 #ifdef DISABLE_SPACE_CADET_ROLLOVER
525 if (get_mods() & MOD_BIT(KC_RSFT)) {
526 shift_interrupted[0] = true;
527 shift_interrupted[1] = true;
530 if (!shift_interrupted[0] && timer_elapsed(scs_timer[0]) < TAPPING_TERM) {
531 register_code(LSPO_KEY);
532 unregister_code(LSPO_KEY);
534 unregister_mods(MOD_BIT(KC_LSFT));
540 if (record->event.pressed) {
541 shift_interrupted[1] = false;
542 scs_timer[1] = timer_read ();
543 register_mods(MOD_BIT(KC_RSFT));
546 #ifdef DISABLE_SPACE_CADET_ROLLOVER
547 if (get_mods() & MOD_BIT(KC_LSFT)) {
548 shift_interrupted[0] = true;
549 shift_interrupted[1] = true;
552 if (!shift_interrupted[1] && timer_elapsed(scs_timer[1]) < TAPPING_TERM) {
553 register_code(RSPC_KEY);
554 unregister_code(RSPC_KEY);
556 unregister_mods(MOD_BIT(KC_RSFT));
562 if (record->event.pressed) {
563 shift_interrupted[1] = false;
564 scs_timer[1] = timer_read ();
565 register_mods(MOD_BIT(KC_RSFT));
567 else if (!shift_interrupted[1] && timer_elapsed(scs_timer[1]) < TAPPING_TERM) {
568 unregister_mods(MOD_BIT(KC_RSFT));
569 register_code(SFTENT_KEY);
570 unregister_code(SFTENT_KEY);
573 unregister_mods(MOD_BIT(KC_RSFT));
579 uint8_t shifted = get_mods() & ((MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)
580 |MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)));
582 #ifdef GRAVE_ESC_ALT_OVERRIDE
583 // if ALT is pressed, ESC is always sent
584 // this is handy for the cmd+opt+esc shortcut on macOS, among other things.
585 if (get_mods() & (MOD_BIT(KC_LALT) | MOD_BIT(KC_RALT))) {
590 #ifdef GRAVE_ESC_CTRL_OVERRIDE
591 // if CTRL is pressed, ESC is always sent
592 // this is handy for the ctrl+shift+esc shortcut on windows, among other things.
593 if (get_mods() & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL))) {
598 #ifdef GRAVE_ESC_GUI_OVERRIDE
599 // if GUI is pressed, ESC is always sent
600 if (get_mods() & (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI))) {
605 #ifdef GRAVE_ESC_SHIFT_OVERRIDE
606 // if SHIFT is pressed, ESC is always sent
607 if (get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
612 if (record->event.pressed) {
613 grave_esc_was_shifted = shifted;
614 add_key(shifted ? KC_GRAVE : KC_ESCAPE);
617 del_key(grave_esc_was_shifted ? KC_GRAVE : KC_ESCAPE);
620 send_keyboard_report();
623 shift_interrupted[0] = true;
624 shift_interrupted[1] = true;
629 return process_action_kb(record);
632 __attribute__ ((weak))
633 const bool ascii_to_shift_lut[0x80] PROGMEM = {
634 0, 0, 0, 0, 0, 0, 0, 0,
635 0, 0, 0, 0, 0, 0, 0, 0,
636 0, 0, 0, 0, 0, 0, 0, 0,
637 0, 0, 0, 0, 0, 0, 0, 0,
638 0, 1, 1, 1, 1, 1, 1, 0,
639 1, 1, 1, 1, 0, 0, 0, 0,
640 0, 0, 0, 0, 0, 0, 0, 0,
641 0, 0, 1, 0, 1, 0, 1, 1,
642 1, 1, 1, 1, 1, 1, 1, 1,
643 1, 1, 1, 1, 1, 1, 1, 1,
644 1, 1, 1, 1, 1, 1, 1, 1,
645 1, 1, 1, 0, 0, 0, 1, 1,
646 0, 0, 0, 0, 0, 0, 0, 0,
647 0, 0, 0, 0, 0, 0, 0, 0,
648 0, 0, 0, 0, 0, 0, 0, 0,
649 0, 0, 0, 1, 1, 1, 1, 0
652 __attribute__ ((weak))
653 const uint8_t ascii_to_keycode_lut[0x80] PROGMEM = {
654 0, 0, 0, 0, 0, 0, 0, 0,
655 KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0,
656 0, 0, 0, 0, 0, 0, 0, 0,
657 0, 0, 0, KC_ESC, 0, 0, 0, 0,
658 KC_SPC, KC_1, KC_QUOT, KC_3, KC_4, KC_5, KC_7, KC_QUOT,
659 KC_9, KC_0, KC_8, KC_EQL, KC_COMM, KC_MINS, KC_DOT, KC_SLSH,
660 KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
661 KC_8, KC_9, KC_SCLN, KC_SCLN, KC_COMM, KC_EQL, KC_DOT, KC_SLSH,
662 KC_2, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
663 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
664 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
665 KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_6, KC_MINS,
666 KC_GRV, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
667 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
668 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
669 KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL
672 void send_string(const char *str) {
673 send_string_with_delay(str, 0);
676 void send_string_P(const char *str) {
677 send_string_with_delay_P(str, 0);
680 void send_string_with_delay(const char *str, uint8_t interval) {
682 char ascii_code = *str;
683 if (!ascii_code) break;
684 if (ascii_code == 1) {
686 uint8_t keycode = *(++str);
687 register_code(keycode);
688 unregister_code(keycode);
689 } else if (ascii_code == 2) {
691 uint8_t keycode = *(++str);
692 register_code(keycode);
693 } else if (ascii_code == 3) {
695 uint8_t keycode = *(++str);
696 unregister_code(keycode);
698 send_char(ascii_code);
702 { uint8_t ms = interval; while (ms--) wait_ms(1); }
706 void send_string_with_delay_P(const char *str, uint8_t interval) {
708 char ascii_code = pgm_read_byte(str);
709 if (!ascii_code) break;
710 if (ascii_code == 1) {
712 uint8_t keycode = pgm_read_byte(++str);
713 register_code(keycode);
714 unregister_code(keycode);
715 } else if (ascii_code == 2) {
717 uint8_t keycode = pgm_read_byte(++str);
718 register_code(keycode);
719 } else if (ascii_code == 3) {
721 uint8_t keycode = pgm_read_byte(++str);
722 unregister_code(keycode);
724 send_char(ascii_code);
728 { uint8_t ms = interval; while (ms--) wait_ms(1); }
732 void send_char(char ascii_code) {
734 keycode = pgm_read_byte(&ascii_to_keycode_lut[(uint8_t)ascii_code]);
735 if (pgm_read_byte(&ascii_to_shift_lut[(uint8_t)ascii_code])) {
736 register_code(KC_LSFT);
737 register_code(keycode);
738 unregister_code(keycode);
739 unregister_code(KC_LSFT);
741 register_code(keycode);
742 unregister_code(keycode);
746 void set_single_persistent_default_layer(uint8_t default_layer) {
747 #if defined(AUDIO_ENABLE) && defined(DEFAULT_LAYER_SONGS)
748 PLAY_SONG(default_layer_songs[default_layer]);
750 eeconfig_update_default_layer(1U<<default_layer);
751 default_layer_set(1U<<default_layer);
754 void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
755 if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
762 void tap_random_base64(void) {
763 #if defined(__AVR_ATmega32U4__)
764 uint8_t key = (TCNT0 + TCNT1 + TCNT3 + TCNT4) % 64;
766 uint8_t key = rand() % 64;
770 register_code(KC_LSFT);
771 register_code(key + KC_A);
772 unregister_code(key + KC_A);
773 unregister_code(KC_LSFT);
776 register_code(key - 26 + KC_A);
777 unregister_code(key - 26 + KC_A);
781 unregister_code(KC_0);
784 register_code(key - 53 + KC_1);
785 unregister_code(key - 53 + KC_1);
788 register_code(KC_LSFT);
789 register_code(KC_EQL);
790 unregister_code(KC_EQL);
791 unregister_code(KC_LSFT);
794 register_code(KC_SLSH);
795 unregister_code(KC_SLSH);
800 void matrix_init_quantum() {
801 #ifdef BACKLIGHT_ENABLE
802 backlight_init_ports();
810 void matrix_scan_quantum() {
815 #ifdef TAP_DANCE_ENABLE
816 matrix_scan_tap_dance();
823 #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_PIN)
830 #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_PIN)
832 static const uint8_t backlight_pin = BACKLIGHT_PIN;
834 #if BACKLIGHT_PIN == B7
835 # define COM1x1 COM1C1
837 #elif BACKLIGHT_PIN == B6
838 # define COM1x1 COM1B1
840 #elif BACKLIGHT_PIN == B5
841 # define COM1x1 COM1A1
844 # define NO_BACKLIGHT_CLOCK
847 #ifndef BACKLIGHT_ON_STATE
848 #define BACKLIGHT_ON_STATE 0
851 __attribute__ ((weak))
852 void backlight_init_ports(void)
855 // Setup backlight pin as output and output to on state.
857 _SFR_IO8((backlight_pin >> 4) + 1) |= _BV(backlight_pin & 0xF);
858 #if BACKLIGHT_ON_STATE == 0
860 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
863 _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
866 #ifndef NO_BACKLIGHT_CLOCK
867 // Use full 16-bit resolution.
870 // I could write a wall of text here to explain... but TL;DW
871 // Go read the ATmega32u4 datasheet.
872 // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on
874 // Pin PB7 = OCR1C (Timer 1, Channel C)
875 // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0
876 // (i.e. start high, go low when counter matches.)
877 // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0
878 // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1
880 TCCR1A = _BV(COM1x1) | _BV(WGM11); // = 0b00001010;
881 TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
885 #ifdef BACKLIGHT_BREATHING
886 breathing_defaults();
890 __attribute__ ((weak))
891 void backlight_set(uint8_t level)
893 // Prevent backlight blink on lowest level
894 // #if BACKLIGHT_ON_STATE == 0
896 // _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
899 // _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
903 #ifndef NO_BACKLIGHT_CLOCK
904 // Turn off PWM control on backlight pin, revert to output low.
905 TCCR1A &= ~(_BV(COM1x1));
908 // #if BACKLIGHT_ON_STATE == 0
910 // _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
913 // _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
917 #ifndef NO_BACKLIGHT_CLOCK
918 else if ( level == BACKLIGHT_LEVELS ) {
919 // Turn on PWM control of backlight pin
920 TCCR1A |= _BV(COM1x1);
921 // Set the brightness
925 // Turn on PWM control of backlight pin
926 TCCR1A |= _BV(COM1x1);
927 // Set the brightness
928 OCR1x = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2));
932 #ifdef BACKLIGHT_BREATHING
933 breathing_intensity_default();
937 uint8_t backlight_tick = 0;
939 void backlight_task(void) {
940 #ifdef NO_BACKLIGHT_CLOCK
941 if ((0xFFFF >> ((BACKLIGHT_LEVELS - backlight_config.level) * ((BACKLIGHT_LEVELS + 1) / 2))) & (1 << backlight_tick)) {
942 #if BACKLIGHT_ON_STATE == 0
944 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
947 _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
950 #if BACKLIGHT_ON_STATE == 0
952 _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
955 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
958 backlight_tick = (backlight_tick + 1) % 16;
962 #ifdef BACKLIGHT_BREATHING
964 #ifdef NO_BACKLIGHT_CLOCK
965 void breathing_defaults(void) {}
966 void breathing_intensity_default(void) {}
969 #define BREATHING_NO_HALT 0
970 #define BREATHING_HALT_OFF 1
971 #define BREATHING_HALT_ON 2
973 static uint8_t breath_intensity;
974 static uint8_t breath_speed;
975 static uint16_t breathing_index;
976 static uint8_t breathing_halt;
978 void breathing_enable(void)
980 if (get_backlight_level() == 0)
986 // Set breathing_index to be at the midpoint (brightest point)
987 breathing_index = 0x20 << breath_speed;
990 breathing_halt = BREATHING_NO_HALT;
992 // Enable breathing interrupt
993 TIMSK1 |= _BV(OCIE1A);
996 void breathing_pulse(void)
998 if (get_backlight_level() == 0)
1000 breathing_index = 0;
1004 // Set breathing_index to be at the midpoint + 1 (brightest point)
1005 breathing_index = 0x21 << breath_speed;
1008 breathing_halt = BREATHING_HALT_ON;
1010 // Enable breathing interrupt
1011 TIMSK1 |= _BV(OCIE1A);
1014 void breathing_disable(void)
1016 // Disable breathing interrupt
1017 TIMSK1 &= ~_BV(OCIE1A);
1018 backlight_set(get_backlight_level());
1021 void breathing_self_disable(void)
1023 if (get_backlight_level() == 0)
1025 breathing_halt = BREATHING_HALT_OFF;
1029 breathing_halt = BREATHING_HALT_ON;
1032 //backlight_set(get_backlight_level());
1035 void breathing_toggle(void)
1037 if (!is_breathing())
1039 if (get_backlight_level() == 0)
1041 breathing_index = 0;
1045 // Set breathing_index to be at the midpoint + 1 (brightest point)
1046 breathing_index = 0x21 << breath_speed;
1049 breathing_halt = BREATHING_NO_HALT;
1052 // Toggle breathing interrupt
1053 TIMSK1 ^= _BV(OCIE1A);
1055 // Restore backlight level
1056 if (!is_breathing())
1058 backlight_set(get_backlight_level());
1062 bool is_breathing(void)
1064 return (TIMSK1 && _BV(OCIE1A));
1067 void breathing_intensity_default(void)
1069 //breath_intensity = (uint8_t)((uint16_t)100 * (uint16_t)get_backlight_level() / (uint16_t)BACKLIGHT_LEVELS);
1070 breath_intensity = ((BACKLIGHT_LEVELS - get_backlight_level()) * ((BACKLIGHT_LEVELS + 1) / 2));
1073 void breathing_intensity_set(uint8_t value)
1075 breath_intensity = value;
1078 void breathing_speed_default(void)
1083 void breathing_speed_set(uint8_t value)
1085 bool is_breathing_now = is_breathing();
1086 uint8_t old_breath_speed = breath_speed;
1088 if (is_breathing_now)
1090 // Disable breathing interrupt
1091 TIMSK1 &= ~_BV(OCIE1A);
1094 breath_speed = value;
1096 if (is_breathing_now)
1098 // Adjust index to account for new speed
1099 breathing_index = (( (uint8_t)( (breathing_index) >> old_breath_speed ) ) & 0x3F) << breath_speed;
1101 // Enable breathing interrupt
1102 TIMSK1 |= _BV(OCIE1A);
1107 void breathing_speed_inc(uint8_t value)
1109 if ((uint16_t)(breath_speed - value) > 10 )
1111 breathing_speed_set(0);
1115 breathing_speed_set(breath_speed - value);
1119 void breathing_speed_dec(uint8_t value)
1121 if ((uint16_t)(breath_speed + value) > 10 )
1123 breathing_speed_set(10);
1127 breathing_speed_set(breath_speed + value);
1131 void breathing_defaults(void)
1133 breathing_intensity_default();
1134 breathing_speed_default();
1135 breathing_halt = BREATHING_NO_HALT;
1138 /* Breathing Sleep LED brighness(PWM On period) table
1139 * (64[steps] * 4[duration]) / 64[PWM periods/s] = 4 second breath cycle
1141 * http://www.wolframalpha.com/input/?i=%28sin%28+x%2F64*pi%29**8+*+255%2C+x%3D0+to+63
1142 * (0..63).each {|x| p ((sin(x/64.0*PI)**8)*255).to_i }
1144 static const uint8_t breathing_table[64] PROGMEM = {
1145 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 6, 10,
1146 15, 23, 32, 44, 58, 74, 93, 113, 135, 157, 179, 199, 218, 233, 245, 252,
1147 255, 252, 245, 233, 218, 199, 179, 157, 135, 113, 93, 74, 58, 44, 32, 23,
1148 15, 10, 6, 4, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1151 ISR(TIMER1_COMPA_vect)
1153 // OCR1x = (pgm_read_byte(&breathing_table[ ( (uint8_t)( (breathing_index++) >> breath_speed ) ) & 0x3F ] )) * breath_intensity;
1156 uint8_t local_index = ( (uint8_t)( (breathing_index++) >> breath_speed ) ) & 0x3F;
1158 if (((breathing_halt == BREATHING_HALT_ON) && (local_index == 0x20)) || ((breathing_halt == BREATHING_HALT_OFF) && (local_index == 0x3F)))
1160 // Disable breathing interrupt
1161 TIMSK1 &= ~_BV(OCIE1A);
1164 OCR1x = (uint16_t)(((uint16_t)pgm_read_byte(&breathing_table[local_index]) * 257)) >> breath_intensity;
1168 #endif // NO_BACKLIGHT_CLOCK
1173 __attribute__ ((weak))
1174 void backlight_init_ports(void)
1179 __attribute__ ((weak))
1180 void backlight_set(uint8_t level)
1188 // Functions for spitting out values
1191 void send_dword(uint32_t number) { // this might not actually work
1192 uint16_t word = (number >> 16);
1194 send_word(number & 0xFFFFUL);
1197 void send_word(uint16_t number) {
1198 uint8_t byte = number >> 8;
1200 send_byte(number & 0xFF);
1203 void send_byte(uint8_t number) {
1204 uint8_t nibble = number >> 4;
1205 send_nibble(nibble);
1206 send_nibble(number & 0xF);
1209 void send_nibble(uint8_t number) {
1212 register_code(KC_0);
1213 unregister_code(KC_0);
1216 register_code(KC_1 + (number - 1));
1217 unregister_code(KC_1 + (number - 1));
1220 register_code(KC_A + (number - 0xA));
1221 unregister_code(KC_A + (number - 0xA));
1227 __attribute__((weak))
1228 uint16_t hex_to_keycode(uint8_t hex)
1233 } else if (hex < 0xA) {
1234 return KC_1 + (hex - 0x1);
1236 return KC_A + (hex - 0xA);
1240 void api_send_unicode(uint32_t unicode) {
1243 dword_to_bytes(unicode, chunk);
1244 MT_SEND_DATA(DT_UNICODE, chunk, 5);
1248 __attribute__ ((weak))
1249 void led_set_user(uint8_t usb_led) {
1253 __attribute__ ((weak))
1254 void led_set_kb(uint8_t usb_led) {
1255 led_set_user(usb_led);
1258 __attribute__ ((weak))
1259 void led_init_ports(void)
1264 __attribute__ ((weak))
1265 void led_set(uint8_t usb_led)
1270 // // Using PE6 Caps Lock LED
1271 // if (usb_led & (1<<USB_LED_CAPS_LOCK))
1281 // PORTE &= ~(1<<6);
1284 led_set_kb(usb_led);
1288 //------------------------------------------------------------------------------
1289 // Override these functions in your keymap file to play different tunes on
1290 // different events such as startup and bootloader jump
1292 __attribute__ ((weak))
1293 void startup_user() {}
1295 __attribute__ ((weak))
1296 void shutdown_user() {}
1298 //------------------------------------------------------------------------------