aboutsummaryrefslogtreecommitdiff
path: root/quantum/quantum.c
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/quantum.c')
-rw-r--r--quantum/quantum.c232
1 files changed, 0 insertions, 232 deletions
diff --git a/quantum/quantum.c b/quantum/quantum.c
index db99e80fa..80c4e8f00 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -14,7 +14,6 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>. 14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */ 15 */
16 16
17#include <ctype.h>
18#include "quantum.h" 17#include "quantum.h"
19 18
20#ifdef BLUETOOTH_ENABLE 19#ifdef BLUETOOTH_ENABLE
@@ -325,237 +324,6 @@ bool process_record_quantum(keyrecord_t *record) {
325 return process_action_kb(record); 324 return process_action_kb(record);
326} 325}
327 326
328// clang-format off
329
330/* Bit-Packed look-up table to convert an ASCII character to whether
331 * [Shift] needs to be sent with the keycode.
332 */
333__attribute__((weak)) const uint8_t ascii_to_shift_lut[16] PROGMEM = {
334 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
335 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
336 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
337 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
338
339 KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 0),
340 KCLUT_ENTRY(1, 1, 1, 1, 0, 0, 0, 0),
341 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
342 KCLUT_ENTRY(0, 0, 1, 0, 1, 0, 1, 1),
343 KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
344 KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
345 KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
346 KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 1, 1),
347 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
348 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
349 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
350 KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0),
351};
352
353/* Bit-Packed look-up table to convert an ASCII character to whether
354 * [AltGr] needs to be sent with the keycode.
355 */
356__attribute__((weak)) const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
357 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
358 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
359 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
360 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
361
362 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
363 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
364 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
365 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
366 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
367 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
368 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
369 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
370 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
371 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
372 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
373 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
374};
375
376/* Bit-Packed look-up table to convert an ASCII character to whether
377 * [Space] needs to be sent after the keycode
378 */
379__attribute__((weak)) const uint8_t ascii_to_dead_lut[16] PROGMEM = {
380 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
381 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
382 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
383 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
384
385 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
386 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
387 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
388 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
389 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
390 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
391 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
392 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
393 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
394 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
395 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
396 KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
397};
398
399/* Look-up table to convert an ASCII character to a keycode.
400 */
401__attribute__((weak)) const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
402 // NUL SOH STX ETX EOT ENQ ACK BEL
403 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
404 // BS TAB LF VT FF CR SO SI
405 KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
406 // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
407 XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
408 // CAN EM SUB ESC FS GS RS US
409 XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
410
411 // ! " # $ % & '
412 KC_SPC, KC_1, KC_QUOT, KC_3, KC_4, KC_5, KC_7, KC_QUOT,
413 // ( ) * + , - . /
414 KC_9, KC_0, KC_8, KC_EQL, KC_COMM, KC_MINS, KC_DOT, KC_SLSH,
415 // 0 1 2 3 4 5 6 7
416 KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
417 // 8 9 : ; < = > ?
418 KC_8, KC_9, KC_SCLN, KC_SCLN, KC_COMM, KC_EQL, KC_DOT, KC_SLSH,
419 // @ A B C D E F G
420 KC_2, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
421 // H I J K L M N O
422 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
423 // P Q R S T U V W
424 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
425 // X Y Z [ \ ] ^ _
426 KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_6, KC_MINS,
427 // ` a b c d e f g
428 KC_GRV, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
429 // h i j k l m n o
430 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
431 // p q r s t u v w
432 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
433 // x y z { | } ~ DEL
434 KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL
435};
436
437// clang-format on
438
439// Note: we bit-pack in "reverse" order to optimize loading
440#define PGM_LOADBIT(mem, pos) ((pgm_read_byte(&((mem)[(pos) / 8])) >> ((pos) % 8)) & 0x01)
441
442void send_string(const char *str) { send_string_with_delay(str, 0); }
443
444void send_string_P(const char *str) { send_string_with_delay_P(str, 0); }
445
446void send_string_with_delay(const char *str, uint8_t interval) {
447 while (1) {
448 char ascii_code = *str;
449 if (!ascii_code) break;
450 if (ascii_code == SS_QMK_PREFIX) {
451 ascii_code = *(++str);
452 if (ascii_code == SS_TAP_CODE) {
453 // tap
454 uint8_t keycode = *(++str);
455 tap_code(keycode);
456 } else if (ascii_code == SS_DOWN_CODE) {
457 // down
458 uint8_t keycode = *(++str);
459 register_code(keycode);
460 } else if (ascii_code == SS_UP_CODE) {
461 // up
462 uint8_t keycode = *(++str);
463 unregister_code(keycode);
464 } else if (ascii_code == SS_DELAY_CODE) {
465 // delay
466 int ms = 0;
467 uint8_t keycode = *(++str);
468 while (isdigit(keycode)) {
469 ms *= 10;
470 ms += keycode - '0';
471 keycode = *(++str);
472 }
473 while (ms--) wait_ms(1);
474 }
475 } else {
476 send_char(ascii_code);
477 }
478 ++str;
479 // interval
480 {
481 uint8_t ms = interval;
482 while (ms--) wait_ms(1);
483 }
484 }
485}
486
487void send_string_with_delay_P(const char *str, uint8_t interval) {
488 while (1) {
489 char ascii_code = pgm_read_byte(str);
490 if (!ascii_code) break;
491 if (ascii_code == SS_QMK_PREFIX) {
492 ascii_code = pgm_read_byte(++str);
493 if (ascii_code == SS_TAP_CODE) {
494 // tap
495 uint8_t keycode = pgm_read_byte(++str);
496 tap_code(keycode);
497 } else if (ascii_code == SS_DOWN_CODE) {
498 // down
499 uint8_t keycode = pgm_read_byte(++str);
500 register_code(keycode);
501 } else if (ascii_code == SS_UP_CODE) {
502 // up
503 uint8_t keycode = pgm_read_byte(++str);
504 unregister_code(keycode);
505 } else if (ascii_code == SS_DELAY_CODE) {
506 // delay
507 int ms = 0;
508 uint8_t keycode = pgm_read_byte(++str);
509 while (isdigit(keycode)) {
510 ms *= 10;
511 ms += keycode - '0';
512 keycode = pgm_read_byte(++str);
513 }
514 while (ms--) wait_ms(1);
515 }
516 } else {
517 send_char(ascii_code);
518 }
519 ++str;
520 // interval
521 {
522 uint8_t ms = interval;
523 while (ms--) wait_ms(1);
524 }
525 }
526}
527
528void send_char(char ascii_code) {
529#if defined(AUDIO_ENABLE) && defined(SENDSTRING_BELL)
530 if (ascii_code == '\a') { // BEL
531 PLAY_SONG(bell_song);
532 return;
533 }
534#endif
535
536 uint8_t keycode = pgm_read_byte(&ascii_to_keycode_lut[(uint8_t)ascii_code]);
537 bool is_shifted = PGM_LOADBIT(ascii_to_shift_lut, (uint8_t)ascii_code);
538 bool is_altgred = PGM_LOADBIT(ascii_to_altgr_lut, (uint8_t)ascii_code);
539 bool is_dead = PGM_LOADBIT(ascii_to_dead_lut, (uint8_t)ascii_code);
540
541 if (is_shifted) {
542 register_code(KC_LSFT);
543 }
544 if (is_altgred) {
545 register_code(KC_RALT);
546 }
547 tap_code(keycode);
548 if (is_altgred) {
549 unregister_code(KC_RALT);
550 }
551 if (is_shifted) {
552 unregister_code(KC_LSFT);
553 }
554 if (is_dead) {
555 tap_code(KC_SPACE);
556 }
557}
558
559void set_single_persistent_default_layer(uint8_t default_layer) { 327void set_single_persistent_default_layer(uint8_t default_layer) {
560#if defined(AUDIO_ENABLE) && defined(DEFAULT_LAYER_SONGS) 328#if defined(AUDIO_ENABLE) && defined(DEFAULT_LAYER_SONGS)
561 PLAY_SONG(default_layer_songs[default_layer]); 329 PLAY_SONG(default_layer_songs[default_layer]);