aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShayne Holmes <shayneh@qualtrics.com>2017-06-30 12:08:09 -0700
committerJack Humbert <jack.humb@gmail.com>2017-07-05 10:55:47 -0400
commit48ff93582ba9efbe5b8a2f7392eee822e6f25526 (patch)
treeedab94f2c0d1701895da110bda1352f5dd3fb3a3
parentfdc2e8058b46f569a7a68ab21ef9cb3d20a9bdc2 (diff)
downloadqmk_firmware-48ff93582ba9efbe5b8a2f7392eee822e6f25526.tar.gz
qmk_firmware-48ff93582ba9efbe5b8a2f7392eee822e6f25526.zip
Pull out sendstring variations to their own files.
Instead of having all sendstring keycode mappings in the main quantum.c file, give each one its own file in keymap_extras that can be #included in a user's keymap. If one is included, it will define the appropriate lookup tables and overwrite the weak definitions in quantum.c. (Including more than one sendstring definition will fail at compile time.) Update @rai-suta's test keymap to match, as well as the documentation.
-rw-r--r--docs/macros.md8
-rw-r--r--keyboards/planck/keymaps/rai-suta/Makefile3
-rw-r--r--keyboards/planck/keymaps/rai-suta/keymap.c2
-rw-r--r--quantum/keymap_extras/sendstring_colemak.h41
-rw-r--r--quantum/keymap_extras/sendstring_dvorak.h41
-rw-r--r--quantum/keymap_extras/sendstring_jis.h58
-rw-r--r--quantum/quantum.c90
-rw-r--r--quantum/quantum.h2
8 files changed, 153 insertions, 92 deletions
diff --git a/docs/macros.md b/docs/macros.md
index 1418d24ab..bbf51434a 100644
--- a/docs/macros.md
+++ b/docs/macros.md
@@ -41,7 +41,7 @@ A macro can include the following commands:
41 41
42## Sending strings 42## Sending strings
43 43
44Sometimes you just want a key to type out words or phrases. For the most common situations we've provided `SEND_STRING()`, which will type out your string for you instead of having to build a `MACRO()`. Right now it assumes a US keymap with a QWERTY layout, so if you are using something else it may not behave as you expect. 44Sometimes you just want a key to type out words or phrases. For the most common situations we've provided `SEND_STRING()`, which will type out your string for you instead of having to build a `MACRO()`.
45 45
46For example: 46For example:
47 47
@@ -58,6 +58,12 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
58}; 58};
59``` 59```
60 60
61By default, it assumes a US keymap with a QWERTY layout; if you want to change that (e.g. if your OS uses software Colemak), include this somewhere in your keymap:
62
63```
64#include <sendstring_colemak.h>
65```
66
61## Mapping a Macro to a key 67## Mapping a Macro to a key
62 68
63Use the `M()` function within your `KEYMAP()` to call a macro. For example, here is the keymap for a 2-key keyboard: 69Use the `M()` function within your `KEYMAP()` to call a macro. For example, here is the keymap for a 2-key keyboard:
diff --git a/keyboards/planck/keymaps/rai-suta/Makefile b/keyboards/planck/keymaps/rai-suta/Makefile
index 5238d3201..38efe374c 100644
--- a/keyboards/planck/keymaps/rai-suta/Makefile
+++ b/keyboards/planck/keymaps/rai-suta/Makefile
@@ -20,9 +20,6 @@ RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this
20# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE 20# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
21SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend 21SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
22 22
23# Option defines
24OPT_DEFS += -DSENDSTRING_JIS_KEYCODE
25
26ifndef QUANTUM_DIR 23ifndef QUANTUM_DIR
27 include ../../../../Makefile 24 include ../../../../Makefile
28endif \ No newline at end of file 25endif \ No newline at end of file
diff --git a/keyboards/planck/keymaps/rai-suta/keymap.c b/keyboards/planck/keymaps/rai-suta/keymap.c
index 13fc3677e..3206ffd35 100644
--- a/keyboards/planck/keymaps/rai-suta/keymap.c
+++ b/keyboards/planck/keymaps/rai-suta/keymap.c
@@ -3,6 +3,8 @@
3#include "planck.h" 3#include "planck.h"
4#include "version.h" 4#include "version.h"
5 5
6#include "sendstring_jis.h"
7
6// Keycode defines 8// Keycode defines
7#define _______ KC_TRNS 9#define _______ KC_TRNS
8#define XXXXXXX KC_NO 10#define XXXXXXX KC_NO
diff --git a/quantum/keymap_extras/sendstring_colemak.h b/quantum/keymap_extras/sendstring_colemak.h
new file mode 100644
index 000000000..fa9ace929
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_colemak.h
@@ -0,0 +1,41 @@
1/* Copyright 2016 Jack Humbert
2 *
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.
7 *
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.
12 *
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/>.
15 */
16/* Sendstring definitions for the Colemak layout */
17#ifndef SENDSTRING_COLEMAK
18#define SENDSTRING_COLEMAK
19
20#include "keymap_colemak.h"
21
22const uint8_t ascii_to_keycode_lut[0x80] PROGMEM = {
23 0, 0, 0, 0, 0, 0, 0, 0,
24 KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0,
25 0, 0, 0, 0, 0, 0, 0, 0,
26 0, 0, 0, KC_ESC, 0, 0, 0, 0,
27 KC_SPC, KC_1, KC_QUOT, KC_3, KC_4, KC_5, KC_7, KC_QUOT,
28 KC_9, KC_0, KC_8, KC_EQL, KC_COMM, KC_MINS, KC_DOT, KC_SLSH,
29 KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
30 KC_8, KC_9, CM_SCLN, CM_SCLN, KC_COMM, KC_EQL, KC_DOT, KC_SLSH,
31 KC_2, CM_A, CM_B, CM_C, CM_D, CM_E, CM_F, CM_G,
32 CM_H, CM_I, CM_J, CM_K, CM_L, CM_M, CM_N, CM_O,
33 CM_P, CM_Q, CM_R, CM_S, CM_T, CM_U, CM_V, CM_W,
34 CM_X, CM_Y, CM_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_6, KC_MINS,
35 KC_GRV, CM_A, CM_B, CM_C, CM_D, CM_E, CM_F, CM_G,
36 CM_H, CM_I, CM_J, CM_K, CM_L, CM_M, CM_N, CM_O,
37 CM_P, CM_Q, CM_R, CM_S, CM_T, CM_U, CM_V, CM_W,
38 CM_X, CM_Y, CM_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL
39};
40
41#endif
diff --git a/quantum/keymap_extras/sendstring_dvorak.h b/quantum/keymap_extras/sendstring_dvorak.h
new file mode 100644
index 000000000..f5c5c818b
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_dvorak.h
@@ -0,0 +1,41 @@
1/* Copyright 2016 Jack Humbert
2 *
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.
7 *
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.
12 *
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/>.
15 */
16/* Sendstring definitions for the Dvorak layout */
17#ifndef SENDSTRING_DVORAK
18#define SENDSTRING_DVORAK
19
20#include "keymap_dvorak.h"
21
22const uint8_t ascii_to_keycode_lut[0x80] PROGMEM = {
23 0, 0, 0, 0, 0, 0, 0, 0,
24 KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0,
25 0, 0, 0, 0, 0, 0, 0, 0,
26 0, 0, 0, KC_ESC, 0, 0, 0, 0,
27 KC_SPC, DV_1, DV_QUOT, DV_3, DV_4, DV_5, DV_7, DV_QUOT,
28 DV_9, DV_0, DV_8, DV_EQL, DV_COMM, DV_MINS, DV_DOT, DV_SLSH,
29 DV_0, DV_1, DV_2, DV_3, DV_4, DV_5, DV_6, DV_7,
30 DV_8, DV_9, DV_SCLN, DV_SCLN, DV_COMM, DV_EQL, DV_DOT, DV_SLSH,
31 DV_2, DV_A, DV_B, DV_C, DV_D, DV_E, DV_F, DV_G,
32 DV_H, DV_I, DV_J, DV_K, DV_L, DV_M, DV_N, DV_O,
33 DV_P, DV_Q, DV_R, DV_S, DV_T, DV_U, DV_V, DV_W,
34 DV_X, DV_Y, DV_Z, DV_LBRC, DV_BSLS, DV_RBRC, DV_6, DV_MINS,
35 DV_GRV, DV_A, DV_B, DV_C, DV_D, DV_E, DV_F, DV_G,
36 DV_H, DV_I, DV_J, DV_K, DV_L, DV_M, DV_N, DV_O,
37 DV_P, DV_Q, DV_R, DV_S, DV_T, DV_U, DV_V, DV_W,
38 DV_X, DV_Y, DV_Z, DV_LBRC, DV_BSLS, DV_RBRC, DV_GRV, KC_DEL
39};
40
41#endif
diff --git a/quantum/keymap_extras/sendstring_jis.h b/quantum/keymap_extras/sendstring_jis.h
new file mode 100644
index 000000000..c5a38c6a5
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_jis.h
@@ -0,0 +1,58 @@
1/* Copyright 2016 Jack Humbert
2 *
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.
7 *
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.
12 *
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/>.
15 */
16/* Sendstring definitions for the JIS keyboard layout */
17#ifndef SENDSTRING_JIS
18#define SENDSTRING_JIS
19
20const bool ascii_to_shift_lut[0x80] PROGMEM = {
21 0, 0, 0, 0, 0, 0, 0, 0,
22 0, 0, 0, 0, 0, 0, 0, 0,
23 0, 0, 0, 0, 0, 0, 0, 0,
24 0, 0, 0, 0, 0, 0, 0, 0,
25 0, 1, 1, 1, 1, 1, 1, 1,
26 1, 1, 1, 1, 0, 0, 0, 0,
27 0, 0, 0, 0, 0, 0, 0, 0,
28 0, 0, 0, 0, 1, 1, 1, 1,
29 0, 1, 1, 1, 1, 1, 1, 1,
30 1, 1, 1, 1, 1, 1, 1, 1,
31 1, 1, 1, 1, 1, 1, 1, 1,
32 1, 1, 1, 0, 0, 0, 0, 1,
33 1, 0, 0, 0, 0, 0, 0, 0,
34 0, 0, 0, 0, 0, 0, 0, 0,
35 0, 0, 0, 0, 0, 0, 0, 0,
36 0, 0, 0, 1, 1, 1, 1, 0
37};
38
39const uint8_t ascii_to_keycode_lut[0x80] PROGMEM = {
40 0, 0, 0, 0, 0, 0, 0, 0,
41 KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0,
42 0, 0, 0, 0, 0, 0, 0, 0,
43 0, 0, 0, KC_ESC, 0, 0, 0, 0,
44 KC_SPC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
45 KC_8, KC_9, KC_QUOT, KC_SCLN, KC_COMM, KC_MINS, KC_DOT, KC_SLSH,
46 KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
47 KC_8, KC_9, KC_QUOT, KC_SCLN, KC_COMM, KC_MINS, KC_DOT, KC_SLSH,
48 KC_LBRC, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
49 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
50 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
51 KC_X, KC_Y, KC_Z, KC_RBRC, KC_JYEN, KC_BSLS, KC_EQL, KC_RO,
52 KC_LBRC, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
53 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
54 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
55 KC_X, KC_Y, KC_Z, KC_RBRC, KC_JYEN, KC_BSLS, KC_EQL, KC_DEL,
56};
57
58#endif
diff --git a/quantum/quantum.c b/quantum/quantum.c
index b5acc75c3..36e586d31 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -455,28 +455,7 @@ bool process_record_quantum(keyrecord_t *record) {
455 return process_action_kb(record); 455 return process_action_kb(record);
456} 456}
457 457
458#if defined SENDSTRING_JIS_KEYCODE 458__attribute__ ((weak))
459/* for users with JIS keyboards */
460const bool ascii_to_shift_lut[0x80] PROGMEM = {
461 0, 0, 0, 0, 0, 0, 0, 0,
462 0, 0, 0, 0, 0, 0, 0, 0,
463 0, 0, 0, 0, 0, 0, 0, 0,
464 0, 0, 0, 0, 0, 0, 0, 0,
465 0, 1, 1, 1, 1, 1, 1, 1,
466 1, 1, 1, 1, 0, 0, 0, 0,
467 0, 0, 0, 0, 0, 0, 0, 0,
468 0, 0, 0, 0, 1, 1, 1, 1,
469 0, 1, 1, 1, 1, 1, 1, 1,
470 1, 1, 1, 1, 1, 1, 1, 1,
471 1, 1, 1, 1, 1, 1, 1, 1,
472 1, 1, 1, 0, 0, 0, 0, 1,
473 1, 0, 0, 0, 0, 0, 0, 0,
474 0, 0, 0, 0, 0, 0, 0, 0,
475 0, 0, 0, 0, 0, 0, 0, 0,
476 0, 0, 0, 1, 1, 1, 1, 0
477};
478#else
479/* for standard keycodes */
480const bool ascii_to_shift_lut[0x80] PROGMEM = { 459const bool ascii_to_shift_lut[0x80] PROGMEM = {
481 0, 0, 0, 0, 0, 0, 0, 0, 460 0, 0, 0, 0, 0, 0, 0, 0,
482 0, 0, 0, 0, 0, 0, 0, 0, 461 0, 0, 0, 0, 0, 0, 0, 0,
@@ -495,72 +474,8 @@ const bool ascii_to_shift_lut[0x80] PROGMEM = {
495 0, 0, 0, 0, 0, 0, 0, 0, 474 0, 0, 0, 0, 0, 0, 0, 0,
496 0, 0, 0, 1, 1, 1, 1, 0 475 0, 0, 0, 1, 1, 1, 1, 0
497}; 476};
498#endif
499 477
500#if defined SENDSTRING_JIS_KEYCODE 478__attribute__ ((weak))
501/* for users with JIS keyboards */
502const uint8_t ascii_to_keycode_lut[0x80] PROGMEM = {
503 0, 0, 0, 0, 0, 0, 0, 0,
504 KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0,
505 0, 0, 0, 0, 0, 0, 0, 0,
506 0, 0, 0, KC_ESC, 0, 0, 0, 0,
507 KC_SPC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
508 KC_8, KC_9, KC_QUOT, KC_SCLN, KC_COMM, KC_MINS, KC_DOT, KC_SLSH,
509 KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
510 KC_8, KC_9, KC_QUOT, KC_SCLN, KC_COMM, KC_MINS, KC_DOT, KC_SLSH,
511 KC_LBRC, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
512 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
513 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
514 KC_X, KC_Y, KC_Z, KC_RBRC, KC_JYEN, KC_BSLS, KC_EQL, KC_RO,
515 KC_LBRC, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
516 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
517 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
518 KC_X, KC_Y, KC_Z, KC_RBRC, KC_JYEN, KC_BSLS, KC_EQL, KC_DEL,
519};
520#elif defined SENDSTRING_COLEMAK_KEYCODE
521/* for users whose OSes are set to Colemak */
522#include "keymap_colemak.h"
523const uint8_t ascii_to_keycode_lut[0x80] PROGMEM = {
524 0, 0, 0, 0, 0, 0, 0, 0,
525 KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0,
526 0, 0, 0, 0, 0, 0, 0, 0,
527 0, 0, 0, KC_ESC, 0, 0, 0, 0,
528 KC_SPC, KC_1, KC_QUOT, KC_3, KC_4, KC_5, KC_7, KC_QUOT,
529 KC_9, KC_0, KC_8, KC_EQL, KC_COMM, KC_MINS, KC_DOT, KC_SLSH,
530 KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
531 KC_8, KC_9, CM_SCLN, CM_SCLN, KC_COMM, KC_EQL, KC_DOT, KC_SLSH,
532 KC_2, CM_A, CM_B, CM_C, CM_D, CM_E, CM_F, CM_G,
533 CM_H, CM_I, CM_J, CM_K, CM_L, CM_M, CM_N, CM_O,
534 CM_P, CM_Q, CM_R, CM_S, CM_T, CM_U, CM_V, CM_W,
535 CM_X, CM_Y, CM_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_6, KC_MINS,
536 KC_GRV, CM_A, CM_B, CM_C, CM_D, CM_E, CM_F, CM_G,
537 CM_H, CM_I, CM_J, CM_K, CM_L, CM_M, CM_N, CM_O,
538 CM_P, CM_Q, CM_R, CM_S, CM_T, CM_U, CM_V, CM_W,
539 CM_X, CM_Y, CM_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL
540};
541#elif defined SENDSTRING_DVORAK_KEYCODE
542/* for users whose OSes are set to Dvorak */
543#include "keymap_dvorak.h"
544const uint8_t ascii_to_keycode_lut[0x80] PROGMEM = {
545 0, 0, 0, 0, 0, 0, 0, 0,
546 KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0,
547 0, 0, 0, 0, 0, 0, 0, 0,
548 0, 0, 0, KC_ESC, 0, 0, 0, 0,
549 KC_SPC, DV_1, DV_QUOT, DV_3, DV_4, DV_5, DV_7, DV_QUOT,
550 DV_9, DV_0, DV_8, DV_EQL, DV_COMM, DV_MINS, DV_DOT, DV_SLSH,
551 DV_0, DV_1, DV_2, DV_3, DV_4, DV_5, DV_6, DV_7,
552 DV_8, DV_9, DV_SCLN, DV_SCLN, DV_COMM, DV_EQL, DV_DOT, DV_SLSH,
553 DV_2, DV_A, DV_B, DV_C, DV_D, DV_E, DV_F, DV_G,
554 DV_H, DV_I, DV_J, DV_K, DV_L, DV_M, DV_N, DV_O,
555 DV_P, DV_Q, DV_R, DV_S, DV_T, DV_U, DV_V, DV_W,
556 DV_X, DV_Y, DV_Z, DV_LBRC, DV_BSLS, DV_RBRC, DV_6, DV_MINS,
557 DV_GRV, DV_A, DV_B, DV_C, DV_D, DV_E, DV_F, DV_G,
558 DV_H, DV_I, DV_J, DV_K, DV_L, DV_M, DV_N, DV_O,
559 DV_P, DV_Q, DV_R, DV_S, DV_T, DV_U, DV_V, DV_W,
560 DV_X, DV_Y, DV_Z, DV_LBRC, DV_BSLS, DV_RBRC, DV_GRV, KC_DEL
561};
562#else
563/* For users with default keyboard layout in OS */
564const uint8_t ascii_to_keycode_lut[0x80] PROGMEM = { 479const uint8_t ascii_to_keycode_lut[0x80] PROGMEM = {
565 0, 0, 0, 0, 0, 0, 0, 0, 480 0, 0, 0, 0, 0, 0, 0, 0,
566 KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0, 481 KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0,
@@ -579,7 +494,6 @@ const uint8_t ascii_to_keycode_lut[0x80] PROGMEM = {
579 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W, 494 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
580 KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL 495 KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL
581}; 496};
582#endif
583 497
584void send_string(const char *str) { 498void send_string(const char *str) {
585 send_string_with_delay(str, 0); 499 send_string_with_delay(str, 0);
diff --git a/quantum/quantum.h b/quantum/quantum.h
index 1dafbf3b0..e00fe2346 100644
--- a/quantum/quantum.h
+++ b/quantum/quantum.h
@@ -95,6 +95,8 @@ extern uint32_t default_layer_state;
95#endif 95#endif
96 96
97#define SEND_STRING(str) send_string(PSTR(str)) 97#define SEND_STRING(str) send_string(PSTR(str))
98extern const bool ascii_to_shift_lut[0x80];
99extern const uint8_t ascii_to_keycode_lut[0x80];
98void send_string(const char *str); 100void send_string(const char *str);
99void send_string_with_delay(const char *str, uint8_t interval); 101void send_string_with_delay(const char *str, uint8_t interval);
100 102