Add ChibiOS support for QMK (#465)
[jackhill/qmk/firmware.git] / quantum / quantum.c
CommitLineData
1a8c0dd2
EZ
1#include "quantum.h"
2
3__attribute__ ((weak))
1a8c0dd2
EZ
4bool process_action_kb(keyrecord_t *record) {
5 return true;
6}
7
17977a7e
JH
8__attribute__ ((weak))
9bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
10 return process_record_user(keycode, record);
11}
12
13__attribute__ ((weak))
14bool process_record_user(uint16_t keycode, keyrecord_t *record) {
15 return true;
16}
17
b70248fa
JH
18// Shift / paren setup
19
20#ifndef LSPO_KEY
21 #define LSPO_KEY KC_9
22#endif
23#ifndef RSPC_KEY
24 #define RSPC_KEY KC_0
25#endif
26
8bc69afc 27static bool shift_interrupted[2] = {0, 0};
12370259 28
bf5c2cce 29bool process_record_quantum(keyrecord_t *record) {
1a8c0dd2
EZ
30
31 /* This gets the keycode from the key pressed */
32 keypos_t key = record->event.key;
33 uint16_t keycode;
34
35 #if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
36 uint8_t layer;
37
38 if (record->event.pressed) {
39 layer = layer_switch_get_layer(key);
40 update_source_layers_cache(key, layer);
41 } else {
42 layer = read_source_layers_cache(key);
43 }
44 keycode = keymap_key_to_keycode(layer, key);
45 #else
46 keycode = keymap_key_to_keycode(layer_switch_get_layer(key), key);
47 #endif
48
bf5c2cce
JH
49 // This is how you use actions here
50 // if (keycode == KC_LEAD) {
51 // action_t action;
52 // action.code = ACTION_DEFAULT_LAYER_SET(0);
53 // process_action(record, action);
54 // return false;
55 // }
56
65faab3b
JH
57 if (!(
58 process_record_kb(keycode, record) &&
fde477a9 59 #ifdef MIDI_ENABLE
65faab3b 60 process_midi(keycode, record) &&
fde477a9 61 #endif
1a8c0dd2 62 #ifdef AUDIO_ENABLE
65faab3b 63 process_music(keycode, record) &&
1a8c0dd2 64 #endif
65faab3b
JH
65 #ifdef TAP_DANCE_ENABLE
66 process_tap_dance(keycode, record) &&
67 #endif
68 #ifndef DISABLE_LEADER
69 process_leader(keycode, record) &&
70 #endif
71 #ifndef DISABLE_CHORDING
72 process_chording(keycode, record) &&
73 #endif
74 #ifdef UNICODE_ENABLE
75 process_unicode(keycode, record) &&
76 #endif
77 true)) {
78 return false;
b732b79b
JH
79 }
80
b70248fa
JH
81 // Shift / paren setup
82
12370259 83 switch(keycode) {
db32864c
JH
84 case RESET:
85 if (record->event.pressed) {
86 clear_keyboard();
87 #ifdef AUDIO_ENABLE
88 stop_all_notes();
89 shutdown_user();
90 #endif
4d4f7684 91 wait_ms(250);
db32864c
JH
92 #ifdef ATREUS_ASTAR
93 *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific
94 #endif
95 bootloader_jump();
96 return false;
97 }
98 break;
99 case DEBUG:
100 if (record->event.pressed) {
101 print("\nDEBUG: enabled.\n");
102 debug_enable = true;
103 return false;
104 }
105 break;
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()) {
110 eeconfig_init();
111 }
112 /* keymap config */
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;
133 }
134 /* UNs */
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;
154 }
155 eeconfig_update_keymap(keymap_config.raw);
156 return false;
157 }
158 break;
12370259 159 case KC_LSPO: {
db32864c
JH
160 if (record->event.pressed) {
161 shift_interrupted[0] = false;
76076db7 162 register_mods(MOD_BIT(KC_LSFT));
db32864c
JH
163 }
164 else {
165 if (!shift_interrupted[0]) {
166 register_code(LSPO_KEY);
167 unregister_code(LSPO_KEY);
168 }
76076db7 169 unregister_mods(MOD_BIT(KC_LSFT));
db32864c
JH
170 }
171 return false;
172 break;
173 }
12370259
EZ
174
175 case KC_RSPC: {
db32864c
JH
176 if (record->event.pressed) {
177 shift_interrupted[1] = false;
76076db7 178 register_mods(MOD_BIT(KC_RSFT));
db32864c
JH
179 }
180 else {
181 if (!shift_interrupted[1]) {
182 register_code(RSPC_KEY);
183 unregister_code(RSPC_KEY);
184 }
76076db7 185 unregister_mods(MOD_BIT(KC_RSFT));
db32864c
JH
186 }
187 return false;
188 break;
189 }
12370259 190 default: {
db32864c
JH
191 shift_interrupted[0] = true;
192 shift_interrupted[1] = true;
193 break;
194 }
12370259
EZ
195 }
196
1a8c0dd2
EZ
197 return process_action_kb(record);
198}
199
794aed37
ET
200const bool ascii_to_qwerty_shift_lut[0x80] PROGMEM = {
201 0, 0, 0, 0, 0, 0, 0, 0,
202 0, 0, 0, 0, 0, 0, 0, 0,
203 0, 0, 0, 0, 0, 0, 0, 0,
204 0, 0, 0, 0, 0, 0, 0, 0,
205 0, 1, 1, 1, 1, 1, 1, 0,
206 1, 1, 1, 1, 0, 0, 0, 0,
207 0, 0, 0, 0, 0, 0, 0, 0,
208 0, 0, 1, 0, 1, 0, 1, 1,
209 1, 1, 1, 1, 1, 1, 1, 1,
210 1, 1, 1, 1, 1, 1, 1, 1,
211 1, 1, 1, 1, 1, 1, 1, 1,
212 1, 1, 1, 0, 0, 0, 1, 1,
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, 1, 1, 1, 1, 0
1c9f33c0
JH
217};
218
794aed37
ET
219const uint8_t ascii_to_qwerty_keycode_lut[0x80] PROGMEM = {
220 0, 0, 0, 0, 0, 0, 0, 0,
221 KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0,
222 0, 0, 0, 0, 0, 0, 0, 0,
223 0, 0, 0, KC_ESC, 0, 0, 0, 0,
224 KC_SPC, KC_1, KC_QUOT, KC_3, KC_4, KC_5, KC_7, KC_QUOT,
225 KC_9, KC_0, KC_8, KC_EQL, KC_COMM, KC_MINS, KC_DOT, KC_SLSH,
226 KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
227 KC_8, KC_9, KC_SCLN, KC_SCLN, KC_COMM, KC_EQL, KC_DOT, KC_SLSH,
228 KC_2, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
229 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
230 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
231 KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_6, KC_MINS,
232 KC_GRV, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
233 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
234 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
235 KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL
1c9f33c0
JH
236};
237
794aed37
ET
238/* for users whose OSes are set to Colemak */
239#if 0
240#include "keymap_colemak.h"
241
242const bool ascii_to_colemak_shift_lut[0x80] PROGMEM = {
243 0, 0, 0, 0, 0, 0, 0, 0,
244 0, 0, 0, 0, 0, 0, 0, 0,
245 0, 0, 0, 0, 0, 0, 0, 0,
246 0, 0, 0, 0, 0, 0, 0, 0,
247 0, 1, 1, 1, 1, 1, 1, 0,
248 1, 1, 1, 1, 0, 0, 0, 0,
249 0, 0, 0, 0, 0, 0, 0, 0,
250 0, 0, 1, 0, 1, 0, 1, 1,
251 1, 1, 1, 1, 1, 1, 1, 1,
252 1, 1, 1, 1, 1, 1, 1, 1,
253 1, 1, 1, 1, 1, 1, 1, 1,
254 1, 1, 1, 0, 0, 0, 1, 1,
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, 1, 1, 1, 1, 0
259};
260
261const uint8_t ascii_to_colemak_keycode_lut[0x80] PROGMEM = {
262 0, 0, 0, 0, 0, 0, 0, 0,
263 KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0,
264 0, 0, 0, 0, 0, 0, 0, 0,
265 0, 0, 0, KC_ESC, 0, 0, 0, 0,
266 KC_SPC, KC_1, KC_QUOT, KC_3, KC_4, KC_5, KC_7, KC_QUOT,
267 KC_9, KC_0, KC_8, KC_EQL, KC_COMM, KC_MINS, KC_DOT, KC_SLSH,
268 KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
269 KC_8, KC_9, CM_SCLN, CM_SCLN, KC_COMM, KC_EQL, KC_DOT, KC_SLSH,
270 KC_2, CM_A, CM_B, CM_C, CM_D, CM_E, CM_F, CM_G,
271 CM_H, CM_I, CM_J, CM_K, CM_L, CM_M, CM_N, CM_O,
272 CM_P, CM_Q, CM_R, CM_S, CM_T, CM_U, CM_V, CM_W,
273 CM_X, CM_Y, CM_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_6, KC_MINS,
274 KC_GRV, CM_A, CM_B, CM_C, CM_D, CM_E, CM_F, CM_G,
275 CM_H, CM_I, CM_J, CM_K, CM_L, CM_M, CM_N, CM_O,
276 CM_P, CM_Q, CM_R, CM_S, CM_T, CM_U, CM_V, CM_W,
277 CM_X, CM_Y, CM_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL
278};
279
280#endif
281
282void send_string(const char *str) {
283 while (1) {
284 uint8_t keycode;
285 uint8_t ascii_code = pgm_read_byte(str);
286 if (!ascii_code) break;
287 keycode = pgm_read_byte(&ascii_to_qwerty_keycode_lut[ascii_code]);
288 if (pgm_read_byte(&ascii_to_qwerty_shift_lut[ascii_code])) {
289 register_code(KC_LSFT);
290 register_code(keycode);
291 unregister_code(keycode);
292 unregister_code(KC_LSFT);
293 }
294 else {
295 register_code(keycode);
296 unregister_code(keycode);
297 }
298 ++str;
1c9f33c0 299 }
1c9f33c0
JH
300}
301
db32864c
JH
302void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
303 if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
304 layer_on(layer3);
305 } else {
306 layer_off(layer3);
307 }
308}
1c9f33c0 309
197f152d 310void tap_random_base64(void) {
60fd885a
JH
311 #if defined(__AVR_ATmega32U4__)
312 uint8_t key = (TCNT0 + TCNT1 + TCNT3 + TCNT4) % 64;
313 #else
314 uint8_t key = rand() % 64;
315 #endif
197f152d
JH
316 switch (key) {
317 case 0 ... 25:
318 register_code(KC_LSFT);
319 register_code(key + KC_A);
320 unregister_code(key + KC_A);
321 unregister_code(KC_LSFT);
322 break;
323 case 26 ... 51:
324 register_code(key - 26 + KC_A);
325 unregister_code(key - 26 + KC_A);
326 break;
327 case 52:
328 register_code(KC_0);
329 unregister_code(KC_0);
330 break;
331 case 53 ... 61:
332 register_code(key - 53 + KC_1);
333 unregister_code(key - 53 + KC_1);
334 break;
335 case 62:
336 register_code(KC_LSFT);
337 register_code(KC_EQL);
338 unregister_code(KC_EQL);
339 unregister_code(KC_LSFT);
340 break;
341 case 63:
342 register_code(KC_SLSH);
343 unregister_code(KC_SLSH);
344 break;
345 }
346}
347
1a8c0dd2 348void matrix_init_quantum() {
13bb6b4b
JH
349 #ifdef BACKLIGHT_ENABLE
350 backlight_init_ports();
351 #endif
1a8c0dd2
EZ
352 matrix_init_kb();
353}
354
355void matrix_scan_quantum() {
15719f35 356 #ifdef AUDIO_ENABLE
65faab3b 357 matrix_scan_music();
15719f35 358 #endif
fde477a9 359
65faab3b
JH
360 #ifdef TAP_DANCE_ENABLE
361 matrix_scan_tap_dance();
362 #endif
1a8c0dd2 363 matrix_scan_kb();
0428214b 364}
13bb6b4b 365
13bb6b4b
JH
366#if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_PIN)
367
368static const uint8_t backlight_pin = BACKLIGHT_PIN;
369
370#if BACKLIGHT_PIN == B7
371# define COM1x1 COM1C1
372# define OCR1x OCR1C
373#elif BACKLIGHT_PIN == B6
374# define COM1x1 COM1B1
375# define OCR1x OCR1B
376#elif BACKLIGHT_PIN == B5
377# define COM1x1 COM1A1
378# define OCR1x OCR1A
379#else
380# error "Backlight pin not supported - use B5, B6, or B7"
381#endif
382
383__attribute__ ((weak))
384void backlight_init_ports(void)
385{
386
387 // Setup backlight pin as output and output low.
388 // DDRx |= n
389 _SFR_IO8((backlight_pin >> 4) + 1) |= _BV(backlight_pin & 0xF);
390 // PORTx &= ~n
391 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
392
393 // Use full 16-bit resolution.
394 ICR1 = 0xFFFF;
395
396 // I could write a wall of text here to explain... but TL;DW
397 // Go read the ATmega32u4 datasheet.
398 // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on
399
400 // Pin PB7 = OCR1C (Timer 1, Channel C)
401 // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0
402 // (i.e. start high, go low when counter matches.)
403 // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0
404 // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1
405
406 TCCR1A = _BV(COM1x1) | _BV(WGM11); // = 0b00001010;
407 TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
408
409 backlight_init();
410 #ifdef BACKLIGHT_BREATHING
411 breathing_defaults();
412 #endif
413}
414
415__attribute__ ((weak))
416void backlight_set(uint8_t level)
417{
418 // Prevent backlight blink on lowest level
419 // PORTx &= ~n
420 _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
421
422 if ( level == 0 ) {
423 // Turn off PWM control on backlight pin, revert to output low.
424 TCCR1A &= ~(_BV(COM1x1));
425 OCR1x = 0x0;
426 } else if ( level == BACKLIGHT_LEVELS ) {
427 // Turn on PWM control of backlight pin
428 TCCR1A |= _BV(COM1x1);
429 // Set the brightness
430 OCR1x = 0xFFFF;
431 } else {
432 // Turn on PWM control of backlight pin
433 TCCR1A |= _BV(COM1x1);
434 // Set the brightness
435 OCR1x = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2));
436 }
437
438 #ifdef BACKLIGHT_BREATHING
439 breathing_intensity_default();
440 #endif
441}
442
443
444#ifdef BACKLIGHT_BREATHING
445
446#define BREATHING_NO_HALT 0
447#define BREATHING_HALT_OFF 1
448#define BREATHING_HALT_ON 2
449
450static uint8_t breath_intensity;
451static uint8_t breath_speed;
452static uint16_t breathing_index;
453static uint8_t breathing_halt;
454
455void breathing_enable(void)
456{
457 if (get_backlight_level() == 0)
458 {
459 breathing_index = 0;
460 }
461 else
462 {
463 // Set breathing_index to be at the midpoint (brightest point)
464 breathing_index = 0x20 << breath_speed;
465 }
466
467 breathing_halt = BREATHING_NO_HALT;
468
469 // Enable breathing interrupt
470 TIMSK1 |= _BV(OCIE1A);
471}
472
473void breathing_pulse(void)
474{
475 if (get_backlight_level() == 0)
476 {
477 breathing_index = 0;
478 }
479 else
480 {
481 // Set breathing_index to be at the midpoint + 1 (brightest point)
482 breathing_index = 0x21 << breath_speed;
483 }
484
485 breathing_halt = BREATHING_HALT_ON;
486
487 // Enable breathing interrupt
488 TIMSK1 |= _BV(OCIE1A);
489}
490
491void breathing_disable(void)
492{
493 // Disable breathing interrupt
494 TIMSK1 &= ~_BV(OCIE1A);
495 backlight_set(get_backlight_level());
496}
497
498void breathing_self_disable(void)
499{
500 if (get_backlight_level() == 0)
501 {
502 breathing_halt = BREATHING_HALT_OFF;
503 }
504 else
505 {
506 breathing_halt = BREATHING_HALT_ON;
507 }
508
509 //backlight_set(get_backlight_level());
510}
511
512void breathing_toggle(void)
513{
514 if (!is_breathing())
515 {
516 if (get_backlight_level() == 0)
517 {
518 breathing_index = 0;
519 }
520 else
521 {
522 // Set breathing_index to be at the midpoint + 1 (brightest point)
523 breathing_index = 0x21 << breath_speed;
524 }
525
526 breathing_halt = BREATHING_NO_HALT;
527 }
528
529 // Toggle breathing interrupt
530 TIMSK1 ^= _BV(OCIE1A);
531
532 // Restore backlight level
533 if (!is_breathing())
534 {
535 backlight_set(get_backlight_level());
536 }
537}
538
539bool is_breathing(void)
540{
541 return (TIMSK1 && _BV(OCIE1A));
542}
543
544void breathing_intensity_default(void)
545{
546 //breath_intensity = (uint8_t)((uint16_t)100 * (uint16_t)get_backlight_level() / (uint16_t)BACKLIGHT_LEVELS);
547 breath_intensity = ((BACKLIGHT_LEVELS - get_backlight_level()) * ((BACKLIGHT_LEVELS + 1) / 2));
548}
549
550void breathing_intensity_set(uint8_t value)
551{
552 breath_intensity = value;
553}
554
555void breathing_speed_default(void)
556{
557 breath_speed = 4;
558}
559
560void breathing_speed_set(uint8_t value)
561{
562 bool is_breathing_now = is_breathing();
563 uint8_t old_breath_speed = breath_speed;
564
565 if (is_breathing_now)
566 {
567 // Disable breathing interrupt
568 TIMSK1 &= ~_BV(OCIE1A);
569 }
570
571 breath_speed = value;
572
573 if (is_breathing_now)
574 {
575 // Adjust index to account for new speed
576 breathing_index = (( (uint8_t)( (breathing_index) >> old_breath_speed ) ) & 0x3F) << breath_speed;
577
578 // Enable breathing interrupt
579 TIMSK1 |= _BV(OCIE1A);
580 }
581
582}
583
584void breathing_speed_inc(uint8_t value)
585{
586 if ((uint16_t)(breath_speed - value) > 10 )
587 {
588 breathing_speed_set(0);
589 }
590 else
591 {
592 breathing_speed_set(breath_speed - value);
593 }
594}
595
596void breathing_speed_dec(uint8_t value)
597{
598 if ((uint16_t)(breath_speed + value) > 10 )
599 {
600 breathing_speed_set(10);
601 }
602 else
603 {
604 breathing_speed_set(breath_speed + value);
605 }
606}
607
608void breathing_defaults(void)
609{
610 breathing_intensity_default();
611 breathing_speed_default();
612 breathing_halt = BREATHING_NO_HALT;
613}
614
615/* Breathing Sleep LED brighness(PWM On period) table
616 * (64[steps] * 4[duration]) / 64[PWM periods/s] = 4 second breath cycle
617 *
618 * http://www.wolframalpha.com/input/?i=%28sin%28+x%2F64*pi%29**8+*+255%2C+x%3D0+to+63
619 * (0..63).each {|x| p ((sin(x/64.0*PI)**8)*255).to_i }
620 */
621static const uint8_t breathing_table[64] PROGMEM = {
622 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 6, 10,
623 15, 23, 32, 44, 58, 74, 93, 113, 135, 157, 179, 199, 218, 233, 245, 252,
624255, 252, 245, 233, 218, 199, 179, 157, 135, 113, 93, 74, 58, 44, 32, 23,
625 15, 10, 6, 4, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
626};
627
628ISR(TIMER1_COMPA_vect)
629{
630 // OCR1x = (pgm_read_byte(&breathing_table[ ( (uint8_t)( (breathing_index++) >> breath_speed ) ) & 0x3F ] )) * breath_intensity;
631
632
633 uint8_t local_index = ( (uint8_t)( (breathing_index++) >> breath_speed ) ) & 0x3F;
634
635 if (((breathing_halt == BREATHING_HALT_ON) && (local_index == 0x20)) || ((breathing_halt == BREATHING_HALT_OFF) && (local_index == 0x3F)))
636 {
637 // Disable breathing interrupt
638 TIMSK1 &= ~_BV(OCIE1A);
639 }
640
641 OCR1x = (uint16_t)(((uint16_t)pgm_read_byte(&breathing_table[local_index]) * 257)) >> breath_intensity;
642
643}
644
645
646
647#endif // breathing
648
649#else // backlight
650
651__attribute__ ((weak))
652void backlight_init_ports(void)
653{
654
655}
656
657__attribute__ ((weak))
658void backlight_set(uint8_t level)
659{
660
661}
662
663#endif // backlight
664
665
666
667__attribute__ ((weak))
668void led_set_user(uint8_t usb_led) {
669
670}
671
672__attribute__ ((weak))
673void led_set_kb(uint8_t usb_led) {
674 led_set_user(usb_led);
675}
676
677__attribute__ ((weak))
678void led_init_ports(void)
679{
680
681}
682
683__attribute__ ((weak))
684void led_set(uint8_t usb_led)
685{
686
687 // Example LED Code
688 //
689 // // Using PE6 Caps Lock LED
690 // if (usb_led & (1<<USB_LED_CAPS_LOCK))
691 // {
692 // // Output high.
693 // DDRE |= (1<<6);
694 // PORTE |= (1<<6);
695 // }
696 // else
697 // {
698 // // Output low.
699 // DDRE &= ~(1<<6);
700 // PORTE &= ~(1<<6);
701 // }
702
703 led_set_kb(usb_led);
704}
705
706
287eb7ad 707//------------------------------------------------------------------------------
794aed37 708// Override these functions in your keymap file to play different tunes on
287eb7ad
JH
709// different events such as startup and bootloader jump
710
711__attribute__ ((weak))
712void startup_user() {}
713
714__attribute__ ((weak))
715void shutdown_user() {}
716
12370259 717//------------------------------------------------------------------------------