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