Merge pull request #14 from algernon/f/key-handling-rework

Rework the keyboard layout handling
This commit is contained in:
László Monda
2016-12-11 19:56:35 +01:00
committed by GitHub
3 changed files with 191 additions and 108 deletions

View File

@@ -1,77 +1,77 @@
#include "default_layout.h" #include "default_layout.h"
KEYBOARD_LAYOUT(defaultKeyboardLayout)={ KEYBOARD_LAYOUT(defaultKeyboardLayout)={
{HID_KEYBOARD_SC_7_AND_AMPERSAND, HID_KEYBOARD_SC_F7}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_7_AND_AMPERSAND } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F7 } }},
{HID_KEYBOARD_SC_8_AND_ASTERISK, HID_KEYBOARD_SC_F8}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_8_AND_ASTERISK } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F8 } }},
{HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS, HID_KEYBOARD_SC_F9}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F9 } }},
{HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS, HID_KEYBOARD_SC_F10}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F10 } }},
{HID_KEYBOARD_SC_MINUS_AND_UNDERSCORE, HID_KEYBOARD_SC_F11}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_MINUS_AND_UNDERSCORE } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F11 } }},
{HID_KEYBOARD_SC_EQUAL_AND_PLUS, HID_KEYBOARD_SC_F12}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_EQUAL_AND_PLUS } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F12 } }},
{HID_KEYBOARD_SC_BACKSPACE, HID_KEYBOARD_SC_DELETE}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_BACKSPACE } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_DELETE } }},
{HID_KEYBOARD_SC_U}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_U } }},
{HID_KEYBOARD_SC_I, HID_KEYBOARD_SC_UP_ARROW}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_I } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_UP_ARROW } }},
{HID_KEYBOARD_SC_O}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_O } }},
{HID_KEYBOARD_SC_P, HID_KEYBOARD_SC_PRINT_SCREEN}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_P } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_PRINT_SCREEN } }},
{HID_KEYBOARD_SC_OPENING_BRACKET_AND_OPENING_BRACE, HID_KEYBOARD_SC_SCROLL_LOCK}, {{.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 } }},
{HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE, HID_KEYBOARD_SC_PAUSE}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_PAUSE } }},
{HID_KEYBOARD_SC_BACKSLASH_AND_PIPE}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_BACKSLASH_AND_PIPE } }},
{HID_KEYBOARD_SC_Y, HID_KEYBOARD_SC_PAGE_UP}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_Y } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_PAGE_UP } }},
{HID_KEYBOARD_SC_J, HID_KEYBOARD_SC_LEFT_ARROW}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_J } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_LEFT_ARROW } }},
{HID_KEYBOARD_SC_K, HID_KEYBOARD_SC_DOWN_ARROW}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_K } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_DOWN_ARROW } }},
{HID_KEYBOARD_SC_L, HID_KEYBOARD_SC_RIGHT_ARROW}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_L } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_RIGHT_ARROW } }},
{HID_KEYBOARD_SC_SEMICOLON_AND_COLON}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_SEMICOLON_AND_COLON } }},
{HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE } }},
{HID_KEYBOARD_SC_ENTER}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_ENTER } }},
{HID_KEYBOARD_SC_H, HID_KEYBOARD_SC_PAGE_DOWN}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_H } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_PAGE_DOWN } }},
{HID_KEYBOARD_SC_N, HID_KEYBOARD_SC_MEDIA_MUTE}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_N } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_MEDIA_MUTE } }},
{HID_KEYBOARD_SC_M}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_M } }},
{HID_KEYBOARD_SC_COMMA_AND_LESS_THAN_SIGN}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_COMMA_AND_LESS_THAN_SIGN } }},
{HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN } }},
{HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK } }},
{HID_KEYBOARD_SC_RIGHT_SHIFT}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_RIGHT_SHIFT } }},
{0}, //?? {Key_NoKey}, //??
{HID_KEYBOARD_SC_SPACE}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_SPACE } }},
{0}, //?? {Key_NoKey}, //??
{0}, //Fn {{.type = UHK_KEY_LAYER, .layer = { .target = LAYER_FN }}}, //Fn
{HID_KEYBOARD_SC_RIGHT_ALT}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_RIGHT_ALT } }},
{HID_KEYBOARD_SC_RIGHT_GUI}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_RIGHT_GUI } }},
{HID_KEYBOARD_SC_RIGHT_CONTROL}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_RIGHT_CONTROL } }},
//Left half //Left half
{HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE, HID_KEYBOARD_SC_ESCAPE}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_ESCAPE } }},
{HID_KEYBOARD_SC_1_AND_EXCLAMATION, HID_KEYBOARD_SC_F1}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_1_AND_EXCLAMATION } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F1 } }},
{HID_KEYBOARD_SC_2_AND_AT, HID_KEYBOARD_SC_F2}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_2_AND_AT } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F2 } }},
{HID_KEYBOARD_SC_3_AND_HASHMARK, HID_KEYBOARD_SC_F3}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_3_AND_HASHMARK } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F3 } }},
{HID_KEYBOARD_SC_4_AND_DOLLAR, HID_KEYBOARD_SC_F4}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_4_AND_DOLLAR } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F4 } }},
{HID_KEYBOARD_SC_5_AND_PERCENTAGE, HID_KEYBOARD_SC_F5}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_5_AND_PERCENTAGE } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F5 } }},
{HID_KEYBOARD_SC_6_AND_CARET, HID_KEYBOARD_SC_F6}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_6_AND_CARET } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F6 } }},
{HID_KEYBOARD_SC_TAB}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_TAB } }},
{HID_KEYBOARD_SC_Q}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_Q } }},
{HID_KEYBOARD_SC_W, HID_KEYBOARD_SC_UP_ARROW}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_W } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_UP_ARROW } }},
{HID_KEYBOARD_SC_E}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_E } }},
{HID_KEYBOARD_SC_R}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_R } }},
{0}, //?? {Key_NoKey}, //??
{HID_KEYBOARD_SC_T, HID_KEYBOARD_SC_HOME}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_T } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_HOME } }},
{HID_KEYBOARD_SC_CAPS_LOCK}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_CAPS_LOCK } }},
{HID_KEYBOARD_SC_A, HID_KEYBOARD_SC_LEFT_ARROW}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_A } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_LEFT_ARROW } }},
{HID_KEYBOARD_SC_S, HID_KEYBOARD_SC_DOWN_ARROW}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_S } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_DOWN_ARROW } }},
{HID_KEYBOARD_SC_D, HID_KEYBOARD_SC_RIGHT_ARROW}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_D } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_RIGHT_ARROW } }},
{HID_KEYBOARD_SC_F, HID_KEYBOARD_SC_DELETE}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_F } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_DELETE } }},
{0}, //?? {Key_NoKey}, //??
{HID_KEYBOARD_SC_G, HID_KEYBOARD_SC_END}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_G } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_END } }},
{HID_KEYBOARD_SC_LEFT_SHIFT}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_LEFT_SHIFT } }},
{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_NON_US_BACKSLASH_AND_PIPE } }}, //no idea if this is the right one},
{HID_KEYBOARD_SC_Z, HID_KEYBOARD_SC_MEDIA_BACKWARD}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_Z } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_MEDIA_BACKWARD } }},
{HID_KEYBOARD_SC_X, HID_KEYBOARD_SC_MEDIA_PLAY}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_X } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_MEDIA_PLAY } }},
{HID_KEYBOARD_SC_C, HID_KEYBOARD_SC_MEDIA_FORWARD}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_C } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_MEDIA_FORWARD } }},
{HID_KEYBOARD_SC_V, HID_KEYBOARD_SC_MEDIA_VOLUME_DOWN}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_V } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_MEDIA_VOLUME_DOWN } }},
{HID_KEYBOARD_SC_B, HID_KEYBOARD_SC_MEDIA_VOLUME_UP}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_B } }, {.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_MEDIA_VOLUME_UP } }},
{HID_KEYBOARD_SC_LEFT_CONTROL}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_LEFT_CONTROL } }},
{HID_KEYBOARD_SC_LEFT_GUI}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_LEFT_GUI } }},
{HID_KEYBOARD_SC_LEFT_ALT}, {{.type = UHK_KEY_SIMPLE, .simple = { .key = HID_KEYBOARD_SC_LEFT_ALT } }},
{0}, //Fn {{.type = UHK_KEY_LAYER, .layer = { .target = LAYER_FN }}}, //Fn
{0}, //?? {Key_NoKey}, //??
{0}, //Mod {{.type = UHK_KEY_LAYER, .layer = { .target = LAYER_MOD }}}, //Mod
{0} //?? {Key_NoKey} //??
}; };

