#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <util/delay.h>
+#include "usb_keys.h"
//#include "usb_keyboard.h"
// TEMP INCLUDES
uint16_t sendKeypressCounter = 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,
KEY_INSERT,
KEY_1,
KEY_MINUS,
KEY_EQUAL,
KEY_BACKSLASH,
+ KEY_TILDE,
+ KEY_BACKSPACE,
KEY_ALT,
KEY_TAB,
KEY_Q,
KEY_DELETE,
KEY_UP,
KEY_CTRL,
- KEY_CAPS_LOCK,
+ KEY_CAPS_LLOCK,
KEY_A,
KEY_S,
KEY_D,
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 ) {
for ( uint8_t key = 0; key < numberOfKeys + 1; key++ ) {
if ( keys[key] & (1 << 7) ) {
// Too many keys
if ( *validKeys == 6 )
break;
- keyboard_keys[*validKeys++] = defaultMap[key];
+ keyboard_keys[(*validKeys)++] = defaultMap[key];
}
}
}
print(":\n");
// TODO undo potentially old keys
+ pint8(validKeys);
for ( uint8_t c = validKeys; c < 6; c++ )
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
// Currently limited to the USB spec (6 keys + modifiers)
// Making sure to pass zeros when there are no keys being pressed
sendKeypresses = 0;
}
- // usb_keyboard_press(KEY_B, KEY_SHIFT);
return 0;
}
+// Timer Interrupt for flagging a send of the sampled key detection data to the USB host
ISR( TIMER0_OVF_vect )
{
sendKeypressCounter++;
void usb_debug_flush_output(void); // immediately transmit any buffered output
#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
#ifdef USB_SERIAL_PRIVATE_INCLUDE
--- /dev/null
+#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
+