@@ -181,13 +181,16 @@ uint8_t KeyboardReportParser::HandleLockingKeys(HID *hid, uint8_t key) {
181
181
const uint8_t KeyboardReportParser::numKeys[10 ] = { ' !' , ' @' , ' #' , ' $' , ' %' , ' ^' , ' &' , ' *' , ' (' , ' )' };
182
182
const uint8_t KeyboardReportParser::symKeysUp[12 ] = { ' _' , ' +' , ' {' , ' }' , ' |' , ' ~' , ' :' , ' "' , ' ~' , ' <' , ' >' , ' ?' };
183
183
const uint8_t KeyboardReportParser::symKeysLo[12 ] = { ' -' , ' =' , ' [' , ' ]' , ' \\ ' , ' ' , ' ;' , ' \' ' , ' `' , ' ,' , ' .' , ' /' };
184
- const uint8_t KeyboardReportParser::padKeys[5 ] = { ' /' , ' *' , ' -' , ' +' , 0x13 };
184
+ const uint8_t KeyboardReportParser::padKeys[5 ] = { ' /' , ' *' , ' -' , ' +' , 0x0d };
185
185
#define VALUE_WITHIN (v,l,h ) (((v)>=(l)) && ((v)<=(h)))
186
186
uint8_t KeyboardReportParser::OemToAscii (uint8_t mod, uint8_t key) {
187
187
uint8_t shift = (mod & 0x22 );
188
+ uint8_t ctrl = (mod & 0x11 );
188
189
189
190
// [a-z]
190
191
if (VALUE_WITHIN (key, 0x04 , 0x1d )) {
192
+ // [^a-^z]
193
+ if (ctrl) return (key - 3 );
191
194
// Upper case letters
192
195
if ((kbdLockingKeys.kbdLeds .bmCapsLock == 0 && shift) ||
193
196
(kbdLockingKeys.kbdLeds .bmCapsLock == 1 && shift == 0 ))
@@ -198,6 +201,7 @@ uint8_t KeyboardReportParser::OemToAscii(uint8_t mod, uint8_t key) {
198
201
return (key - 4 + ' a' );
199
202
}// Numbers
200
203
else if (VALUE_WITHIN (key, 0x1e , 0x27 )) {
204
+ if (ctrl && (key == 0x23 )) return (0x1E ); /* RS ^^ */
201
205
if (shift)
202
206
return ((uint8_t )pgm_read_byte (&getNumKeys ()[key - 0x1e ]));
203
207
else
@@ -206,14 +210,27 @@ uint8_t KeyboardReportParser::OemToAscii(uint8_t mod, uint8_t key) {
206
210
else if (VALUE_WITHIN (key, 0x59 , 0x61 )) {
207
211
if (kbdLockingKeys.kbdLeds .bmNumLock == 1 )
208
212
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
+ }
210
223
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 ))
212
225
return (uint8_t )pgm_read_byte (&getPadKeys ()[key - 0x54 ]);
213
226
else {
214
227
switch (key) {
215
228
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 );
217
234
case UHS_HID_BOOT_KEY_ZERO2: return ((kbdLockingKeys.kbdLeds .bmNumLock == 1 ) ? ' 0' : 0 );
218
235
case UHS_HID_BOOT_KEY_PERIOD: return ((kbdLockingKeys.kbdLeds .bmNumLock == 1 ) ? ' .' : 0 );
219
236
}
0 commit comments