Skip to content

Commit 0be9198

Browse files
bbx10cmaglie
authored andcommitted
Add ASCII control codes
0x00 CTRL-@ through 0x1F CTRL-_ Also return ASCII codes for keys: ESCAPE, DELETE, TAB, and BACKSPACE keys. Return correct code for ENTER and keypad ENTER keys.
1 parent 9d2b779 commit 0be9198

File tree

2 files changed

+25
-4
lines changed

2 files changed

+25
-4
lines changed

libraries/USBHost/src/hidboot.cpp

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -181,13 +181,16 @@ uint8_t KeyboardReportParser::HandleLockingKeys(HID *hid, uint8_t key) {
181181
const uint8_t KeyboardReportParser::numKeys[10] = { '!', '@', '#', '$', '%', '^', '&', '*', '(', ')'};
182182
const uint8_t KeyboardReportParser::symKeysUp[12] = { '_', '+', '{', '}', '|', '~', ':', '"', '~', '<', '>', '?'};
183183
const uint8_t KeyboardReportParser::symKeysLo[12] = { '-', '=', '[', ']', '\\', ' ', ';', '\'', '`', ',', '.', '/'};
184-
const uint8_t KeyboardReportParser::padKeys[5] = { '/', '*', '-', '+', 0x13};
184+
const uint8_t KeyboardReportParser::padKeys[5] = { '/', '*', '-', '+', 0x0d};
185185
#define VALUE_WITHIN(v,l,h) (((v)>=(l)) && ((v)<=(h)))
186186
uint8_t KeyboardReportParser::OemToAscii(uint8_t mod, uint8_t key) {
187187
uint8_t shift = (mod & 0x22);
188+
uint8_t ctrl = (mod & 0x11);
188189

189190
// [a-z]
190191
if (VALUE_WITHIN(key, 0x04, 0x1d)) {
192+
// [^a-^z]
193+
if (ctrl) return (key - 3);
191194
// Upper case letters
192195
if ((kbdLockingKeys.kbdLeds.bmCapsLock == 0 && shift) ||
193196
(kbdLockingKeys.kbdLeds.bmCapsLock == 1 && shift == 0))
@@ -198,6 +201,7 @@ uint8_t KeyboardReportParser::OemToAscii(uint8_t mod, uint8_t key) {
198201
return (key - 4 + 'a');
199202
}// Numbers
200203
else if (VALUE_WITHIN(key, 0x1e, 0x27)) {
204+
if (ctrl && (key == 0x23)) return (0x1E); /* RS ^^ */
201205
if (shift)
202206
return ((uint8_t)pgm_read_byte(&getNumKeys()[key - 0x1e]));
203207
else
@@ -206,14 +210,27 @@ uint8_t KeyboardReportParser::OemToAscii(uint8_t mod, uint8_t key) {
206210
else if(VALUE_WITHIN(key, 0x59, 0x61)) {
207211
if(kbdLockingKeys.kbdLeds.bmNumLock == 1)
208212
return (key - 0x59 + '1');
209-
} else if(VALUE_WITHIN(key, 0x2d, 0x38))
213+
} else if(VALUE_WITHIN(key, 0x2d, 0x38)) {
214+
if (ctrl) {
215+
switch (key) {
216+
case 0x2d: return (0x1f); /* US ^_ */
217+
case 0x2f: return (0x1b); /* ESC ^[ */
218+
case 0x30: return (0x1d); /* GS ^] */
219+
case 0x31: return (0x1c); /* FS ^\ */
220+
default: return (0x00);
221+
}
222+
}
210223
return ((shift) ? (uint8_t)pgm_read_byte(&getSymKeysUp()[key - 0x2d]) : (uint8_t)pgm_read_byte(&getSymKeysLo()[key - 0x2d]));
211-
else if(VALUE_WITHIN(key, 0x54, 0x58))
224+
} else if(VALUE_WITHIN(key, 0x54, 0x58))
212225
return (uint8_t)pgm_read_byte(&getPadKeys()[key - 0x54]);
213226
else {
214227
switch(key) {
215228
case UHS_HID_BOOT_KEY_SPACE: return (0x20);
216-
case UHS_HID_BOOT_KEY_ENTER: return (0x13);
229+
case UHS_HID_BOOT_KEY_ENTER: return (0x0d);
230+
case UHS_HID_BOOT_KEY_ESCAPE: return (0x1b);
231+
case UHS_HID_BOOT_KEY_DELETE: return (0x08);
232+
case UHS_HID_BOOT_KEY_DELETE_FORWARD: return (0x7f);
233+
case UHS_HID_BOOT_KEY_TAB: return (0x09);
217234
case UHS_HID_BOOT_KEY_ZERO2: return ((kbdLockingKeys.kbdLeds.bmNumLock == 1) ? '0': 0);
218235
case UHS_HID_BOOT_KEY_PERIOD: return ((kbdLockingKeys.kbdLeds.bmNumLock == 1) ? '.': 0);
219236
}

libraries/USBHost/src/hidboot.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ e-mail : [email protected]
2525

2626
#define UHS_HID_BOOT_KEY_ZERO 0x27
2727
#define UHS_HID_BOOT_KEY_ENTER 0x28
28+
#define UHS_HID_BOOT_KEY_ESCAPE 0x29
29+
#define UHS_HID_BOOT_KEY_DELETE 0x2a // Backspace
30+
#define UHS_HID_BOOT_KEY_DELETE_FORWARD 0x4C // Delete
31+
#define UHS_HID_BOOT_KEY_TAB 0x2b
2832
#define UHS_HID_BOOT_KEY_SPACE 0x2c
2933
#define UHS_HID_BOOT_KEY_CAPS_LOCK 0x39
3034
#define UHS_HID_BOOT_KEY_SCROLL_LOCK 0x47

0 commit comments

Comments
 (0)