From 766f788bf3bcc3db70e348ed2001b0777dde4a14 Mon Sep 17 00:00:00 2001 From: Markus Koch Date: Tue, 28 Jan 2014 15:11:36 +0100 Subject: [PATCH] Added some delay functions (untested) --- firmware/keyboard.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/firmware/keyboard.c b/firmware/keyboard.c index f53fa57..ee86f33 100644 --- a/firmware/keyboard.c +++ b/firmware/keyboard.c @@ -8,6 +8,8 @@ #include "usbdrv.h" #include "lib/prgKeyboard.h" +void delay_ms_wdreset(unsigned int ms); + static uchar reportBuffer[8] = {0,0,0,0,0,0,0,0}; /* buffer for HID reports */ static uchar idleRate; /* in 4 ms units */ static uchar newReport = 1; /* current report */ @@ -310,6 +312,36 @@ void continueExecution() { if ((keyType[oldKey-1] == KEYTYPE_TEXT) || keyAction == KEYACTION_DOWN) reportBuffer[0] &= ~(1 << (instr - 232)); // MOD-Keys (dis) else reportBuffer[0] |= (1 << (instr - 232)); // MOD-Keys (en) } + else if (instr >= 240 && instr <= 250) { + // Delay execution by a few ms + // Yeah I know the code is ugly, but I don't really care. + switch (instr) { + case 240: + delay_ms_wdreset(10); + break; + case 241: + delay_ms_wdreset(50); + break; + case 242: + delay_ms_wdreset(100); + break; + case 243: + delay_ms_wdreset(250); + break; + case 244: + delay_ms_wdreset(250); + delay_ms_wdreset(250); + break; + case 245: + delay_ms_wdreset(500); + delay_ms_wdreset(500); + delay_ms_wdreset(500); + delay_ms_wdreset(500); + break; + default: + break; + } + } if (!flag_keyPress) memAddr++; // increase memory address // Currently there's NO protection.The system could jump onto the next key @@ -317,6 +349,15 @@ void continueExecution() { } } +// MAX 255ms +void delay_ms_wdreset(unsigned int ms) { + int i; + for (i = 0; i < ms; i++) { + _delay_ms(1); + wdt_reset(); + } +} + void detectKeyType() { uint8_t keyId; uint16_t x;