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 #if !defined(RGBLIGHT_ENABLE) && !defined(RGB_MATRIX_ENABLE)
24 # include "outputselect.h"
27 #ifdef BACKLIGHT_ENABLE
28 # include "backlight.h"
29 extern backlight_config_t backlight_config;
32 #ifdef FAUXCLICKY_ENABLE
33 # include "fauxclicky.h"
41 # include "process_midi.h"
44 #ifdef VELOCIKEY_ENABLE
45 # include "velocikey.h"
58 # define GOODBYE_SONG SONG(GOODBYE_SOUND)
61 # define AG_NORM_SONG SONG(AG_NORM_SOUND)
64 # define AG_SWAP_SONG SONG(AG_SWAP_SOUND)
67 # define CG_NORM_SONG SONG(AG_NORM_SOUND)
70 # define CG_SWAP_SONG SONG(AG_SWAP_SOUND)
72 float goodbye_song[][2] = GOODBYE_SONG;
73 float ag_norm_song[][2] = AG_NORM_SONG;
74 float ag_swap_song[][2] = AG_SWAP_SONG;
75 float cg_norm_song[][2] = CG_NORM_SONG;
76 float cg_swap_song[][2] = CG_SWAP_SONG;
77 # ifdef DEFAULT_LAYER_SONGS
78 float default_layer_songs[][16][2] = DEFAULT_LAYER_SONGS;
82 static void do_code16(uint16_t code, void (*f)(uint8_t)) {
84 case QK_MODS ... QK_MODS_MAX:
90 uint8_t mods_to_send = 0;
92 if (code & QK_RMODS_MIN) { // Right mod flag is set
93 if (code & QK_LCTL) mods_to_send |= MOD_BIT(KC_RCTL);
94 if (code & QK_LSFT) mods_to_send |= MOD_BIT(KC_RSFT);
95 if (code & QK_LALT) mods_to_send |= MOD_BIT(KC_RALT);
96 if (code & QK_LGUI) mods_to_send |= MOD_BIT(KC_RGUI);
98 if (code & QK_LCTL) mods_to_send |= MOD_BIT(KC_LCTL);
99 if (code & QK_LSFT) mods_to_send |= MOD_BIT(KC_LSFT);
100 if (code & QK_LALT) mods_to_send |= MOD_BIT(KC_LALT);
101 if (code & QK_LGUI) mods_to_send |= MOD_BIT(KC_LGUI);
107 void register_code16(uint16_t code) {
108 if (IS_MOD(code) || code == KC_NO) {
109 do_code16(code, register_mods);
111 do_code16(code, register_weak_mods);
116 void unregister_code16(uint16_t code) {
117 unregister_code(code);
118 if (IS_MOD(code) || code == KC_NO) {
119 do_code16(code, unregister_mods);
121 do_code16(code, unregister_weak_mods);
125 void tap_code16(uint16_t code) {
126 register_code16(code);
127 #if TAP_CODE_DELAY > 0
128 wait_ms(TAP_CODE_DELAY);
130 unregister_code16(code);
133 __attribute__((weak)) bool process_action_kb(keyrecord_t *record) { return true; }
135 __attribute__((weak)) bool process_record_kb(uint16_t keycode, keyrecord_t *record) { return process_record_user(keycode, record); }
137 __attribute__((weak)) bool process_record_user(uint16_t keycode, keyrecord_t *record) { return true; }
139 void reset_keyboard(void) {
141 #if defined(MIDI_ENABLE) && defined(MIDI_BASIC)
142 process_midi_all_notes_off();
145 # ifndef NO_MUSIC_MODE
146 music_all_notes_off();
148 uint16_t timer_start = timer_read();
149 PLAY_SONG(goodbye_song);
151 while (timer_elapsed(timer_start) < 250) wait_ms(1);
160 // this is also done later in bootloader.c - not sure if it's neccesary here
161 #ifdef BOOTLOADER_CATERINA
162 *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific
167 /* true if the last press of GRAVE_ESC was shifted (i.e. GUI or SHIFT were pressed), false otherwise.
168 * Used to ensure that the correct keycode is released if the key is released.
170 static bool grave_esc_was_shifted = false;
172 /* Convert record into usable keycode via the contained event. */
173 uint16_t get_record_keycode(keyrecord_t *record) { return get_event_keycode(record->event); }
175 /* Convert event into usable keycode. Checks the layer cache to ensure that it
176 * retains the correct keycode after a layer change, if the key is still pressed.
178 uint16_t get_event_keycode(keyevent_t event) {
179 #if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE)
180 /* TODO: Use store_or_get_action() or a similar function. */
181 if (!disable_action_cache) {
185 layer = layer_switch_get_layer(event.key);
186 update_source_layers_cache(event.key, layer);
188 layer = read_source_layers_cache(event.key);
190 return keymap_key_to_keycode(layer, event.key);
193 return keymap_key_to_keycode(layer_switch_get_layer(event.key), event.key);
196 /* Main keycode processing function. Hands off handling to other functions,
197 * then processes internal Quantum keycodes, then processes ACTIONs.
199 bool process_record_quantum(keyrecord_t *record) {
200 uint16_t keycode = get_record_keycode(record);
202 // This is how you use actions here
203 // if (keycode == KC_LEAD) {
205 // action.code = ACTION_DEFAULT_LAYER_SET(0);
206 // process_action(record, action);
210 #ifdef VELOCIKEY_ENABLE
211 if (velocikey_enabled() && record->event.pressed) {
212 velocikey_accelerate();
216 #ifdef TAP_DANCE_ENABLE
217 preprocess_tap_dance(keycode, record);
221 #if defined(KEY_LOCK_ENABLE)
222 // Must run first to be able to mask key_up events.
223 process_key_lock(&keycode, record) &&
225 #if defined(DYNAMIC_MACRO_ENABLE) && !defined(DYNAMIC_MACRO_USER_CALL)
226 // Must run asap to ensure all keypresses are recorded.
227 process_dynamic_macro(keycode, record) &&
229 #if defined(AUDIO_ENABLE) && defined(AUDIO_CLICKY)
230 process_clicky(keycode, record) &&
231 #endif // AUDIO_CLICKY
233 process_haptic(keycode, record) &&
234 #endif // HAPTIC_ENABLE
235 #if defined(RGB_MATRIX_ENABLE)
236 process_rgb_matrix(keycode, record) &&
238 process_record_kb(keycode, record) &&
239 #if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED)
240 process_midi(keycode, record) &&
243 process_audio(keycode, record) &&
246 process_steno(keycode, record) &&
248 #if (defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC))) && !defined(NO_MUSIC_MODE)
249 process_music(keycode, record) &&
251 #ifdef TAP_DANCE_ENABLE
252 process_tap_dance(keycode, record) &&
254 #if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)
255 process_unicode_common(keycode, record) &&
258 process_leader(keycode, record) &&
261 process_combo(keycode, record) &&
263 #ifdef PRINTING_ENABLE
264 process_printer(keycode, record) &&
266 #ifdef AUTO_SHIFT_ENABLE
267 process_auto_shift(keycode, record) &&
269 #ifdef TERMINAL_ENABLE
270 process_terminal(keycode, record) &&
272 #ifdef SPACE_CADET_ENABLE
273 process_space_cadet(keycode, record) &&
279 // Shift / paren setup
283 if (record->event.pressed) {
288 if (record->event.pressed) {
291 print("DEBUG: enabled.\n");
293 print("DEBUG: disabled.\n");
298 if (record->event.pressed) {
302 #ifdef FAUXCLICKY_ENABLE
304 if (record->event.pressed) {
309 if (record->event.pressed) {
314 if (record->event.pressed) {
319 #if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
321 // Split keyboards need to trigger on key-up for edge-case issue
322 # ifndef SPLIT_KEYBOARD
323 if (record->event.pressed) {
325 if (!record->event.pressed) {
330 case RGB_MODE_FORWARD:
331 if (record->event.pressed) {
332 uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT));
334 rgblight_step_reverse();
340 case RGB_MODE_REVERSE:
341 if (record->event.pressed) {
342 uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT));
346 rgblight_step_reverse();
351 // Split keyboards need to trigger on key-up for edge-case issue
352 # ifndef SPLIT_KEYBOARD
353 if (record->event.pressed) {
355 if (!record->event.pressed) {
357 rgblight_increase_hue();
361 // Split keyboards need to trigger on key-up for edge-case issue
362 # ifndef SPLIT_KEYBOARD
363 if (record->event.pressed) {
365 if (!record->event.pressed) {
367 rgblight_decrease_hue();
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_increase_sat();
381 // Split keyboards need to trigger on key-up for edge-case issue
382 # ifndef SPLIT_KEYBOARD
383 if (record->event.pressed) {
385 if (!record->event.pressed) {
387 rgblight_decrease_sat();
391 // Split keyboards need to trigger on key-up for edge-case issue
392 # ifndef SPLIT_KEYBOARD
393 if (record->event.pressed) {
395 if (!record->event.pressed) {
397 rgblight_increase_val();
401 // Split keyboards need to trigger on key-up for edge-case issue
402 # ifndef SPLIT_KEYBOARD
403 if (record->event.pressed) {
405 if (!record->event.pressed) {
407 rgblight_decrease_val();
411 if (record->event.pressed) {
412 rgblight_increase_speed();
416 if (record->event.pressed) {
417 rgblight_decrease_speed();
421 if (record->event.pressed) {
422 rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT);
425 case RGB_MODE_BREATHE:
426 # ifdef RGBLIGHT_EFFECT_BREATHING
427 if (record->event.pressed) {
428 if ((RGBLIGHT_MODE_BREATHING <= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_BREATHING_end)) {
431 rgblight_mode(RGBLIGHT_MODE_BREATHING);
436 case RGB_MODE_RAINBOW:
437 # ifdef RGBLIGHT_EFFECT_RAINBOW_MOOD
438 if (record->event.pressed) {
439 if ((RGBLIGHT_MODE_RAINBOW_MOOD <= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_RAINBOW_MOOD_end)) {
442 rgblight_mode(RGBLIGHT_MODE_RAINBOW_MOOD);
448 # ifdef RGBLIGHT_EFFECT_RAINBOW_SWIRL
449 if (record->event.pressed) {
450 if ((RGBLIGHT_MODE_RAINBOW_SWIRL <= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_RAINBOW_SWIRL_end)) {
453 rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL);
459 # ifdef RGBLIGHT_EFFECT_SNAKE
460 if (record->event.pressed) {
461 if ((RGBLIGHT_MODE_SNAKE <= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_SNAKE_end)) {
464 rgblight_mode(RGBLIGHT_MODE_SNAKE);
469 case RGB_MODE_KNIGHT:
470 # ifdef RGBLIGHT_EFFECT_KNIGHT
471 if (record->event.pressed) {
472 if ((RGBLIGHT_MODE_KNIGHT <= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_KNIGHT_end)) {
475 rgblight_mode(RGBLIGHT_MODE_KNIGHT);
481 # ifdef RGBLIGHT_EFFECT_CHRISTMAS
482 if (record->event.pressed) {
483 rgblight_mode(RGBLIGHT_MODE_CHRISTMAS);
487 case RGB_MODE_GRADIENT:
488 # ifdef RGBLIGHT_EFFECT_STATIC_GRADIENT
489 if (record->event.pressed) {
490 if ((RGBLIGHT_MODE_STATIC_GRADIENT <= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_STATIC_GRADIENT_end)) {
493 rgblight_mode(RGBLIGHT_MODE_STATIC_GRADIENT);
498 case RGB_MODE_RGBTEST:
499 # ifdef RGBLIGHT_EFFECT_RGB_TEST
500 if (record->event.pressed) {
501 rgblight_mode(RGBLIGHT_MODE_RGB_TEST);
505 #endif // defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
506 #ifdef VELOCIKEY_ENABLE
508 if (record->event.pressed) {
515 if (record->event.pressed) {
516 set_output(OUTPUT_AUTO);
520 if (record->event.pressed) {
521 set_output(OUTPUT_USB);
524 # ifdef BLUETOOTH_ENABLE
526 if (record->event.pressed) {
527 set_output(OUTPUT_BLUETOOTH);
532 case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_TOGGLE_ALT_GUI:
533 case MAGIC_SWAP_LCTL_LGUI ... MAGIC_EE_HANDS_RIGHT:
534 if (record->event.pressed) {
535 // MAGIC actions (BOOTMAGIC without the boot)
536 if (!eeconfig_is_enabled()) {
540 keymap_config.raw = eeconfig_read_keymap();
542 case MAGIC_SWAP_CONTROL_CAPSLOCK:
543 keymap_config.swap_control_capslock = true;
545 case MAGIC_CAPSLOCK_TO_CONTROL:
546 keymap_config.capslock_to_control = true;
548 case MAGIC_SWAP_LALT_LGUI:
549 keymap_config.swap_lalt_lgui = true;
551 case MAGIC_SWAP_RALT_RGUI:
552 keymap_config.swap_ralt_rgui = true;
554 case MAGIC_SWAP_LCTL_LGUI:
555 keymap_config.swap_lctl_lgui = true;
557 case MAGIC_SWAP_RCTL_RGUI:
558 keymap_config.swap_rctl_rgui = true;
561 keymap_config.no_gui = true;
563 case MAGIC_SWAP_GRAVE_ESC:
564 keymap_config.swap_grave_esc = true;
566 case MAGIC_SWAP_BACKSLASH_BACKSPACE:
567 keymap_config.swap_backslash_backspace = true;
569 case MAGIC_HOST_NKRO:
570 clear_keyboard(); // clear first buffer to prevent stuck keys
571 keymap_config.nkro = true;
573 case MAGIC_SWAP_ALT_GUI:
574 keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = true;
576 PLAY_SONG(ag_swap_song);
579 case MAGIC_SWAP_CTL_GUI:
580 keymap_config.swap_lctl_lgui = keymap_config.swap_rctl_rgui = true;
582 PLAY_SONG(cg_swap_song);
585 case MAGIC_UNSWAP_CONTROL_CAPSLOCK:
586 keymap_config.swap_control_capslock = false;
588 case MAGIC_UNCAPSLOCK_TO_CONTROL:
589 keymap_config.capslock_to_control = false;
591 case MAGIC_UNSWAP_LALT_LGUI:
592 keymap_config.swap_lalt_lgui = false;
594 case MAGIC_UNSWAP_RALT_RGUI:
595 keymap_config.swap_ralt_rgui = false;
597 case MAGIC_UNSWAP_LCTL_LGUI:
598 keymap_config.swap_lctl_lgui = false;
600 case MAGIC_UNSWAP_RCTL_RGUI:
601 keymap_config.swap_rctl_rgui = false;
604 keymap_config.no_gui = false;
606 case MAGIC_UNSWAP_GRAVE_ESC:
607 keymap_config.swap_grave_esc = false;
609 case MAGIC_UNSWAP_BACKSLASH_BACKSPACE:
610 keymap_config.swap_backslash_backspace = false;
612 case MAGIC_UNHOST_NKRO:
613 clear_keyboard(); // clear first buffer to prevent stuck keys
614 keymap_config.nkro = false;
616 case MAGIC_UNSWAP_ALT_GUI:
617 keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = false;
619 PLAY_SONG(ag_norm_song);
622 case MAGIC_UNSWAP_CTL_GUI:
623 keymap_config.swap_lctl_lgui = keymap_config.swap_rctl_rgui = false;
625 PLAY_SONG(cg_norm_song);
628 case MAGIC_TOGGLE_ALT_GUI:
629 keymap_config.swap_lalt_lgui = !keymap_config.swap_lalt_lgui;
630 keymap_config.swap_ralt_rgui = keymap_config.swap_lalt_lgui;
632 if (keymap_config.swap_ralt_rgui) {
633 PLAY_SONG(ag_swap_song);
635 PLAY_SONG(ag_norm_song);
639 case MAGIC_TOGGLE_CTL_GUI:
640 keymap_config.swap_lctl_lgui = !keymap_config.swap_lctl_lgui;
641 keymap_config.swap_rctl_rgui = keymap_config.swap_lctl_lgui;
643 if (keymap_config.swap_rctl_rgui) {
644 PLAY_SONG(cg_swap_song);
646 PLAY_SONG(cg_norm_song);
650 case MAGIC_TOGGLE_NKRO:
651 clear_keyboard(); // clear first buffer to prevent stuck keys
652 keymap_config.nkro = !keymap_config.nkro;
654 case MAGIC_EE_HANDS_LEFT:
655 eeconfig_update_handedness(true);
657 case MAGIC_EE_HANDS_RIGHT:
658 eeconfig_update_handedness(false);
663 eeconfig_update_keymap(keymap_config.raw);
664 clear_keyboard(); // clear to prevent stuck keys
671 uint8_t shifted = get_mods() & ((MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT) | MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI)));
673 #ifdef GRAVE_ESC_ALT_OVERRIDE
674 // if ALT is pressed, ESC is always sent
675 // this is handy for the cmd+opt+esc shortcut on macOS, among other things.
676 if (get_mods() & (MOD_BIT(KC_LALT) | MOD_BIT(KC_RALT))) {
681 #ifdef GRAVE_ESC_CTRL_OVERRIDE
682 // if CTRL is pressed, ESC is always sent
683 // this is handy for the ctrl+shift+esc shortcut on windows, among other things.
684 if (get_mods() & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL))) {
689 #ifdef GRAVE_ESC_GUI_OVERRIDE
690 // if GUI is pressed, ESC is always sent
691 if (get_mods() & (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI))) {
696 #ifdef GRAVE_ESC_SHIFT_OVERRIDE
697 // if SHIFT is pressed, ESC is always sent
698 if (get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
703 if (record->event.pressed) {
704 grave_esc_was_shifted = shifted;
705 add_key(shifted ? KC_GRAVE : KC_ESCAPE);
707 del_key(grave_esc_was_shifted ? KC_GRAVE : KC_ESCAPE);
710 send_keyboard_report();
714 #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_BREATHING)
716 if (record->event.pressed) {
717 backlight_toggle_breathing();
724 return process_action_kb(record);
727 __attribute__((weak)) const bool ascii_to_shift_lut[128] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
729 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0};
731 __attribute__((weak)) const bool ascii_to_altgr_lut[128] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
733 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
735 __attribute__((weak)) const uint8_t ascii_to_keycode_lut[128] PROGMEM = {// NUL SOH STX ETX EOT ENQ ACK BEL
736 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
737 // BS TAB LF VT FF CR SO SI
738 KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
739 // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
740 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
741 // CAN EM SUB ESC FS GS RS US
742 XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
745 KC_SPC, KC_1, KC_QUOT, KC_3, KC_4, KC_5, KC_7, KC_QUOT,
747 KC_9, KC_0, KC_8, KC_EQL, KC_COMM, KC_MINS, KC_DOT, KC_SLSH,
749 KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
751 KC_8, KC_9, KC_SCLN, KC_SCLN, KC_COMM, KC_EQL, KC_DOT, KC_SLSH,
753 KC_2, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
755 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
757 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
759 KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_6, KC_MINS,
761 KC_GRV, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
763 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
765 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
767 KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL};
769 void send_string(const char *str) { send_string_with_delay(str, 0); }
771 void send_string_P(const char *str) { send_string_with_delay_P(str, 0); }
773 void send_string_with_delay(const char *str, uint8_t interval) {
775 char ascii_code = *str;
776 if (!ascii_code) break;
777 if (ascii_code == SS_TAP_CODE) {
779 uint8_t keycode = *(++str);
780 register_code(keycode);
781 unregister_code(keycode);
782 } else if (ascii_code == SS_DOWN_CODE) {
784 uint8_t keycode = *(++str);
785 register_code(keycode);
786 } else if (ascii_code == SS_UP_CODE) {
788 uint8_t keycode = *(++str);
789 unregister_code(keycode);
791 send_char(ascii_code);
796 uint8_t ms = interval;
797 while (ms--) wait_ms(1);
802 void send_string_with_delay_P(const char *str, uint8_t interval) {
804 char ascii_code = pgm_read_byte(str);
805 if (!ascii_code) break;
806 if (ascii_code == SS_TAP_CODE) {
808 uint8_t keycode = pgm_read_byte(++str);
809 register_code(keycode);
810 unregister_code(keycode);
811 } else if (ascii_code == SS_DOWN_CODE) {
813 uint8_t keycode = pgm_read_byte(++str);
814 register_code(keycode);
815 } else if (ascii_code == SS_UP_CODE) {
817 uint8_t keycode = pgm_read_byte(++str);
818 unregister_code(keycode);
820 send_char(ascii_code);
825 uint8_t ms = interval;
826 while (ms--) wait_ms(1);
831 void send_char(char ascii_code) {
832 uint8_t keycode = pgm_read_byte(&ascii_to_keycode_lut[(uint8_t)ascii_code]);
833 bool is_shifted = pgm_read_byte(&ascii_to_shift_lut[(uint8_t)ascii_code]);
834 bool is_altgred = pgm_read_byte(&ascii_to_altgr_lut[(uint8_t)ascii_code]);
837 register_code(KC_LSFT);
840 register_code(KC_RALT);
844 unregister_code(KC_RALT);
847 unregister_code(KC_LSFT);
851 void set_single_persistent_default_layer(uint8_t default_layer) {
852 #if defined(AUDIO_ENABLE) && defined(DEFAULT_LAYER_SONGS)
853 PLAY_SONG(default_layer_songs[default_layer]);
855 eeconfig_update_default_layer(1U << default_layer);
856 default_layer_set(1U << default_layer);
859 layer_state_t update_tri_layer_state(layer_state_t state, uint8_t layer1, uint8_t layer2, uint8_t layer3) {
860 layer_state_t mask12 = (1UL << layer1) | (1UL << layer2);
861 layer_state_t mask3 = 1UL << layer3;
862 return (state & mask12) == mask12 ? (state | mask3) : (state & ~mask3);
865 void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) { layer_state_set(update_tri_layer_state(layer_state, layer1, layer2, layer3)); }
867 void tap_random_base64(void) {
868 #if defined(__AVR_ATmega32U4__)
869 uint8_t key = (TCNT0 + TCNT1 + TCNT3 + TCNT4) % 64;
871 uint8_t key = rand() % 64;
875 register_code(KC_LSFT);
876 register_code(key + KC_A);
877 unregister_code(key + KC_A);
878 unregister_code(KC_LSFT);
881 register_code(key - 26 + KC_A);
882 unregister_code(key - 26 + KC_A);
886 unregister_code(KC_0);
889 register_code(key - 53 + KC_1);
890 unregister_code(key - 53 + KC_1);
893 register_code(KC_LSFT);
894 register_code(KC_EQL);
895 unregister_code(KC_EQL);
896 unregister_code(KC_LSFT);
899 register_code(KC_SLSH);
900 unregister_code(KC_SLSH);
905 __attribute__((weak)) void bootmagic_lite(void) {
906 // The lite version of TMK's bootmagic based on Wilba.
907 // 100% less potential for accidentally making the
908 // keyboard do stupid things.
910 // We need multiple scans because debouncing can't be turned off.
912 #if defined(DEBOUNCING_DELAY) && DEBOUNCING_DELAY > 0
913 wait_ms(DEBOUNCING_DELAY * 2);
914 #elif defined(DEBOUNCE) && DEBOUNCE > 0
915 wait_ms(DEBOUNCE * 2);
921 // If the Esc and space bar are held down on power up,
922 // reset the EEPROM valid state and jump to bootloader.
923 // Assumes Esc is at [0,0].
924 // This isn't very generalized, but we need something that doesn't
925 // rely on user's keymaps in firmware or EEPROM.
926 if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) {
928 // Jump to bootloader.
933 void matrix_init_quantum() {
934 #ifdef BOOTMAGIC_LITE
937 if (!eeconfig_is_enabled()) {
940 #ifdef BACKLIGHT_ENABLE
941 # ifdef LED_MATRIX_ENABLE
944 backlight_init_ports();
950 #ifdef RGB_MATRIX_ENABLE
953 #ifdef ENCODER_ENABLE
956 #if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)
957 unicode_input_mode_init();
962 #ifdef OUTPUT_AUTO_ENABLE
963 set_output(OUTPUT_AUTO);
965 #ifdef DIP_SWITCH_ENABLE
972 void matrix_scan_quantum() {
973 #if defined(AUDIO_ENABLE) && !defined(NO_MUSIC_MODE)
977 #ifdef TAP_DANCE_ENABLE
978 matrix_scan_tap_dance();
985 #if defined(BACKLIGHT_ENABLE)
986 # if defined(LED_MATRIX_ENABLE)
988 # elif defined(BACKLIGHT_PIN) || defined(BACKLIGHT_PINS)
993 #ifdef RGB_MATRIX_ENABLE
997 #ifdef ENCODER_ENABLE
1001 #ifdef HAPTIC_ENABLE
1005 #ifdef DIP_SWITCH_ENABLE
1006 dip_switch_read(false);
1012 #ifdef HD44780_ENABLED
1013 # include "hd44780.h"
1016 // Functions for spitting out values
1019 void send_dword(uint32_t number) { // this might not actually work
1020 uint16_t word = (number >> 16);
1022 send_word(number & 0xFFFFUL);
1025 void send_word(uint16_t number) {
1026 uint8_t byte = number >> 8;
1028 send_byte(number & 0xFF);
1031 void send_byte(uint8_t number) {
1032 uint8_t nibble = number >> 4;
1033 send_nibble(nibble);
1034 send_nibble(number & 0xF);
1037 void send_nibble(uint8_t number) {
1040 register_code(KC_0);
1041 unregister_code(KC_0);
1044 register_code(KC_1 + (number - 1));
1045 unregister_code(KC_1 + (number - 1));
1048 register_code(KC_A + (number - 0xA));
1049 unregister_code(KC_A + (number - 0xA));
1054 __attribute__((weak)) uint16_t hex_to_keycode(uint8_t hex) {
1058 } else if (hex < 0xA) {
1059 return KC_1 + (hex - 0x1);
1061 return KC_A + (hex - 0xA);
1065 void api_send_unicode(uint32_t unicode) {
1068 dword_to_bytes(unicode, chunk);
1069 MT_SEND_DATA(DT_UNICODE, chunk, 5);
1073 __attribute__((weak)) void led_set_user(uint8_t usb_led) {}
1075 __attribute__((weak)) void led_set_kb(uint8_t usb_led) { led_set_user(usb_led); }
1077 __attribute__((weak)) void led_init_ports(void) {}
1079 __attribute__((weak)) void led_set(uint8_t usb_led) {
1080 #if defined(BACKLIGHT_CAPS_LOCK) && defined(BACKLIGHT_ENABLE)
1081 // Use backlight as Caps Lock indicator
1082 uint8_t bl_toggle_lvl = 0;
1084 if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK) && !backlight_config.enable) {
1085 // Turning Caps Lock ON and backlight is disabled in config
1086 // Toggling backlight to the brightest level
1087 bl_toggle_lvl = BACKLIGHT_LEVELS;
1088 } else if (IS_LED_OFF(usb_led, USB_LED_CAPS_LOCK) && backlight_config.enable) {
1089 // Turning Caps Lock OFF and backlight is enabled in config
1090 // Toggling backlight and restoring config level
1091 bl_toggle_lvl = backlight_config.level;
1094 // Set level without modify backlight_config to keep ability to restore state
1095 backlight_set(bl_toggle_lvl);
1098 led_set_kb(usb_led);
1101 //------------------------------------------------------------------------------
1102 // Override these functions in your keymap file to play different tunes on
1103 // different events such as startup and bootloader jump
1105 __attribute__((weak)) void startup_user() {}
1107 __attribute__((weak)) void shutdown_user() {}
1109 //------------------------------------------------------------------------------