diff options
| author | Eric Tang <e_l_tang@outlook.com> | 2016-06-03 12:48:40 -0700 |
|---|---|---|
| committer | Jack Humbert <jack.humb@gmail.com> | 2016-06-03 15:48:40 -0400 |
| commit | 794aed37a0da5a277a07e7fa86263e0852fa9f6d (patch) | |
| tree | f7fe97e9edd3c8c04839dafd199616572be51e25 /quantum | |
| parent | cc3972e7d6338febb306b384b939f5494ff8cdf9 (diff) | |
| download | qmk_firmware-794aed37a0da5a277a07e7fa86263e0852fa9f6d.tar.gz qmk_firmware-794aed37a0da5a277a07e7fa86263e0852fa9f6d.zip | |
Improve string sending (#376)
Diffstat (limited to 'quantum')
| -rw-r--r-- | quantum/quantum.c | 149 | ||||
| -rw-r--r-- | quantum/quantum.h | 7 |
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 | ||
| 476 | bool shift_us_qwerty[0x80] = { | 476 | const 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 | ||
| 483 | uint8_t ascii_us_qwerty[0x80] = { | 495 | const 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 | 518 | const 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 | |
| 514 | void send_string(char str[]) { | 535 | }; |
| 515 | for (int i = 0; str[i] != 0; i++) { | 536 | |
| 516 | uint8_t keycode = ascii_us_qwerty[str[i]]; | 537 | const 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 | |||
| 558 | void 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 | |||
| 28 | extern uint32_t default_layer_state; | 31 | extern 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 | ||
| 62 | void send_string(char str[]); | 65 | void send_string(const char *str); |
| 63 | 66 | ||
| 64 | void matrix_init_kb(void); | 67 | void matrix_init_kb(void); |
| 65 | void matrix_scan_kb(void); | 68 | void matrix_scan_kb(void); |
| @@ -79,4 +82,4 @@ void audio_on_user(void); | |||
| 79 | void music_on_user(void); | 82 | void music_on_user(void); |
| 80 | void music_scale_user(void); | 83 | void music_scale_user(void); |
| 81 | 84 | ||
| 82 | #endif \ No newline at end of file | 85 | #endif |
