bugfix for usb keyboard auto-repeat

This commit is contained in:
Jorj Bauer 2021-01-19 20:42:15 -05:00
parent f57478f85d
commit 90270e126f
3 changed files with 27 additions and 7 deletions

View File

@ -33,18 +33,23 @@ uint8_t kbEventCount = 0;
uint8_t kbEventHead = 0; uint8_t kbEventHead = 0;
uint8_t kbEventPtr = 0; uint8_t kbEventPtr = 0;
bool addEvent(uint8_t kc, bool pressed) bool TeensyKeyboard::addEvent(uint8_t kc, bool pressed)
{ {
if (kbEventCount >= MAXKBEVENTS) if (kbEventCount >= MAXKBEVENTS)
return false; return false;
if (pressed && kbEventCount+numPressed >= MAXKBEVENTS) {
// save space in the event queue for any keyup events that may come
return false;
}
keyboardEvents[kbEventPtr].keycode = kc; keyboardEvents[kbEventPtr].keycode = kc;
keyboardEvents[kbEventPtr++].pressedIfTrue = pressed; keyboardEvents[kbEventPtr++].pressedIfTrue = pressed;
if (kbEventPtr >= MAXKBEVENTS) kbEventPtr = 0; if (kbEventPtr >= MAXKBEVENTS) kbEventPtr = 0;
kbEventCount++; kbEventCount++;
} }
bool popEvent(uint8_t *kc, bool *pressed) bool TeensyKeyboard::popEvent(uint8_t *kc, bool *pressed)
{ {
if (kbEventCount) { if (kbEventCount) {
*kc = keyboardEvents[kbEventHead].keycode; *kc = keyboardEvents[kbEventHead].keycode;
@ -258,12 +263,8 @@ void TeensyKeyboard::maintainKeyboard()
bool pressed; bool pressed;
if (popEvent(&kc, &pressed)) { if (popEvent(&kc, &pressed)) {
if (pressed) { if (pressed) {
sprintf(debugBuf, "%d press ", kc);
g_display->debugMsg(debugBuf);
vmkeyboard->keyDepressed(kc); vmkeyboard->keyDepressed(kc);
} else { } else {
sprintf(debugBuf, "%d relsd ", kc);
g_display->debugMsg(debugBuf);
vmkeyboard->keyReleased(kc); vmkeyboard->keyReleased(kc);
} }
} }

View File

@ -21,6 +21,10 @@ class TeensyKeyboard : public PhysicalKeyboard {
void pressedKey(uint8_t key); void pressedKey(uint8_t key);
void releasedKey(uint8_t key); void releasedKey(uint8_t key);
private:
bool addEvent(uint8_t kc, bool pressed);
bool popEvent(uint8_t *kc, bool *pressed);
private: private:
bool leftShiftPressed; bool leftShiftPressed;
bool rightShiftPressed; bool rightShiftPressed;

View File

@ -124,20 +124,34 @@ static uint8_t usb_scanmap[256] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 240-249 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 240-249
0, 0, 0, 0, 0, 0 // 250-255 0, 0, 0, 0, 0, 0 // 250-255
}; };
uint8_t keysPressed[256]; // FIXME: if we need to save RAM, make this bitflags
void onKeypress(uint8_t keycode) void onKeypress(uint8_t keycode)
{ {
if (keysPressed[keycode])
return; // defeat auto-repeat
if (!usb_scanmap[keycode])
return; // skip undefined keys
if (keycode == 67 || keycode == 70) { if (keycode == 67 || keycode == 70) {
// F10 or PrtSc/SysRq are interrupt buttons. Probably needs to be // F10 or PrtSc/SysRq are interrupt buttons. Probably needs to be
// configurable somehow... // configurable somehow...
g_biosInterrupt = true; g_biosInterrupt = true;
} else { } else {
keysPressed[keycode] = 1;
((TeensyKeyboard *)g_keyboard)->pressedKey(usb_scanmap[keycode]); ((TeensyKeyboard *)g_keyboard)->pressedKey(usb_scanmap[keycode]);
} }
} }
void onKeyrelease(uint8_t keycode) void onKeyrelease(uint8_t keycode)
{ {
if (!keysPressed[keycode])
return; // defeat auto-repeat
if (!usb_scanmap[keycode])
return; // skip undefined keys
keysPressed[keycode] = 0;
((TeensyKeyboard *)g_keyboard)->releasedKey(usb_scanmap[keycode]); ((TeensyKeyboard *)g_keyboard)->releasedKey(usb_scanmap[keycode]);
} }
@ -160,6 +174,7 @@ void setup()
// enableFaultHandler(); // enableFaultHandler();
// SCB_SHCSR |= SCB_SHCSR_BUSFAULTENA | SCB_SHCSR_USGFAULTENA | SCB_SHCSR_MEMFAULTENA; // SCB_SHCSR |= SCB_SHCSR_BUSFAULTENA | SCB_SHCSR_USGFAULTENA | SCB_SHCSR_MEMFAULTENA;
memset(keysPressed, 0, sizeof(keysPressed));
// set the Time library to use Teensy 3.0's RTC to keep time // set the Time library to use Teensy 3.0's RTC to keep time
setSyncProvider(getTeensy3Time); setSyncProvider(getTeensy3Time);