From 6aedaf7074c4c7213198e8a93fd394b9a80bfdc2 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Mon, 12 Dec 2016 20:10:42 +0100 Subject: [PATCH 1/5] Big Keymap Refactor(tm) This changes the keymap layout to be as described in #17, and updates the default layout to follow. (Also adds the missing Space and Mod keys on the two keys below the bottom row) The layout itself was considerably simplified by introducing a few local macros to hide some of the uglier details. Fixes #17. Signed-off-by: Gergely Nagy --- right/src/default_layout.c | 123 +++++++++++++++--------------------- right/src/keyboard_layout.c | 24 +++---- right/src/keyboard_layout.h | 10 +-- 3 files changed, 68 insertions(+), 89 deletions(-) diff --git a/right/src/default_layout.c b/right/src/default_layout.c index e9db51e..0a53a15 100644 --- a/right/src/default_layout.c +++ b/right/src/default_layout.c @@ -1,77 +1,56 @@ #include "default_layout.h" -KEYBOARD_LAYOUT(defaultKeyboardLayout)={ - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_7_AND_AMPERSAND } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F7 } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_8_AND_ASTERISK } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F8 } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F9 } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F10 } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_MINUS_AND_UNDERSCORE } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F11 } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_EQUAL_AND_PLUS } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F12 } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_BACKSPACE } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_DELETE } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_U } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_I } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_UP_ARROW } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_O } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_P } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_PRINT_SCREEN } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_OPENING_BRACKET_AND_OPENING_BRACE } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_SCROLL_LOCK } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_PAUSE } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_BACKSLASH_AND_PIPE } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_Y } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_PAGE_UP } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_J } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_LEFT_ARROW } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_K } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_DOWN_ARROW } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_L } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_RIGHT_ARROW } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_SEMICOLON_AND_COLON } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_ENTER } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_H } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_PAGE_DOWN } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_N } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_MEDIA_MUTE } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_M } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_COMMA_AND_LESS_THAN_SIGN } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_RIGHT_SHIFT } }}, - {Key_NoKey}, //?? - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_SPACE } }}, - {Key_NoKey}, //?? - {{.type = UHK_KEY_LAYER, .layer = { .target = LAYER_FN }}}, //Fn - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_RIGHT_ALT } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_RIGHT_GUI } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_RIGHT_CONTROL } }}, +#define S(k) {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_ ## k }} +#define L(l) {.type = UHK_KEY_LAYER, .layer = { .target = LAYER_ID_ ## l }} +#define TRNS {.type = UHK_KEY_TRANSPARENT} + +#define Key_NoKey { .raw = 0 } + +KEYBOARD_LAYOUT(defaultKeyboardLayout)= { + // Layer 0 + { + // Right + { + S(7_AND_AMPERSAND), S(8_AND_ASTERISK), S(9_AND_OPENING_PARENTHESIS), S(0_AND_CLOSING_PARENTHESIS), S(MINUS_AND_UNDERSCORE), S(EQUAL_AND_PLUS), S(BACKSPACE), + S(U), S(I), S(O), S(P), S(OPENING_BRACKET_AND_OPENING_BRACE), S(CLOSING_BRACKET_AND_CLOSING_BRACE), S(BACKSLASH_AND_PIPE), S(Y), + S(J), S(K), S(L), S(SEMICOLON_AND_COLON), S(APOSTROPHE_AND_QUOTE), S(ENTER), S(H), + S(N), S(M), S(COMMA_AND_LESS_THAN_SIGN), S(DOT_AND_GREATER_THAN_SIGN), S(SLASH_AND_QUESTION_MARK), S(RIGHT_SHIFT), Key_NoKey, + S(SPACE), L(MOD), L(FN), S(RIGHT_ALT), S(RIGHT_GUI), S(RIGHT_CONTROL), + }, + + // Left + { + S(GRAVE_ACCENT_AND_TILDE), S(1_AND_EXCLAMATION), S(2_AND_AT), S(3_AND_HASHMARK), S(4_AND_DOLLAR), S(5_AND_PERCENTAGE), S(6_AND_CARET), + S(TAB), S(Q), S(W), S(E), S(R), Key_NoKey, S(T), + S(CAPS_LOCK), S(A), S(S), S(D), S(F), Key_NoKey, S(G), + S(LEFT_SHIFT), S(NON_US_BACKSLASH_AND_PIPE), S(Z), S(X), S(C), S(V), S(B), + S(LEFT_CONTROL), S(LEFT_GUI), S(LEFT_ALT), L(FN), S(SPACE), L(MOD), Key_NoKey, + } + }, + + // Layer 1: MOD + { + // Right + { + S(F7), S(F8), S(F9), S(F10), S(F11), S(F12), S(DELETE), + Key_NoKey, S(UP_ARROW), Key_NoKey, S(PRINT_SCREEN), S(SCROLL_LOCK), S(PAUSE), Key_NoKey, S(PAGE_UP), + S(LEFT_ARROW), S(DOWN_ARROW), S(RIGHT_ARROW), Key_NoKey, Key_NoKey, Key_NoKey, S(PAGE_DOWN), + S(MEDIA_MUTE), Key_NoKey, Key_NoKey, Key_NoKey, Key_NoKey, Key_NoKey, Key_NoKey, + Key_NoKey, TRNS, Key_NoKey, Key_NoKey, Key_NoKey, + }, + + // Left + { + S(ESCAPE), S(F1), S(F2), S(F3), S(F4), S(F5), S(F6), + Key_NoKey, Key_NoKey, S(UP_ARROW), Key_NoKey, Key_NoKey, Key_NoKey, S(HOME), + Key_NoKey, S(LEFT_ARROW), S(DOWN_ARROW), S(RIGHT_ARROW), S(DELETE), Key_NoKey, S(END), + Key_NoKey, Key_NoKey, S(MEDIA_BACKWARD), S(MEDIA_PLAY), S(MEDIA_FORWARD), S(MEDIA_VOLUME_DOWN), S(MEDIA_VOLUME_UP), + Key_NoKey, Key_NoKey, Key_NoKey, Key_NoKey, Key_NoKey, TRNS, Key_NoKey, + } + }, + + // Layer 2: FN + // Layer 3: Mouse - //Left half - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_ESCAPE } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_1_AND_EXCLAMATION } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F1 } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_2_AND_AT } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F2 } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_3_AND_HASHMARK } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F3 } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_4_AND_DOLLAR } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F4 } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_5_AND_PERCENTAGE } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F5 } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_6_AND_CARET } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F6 } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_TAB } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_Q } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_W } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_UP_ARROW } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_E } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_R } }}, - {Key_NoKey}, //?? - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_T } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_HOME } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_CAPS_LOCK } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_A } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_LEFT_ARROW } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_S } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_DOWN_ARROW } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_D } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_RIGHT_ARROW } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_DELETE } }}, - {Key_NoKey}, //?? - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_G } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_END } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_LEFT_SHIFT } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_NON_US_BACKSLASH_AND_PIPE } }}, //no idea if this is the right one}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_Z } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_MEDIA_BACKWARD } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_X } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_MEDIA_PLAY } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_C } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_MEDIA_FORWARD } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_V } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_MEDIA_VOLUME_DOWN } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_B } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_MEDIA_VOLUME_UP } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_LEFT_CONTROL } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_LEFT_GUI } }}, - {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_LEFT_ALT } }}, - {{.type = UHK_KEY_LAYER, .layer = { .target = LAYER_FN }}}, //Fn - {Key_NoKey}, //?? - {{.type = UHK_KEY_LAYER, .layer = { .target = LAYER_MOD }}}, //Mod - {Key_NoKey} //?? }; diff --git a/right/src/keyboard_layout.c b/right/src/keyboard_layout.c index 79de692..c2aa002 100644 --- a/right/src/keyboard_layout.c +++ b/right/src/keyboard_layout.c @@ -1,22 +1,22 @@ #include "keyboard_layout.h" #include "led_driver.h" -static uint8_t keyMasks[LAYOUT_KEY_COUNT]; +static uint8_t keyMasks[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE]; static uint8_t modifierState = 0; -static inline __attribute__((always_inline)) uhk_key_t getKeycode(KEYBOARD_LAYOUT(layout), uint8_t keyId) +static inline __attribute__((always_inline)) uhk_key_t getKeycode(KEYBOARD_LAYOUT(layout), uint8_t slotId, uint8_t keyId) { - if (keyId < LAYOUT_KEY_COUNT) { - if (keyMasks[keyId]!=0 && keyMasks[keyId]!=modifierState) { + if (keyId < MAX_KEY_COUNT_PER_MODULE) { + if (keyMasks[slotId][keyId]!=0 && keyMasks[slotId][keyId]!=modifierState) { // Mask out key presses after releasing modifier keys return (uhk_key_t){.raw=0}; } - uhk_key_t k = layout[keyId][modifierState]; - keyMasks[keyId] = modifierState; + uhk_key_t k = layout[modifierState][slotId][keyId]; + keyMasks[slotId][keyId] = modifierState; if (k.raw == 0) { - k = layout[keyId][0]; + k = layout[0][slotId][keyId]; } return k; @@ -27,13 +27,13 @@ static inline __attribute__((always_inline)) uhk_key_t getKeycode(KEYBOARD_LAYOU static void clearKeymasks(const uint8_t *leftKeyStates, const uint8_t *rightKeyStates){ int i; - for (i=0; i Date: Mon, 12 Dec 2016 20:14:09 +0100 Subject: [PATCH 2/5] Better key state tracking We need to store the previous state of the keys, to figure out when a specific key is released, as opposed to simply not being pressed. This is required for layer keys such as `Mod` and `Fn` to work properly when there are more than one of them on the keymap. Without being able to tell when a key is released, we would not be able to turn a layer off only when no layer key is held. Not easily, anyway: we'd have to track the state of all layer keys... but then it is easier to just track them all. Thankfully, the memcpy at the end is fast, as it only needs to copy 70 bytes. Signed-off-by: Gergely Nagy --- right/src/keyboard_layout.c | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/right/src/keyboard_layout.c b/right/src/keyboard_layout.c index c2aa002..0f56a5e 100644 --- a/right/src/keyboard_layout.c +++ b/right/src/keyboard_layout.c @@ -4,6 +4,9 @@ static uint8_t keyMasks[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE]; static uint8_t modifierState = 0; +static uint8_t prevLeftKeyStates[KEY_STATE_COUNT]; +static uint8_t prevRightKeyStates[KEY_STATE_COUNT]; + static inline __attribute__((always_inline)) uhk_key_t getKeycode(KEYBOARD_LAYOUT(layout), uint8_t slotId, uint8_t keyId) { if (keyId < MAX_KEY_COUNT_PER_MODULE) { @@ -15,7 +18,7 @@ static inline __attribute__((always_inline)) uhk_key_t getKeycode(KEYBOARD_LAYOU uhk_key_t k = layout[modifierState][slotId][keyId]; keyMasks[slotId][keyId] = modifierState; - if (k.raw == 0) { + if (k.type == UHK_KEY_TRANSPARENT) { k = layout[0][slotId][keyId]; } @@ -67,18 +70,32 @@ bool layerOff(uhk_key_t key) { return false; } -bool handleKey(uhk_key_t key, int scancodeIdx, usb_keyboard_report_t *report, uint8_t keyState) { +bool key_toggled_on (const uint8_t *prevKeyStates, const uint8_t *currKeyStates, uint8_t keyId) { + return (!prevKeyStates[keyId]) && currKeyStates[keyId]; +} + +bool key_is_pressed (const uint8_t *prevKeyStates, const uint8_t *currKeyStates, uint8_t keyId) { + return currKeyStates[keyId]; +} + +bool key_toggled_off (const uint8_t *prevKeyStates, const uint8_t *currKeyStates, uint8_t keyId) { + return (!currKeyStates[keyId]) && prevKeyStates[keyId]; +} + +bool handleKey(uhk_key_t key, int scancodeIdx, usb_keyboard_report_t *report, const uint8_t *prevKeyStates, const uint8_t *currKeyStates, uint8_t keyId) { switch (key.type) { case UHK_KEY_SIMPLE: - if (keyState) { + if (key_is_pressed (prevKeyStates, currKeyStates, keyId)) { return pressKey (key, scancodeIdx, report); } break; case UHK_KEY_LAYER: - if (keyState) { - return layerOn(key); + if (key_toggled_on (prevKeyStates, currKeyStates, keyId)) { + return layerOn (key); + } + if (key_toggled_off (prevKeyStates, currKeyStates, keyId)) { + return layerOff (key); } - return layerOff(key); break; default: break; @@ -98,7 +115,7 @@ void fillKeyboardReport(usb_keyboard_report_t *report, const uint8_t *leftKeySta uhk_key_t code = getKeycode(layout, SLOT_ID_RIGHT_KEYBOARD_HALF, keyId); - if (handleKey(code, scancodeIdx, report, rightKeyStates[keyId])) { + if (handleKey(code, scancodeIdx, report, prevRightKeyStates, rightKeyStates, keyId)) { scancodeIdx++; } } @@ -110,8 +127,11 @@ void fillKeyboardReport(usb_keyboard_report_t *report, const uint8_t *leftKeySta uhk_key_t code = getKeycode(layout, SLOT_ID_LEFT_KEYBOARD_HALF, keyId); - if (handleKey(code, scancodeIdx, report, leftKeyStates[keyId])) { + if (handleKey(code, scancodeIdx, report, prevLeftKeyStates, leftKeyStates, keyId)) { scancodeIdx++; } } + + memcpy (prevLeftKeyStates, leftKeyStates, KEY_STATE_COUNT); + memcpy (prevRightKeyStates, rightKeyStates, KEY_STATE_COUNT); } From 0b09fb00559c180c090b7681b5e0ba5fbcbf4ef5 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Mon, 12 Dec 2016 21:55:30 +0100 Subject: [PATCH 3/5] Remove some now obsolete defines Signed-off-by: Gergely Nagy --- right/src/keyboard_layout.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/right/src/keyboard_layout.h b/right/src/keyboard_layout.h index f2d469c..db53945 100644 --- a/right/src/keyboard_layout.h +++ b/right/src/keyboard_layout.h @@ -21,11 +21,6 @@ #define KEY_STATE_COUNT (5*7) -#define LAYOUT_KEY_COUNT 70 -#define LAYOUT_MOD_COUNT 4 - -#define LAYOUT_LEFT_OFFSET KEY_STATE_COUNT - typedef enum { UHK_KEY_SIMPLE, UHK_KEY_MOUSE, From 9f61c3227cd53dc128dc04ecd1456a1de739cc3f Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Mon, 12 Dec 2016 23:10:20 +0100 Subject: [PATCH 4/5] Changes based on the review notes This does a lot of things - all of this together, because it would have been much harder to split them up into many small commits. We get rid of the helper macros used in default_layout.c, drop the .raw member of uhk_key_t, use a singleton keymap, and prepare the prevKeyStates to handle all slots. Also drops the TRNS macro. With these changes, default_layout.h became obsolete, and was deleted too. Signed-off-by: Gergely Nagy --- right/src/default_layout.c | 205 +++++++++++++++++++++++++---- right/src/default_layout.h | 9 -- right/src/keyboard_layout.c | 29 ++-- right/src/keyboard_layout.h | 81 ++++++------ right/src/usb_interface_keyboard.c | 4 +- 5 files changed, 230 insertions(+), 98 deletions(-) delete mode 100644 right/src/default_layout.h diff --git a/right/src/default_layout.c b/right/src/default_layout.c index 0a53a15..ad6224b 100644 --- a/right/src/default_layout.c +++ b/right/src/default_layout.c @@ -1,30 +1,102 @@ -#include "default_layout.h" +#include "keyboard_layout.h" -#define S(k) {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_ ## k }} -#define L(l) {.type = UHK_KEY_LAYER, .layer = { .target = LAYER_ID_ ## l }} -#define TRNS {.type = UHK_KEY_TRANSPARENT} - -#define Key_NoKey { .raw = 0 } - -KEYBOARD_LAYOUT(defaultKeyboardLayout)= { +uhk_key_t CurrentKeymap[LAYER_COUNT][SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE] = { // Layer 0 { // Right { - S(7_AND_AMPERSAND), S(8_AND_ASTERISK), S(9_AND_OPENING_PARENTHESIS), S(0_AND_CLOSING_PARENTHESIS), S(MINUS_AND_UNDERSCORE), S(EQUAL_AND_PLUS), S(BACKSPACE), - S(U), S(I), S(O), S(P), S(OPENING_BRACKET_AND_OPENING_BRACE), S(CLOSING_BRACKET_AND_CLOSING_BRACE), S(BACKSLASH_AND_PIPE), S(Y), - S(J), S(K), S(L), S(SEMICOLON_AND_COLON), S(APOSTROPHE_AND_QUOTE), S(ENTER), S(H), - S(N), S(M), S(COMMA_AND_LESS_THAN_SIGN), S(DOT_AND_GREATER_THAN_SIGN), S(SLASH_AND_QUESTION_MARK), S(RIGHT_SHIFT), Key_NoKey, - S(SPACE), L(MOD), L(FN), S(RIGHT_ALT), S(RIGHT_GUI), S(RIGHT_CONTROL), + // Row 1 + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_7_AND_AMPERSAND }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_8_AND_ASTERISK }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_MINUS_AND_UNDERSCORE }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_EQUAL_AND_PLUS }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_BACKSPACE }}, + + // Row 2 + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_U }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_I }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_O }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_P }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_OPENING_BRACKET_AND_OPENING_BRACE }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_BACKSLASH_AND_PIPE }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_Y }}, + + // Row 3 + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_J }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_K }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_L }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_SEMICOLON_AND_COLON }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_ENTER }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_H }}, + + // Row 4 + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_N }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_M }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_COMMA_AND_LESS_THAN_SIGN }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_RIGHT_SHIFT }}, + { .type = UHK_KEY_NONE }, + + // Row 5 + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_SPACE }}, + { .type = UHK_KEY_LAYER, .layer = { .target = LAYER_ID_MOD }}, + { .type = UHK_KEY_LAYER, .layer = { .target = LAYER_ID_FN }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_RIGHT_ALT }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_RIGHT_GUI }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_RIGHT_CONTROL }}, }, // Left { - S(GRAVE_ACCENT_AND_TILDE), S(1_AND_EXCLAMATION), S(2_AND_AT), S(3_AND_HASHMARK), S(4_AND_DOLLAR), S(5_AND_PERCENTAGE), S(6_AND_CARET), - S(TAB), S(Q), S(W), S(E), S(R), Key_NoKey, S(T), - S(CAPS_LOCK), S(A), S(S), S(D), S(F), Key_NoKey, S(G), - S(LEFT_SHIFT), S(NON_US_BACKSLASH_AND_PIPE), S(Z), S(X), S(C), S(V), S(B), - S(LEFT_CONTROL), S(LEFT_GUI), S(LEFT_ALT), L(FN), S(SPACE), L(MOD), Key_NoKey, + // Row 1 + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_1_AND_EXCLAMATION }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_2_AND_AT }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_3_AND_HASHMARK }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_4_AND_DOLLAR }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_5_AND_PERCENTAGE }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_6_AND_CARET }}, + + // Row 2 + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_TAB }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_Q }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_W }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_E }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_R }}, + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_T }}, + + // Row 3 + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_CAPS_LOCK }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_A }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_S }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_D }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F }}, + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_G }}, + + // Row 4 + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_LEFT_SHIFT }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_NON_US_BACKSLASH_AND_PIPE }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_Z }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_X }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_C }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_V }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_B }}, + + // Row 5 + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_LEFT_CONTROL }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_LEFT_GUI }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_LEFT_ALT }}, + { .type = UHK_KEY_LAYER, .layer = { .target = LAYER_ID_FN }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_SPACE }}, + { .type = UHK_KEY_LAYER, .layer = { .target = LAYER_ID_MOD }}, + { .type = UHK_KEY_NONE }, } }, @@ -32,20 +104,97 @@ KEYBOARD_LAYOUT(defaultKeyboardLayout)= { { // Right { - S(F7), S(F8), S(F9), S(F10), S(F11), S(F12), S(DELETE), - Key_NoKey, S(UP_ARROW), Key_NoKey, S(PRINT_SCREEN), S(SCROLL_LOCK), S(PAUSE), Key_NoKey, S(PAGE_UP), - S(LEFT_ARROW), S(DOWN_ARROW), S(RIGHT_ARROW), Key_NoKey, Key_NoKey, Key_NoKey, S(PAGE_DOWN), - S(MEDIA_MUTE), Key_NoKey, Key_NoKey, Key_NoKey, Key_NoKey, Key_NoKey, Key_NoKey, - Key_NoKey, TRNS, Key_NoKey, Key_NoKey, Key_NoKey, + // Row 1 + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F7 }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F8 }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F9 }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F10 }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F11 }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F12 }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_DELETE }}, + + // Row 2 + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_UP_ARROW }}, + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_PRINT_SCREEN }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_SCROLL_LOCK }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_PAUSE }}, + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_PAGE_UP }}, + + // Row 3 + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_LEFT_ARROW }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_DOWN_ARROW }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_RIGHT_ARROW }}, + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_PAGE_DOWN }}, + + // Row 4 + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_MEDIA_MUTE }}, + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_NONE }, + + // Row 5 + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_LAYER, .layer = { .target = LAYER_ID_MOD }}, + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_NONE }, }, // Left { - S(ESCAPE), S(F1), S(F2), S(F3), S(F4), S(F5), S(F6), - Key_NoKey, Key_NoKey, S(UP_ARROW), Key_NoKey, Key_NoKey, Key_NoKey, S(HOME), - Key_NoKey, S(LEFT_ARROW), S(DOWN_ARROW), S(RIGHT_ARROW), S(DELETE), Key_NoKey, S(END), - Key_NoKey, Key_NoKey, S(MEDIA_BACKWARD), S(MEDIA_PLAY), S(MEDIA_FORWARD), S(MEDIA_VOLUME_DOWN), S(MEDIA_VOLUME_UP), - Key_NoKey, Key_NoKey, Key_NoKey, Key_NoKey, Key_NoKey, TRNS, Key_NoKey, + // Row 1 + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_ESCAPE }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F1 }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F2 }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F3 }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F4 }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F5 }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F6 }}, + + // Row 2 + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_UP_ARROW }}, + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_HOME }}, + + // Row 3 + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_LEFT_ARROW }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_DOWN_ARROW }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_RIGHT_ARROW }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_DELETE }}, + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_END }}, + + // Row 4 + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_MEDIA_BACKWARD }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_MEDIA_PLAY }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_MEDIA_FORWARD }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_MEDIA_VOLUME_DOWN }}, + { .type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_MEDIA_VOLUME_UP }}, + + // Row 5 + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_NONE }, + { .type = UHK_KEY_LAYER, .layer = { .target = LAYER_ID_MOD }}, + { .type = UHK_KEY_NONE }, } }, diff --git a/right/src/default_layout.h b/right/src/default_layout.h deleted file mode 100644 index 3b830ba..0000000 --- a/right/src/default_layout.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef SRC_DEFAULT_LAYOUT_H_ -#define SRC_DEFAULT_LAYOUT_H_ - -#include -#include "keyboard_layout.h" - -extern KEYBOARD_LAYOUT(defaultKeyboardLayout); - -#endif diff --git a/right/src/keyboard_layout.c b/right/src/keyboard_layout.c index 0f56a5e..eb028a0 100644 --- a/right/src/keyboard_layout.c +++ b/right/src/keyboard_layout.c @@ -4,27 +4,22 @@ static uint8_t keyMasks[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE]; static uint8_t modifierState = 0; -static uint8_t prevLeftKeyStates[KEY_STATE_COUNT]; -static uint8_t prevRightKeyStates[KEY_STATE_COUNT]; +uint8_t prevKeyStates[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE]; -static inline __attribute__((always_inline)) uhk_key_t getKeycode(KEYBOARD_LAYOUT(layout), uint8_t slotId, uint8_t keyId) +static inline __attribute__((always_inline)) uhk_key_t getKeycode(uint8_t slotId, uint8_t keyId) { if (keyId < MAX_KEY_COUNT_PER_MODULE) { if (keyMasks[slotId][keyId]!=0 && keyMasks[slotId][keyId]!=modifierState) { // Mask out key presses after releasing modifier keys - return (uhk_key_t){.raw=0}; + return (uhk_key_t){.type = UHK_KEY_NONE}; } - uhk_key_t k = layout[modifierState][slotId][keyId]; + uhk_key_t k = CurrentKeymap[modifierState][slotId][keyId]; keyMasks[slotId][keyId] = modifierState; - if (k.type == UHK_KEY_TRANSPARENT) { - k = layout[0][slotId][keyId]; - } - return k; } else { - return (uhk_key_t){.raw=0}; + return (uhk_key_t){.type = UHK_KEY_NONE}; } } @@ -103,7 +98,7 @@ bool handleKey(uhk_key_t key, int scancodeIdx, usb_keyboard_report_t *report, co return false; } -void fillKeyboardReport(usb_keyboard_report_t *report, const uint8_t *leftKeyStates, const uint8_t *rightKeyStates, KEYBOARD_LAYOUT(layout)) { +void fillKeyboardReport(usb_keyboard_report_t *report, const uint8_t *leftKeyStates, const uint8_t *rightKeyStates) { int scancodeIdx = 0; clearKeymasks(leftKeyStates, rightKeyStates); @@ -113,9 +108,9 @@ void fillKeyboardReport(usb_keyboard_report_t *report, const uint8_t *leftKeySta break; } - uhk_key_t code = getKeycode(layout, SLOT_ID_RIGHT_KEYBOARD_HALF, keyId); + uhk_key_t code = getKeycode(SLOT_ID_RIGHT_KEYBOARD_HALF, keyId); - if (handleKey(code, scancodeIdx, report, prevRightKeyStates, rightKeyStates, keyId)) { + if (handleKey(code, scancodeIdx, report, prevKeyStates[SLOT_ID_RIGHT_KEYBOARD_HALF], rightKeyStates, keyId)) { scancodeIdx++; } } @@ -125,13 +120,13 @@ void fillKeyboardReport(usb_keyboard_report_t *report, const uint8_t *leftKeySta break; } - uhk_key_t code = getKeycode(layout, SLOT_ID_LEFT_KEYBOARD_HALF, keyId); + uhk_key_t code = getKeycode(SLOT_ID_LEFT_KEYBOARD_HALF, keyId); - if (handleKey(code, scancodeIdx, report, prevLeftKeyStates, leftKeyStates, keyId)) { + if (handleKey(code, scancodeIdx, report, prevKeyStates[SLOT_ID_LEFT_KEYBOARD_HALF], leftKeyStates, keyId)) { scancodeIdx++; } } - memcpy (prevLeftKeyStates, leftKeyStates, KEY_STATE_COUNT); - memcpy (prevRightKeyStates, rightKeyStates, KEY_STATE_COUNT); + memcpy (prevKeyStates[SLOT_ID_RIGHT_KEYBOARD_HALF], rightKeyStates, KEY_STATE_COUNT); + memcpy (prevKeyStates[SLOT_ID_LEFT_KEYBOARD_HALF], leftKeyStates, KEY_STATE_COUNT); } diff --git a/right/src/keyboard_layout.h b/right/src/keyboard_layout.h index db53945..aa75939 100644 --- a/right/src/keyboard_layout.h +++ b/right/src/keyboard_layout.h @@ -22,6 +22,7 @@ #define KEY_STATE_COUNT (5*7) typedef enum { + UHK_KEY_NONE, UHK_KEY_SIMPLE, UHK_KEY_MOUSE, UHK_KEY_LAYER, @@ -30,53 +31,49 @@ typedef enum { UHK_KEY_MACRO, UHK_KEY_LPRESSMOD, UHK_KEY_LPRESSLAYER, - - UHK_KEY_TRANSPARENT = 0xff, } uhk_key_type_t; -typedef union { - struct { +typedef struct { uint8_t type; - union { - struct { - uint8_t __unused_bits; - uint8_t mods; - uint8_t key; - } __attribute__ ((packed)) simple; - struct { - uint8_t __unused_bits; - uint8_t scrollActions; // bitfield - uint8_t moveActions; // bitfield - } __attribute__ ((packed)) mouse; - struct { - uint16_t __unused_bits; - uint8_t target; - } __attribute__ ((packed)) layer; - struct { - uint16_t __unused_bits; - uint8_t target; - } __attribute__ ((packed)) keymap; - struct { - uint8_t __unused_bits; - uint16_t index; - } __attribute__ ((packed)) macro; - struct { - uint8_t longPressMod; // single mod, or bitfield? - uint8_t mods; // for the alternate action - uint8_t key; - } __attribute__ ((packed)) longpressMod; - struct { - uint8_t longPressLayer; - uint8_t mods; - uint8_t key; - } __attribute__ ((packed)) longpressLayer; - }; - } __attribute__ ((packed)); - uint32_t raw; + union { + struct { + uint8_t __unused_bits; + uint8_t mods; + uint8_t key; + } __attribute__ ((packed)) simple; + struct { + uint8_t __unused_bits; + uint8_t scrollActions; // bitfield + uint8_t moveActions; // bitfield + } __attribute__ ((packed)) mouse; + struct { + uint16_t __unused_bits; + uint8_t target; + } __attribute__ ((packed)) layer; + struct { + uint16_t __unused_bits; + uint8_t target; + } __attribute__ ((packed)) keymap; + struct { + uint8_t __unused_bits; + uint16_t index; + } __attribute__ ((packed)) macro; + struct { + uint8_t longPressMod; // single mod, or bitfield? + uint8_t mods; // for the alternate action + uint8_t key; + } __attribute__ ((packed)) longpressMod; + struct { + uint8_t longPressLayer; + uint8_t mods; + uint8_t key; + } __attribute__ ((packed)) longpressLayer; + }; } __attribute__ ((packed)) uhk_key_t; -#define KEYBOARD_LAYOUT(name) uhk_key_t name[LAYER_COUNT][SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE] +extern uint8_t prevKeyStates[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE]; +extern uhk_key_t CurrentKeymap[LAYER_COUNT][SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE]; -void fillKeyboardReport(usb_keyboard_report_t *report, const uint8_t *leftKeyStates, const uint8_t *rightKeyStates, KEYBOARD_LAYOUT(layout)); +void fillKeyboardReport(usb_keyboard_report_t *report, const uint8_t *leftKeyStates, const uint8_t *rightKeyStates); #endif diff --git a/right/src/usb_interface_keyboard.c b/right/src/usb_interface_keyboard.c index 96bd006..efe3008 100644 --- a/right/src/usb_interface_keyboard.c +++ b/right/src/usb_interface_keyboard.c @@ -6,7 +6,7 @@ #include "fsl_i2c.h" #include "i2c.h" #include "i2c_addresses.h" -#include "default_layout.h" +#include "keyboard_layout.h" static usb_device_endpoint_struct_t UsbKeyboardEndpoints[USB_KEYBOARD_ENDPOINT_COUNT] = {{ USB_KEYBOARD_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT), @@ -100,7 +100,7 @@ void UsbKeyboadTask(){ readLeftKeys(leftKeyStates); - fillKeyboardReport(&UsbKeyboardReport[newLayout], leftKeyStates, keyMatrix.keyStates, defaultKeyboardLayout); + fillKeyboardReport(&UsbKeyboardReport[newLayout], leftKeyStates, keyMatrix.keyStates); // Change to the new layout in atomic operation (int copy). Even if // the copy is not atomic itself, only single bit changes. So it can From 690addefd919c43169c49a726f404743f3f39f8a Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Tue, 13 Dec 2016 12:52:03 +0100 Subject: [PATCH 5/5] Coding style fixes Don't put a space between the function and the opening parens. Signed-off-by: Gergely Nagy --- right/src/keyboard_layout.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/right/src/keyboard_layout.c b/right/src/keyboard_layout.c index eb028a0..caf05f6 100644 --- a/right/src/keyboard_layout.c +++ b/right/src/keyboard_layout.c @@ -65,31 +65,31 @@ bool layerOff(uhk_key_t key) { return false; } -bool key_toggled_on (const uint8_t *prevKeyStates, const uint8_t *currKeyStates, uint8_t keyId) { +bool key_toggled_on(const uint8_t *prevKeyStates, const uint8_t *currKeyStates, uint8_t keyId) { return (!prevKeyStates[keyId]) && currKeyStates[keyId]; } -bool key_is_pressed (const uint8_t *prevKeyStates, const uint8_t *currKeyStates, uint8_t keyId) { +bool key_is_pressed(const uint8_t *prevKeyStates, const uint8_t *currKeyStates, uint8_t keyId) { return currKeyStates[keyId]; } -bool key_toggled_off (const uint8_t *prevKeyStates, const uint8_t *currKeyStates, uint8_t keyId) { +bool key_toggled_off(const uint8_t *prevKeyStates, const uint8_t *currKeyStates, uint8_t keyId) { return (!currKeyStates[keyId]) && prevKeyStates[keyId]; } bool handleKey(uhk_key_t key, int scancodeIdx, usb_keyboard_report_t *report, const uint8_t *prevKeyStates, const uint8_t *currKeyStates, uint8_t keyId) { switch (key.type) { case UHK_KEY_SIMPLE: - if (key_is_pressed (prevKeyStates, currKeyStates, keyId)) { - return pressKey (key, scancodeIdx, report); + if (key_is_pressed(prevKeyStates, currKeyStates, keyId)) { + return pressKey(key, scancodeIdx, report); } break; case UHK_KEY_LAYER: - if (key_toggled_on (prevKeyStates, currKeyStates, keyId)) { - return layerOn (key); + if (key_toggled_on(prevKeyStates, currKeyStates, keyId)) { + return layerOn(key); } - if (key_toggled_off (prevKeyStates, currKeyStates, keyId)) { - return layerOff (key); + if (key_toggled_off(prevKeyStates, currKeyStates, keyId)) { + return layerOff(key); } break; default: @@ -127,6 +127,6 @@ void fillKeyboardReport(usb_keyboard_report_t *report, const uint8_t *leftKeySta } } - memcpy (prevKeyStates[SLOT_ID_RIGHT_KEYBOARD_HALF], rightKeyStates, KEY_STATE_COUNT); - memcpy (prevKeyStates[SLOT_ID_LEFT_KEYBOARD_HALF], leftKeyStates, KEY_STATE_COUNT); + memcpy(prevKeyStates[SLOT_ID_RIGHT_KEYBOARD_HALF], rightKeyStates, KEY_STATE_COUNT); + memcpy(prevKeyStates[SLOT_ID_LEFT_KEYBOARD_HALF], leftKeyStates, KEY_STATE_COUNT); }