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 #ifdef DISABLE_SPACE_CADET_ROLLOVER
166 if (get_mods() & MOD_BIT(KC_RSFT)) {
167 shift_interrupted[0] = true;
168 shift_interrupted[1] = true;
171 if (!shift_interrupted[0]) {
172 register_code(LSPO_KEY);
173 unregister_code(LSPO_KEY);
175 unregister_mods(MOD_BIT(KC_LSFT));
182 if (record->event.pressed) {
183 shift_interrupted[1] = false;
184 register_mods(MOD_BIT(KC_RSFT));
187 #ifdef DISABLE_SPACE_CADET_ROLLOVER
188 if (get_mods() & MOD_BIT(KC_LSFT)) {
189 shift_interrupted[0] = true;
190 shift_interrupted[1] = true;
193 if (!shift_interrupted[1]) {
194 register_code(RSPC_KEY);
195 unregister_code(RSPC_KEY);
197 unregister_mods(MOD_BIT(KC_RSFT));
203 shift_interrupted[0] = true;
204 shift_interrupted[1] = true;
209 return process_action_kb(record);
212 const bool ascii_to_qwerty_shift_lut[0x80] PROGMEM = {
213 0, 0, 0, 0, 0, 0, 0, 0,
214 0, 0, 0, 0, 0, 0, 0, 0,
215 0, 0, 0, 0, 0, 0, 0, 0,
216 0, 0, 0, 0, 0, 0, 0, 0,
217 0, 1, 1, 1, 1, 1, 1, 0,
218 1, 1, 1, 1, 0, 0, 0, 0,
219 0, 0, 0, 0, 0, 0, 0, 0,
220 0, 0, 1, 0, 1, 0, 1, 1,
221 1, 1, 1, 1, 1, 1, 1, 1,
222 1, 1, 1, 1, 1, 1, 1, 1,
223 1, 1, 1, 1, 1, 1, 1, 1,
224 1, 1, 1, 0, 0, 0, 1, 1,
225 0, 0, 0, 0, 0, 0, 0, 0,
226 0, 0, 0, 0, 0, 0, 0, 0,
227 0, 0, 0, 0, 0, 0, 0, 0,
228 0, 0, 0, 1, 1, 1, 1, 0
231 const uint8_t ascii_to_qwerty_keycode_lut[0x80] PROGMEM = {
232 0, 0, 0, 0, 0, 0, 0, 0,
233 KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0,
234 0, 0, 0, 0, 0, 0, 0, 0,
235 0, 0, 0, KC_ESC, 0, 0, 0, 0,
236 KC_SPC, KC_1, KC_QUOT, KC_3, KC_4, KC_5, KC_7, KC_QUOT,
237 KC_9, KC_0, KC_8, KC_EQL, KC_COMM, KC_MINS, KC_DOT, KC_SLSH,
238 KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
239 KC_8, KC_9, KC_SCLN, KC_SCLN, KC_COMM, KC_EQL, KC_DOT, KC_SLSH,
240 KC_2, 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_6, KC_MINS,
244 KC_GRV, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
245 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
246 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
247 KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL
250 /* for users whose OSes are set to Colemak */
252 #include "keymap_colemak.h"
254 const bool ascii_to_colemak_shift_lut[0x80] PROGMEM = {
255 0, 0, 0, 0, 0, 0, 0, 0,
256 0, 0, 0, 0, 0, 0, 0, 0,
257 0, 0, 0, 0, 0, 0, 0, 0,
258 0, 0, 0, 0, 0, 0, 0, 0,
259 0, 1, 1, 1, 1, 1, 1, 0,
260 1, 1, 1, 1, 0, 0, 0, 0,
261 0, 0, 0, 0, 0, 0, 0, 0,
262 0, 0, 1, 0, 1, 0, 1, 1,
263 1, 1, 1, 1, 1, 1, 1, 1,
264 1, 1, 1, 1, 1, 1, 1, 1,
265 1, 1, 1, 1, 1, 1, 1, 1,
266 1, 1, 1, 0, 0, 0, 1, 1,
267 0, 0, 0, 0, 0, 0, 0, 0,
268 0, 0, 0, 0, 0, 0, 0, 0,
269 0, 0, 0, 0, 0, 0, 0, 0,
270 0, 0, 0, 1, 1, 1, 1, 0
273 const uint8_t ascii_to_colemak_keycode_lut[0x80] PROGMEM = {
274 0, 0, 0, 0, 0, 0, 0, 0,
275 KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0,
276 0, 0, 0, 0, 0, 0, 0, 0,
277 0, 0, 0, KC_ESC, 0, 0, 0, 0,
278 KC_SPC, KC_1, KC_QUOT, KC_3, KC_4, KC_5, KC_7, KC_QUOT,
279 KC_9, KC_0, KC_8, KC_EQL, KC_COMM, KC_MINS, KC_DOT, KC_SLSH,
280 KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
281 KC_8, KC_9, CM_SCLN, CM_SCLN, KC_COMM, KC_EQL, KC_DOT, KC_SLSH,
282 KC_2, 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_6, KC_MINS,
286 KC_GRV, CM_A, CM_B, CM_C, CM_D, CM_E, CM_F, CM_G,
287 CM_H, CM_I, CM_J, CM_K, CM_L, CM_M, CM_N, CM_O,
288 CM_P, CM_Q, CM_R, CM_S, CM_T, CM_U, CM_V, CM_W,
289 CM_X, CM_Y, CM_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL
294 void send_string(const char *str) {
297 uint8_t ascii_code = pgm_read_byte(str);
298 if (!ascii_code) break;
299 keycode = pgm_read_byte(&ascii_to_qwerty_keycode_lut[ascii_code]);
300 if (pgm_read_byte(&ascii_to_qwerty_shift_lut[ascii_code])) {
301 register_code(KC_LSFT);
302 register_code(keycode);
303 unregister_code(keycode);
304 unregister_code(KC_LSFT);
307 register_code(keycode);
308 unregister_code(keycode);
314 void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
315 if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
322 void tap_random_base64(void) {
323 #if defined(__AVR_ATmega32U4__)
324 uint8_t key = (TCNT0 + TCNT1 + TCNT3 + TCNT4) % 64;
326 uint8_t key = rand() % 64;
330 register_code(KC_LSFT);
331 register_code(key + KC_A);
332 unregister_code(key + KC_A);
333 unregister_code(KC_LSFT);
336 register_code(key - 26 + KC_A);
337 unregister_code(key - 26 + KC_A);
341 unregister_code(KC_0);
344 register_code(key - 53 + KC_1);
345 unregister_code(key - 53 + KC_1);
348 register_code(KC_LSFT);
349 register_code(KC_EQL);
350 unregister_code(KC_EQL);
351 unregister_code(KC_LSFT);
354 register_code(KC_SLSH);
355 unregister_code(KC_SLSH);
360 void matrix_init_quantum() {
361 #ifdef BACKLIGHT_ENABLE
362 backlight_init_ports();
367 void matrix_scan_quantum() {
372 #ifdef TAP_DANCE_ENABLE
373 matrix_scan_tap_dance();
378 #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_PIN)
380 static const uint8_t backlight_pin = BACKLIGHT_PIN;
382 #if BACKLIGHT_PIN == B7
383 # define COM1x1 COM1C1
385 #elif BACKLIGHT_PIN == B6
386 # define COM1x1 COM1B1
388 #elif BACKLIGHT_PIN == B5
389 # define COM1x1 COM1A1
392 # error "Backlight pin not supported - use B5, B6, or B7"
395 __attribute__ ((weak))
396 void backlight_init_ports(void)
399 // Setup backlight pin as output and output low.
401 _SFR_IO8((backlight_pin >> 4) + 1) |= _BV(backlight_pin & 0xF);
403 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
405 // Use full 16-bit resolution.
408 // I could write a wall of text here to explain... but TL;DW
409 // Go read the ATmega32u4 datasheet.
410 // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on
412 // Pin PB7 = OCR1C (Timer 1, Channel C)
413 // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0
414 // (i.e. start high, go low when counter matches.)
415 // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0
416 // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1
418 TCCR1A = _BV(COM1x1) | _BV(WGM11); // = 0b00001010;
419 TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
422 #ifdef BACKLIGHT_BREATHING
423 breathing_defaults();
427 __attribute__ ((weak))
428 void backlight_set(uint8_t level)
430 // Prevent backlight blink on lowest level
432 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
435 // Turn off PWM control on backlight pin, revert to output low.
436 TCCR1A &= ~(_BV(COM1x1));
438 } else if ( level == BACKLIGHT_LEVELS ) {
439 // Turn on PWM control of backlight pin
440 TCCR1A |= _BV(COM1x1);
441 // Set the brightness
444 // Turn on PWM control of backlight pin
445 TCCR1A |= _BV(COM1x1);
446 // Set the brightness
447 OCR1x = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2));
450 #ifdef BACKLIGHT_BREATHING
451 breathing_intensity_default();
456 #ifdef BACKLIGHT_BREATHING
458 #define BREATHING_NO_HALT 0
459 #define BREATHING_HALT_OFF 1
460 #define BREATHING_HALT_ON 2
462 static uint8_t breath_intensity;
463 static uint8_t breath_speed;
464 static uint16_t breathing_index;
465 static uint8_t breathing_halt;
467 void breathing_enable(void)
469 if (get_backlight_level() == 0)
475 // Set breathing_index to be at the midpoint (brightest point)
476 breathing_index = 0x20 << breath_speed;
479 breathing_halt = BREATHING_NO_HALT;
481 // Enable breathing interrupt
482 TIMSK1 |= _BV(OCIE1A);
485 void breathing_pulse(void)
487 if (get_backlight_level() == 0)
493 // Set breathing_index to be at the midpoint + 1 (brightest point)
494 breathing_index = 0x21 << breath_speed;
497 breathing_halt = BREATHING_HALT_ON;
499 // Enable breathing interrupt
500 TIMSK1 |= _BV(OCIE1A);
503 void breathing_disable(void)
505 // Disable breathing interrupt
506 TIMSK1 &= ~_BV(OCIE1A);
507 backlight_set(get_backlight_level());
510 void breathing_self_disable(void)
512 if (get_backlight_level() == 0)
514 breathing_halt = BREATHING_HALT_OFF;
518 breathing_halt = BREATHING_HALT_ON;
521 //backlight_set(get_backlight_level());
524 void breathing_toggle(void)
528 if (get_backlight_level() == 0)
534 // Set breathing_index to be at the midpoint + 1 (brightest point)
535 breathing_index = 0x21 << breath_speed;
538 breathing_halt = BREATHING_NO_HALT;
541 // Toggle breathing interrupt
542 TIMSK1 ^= _BV(OCIE1A);
544 // Restore backlight level
547 backlight_set(get_backlight_level());
551 bool is_breathing(void)
553 return (TIMSK1 && _BV(OCIE1A));
556 void breathing_intensity_default(void)
558 //breath_intensity = (uint8_t)((uint16_t)100 * (uint16_t)get_backlight_level() / (uint16_t)BACKLIGHT_LEVELS);
559 breath_intensity = ((BACKLIGHT_LEVELS - get_backlight_level()) * ((BACKLIGHT_LEVELS + 1) / 2));
562 void breathing_intensity_set(uint8_t value)
564 breath_intensity = value;
567 void breathing_speed_default(void)
572 void breathing_speed_set(uint8_t value)
574 bool is_breathing_now = is_breathing();
575 uint8_t old_breath_speed = breath_speed;
577 if (is_breathing_now)
579 // Disable breathing interrupt
580 TIMSK1 &= ~_BV(OCIE1A);
583 breath_speed = value;
585 if (is_breathing_now)
587 // Adjust index to account for new speed
588 breathing_index = (( (uint8_t)( (breathing_index) >> old_breath_speed ) ) & 0x3F) << breath_speed;
590 // Enable breathing interrupt
591 TIMSK1 |= _BV(OCIE1A);
596 void breathing_speed_inc(uint8_t value)
598 if ((uint16_t)(breath_speed - value) > 10 )
600 breathing_speed_set(0);
604 breathing_speed_set(breath_speed - value);
608 void breathing_speed_dec(uint8_t value)
610 if ((uint16_t)(breath_speed + value) > 10 )
612 breathing_speed_set(10);
616 breathing_speed_set(breath_speed + value);
620 void breathing_defaults(void)
622 breathing_intensity_default();
623 breathing_speed_default();
624 breathing_halt = BREATHING_NO_HALT;
627 /* Breathing Sleep LED brighness(PWM On period) table
628 * (64[steps] * 4[duration]) / 64[PWM periods/s] = 4 second breath cycle
630 * http://www.wolframalpha.com/input/?i=%28sin%28+x%2F64*pi%29**8+*+255%2C+x%3D0+to+63
631 * (0..63).each {|x| p ((sin(x/64.0*PI)**8)*255).to_i }
633 static const uint8_t breathing_table[64] PROGMEM = {
634 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 6, 10,
635 15, 23, 32, 44, 58, 74, 93, 113, 135, 157, 179, 199, 218, 233, 245, 252,
636 255, 252, 245, 233, 218, 199, 179, 157, 135, 113, 93, 74, 58, 44, 32, 23,
637 15, 10, 6, 4, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
640 ISR(TIMER1_COMPA_vect)
642 // OCR1x = (pgm_read_byte(&breathing_table[ ( (uint8_t)( (breathing_index++) >> breath_speed ) ) & 0x3F ] )) * breath_intensity;
645 uint8_t local_index = ( (uint8_t)( (breathing_index++) >> breath_speed ) ) & 0x3F;
647 if (((breathing_halt == BREATHING_HALT_ON) && (local_index == 0x20)) || ((breathing_halt == BREATHING_HALT_OFF) && (local_index == 0x3F)))
649 // Disable breathing interrupt
650 TIMSK1 &= ~_BV(OCIE1A);
653 OCR1x = (uint16_t)(((uint16_t)pgm_read_byte(&breathing_table[local_index]) * 257)) >> breath_intensity;
663 __attribute__ ((weak))
664 void backlight_init_ports(void)
669 __attribute__ ((weak))
670 void backlight_set(uint8_t level)
679 __attribute__ ((weak))
680 void led_set_user(uint8_t usb_led) {
684 __attribute__ ((weak))
685 void led_set_kb(uint8_t usb_led) {
686 led_set_user(usb_led);
689 __attribute__ ((weak))
690 void led_init_ports(void)
695 __attribute__ ((weak))
696 void led_set(uint8_t usb_led)
701 // // Using PE6 Caps Lock LED
702 // if (usb_led & (1<<USB_LED_CAPS_LOCK))
719 //------------------------------------------------------------------------------
720 // Override these functions in your keymap file to play different tunes on
721 // different events such as startup and bootloader jump
723 __attribute__ ((weak))
724 void startup_user() {}
726 __attribute__ ((weak))
727 void shutdown_user() {}
729 //------------------------------------------------------------------------------