]> git.friedersdorff.com Git - max/tmk_keyboard.git/commitdiff
simple keymap layers.
authortmk <nobody@nowhere>
Thu, 16 Sep 2010 12:05:15 +0000 (21:05 +0900)
committertmk <nobody@nowhere>
Thu, 16 Sep 2010 12:05:15 +0000 (21:05 +0900)
README
keymap.c
keymap.h
mykey.c
usbkeycodes.h

diff --git a/README b/README
index 4b10d663ea95debb9c5e08bbaece58a2eef855d0..15eb28ff0db8126a573477fcccddffc262f15bcf 100644 (file)
--- a/README
+++ b/README
@@ -15,14 +15,18 @@ TODO
 modulization
     clean source
 debouncing
+    will be coded when bouncing occurs.
+    bouncing doesnt occur on my alps switch so far.
+    scan rate is too slow?(to be measure)
 anti-ghost
+    2010/09/13 done
 sleep&wakeup
 boot keyboard support
 mouse key
 keymap layer
+    2010/09/16 simple layer(HHKB/vi cursor)
     key combination switch
     toggle siwtch
-    HHKB like cursor etc.
 setting menu(wizard)
     debug console
     keymap setting
index 3b3b9363ec580f3bcec61ef938590997885d4104..6fca9a003a4e3574117129994063fbf7fe85b1f5 100644 (file)
--- a/keymap.c
+++ b/keymap.c
@@ -2,26 +2,82 @@
  * keymap for modified macway keyboarq
  */
 #include <avr/pgmspace.h>
+#include "matrix.h"
 #include "keymap.h"
 
