diff --git a/left/build/kds/.settings/language.settings.xml b/left/build/kds/.settings/language.settings.xml index 8a3e35d..2fd83ce 100644 --- a/left/build/kds/.settings/language.settings.xml +++ b/left/build/kds/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/left/src/main.c b/left/src/main.c index 7117ed8..51d23e6 100644 --- a/left/src/main.c +++ b/left/src/main.c @@ -78,5 +78,6 @@ int main(void) KeyMatrix_Init(&keyMatrix); while (1) { KeyMatrix_Scan(&keyMatrix); + asm("wfi"); } } diff --git a/right/build/kds/.gitignore b/right/build/kds/.gitignore new file mode 100644 index 0000000..530774c --- /dev/null +++ b/right/build/kds/.gitignore @@ -0,0 +1 @@ +/debug diff --git a/right/build/kds/.settings/language.settings.xml b/right/build/kds/.settings/language.settings.xml index dbd3995..4bdb3e2 100644 --- a/right/build/kds/.settings/language.settings.xml +++ b/right/build/kds/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/right/build/kds/uhk-right release jlink.launch b/right/build/kds/uhk-right release jlink.launch index 82c79b5..d223d70 100644 --- a/right/build/kds/uhk-right release jlink.launch +++ b/right/build/kds/uhk-right release jlink.launch @@ -70,7 +70,7 @@ - + diff --git a/right/src/default_layout.c b/right/src/default_layout.c new file mode 100644 index 0000000..b065827 --- /dev/null +++ b/right/src/default_layout.c @@ -0,0 +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}, + + //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} //?? +}; + diff --git a/right/src/default_layout.h b/right/src/default_layout.h new file mode 100644 index 0000000..3b830ba --- /dev/null +++ b/right/src/default_layout.h @@ -0,0 +1,9 @@ +#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.h b/right/src/keyboard_layout.h new file mode 100644 index 0000000..881ac0e --- /dev/null +++ b/right/src/keyboard_layout.h @@ -0,0 +1,65 @@ +#ifndef KEYBOARD_LAYOUT_H_ +#define KEYBOARD_LAYOUT_H_ + +#include +#include "lufa/HIDClassCommon.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 + * of the active keys of the key_matrix_t structure. In case of left half, an + * offset of 35 is added. + * + * For each Key ID, there are 4 different possible scan codes: + * - default, when no modifiers are pressed + * - mod layer + * - fn layer + * - mod+fn layer + * + */ + +#define KEY_STATE_COUNT (5*7) + +#define LAYOUT_KEY_COUNT 70 +#define LAYOUT_MOD_COUNT 4 + +#define LAYOUT_LEFT_OFFSET KEY_STATE_COUNT + +#define KEYBOARD_LAYOUT(name) const uint8_t name[LAYOUT_KEY_COUNT][LAYOUT_MOD_COUNT] + +#define KEYID_LEFT_MOD 33 +#define KEYID_LEFT_FN 31 +#define KEYID_RIGHT_FN 31 + +#define MODIFIER_MOD_PRESSED 1 +#define MODIFIER_FN_PRESSED 2 + + +static inline __attribute__((always_inline)) uint8_t getKeycode(KEYBOARD_LAYOUT(layout), uint8_t keyId, uint8_t modifierState) +{ + if (keyId=USB_KEYBOARD_MAX_KEYS) { + break; + } + + if (keyMatrix.keyStates[keyId]) { + uint8_t code=getKeycode(defaultKeyboardLayout, keyId, modifierState); + if (code) { + UsbKeyboardReport[newLayout].scancodes[scancodeIdx++] = code; + } + } + } + + for (uint8_t keyId=0; keyId=USB_KEYBOARD_MAX_KEYS) { + break; + } + + if (leftKeyStates[keyId]) { + uint8_t code=getKeycode(defaultKeyboardLayout, LAYOUT_LEFT_OFFSET+keyId, modifierState); + if (code) { + UsbKeyboardReport[newLayout].scancodes[scancodeIdx++] = code; + } + } + } + + //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 + //never be a problem + activeLayout = newLayout; +} + static usb_status_t UsbKeyboardAction(void) { - UsbKeyboardReport.modifiers = 0; - UsbKeyboardReport.reserved = 0; - - KeyMatrix_Init(&keyMatrix); - KeyMatrix_Scan(&keyMatrix); - - uint8_t scancodeIdx; - for (uint8_t scancodeIdx=0; scancodeIdx