View File

@@ -1,41 +1,31 @@
#include "keyboard_layout.h" #include "keyboard_layout.h"
#include "led_driver.h"
static uint8_t keyMasks[LAYOUT_KEY_COUNT]; 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 (keyId<LAYOUT_KEY_COUNT) { if (keyId<LAYOUT_KEY_COUNT) {
if (keyMasks[keyId]!=0 && keyMasks[keyId]!=modifierState){ if (keyMasks[keyId]!=0 && keyMasks[keyId]!=modifierState){
//Mask out key presses after releasing modifier keys //Mask out key presses after releasing modifier keys
return 0; return (uhk_key_t) { .raw = 0 };
} }
uint8_t k = layout[keyId][modifierState]; uhk_key_t k = layout[keyId][modifierState];
keyMasks[keyId] = modifierState; keyMasks[keyId] = modifierState;
if (k==0) { if (k.raw==0) {
k = layout[keyId][0]; k = layout[keyId][0];
} }
return k; return k;
} else { } else {
return 0; return (uhk_key_t) { .raw = 0 };
} }
} }
static uint8_t getModifierState(const uint8_t *leftKeyStates, const uint8_t *rightKeyStates){
uint8_t mod = 0;
if (leftKeyStates[KEYID_LEFT_MOD]) {
mod |= MODIFIER_MOD_PRESSED;
}
if (leftKeyStates[KEYID_LEFT_FN] | rightKeyStates[KEYID_RIGHT_FN]) {
mod |= MODIFIER_FN_PRESSED;
}
return mod;
}
static void clearKeymasks(const uint8_t *leftKeyStates, const uint8_t *rightKeyStates){ static void clearKeymasks(const uint8_t *leftKeyStates, const uint8_t *rightKeyStates){
int i; int i;
for (i=0; i<KEY_STATE_COUNT; ++i){ for (i=0; i<KEY_STATE_COUNT; ++i){
@@ -49,23 +39,68 @@ static void clearKeymasks(const uint8_t *leftKeyStates, const uint8_t *rightKeyS
} }
} }
void fillKeyboardReport(usb_keyboard_report_t *report, const uint8_t *leftKeyStates, const uint8_t *rightKeyStates, KEYBOARD_LAYOUT(layout)){ static uint8_t LEDVal = 0;
static int8_t LEDstep = 10;
bool pressKey(uhk_key_t key, int scancodeIdx, usb_keyboard_report_t *report) {
if (key.type != UHK_KEY_SIMPLE)
return false;
if (!key.simple.key)
return false;
for (uint8_t i = 0; i < 8; i++) {
if (key.simple.mods & (1 << i) ||
key.simple.key == HID_KEYBOARD_SC_LEFT_CONTROL + i) {
report->modifiers |= (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; int scancodeIdx = 0;
clearKeymasks(leftKeyStates, rightKeyStates); clearKeymasks(leftKeyStates, rightKeyStates);
uint8_t modifierState=getModifierState(leftKeyStates, rightKeyStates);
for (uint8_t keyId=0; keyId<KEY_STATE_COUNT; keyId++) { for (uint8_t keyId=0; keyId<KEY_STATE_COUNT; keyId++) {
if (scancodeIdx>=USB_KEYBOARD_MAX_KEYS) { if (scancodeIdx>=USB_KEYBOARD_MAX_KEYS) {
break; break;
} }
if (rightKeyStates[keyId]) { uhk_key_t code=getKeycode(layout, keyId);
uint8_t code=getKeycode(layout, keyId, modifierState);
if (code) { if (handleKey(code, scancodeIdx, report, rightKeyStates[keyId])) {
report->scancodes[scancodeIdx++] = code; scancodeIdx++;
} }
}
} }
for (uint8_t keyId=0; keyId<KEY_STATE_COUNT; keyId++) { for (uint8_t keyId=0; keyId<KEY_STATE_COUNT; keyId++) {
@@ -73,11 +108,10 @@ void fillKeyboardReport(usb_keyboard_report_t *report, const uint8_t *leftKeySta
break; break;
} }
if (leftKeyStates[keyId]) { uhk_key_t code=getKeycode(layout, LAYOUT_LEFT_OFFSET+keyId);
uint8_t code=getKeycode(layout, LAYOUT_LEFT_OFFSET+keyId, modifierState);
if (code) { if (handleKey(code, scancodeIdx, report, leftKeyStates[keyId])) {
report->scancodes[scancodeIdx++] = code; scancodeIdx++;
} }
}
} }
} }

View File

@@ -27,14 +27,63 @@
#define LAYOUT_LEFT_OFFSET KEY_STATE_COUNT #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 typedef union {
#define KEYID_LEFT_FN 31 struct {
#define KEYID_RIGHT_FN 31 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 Key_NoKey {.raw = 0}
#define MODIFIER_FN_PRESSED 2 #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)); void fillKeyboardReport(usb_keyboard_report_t *report, const uint8_t *leftKeyStates, const uint8_t *rightKeyStates, KEYBOARD_LAYOUT(layout));