Fixes+mod keys

This commit is contained in:
Robert Csordas
2016-11-12 20:25:15 +01:00
parent 6dc6c43238
commit d232e774b7

View File

@@ -68,86 +68,102 @@ key_matrix_t keyMatrix = {
#define KEY_STATE_COUNT (5*7)
uint8_t leftKeyStates[KEY_STATE_COUNT] = {0};
uint8_t scancodes[]={
HID_KEYBOARD_SC_7_AND_AMPERSAND,
HID_KEYBOARD_SC_8_AND_ASTERISK,
HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS,
HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS,
HID_KEYBOARD_SC_MINUS_AND_UNDERSCORE,
HID_KEYBOARD_SC_EQUAL_AND_PLUS,
HID_KEYBOARD_SC_BACKSPACE,
HID_KEYBOARD_SC_U,
HID_KEYBOARD_SC_I,
HID_KEYBOARD_SC_O,
HID_KEYBOARD_SC_P,
HID_KEYBOARD_SC_OPENING_BRACKET_AND_OPENING_BRACE,
HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE,
HID_KEYBOARD_SC_BACKSLASH_AND_PIPE,
HID_KEYBOARD_SC_Y,
HID_KEYBOARD_SC_J,
HID_KEYBOARD_SC_K,
HID_KEYBOARD_SC_L,
HID_KEYBOARD_SC_SEMICOLON_AND_COLON,
HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE,
HID_KEYBOARD_SC_ENTER,
HID_KEYBOARD_SC_H,
HID_KEYBOARD_SC_N,
HID_KEYBOARD_SC_M,
HID_KEYBOARD_SC_COMMA_AND_LESS_THAN_SIGN,
HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN,
HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK,
HID_KEYBOARD_SC_RIGHT_SHIFT,
HID_KEYBOARD_SC_A, //??
HID_KEYBOARD_SC_SPACE,
HID_KEYBOARD_SC_A, //??
HID_KEYBOARD_SC_SPACE, //Fn
HID_KEYBOARD_SC_RIGHT_ALT,
HID_KEYBOARD_SC_RIGHT_GUI,
HID_KEYBOARD_SC_RIGHT_CONTROL,
uint8_t defaultLayout[][2]={
{HID_KEYBOARD_SC_7_AND_AMPERSAND, HID_KEYBOARD_SC_F7},
{HID_KEYBOARD_SC_8_AND_ASTERISK, HID_KEYBOARD_SC_F8},
{HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS, HID_KEYBOARD_SC_F9},
{HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS, HID_KEYBOARD_SC_F10},
{HID_KEYBOARD_SC_MINUS_AND_UNDERSCORE, HID_KEYBOARD_SC_F11},
{HID_KEYBOARD_SC_EQUAL_AND_PLUS, HID_KEYBOARD_SC_F12},
{HID_KEYBOARD_SC_BACKSPACE, HID_KEYBOARD_SC_DELETE},
{HID_KEYBOARD_SC_U},
{HID_KEYBOARD_SC_I, HID_KEYBOARD_SC_UP_ARROW},
{HID_KEYBOARD_SC_O},
{HID_KEYBOARD_SC_P, HID_KEYBOARD_SC_PRINT_SCREEN},
{HID_KEYBOARD_SC_OPENING_BRACKET_AND_OPENING_BRACE, HID_KEYBOARD_SC_SCROLL_LOCK},
{HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE, HID_KEYBOARD_SC_PAUSE},
{HID_KEYBOARD_SC_BACKSLASH_AND_PIPE},
{HID_KEYBOARD_SC_Y, HID_KEYBOARD_SC_PAGE_UP},
{HID_KEYBOARD_SC_J, HID_KEYBOARD_SC_LEFT_ARROW},
{HID_KEYBOARD_SC_K, HID_KEYBOARD_SC_DOWN_ARROW},
{HID_KEYBOARD_SC_L, HID_KEYBOARD_SC_RIGHT_ARROW},
{HID_KEYBOARD_SC_SEMICOLON_AND_COLON},
{HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE},
{HID_KEYBOARD_SC_ENTER},
{HID_KEYBOARD_SC_H, HID_KEYBOARD_SC_PAGE_DOWN},
{HID_KEYBOARD_SC_N, HID_KEYBOARD_SC_MEDIA_MUTE},
{HID_KEYBOARD_SC_M},
{HID_KEYBOARD_SC_COMMA_AND_LESS_THAN_SIGN},
{HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN},
{HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK},
{HID_KEYBOARD_SC_RIGHT_SHIFT},
{0}, //??
{HID_KEYBOARD_SC_SPACE},
{0}, //??
{0}, //Fn
{HID_KEYBOARD_SC_RIGHT_ALT},
{HID_KEYBOARD_SC_RIGHT_GUI},
{HID_KEYBOARD_SC_RIGHT_CONTROL},
//Left half
HID_KEYBOARD_SC_KEYPAD_1_AND_END,
HID_KEYBOARD_SC_KEYPAD_2_AND_DOWN_ARROW,
HID_KEYBOARD_SC_KEYPAD_3_AND_PAGE_DOWN,
HID_KEYBOARD_SC_KEYPAD_4_AND_LEFT_ARROW,
HID_KEYBOARD_SC_KEYPAD_5,
HID_KEYBOARD_SC_KEYPAD_6_AND_RIGHT_ARROW,
HID_KEYBOARD_SC_TAB,
HID_KEYBOARD_SC_Q,
HID_KEYBOARD_SC_W,
HID_KEYBOARD_SC_E,
HID_KEYBOARD_SC_R,
HID_KEYBOARD_SC_A, //??
HID_KEYBOARD_SC_T,
HID_KEYBOARD_SC_CAPS_LOCK,
HID_KEYBOARD_SC_A,
HID_KEYBOARD_SC_S,
HID_KEYBOARD_SC_D,
HID_KEYBOARD_SC_F,
HID_KEYBOARD_SC_A, //??
HID_KEYBOARD_SC_G,
HID_KEYBOARD_SC_LEFT_SHIFT,
HID_KEYBOARD_SC_NON_US_HASHMARK_AND_TILDE, //no idea if this is the right one,
HID_KEYBOARD_SC_Z,
HID_KEYBOARD_SC_X,
HID_KEYBOARD_SC_C,
HID_KEYBOARD_SC_V,
HID_KEYBOARD_SC_B,
HID_KEYBOARD_SC_LEFT_CONTROL,
HID_KEYBOARD_SC_LEFT_GUI,
HID_KEYBOARD_SC_LEFT_ALT,
HID_KEYBOARD_SC_SPACE, //Fn
HID_KEYBOARD_SC_A, //??
HID_KEYBOARD_SC_SPACE, //Mod
{HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE, HID_KEYBOARD_SC_ESCAPE},
{HID_KEYBOARD_SC_1_AND_EXCLAMATION, HID_KEYBOARD_SC_F1},
{HID_KEYBOARD_SC_2_AND_AT, HID_KEYBOARD_SC_F2},
{HID_KEYBOARD_SC_3_AND_HASHMARK, HID_KEYBOARD_SC_F3},
{HID_KEYBOARD_SC_4_AND_DOLLAR, HID_KEYBOARD_SC_F4},
{HID_KEYBOARD_SC_5_AND_PERCENTAGE, HID_KEYBOARD_SC_F5},
{HID_KEYBOARD_SC_6_AND_CARET, HID_KEYBOARD_SC_F6},
{HID_KEYBOARD_SC_TAB},
{HID_KEYBOARD_SC_Q},
{HID_KEYBOARD_SC_W, HID_KEYBOARD_SC_UP_ARROW},
{HID_KEYBOARD_SC_E},
{HID_KEYBOARD_SC_R},
{0}, //??
{HID_KEYBOARD_SC_T, HID_KEYBOARD_SC_HOME},
{HID_KEYBOARD_SC_CAPS_LOCK},
{HID_KEYBOARD_SC_A, HID_KEYBOARD_SC_LEFT_ARROW},
{HID_KEYBOARD_SC_S, HID_KEYBOARD_SC_DOWN_ARROW},
{HID_KEYBOARD_SC_D, HID_KEYBOARD_SC_RIGHT_ARROW},
{HID_KEYBOARD_SC_F, HID_KEYBOARD_SC_DELETE},
{0}, //??
{HID_KEYBOARD_SC_G, HID_KEYBOARD_SC_END},
{HID_KEYBOARD_SC_LEFT_SHIFT},
{HID_KEYBOARD_SC_NON_US_BACKSLASH_AND_PIPE}, //no idea if this is the right one},
{HID_KEYBOARD_SC_Z, HID_KEYBOARD_SC_MEDIA_BACKWARD},
{HID_KEYBOARD_SC_X, HID_KEYBOARD_SC_MEDIA_PLAY},
{HID_KEYBOARD_SC_C, HID_KEYBOARD_SC_MEDIA_FORWARD},
{HID_KEYBOARD_SC_V, HID_KEYBOARD_SC_MEDIA_VOLUME_DOWN},
{HID_KEYBOARD_SC_B, HID_KEYBOARD_SC_MEDIA_VOLUME_UP},
{HID_KEYBOARD_SC_LEFT_CONTROL},
{HID_KEYBOARD_SC_LEFT_GUI},
{HID_KEYBOARD_SC_LEFT_ALT},
{0}, //Fn
{0}, //??
{0}, //Mod
};
#define MOD_PRESSED 1
#define FN_PRESSED 2
#define MOD_KEYID 33
#define LEFT_FN 30
#define RIGHT_FN 33
#define LEFT_OFFSET 35
static uint8_t modifierState=0;
static uint8_t getKeycode(uint8_t keyId)
{
int activeIndex = (modifierState & MOD_PRESSED) ? 1 : 0;
if (keyId<sizeof(scancodes))
return scancodes[keyId];
return defaultLayout[keyId][activeIndex];
else
return HID_KEYBOARD_SC_A + keyId - sizeof(scancodes);
return 0;
}
static usb_status_t UsbKeyboardAction(void)
{
UsbKeyboardReport.modifiers = 0;
@@ -166,16 +182,23 @@ static usb_status_t UsbKeyboardAction(void)
I2cRead(I2C_MAIN_BUS_BASEADDR, I2C_ADDRESS_LEFT_KEYBOARD_HALF, leftKeyStates, KEY_STATE_COUNT);
modifierState = (leftKeyStates[MOD_KEYID] ? MOD_PRESSED : 0) |
((leftKeyStates[LEFT_FN] | keyMatrix.keyStates[RIGHT_FN]) ? FN_PRESSED : 0);
scancodeIdx = 0;
for (uint8_t keyId=0; keyId<KEYBOARD_MATRIX_COLS_NUM*KEYBOARD_MATRIX_ROWS_NUM; keyId++) {
if (keyMatrix.keyStates[keyId] && scancodeIdx<USB_KEYBOARD_MAX_KEYS) {
UsbKeyboardReport.scancodes[scancodeIdx++] = getKeycode(keyId);
uint8_t code=getKeycode(keyId);
if (code)
UsbKeyboardReport.scancodes[scancodeIdx++] = code;
}
}
for (uint8_t keyId=0; keyId<KEY_STATE_COUNT; keyId++) {
if (leftKeyStates[keyId] && scancodeIdx<USB_KEYBOARD_MAX_KEYS) {
UsbKeyboardReport.scancodes[scancodeIdx++] = getKeycode(34+keyId);
uint8_t code=getKeycode(LEFT_OFFSET+keyId);
if (code)
UsbKeyboardReport.scancodes[scancodeIdx++] = code;
}
}