#ifndef __layouts_h | |||||
#define __layouts_h | |||||
// Modifier Mask | |||||
#define MODIFIERS_KEYPAD 0 | |||||
#define MODIFIERS_KEYBOARD 4 | |||||
static uint8_t keypad_modifierMask[] = {}; | |||||
static uint8_t keyboard_modifierMask[] = { 1, 17, 33, 49 }; | |||||
// Default 1-indexed key mappings | |||||
static 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 uint8_t defaultMap[] = { 0, | |||||
KEY_GUI, | |||||
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_BACKSLASH, | |||||
KEY_TILDE, | |||||
KEY_BACKSPACE, | |||||
KEY_ALT, | |||||
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, | |||||
KEY_DELETE, | |||||
KEY_UP, | |||||
KEY_CTRL, | |||||
KEY_CAPS_LLOCK, | |||||
KEY_A, | |||||
KEY_S, | |||||
KEY_D, | |||||
KEY_F, | |||||
KEY_G, | |||||
KEY_H, | |||||
KEY_J, | |||||
KEY_K, | |||||
KEY_L, | |||||
KEY_SEMICOLON, | |||||
KEY_QUOTE, | |||||
KEY_ENTER, | |||||
KEY_DOWN, | |||||
KEY_ESC, | |||||
KEY_LEFT_SHIFT, | |||||
KEY_Z, | |||||
KEY_X, | |||||
KEY_C, | |||||
KEY_V, | |||||
KEY_B, | |||||
KEY_N, | |||||
KEY_M, | |||||
KEY_COMMA, | |||||
KEY_PERIOD, | |||||
KEY_SLASH, | |||||
KEY_RIGHT_SHIFT, | |||||
KEY_LEFT, | |||||
KEY_RIGHT, | |||||
KEY_SPACE }; | |||||
static uint8_t colemakMap[] = { 0, | |||||
KEY_GUI, | |||||
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_BACKSLASH, | |||||
KEY_TILDE, | |||||
KEY_BACKSPACE, | |||||
KEY_ALT, | |||||
KEY_TAB, | |||||
KEY_Q, | |||||
KEY_W, | |||||
KEY_F, | |||||
KEY_P, | |||||
KEY_G, | |||||
KEY_J, | |||||
KEY_L, | |||||
KEY_U, | |||||
KEY_Y, | |||||
KEY_SEMICOLON, | |||||
KEY_LEFT_BRACE, | |||||
KEY_RIGHT_BRACE, | |||||
KEY_DELETE, | |||||
KEY_UP, | |||||
KEY_CTRL, | |||||
KEY_CAPS_LLOCK, | |||||
KEY_A, | |||||
KEY_R, | |||||
KEY_S, | |||||
KEY_T, | |||||
KEY_D, | |||||
KEY_H, | |||||
KEY_N, | |||||
KEY_E, | |||||
KEY_I, | |||||
KEY_O, | |||||
KEY_QUOTE, | |||||
KEY_ENTER, | |||||
KEY_DOWN, | |||||
KEY_ESC, | |||||
KEY_LEFT_SHIFT, | |||||
KEY_Z, | |||||
KEY_X, | |||||
KEY_C, | |||||
KEY_V, | |||||
KEY_B, | |||||
KEY_K, | |||||
KEY_M, | |||||
KEY_COMMA, | |||||
KEY_PERIOD, | |||||
KEY_SLASH, | |||||
KEY_RIGHT_SHIFT, | |||||
KEY_LEFT, | |||||
KEY_RIGHT, | |||||
KEY_SPACE }; | |||||
#endif | |||||
#include <avr/interrupt.h> | #include <avr/interrupt.h> | ||||
#include <util/delay.h> | #include <util/delay.h> | ||||
#include "usb_keys.h" | #include "usb_keys.h" | ||||
#include "layouts.h" | |||||
//#include "usb_keyboard.h" | //#include "usb_keyboard.h" | ||||
// TEMP INCLUDES | // TEMP INCLUDES | ||||
#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) | #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) | ||||
// Number of keys | // Number of keys | ||||
#define KEYBOARD_SIZE 63 | #define KEYBOARD_SIZE 63 | ||||
#define KEYPAD_SIZE 16 | #define KEYPAD_SIZE 16 | ||||
uint8_t keyDetectArray[KEYBOARD_SIZE + 1]; | uint8_t keyDetectArray[KEYBOARD_SIZE + 1]; | ||||
uint8_t keypadDetectArray[KEYPAD_SIZE + 1]; | uint8_t keypadDetectArray[KEYPAD_SIZE + 1]; | ||||
// Interrupt Variables | |||||
uint16_t sendKeypressCounter = 0; | uint16_t sendKeypressCounter = 0; | ||||
volatile uint8_t sendKeypresses = 0; | volatile uint8_t sendKeypresses = 0; | ||||
// Modifier Mask | |||||
#define MODIFIERS_KEYPAD 0 | |||||
#define MODIFIERS_KEYBOARD 4 | |||||
static uint8_t keypad_modifierMask[] = {}; | |||||
static uint8_t keyboard_modifierMask[] = { 1, 17, 33, 49 }; | |||||
// Default 1-indexed key mappings | |||||
static 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 uint8_t defaultMap[] = { 0, | |||||
KEY_GUI, | |||||
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_BACKSLASH, | |||||
KEY_TILDE, | |||||
KEY_BACKSPACE, | |||||
KEY_ALT, | |||||
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, | |||||
KEY_DELETE, | |||||
KEY_UP, | |||||
KEY_CTRL, | |||||
KEY_CAPS_LLOCK, | |||||
KEY_A, | |||||
KEY_S, | |||||
KEY_D, | |||||
KEY_F, | |||||
KEY_G, | |||||
KEY_H, | |||||
KEY_J, | |||||
KEY_K, | |||||
KEY_L, | |||||
KEY_SEMICOLON, | |||||
KEY_QUOTE, | |||||
KEY_ENTER, | |||||
KEY_DOWN, | |||||
KEY_ESC, | |||||
KEY_LEFT_SHIFT, | |||||
KEY_Z, | |||||
KEY_X, | |||||
KEY_C, | |||||
KEY_V, | |||||
KEY_B, | |||||
KEY_N, | |||||
KEY_M, | |||||
KEY_COMMA, | |||||
KEY_PERIOD, | |||||
KEY_SLASH, | |||||
KEY_RIGHT_SHIFT, | |||||
KEY_LEFT, | |||||
KEY_RIGHT, | |||||
KEY_SPACE }; | |||||
void detection( int group ) | void detection( int group ) | ||||
{ | { | ||||
// XXX Modify for different detection groups <-> groupArray mappings | // XXX Modify for different detection groups <-> groupArray mappings | ||||
// Detect Valid Keypresses - TODO | // Detect Valid Keypresses - TODO | ||||
uint8_t validKeys = 0; | uint8_t validKeys = 0; | ||||
keyPressDetection( keyDetectArray, &validKeys, KEYBOARD_SIZE, keyboard_modifierMask, MODIFIERS_KEYBOARD, defaultMap ); | |||||
keyPressDetection( keypadDetectArray, &validKeys, KEYPAD_SIZE, keypad_modifierMask, MODIFIERS_KEYPAD, keypadDefaultMap ); | |||||
// Map selection | |||||
if ( keyDetectArray[34] & (1 << 7) ) { // CapsLock FN Modifier | |||||
keyPressDetection( keyDetectArray, &validKeys, KEYBOARD_SIZE, keyboard_modifierMask, MODIFIERS_KEYBOARD, colemakMap ); | |||||
keyPressDetection( keypadDetectArray, &validKeys, KEYPAD_SIZE, keypad_modifierMask, MODIFIERS_KEYPAD, keypadDefaultMap ); | |||||
} | |||||
else { | |||||
keyPressDetection( keyDetectArray, &validKeys, KEYBOARD_SIZE, keyboard_modifierMask, MODIFIERS_KEYBOARD, defaultMap ); | |||||
keyPressDetection( keypadDetectArray, &validKeys, KEYPAD_SIZE, keypad_modifierMask, MODIFIERS_KEYPAD, keypadDefaultMap ); | |||||
} | |||||
print(":\n"); | print(":\n"); | ||||
// TODO undo potentially old keys | // TODO undo potentially old keys |
extern uint8_t keyboard_keys[6]; | extern uint8_t keyboard_keys[6]; | ||||
extern volatile uint8_t keyboard_leds; | extern volatile uint8_t keyboard_leds; | ||||
// This file does not include the HID debug functions, so these empty | |||||
// macros replace them with nothing, so users can compile code that | |||||
// has calls to these functions. | |||||
#define usb_debug_putchar(c) | |||||
#define usb_debug_flush_output() | |||||
#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 | |||||
#include <avr/io.h> | |||||
#include <avr/pgmspace.h> | |||||
#include <avr/interrupt.h> | |||||
#define EP_TYPE_CONTROL 0x00 | |||||
#define EP_TYPE_BULK_IN 0x81 | |||||
#define EP_TYPE_BULK_OUT 0x80 | |||||
#define EP_TYPE_INTERRUPT_IN 0xC1 | |||||
#define EP_TYPE_INTERRUPT_OUT 0xC0 | |||||
#define EP_TYPE_ISOCHRONOUS_IN 0x41 | |||||
#define EP_TYPE_ISOCHRONOUS_OUT 0x40 | |||||
#define EP_SINGLE_BUFFER 0x02 | |||||
#define EP_DOUBLE_BUFFER 0x06 | |||||
#define EP_SIZE(s) ((s) == 64 ? 0x30 : \ | |||||
((s) == 32 ? 0x20 : \ | |||||
((s) == 16 ? 0x10 : \ | |||||
0x00))) | |||||
#define MAX_ENDPOINT 4 | |||||
#define LSB(n) (n & 255) | |||||
#define MSB(n) ((n >> 8) & 255) | |||||
#if defined(__AVR_AT90USB162__) | |||||
#define HW_CONFIG() | |||||
#define PLL_CONFIG() (PLLCSR = ((1<<PLLE)|(1<<PLLP0))) | |||||
#define USB_CONFIG() (USBCON = (1<<USBE)) | |||||
#define USB_FREEZE() (USBCON = ((1<<USBE)|(1<<FRZCLK))) | |||||
#elif defined(__AVR_ATmega32U4__) | |||||
#define HW_CONFIG() (UHWCON = 0x01) | |||||
#define PLL_CONFIG() (PLLCSR = 0x12) | |||||
#define USB_CONFIG() (USBCON = ((1<<USBE)|(1<<OTGPADE))) | |||||
#define USB_FREEZE() (USBCON = ((1<<USBE)|(1<<FRZCLK))) | |||||
#elif defined(__AVR_AT90USB646__) | |||||
#define HW_CONFIG() (UHWCON = 0x81) | |||||
#define PLL_CONFIG() (PLLCSR = 0x1A) | |||||
#define USB_CONFIG() (USBCON = ((1<<USBE)|(1<<OTGPADE))) | |||||
#define USB_FREEZE() (USBCON = ((1<<USBE)|(1<<FRZCLK))) | |||||
#elif defined(__AVR_AT90USB1286__) | |||||
#define HW_CONFIG() (UHWCON = 0x81) | |||||
#define PLL_CONFIG() (PLLCSR = 0x16) | |||||
#define USB_CONFIG() (USBCON = ((1<<USBE)|(1<<OTGPADE))) | |||||
#define USB_FREEZE() (USBCON = ((1<<USBE)|(1<<FRZCLK))) | |||||
#endif | #endif | ||||
// standard control endpoint request types | |||||
#define GET_STATUS 0 | |||||
#define CLEAR_FEATURE 1 | |||||
#define SET_FEATURE 3 | |||||
#define SET_ADDRESS 5 | |||||
#define GET_DESCRIPTOR 6 | |||||
#define GET_CONFIGURATION 8 | |||||
#define SET_CONFIGURATION 9 | |||||
#define GET_INTERFACE 10 | |||||
#define SET_INTERFACE 11 | |||||
// HID (human interface device) | |||||
#define HID_GET_REPORT 1 | |||||
#define HID_GET_IDLE 2 | |||||
#define HID_GET_PROTOCOL 3 | |||||
#define HID_SET_REPORT 9 | |||||
#define HID_SET_IDLE 10 | |||||
#define HID_SET_PROTOCOL 11 | |||||
// CDC (communication class device) | |||||
#define CDC_SET_LINE_CODING 0x20 | |||||
#define CDC_GET_LINE_CODING 0x21 | |||||
#define CDC_SET_CONTROL_LINE_STATE 0x22 | |||||
#endif | |||||
#endif |