4 bool process_action_kb(keyrecord_t *record) {
9 bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
10 return process_record_user(keycode, record);
13 __attribute__ ((weak))
14 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
18 // Shift / paren setup
27 static bool shift_interrupted[2] = {0, 0};
29 bool process_record_quantum(keyrecord_t *record) {
31 /* This gets the keycode from the key pressed */
32 keypos_t key = record->event.key;
35 #if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
38 if (record->event.pressed) {
39 layer = layer_switch_get_layer(key);
40 update_source_layers_cache(key, layer);
42 layer = read_source_layers_cache(key);
44 keycode = keymap_key_to_keycode(layer, key);
46 keycode = keymap_key_to_keycode(layer_switch_get_layer(key), key);
49 // This is how you use actions here
50 // if (keycode == KC_LEAD) {
52 // action.code = ACTION_DEFAULT_LAYER_SET(0);
53 // process_action(record, action);
58 process_record_kb(keycode, record) &&
60 process_midi(keycode, record) &&
63 process_music(keycode, record) &&
65 #ifdef TAP_DANCE_ENABLE
66 process_tap_dance(keycode, record) &&
68 #ifndef DISABLE_LEADER
69 process_leader(keycode, record) &&
71 #ifndef DISABLE_CHORDING
72 process_chording(keycode, record) &&
75 process_unicode(keycode, record) &&
81 // Shift / paren setup
85 if (record->event.pressed) {
93 *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific
100 if (record->event.pressed) {
101 print("\nDEBUG: enabled.\n");
106 case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_UNSWAP_ALT_GUI:
107 if (record->event.pressed) {
108 // MAGIC actions (BOOTMAGIC without the boot)
109 if (!eeconfig_is_enabled()) {
113 keymap_config.raw = eeconfig_read_keymap();
114 if (keycode == MAGIC_SWAP_CONTROL_CAPSLOCK) {
115 keymap_config.swap_control_capslock = 1;
116 } else if (keycode == MAGIC_CAPSLOCK_TO_CONTROL) {
117 keymap_config.capslock_to_control = 1;
118 } else if (keycode == MAGIC_SWAP_LALT_LGUI) {
119 keymap_config.swap_lalt_lgui = 1;
120 } else if (keycode == MAGIC_SWAP_RALT_RGUI) {
121 keymap_config.swap_ralt_rgui = 1;
122 } else if (keycode == MAGIC_NO_GUI) {
123 keymap_config.no_gui = 1;
124 } else if (keycode == MAGIC_SWAP_GRAVE_ESC) {
125 keymap_config.swap_grave_esc = 1;
126 } else if (keycode == MAGIC_SWAP_BACKSLASH_BACKSPACE) {
127 keymap_config.swap_backslash_backspace = 1;
128 } else if (keycode == MAGIC_HOST_NKRO) {
129 keymap_config.nkro = 1;
130 } else if (keycode == MAGIC_SWAP_ALT_GUI) {
131 keymap_config.swap_lalt_lgui = 1;
132 keymap_config.swap_ralt_rgui = 1;
135 else if (keycode == MAGIC_UNSWAP_CONTROL_CAPSLOCK) {
136 keymap_config.swap_control_capslock = 0;
137 } else if (keycode == MAGIC_UNCAPSLOCK_TO_CONTROL) {
138 keymap_config.capslock_to_control = 0;
139 } else if (keycode == MAGIC_UNSWAP_LALT_LGUI) {
140 keymap_config.swap_lalt_lgui = 0;
141 } else if (keycode == MAGIC_UNSWAP_RALT_RGUI) {
142 keymap_config.swap_ralt_rgui = 0;
143 } else if (keycode == MAGIC_UNNO_GUI) {
144 keymap_config.no_gui = 0;
145 } else if (keycode == MAGIC_UNSWAP_GRAVE_ESC) {
146 keymap_config.swap_grave_esc = 0;
147 } else if (keycode == MAGIC_UNSWAP_BACKSLASH_BACKSPACE) {
148 keymap_config.swap_backslash_backspace = 0;
149 } else if (keycode == MAGIC_UNHOST_NKRO) {
150 keymap_config.nkro = 0;
151 } else if (keycode == MAGIC_UNSWAP_ALT_GUI) {
152 keymap_config.swap_lalt_lgui = 0;
153 keymap_config.swap_ralt_rgui = 0;
155 eeconfig_update_keymap(keymap_config.raw);
160 if (record->event.pressed) {
161 shift_interrupted[0] = false;
162 register_mods(MOD_BIT(KC_LSFT));
165 if (get_mods() & MOD_BIT(KC_RSFT)) {
166 shift_interrupted[0] = true;
167 shift_interrupted[1] = true;
169 if (!shift_interrupted[0]) {
170 register_code(LSPO_KEY);
171 unregister_code(LSPO_KEY);
173 unregister_mods(MOD_BIT(KC_LSFT));
180 if (record->event.pressed) {
181 shift_interrupted[1] = false;
182 register_mods(MOD_BIT(KC_RSFT));
185 if (get_mods() & MOD_BIT(KC_LSFT)) {
186 shift_interrupted[0] = true;
187 shift_interrupted[1] = true;
189 if (!shift_interrupted[1]) {
190 register_code(RSPC_KEY);
191 unregister_code(RSPC_KEY);
193 unregister_mods(MOD_BIT(KC_RSFT));
199 shift_interrupted[0] = true;
200 shift_interrupted[1] = true;
205 return process_action_kb(record);
208 const bool ascii_to_qwerty_shift_lut[0x80] PROGMEM = {
209 0, 0, 0, 0, 0, 0, 0, 0,
210 0, 0, 0, 0, 0, 0, 0, 0,
211 0, 0, 0, 0, 0, 0, 0, 0,
212 0, 0, 0, 0, 0, 0, 0, 0,
213 0, 1, 1, 1, 1, 1, 1, 0,
214 1, 1, 1, 1, 0, 0, 0, 0,
215 0, 0, 0, 0, 0, 0, 0, 0,
216 0, 0, 1, 0, 1, 0, 1, 1,
217 1, 1, 1, 1, 1, 1, 1, 1,
218 1, 1, 1, 1, 1, 1, 1, 1,
219 1, 1, 1, 1, 1, 1, 1, 1,
220 1, 1, 1, 0, 0, 0, 1, 1,
221 0, 0, 0, 0, 0, 0, 0, 0,
222 0, 0, 0, 0, 0, 0, 0, 0,
223 0, 0, 0, 0, 0, 0, 0, 0,
224 0, 0, 0, 1, 1, 1, 1, 0
227 const uint8_t ascii_to_qwerty_keycode_lut[0x80] PROGMEM = {
228 0, 0, 0, 0, 0, 0, 0, 0,
229 KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0,
230 0, 0, 0, 0, 0, 0, 0, 0,
231 0, 0, 0, KC_ESC, 0, 0, 0, 0,
232 KC_SPC, KC_1, KC_QUOT, KC_3, KC_4, KC_5, KC_7, KC_QUOT,
233 KC_9, KC_0, KC_8, KC_EQL, KC_COMM, KC_MINS, KC_DOT, KC_SLSH,
234 KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
235 KC_8, KC_9, KC_SCLN, KC_SCLN, KC_COMM, KC_EQL, KC_DOT, KC_SLSH,
236 KC_2, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
237 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
238 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
239 KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_6, KC_MINS,
240 KC_GRV, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
241 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
242 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
243 KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL
246 /* for users whose OSes are set to Colemak */
248 #include "keymap_colemak.h"
250 const bool ascii_to_colemak_shift_lut[0x80] PROGMEM = {
251 0, 0, 0, 0, 0, 0, 0, 0,
252 0, 0, 0, 0, 0, 0, 0, 0,
253 0, 0, 0, 0, 0, 0, 0, 0,
254 0, 0, 0, 0, 0, 0, 0, 0,
255 0, 1, 1, 1, 1, 1, 1, 0,
256 1, 1, 1, 1, 0, 0, 0, 0,
257 0, 0, 0, 0, 0, 0, 0, 0,
258 0, 0, 1, 0, 1, 0, 1, 1,
259 1, 1, 1, 1, 1, 1, 1, 1,
260 1, 1, 1, 1, 1, 1, 1, 1,
261 1, 1, 1, 1, 1, 1, 1, 1,
262 1, 1, 1, 0, 0, 0, 1, 1,
263 0, 0, 0, 0, 0, 0, 0, 0,
264 0, 0, 0, 0, 0, 0, 0, 0,
265 0, 0, 0, 0, 0, 0, 0, 0,
266 0, 0, 0, 1, 1, 1, 1, 0
269 const uint8_t ascii_to_colemak_keycode_lut[0x80] PROGMEM = {
270 0, 0, 0, 0, 0, 0, 0, 0,
271 KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0,
272 0, 0, 0, 0, 0, 0, 0, 0,
273 0, 0, 0, KC_ESC, 0, 0, 0, 0,
274 KC_SPC, KC_1, KC_QUOT, KC_3, KC_4, KC_5, KC_7, KC_QUOT,
275 KC_9, KC_0, KC_8, KC_EQL, KC_COMM, KC_MINS, KC_DOT, KC_SLSH,
276 KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
277 KC_8, KC_9, CM_SCLN, CM_SCLN, KC_COMM, KC_EQL, KC_DOT, KC_SLSH,
278 KC_2, CM_A, CM_B, CM_C, CM_D, CM_E, CM_F, CM_G,
279 CM_H, CM_I, CM_J, CM_K, CM_L, CM_M, CM_N, CM_O,
280 CM_P, CM_Q, CM_R, CM_S, CM_T, CM_U, CM_V, CM_W,
281 CM_X, CM_Y, CM_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_6, KC_MINS,
282 KC_GRV, CM_A, CM_B, CM_C, CM_D, CM_E, CM_F, CM_G,
283 CM_H, CM_I, CM_J, CM_K, CM_L, CM_M, CM_N, CM_O,
284 CM_P, CM_Q, CM_R, CM_S, CM_T, CM_U, CM_V, CM_W,
285 CM_X, CM_Y, CM_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL
290 void send_string(const char *str) {
293 uint8_t ascii_code = pgm_read_byte(str);
294 if (!ascii_code) break;
295 keycode = pgm_read_byte(&ascii_to_qwerty_keycode_lut[ascii_code]);
296 if (pgm_read_byte(&ascii_to_qwerty_shift_lut[ascii_code])) {
297 register_code(KC_LSFT);
298 register_code(keycode);
299 unregister_code(keycode);
300 unregister_code(KC_LSFT);
303 register_code(keycode);
304 unregister_code(keycode);
310 void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
311 if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
318 void tap_random_base64(void) {
319 #if defined(__AVR_ATmega32U4__)
320 uint8_t key = (TCNT0 + TCNT1 + TCNT3 + TCNT4) % 64;
322 uint8_t key = rand() % 64;
326 register_code(KC_LSFT);
327 register_code(key + KC_A);
328 unregister_code(key + KC_A);
329 unregister_code(KC_LSFT);
332 register_code(key - 26 + KC_A);
333 unregister_code(key - 26 + KC_A);
337 unregister_code(KC_0);
340 register_code(key - 53 + KC_1);
341 unregister_code(key - 53 + KC_1);
344 register_code(KC_LSFT);
345 register_code(KC_EQL);
346 unregister_code(KC_EQL);
347 unregister_code(KC_LSFT);
350 register_code(KC_SLSH);
351 unregister_code(KC_SLSH);
356 void matrix_init_quantum() {
357 #ifdef BACKLIGHT_ENABLE
358 backlight_init_ports();
363 void matrix_scan_quantum() {
368 #ifdef TAP_DANCE_ENABLE
369 matrix_scan_tap_dance();
374 #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_PIN)
376 static const uint8_t backlight_pin = BACKLIGHT_PIN;
378 #if BACKLIGHT_PIN == B7
379 # define COM1x1 COM1C1
381 #elif BACKLIGHT_PIN == B6
382 # define COM1x1 COM1B1
384 #elif BACKLIGHT_PIN == B5
385 # define COM1x1 COM1A1
388 # error "Backlight pin not supported - use B5, B6, or B7"
391 __attribute__ ((weak))
392 void backlight_init_ports(void)
395 // Setup backlight pin as output and output low.
397 _SFR_IO8((backlight_pin >> 4) + 1) |= _BV(backlight_pin & 0xF);
399 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
401 // Use full 16-bit resolution.
404 // I could write a wall of text here to explain... but TL;DW
405 // Go read the ATmega32u4 datasheet.
406 // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on
408 // Pin PB7 = OCR1C (Timer 1, Channel C)
409 // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0
410 // (i.e. start high, go low when counter matches.)
411 // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0
412 // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1
414 TCCR1A = _BV(COM1x1) | _BV(WGM11); // = 0b00001010;
415 TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
418 #ifdef BACKLIGHT_BREATHING
419 breathing_defaults();
423 __attribute__ ((weak))
424 void backlight_set(uint8_t level)
426 // Prevent backlight blink on lowest level
428 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
431 // Turn off PWM control on backlight pin, revert to output low.
432 TCCR1A &= ~(_BV(COM1x1));
434 } else if ( level == BACKLIGHT_LEVELS ) {
435 // Turn on PWM control of backlight pin
436 TCCR1A |= _BV(COM1x1);
437 // Set the brightness
440 // Turn on PWM control of backlight pin
441 TCCR1A |= _BV(COM1x1);
442 // Set the brightness
443 OCR1x = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2));
446 #ifdef BACKLIGHT_BREATHING
447 breathing_intensity_default();
452 #ifdef BACKLIGHT_BREATHING
454 #define BREATHING_NO_HALT 0
455 #define BREATHING_HALT_OFF 1
456 #define BREATHING_HALT_ON 2
458 static uint8_t breath_intensity;
459 static uint8_t breath_speed;
460 static uint16_t breathing_index;
461 static uint8_t breathing_halt;
463 void breathing_enable(void)
465 if (get_backlight_level() == 0)
471 // Set breathing_index to be at the midpoint (brightest point)
472 breathing_index = 0x20 << breath_speed;
475 breathing_halt = BREATHING_NO_HALT;
477 // Enable breathing interrupt
478 TIMSK1 |= _BV(OCIE1A);
481 void breathing_pulse(void)
483 if (get_backlight_level() == 0)
489 // Set breathing_index to be at the midpoint + 1 (brightest point)
490 breathing_index = 0x21 << breath_speed;
493 breathing_halt = BREATHING_HALT_ON;
495 // Enable breathing interrupt
496 TIMSK1 |= _BV(OCIE1A);
499 void breathing_disable(void)
501 // Disable breathing interrupt
502 TIMSK1 &= ~_BV(OCIE1A);
503 backlight_set(get_backlight_level());
506 void breathing_self_disable(void)
508 if (get_backlight_level() == 0)
510 breathing_halt = BREATHING_HALT_OFF;
514 breathing_halt = BREATHING_HALT_ON;
517 //backlight_set(get_backlight_level());
520 void breathing_toggle(void)
524 if (get_backlight_level() == 0)
530 // Set breathing_index to be at the midpoint + 1 (brightest point)
531 breathing_index = 0x21 << breath_speed;
534 breathing_halt = BREATHING_NO_HALT;
537 // Toggle breathing interrupt
538 TIMSK1 ^= _BV(OCIE1A);
540 // Restore backlight level
543 backlight_set(get_backlight_level());
547 bool is_breathing(void)
549 return (TIMSK1 && _BV(OCIE1A));
552 void breathing_intensity_default(void)
554 //breath_intensity = (uint8_t)((uint16_t)100 * (uint16_t)get_backlight_level() / (uint16_t)BACKLIGHT_LEVELS);
555 breath_intensity = ((BACKLIGHT_LEVELS - get_backlight_level()) * ((BACKLIGHT_LEVELS + 1) / 2));
558 void breathing_intensity_set(uint8_t value)
560 breath_intensity = value;
563 void breathing_speed_default(void)
568 void breathing_speed_set(uint8_t value)
570 bool is_breathing_now = is_breathing();
571 uint8_t old_breath_speed = breath_speed;
573 if (is_breathing_now)
575 // Disable breathing interrupt
576 TIMSK1 &= ~_BV(OCIE1A);
579 breath_speed = value;
581 if (is_breathing_now)
583 // Adjust index to account for new speed
584 breathing_index = (( (uint8_t)( (breathing_index) >> old_breath_speed ) ) & 0x3F) << breath_speed;
586 // Enable breathing interrupt
587 TIMSK1 |= _BV(OCIE1A);
592 void breathing_speed_inc(uint8_t value)
594 if ((uint16_t)(breath_speed - value) > 10 )
596 breathing_speed_set(0);
600 breathing_speed_set(breath_speed - value);
604 void breathing_speed_dec(uint8_t value)
606 if ((uint16_t)(breath_speed + value) > 10 )
608 breathing_speed_set(10);
612 breathing_speed_set(breath_speed + value);
616 void breathing_defaults(void)
618 breathing_intensity_default();
619 breathing_speed_default();
620 breathing_halt = BREATHING_NO_HALT;
623 /* Breathing Sleep LED brighness(PWM On period) table
624 * (64[steps] * 4[duration]) / 64[PWM periods/s] = 4 second breath cycle
626 * http://www.wolframalpha.com/input/?i=%28sin%28+x%2F64*pi%29**8+*+255%2C+x%3D0+to+63
627 * (0..63).each {|x| p ((sin(x/64.0*PI)**8)*255).to_i }
629 static const uint8_t breathing_table[64] PROGMEM = {
630 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 6, 10,
631 15, 23, 32, 44, 58, 74, 93, 113, 135, 157, 179, 199, 218, 233, 245, 252,
632 255, 252, 245, 233, 218, 199, 179, 157, 135, 113, 93, 74, 58, 44, 32, 23,
633 15, 10, 6, 4, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
636 ISR(TIMER1_COMPA_vect)
638 // OCR1x = (pgm_read_byte(&breathing_table[ ( (uint8_t)( (breathing_index++) >> breath_speed ) ) & 0x3F ] )) * breath_intensity;
641 uint8_t local_index = ( (uint8_t)( (breathing_index++) >> breath_speed ) ) & 0x3F;
643 if (((breathing_halt == BREATHING_HALT_ON) && (local_index == 0x20)) || ((breathing_halt == BREATHING_HALT_OFF) && (local_index == 0x3F)))
645 // Disable breathing interrupt
646 TIMSK1 &= ~_BV(OCIE1A);
649 OCR1x = (uint16_t)(((uint16_t)pgm_read_byte(&breathing_table[local_index]) * 257)) >> breath_intensity;
659 __attribute__ ((weak))
660 void backlight_init_ports(void)
665 __attribute__ ((weak))
666 void backlight_set(uint8_t level)
675 __attribute__ ((weak))
676 void led_set_user(uint8_t usb_led) {
680 __attribute__ ((weak))
681 void led_set_kb(uint8_t usb_led) {
682 led_set_user(usb_led);
685 __attribute__ ((weak))
686 void led_init_ports(void)
691 __attribute__ ((weak))
692 void led_set(uint8_t usb_led)
697 // // Using PE6 Caps Lock LED
698 // if (usb_led & (1<<USB_LED_CAPS_LOCK))
715 //------------------------------------------------------------------------------
716 // Override these functions in your keymap file to play different tunes on
717 // different events such as startup and bootloader jump
719 __attribute__ ((weak))
720 void startup_user() {}
722 __attribute__ ((weak))
723 void shutdown_user() {}
725 //------------------------------------------------------------------------------