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 #ifndef DEFAULT_LAYER_SONGS
44 #define DEFAULT_LAYER_SONGS { }
46 float goodbye_song[][2] = GOODBYE_SONG;
47 float ag_norm_song[][2] = AG_NORM_SONG;
48 float ag_swap_song[][2] = AG_SWAP_SONG;
49 float default_layer_songs[][16][2] = DEFAULT_LAYER_SONGS;
52 static void do_code16 (uint16_t code, void (*f) (uint8_t)) {
54 case QK_MODS ... QK_MODS_MAX:
69 if (code < QK_RMODS_MIN) return;
81 static inline void qk_register_weak_mods(uint8_t kc) {
82 add_weak_mods(MOD_BIT(kc));
83 send_keyboard_report();
86 static inline void qk_unregister_weak_mods(uint8_t kc) {
87 del_weak_mods(MOD_BIT(kc));
88 send_keyboard_report();
91 static inline void qk_register_mods(uint8_t kc) {
92 add_weak_mods(MOD_BIT(kc));
93 send_keyboard_report();
96 static inline void qk_unregister_mods(uint8_t kc) {
97 del_weak_mods(MOD_BIT(kc));
98 send_keyboard_report();
101 void register_code16 (uint16_t code) {
102 if (IS_MOD(code) || code == KC_NO) {
103 do_code16 (code, qk_register_mods);
105 do_code16 (code, qk_register_weak_mods);
107 register_code (code);
110 void unregister_code16 (uint16_t code) {
111 unregister_code (code);
112 if (IS_MOD(code) || code == KC_NO) {
113 do_code16 (code, qk_unregister_mods);
115 do_code16 (code, qk_unregister_weak_mods);
119 __attribute__ ((weak))
120 bool process_action_kb(keyrecord_t *record) {
124 __attribute__ ((weak))
125 bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
126 return process_record_user(keycode, record);
129 __attribute__ ((weak))
130 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
134 void reset_keyboard(void) {
136 #if defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_ENABLE_BASIC))
137 music_all_notes_off();
138 uint16_t timer_start = timer_read();
139 PLAY_SONG(goodbye_song);
141 while(timer_elapsed(timer_start) < 250)
147 #ifdef CATERINA_BOOTLOADER
148 *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific
153 // Shift / paren setup
156 #define LSPO_KEY KC_9
159 #define RSPC_KEY KC_0
162 static bool shift_interrupted[2] = {0, 0};
163 static uint16_t scs_timer[2] = {0, 0};
165 bool process_record_quantum(keyrecord_t *record) {
167 /* This gets the keycode from the key pressed */
168 keypos_t key = record->event.key;
171 #if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
172 /* TODO: Use store_or_get_action() or a similar function. */
173 if (!disable_action_cache) {
176 if (record->event.pressed) {
177 layer = layer_switch_get_layer(key);
178 update_source_layers_cache(key, layer);
180 layer = read_source_layers_cache(key);
182 keycode = keymap_key_to_keycode(layer, key);
185 keycode = keymap_key_to_keycode(layer_switch_get_layer(key), key);
187 // This is how you use actions here
188 // if (keycode == KC_LEAD) {
190 // action.code = ACTION_DEFAULT_LAYER_SET(0);
191 // process_action(record, action);
196 process_record_kb(keycode, record) &&
197 #if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED)
198 process_midi(keycode, record) &&
201 process_audio(keycode, record) &&
204 process_steno(keycode, record) &&
206 #if defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC))
207 process_music(keycode, record) &&
209 #ifdef TAP_DANCE_ENABLE
210 process_tap_dance(keycode, record) &&
212 #ifndef DISABLE_LEADER
213 process_leader(keycode, record) &&
215 #ifndef DISABLE_CHORDING
216 process_chording(keycode, record) &&
219 process_combo(keycode, record) &&
221 #ifdef UNICODE_ENABLE
222 process_unicode(keycode, record) &&
225 process_ucis(keycode, record) &&
227 #ifdef PRINTING_ENABLE
228 process_printer(keycode, record) &&
230 #ifdef UNICODEMAP_ENABLE
231 process_unicode_map(keycode, record) &&
237 // Shift / paren setup
241 if (record->event.pressed) {
247 if (record->event.pressed) {
248 print("\nDEBUG: enabled.\n");
253 #ifdef FAUXCLICKY_ENABLE
255 if (record->event.pressed) {
261 if (record->event.pressed) {
267 if (record->event.pressed) {
273 #ifdef RGBLIGHT_ENABLE
275 if (record->event.pressed) {
281 if (record->event.pressed) {
287 if (record->event.pressed) {
288 rgblight_increase_hue();
293 if (record->event.pressed) {
294 rgblight_decrease_hue();
299 if (record->event.pressed) {
300 rgblight_increase_sat();
305 if (record->event.pressed) {
306 rgblight_decrease_sat();
311 if (record->event.pressed) {
312 rgblight_increase_val();
317 if (record->event.pressed) {
318 rgblight_decrease_val();
325 if (record->event.pressed) {
326 set_output(OUTPUT_AUTO);
331 if (record->event.pressed) {
332 set_output(OUTPUT_USB);
336 #ifdef BLUETOOTH_ENABLE
338 if (record->event.pressed) {
339 set_output(OUTPUT_BLUETOOTH);
345 case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_TOGGLE_NKRO:
346 if (record->event.pressed) {
347 // MAGIC actions (BOOTMAGIC without the boot)
348 if (!eeconfig_is_enabled()) {
352 keymap_config.raw = eeconfig_read_keymap();
355 case MAGIC_SWAP_CONTROL_CAPSLOCK:
356 keymap_config.swap_control_capslock = true;
358 case MAGIC_CAPSLOCK_TO_CONTROL:
359 keymap_config.capslock_to_control = true;
361 case MAGIC_SWAP_LALT_LGUI:
362 keymap_config.swap_lalt_lgui = true;
364 case MAGIC_SWAP_RALT_RGUI:
365 keymap_config.swap_ralt_rgui = true;
368 keymap_config.no_gui = true;
370 case MAGIC_SWAP_GRAVE_ESC:
371 keymap_config.swap_grave_esc = true;
373 case MAGIC_SWAP_BACKSLASH_BACKSPACE:
374 keymap_config.swap_backslash_backspace = true;
376 case MAGIC_HOST_NKRO:
377 keymap_config.nkro = true;
379 case MAGIC_SWAP_ALT_GUI:
380 keymap_config.swap_lalt_lgui = true;
381 keymap_config.swap_ralt_rgui = true;
383 PLAY_SONG(ag_swap_song);
386 case MAGIC_UNSWAP_CONTROL_CAPSLOCK:
387 keymap_config.swap_control_capslock = false;
389 case MAGIC_UNCAPSLOCK_TO_CONTROL:
390 keymap_config.capslock_to_control = false;
392 case MAGIC_UNSWAP_LALT_LGUI:
393 keymap_config.swap_lalt_lgui = false;
395 case MAGIC_UNSWAP_RALT_RGUI:
396 keymap_config.swap_ralt_rgui = false;
399 keymap_config.no_gui = false;
401 case MAGIC_UNSWAP_GRAVE_ESC:
402 keymap_config.swap_grave_esc = false;
404 case MAGIC_UNSWAP_BACKSLASH_BACKSPACE:
405 keymap_config.swap_backslash_backspace = false;
407 case MAGIC_UNHOST_NKRO:
408 keymap_config.nkro = false;
410 case MAGIC_UNSWAP_ALT_GUI:
411 keymap_config.swap_lalt_lgui = false;
412 keymap_config.swap_ralt_rgui = false;
414 PLAY_SONG(ag_norm_song);
417 case MAGIC_TOGGLE_NKRO:
418 keymap_config.nkro = !keymap_config.nkro;
423 eeconfig_update_keymap(keymap_config.raw);
424 clear_keyboard(); // clear to prevent stuck keys
430 if (record->event.pressed) {
431 shift_interrupted[0] = false;
432 scs_timer[0] = timer_read ();
433 register_mods(MOD_BIT(KC_LSFT));
436 #ifdef DISABLE_SPACE_CADET_ROLLOVER
437 if (get_mods() & MOD_BIT(KC_RSFT)) {
438 shift_interrupted[0] = true;
439 shift_interrupted[1] = true;
442 if (!shift_interrupted[0] && timer_elapsed(scs_timer[0]) < TAPPING_TERM) {
443 register_code(LSPO_KEY);
444 unregister_code(LSPO_KEY);
446 unregister_mods(MOD_BIT(KC_LSFT));
453 if (record->event.pressed) {
454 shift_interrupted[1] = false;
455 scs_timer[1] = timer_read ();
456 register_mods(MOD_BIT(KC_RSFT));
459 #ifdef DISABLE_SPACE_CADET_ROLLOVER
460 if (get_mods() & MOD_BIT(KC_LSFT)) {
461 shift_interrupted[0] = true;
462 shift_interrupted[1] = true;
465 if (!shift_interrupted[1] && timer_elapsed(scs_timer[1]) < TAPPING_TERM) {
466 register_code(RSPC_KEY);
467 unregister_code(RSPC_KEY);
469 unregister_mods(MOD_BIT(KC_RSFT));
475 void (*method)(uint8_t) = (record->event.pressed) ? &add_key : &del_key;
476 uint8_t shifted = get_mods() & ((MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)
477 |MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)));
479 #ifdef GRAVE_ESC_CTRL_OVERRIDE
480 // if CTRL is pressed, ESC is always read as ESC, even if SHIFT or GUI is pressed.
481 // this is handy for the ctrl+shift+esc shortcut on windows, among other things.
482 if (get_mods() & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL)))
486 method(shifted ? KC_GRAVE : KC_ESCAPE);
487 send_keyboard_report();
490 shift_interrupted[0] = true;
491 shift_interrupted[1] = true;
496 return process_action_kb(record);
499 __attribute__ ((weak))
500 const bool ascii_to_shift_lut[0x80] PROGMEM = {
501 0, 0, 0, 0, 0, 0, 0, 0,
502 0, 0, 0, 0, 0, 0, 0, 0,
503 0, 0, 0, 0, 0, 0, 0, 0,
504 0, 0, 0, 0, 0, 0, 0, 0,
505 0, 1, 1, 1, 1, 1, 1, 0,
506 1, 1, 1, 1, 0, 0, 0, 0,
507 0, 0, 0, 0, 0, 0, 0, 0,
508 0, 0, 1, 0, 1, 0, 1, 1,
509 1, 1, 1, 1, 1, 1, 1, 1,
510 1, 1, 1, 1, 1, 1, 1, 1,
511 1, 1, 1, 1, 1, 1, 1, 1,
512 1, 1, 1, 0, 0, 0, 1, 1,
513 0, 0, 0, 0, 0, 0, 0, 0,
514 0, 0, 0, 0, 0, 0, 0, 0,
515 0, 0, 0, 0, 0, 0, 0, 0,
516 0, 0, 0, 1, 1, 1, 1, 0
519 __attribute__ ((weak))
520 const uint8_t ascii_to_keycode_lut[0x80] PROGMEM = {
521 0, 0, 0, 0, 0, 0, 0, 0,
522 KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0,
523 0, 0, 0, 0, 0, 0, 0, 0,
524 0, 0, 0, KC_ESC, 0, 0, 0, 0,
525 KC_SPC, KC_1, KC_QUOT, KC_3, KC_4, KC_5, KC_7, KC_QUOT,
526 KC_9, KC_0, KC_8, KC_EQL, KC_COMM, KC_MINS, KC_DOT, KC_SLSH,
527 KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
528 KC_8, KC_9, KC_SCLN, KC_SCLN, KC_COMM, KC_EQL, KC_DOT, KC_SLSH,
529 KC_2, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
530 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
531 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
532 KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_6, KC_MINS,
533 KC_GRV, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
534 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
535 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
536 KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL
539 void send_string(const char *str) {
540 send_string_with_delay(str, 0);
543 void send_string_with_delay(const char *str, uint8_t interval) {
546 uint8_t ascii_code = pgm_read_byte(str);
547 if (!ascii_code) break;
548 keycode = pgm_read_byte(&ascii_to_keycode_lut[ascii_code]);
549 if (pgm_read_byte(&ascii_to_shift_lut[ascii_code])) {
550 register_code(KC_LSFT);
551 register_code(keycode);
552 unregister_code(keycode);
553 unregister_code(KC_LSFT);
556 register_code(keycode);
557 unregister_code(keycode);
561 { uint8_t ms = interval; while (ms--) wait_ms(1); }
565 void set_single_persistent_default_layer(uint8_t default_layer) {
567 PLAY_SONG(default_layer_songs[default_layer]);
569 eeconfig_update_default_layer(1U<<default_layer);
570 default_layer_set(1U<<default_layer);
573 void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
574 if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
581 void tap_random_base64(void) {
582 #if defined(__AVR_ATmega32U4__)
583 uint8_t key = (TCNT0 + TCNT1 + TCNT3 + TCNT4) % 64;
585 uint8_t key = rand() % 64;
589 register_code(KC_LSFT);
590 register_code(key + KC_A);
591 unregister_code(key + KC_A);
592 unregister_code(KC_LSFT);
595 register_code(key - 26 + KC_A);
596 unregister_code(key - 26 + KC_A);
600 unregister_code(KC_0);
603 register_code(key - 53 + KC_1);
604 unregister_code(key - 53 + KC_1);
607 register_code(KC_LSFT);
608 register_code(KC_EQL);
609 unregister_code(KC_EQL);
610 unregister_code(KC_LSFT);
613 register_code(KC_SLSH);
614 unregister_code(KC_SLSH);
619 void matrix_init_quantum() {
620 #ifdef BACKLIGHT_ENABLE
621 backlight_init_ports();
629 void matrix_scan_quantum() {
634 #ifdef TAP_DANCE_ENABLE
635 matrix_scan_tap_dance();
642 #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_PIN)
649 #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_PIN)
651 static const uint8_t backlight_pin = BACKLIGHT_PIN;
653 #if BACKLIGHT_PIN == B7
654 # define COM1x1 COM1C1
656 #elif BACKLIGHT_PIN == B6
657 # define COM1x1 COM1B1
659 #elif BACKLIGHT_PIN == B5
660 # define COM1x1 COM1A1
663 # define NO_BACKLIGHT_CLOCK
666 #ifndef BACKLIGHT_ON_STATE
667 #define BACKLIGHT_ON_STATE 0
670 __attribute__ ((weak))
671 void backlight_init_ports(void)
674 // Setup backlight pin as output and output to on state.
676 _SFR_IO8((backlight_pin >> 4) + 1) |= _BV(backlight_pin & 0xF);
677 #if BACKLIGHT_ON_STATE == 0
679 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
682 _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
685 #ifndef NO_BACKLIGHT_CLOCK
686 // Use full 16-bit resolution.
689 // I could write a wall of text here to explain... but TL;DW
690 // Go read the ATmega32u4 datasheet.
691 // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on
693 // Pin PB7 = OCR1C (Timer 1, Channel C)
694 // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0
695 // (i.e. start high, go low when counter matches.)
696 // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0
697 // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1
699 TCCR1A = _BV(COM1x1) | _BV(WGM11); // = 0b00001010;
700 TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
704 #ifdef BACKLIGHT_BREATHING
705 breathing_defaults();
709 __attribute__ ((weak))
710 void backlight_set(uint8_t level)
712 // Prevent backlight blink on lowest level
713 // #if BACKLIGHT_ON_STATE == 0
715 // _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
718 // _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
722 #ifndef NO_BACKLIGHT_CLOCK
723 // Turn off PWM control on backlight pin, revert to output low.
724 TCCR1A &= ~(_BV(COM1x1));
727 // #if BACKLIGHT_ON_STATE == 0
729 // _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
732 // _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
736 #ifndef NO_BACKLIGHT_CLOCK
737 else if ( level == BACKLIGHT_LEVELS ) {
738 // Turn on PWM control of backlight pin
739 TCCR1A |= _BV(COM1x1);
740 // Set the brightness
744 // Turn on PWM control of backlight pin
745 TCCR1A |= _BV(COM1x1);
746 // Set the brightness
747 OCR1x = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2));
751 #ifdef BACKLIGHT_BREATHING
752 breathing_intensity_default();
756 uint8_t backlight_tick = 0;
758 void backlight_task(void) {
759 #ifdef NO_BACKLIGHT_CLOCK
760 if ((0xFFFF >> ((BACKLIGHT_LEVELS - backlight_config.level) * ((BACKLIGHT_LEVELS + 1) / 2))) & (1 << backlight_tick)) {
761 #if BACKLIGHT_ON_STATE == 0
763 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
766 _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
769 #if BACKLIGHT_ON_STATE == 0
771 _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
774 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
777 backlight_tick = (backlight_tick + 1) % 16;
781 #ifdef BACKLIGHT_BREATHING
783 #define BREATHING_NO_HALT 0
784 #define BREATHING_HALT_OFF 1
785 #define BREATHING_HALT_ON 2
787 static uint8_t breath_intensity;
788 static uint8_t breath_speed;
789 static uint16_t breathing_index;
790 static uint8_t breathing_halt;
792 void breathing_enable(void)
794 if (get_backlight_level() == 0)
800 // Set breathing_index to be at the midpoint (brightest point)
801 breathing_index = 0x20 << breath_speed;
804 breathing_halt = BREATHING_NO_HALT;
806 // Enable breathing interrupt
807 TIMSK1 |= _BV(OCIE1A);
810 void breathing_pulse(void)
812 if (get_backlight_level() == 0)
818 // Set breathing_index to be at the midpoint + 1 (brightest point)
819 breathing_index = 0x21 << breath_speed;
822 breathing_halt = BREATHING_HALT_ON;
824 // Enable breathing interrupt
825 TIMSK1 |= _BV(OCIE1A);
828 void breathing_disable(void)
830 // Disable breathing interrupt
831 TIMSK1 &= ~_BV(OCIE1A);
832 backlight_set(get_backlight_level());
835 void breathing_self_disable(void)
837 if (get_backlight_level() == 0)
839 breathing_halt = BREATHING_HALT_OFF;
843 breathing_halt = BREATHING_HALT_ON;
846 //backlight_set(get_backlight_level());
849 void breathing_toggle(void)
853 if (get_backlight_level() == 0)
859 // Set breathing_index to be at the midpoint + 1 (brightest point)
860 breathing_index = 0x21 << breath_speed;
863 breathing_halt = BREATHING_NO_HALT;
866 // Toggle breathing interrupt
867 TIMSK1 ^= _BV(OCIE1A);
869 // Restore backlight level
872 backlight_set(get_backlight_level());
876 bool is_breathing(void)
878 return (TIMSK1 && _BV(OCIE1A));
881 void breathing_intensity_default(void)
883 //breath_intensity = (uint8_t)((uint16_t)100 * (uint16_t)get_backlight_level() / (uint16_t)BACKLIGHT_LEVELS);
884 breath_intensity = ((BACKLIGHT_LEVELS - get_backlight_level()) * ((BACKLIGHT_LEVELS + 1) / 2));
887 void breathing_intensity_set(uint8_t value)
889 breath_intensity = value;
892 void breathing_speed_default(void)
897 void breathing_speed_set(uint8_t value)
899 bool is_breathing_now = is_breathing();
900 uint8_t old_breath_speed = breath_speed;
902 if (is_breathing_now)
904 // Disable breathing interrupt
905 TIMSK1 &= ~_BV(OCIE1A);
908 breath_speed = value;
910 if (is_breathing_now)
912 // Adjust index to account for new speed
913 breathing_index = (( (uint8_t)( (breathing_index) >> old_breath_speed ) ) & 0x3F) << breath_speed;
915 // Enable breathing interrupt
916 TIMSK1 |= _BV(OCIE1A);
921 void breathing_speed_inc(uint8_t value)
923 if ((uint16_t)(breath_speed - value) > 10 )
925 breathing_speed_set(0);
929 breathing_speed_set(breath_speed - value);
933 void breathing_speed_dec(uint8_t value)
935 if ((uint16_t)(breath_speed + value) > 10 )
937 breathing_speed_set(10);
941 breathing_speed_set(breath_speed + value);
945 void breathing_defaults(void)
947 breathing_intensity_default();
948 breathing_speed_default();
949 breathing_halt = BREATHING_NO_HALT;
952 /* Breathing Sleep LED brighness(PWM On period) table
953 * (64[steps] * 4[duration]) / 64[PWM periods/s] = 4 second breath cycle
955 * http://www.wolframalpha.com/input/?i=%28sin%28+x%2F64*pi%29**8+*+255%2C+x%3D0+to+63
956 * (0..63).each {|x| p ((sin(x/64.0*PI)**8)*255).to_i }
958 static const uint8_t breathing_table[64] PROGMEM = {
959 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 6, 10,
960 15, 23, 32, 44, 58, 74, 93, 113, 135, 157, 179, 199, 218, 233, 245, 252,
961 255, 252, 245, 233, 218, 199, 179, 157, 135, 113, 93, 74, 58, 44, 32, 23,
962 15, 10, 6, 4, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
965 ISR(TIMER1_COMPA_vect)
967 // OCR1x = (pgm_read_byte(&breathing_table[ ( (uint8_t)( (breathing_index++) >> breath_speed ) ) & 0x3F ] )) * breath_intensity;
970 uint8_t local_index = ( (uint8_t)( (breathing_index++) >> breath_speed ) ) & 0x3F;
972 if (((breathing_halt == BREATHING_HALT_ON) && (local_index == 0x20)) || ((breathing_halt == BREATHING_HALT_OFF) && (local_index == 0x3F)))
974 // Disable breathing interrupt
975 TIMSK1 &= ~_BV(OCIE1A);
978 OCR1x = (uint16_t)(((uint16_t)pgm_read_byte(&breathing_table[local_index]) * 257)) >> breath_intensity;
988 __attribute__ ((weak))
989 void backlight_init_ports(void)
994 __attribute__ ((weak))
995 void backlight_set(uint8_t level)
1003 // Functions for spitting out values
1006 void send_dword(uint32_t number) { // this might not actually work
1007 uint16_t word = (number >> 16);
1009 send_word(number & 0xFFFFUL);
1012 void send_word(uint16_t number) {
1013 uint8_t byte = number >> 8;
1015 send_byte(number & 0xFF);
1018 void send_byte(uint8_t number) {
1019 uint8_t nibble = number >> 4;
1020 send_nibble(nibble);
1021 send_nibble(number & 0xF);
1024 void send_nibble(uint8_t number) {
1027 register_code(KC_0);
1028 unregister_code(KC_0);
1031 register_code(KC_1 + (number - 1));
1032 unregister_code(KC_1 + (number - 1));
1035 register_code(KC_A + (number - 0xA));
1036 unregister_code(KC_A + (number - 0xA));
1042 __attribute__((weak))
1043 uint16_t hex_to_keycode(uint8_t hex)
1047 } else if (hex < 0xA) {
1048 return KC_1 + (hex - 0x1);
1050 return KC_A + (hex - 0xA);
1054 void api_send_unicode(uint32_t unicode) {
1057 dword_to_bytes(unicode, chunk);
1058 MT_SEND_DATA(DT_UNICODE, chunk, 5);
1062 __attribute__ ((weak))
1063 void led_set_user(uint8_t usb_led) {
1067 __attribute__ ((weak))
1068 void led_set_kb(uint8_t usb_led) {
1069 led_set_user(usb_led);
1072 __attribute__ ((weak))
1073 void led_init_ports(void)
1078 __attribute__ ((weak))
1079 void led_set(uint8_t usb_led)
1084 // // Using PE6 Caps Lock LED
1085 // if (usb_led & (1<<USB_LED_CAPS_LOCK))
1095 // PORTE &= ~(1<<6);
1098 led_set_kb(usb_led);
1102 //------------------------------------------------------------------------------
1103 // Override these functions in your keymap file to play different tunes on
1104 // different events such as startup and bootloader jump
1106 __attribute__ ((weak))
1107 void startup_user() {}
1109 __attribute__ ((weak))
1110 void shutdown_user() {}
1112 //------------------------------------------------------------------------------