From e758e088a743e672cd6bb110a68b6755dda28b76 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Sun, 11 Dec 2016 19:13:19 +0100 Subject: [PATCH] Rework the keyboard layout handling We now use a 32-bit structure to describe each key, and an `uhk_key_t` type that wraps all the supported things into a union. But this is not the only change: to be able to move the Fn/Mod keys anywhere, instead of hardcoding their location, they are now proper layer keys. To make it easier to handle turning a layer off, key releases can be handled explicitly, too. Signed-off-by: Gergely Nagy --- right/src/default_layout.c | 140 ++++++++++++++++++------------------ right/src/keyboard_layout.c | 98 ++++++++++++++++--------- right/src/keyboard_layout.h | 61 ++++++++++++++-- 3 files changed, 191 insertions(+), 108 deletions(-) diff --git a/right/src/default_layout.c b/right/src/default_layout.c index b065827..38e6ac1 100644 --- a/right/src/default_layout.c +++ b/right/src/default_layout.c @@ -1,77 +1,77 @@ #include "default_layout.h" KEYBOARD_LAYOUT(defaultKeyboardLayout)={ - {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}, + {{.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 } }}, //Left half - {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 - {0} //?? + {{.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 6f5f5ee..d713219 100644 --- a/right/src/keyboard_layout.c +++ b/right/src/keyboard_layout.c @@ -1,41 +1,31 @@ #include "keyboard_layout.h" +#include "led_driver.h" static uint8_t keyMasks[LAYOUT_KEY_COUNT]; -static inline __attribute__((always_inline)) uint8_t getKeycode(KEYBOARD_LAYOUT(layout), uint8_t keyId, uint8_t modifierState) +static uint8_t modifierState = 0; + +static inline __attribute__((always_inline)) uhk_key_t getKeycode(KEYBOARD_LAYOUT(layout), uint8_t keyId) { if (keyIdmodifiers |= (1 << i); + } + } + report->scancodes[scancodeIdx] = key.simple.key; + return true; +} + +bool layerOn(uhk_key_t key) { + modifierState |= (1 << (key.layer.target - 1)); + return false; +} + +bool layerOff(uhk_key_t key) { + modifierState &= ~(1 << (key.layer.target - 1)); + return false; +} + +bool handleKey(uhk_key_t key, int scancodeIdx, usb_keyboard_report_t *report, uint8_t keyState) { + switch (key.type) { + case UHK_KEY_SIMPLE: + if (keyState) + return pressKey (key, scancodeIdx, report); + break; + case UHK_KEY_LAYER: + if (keyState) + return layerOn (key); + return layerOff (key); + break; + default: + break; + } + return false; +} + +void fillKeyboardReport(usb_keyboard_report_t *report, const uint8_t *leftKeyStates, const uint8_t *rightKeyStates, KEYBOARD_LAYOUT(layout)) { int scancodeIdx = 0; clearKeymasks(leftKeyStates, rightKeyStates); - uint8_t modifierState=getModifierState(leftKeyStates, rightKeyStates); for (uint8_t keyId=0; keyId=USB_KEYBOARD_MAX_KEYS) { break; } - if (rightKeyStates[keyId]) { - uint8_t code=getKeycode(layout, keyId, modifierState); - if (code) { - report->scancodes[scancodeIdx++] = code; - } - } + uhk_key_t code=getKeycode(layout, keyId); + + if (handleKey(code, scancodeIdx, report, rightKeyStates[keyId])) { + scancodeIdx++; + } } for (uint8_t keyId=0; keyIdscancodes[scancodeIdx++] = code; - } - } + uhk_key_t code=getKeycode(layout, LAYOUT_LEFT_OFFSET+keyId); + + if (handleKey(code, scancodeIdx, report, leftKeyStates[keyId])) { + scancodeIdx++; + } } } diff --git a/right/src/keyboard_layout.h b/right/src/keyboard_layout.h index 91a2ffe..ab28daf 100644 --- a/right/src/keyboard_layout.h +++ b/right/src/keyboard_layout.h @@ -27,14 +27,63 @@ #define LAYOUT_LEFT_OFFSET KEY_STATE_COUNT -#define KEYBOARD_LAYOUT(name) const uint8_t name[LAYOUT_KEY_COUNT][LAYOUT_MOD_COUNT] +typedef enum { + UHK_KEY_SIMPLE, + UHK_KEY_MOUSE, + UHK_KEY_LAYER, + UHK_KEY_LAYER_TOGGLE, + UHK_KEY_KEYMAP, + UHK_KEY_MACRO, + UHK_KEY_LPRESSMOD, + UHK_KEY_LPRESSLAYER, +} uhk_key_type_t; -#define KEYID_LEFT_MOD 33 -#define KEYID_LEFT_FN 31 -#define KEYID_RIGHT_FN 31 +typedef union { + 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; +} __attribute__ ((packed)) uhk_key_t; -#define MODIFIER_MOD_PRESSED 1 -#define MODIFIER_FN_PRESSED 2 +#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 void fillKeyboardReport(usb_keyboard_report_t *report, const uint8_t *leftKeyStates, const uint8_t *rightKeyStates, KEYBOARD_LAYOUT(layout));