-static const uint8_t PROGMEM Keymap[MATRIX_ROWS][MATRIX_COLS] = {
-    { KB_LALT, KB_NO,     KB_BSPACE,   KB_NO, KB_LEFT,   KB_NO,     KB_ENTER, KB_SPACE },
-    { KB_1,    KB_ESCAPE, KB_TAB,      KB_Q,  KB_A,      KB_LCTRL,  KB_Z,     KB_RIGHT },
-    { KB_2,    KB_RALT,   KB_LGUI,     KB_W,  KB_S,      KB_NO,     KB_X,     KB_UP },
-    { KB_3,    KB_NO,     KB_RSHIFT,   KB_E,  KB_D,      KB_BSLASH, KB_C,     KB_DOWN },
-    { KB_4,    KB_5,      KB_T,        KB_R,  KB_F,      KB_G,      KB_V,     KB_B },
-    { KB_7,    KB_6,      KB_Y,        KB_U,  KB_J,      KB_H,      KB_M,     KB_N },
-    { KB_8,    KB_EQUAL,  KB_RBRACKET, KB_I,  KB_K,      KB_NO,     KB_COMMA, KB_LSHIFT },
-    { KB_9,    KB_NO,     KB_NO,       KB_O,  KB_L,      KB_GRAVE,  KB_DOT,   KB_NO },
-    { KB_0,    KB_MINUS,  KB_LBRACKET, KB_P,  KB_SCOLON, KB_QUOTE,  KB_NO,    KB_SLASH }
+int current_layer = 1;
+
+static const uint8_t PROGMEM Keymap[][MATRIX_ROWS][MATRIX_COLS] = {
+    // 0: default
+    {
+        { KB_LALT, KB_NO,     KB_BSPACE,  KB_NO, KB_LEFT,   KB_NO,      KB_ENTER, KB_SPACE },
+        { KB_1,    KB_ESCAPE, KB_TAB,     KB_Q,  KB_A,      KB_LCTRL,   KB_Z,     KB_RIGHT },
+        { KB_2,    FN_0,      KB_LGUI,    KB_W,  KB_S,      KB_NO,      KB_X,     KB_UP },
+        { KB_3,    KB_NO,     KB_RSHIFT,  KB_E,  KB_D,      FN_1,       KB_C,     KB_DOWN },
+        { KB_4,    KB_5,      KB_T,       KB_R,  KB_F,      KB_G,       KB_V,     KB_B },
+        { KB_7,    KB_6,      KB_Y,       KB_U,  KB_J,      KB_H,       KB_M,     KB_N },
+        { KB_8,    KB_EQUAL,  KB_RBRACKET,KB_I,  KB_K,      KB_NO,      KB_COMMA, KB_LSHIFT },
+        { KB_9,    KB_NO,     KB_NO,      KB_O,  KB_L,      FN_2,       KB_DOT,   KB_NO },
+        { KB_0,    KB_MINUS,  KB_LBRACKET,KB_P,  KB_SCOLON, KB_QUOTE,   KB_NO,    KB_SLASH }
+    },
+    // 1: FN_0
+    {
+        { KB_LALT, KB_NO,     KB_DELETE,  KB_NO, KB_NO,     KB_NO,      KB_BSLASH,KB_NO },
+        { KB_F1,   KB_GRAVE,  KB_BSLASH,  KB_NO, KB_NO,     KB_LCTRL,   KB_NO,    KB_NO },
+        { KB_F2,   KB_NO,     KB_LGUI,    KB_NO, KB_NO,     KB_NO,      KB_NO,    KB_NO },
+        { KB_F3,   KB_NO,     KB_RSHIFT,  KB_NO, KB_NO,     KB_NO,      KB_NO,    KB_NO },
+        { KB_F4,   KB_F5,     KB_NO,      KB_NO, KB_NO,     KB_NO,      KB_NO,    KB_NO },
+        { KB_F7,   KB_F6,     KB_NO,      KB_NO, KB_DOWN,   KB_LEFT,    KB_PGDOWN,KB_HOME },
+        { KB_F8,   KB_F12,    KB_NO,      KB_NO, KB_UP,     KB_NO,      KB_PGUP,  KB_LSHIFT },
+        { KB_F9,   KB_NO,     KB_NO,      KB_NO, KB_RIGHT,  KB_NO,      KB_END,   KB_NO },
+        { KB_F10,  KB_F11,    KB_NO,      KB_NO, KB_NO,     KB_NO,      KB_NO,    KB_NO }
+    },
+    // 2: FN_1
+    {
+        { KB_LALT, KB_NO,     KB_DELETE,  KB_NO, KB_NO,     KB_NO,      KB_BSLASH,KB_NO },
+        { KB_F1,   KB_GRAVE,  KB_BSLASH,  KB_NO, KB_VOLDOWN,KB_LCTRL,   KB_NO,    KB_NO },
+        { KB_F2,   KB_NO,     KB_LGUI,    KB_NO, KB_VOLUP,  KB_NO,      KB_NO,    KB_NO },
+        { KB_F3,   KB_NO,     KB_RSHIFT,  KB_NO, KB_MUTE,   KB_NO,      KB_NO,    KB_NO },
+        { KB_F4,   KB_F5,     KB_NO,      KB_NO, KB_F20,    KB_NO,      KB_NO,    KB_NO },
+        { KB_F7,   KB_F6,     KB_NO,      KB_NO, KP_SLASH,  KP_ASTERISK,KP_MINUS, KP_PLUS },
+        { KB_F8,   KB_F12,    KB_NO,      KB_NO, KB_HOME,   KB_NO,      KB_END,   KB_LSHIFT },
+        { KB_F9,   KB_NO,     KB_NO,      KB_NO, KB_PGUP,   KB_NO,      KB_PGDOWN,KB_NO },
+        { KB_F10,  KB_F11,    KB_UP,      KB_NO, KB_LEFT,   KB_RIGHT,   KB_NO,    KB_DOWN }
+    },
+    // 3: FN_2
+    {
+        { KB_LALT, KB_NO,     KB_DELETE,  KB_NO, KB_NO,     KB_NO,      KB_BSLASH,KB_NO },
+        { KB_F1,   KB_GRAVE,  KB_BSLASH,  KB_NO, KB_NO,     KB_LCTRL,   KB_NO,    KB_NO },
+        { KB_F2,   KB_NO,     KB_LGUI,    KB_NO, KB_NO,     KB_NO,      KB_NO,    KB_NO },
+        { KB_F3,   KB_NO,     KB_RSHIFT,  KB_NO, KB_NO,     KB_NO,      KB_NO,    KB_NO },
+        { KB_F4,   KB_F5,     KB_NO,      KB_NO, KB_NO,     KB_NO,      KB_NO,    KB_NO },
+        { KB_F7,   KB_F6,     KB_NO,      KB_NO, KB_DOWN,   KB_LEFT,    KB_PGDOWN,KB_HOME },
+        { KB_F8,   KB_F12,    KB_NO,      KB_NO, KB_UP,     KB_NO,      KB_PGUP,  KB_LSHIFT },
+        { KB_F9,   KB_NO,     KB_NO,      KB_NO, KB_RIGHT,  KB_NO,      KB_END,   KB_NO },
+        { KB_F10,  KB_F11,    KB_NO,      KB_NO, KB_NO,     KB_NO,      KB_NO,    KB_NO }
+    },
 };
 
 
-uint8_t get_keycode(uint8_t row, uint8_t col)
+uint8_t get_keycode(int layer, uint8_t row, uint8_t col)
 {
     if (row >= MATRIX_ROWS)
         return KB_NO;
     if (col >= MATRIX_COLS)
         return KB_NO;
-    return pgm_read_byte(&Keymap[row][col]);
+    return pgm_read_byte(&Keymap[layer][row][col]);
+}
+
+int get_layer(void) {
+    int layer = 0;
+    for (int row = 0; row < MATRIX_ROWS; row++) {
+        for (int col = 0; col < MATRIX_ROWS; col++) {
+            if (matrix[row] & 1<<col) continue;
+            if (get_keycode(0, row, col) == FN_0) layer = 1;
+            if (get_keycode(0, row, col) == FN_1) layer = 2;
+            if (get_keycode(0, row, col) == FN_2) layer = 3;
+        }
+    }
+    current_layer = layer;
+    return current_layer;
 }
index 7a84ea31e67f9e62feee38dd964cd33d25a686e1..a85b626c65a729904b7f15ef74822a0fbe5b1d50 100644 (file)
--- a/keymap.h
+++ b/keymap.h
@@ -4,7 +4,8 @@
 #include <stdint.h>
 #include "usbkeycodes.h"
 
-uint8_t get_keycode(uint8_t row, uint8_t col);
+int get_layer(void);
+uint8_t get_keycode(int layer, uint8_t row, uint8_t col);
 
 #define MATRIX_ROWS 9
 #define MATRIX_COLS 8
diff --git a/mykey.c b/mykey.c
index b22c68fb84c68441a857db68004c06fae9a2877d..ba323448be711006d5fce77adbb3a5ddfbf96efd 100644 (file)
--- a/mykey.c
+++ b/mykey.c
@@ -78,9 +78,11 @@ int main(void)
     print("keyboard firmware 0.1 for t.m.k.\n");
 
     while (1) {
+        int layer = 0;
         uint8_t row, col, code;
 
         matrix_scan();
+        layer = get_layer();
 
         modified = matrix_is_modified();
         has_ghost = matrix_has_ghost();
@@ -95,8 +97,10 @@ int main(void)
                 for (col = 0; col < MATRIX_COLS; col++) {
                     if (matrix[row] & 1<<col) continue;
 
-                    code = get_keycode(row, col);
-                    if (KB_LCTRL <= code && code <= KB_RGUI) {
+                    code = get_keycode(layer, row, col);
+                    if (code == KB_NO) {
+                        continue;
+                    } else if (KB_LCTRL <= code && code <= KB_RGUI) {
                         // modifier keycode: 0xE0-0xE7
                         keyboard_modifier_keys |= 1<<(code & 0x07);
                     } else {
index ca2082743ffac0ca2af9893f5757bc93bd04a620..b0e705836369bf9bb984f1661984e89398094caa 100644 (file)
@@ -255,11 +255,7 @@ enum keycodes {
     KP_DECIMAL,
     KP_HEXADECIMAL,
 
-    /*
-     * These are NOT standard USB HID - handled specially in decoding,
-     * so they will be mapped to the modifier byte in the USB report.
-     */
-    MOD_START = 0xE0,
+    /* modifiers */
     KB_LCTRL = 0xE0,    /* 0x01 */
     KB_LSHIFT,          /* 0x02 */
     KB_LALT,            /* 0x04 */
@@ -268,6 +264,12 @@ enum keycodes {
     KB_RSHIFT,          /* 0x20 */
     KB_RALT,            /* 0x40 */
     KB_RGUI,            /* 0x80 */
+
+    /* function keys */
+    FN_0 = 0xF0,
+    FN_1,
+    FN_2,
+    FN_3,
 };
 
 #endif /* USBKEYCODES_H */