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 <algernon@madhouse-project.org>
This commit is contained in:
Gergely Nagy
2016-12-12 20:10:42 +01:00
parent 1f8fc560e4
commit 6aedaf7074
3 changed files with 68 additions and 89 deletions

View File

@@ -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} //??
};

View File

@@ -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<KEY_STATE_COUNT; i++){
for (i=0; i < MAX_KEY_COUNT_PER_MODULE; i++){
if (rightKeyStates[i]==0){
keyMasks[i] = 0;
keyMasks[SLOT_ID_RIGHT_KEYBOARD_HALF][i] = 0;
}
if (leftKeyStates[i]==0) {
keyMasks[LAYOUT_LEFT_OFFSET+i] = 0;
keyMasks[SLOT_ID_LEFT_KEYBOARD_HALF][i] = 0;
}
}
}
@@ -96,7 +96,7 @@ void fillKeyboardReport(usb_keyboard_report_t *report, const uint8_t *leftKeySta
break;
}
uhk_key_t code = getKeycode(layout, keyId);
uhk_key_t code = getKeycode(layout, SLOT_ID_RIGHT_KEYBOARD_HALF, keyId);
if (handleKey(code, scancodeIdx, report, rightKeyStates[keyId])) {
scancodeIdx++;
@@ -108,7 +108,7 @@ void fillKeyboardReport(usb_keyboard_report_t *report, const uint8_t *leftKeySta
break;
}
uhk_key_t code = getKeycode(layout, LAYOUT_LEFT_OFFSET+keyId);
uhk_key_t code = getKeycode(layout, SLOT_ID_LEFT_KEYBOARD_HALF, keyId);
if (handleKey(code, scancodeIdx, report, leftKeyStates[keyId])) {
scancodeIdx++;

View File

@@ -5,6 +5,8 @@
#include "lufa/HIDClassCommon.h"
#include "usb_composite_device.h"
#include "module.h"
// Keyboard layout is a 2D array of scan codes.
//
// First dimension is the Key ID of a given key. Key IDs are the indices of the
@@ -33,6 +35,8 @@ typedef enum {
UHK_KEY_MACRO,
UHK_KEY_LPRESSMOD,
UHK_KEY_LPRESSLAYER,
UHK_KEY_TRANSPARENT = 0xff,
} uhk_key_type_t;
typedef union {
@@ -76,11 +80,7 @@ typedef union {
uint32_t raw;
} __attribute__ ((packed)) uhk_key_t;
#define Key_NoKey {.raw = 0}
#define KEYBOARD_LAYOUT(name) const uhk_key_t name[LAYOUT_KEY_COUNT][LAYOUT_MOD_COUNT]
#define LAYER_MOD 1
#define LAYER_FN 2
#define KEYBOARD_LAYOUT(name) uhk_key_t name[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));