ibmpc_usb: Refactor AT Error/Overrun handling

This commit is contained in:
tmk 2023-06-10 14:25:51 +09:00
parent b2edf39094
commit 7a750a3538

View file

@ -179,6 +179,14 @@ DONE:
return id; return id;
} }
static void clear_stuck_keys(void)
{
matrix_clear();
clear_keyboard();
xprintf("\n[CLR] ");
}
uint8_t IBMPCConverter::process_interface(void) uint8_t IBMPCConverter::process_interface(void)
{ {
if (ibmpc.error) { if (ibmpc.error) {
@ -643,8 +651,7 @@ MOUSE_DONE:
xprintf("E%u ", timer_read()); xprintf("E%u ", timer_read());
// reinit state // reinit state
init(); init();
matrix_clear(); clear_stuck_keys();
clear_keyboard();
state = INIT; state = INIT;
break; break;
default: default:
@ -736,6 +743,9 @@ int8_t IBMPCConverter::process_cs1(uint8_t code)
switch (state_cs1) { switch (state_cs1) {
case CS1_INIT: case CS1_INIT:
switch (code) { switch (code) {
case 0xFF: // Error/Overrun([3]p.26)
clear_stuck_keys();
break;
case 0xE0: case 0xE0:
state_cs1 = CS1_E0; state_cs1 = CS1_E0;
break; break;
@ -884,8 +894,9 @@ uint8_t IBMPCConverter::cs2_e0code(uint8_t code) {
case 0x41: if (0xAB90 == keyboard_id || 0xAB91 == keyboard_id) case 0x41: if (0xAB90 == keyboard_id || 0xAB91 == keyboard_id)
return 0x7C; // Keypad ,(5576) -> Keypad * return 0x7C; // Keypad ,(5576) -> Keypad *
else else
return (code & 0x7F); return (code & 0x7F); // unknown
// standard E0-prefixed codes [a]
case 0x14: return 0x19; // right control case 0x14: return 0x19; // right control
case 0x1F: return 0x17; // left GUI case 0x1F: return 0x17; // left GUI
case 0x27: return 0x1F; // right GUI case 0x27: return 0x1F; // right GUI
@ -905,7 +916,6 @@ uint8_t IBMPCConverter::cs2_e0code(uint8_t code) {
case 0x7D: return 0x5E; // page up case 0x7D: return 0x5E; // page up
case 0x7C: return 0x7F; // Print Screen case 0x7C: return 0x7F; // Print Screen
case 0x7E: return 0x00; // Control'd Pause case 0x7E: return 0x00; // Control'd Pause
case 0x21: return 0x65; // volume down case 0x21: return 0x65; // volume down
case 0x32: return 0x6E; // volume up case 0x32: return 0x6E; // volume up
case 0x23: return 0x6F; // mute case 0x23: return 0x6F; // mute
@ -940,7 +950,7 @@ uint8_t IBMPCConverter::cs2_e0code(uint8_t code) {
// https://github.com/tmk/tmk_keyboard/pull/760 // https://github.com/tmk/tmk_keyboard/pull/760
case 0x00: return 0x65; // TERM FUNC Siemens F500 -> VOLD case 0x00: return 0x65; // TERM FUNC Siemens F500 -> VOLD
default: return (code & 0x7F); default: return (code & 0x7F); // unknown
} }
} }
@ -1000,6 +1010,9 @@ int8_t IBMPCConverter::process_cs2(uint8_t code)
code = translate_5576_cs2(code); code = translate_5576_cs2(code);
} }
switch (code) { switch (code) {
case 0x00: // Error/Overrun([3]p.26)
clear_stuck_keys();
break;
case 0xE0: case 0xE0:
state_cs2 = CS2_E0; state_cs2 = CS2_E0;
break; break;
@ -1248,6 +1261,9 @@ int8_t IBMPCConverter::process_cs3(uint8_t code)
code = translate_televideo_dec_cs3(code); code = translate_televideo_dec_cs3(code);
} }
switch (code) { switch (code) {
case 0x00: // Error/Overrun([3]p.26)
clear_stuck_keys();
break;
case 0xF0: case 0xF0:
state_cs3 = CS3_F0; state_cs3 = CS3_F0;
break; break;