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 #include "backlight.h"
28 extern backlight_config_t backlight_config
;
30 #ifdef FAUXCLICKY_ENABLE
31 # include "fauxclicky.h"
39 # include "process_midi.h"
42 #ifdef VELOCIKEY_ENABLE
43 # include "velocikey.h"
56 # define GOODBYE_SONG SONG(GOODBYE_SOUND)
59 # define AG_NORM_SONG SONG(AG_NORM_SOUND)
62 # define AG_SWAP_SONG SONG(AG_SWAP_SOUND)
65 # define CG_NORM_SONG SONG(AG_NORM_SOUND)
68 # define CG_SWAP_SONG SONG(AG_SWAP_SOUND)
70 float goodbye_song
[][2] = GOODBYE_SONG
;
71 float ag_norm_song
[][2] = AG_NORM_SONG
;
72 float ag_swap_song
[][2] = AG_SWAP_SONG
;
73 float cg_norm_song
[][2] = CG_NORM_SONG
;
74 float cg_swap_song
[][2] = CG_SWAP_SONG
;
75 # ifdef DEFAULT_LAYER_SONGS
76 float default_layer_songs
[][16][2] = DEFAULT_LAYER_SONGS
;
80 static void do_code16(uint16_t code
, void (*f
)(uint8_t)) {
82 case QK_MODS
... QK_MODS_MAX
:
88 uint8_t mods_to_send
= 0;
90 if (code
& QK_RMODS_MIN
) { // Right mod flag is set
91 if (code
& QK_LCTL
) mods_to_send
|= MOD_BIT(KC_RCTL
);
92 if (code
& QK_LSFT
) mods_to_send
|= MOD_BIT(KC_RSFT
);
93 if (code
& QK_LALT
) mods_to_send
|= MOD_BIT(KC_RALT
);
94 if (code
& QK_LGUI
) mods_to_send
|= MOD_BIT(KC_RGUI
);
96 if (code
& QK_LCTL
) mods_to_send
|= MOD_BIT(KC_LCTL
);
97 if (code
& QK_LSFT
) mods_to_send
|= MOD_BIT(KC_LSFT
);
98 if (code
& QK_LALT
) mods_to_send
|= MOD_BIT(KC_LALT
);
99 if (code
& QK_LGUI
) mods_to_send
|= MOD_BIT(KC_LGUI
);
105 void register_code16(uint16_t code
) {
106 if (IS_MOD(code
) || code
== KC_NO
) {
107 do_code16(code
, register_mods
);
109 do_code16(code
, register_weak_mods
);
114 void unregister_code16(uint16_t code
) {
115 unregister_code(code
);
116 if (IS_MOD(code
) || code
== KC_NO
) {
117 do_code16(code
, unregister_mods
);
119 do_code16(code
, unregister_weak_mods
);
123 void tap_code16(uint16_t code
) {
124 register_code16(code
);
125 #if TAP_CODE_DELAY > 0
126 wait_ms(TAP_CODE_DELAY
);
128 unregister_code16(code
);
131 __attribute__((weak
)) bool process_action_kb(keyrecord_t
*record
) { return true; }
133 __attribute__((weak
)) bool process_record_kb(uint16_t keycode
, keyrecord_t
*record
) { return process_record_user(keycode
, record
); }
135 __attribute__((weak
)) bool process_record_user(uint16_t keycode
, keyrecord_t
*record
) { return true; }
137 void reset_keyboard(void) {
139 #if defined(MIDI_ENABLE) && defined(MIDI_BASIC)
140 process_midi_all_notes_off();
143 # ifndef NO_MUSIC_MODE
144 music_all_notes_off();
146 uint16_t timer_start
= timer_read();
147 PLAY_SONG(goodbye_song
);
149 while (timer_elapsed(timer_start
) < 250) wait_ms(1);
158 // this is also done later in bootloader.c - not sure if it's neccesary here
159 #ifdef BOOTLOADER_CATERINA
160 *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific
165 /* true if the last press of GRAVE_ESC was shifted (i.e. GUI or SHIFT were pressed), false otherwise.
166 * Used to ensure that the correct keycode is released if the key is released.
168 static bool grave_esc_was_shifted
= false;
170 /* Convert record into usable keycode via the contained event. */
171 uint16_t get_record_keycode(keyrecord_t
*record
) { return get_event_keycode(record
->event
); }
173 /* Convert event into usable keycode. Checks the layer cache to ensure that it
174 * retains the correct keycode after a layer change, if the key is still pressed.
176 uint16_t get_event_keycode(keyevent_t event
) {
177 #if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE)
178 /* TODO: Use store_or_get_action() or a similar function. */
179 if (!disable_action_cache
) {
183 layer
= layer_switch_get_layer(event
.key
);
184 update_source_layers_cache(event
.key
, layer
);
186 layer
= read_source_layers_cache(event
.key
);
188 return keymap_key_to_keycode(layer
, event
.key
);
191 return keymap_key_to_keycode(layer_switch_get_layer(event
.key
), event
.key
);
194 /* Main keycode processing function. Hands off handling to other functions,
195 * then processes internal Quantum keycodes, then processes ACTIONs.
197 bool process_record_quantum(keyrecord_t
*record
) {
198 uint16_t keycode
= get_record_keycode(record
);
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);
208 #ifdef VELOCIKEY_ENABLE
209 if (velocikey_enabled() && record
->event
.pressed
) {
210 velocikey_accelerate();
214 #ifdef TAP_DANCE_ENABLE
215 preprocess_tap_dance(keycode
, record
);
219 #if defined(KEY_LOCK_ENABLE)
220 // Must run first to be able to mask key_up events.
221 process_key_lock(&keycode
, record
) &&
223 #if defined(AUDIO_ENABLE) && defined(AUDIO_CLICKY)
224 process_clicky(keycode
, record
) &&
225 #endif // AUDIO_CLICKY
227 process_haptic(keycode
, record
) &&
228 #endif // HAPTIC_ENABLE
229 #if defined(RGB_MATRIX_ENABLE)
230 process_rgb_matrix(keycode
, record
) &&
232 process_record_kb(keycode
, record
) &&
233 #if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED)
234 process_midi(keycode
, record
) &&
237 process_audio(keycode
, record
) &&
240 process_steno(keycode
, record
) &&
242 #if (defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC))) && !defined(NO_MUSIC_MODE)
243 process_music(keycode
, record
) &&
245 #ifdef TAP_DANCE_ENABLE
246 process_tap_dance(keycode
, record
) &&
248 #if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)
249 process_unicode_common(keycode
, record
) &&
252 process_leader(keycode
, record
) &&
255 process_combo(keycode
, record
) &&
257 #ifdef PRINTING_ENABLE
258 process_printer(keycode
, record
) &&
260 #ifdef AUTO_SHIFT_ENABLE
261 process_auto_shift(keycode
, record
) &&
263 #ifdef TERMINAL_ENABLE
264 process_terminal(keycode
, record
) &&
266 #ifdef SPACE_CADET_ENABLE
267 process_space_cadet(keycode
, record
) &&
273 // Shift / paren setup
277 if (record
->event
.pressed
) {
282 if (record
->event
.pressed
) {
285 print("DEBUG: enabled.\n");
287 print("DEBUG: disabled.\n");
292 if (record
->event
.pressed
) {
296 #ifdef FAUXCLICKY_ENABLE
298 if (record
->event
.pressed
) {
303 if (record
->event
.pressed
) {
308 if (record
->event
.pressed
) {
313 #if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
315 // Split keyboards need to trigger on key-up for edge-case issue
316 # ifndef SPLIT_KEYBOARD
317 if (record
->event
.pressed
) {
319 if (!record
->event
.pressed
) {
324 case RGB_MODE_FORWARD
:
325 if (record
->event
.pressed
) {
326 uint8_t shifted
= get_mods() & (MOD_BIT(KC_LSHIFT
) | MOD_BIT(KC_RSHIFT
));
328 rgblight_step_reverse();
334 case RGB_MODE_REVERSE
:
335 if (record
->event
.pressed
) {
336 uint8_t shifted
= get_mods() & (MOD_BIT(KC_LSHIFT
) | MOD_BIT(KC_RSHIFT
));
340 rgblight_step_reverse();
345 // Split keyboards need to trigger on key-up for edge-case issue
346 # ifndef SPLIT_KEYBOARD
347 if (record
->event
.pressed
) {
349 if (!record
->event
.pressed
) {
351 rgblight_increase_hue();
355 // Split keyboards need to trigger on key-up for edge-case issue
356 # ifndef SPLIT_KEYBOARD
357 if (record
->event
.pressed
) {
359 if (!record
->event
.pressed
) {
361 rgblight_decrease_hue();
365 // Split keyboards need to trigger on key-up for edge-case issue
366 # ifndef SPLIT_KEYBOARD
367 if (record
->event
.pressed
) {
369 if (!record
->event
.pressed
) {
371 rgblight_increase_sat();
375 // Split keyboards need to trigger on key-up for edge-case issue
376 # ifndef SPLIT_KEYBOARD
377 if (record
->event
.pressed
) {
379 if (!record
->event
.pressed
) {
381 rgblight_decrease_sat();
385 // Split keyboards need to trigger on key-up for edge-case issue
386 # ifndef SPLIT_KEYBOARD
387 if (record
->event
.pressed
) {
389 if (!record
->event
.pressed
) {
391 rgblight_increase_val();
395 // Split keyboards need to trigger on key-up for edge-case issue
396 # ifndef SPLIT_KEYBOARD
397 if (record
->event
.pressed
) {
399 if (!record
->event
.pressed
) {
401 rgblight_decrease_val();
405 if (record
->event
.pressed
) {
406 rgblight_increase_speed();
410 if (record
->event
.pressed
) {
411 rgblight_decrease_speed();
415 if (record
->event
.pressed
) {
416 rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT
);
419 case RGB_MODE_BREATHE
:
420 # ifdef RGBLIGHT_EFFECT_BREATHING
421 if (record
->event
.pressed
) {
422 if ((RGBLIGHT_MODE_BREATHING
<= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_BREATHING_end
)) {
425 rgblight_mode(RGBLIGHT_MODE_BREATHING
);
430 case RGB_MODE_RAINBOW
:
431 # ifdef RGBLIGHT_EFFECT_RAINBOW_MOOD
432 if (record
->event
.pressed
) {
433 if ((RGBLIGHT_MODE_RAINBOW_MOOD
<= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_RAINBOW_MOOD_end
)) {
436 rgblight_mode(RGBLIGHT_MODE_RAINBOW_MOOD
);
442 # ifdef RGBLIGHT_EFFECT_RAINBOW_SWIRL
443 if (record
->event
.pressed
) {
444 if ((RGBLIGHT_MODE_RAINBOW_SWIRL
<= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_RAINBOW_SWIRL_end
)) {
447 rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL
);
453 # ifdef RGBLIGHT_EFFECT_SNAKE
454 if (record
->event
.pressed
) {
455 if ((RGBLIGHT_MODE_SNAKE
<= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_SNAKE_end
)) {
458 rgblight_mode(RGBLIGHT_MODE_SNAKE
);
463 case RGB_MODE_KNIGHT
:
464 # ifdef RGBLIGHT_EFFECT_KNIGHT
465 if (record
->event
.pressed
) {
466 if ((RGBLIGHT_MODE_KNIGHT
<= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_KNIGHT_end
)) {
469 rgblight_mode(RGBLIGHT_MODE_KNIGHT
);
475 # ifdef RGBLIGHT_EFFECT_CHRISTMAS
476 if (record
->event
.pressed
) {
477 rgblight_mode(RGBLIGHT_MODE_CHRISTMAS
);
481 case RGB_MODE_GRADIENT
:
482 # ifdef RGBLIGHT_EFFECT_STATIC_GRADIENT
483 if (record
->event
.pressed
) {
484 if ((RGBLIGHT_MODE_STATIC_GRADIENT
<= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_STATIC_GRADIENT_end
)) {
487 rgblight_mode(RGBLIGHT_MODE_STATIC_GRADIENT
);
492 case RGB_MODE_RGBTEST
:
493 # ifdef RGBLIGHT_EFFECT_RGB_TEST
494 if (record
->event
.pressed
) {
495 rgblight_mode(RGBLIGHT_MODE_RGB_TEST
);
499 #endif // defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
500 #ifdef VELOCIKEY_ENABLE
502 if (record
->event
.pressed
) {
509 if (record
->event
.pressed
) {
510 set_output(OUTPUT_AUTO
);
514 if (record
->event
.pressed
) {
515 set_output(OUTPUT_USB
);
518 # ifdef BLUETOOTH_ENABLE
520 if (record
->event
.pressed
) {
521 set_output(OUTPUT_BLUETOOTH
);
526 case MAGIC_SWAP_CONTROL_CAPSLOCK
... MAGIC_TOGGLE_ALT_GUI
:
527 case MAGIC_SWAP_LCTL_LGUI
... MAGIC_EE_HANDS_RIGHT
:
528 if (record
->event
.pressed
) {
529 // MAGIC actions (BOOTMAGIC without the boot)
530 if (!eeconfig_is_enabled()) {
534 keymap_config
.raw
= eeconfig_read_keymap();
536 case MAGIC_SWAP_CONTROL_CAPSLOCK
:
537 keymap_config
.swap_control_capslock
= true;
539 case MAGIC_CAPSLOCK_TO_CONTROL
:
540 keymap_config
.capslock_to_control
= true;
542 case MAGIC_SWAP_LALT_LGUI
:
543 keymap_config
.swap_lalt_lgui
= true;
545 case MAGIC_SWAP_RALT_RGUI
:
546 keymap_config
.swap_ralt_rgui
= true;
548 case MAGIC_SWAP_LCTL_LGUI
:
549 keymap_config
.swap_lctl_lgui
= true;
551 case MAGIC_SWAP_RCTL_RGUI
:
552 keymap_config
.swap_rctl_rgui
= true;
555 keymap_config
.no_gui
= true;
557 case MAGIC_SWAP_GRAVE_ESC
:
558 keymap_config
.swap_grave_esc
= true;
560 case MAGIC_SWAP_BACKSLASH_BACKSPACE
:
561 keymap_config
.swap_backslash_backspace
= true;
563 case MAGIC_HOST_NKRO
:
564 keymap_config
.nkro
= true;
566 case MAGIC_SWAP_ALT_GUI
:
567 keymap_config
.swap_lalt_lgui
= keymap_config
.swap_ralt_rgui
= true;
569 PLAY_SONG(ag_swap_song
);
572 case MAGIC_SWAP_CTL_GUI
:
573 keymap_config
.swap_lctl_lgui
= keymap_config
.swap_rctl_rgui
= true;
575 PLAY_SONG(cg_swap_song
);
578 case MAGIC_UNSWAP_CONTROL_CAPSLOCK
:
579 keymap_config
.swap_control_capslock
= false;
581 case MAGIC_UNCAPSLOCK_TO_CONTROL
:
582 keymap_config
.capslock_to_control
= false;
584 case MAGIC_UNSWAP_LALT_LGUI
:
585 keymap_config
.swap_lalt_lgui
= false;
587 case MAGIC_UNSWAP_RALT_RGUI
:
588 keymap_config
.swap_ralt_rgui
= false;
590 case MAGIC_UNSWAP_LCTL_LGUI
:
591 keymap_config
.swap_lctl_lgui
= false;
593 case MAGIC_UNSWAP_RCTL_RGUI
:
594 keymap_config
.swap_rctl_rgui
= false;
597 keymap_config
.no_gui
= false;
599 case MAGIC_UNSWAP_GRAVE_ESC
:
600 keymap_config
.swap_grave_esc
= false;
602 case MAGIC_UNSWAP_BACKSLASH_BACKSPACE
:
603 keymap_config
.swap_backslash_backspace
= false;
605 case MAGIC_UNHOST_NKRO
:
606 keymap_config
.nkro
= false;
608 case MAGIC_UNSWAP_ALT_GUI
:
609 keymap_config
.swap_lalt_lgui
= keymap_config
.swap_ralt_rgui
= false;
611 PLAY_SONG(ag_norm_song
);
614 case MAGIC_UNSWAP_CTL_GUI
:
615 keymap_config
.swap_lctl_lgui
= keymap_config
.swap_rctl_rgui
= false;
617 PLAY_SONG(cg_norm_song
);
620 case MAGIC_TOGGLE_ALT_GUI
:
621 keymap_config
.swap_lalt_lgui
= !keymap_config
.swap_lalt_lgui
;
622 keymap_config
.swap_ralt_rgui
= keymap_config
.swap_lalt_lgui
;
624 if (keymap_config
.swap_ralt_rgui
) {
625 PLAY_SONG(ag_swap_song
);
627 PLAY_SONG(ag_norm_song
);
631 case MAGIC_TOGGLE_CTL_GUI
:
632 keymap_config
.swap_lctl_lgui
= !keymap_config
.swap_lctl_lgui
;
633 keymap_config
.swap_rctl_rgui
= keymap_config
.swap_lctl_lgui
;
635 if (keymap_config
.swap_rctl_rgui
) {
636 PLAY_SONG(cg_swap_song
);
638 PLAY_SONG(cg_norm_song
);
642 case MAGIC_TOGGLE_NKRO
:
643 keymap_config
.nkro
= !keymap_config
.nkro
;
645 case MAGIC_EE_HANDS_LEFT
:
646 eeconfig_update_handedness(true);
648 case MAGIC_EE_HANDS_RIGHT
:
649 eeconfig_update_handedness(false);
654 eeconfig_update_keymap(keymap_config
.raw
);
655 clear_keyboard(); // clear to prevent stuck keys
662 uint8_t shifted
= get_mods() & ((MOD_BIT(KC_LSHIFT
) | MOD_BIT(KC_RSHIFT
) | MOD_BIT(KC_LGUI
) | MOD_BIT(KC_RGUI
)));
664 #ifdef GRAVE_ESC_ALT_OVERRIDE
665 // if ALT is pressed, ESC is always sent
666 // this is handy for the cmd+opt+esc shortcut on macOS, among other things.
667 if (get_mods() & (MOD_BIT(KC_LALT
) | MOD_BIT(KC_RALT
))) {
672 #ifdef GRAVE_ESC_CTRL_OVERRIDE
673 // if CTRL is pressed, ESC is always sent
674 // this is handy for the ctrl+shift+esc shortcut on windows, among other things.
675 if (get_mods() & (MOD_BIT(KC_LCTL
) | MOD_BIT(KC_RCTL
))) {
680 #ifdef GRAVE_ESC_GUI_OVERRIDE
681 // if GUI is pressed, ESC is always sent
682 if (get_mods() & (MOD_BIT(KC_LGUI
) | MOD_BIT(KC_RGUI
))) {
687 #ifdef GRAVE_ESC_SHIFT_OVERRIDE
688 // if SHIFT is pressed, ESC is always sent
689 if (get_mods() & (MOD_BIT(KC_LSHIFT
) | MOD_BIT(KC_RSHIFT
))) {
694 if (record
->event
.pressed
) {
695 grave_esc_was_shifted
= shifted
;
696 add_key(shifted
? KC_GRAVE
: KC_ESCAPE
);
698 del_key(grave_esc_was_shifted
? KC_GRAVE
: KC_ESCAPE
);
701 send_keyboard_report();
705 #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_BREATHING)
707 if (record
->event
.pressed
) {
708 backlight_toggle_breathing();
715 return process_action_kb(record
);
718 __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,
720 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};
722 __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,
724 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};
726 __attribute__((weak
)) const uint8_t ascii_to_keycode_lut
[128] PROGMEM
= {// NUL SOH STX ETX EOT ENQ ACK BEL
727 XXXXXXX
, XXXXXXX
, XXXXXXX
, XXXXXXX
, XXXXXXX
, XXXXXXX
, XXXXXXX
, XXXXXXX
,
728 // BS TAB LF VT FF CR SO SI
729 KC_BSPC
, KC_TAB
, KC_ENT
, XXXXXXX
, XXXXXXX
, XXXXXXX
, XXXXXXX
, XXXXXXX
,
730 // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
731 XXXXXXX
, XXXXXXX
, XXXXXXX
, XXXXXXX
, XXXXXXX
, XXXXXXX
, XXXXXXX
, XXXXXXX
,
732 // CAN EM SUB ESC FS GS RS US
733 XXXXXXX
, XXXXXXX
, XXXXXXX
, KC_ESC
, XXXXXXX
, XXXXXXX
, XXXXXXX
, XXXXXXX
,
736 KC_SPC
, KC_1
, KC_QUOT
, KC_3
, KC_4
, KC_5
, KC_7
, KC_QUOT
,
738 KC_9
, KC_0
, KC_8
, KC_EQL
, KC_COMM
, KC_MINS
, KC_DOT
, KC_SLSH
,
740 KC_0
, KC_1
, KC_2
, KC_3
, KC_4
, KC_5
, KC_6
, KC_7
,
742 KC_8
, KC_9
, KC_SCLN
, KC_SCLN
, KC_COMM
, KC_EQL
, KC_DOT
, KC_SLSH
,
744 KC_2
, KC_A
, KC_B
, KC_C
, KC_D
, KC_E
, KC_F
, KC_G
,
746 KC_H
, KC_I
, KC_J
, KC_K
, KC_L
, KC_M
, KC_N
, KC_O
,
748 KC_P
, KC_Q
, KC_R
, KC_S
, KC_T
, KC_U
, KC_V
, KC_W
,
750 KC_X
, KC_Y
, KC_Z
, KC_LBRC
, KC_BSLS
, KC_RBRC
, KC_6
, KC_MINS
,
752 KC_GRV
, KC_A
, KC_B
, KC_C
, KC_D
, KC_E
, KC_F
, KC_G
,
754 KC_H
, KC_I
, KC_J
, KC_K
, KC_L
, KC_M
, KC_N
, KC_O
,
756 KC_P
, KC_Q
, KC_R
, KC_S
, KC_T
, KC_U
, KC_V
, KC_W
,
758 KC_X
, KC_Y
, KC_Z
, KC_LBRC
, KC_BSLS
, KC_RBRC
, KC_GRV
, KC_DEL
};
760 void send_string(const char *str
) { send_string_with_delay(str
, 0); }
762 void send_string_P(const char *str
) { send_string_with_delay_P(str
, 0); }
764 void send_string_with_delay(const char *str
, uint8_t interval
) {
766 char ascii_code
= *str
;
767 if (!ascii_code
) break;
768 if (ascii_code
== SS_TAP_CODE
) {
770 uint8_t keycode
= *(++str
);
771 register_code(keycode
);
772 unregister_code(keycode
);
773 } else if (ascii_code
== SS_DOWN_CODE
) {
775 uint8_t keycode
= *(++str
);
776 register_code(keycode
);
777 } else if (ascii_code
== SS_UP_CODE
) {
779 uint8_t keycode
= *(++str
);
780 unregister_code(keycode
);
782 send_char(ascii_code
);
787 uint8_t ms
= interval
;
788 while (ms
--) wait_ms(1);
793 void send_string_with_delay_P(const char *str
, uint8_t interval
) {
795 char ascii_code
= pgm_read_byte(str
);
796 if (!ascii_code
) break;
797 if (ascii_code
== SS_TAP_CODE
) {
799 uint8_t keycode
= pgm_read_byte(++str
);
800 register_code(keycode
);
801 unregister_code(keycode
);
802 } else if (ascii_code
== SS_DOWN_CODE
) {
804 uint8_t keycode
= pgm_read_byte(++str
);
805 register_code(keycode
);
806 } else if (ascii_code
== SS_UP_CODE
) {
808 uint8_t keycode
= pgm_read_byte(++str
);
809 unregister_code(keycode
);
811 send_char(ascii_code
);
816 uint8_t ms
= interval
;
817 while (ms
--) wait_ms(1);
822 void send_char(char ascii_code
) {
823 uint8_t keycode
= pgm_read_byte(&ascii_to_keycode_lut
[(uint8_t)ascii_code
]);
824 bool is_shifted
= pgm_read_byte(&ascii_to_shift_lut
[(uint8_t)ascii_code
]);
825 bool is_altgred
= pgm_read_byte(&ascii_to_altgr_lut
[(uint8_t)ascii_code
]);
828 register_code(KC_LSFT
);
831 register_code(KC_RALT
);
835 unregister_code(KC_RALT
);
838 unregister_code(KC_LSFT
);
842 void set_single_persistent_default_layer(uint8_t default_layer
) {
843 #if defined(AUDIO_ENABLE) && defined(DEFAULT_LAYER_SONGS)
844 PLAY_SONG(default_layer_songs
[default_layer
]);
846 eeconfig_update_default_layer(1U << default_layer
);
847 default_layer_set(1U << default_layer
);
850 layer_state_t
update_tri_layer_state(layer_state_t state
, uint8_t layer1
, uint8_t layer2
, uint8_t layer3
) {
851 layer_state_t mask12
= (1UL << layer1
) | (1UL << layer2
);
852 layer_state_t mask3
= 1UL << layer3
;
853 return (state
& mask12
) == mask12
? (state
| mask3
) : (state
& ~mask3
);
856 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
)); }
858 void tap_random_base64(void) {
859 #if defined(__AVR_ATmega32U4__)
860 uint8_t key
= (TCNT0
+ TCNT1
+ TCNT3
+ TCNT4
) % 64;
862 uint8_t key
= rand() % 64;
866 register_code(KC_LSFT
);
867 register_code(key
+ KC_A
);
868 unregister_code(key
+ KC_A
);
869 unregister_code(KC_LSFT
);
872 register_code(key
- 26 + KC_A
);
873 unregister_code(key
- 26 + KC_A
);
877 unregister_code(KC_0
);
880 register_code(key
- 53 + KC_1
);
881 unregister_code(key
- 53 + KC_1
);
884 register_code(KC_LSFT
);
885 register_code(KC_EQL
);
886 unregister_code(KC_EQL
);
887 unregister_code(KC_LSFT
);
890 register_code(KC_SLSH
);
891 unregister_code(KC_SLSH
);
896 __attribute__((weak
)) void bootmagic_lite(void) {
897 // The lite version of TMK's bootmagic based on Wilba.
898 // 100% less potential for accidentally making the
899 // keyboard do stupid things.
901 // We need multiple scans because debouncing can't be turned off.
903 #if defined(DEBOUNCING_DELAY) && DEBOUNCING_DELAY > 0
904 wait_ms(DEBOUNCING_DELAY
* 2);
905 #elif defined(DEBOUNCE) && DEBOUNCE > 0
906 wait_ms(DEBOUNCE
* 2);
912 // If the Esc and space bar are held down on power up,
913 // reset the EEPROM valid state and jump to bootloader.
914 // Assumes Esc is at [0,0].
915 // This isn't very generalized, but we need something that doesn't
916 // rely on user's keymaps in firmware or EEPROM.
917 if (matrix_get_row(BOOTMAGIC_LITE_ROW
) & (1 << BOOTMAGIC_LITE_COLUMN
)) {
919 // Jump to bootloader.
924 void matrix_init_quantum() {
925 #ifdef BOOTMAGIC_LITE
928 if (!eeconfig_is_enabled()) {
931 #ifdef BACKLIGHT_ENABLE
932 # ifdef LED_MATRIX_ENABLE
935 backlight_init_ports();
941 #ifdef RGB_MATRIX_ENABLE
944 #ifdef ENCODER_ENABLE
947 #if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)
948 unicode_input_mode_init();
953 #ifdef OUTPUT_AUTO_ENABLE
954 set_output(OUTPUT_AUTO
);
956 #ifdef DIP_SWITCH_ENABLE
963 void matrix_scan_quantum() {
964 #if defined(AUDIO_ENABLE) && !defined(NO_MUSIC_MODE)
968 #ifdef TAP_DANCE_ENABLE
969 matrix_scan_tap_dance();
976 #if defined(BACKLIGHT_ENABLE)
977 # if defined(LED_MATRIX_ENABLE)
979 # elif defined(BACKLIGHT_PIN)
984 #ifdef RGB_MATRIX_ENABLE
988 #ifdef ENCODER_ENABLE
996 #ifdef DIP_SWITCH_ENABLE
997 dip_switch_read(false);
1003 #ifdef HD44780_ENABLED
1004 # include "hd44780.h"
1007 // Functions for spitting out values
1010 void send_dword(uint32_t number
) { // this might not actually work
1011 uint16_t word
= (number
>> 16);
1013 send_word(number
& 0xFFFFUL
);
1016 void send_word(uint16_t number
) {
1017 uint8_t byte
= number
>> 8;
1019 send_byte(number
& 0xFF);
1022 void send_byte(uint8_t number
) {
1023 uint8_t nibble
= number
>> 4;
1024 send_nibble(nibble
);
1025 send_nibble(number
& 0xF);
1028 void send_nibble(uint8_t number
) {
1031 register_code(KC_0
);
1032 unregister_code(KC_0
);
1035 register_code(KC_1
+ (number
- 1));
1036 unregister_code(KC_1
+ (number
- 1));
1039 register_code(KC_A
+ (number
- 0xA));
1040 unregister_code(KC_A
+ (number
- 0xA));
1045 __attribute__((weak
)) uint16_t hex_to_keycode(uint8_t hex
) {
1049 } else if (hex
< 0xA) {
1050 return KC_1
+ (hex
- 0x1);
1052 return KC_A
+ (hex
- 0xA);
1056 void api_send_unicode(uint32_t unicode
) {
1059 dword_to_bytes(unicode
, chunk
);
1060 MT_SEND_DATA(DT_UNICODE
, chunk
, 5);
1064 __attribute__((weak
)) void led_set_user(uint8_t usb_led
) {}
1066 __attribute__((weak
)) void led_set_kb(uint8_t usb_led
) { led_set_user(usb_led
); }
1068 __attribute__((weak
)) void led_init_ports(void) {}
1070 __attribute__((weak
)) void led_set(uint8_t usb_led
) {
1071 #if defined(BACKLIGHT_CAPS_LOCK) && defined(BACKLIGHT_ENABLE)
1072 // Use backlight as Caps Lock indicator
1073 uint8_t bl_toggle_lvl
= 0;
1075 if (IS_LED_ON(usb_led
, USB_LED_CAPS_LOCK
) && !backlight_config
.enable
) {
1076 // Turning Caps Lock ON and backlight is disabled in config
1077 // Toggling backlight to the brightest level
1078 bl_toggle_lvl
= BACKLIGHT_LEVELS
;
1079 } else if (IS_LED_OFF(usb_led
, USB_LED_CAPS_LOCK
) && backlight_config
.enable
) {
1080 // Turning Caps Lock OFF and backlight is enabled in config
1081 // Toggling backlight and restoring config level
1082 bl_toggle_lvl
= backlight_config
.level
;
1085 // Set level without modify backlight_config to keep ability to restore state
1086 backlight_set(bl_toggle_lvl
);
1089 led_set_kb(usb_led
);
1092 //------------------------------------------------------------------------------
1093 // Override these functions in your keymap file to play different tunes on
1094 // different events such as startup and bootloader jump
1096 __attribute__((weak
)) void startup_user() {}
1098 __attribute__((weak
)) void shutdown_user() {}
1100 //------------------------------------------------------------------------------