Add support for delays in send_string. (#8244)

This commit is contained in:
Nick Brassel
2020-02-27 20:38:19 +11:00
committed by Florian Didron
parent e0a355267f
commit 4771cc9f63
2 changed files with 60 additions and 29 deletions

View File

@@ -14,6 +14,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <ctype.h>
#include "quantum.h" #include "quantum.h"
#ifdef PROTOCOL_LUFA #ifdef PROTOCOL_LUFA
@@ -379,6 +380,8 @@ void send_string_with_delay(const char *str, uint8_t interval) {
while (1) { while (1) {
char ascii_code = *str; char ascii_code = *str;
if (!ascii_code) break; if (!ascii_code) break;
if (ascii_code == SS_QMK_PREFIX) {
ascii_code = *(++str);
if (ascii_code == SS_TAP_CODE) { if (ascii_code == SS_TAP_CODE) {
// tap // tap
uint8_t keycode = *(++str); uint8_t keycode = *(++str);
@@ -392,6 +395,17 @@ void send_string_with_delay(const char *str, uint8_t interval) {
// up // up
uint8_t keycode = *(++str); uint8_t keycode = *(++str);
unregister_code(keycode); unregister_code(keycode);
} else if (ascii_code == SS_DELAY_CODE) {
// delay
int ms = 0;
uint8_t keycode = *(++str);
while (isdigit(keycode)) {
ms *= 10;
ms += keycode - '0';
keycode = *(++str);
}
while (ms--) wait_ms(1);
}
} else { } else {
send_char(ascii_code); send_char(ascii_code);
} }
@@ -408,6 +422,8 @@ void send_string_with_delay_P(const char *str, uint8_t interval) {
while (1) { while (1) {
char ascii_code = pgm_read_byte(str); char ascii_code = pgm_read_byte(str);
if (!ascii_code) break; if (!ascii_code) break;
if (ascii_code == SS_QMK_PREFIX) {
ascii_code = pgm_read_byte(++str);
if (ascii_code == SS_TAP_CODE) { if (ascii_code == SS_TAP_CODE) {
// tap // tap
uint8_t keycode = pgm_read_byte(++str); uint8_t keycode = pgm_read_byte(++str);
@@ -421,6 +437,17 @@ void send_string_with_delay_P(const char *str, uint8_t interval) {
// up // up
uint8_t keycode = pgm_read_byte(++str); uint8_t keycode = pgm_read_byte(++str);
unregister_code(keycode); unregister_code(keycode);
} else if (ascii_code == SS_DELAY_CODE) {
// delay
int ms = 0;
uint8_t keycode = pgm_read_byte(++str);
while (isdigit(keycode)) {
ms *= 10;
ms += keycode - '0';
keycode = pgm_read_byte(++str);
}
while (ms--) wait_ms(1);
}
} else { } else {
send_char(ascii_code); send_char(ascii_code);
} }

View File

@@ -382,13 +382,17 @@
#define ADD_SLASH_X(y) STRINGIZE(\x##y) #define ADD_SLASH_X(y) STRINGIZE(\x##y)
#define SYMBOL_STR(x) ADD_SLASH_X(x) #define SYMBOL_STR(x) ADD_SLASH_X(x)
#define SS_QMK_PREFIX 1
#define SS_TAP_CODE 1 #define SS_TAP_CODE 1
#define SS_DOWN_CODE 2 #define SS_DOWN_CODE 2
#define SS_UP_CODE 3 #define SS_UP_CODE 3
#define SS_DELAY_CODE 4
#define SS_TAP(keycode) "\1" SYMBOL_STR(keycode) #define SS_TAP(keycode) "\1\1" SYMBOL_STR(keycode)
#define SS_DOWN(keycode) "\2" SYMBOL_STR(keycode) #define SS_DOWN(keycode) "\1\2" SYMBOL_STR(keycode)
#define SS_UP(keycode) "\3" SYMBOL_STR(keycode) #define SS_UP(keycode) "\1\3" SYMBOL_STR(keycode)
#define SS_DELAY(msecs) "\1\4" STRINGIZE(msecs) "|"
// `string` arguments must not be parenthesized // `string` arguments must not be parenthesized
#define SS_LCTL(string) SS_DOWN(X_LCTL) string SS_UP(X_LCTL) #define SS_LCTL(string) SS_DOWN(X_LCTL) string SS_UP(X_LCTL)