#include <avr/pgmspace.h> | #include <avr/pgmspace.h> | ||||
#include <avr/interrupt.h> | #include <avr/interrupt.h> | ||||
#include <util/delay.h> | #include <util/delay.h> | ||||
#include "usb_keys.h" | |||||
//#include "usb_keyboard.h" | //#include "usb_keyboard.h" | ||||
// TEMP INCLUDES | // TEMP INCLUDES | ||||
uint16_t sendKeypressCounter = 0; | uint16_t sendKeypressCounter = 0; | ||||
volatile uint8_t sendKeypresses = 0; | volatile uint8_t sendKeypresses = 0; | ||||
// Default 1-indexed key mappings | |||||
static const uint8_t keypadDefaultMap[] = { 0, | |||||
KEYPAD_ASTERIX, | |||||
KEYPAD_MINUS, | |||||
KEYPAD_PLUS, | |||||
KEYPAD_ENTER, | |||||
KEYPAD_9, | |||||
KEYPAD_6, | |||||
KEYPAD_3, | |||||
KEYPAD_0, | |||||
KEYPAD_8, | |||||
KEYPAD_5, | |||||
KEYPAD_2, | |||||
KEYPAD_PERIOD, | |||||
KEYPAD_7, | |||||
KEYPAD_4, | |||||
KEYPAD_1, | |||||
KEYPAD_SLASH }; | |||||
static const uint8_t defaultMap[] = { 0, | static const uint8_t defaultMap[] = { 0, | ||||
KEY_INSERT, | KEY_INSERT, | ||||
KEY_1, | KEY_1, | ||||
KEY_MINUS, | KEY_MINUS, | ||||
KEY_EQUAL, | KEY_EQUAL, | ||||
KEY_BACKSLASH, | KEY_BACKSLASH, | ||||
KEY_TILDE, | |||||
KEY_BACKSPACE, | |||||
KEY_ALT, | KEY_ALT, | ||||
KEY_TAB, | KEY_TAB, | ||||
KEY_Q, | KEY_Q, | ||||
KEY_DELETE, | KEY_DELETE, | ||||
KEY_UP, | KEY_UP, | ||||
KEY_CTRL, | KEY_CTRL, | ||||
KEY_CAPS_LOCK, | |||||
KEY_CAPS_LLOCK, | |||||
KEY_A, | KEY_A, | ||||
KEY_S, | KEY_S, | ||||
KEY_D, | KEY_D, | ||||
PORTF = 0xFF; | PORTF = 0xFF; | ||||
} | } | ||||
// Given a sampling array, and the current number of detected keypress | |||||
// Add as many keypresses from the sampling array to the USB key send array as possible. | |||||
void keyPressDetection( uint8_t *keys, uint8_t *validKeys, uint8_t numberOfKeys ) { | void keyPressDetection( uint8_t *keys, uint8_t *validKeys, uint8_t numberOfKeys ) { | ||||
for ( uint8_t key = 0; key < numberOfKeys + 1; key++ ) { | for ( uint8_t key = 0; key < numberOfKeys + 1; key++ ) { | ||||
if ( keys[key] & (1 << 7) ) { | if ( keys[key] & (1 << 7) ) { | ||||
// Too many keys | // Too many keys | ||||
if ( *validKeys == 6 ) | if ( *validKeys == 6 ) | ||||
break; | break; | ||||
keyboard_keys[*validKeys++] = defaultMap[key]; | |||||
keyboard_keys[(*validKeys)++] = defaultMap[key]; | |||||
} | } | ||||
} | } | ||||
} | } | ||||
print(":\n"); | print(":\n"); | ||||
// TODO undo potentially old keys | // TODO undo potentially old keys | ||||
pint8(validKeys); | |||||
for ( uint8_t c = validKeys; c < 6; c++ ) | for ( uint8_t c = validKeys; c < 6; c++ ) | ||||
keyboard_keys[c] = 0; | keyboard_keys[c] = 0; | ||||
// Print out the current keys pressed | |||||
/* | |||||
if ( keyDetectCount > 0 ) { | |||||
print("Switch: "); | |||||
for ( int c = 0; c < keyDetectCount; c++ ) { | |||||
print("0x"); | |||||
phex( keyDetectArray[c] ); | |||||
print("|"); | |||||
//printDecodeScancode( keyDetectArray[c] ); | |||||
print(" "); | |||||
} | |||||
print("\n"); | |||||
} | |||||
if ( modifiers ) { | |||||
print("Modifiers: "); | |||||
phex( modifiers ); | |||||
print("\n"); | |||||
} | |||||
*/ | |||||
// After going through each of the key groups, send the detected keys and modifiers | // After going through each of the key groups, send the detected keys and modifiers | ||||
// Currently limited to the USB spec (6 keys + modifiers) | // Currently limited to the USB spec (6 keys + modifiers) | ||||
// Making sure to pass zeros when there are no keys being pressed | // Making sure to pass zeros when there are no keys being pressed | ||||
sendKeypresses = 0; | sendKeypresses = 0; | ||||
} | } | ||||
// usb_keyboard_press(KEY_B, KEY_SHIFT); | |||||
return 0; | return 0; | ||||
} | } | ||||
// Timer Interrupt for flagging a send of the sampled key detection data to the USB host | |||||
ISR( TIMER0_OVF_vect ) | ISR( TIMER0_OVF_vect ) | ||||
{ | { | ||||
sendKeypressCounter++; | sendKeypressCounter++; |
void usb_debug_flush_output(void); // immediately transmit any buffered output | void usb_debug_flush_output(void); // immediately transmit any buffered output | ||||
#define USB_DEBUG_HID | #define USB_DEBUG_HID | ||||
#define KEY_CTRL 0x01 | |||||
#define KEY_SHIFT 0x02 | |||||
#define KEY_ALT 0x04 | |||||
#define KEY_GUI 0x08 | |||||
#define KEY_LEFT_CTRL 0x01 | |||||
#define KEY_LEFT_SHIFT 0x02 | |||||
#define KEY_LEFT_ALT 0x04 | |||||
#define KEY_LEFT_GUI 0x08 | |||||
#define KEY_RIGHT_CTRL 0x10 | |||||
#define KEY_RIGHT_SHIFT 0x20 | |||||
#define KEY_RIGHT_ALT 0x40 | |||||
#define KEY_RIGHT_GUI 0x80 | |||||
#define KEY_A 4 | |||||
#define KEY_B 5 | |||||
#define KEY_C 6 | |||||
#define KEY_D 7 | |||||
#define KEY_E 8 | |||||
#define KEY_F 9 | |||||
#define KEY_G 10 | |||||
#define KEY_H 11 | |||||
#define KEY_I 12 | |||||
#define KEY_J 13 | |||||
#define KEY_K 14 | |||||
#define KEY_L 15 | |||||
#define KEY_M 16 | |||||
#define KEY_N 17 | |||||
#define KEY_O 18 | |||||
#define KEY_P 19 | |||||
#define KEY_Q 20 | |||||
#define KEY_R 21 | |||||
#define KEY_S 22 | |||||
#define KEY_T 23 | |||||
#define KEY_U 24 | |||||
#define KEY_V 25 | |||||
#define KEY_W 26 | |||||
#define KEY_X 27 | |||||
#define KEY_Y 28 | |||||
#define KEY_Z 29 | |||||
#define KEY_1 30 | |||||
#define KEY_2 31 | |||||
#define KEY_3 32 | |||||
#define KEY_4 33 | |||||
#define KEY_5 34 | |||||
#define KEY_6 35 | |||||
#define KEY_7 36 | |||||
#define KEY_8 37 | |||||
#define KEY_9 38 | |||||
#define KEY_0 39 | |||||
#define KEY_ENTER 40 | |||||
#define KEY_ESC 41 | |||||
#define KEY_BACKSPACE 42 | |||||
#define KEY_TAB 43 | |||||
#define KEY_SPACE 44 | |||||
#define KEY_MINUS 45 | |||||
#define KEY_EQUAL 46 | |||||
#define KEY_LEFT_BRACE 47 | |||||
#define KEY_RIGHT_BRACE 48 | |||||
#define KEY_BACKSLASH 49 | |||||
#define KEY_NUMBER 50 | |||||
#define KEY_SEMICOLON 51 | |||||
#define KEY_QUOTE 52 | |||||
#define KEY_TILDE 53 | |||||
#define KEY_COMMA 54 | |||||
#define KEY_PERIOD 55 | |||||
#define KEY_SLASH 56 | |||||
#define KEY_CAPS_LOCK 57 | |||||
#define KEY_F1 58 | |||||
#define KEY_F2 59 | |||||
#define KEY_F3 60 | |||||
#define KEY_F4 61 | |||||
#define KEY_F5 62 | |||||
#define KEY_F6 63 | |||||
#define KEY_F7 64 | |||||
#define KEY_F8 65 | |||||
#define KEY_F9 66 | |||||
#define KEY_F10 67 | |||||
#define KEY_F11 68 | |||||
#define KEY_F12 69 | |||||
#define KEY_PRINTSCREEN 70 | |||||
#define KEY_SCROLL_LOCK 71 | |||||
#define KEY_PAUSE 72 | |||||
#define KEY_INSERT 73 | |||||
#define KEY_HOME 74 | |||||
#define KEY_PAGE_UP 75 | |||||
#define KEY_DELETE 76 | |||||
#define KEY_END 77 | |||||
#define KEY_PAGE_DOWN 78 | |||||
#define KEY_RIGHT 79 | |||||
#define KEY_LEFT 80 | |||||
#define KEY_DOWN 81 | |||||
#define KEY_UP 82 | |||||
#define KEY_NUM_LOCK 83 | |||||
#define KEYPAD_SLASH 84 | |||||
#define KEYPAD_ASTERIX 85 | |||||
#define KEYPAD_MINUS 86 | |||||
#define KEYPAD_PLUS 87 | |||||
#define KEYPAD_ENTER 88 | |||||
#define KEYPAD_1 89 | |||||
#define KEYPAD_2 90 | |||||
#define KEYPAD_3 91 | |||||
#define KEYPAD_4 92 | |||||
#define KEYPAD_5 93 | |||||
#define KEYPAD_6 94 | |||||
#define KEYPAD_7 95 | |||||
#define KEYPAD_8 96 | |||||
#define KEYPAD_9 97 | |||||
#define KEYPAD_0 98 | |||||
#define KEYPAD_PERIOD 99 | |||||
// Everything below this point is only intended for usb_serial.c | // Everything below this point is only intended for usb_serial.c | ||||
#ifdef USB_SERIAL_PRIVATE_INCLUDE | #ifdef USB_SERIAL_PRIVATE_INCLUDE |
#ifndef __usb_keys_h | |||||
#define __usb_keys_h | |||||
// List of Modifiers | |||||
#define KEY_CTRL 0x01 | |||||
#define KEY_SHIFT 0x02 | |||||
#define KEY_ALT 0x04 | |||||
#define KEY_GUI 0x08 | |||||
#define KEY_LEFT_CTRL 0x01 | |||||
#define KEY_LEFT_SHIFT 0x02 | |||||
#define KEY_LEFT_ALT 0x04 | |||||
#define KEY_LEFT_GUI 0x08 | |||||
#define KEY_RIGHT_CTRL 0x10 | |||||
#define KEY_RIGHT_SHIFT 0x20 | |||||
#define KEY_RIGHT_ALT 0x40 | |||||
#define KEY_RIGHT_GUI 0x80 | |||||
// List of Keycodes | |||||
#define KEY_A 4 | |||||
#define KEY_B 5 | |||||
#define KEY_C 6 | |||||
#define KEY_D 7 | |||||
#define KEY_E 8 | |||||
#define KEY_F 9 | |||||
#define KEY_G 10 | |||||
#define KEY_H 11 | |||||
#define KEY_I 12 | |||||
#define KEY_J 13 | |||||
#define KEY_K 14 | |||||
#define KEY_L 15 | |||||
#define KEY_M 16 | |||||
#define KEY_N 17 | |||||
#define KEY_O 18 | |||||
#define KEY_P 19 | |||||
#define KEY_Q 20 | |||||
#define KEY_R 21 | |||||
#define KEY_S 22 | |||||
#define KEY_T 23 | |||||
#define KEY_U 24 | |||||
#define KEY_V 25 | |||||
#define KEY_W 26 | |||||
#define KEY_X 27 | |||||
#define KEY_Y 28 | |||||
#define KEY_Z 29 | |||||
#define KEY_1 30 | |||||
#define KEY_2 31 | |||||
#define KEY_3 32 | |||||
#define KEY_4 33 | |||||
#define KEY_5 34 | |||||
#define KEY_6 35 | |||||
#define KEY_7 36 | |||||
#define KEY_8 37 | |||||
#define KEY_9 38 | |||||
#define KEY_0 39 | |||||
#define KEY_ENTER 40 | |||||
#define KEY_ESC 41 | |||||
#define KEY_BACKSPACE 42 | |||||
#define KEY_TAB 43 | |||||
#define KEY_SPACE 44 | |||||
#define KEY_MINUS 45 | |||||
#define KEY_EQUAL 46 | |||||
#define KEY_LEFT_BRACE 47 | |||||
#define KEY_RIGHT_BRACE 48 | |||||
#define KEY_BACKSLASH 49 | |||||
#define KEY_NUMBER 50 | |||||
#define KEY_SEMICOLON 51 | |||||
#define KEY_QUOTE 52 | |||||
#define KEY_TILDE 53 | |||||
#define KEY_COMMA 54 | |||||
#define KEY_PERIOD 55 | |||||
#define KEY_SLASH 56 | |||||
#define KEY_CAPS_LOCK 57 | |||||
#define KEY_F1 58 | |||||
#define KEY_F2 59 | |||||
#define KEY_F3 60 | |||||
#define KEY_F4 61 | |||||
#define KEY_F5 62 | |||||
#define KEY_F6 63 | |||||
#define KEY_F7 64 | |||||
#define KEY_F8 65 | |||||
#define KEY_F9 66 | |||||
#define KEY_F10 67 | |||||
#define KEY_F11 68 | |||||
#define KEY_F12 69 | |||||
#define KEY_PRINTSCREEN 70 | |||||
#define KEY_SCROLL_LOCK 71 | |||||
#define KEY_PAUSE 72 | |||||
#define KEY_INSERT 73 | |||||
#define KEY_HOME 74 | |||||
#define KEY_PAGE_UP 75 | |||||
#define KEY_DELETE 76 | |||||
#define KEY_END 77 | |||||
#define KEY_PAGE_DOWN 78 | |||||
#define KEY_RIGHT 79 | |||||
#define KEY_LEFT 80 | |||||
#define KEY_DOWN 81 | |||||
#define KEY_UP 82 | |||||
#define KEY_NUM_LOCK 83 | |||||
#define KEYPAD_SLASH 84 | |||||
#define KEYPAD_ASTERIX 85 | |||||
#define KEYPAD_MINUS 86 | |||||
#define KEYPAD_PLUS 87 | |||||
#define KEYPAD_ENTER 88 | |||||
#define KEYPAD_1 89 | |||||
#define KEYPAD_2 90 | |||||
#define KEYPAD_3 91 | |||||
#define KEYPAD_4 92 | |||||
#define KEYPAD_5 93 | |||||
#define KEYPAD_6 94 | |||||
#define KEYPAD_7 95 | |||||
#define KEYPAD_8 96 | |||||
#define KEYPAD_9 97 | |||||
#define KEYPAD_0 98 | |||||
#define KEYPAD_PERIOD 99 | |||||
#define KEY_ISO_BACKSLASH 100 | |||||
#define KEY_APP 101 | |||||
#define KEYBOARD_ERROR 102 // See spec | |||||
#define KEYPAD_EQUAL 103 | |||||
#define KEY_F13 104 | |||||
#define KEY_F14 105 | |||||
#define KEY_F15 106 | |||||
#define KEY_F16 107 | |||||
#define KEY_F17 108 | |||||
#define KEY_F18 109 | |||||
#define KEY_F19 110 | |||||
#define KEY_F20 111 | |||||
#define KEY_F21 112 | |||||
#define KEY_F22 113 | |||||
#define KEY_F23 114 | |||||
#define KEY_F24 115 | |||||
#define KEY_EXEC 116 | |||||
#define KEY_HELP 117 | |||||
#define KEY_MENU 118 | |||||
#define KEY_SELECT 119 | |||||
#define KEY_STOP 120 | |||||
#define KEY_AGAIN 121 | |||||
#define KEY_UNDO 122 | |||||
#define KEY_CUT 123 | |||||
#define KEY_COPY 124 | |||||
#define KEY_PASTE 125 | |||||
#define KEY_FIND 126 | |||||
#define KEY_MUTE 127 | |||||
#define KEY_VOL_UP 128 | |||||
#define KEY_VOL_DOWN 129 | |||||
#define KEY_CAPS_LLOCK 130 // "Locking" Scroll Lock (Old keyboards with Locking Caps Lock) | |||||
#define KEY_NUM_LLOCK 131 | |||||
#define KEY_SCROLL_LLOCK 132 | |||||
#define KEYPAD_COMMA 133 // Brazillian (See spec) | |||||
#define KEYPAD_EQUAL_AS 134 // AS/400 Keyboard (See spec) | |||||
#define KEY_INTER1 135 // Brazillian and Japanese "Ru" | |||||
#define KEY_INTER2 136 // Japanese Katakana/Hiragana | |||||
#define KEY_INTER3 137 // Japanese Yen | |||||
#define KEY_INTER4 138 // Japanese Henkan | |||||
#define KEY_INTER5 139 // Japanese Muhenkan | |||||
#define KEY_INTER6 140 // PC98 Comma (Ka-m-ma) | |||||
#define KEY_INTER7 141 // Double-Byte/Single-Byte Toggle | |||||
#define KEY_INTER8 142 // Undefined | |||||
#define KEY_INTER9 143 // Undefined | |||||
#define KEY_LANG1 144 // Korean Hangul/English Toggle | |||||
#define KEY_LANG2 145 // Korean Hanja Conversion | |||||
#define KEY_LANG3 146 // Japanese Katakana Key (USB) | |||||
#define KEY_LANG4 147 // Japanese Hiragana Key (USB) | |||||
#define KEY_LANG5 148 // Japanese Zenkaku/Hankaku Key (USB) | |||||
#define KEY_LANG6 149 // Reserved (Application Specific) | |||||
#define KEY_LANG7 150 // Reserved (Application Specific) | |||||
#define KEY_LANG8 151 // Reserved (Application Specific) | |||||
#define KEY_LANG9 152 // Reserved (Application Specific) | |||||
#define KEY_ALT_ERASE 153 // Special Erase (See Spec) | |||||
#define KEY_SYSREQ_ATT 154 // Modifier Type | |||||
#define KEY_CANCEL 155 | |||||
#define KEY_CLEAR 156 | |||||
#define KEY_PRIOR 157 | |||||
#define KEY_RETURN 158 | |||||
#define KEY_SEPARATOR 159 | |||||
#define KEY_OUT 160 | |||||
#define KEY_OPER 161 | |||||
#define KEY_CLEAR_AGAIN 162 | |||||
#define KEY_CRSEL_PROPS 163 | |||||
#define KEY_EXSEL 164 | |||||
// 165 - 175 Reserved | |||||
#define KEYPAD_00 176 | |||||
#define KEYPAD_000 177 | |||||
#define KEY_1000_SEP 178 | |||||
#define KEY_DECIMAL_SEP 179 | |||||
#define KEY_CURRENCY_MAIN 180 | |||||
#define KEY_CURRENCY_SUB 181 | |||||
#define KEYPAD_LPAREN 182 | |||||
#define KEYPAD_RPAREN 183 | |||||
#define KEYPAD_LBRACE 184 | |||||
#define KEYPAD_RBRACE 185 | |||||
#define KEYPAD_TAB 186 | |||||
#define KEYPAD_BACKSPACE 187 | |||||
#define KEYPAD_A 188 | |||||
#define KEYPAD_B 189 | |||||
#define KEYPAD_C 190 | |||||
#define KEYPAD_D 191 | |||||
#define KEYPAD_E 192 | |||||
#define KEYPAD_F 193 | |||||
#define KEYPAD_XOR 194 | |||||
#define KEYPAD_CHEVRON 195 | |||||
#define KEYPAD_PERCENT 196 | |||||
#define KEYPAD_LTHAN 197 | |||||
#define KEYPAD_GTHAN 198 | |||||
#define KEYPAD_AND 199 | |||||
#define KEYPAD_AND_AND 200 | |||||
#define KEYPAD_OR 201 | |||||
#define KEYPAD_OR_OR 202 | |||||
#define KEYPAD_COLON 203 | |||||
#define KEYPAD_POUND 204 | |||||
#define KEYPAD_SPACE 205 | |||||
#define KEYPAD_AT 206 | |||||
#define KEYPAD_EXCLAIM 207 | |||||
#define KEYPAD_MEM_STORE 208 | |||||
#define KEYPAD_MEM_RECALL 209 | |||||
#define KEYPAD_MEM_CLEAR 210 | |||||
#define KEYPAD_MEM_ADD 211 | |||||
#define KEYPAD_MEM_SUB 212 | |||||
#define KEYPAD_MEM_MULT 213 | |||||
#define KEYPAD_MEM_DIV 214 | |||||
#define KEYPAD_PLUS_MINUS 215 | |||||
#define KEYPAD_CLEAR 216 | |||||
#define KEYPAD_CLEAR_ENTRY 217 | |||||
#define KEYPAD_BINARY 218 | |||||
#define KEYPAD_OCTAL 219 | |||||
#define KEYPAD_DECIMAL 220 | |||||
#define KEYPAD_HEX 221 | |||||
// 222 - 223 Reserved | |||||
#define KEYS_LCTRL 224 | |||||
#define KEYS_LSHIFT 225 | |||||
#define KEYS_LALT 226 | |||||
#define KEYS_LGUI 227 | |||||
#define KEYS_RCTRL 228 | |||||
#define KEYS_RSHIFT 229 | |||||
#define KEYS_RALT 230 | |||||
#define KEYS_RGUI 231 | |||||
// 232 - 65535 Reserved | |||||
#endif | |||||