diff --git a/keyboard.h b/keyboard.h index 1c62131..c7e74fa 100644 --- a/keyboard.h +++ b/keyboard.h @@ -7,10 +7,10 @@ public: virtual void down(byte) = 0; virtual void reset() = 0; - inline bool isshift(byte scan) { + static inline bool isshift(byte scan) { return scan == 0x12 || scan == 0x59; } - inline bool isctrl(byte scan) { + static inline bool isctrl(byte scan) { return scan == 0x14; } }; diff --git a/ps2drv.cpp b/ps2drv.cpp index 0efd5c9..47f1da9 100644 --- a/ps2drv.cpp +++ b/ps2drv.cpp @@ -10,72 +10,97 @@ static uint8_t DataPin; // The ISR for the external interrupt void ps2interrupt(void) { - static uint8_t bitcount=0; - static uint8_t incoming=0; - static uint32_t prev_ms=0; - uint32_t now_ms; - uint8_t n, val; + static uint8_t bitcount=0; + static uint8_t incoming=0; + static uint32_t prev_ms=0; + uint32_t now_ms; + uint8_t n, val; - val = digitalRead(DataPin); - now_ms = millis(); - if (now_ms - prev_ms > 250) { - bitcount = 0; - incoming = 0; - } - prev_ms = now_ms; - n = bitcount - 1; - if (n <= 7) { - incoming |= (val << n); - } - bitcount++; - if (bitcount == 11) { - uint8_t i = head + 1; - if (i == BUFFER_SIZE) i = 0; - if (i != tail) { - buffer[i] = incoming; - head = i; - } - bitcount = 0; - incoming = 0; - } + val = digitalRead(DataPin); + now_ms = millis(); + if (now_ms - prev_ms > 250) { + bitcount = 0; + incoming = 0; + } + prev_ms = now_ms; + n = bitcount - 1; + if (n <= 7) { + incoming |= (val << n); + } + bitcount++; + if (bitcount == 11) { + uint8_t i = head + 1; + if (i == BUFFER_SIZE) i = 0; + if (i != tail) { + buffer[i] = incoming; + head = i; + } + bitcount = 0; + incoming = 0; + } } bool PS2Driver::available() { - if (head == tail) - return false; + if (head == tail) + return false; - uint8_t i = tail+1; - if (i == BUFFER_SIZE) i = 0; - if (buffer[i] == 0xf0) - return i != head; - return true; + uint8_t i = tail+1; + if (i == BUFFER_SIZE) i = 0; + if (buffer[i] == 0xf0) + return i != head; + return true; } bool PS2Driver::isbreak() { - bool b = isbrk; - isbrk = false; - return b; + bool b = isbrk; + isbrk = false; + return b; } int PS2Driver::read() { - if (head == tail) - return -1; + if (head == tail) + return -1; - uint8_t i = tail+1; - if (i == BUFFER_SIZE) i = 0; - tail = i; - if (buffer[i] == 0xf0) { - isbrk = true; - return read(); - } - return buffer[i]; + uint8_t i = tail+1; + if (i == BUFFER_SIZE) i = 0; + tail = i; + if (buffer[i] == 0xf0) { + isbrk = true; + return read(); + } + return buffer[i]; +} + +unsigned PS2Driver::read2() { + if (head == tail) + return 0; + + uint8_t i = tail+1; + if (i == BUFFER_SIZE) i = 0; + tail = i; + if (buffer[i] != 0xf0) + return buffer[i]; + return 0x0100 | read2(); +} + +unsigned PS2Driver::peek() { + if (head == tail) + return 0; + + uint8_t i = tail+1; + if (i == BUFFER_SIZE) i = 0; + if (buffer[i] == 0xf0) { + if (++i == BUFFER_SIZE) i = 0; + return 0x0100 | buffer[i]; + } + return buffer[i]; } void PS2Driver::begin(uint8_t data_pin, uint8_t irq_pin) { - DataPin = data_pin; - pinMode(irq_pin, INPUT_PULLUP); - pinMode(data_pin, INPUT_PULLUP); - attachInterrupt(irq_pin, ps2interrupt, FALLING); - head = tail = 0; + DataPin = data_pin; + pinMode(irq_pin, INPUT_PULLUP); + pinMode(data_pin, INPUT_PULLUP); + attachInterrupt(irq_pin, ps2interrupt, FALLING); + head = tail = 0; } diff --git a/ps2drv.h b/ps2drv.h index 554367b..bc23760 100644 --- a/ps2drv.h +++ b/ps2drv.h @@ -28,6 +28,10 @@ public: * If there is no char available, -1 is returned. */ int read(); + + unsigned peek(); + + unsigned read2(); }; #define PS2_F1 0x05