@@ -181,13 +181,16 @@ uint8_t KeyboardReportParser::HandleLockingKeys(HID *hid, uint8_t key) {
181181const uint8_t KeyboardReportParser::numKeys[10 ] = { ' !' , ' @' , ' #' , ' $' , ' %' , ' ^' , ' &' , ' *' , ' (' , ' )' };
182182const uint8_t KeyboardReportParser::symKeysUp[12 ] = { ' _' , ' +' , ' {' , ' }' , ' |' , ' ~' , ' :' , ' "' , ' ~' , ' <' , ' >' , ' ?' };
183183const 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)))
186186uint8_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 }
0 commit comments