/* * * TEENSY KEYBOARD CONTROLLER by Lucas Kleiss * * This software defines two types of modifiers: * * Modifier Keys eg. MODIFIERKEY_SHIFT * * Modifier Scan Codes eg. 96 * These different types of modifiers serve different purposes and great care should be taken not to get them mixed up * * This software was specifically designed for the Focus FK-2001 XT Mechanical Keyboard * */ #define systemRequest 84 #define modCode 96 #define altModCode 97 #define clock digitalRead(clockPin) #define data digitalRead(dataPin) int clockPin = 3; int dataPin = 4; int switchPin = 22; int keyTemp = 0; int keyState[104]; int outKeyState[6] = {0, 0, 0, 0, 0, 0}; int outModState[4] = {0, 0, 0, 0}; int keyboardCode[] = { 0x00, // Position 00 Unused 0x29, // Position 01 Esc 0x1E, // Position 02 1 ! 0x1F, // Position 03 2 @ 0x20, // Position 04 3 # 0x21, // Position 05 4 $ 0x22, // Position 06 5 % 0x23, // Position 07 6 ^ 0x24, // Position 08 7 & 0x25, // Position 09 8 * 0x26, // Position 10 9 ( 0x27, // Position 11 0 ) 0x2D, // Position 12 - _ 0x2E, // Position 13 = + 0x2A, // Position 14 Backspace 0x2B, // Position 15 Tab 0x14, // Position 16 Q 0x1A, // Position 17 W 0x08, // Position 18 E 0x15, // Position 19 R 0x17, // Position 20 T 0x1C, // Position 21 Y 0x18, // Position 22 U 0x0C, // Position 23 I 0x12, // Position 24 O 0x13, // Position 25 P 0x2F, // Position 26 [ { 0x30, // Position 27 ] } 0x28, // Position 28 Return 0xE0, // Position 29 Ctrl 0x04, // Position 30 A 0x16, // Position 31 S 0x07, // Position 32 D 0x09, // Position 33 F 0x0A, // Position 34 G 0x0B, // Position 35 H 0x0D, // Position 36 J 0x0E, // Position 37 K 0x0F, // Position 38 L 0x33, // Position 39 ; : 0x34, // Position 40 ' " 0x35, // Position 41 ` ~ 0xE1, // Position 42 Left Shift 0x31, // Position 43 \ | 0x1D, // Position 44 Z 0x1B, // Position 45 X 0x06, // Position 46 C 0x19, // Position 47 V 0x05, // Position 48 B 0x11, // Position 49 N 0x10, // Position 50 M 0x36, // Position 51 , < 0x37, // Position 52 . > 0x38, // Position 53 / ? 0xE5, // Position 54 Right Shift 0x46, // Position 55 PrtSc 0xE2, // Position 56 Alt 0x2C, // Position 57 Space 0x39, // Position 58 Caps Lock 0x3A, // Position 59 F1 0x3B, // Position 60 F2 0x3C, // Position 61 F3 0x3D, // Position 62 F4 0x3E, // Position 63 F5 0x3F, // Position 64 F6 0x40, // Position 65 F7 0x41, // Position 66 F8 0x42, // Position 67 F9 0x43, // Position 68 F10 0x53, // Position 69 Num Lock 0x47, // Position 70 Scroll Lock 0x5F, // Position 71 Home 7 0x60, // Position 72 Up 8 0x61, // Position 73 PgUp 9 0x56, // Position 74 - 0x5C, // Position 75 Left 4 0x5D, // Position 76 5 0x5E, // Position 77 Right 6 0x57, // Position 78 + 0x59, // Position 79 End 1 0x5A, // Position 80 Down 2 0x5B, // Position 81 PgDn 3 0x62, // Position 82 Ins 0 0x63 // Position 83 Del . } ; #define altKeyboardCode keyboardCode boolean modCodeAct = false; boolean altModCodeAct = false; void setup() { Serial.begin(9600); Serial.println("Connected"); pinMode(clockPin, INPUT); pinMode(dataPin, INPUT); // pinMode(switchPin, OUTPUT); // digitalWrite(switchPin, HIGH); // delay(1000); // digitalWrite(switchPin, LOW); // Needed to start the Focus FK-2001 in AT mode before switching to XT mode // Keyboard.set_modifier(0); // Keyboard.set_key1(0); // Keyboard.set_key2(0); // Keyboard.set_key3(0); // Keyboard.set_key4(0); // Keyboard.set_key5(0); // Keyboard.set_key6(0); // Keyboard.send_now(); } void loop() { int x = 0; if (clock == LOW) { while (clock == LOW){} while (x < 8) { if (clock == HIGH) { if (x != 7) { keyTemp += (data << x); } else { keyState[keyTemp] = data; } x++; while (clock == HIGH){} } while (clock == LOW){} } //Code that requires the current key code goes here if (keyTemp == modCode || keyTemp == altModCode) // Allows the mod codes to register correctly { delayMicroseconds(100); } keyRegister (keyTemp, !keyState[keyTemp]); //Sends out the key presses every time it is run keyTemp = 0; } } // Registers all key presses void keyRegister (int key, boolean pressed) { if (modCodeAct) { if (altKeyboardCode[key] == MODIFIERKEY_CTRL || altKeyboardCode[key] == MODIFIERKEY_SHIFT || altKeyboardCode[key] == MODIFIERKEY_ALT || altKeyboardCode[key] == MODIFIERKEY_GUI) { setModKey (key, pressed, true); } else { setNormKey (key, pressed, true); } modCodeAct = false; } else if (altModCodeAct) { if (altKeyboardCode[key] == MODIFIERKEY_CTRL || altKeyboardCode[key] == MODIFIERKEY_SHIFT || altKeyboardCode[key] == MODIFIERKEY_ALT || altKeyboardCode[key] == MODIFIERKEY_GUI) { setModKey (key, pressed, true); } else { setNormKey (key, pressed, true); } modCodeAct = true; altModCodeAct = false; } else if (key == modCode) { modCodeAct = true; } else if (key == altModCode) { altModCodeAct = true; } else if (keyboardCode[key] == MODIFIERKEY_CTRL || keyboardCode[key] == MODIFIERKEY_SHIFT || keyboardCode[key] == MODIFIERKEY_ALT || keyboardCode[key] == MODIFIERKEY_GUI) { setModKey (key, pressed, false); } else { setNormKey (key, pressed, false); } } // Sets all normal key presses void setNormKey (int key, boolean pressed, boolean mod) { boolean set = false; int x = 0; int i = 0; while (i < 6 && !set) { if (outKeyState[i] == keyboardCode[key]) { x = i; //Skips x to the point where the key is already pressed to prevent key from being registered twice (ghosting bug) set = true; } i++; } set = false; while (x < 6 && !set) { if ((outKeyState[x] == keyboardCode[key] && pressed && !mod) || (outKeyState[x] == altKeyboardCode[key] && pressed && mod)) { set = true; } else if (((((outKeyState[x] == 0) && pressed) || ((outKeyState[x] == keyboardCode[key]) && !pressed)) && !mod) || ((((outKeyState[x] == 0) && pressed) || ((outKeyState[x] == altKeyboardCode[key]) && !pressed)) && mod)) { if (pressed && !mod) { outKeyState[x] = keyboardCode[key]; } else if (pressed && mod) { outKeyState[x] = altKeyboardCode[key]; } else { outKeyState[x] = 0; } set = true; } Serial.println(outKeyState[x]); x++; } // Keyboard.set_key1(outKeyState[0]); // Keyboard.set_key2(outKeyState[1]); // Keyboard.set_key3(outKeyState[2]); // Keyboard.set_key4(outKeyState[3]); // Keyboard.set_key5(outKeyState[4]); // Keyboard.set_key6(outKeyState[5]); // Keyboard.send_now(); } // Sets all modifier key presses void setModKey (int key, boolean pressed, int mod) { boolean set = false; int x = 0; int i = 0; while (i < 4 && !set) { if (outKeyState[i] == keyboardCode[key]) { x = i; //Skips x to the point where the key is already pressed to prevent key from being registered twice (ghosting bug) set = true; } i++; } set = false; while (x < 4 && !set) { if ((outModState[x] == keyboardCode[key] && pressed && !mod) || (outModState[x] == altKeyboardCode[key] && pressed && mod)) { set = true; } else if (((((outModState[x] == 0) && pressed) || ((outModState[x] == keyboardCode[key]) && !pressed)) && !mod) || ((((outModState[x] == 0) && pressed) || ((outModState[x] == altKeyboardCode[key]) && !pressed)) && mod)) { if (pressed && !mod) { outModState[x] = keyboardCode[key]; } else if (pressed && mod) { outModState[x] = altKeyboardCode[key]; } else { outModState[x] = 0; } set = true; } x++; } Serial.println(outModState[0]); // Keyboard.set_modifier(outModState[0] | outModState[1] | outModState[2] | outModState[3]); // Keyboard.send_now(); }