Implement the text macro action

This commit is contained in:
Eric Tang
2018-06-26 14:30:41 -07:00
parent 54b0a595bc
commit 76a91c010b

View File

@@ -19,69 +19,102 @@ uint8_t characterToScancode(char character)
{ {
switch (character) { switch (character) {
case 'A' ... 'Z': case 'A' ... 'Z':
return 0;
case 'a' ... 'z': case 'a' ... 'z':
return 0; return HID_KEYBOARD_SC_A - 1 + (character & 0x1F);
case '1' ... '9': case '1' ... '9':
return 0; return HID_KEYBOARD_SC_1_AND_EXCLAMATION - 1 + (character & 0x0F);
case ')': case ')':
case '0': case '0':
return 0; return HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS;
case '!': case '!':
return 0; return HID_KEYBOARD_SC_1_AND_EXCLAMATION;
case '@': case '@':
return 0; return HID_KEYBOARD_SC_2_AND_AT;
case '#': case '#':
return 0; return HID_KEYBOARD_SC_3_AND_HASHMARK;
case '$': case '$':
return 0; return HID_KEYBOARD_SC_4_AND_DOLLAR;
case '%': case '%':
return 0; return HID_KEYBOARD_SC_5_AND_PERCENTAGE;
case '^': case '^':
return 0; return HID_KEYBOARD_SC_6_AND_CARET;
case '&': case '&':
return 0; return HID_KEYBOARD_SC_7_AND_AMPERSAND;
case '*': case '*':
return 0; return HID_KEYBOARD_SC_8_AND_ASTERISK;
case '(': case '(':
return 0; return HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS;
case '`': case '`':
case '~': case '~':
return 0; return HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE;
case '[': case '[':
case '{': case '{':
return 0; return HID_KEYBOARD_SC_OPENING_BRACKET_AND_OPENING_BRACE;
case ']': case ']':
case '}': case '}':
return 0; return HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE;
case ';': case ';':
case ':': case ':':
return 0; return HID_KEYBOARD_SC_SEMICOLON_AND_COLON;
case '\'': case '\'':
case '\"': case '\"':
return 0; return HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE;
case '+': case '+':
case '=': case '=':
return 0; return HID_KEYBOARD_SC_EQUAL_AND_PLUS;
case '\\': case '\\':
case '|': case '|':
return 0; return HID_KEYBOARD_SC_BACKSLASH_AND_PIPE;
case '.': case '.':
case '>': case '>':
return 0; return HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN;
case ',': case ',':
case '<': case '<':
return 0; return HID_KEYBOARD_SC_KEYPAD_LESS_THAN_SIGN;
case '/': case '/':
case '\?': case '\?':
return 0; return HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK;
case '-': case '-':
case '_': case '_':
return 0; return HID_KEYBOARD_SC_MINUS_AND_UNDERSCORE;
case '\n':
return HID_KEYBOARD_SC_ENTER;
case ' ':
return HID_KEYBOARD_SC_SPACE;
} }
return 0; return 0;
} }
bool characterToShift(char character)
{
switch (character) {
case 'A' ... 'Z':
case ')':
case '!':
case '@':
case '#':
case '$':
case '%':
case '^':
case '&':
case '*':
case '(':
case '~':
case '{':
case '}':
case ':':
case '\"':
case '+':
case '|':
case '>':
case '<':
case '\?':
case '_':
return true;
}
return false;
}
void addBasicScancode(uint8_t scancode) void addBasicScancode(uint8_t scancode)
{ {
if (!scancode) { if (!scancode) {
@@ -297,6 +330,37 @@ bool processScrollMouseAction(void)
return false; return false;
} }
bool processTextAction(void)
{
static uint16_t textIndex;
static uint8_t reportIndex = USB_BASIC_KEYBOARD_MAX_KEYS;
char character;
uint8_t scancode;
if (textIndex == currentMacroAction.text.textLen) {
textIndex = 0;
reportIndex = USB_BASIC_KEYBOARD_MAX_KEYS;
return false;
}
if (reportIndex == USB_BASIC_KEYBOARD_MAX_KEYS) {
reportIndex = 0;
memset(&MacroBasicKeyboardReport, 0, sizeof MacroBasicKeyboardReport);
return true;
}
character = currentMacroAction.text.text[textIndex];
scancode = characterToScancode(character);
for (uint8_t i = 0; i < reportIndex; i++) {
if (MacroBasicKeyboardReport.scancodes[i] == scancode) {
reportIndex = USB_BASIC_KEYBOARD_MAX_KEYS;
return true;
}
}
MacroBasicKeyboardReport.scancodes[reportIndex++] = scancode;
MacroBasicKeyboardReport.modifiers = characterToShift(character) ? HID_KEYBOARD_MODIFIER_LEFTSHIFT : 0;
++textIndex;
return true;
}
bool processCurrentMacroAction(void) bool processCurrentMacroAction(void)
{ {
switch (currentMacroAction.type) { switch (currentMacroAction.type) {
@@ -311,7 +375,7 @@ bool processCurrentMacroAction(void)
case MacroActionType_ScrollMouse: case MacroActionType_ScrollMouse:
return processScrollMouseAction(); return processScrollMouseAction();
case MacroActionType_Text: case MacroActionType_Text:
return false; return processTextAction();
} }
return false; return false;
} }