aboutsummaryrefslogtreecommitdiff
path: root/quantum
diff options
context:
space:
mode:
authorEric Tang <e_l_tang@outlook.com>2016-06-03 12:48:40 -0700
committerJack Humbert <jack.humb@gmail.com>2016-06-03 15:48:40 -0400
commit794aed37a0da5a277a07e7fa86263e0852fa9f6d (patch)
treef7fe97e9edd3c8c04839dafd199616572be51e25 /quantum
parentcc3972e7d6338febb306b384b939f5494ff8cdf9 (diff)
downloadqmk_firmware-794aed37a0da5a277a07e7fa86263e0852fa9f6d.tar.gz
qmk_firmware-794aed37a0da5a277a07e7fa86263e0852fa9f6d.zip
Improve string sending (#376)
Diffstat (limited to 'quantum')
-rw-r--r--quantum/quantum.c149
-rw-r--r--quantum/quantum.h7
2 files changed, 104 insertions, 52 deletions
diff --git a/quantum/quantum.c b/quantum/quantum.c
index 426cfa12b..bc63fb614 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -287,14 +287,14 @@ bool process_record_quantum(keyrecord_t *record) {
287 music_sequence_count = 0; 287 music_sequence_count = 0;
288 return false; 288 return false;
289 } 289 }
290 290
291 if (keycode == KC_LALT && record->event.pressed) { // Stop recording/playing 291 if (keycode == KC_LALT && record->event.pressed) { // Stop recording/playing
292 stop_all_notes(); 292 stop_all_notes();
293 music_sequence_recording = false; 293 music_sequence_recording = false;
294 music_sequence_playing = false; 294 music_sequence_playing = false;
295 return false; 295 return false;
296 } 296 }
297 297
298 if (keycode == KC_LGUI && record->event.pressed) { // Start playing 298 if (keycode == KC_LGUI && record->event.pressed) { // Start playing
299 stop_all_notes(); 299 stop_all_notes();
300 music_sequence_recording = false; 300 music_sequence_recording = false;
@@ -309,7 +309,7 @@ bool process_record_quantum(keyrecord_t *record) {
309 music_sequence_interval-=10; 309 music_sequence_interval-=10;
310 return false; 310 return false;
311 } 311 }
312 312
313 if (keycode == KC_DOWN) { 313 if (keycode == KC_DOWN) {
314 if (record->event.pressed) 314 if (record->event.pressed)
315 music_sequence_interval+=10; 315 music_sequence_interval+=10;
@@ -473,57 +473,106 @@ bool process_record_quantum(keyrecord_t *record) {
473 return process_action_kb(record); 473 return process_action_kb(record);
474} 474}
475 475
476bool shift_us_qwerty[0x80] = { 476const bool ascii_to_qwerty_shift_lut[0x80] PROGMEM = {
477 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 31 477 0, 0, 0, 0, 0, 0, 0, 0,
478 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, // 32 - 63 478 0, 0, 0, 0, 0, 0, 0, 0,
479 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 64 - 95 479 0, 0, 0, 0, 0, 0, 0, 0,
480 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0 // 96 - 127 480 0, 0, 0, 0, 0, 0, 0, 0,
481 0, 1, 1, 1, 1, 1, 1, 0,
482 1, 1, 1, 1, 0, 0, 0, 0,
483 0, 0, 0, 0, 0, 0, 0, 0,
484 0, 0, 1, 0, 1, 0, 1, 1,
485 1, 1, 1, 1, 1, 1, 1, 1,
486 1, 1, 1, 1, 1, 1, 1, 1,
487 1, 1, 1, 1, 1, 1, 1, 1,
488 1, 1, 1, 0, 0, 0, 1, 1,
489 0, 0, 0, 0, 0, 0, 0, 0,
490 0, 0, 0, 0, 0, 0, 0, 0,
491 0, 0, 0, 0, 0, 0, 0, 0,
492 0, 0, 0, 1, 1, 1, 1, 0
481}; 493};
482 494
483uint8_t ascii_us_qwerty[0x80] = { 495const uint8_t ascii_to_qwerty_keycode_lut[0x80] PROGMEM = {
484 0, 0, 0, 0, 0, 0, 0, 0, KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, KC_ESC, 0, 0, 0, 0, // 0 - 31 496 0, 0, 0, 0, 0, 0, 0, 0,
485 KC_SPC, KC_1, KC_QUOT, KC_3, KC_4, KC_5, KC_7, KC_QUOT, KC_9, KC_0, KC_8, KC_EQL, KC_COMM, KC_MINS, KC_DOT, // 32 - 46 497 KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0,
486 KC_SLSH, KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_SCLN, KC_SCLN, KC_COMM, KC_EQL, // 47 - 61 498 0, 0, 0, 0, 0, 0, 0, 0,
487 KC_DOT, KC_SLSH, KC_2, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, // 62 - 78 499 0, 0, 0, KC_ESC, 0, 0, 0, 0,
488 KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W, KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_6, // 79 - 94 500 KC_SPC, KC_1, KC_QUOT, KC_3, KC_4, KC_5, KC_7, KC_QUOT,
489 KC_MINS, KC_GRV, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, // 95 - 111 501 KC_9, KC_0, KC_8, KC_EQL, KC_COMM, KC_MINS, KC_DOT, KC_SLSH,
490 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W, KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL // 112 - 127 502 KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
503 KC_8, KC_9, KC_SCLN, KC_SCLN, KC_COMM, KC_EQL, KC_DOT, KC_SLSH,
504 KC_2, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
505 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
506 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
507 KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_6, KC_MINS,
508 KC_GRV, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
509 KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
510 KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
511 KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL
491}; 512};
492 513
493// This is how you'd add OS colemak support 514/* for users whose OSes are set to Colemak */
494 515#if 0
495// bool shift_us_colemak[0x80] = { 516#include "keymap_colemak.h"
496// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 31 517
497// 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, // 32 - 63 518const bool ascii_to_colemak_shift_lut[0x80] PROGMEM = {
498// 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 64 - 95 519 0, 0, 0, 0, 0, 0, 0, 0,
499// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0 // 96 - 127 520 0, 0, 0, 0, 0, 0, 0, 0,
500// }; 521 0, 0, 0, 0, 0, 0, 0, 0,
501 522 0, 0, 0, 0, 0, 0, 0, 0,
502// #include "keymap_colemak.h" 523 0, 1, 1, 1, 1, 1, 1, 0,
503 524 1, 1, 1, 1, 0, 0, 0, 0,
504// uint8_t ascii_us_colemak[0x80] = { 525 0, 0, 0, 0, 0, 0, 0, 0,
505// 0, 0, 0, 0, 0, 0, 0, 0, KC_BSPC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, KC_ESC, 0, 0, 0, 0, // 0 - 31 526 0, 0, 1, 0, 1, 0, 1, 1,
506// KC_SPC, KC_1, KC_QUOT, KC_3, KC_4, KC_5, KC_7, KC_QUOT, KC_9, KC_0, KC_8, KC_EQL, KC_COMM, KC_MINS, KC_DOT, // 32 - 46 527 1, 1, 1, 1, 1, 1, 1, 1,
507// KC_SLSH, KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, CM_SCLN, CM_SCLN, KC_COMM, KC_EQL, // 47 - 61 528 1, 1, 1, 1, 1, 1, 1, 1,
508// KC_DOT, KC_SLSH, KC_2, CM_A, CM_B, CM_C, CM_D, CM_E, CM_F, CM_G, CM_H, CM_I, CM_J, CM_K, CM_L, CM_M, CM_N, // 62 - 78 529 1, 1, 1, 1, 1, 1, 1, 1,
509// CM_O, CM_P, CM_Q, CM_R, CM_S, CM_T, CM_U, CM_V, CM_W, CM_X, CM_Y, CM_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_6, // 79 - 94 530 1, 1, 1, 0, 0, 0, 1, 1,
510// KC_MINS, KC_GRV, CM_A, CM_B, CM_C, CM_D, CM_E, CM_F, CM_G, CM_H, CM_I, CM_J, CM_K, CM_L, CM_M, CM_N, CM_O, // 95 - 111 531 0, 0, 0, 0, 0, 0, 0, 0,
511// CM_P, CM_Q, CM_R, CM_S, CM_T, CM_U, CM_V, CM_W, CM_X, CM_Y, CM_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL // 112 - 127 532 0, 0, 0, 0, 0, 0, 0, 0,
512// }; 533 0, 0, 0, 0, 0, 0, 0, 0,
513 534 0, 0, 0, 1, 1, 1, 1, 0
514void send_string(char str[]) { 535};
515 for (int i = 0; str[i] != 0; i++) { 536
516 uint8_t keycode = ascii_us_qwerty[str[i]]; 537const uint8_t ascii_to_colemak_keycode_lut[0x80] PROGMEM = {
517 if (shift_us_qwerty[str[i]]) { 538 0, 0, 0, 0, 0, 0, 0, 0,
518 register_code(KC_LSFT); 539 KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0,
519 register_code(keycode); 540 0, 0, 0, 0, 0, 0, 0, 0,
520 unregister_code(keycode); 541 0, 0, 0, KC_ESC, 0, 0, 0, 0,
521 unregister_code(KC_LSFT); 542 KC_SPC, KC_1, KC_QUOT, KC_3, KC_4, KC_5, KC_7, KC_QUOT,
522 } else { 543 KC_9, KC_0, KC_8, KC_EQL, KC_COMM, KC_MINS, KC_DOT, KC_SLSH,
523 register_code(keycode); 544 KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
524 unregister_code(keycode); 545 KC_8, KC_9, CM_SCLN, CM_SCLN, KC_COMM, KC_EQL, KC_DOT, KC_SLSH,
546 KC_2, CM_A, CM_B, CM_C, CM_D, CM_E, CM_F, CM_G,
547 CM_H, CM_I, CM_J, CM_K, CM_L, CM_M, CM_N, CM_O,
548 CM_P, CM_Q, CM_R, CM_S, CM_T, CM_U, CM_V, CM_W,
549 CM_X, CM_Y, CM_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_6, KC_MINS,
550 KC_GRV, CM_A, CM_B, CM_C, CM_D, CM_E, CM_F, CM_G,
551 CM_H, CM_I, CM_J, CM_K, CM_L, CM_M, CM_N, CM_O,
552 CM_P, CM_Q, CM_R, CM_S, CM_T, CM_U, CM_V, CM_W,
553 CM_X, CM_Y, CM_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL
554};
555
556#endif
557
558void send_string(const char *str) {
559 while (1) {
560 uint8_t keycode;
561 uint8_t ascii_code = pgm_read_byte(str);
562 if (!ascii_code) break;
563 keycode = pgm_read_byte(&ascii_to_qwerty_keycode_lut[ascii_code]);
564 if (pgm_read_byte(&ascii_to_qwerty_shift_lut[ascii_code])) {
565 register_code(KC_LSFT);
566 register_code(keycode);
567 unregister_code(keycode);
568 unregister_code(KC_LSFT);
569 }
570 else {
571 register_code(keycode);
572 unregister_code(keycode);
573 }
574 ++str;
525 } 575 }
526 }
527} 576}
528 577
529 578
@@ -572,7 +621,7 @@ void matrix_scan_quantum() {
572#endif 621#endif
573 622
574//------------------------------------------------------------------------------ 623//------------------------------------------------------------------------------
575// Override these functions in your keymap file to play different tunes on 624// Override these functions in your keymap file to play different tunes on
576// different events such as startup and bootloader jump 625// different events such as startup and bootloader jump
577 626
578__attribute__ ((weak)) 627__attribute__ ((weak))
diff --git a/quantum/quantum.h b/quantum/quantum.h
index 786bcb238..69277b9e3 100644
--- a/quantum/quantum.h
+++ b/quantum/quantum.h
@@ -1,6 +1,7 @@
1#ifndef QUANTUM_H 1#ifndef QUANTUM_H
2#define QUANTUM_H 2#define QUANTUM_H
3 3
4#include <avr/pgmspace.h>
4#include "matrix.h" 5#include "matrix.h"
5#include "keymap_common.h" 6#include "keymap_common.h"
6#ifdef BACKLIGHT_ENABLE 7#ifdef BACKLIGHT_ENABLE
@@ -25,6 +26,8 @@
25#include <avr/io.h> 26#include <avr/io.h>
26#include <util/delay.h> 27#include <util/delay.h>
27 28
29#define SEND_STRING(str) send_string(PSTR(str))
30
28extern uint32_t default_layer_state; 31extern uint32_t default_layer_state;
29 32
30#ifndef NO_ACTION_LAYER 33#ifndef NO_ACTION_LAYER
@@ -59,7 +62,7 @@ extern uint32_t default_layer_state;
59 #define LEADER_DICTIONARY() if (leading && timer_elapsed(leader_time) > LEADER_TIMEOUT) 62 #define LEADER_DICTIONARY() if (leading && timer_elapsed(leader_time) > LEADER_TIMEOUT)
60#endif 63#endif
61 64
62void send_string(char str[]); 65void send_string(const char *str);
63 66
64void matrix_init_kb(void); 67void matrix_init_kb(void);
65void matrix_scan_kb(void); 68void matrix_scan_kb(void);
@@ -79,4 +82,4 @@ void audio_on_user(void);
79void music_on_user(void); 82void music_on_user(void);
80void music_scale_user(void); 83void music_scale_user(void);
81 84
82#endif \ No newline at end of file 85#endif