Here's my first crack at a converter. Just 80 lines of code! This AVR stuff is pretty cool.
Code: Select all
const int KBACK = 0;
const int KBRDY = 5;
const int KBDATA = 1;
const long keyMap[103] = { KEY_F8, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, 0, KEY_F9, KEY_F10,
KEY_ESC, KEY_TILDE, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0, KEY_MINUS, KEY_EQUAL, KEY_BACKSPACE, KEY_INSERT, KEY_DELETE, KEYPAD_ENTER, KEYPAD_SLASH, KEYPAD_SLASH, KEYPAD_ASTERIX,
KEY_SCROLL_LOCK, KEY_TAB, KEY_Q, KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, KEY_U, KEY_I, KEY_O, KEY_P, KEY_LEFT_BRACE, KEY_RIGHT_BRACE, 0, KEY_HOME, KEY_END, KEYPAD_7, KEYPAD_8, KEYPAD_9, KEYPAD_MINUS,
KEY_NUM_LOCK, KEY_CAPS_LOCK, KEY_A, KEY_S, KEY_D, KEY_F, KEY_G, KEY_H, KEY_J, KEY_K, KEY_L, KEY_SEMICOLON, KEY_QUOTE, 0, KEY_PAGE_UP, KEY_PAGE_DOWN, KEYPAD_4, KEYPAD_5, KEYPAD_6, KEYPAD_PLUS,
KEY_PAUSE, MODIFIERKEY_SHIFT, KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M, KEY_COMMA, KEY_PERIOD, KEY_SLASH, 0, MODIFIERKEY_RIGHT_SHIFT, KEY_ENTER, KEY_UP, KEY_DOWN, KEYPAD_1, KEYPAD_2, KEYPAD_3, KEYPAD_ENTER,
KEY_PRINTSCREEN, MODIFIERKEY_ALT, KEY_SPACE, MODIFIERKEY_RIGHT_CTRL, KEY_LEFT, KEY_RIGHT, KEYPAD_0, KEYPAD_0, KEYPAD_PERIOD };
bool makeCode;
byte messageArray[9]; // Full word being sent by keyboard
byte switchNum = 0; // switch Number
int numBits = 0; // How many bits of the scancode have been read?
unsigned long nowMillis;
unsigned long prevMillis;
void isr() {
// Scrap old / incomplete message
nowMillis = millis();
if (nowMillis - prevMillis > 250) {
numBits = 0;
}
prevMillis = nowMillis;
// Read the bit
messageArray[numBits] = digitalRead(KBDATA);
numBits++;
// Once we have a whole word...
if (numBits == 9) {
// Copy the code portion of the message
for (int i = 0; i < 7; i++) {
bitWrite(switchNum, i, messageArray[i]);
}
// Copy the make / break portion
makeCode = messageArray[7];
// Send the instruction...
long key = keyMap[switchNum];
if (makeCode == 1) {
Keyboard.press(key);
}
else {
Keyboard.release(key);
}
// Reset
numBits = 0;
switchNum = 0;
}
}
void pollKeyboard() {
if (digitalRead(KBRDY) == LOW) {
digitalWrite(KBACK, LOW);
}
else {
digitalWrite(KBACK, HIGH);
}
}
void setup() {
attachInterrupt(digitalPinToInterrupt(5), isr, FALLING);
pinMode(KBACK, OUTPUT);
pinMode(KBRDY, INPUT_PULLUP);
pinMode(KBDATA, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
pollKeyboard();
}