mirror of
https://github.com/JorjBauer/aiie.git
synced 2025-02-18 12:30:27 +00:00
bugfix for usb keyboard auto-repeat
This commit is contained in:
parent
f57478f85d
commit
90270e126f
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user