From d1c35b12555cafcb0ca6107cfca9b0ef13c0276c Mon Sep 17 00:00:00 2001 From: xyverz Date: Fri, 16 Sep 2016 22:02:33 -0700 Subject: [PATCH 001/117] removed a couple of mod_tap keys since they had some unintended conseqeunces across various platforms. --- keyboards/planck/keymaps/xyverz/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/planck/keymaps/xyverz/keymap.c b/keyboards/planck/keymaps/xyverz/keymap.c index 192933b181..9998f2a381 100644 --- a/keyboards/planck/keymaps/xyverz/keymap.c +++ b/keyboards/planck/keymaps/xyverz/keymap.c @@ -86,7 +86,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_DVORAK] = { {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH}, {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS}, - {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_T(KC_ENT)}, + {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT}, {KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, KC_BSPC, KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_ENT } }, From 26d6b90dde303099405e5d61d8304af2e31f845b Mon Sep 17 00:00:00 2001 From: Xyverz Date: Sat, 17 Sep 2016 14:43:25 -0700 Subject: [PATCH 002/117] Update readme.md --- keyboards/ergodox/keymaps/xyverz/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/ergodox/keymaps/xyverz/readme.md b/keyboards/ergodox/keymaps/xyverz/readme.md index 6ecdabc9ed..2d72fa6c29 100644 --- a/keyboards/ergodox/keymaps/xyverz/readme.md +++ b/keyboards/ergodox/keymaps/xyverz/readme.md @@ -19,7 +19,7 @@ I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar t ,--------------------------------------------------.,--------------------------------------------------. | ] | 1 | 2 | 3 | 4 | 5 | ESC || ESC | 6 | 7 | 8 | 9 | 0 | [ | |--------+------+------+------+------+-------------||------+------+------+------+------+------+--------| - | Tab | ' | , | . | Y | Y | || | F | G | C | R | L | \ | + | Tab | ' | , | . | P | Y | || | F | G | C | R | L | \ | |--------+------+------+------+------+------| || |------+------+------+------+------+--------| | CapsLk | A | O | E | U | I |------||------| D | H | T | N | S | - | |--------+------+------+------+------+------| _MD || _KP |------+------+------+------+------+--------| From a03d72f597f8595fa76b64825f1b7934646f422c Mon Sep 17 00:00:00 2001 From: Xyverz Date: Fri, 30 Sep 2016 13:05:21 -0700 Subject: [PATCH 003/117] Updates to my Planck keymap - standardizing the bottom row. --- keyboards/planck/keymaps/xyverz/keymap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/planck/keymaps/xyverz/keymap.c b/keyboards/planck/keymaps/xyverz/keymap.c index 9998f2a381..bbb83faf1c 100644 --- a/keyboards/planck/keymaps/xyverz/keymap.c +++ b/keyboards/planck/keymaps/xyverz/keymap.c @@ -50,8 +50,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_QWERTY] = { {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, - {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT}, + {KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, KC_BSPC, KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_ENT } }, /* Colemak @@ -68,8 +68,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_COLEMAK] = { {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, - {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT}, + {KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, KC_BSPC, KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_ENT } }, /* Dvorak From 8cd3a8402571bb9d0c28579060f59a4ac26c37e5 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Fri, 30 Sep 2016 22:43:15 -0700 Subject: [PATCH 004/117] revisions to my keymap again. --- keyboards/tv44/keymaps/xyverz/keymap.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/keyboards/tv44/keymaps/xyverz/keymap.c b/keyboards/tv44/keymaps/xyverz/keymap.c index 8cbcf8d35a..6026c1cab8 100644 --- a/keyboards/tv44/keymaps/xyverz/keymap.c +++ b/keyboards/tv44/keymaps/xyverz/keymap.c @@ -22,10 +22,10 @@ extern keymap_config_t keymap_config; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_DV] = { /* 0: Dvorak */ - {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC }, - {MO(_L1), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_ENT }, + {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH }, + {MO(_L1), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, LT(_L2, KC_MINS)}, {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT }, - {KC_LCTL, KC_LALT, KC_LGUI, KC_BSPC, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, KC_SLSH, KC_MINS, XXXXXXX, MO(_L2) } + {KC_LCTL, KC_LALT, KC_LGUI, KC_BSPC, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, KC_BSLS, KC_EQL, XXXXXXX, KC_ENT } }, [_QW] = { /* 1: Qwerty */ @@ -46,14 +46,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL }, {_______, KC_BSLS, KC_QUOT, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_DOWN, KC_UP, KC_LEFT, KC_RGHT, _______ }, {_______, _______, _______, KC_PSCR, _______, _______, _______, KC_MSTP, KC_MPLY, KC_MPRV, KC_MNXT, KC_RSFT }, - {KC_ESC, KC_LGUI, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, KC_SLSH, _______, _______ } + {KC_ESC, KC_LGUI, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, KC_EQL, _______, _______ } }, [_L2] = { /* 2: FN 2 */ - {KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_ESC }, - {_______, KC_F11, KC_F12, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_VOLU, KC_ENT }, - {_______, _______, _______, _______, _______, _______, _______, _______, KC_END, KC_PGDN, KC_VOLD, _______ }, - {QWERTY, DVORAK, COLEMAK, _______, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______ } + {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_ESC }, + {_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, KC_HOME, KC_PGUP, KC_VOLU, _______ }, + {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_END, KC_PGDN, KC_VOLD, _______ }, + {QWERTY, DVORAK, COLEMAK, _______, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, KC_PLUS, _______, _______ } } }; From e3c3170610561042df3d67f358c15553878a2012 Mon Sep 17 00:00:00 2001 From: xyverz Date: Fri, 30 Sep 2016 23:10:34 -0700 Subject: [PATCH 005/117] More standardization between the three layouts Swapped Number Row with Symbols between _L1 and _L2. --- keyboards/tv44/keymaps/xyverz/keymap.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/keyboards/tv44/keymaps/xyverz/keymap.c b/keyboards/tv44/keymaps/xyverz/keymap.c index 6026c1cab8..00347b0190 100644 --- a/keyboards/tv44/keymaps/xyverz/keymap.c +++ b/keyboards/tv44/keymaps/xyverz/keymap.c @@ -30,27 +30,27 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_QW] = { /* 1: Qwerty */ {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC }, - {MO(_L1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT }, + {MO(_L1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, LT(_L2, KC_QUOT)}, {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT }, - {KC_LCTL, KC_LALT, KC_LGUI, KC_BSPC, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, KC_SLSH, KC_MINS, XXXXXXX, MO(_L2) } + {KC_LCTL, KC_LALT, KC_LGUI, KC_BSPC, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, KC_SLSH, KC_MINS, XXXXXXX, KC_ENT } }, [_CM] = { /* 2: Colemak */ {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC }, - {MO(_L1), KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_ENT }, + {MO(_L1), KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, LT(_L2, KC_QUOT)}, {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT }, - {KC_LCTL, KC_LALT, KC_LGUI, KC_BSPC, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, KC_SLSH, KC_MINS, XXXXXXX, MO(_L2) } + {KC_LCTL, KC_LALT, KC_LGUI, KC_BSPC, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, KC_SLSH, KC_MINS, XXXXXXX, KC_ENT } }, [_L1] = {/* 1: FN 1 */ - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL }, + {KC_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL }, {_______, KC_BSLS, KC_QUOT, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_DOWN, KC_UP, KC_LEFT, KC_RGHT, _______ }, {_______, _______, _______, KC_PSCR, _______, _______, _______, KC_MSTP, KC_MPLY, KC_MPRV, KC_MNXT, KC_RSFT }, {KC_ESC, KC_LGUI, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, KC_EQL, _______, _______ } }, [_L2] = { /* 2: FN 2 */ - {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_ESC }, + {KC_TILD, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_ESC }, {_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, KC_HOME, KC_PGUP, KC_VOLU, _______ }, {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_END, KC_PGDN, KC_VOLD, _______ }, {QWERTY, DVORAK, COLEMAK, _______, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, KC_PLUS, _______, _______ } From f41d540e81d21ad5697cf6e48ad1c09edd9a1cb9 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Tue, 18 Oct 2016 16:28:44 -0700 Subject: [PATCH 006/117] Add files via upload Minor changes to my Dvorak keymap. Updated the readme.md to reflect these changes. --- keyboards/ergodox/keymaps/xyverz/keymap.c | 14 +++++++------- keyboards/ergodox/keymaps/xyverz/readme.md | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/keyboards/ergodox/keymaps/xyverz/keymap.c b/keyboards/ergodox/keymaps/xyverz/keymap.c index 08ee5aeda5..ec909ec53d 100644 --- a/keyboards/ergodox/keymaps/xyverz/keymap.c +++ b/keyboards/ergodox/keymaps/xyverz/keymap.c @@ -40,7 +40,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Layer 0 : Dvorak * ,--------------------------------------------------. ,--------------------------------------------------. - * | ] | 1 | 2 | 3 | 4 | 5 | ESC | | ESC | 6 | 7 | 8 | 9 | 0 | [ | + * | = | 1 | 2 | 3 | 4 | 5 | ESC | | ESC | 6 | 7 | 8 | 9 | 0 | / | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * | Tab | ' | , | . | P | Y | | | | F | G | C | R | L | \ | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| @@ -48,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+------+------| _MD | | _KP |------+------+------+------+------+--------| * | LShift | ; | Q | J | K | X | | | | B | M | W | V | Z | RShift | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | LGUI | ` | INS | Left | Rght | | Up | Dn | / | = | RGUI | + * | LGUI | ` | INS | Left | Rght | | Up | Dn | [ | ] | RGUI | * `----------------------------------' `----------------------------------' * ,-------------. ,-------------. * | LCTL | LALT | | RALT | RCTL | @@ -61,7 +61,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_DV] = KEYMAP( // left hand - KC_RBRC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC, + KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC, KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, XXXXXXX, KC_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, MO(_MD), @@ -70,11 +70,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_HOME, KC_BSPC, KC_DEL, KC_END, // right hand - KC_ESC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, + KC_ESC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_SLSH, XXXXXXX, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSLS, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, MO(_KP), KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, - KC_UP, KC_DOWN, KC_SLSH, KC_EQL, KC_RGUI, + KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, KC_RGUI, KC_RALT, KC_RCTL, KC_PGUP, KC_PGDN, KC_ENT, KC_SPC @@ -91,7 +91,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+------+------| _MD | | _KP |------+------+------+------+------+--------| * | LShift | Z | X | C | V | B | | | | N | M | , | . | / | RShift | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | LGUI | ` | INS | Left | Rght | | Up | Dn | / | = | RGUI | + * | LGUI | ` | INS | Left | Rght | | Up | Dn | [ | ] | RGUI | * `----------------------------------' `----------------------------------' * ,-------------. ,-------------. * | LCTL | LALT | | RALT | RCTL | @@ -133,7 +133,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+------+------| _MD | | _KP |------+------+------+------+------+--------| * | LShift | Z | X | C | V | B | | | | K | M | , | . | / | RShift | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | LGUI | ` | INS | Left | Rght | | Up | Dn | / | = | RGUI | + * | LGUI | ` | INS | Left | Rght | | Up | Dn | [ | ] | RGUI | * `----------------------------------' `----------------------------------' * ,-------------. ,-------------. * | LCTL | LALT | | RALT | RCTL | diff --git a/keyboards/ergodox/keymaps/xyverz/readme.md b/keyboards/ergodox/keymaps/xyverz/readme.md index 2d72fa6c29..134fb50afd 100644 --- a/keyboards/ergodox/keymaps/xyverz/readme.md +++ b/keyboards/ergodox/keymaps/xyverz/readme.md @@ -2,7 +2,7 @@ ## About this keymap: -The Dvorak layout shown herestems from my early Kinesis years, using the Contour PS/2 with a Dvorak software layout. Because of this, the RBRC and LBRC were on opposite sides of the board in the corner keys. I've decided to continue using this layout with my ErgoDox. +The Dvorak layout shown here stems from my early Kinesis years, using the Contour PS/2 with a Dvorak software layout. ~~Because of this, the RBRC and LBRC were on opposite sides of the board in the corner keys. I've decided to continue using this layout with my ErgoDox.~~ I've decided do give the normal placing of the SLSH, EQL, and xBRC keys a try, after using a different keyboard for a while... The QWERTY layout shown here is based entirely on the Kinesis Advantage layout, with the additional keys as shown in the diagrams. The Colemak layout is merely an adaptation of that. @@ -17,7 +17,7 @@ I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar t ### Layer 0: Dvorak layer ,--------------------------------------------------.,--------------------------------------------------. - | ] | 1 | 2 | 3 | 4 | 5 | ESC || ESC | 6 | 7 | 8 | 9 | 0 | [ | + | = | 1 | 2 | 3 | 4 | 5 | ESC || ESC | 6 | 7 | 8 | 9 | 0 | / | |--------+------+------+------+------+-------------||------+------+------+------+------+------+--------| | Tab | ' | , | . | P | Y | || | F | G | C | R | L | \ | |--------+------+------+------+------+------| || |------+------+------+------+------+--------| @@ -25,7 +25,7 @@ I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar t |--------+------+------+------+------+------| _MD || _KP |------+------+------+------+------+--------| | LShift | Z | X | C | V | X | || | B | M | W | V | Z | RShift | `--------+------+------+------+------+-------------'`-------------+------+------+------+------+--------' - | LGUI | ` | INS | Left | Rght | | Up | Dn | / | = | RGUI | + | LGUI | ` | INS | Left | Rght | | Up | Dn | [ | ] | RGUI | `----------------------------------' `----------------------------------' ,-------------.,-------------. | LCtr | LAlt || Ralt | RCtr | From 7920063035f45ce76541083e64ea66c77041a5c3 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Tue, 18 Oct 2016 16:34:00 -0700 Subject: [PATCH 007/117] Add files via upload Minor layout changes. --- keyboards/atreus/keymaps/xyverz/keymap.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/keyboards/atreus/keymaps/xyverz/keymap.c b/keyboards/atreus/keymaps/xyverz/keymap.c index b418cc9b5e..f976b05319 100644 --- a/keyboards/atreus/keymaps/xyverz/keymap.c +++ b/keyboards/atreus/keymaps/xyverz/keymap.c @@ -28,30 +28,30 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_DV] = { /* Dvorak */ {KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_NO, KC_F, KC_G, KC_C, KC_R, KC_L }, {KC_A, KC_O, KC_E, KC_U, KC_I, KC_NO, KC_D, KC_H, KC_T, KC_N, KC_S }, - {SFT_T(KC_SCLN), KC_Q, KC_J, KC_K, KC_X, CTL_T(KC_DEL), KC_B, KC_M, KC_W, KC_V, SFT_T(KC_Z) }, + {SFT_T(KC_SCLN), KC_Q, KC_J, KC_K, KC_X, CTL_T(KC_BSPC), KC_B, KC_M, KC_W, KC_V, SFT_T(KC_Z) }, {KC_ESC, KC_TAB, KC_LGUI, MO(_L2), KC_BSPC, ALT_T(KC_ENT), KC_SPC, MO(_L1), KC_MINS, KC_SLSH, KC_EQL} }, [_QW] = { /* Qwerty */ {KC_Q, KC_W, KC_E, KC_R, KC_T, KC_NO, KC_Y, KC_U, KC_I, KC_O, KC_P }, {KC_A, KC_S, KC_D, KC_F, KC_G, KC_NO, KC_H, KC_J, KC_K, KC_L, KC_SCLN}, - {SFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, CTL_T(KC_DEL), KC_N, KC_M, KC_COMM, KC_DOT, SFT_T(KC_SLSH) }, + {SFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, CTL_T(KC_BSPC), KC_N, KC_M, KC_COMM, KC_DOT, SFT_T(KC_SLSH) }, {KC_ESC, KC_TAB, KC_LGUI, MO(_L2), KC_BSPC, ALT_T(KC_ENT), KC_SPC, MO(_L1), KC_MINS, KC_QUOT, KC_ENT} }, [_CM] = { /* Colemak */ {KC_Q, KC_W, KC_F, KC_P, KC_G, KC_NO, KC_J, KC_L, KC_U, KC_Y, KC_SCLN}, {KC_A, KC_R, KC_S, KC_T, KC_D, KC_NO, KC_H, KC_N, KC_E, KC_I, KC_O }, - {SFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, CTL_T(KC_DEL), KC_K, KC_M, KC_COMM, KC_DOT, SFT_T(KC_SLSH) }, + {SFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, CTL_T(KC_BSPC), KC_K, KC_M, KC_COMM, KC_DOT, SFT_T(KC_SLSH) }, {KC_ESC, KC_TAB, KC_LGUI, MO(_L2), KC_BSPC, ALT_T(KC_ENT), KC_SPC, MO(_L1), KC_MINS, KC_QUOT, KC_ENT} }, [_L1] = { /* LAYER 1 */ {KC_1, KC_2, KC_3, KC_4, KC_5, KC_NO, KC_6, KC_7, KC_8, KC_9, KC_0 }, - {KC_TAB, KC_INS, KC_UP, KC_DEL, KC_HOME, KC_NO, KC_PGUP, KC_MUTE, KC_VOLD, KC_VOLU, KC_EQL }, - {KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, KC_LCTL, KC_PGDN, KC_MPRV, KC_MPLY, KC_MNXT, KC_BSLS}, + {KC_TAB, KC_INS, KC_UP, KC_DEL, KC_HOME, KC_NO, KC_PGUP, KC_MUTE, KC_VOLD, KC_VOLU, KC_BSLS}, + {KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, KC_LCTL, KC_PGDN, KC_MPRV, KC_MPLY, KC_MNXT, KC_TRNS}, {KC_TRNS, KC_GRV, KC_LGUI, KC_TRNS, KC_DEL, KC_LALT, KC_SPC, KC_TRNS, KC_LBRC, KC_RBRC, KC_ENT } }, [_L2] = { /* LAYER 2 */ {KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_NO, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN}, - {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_NO, KC_TRNS, KC_F6, KC_F7, KC_F8, KC_PLUS}, + {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_NO, KC_TRNS, KC_F6, KC_F7, KC_F8, KC_PIPE}, {KC_TRNS, KC_TRNS, DVORAK, QWERTY, COLEMAK, KC_LCTL, KC_TRNS, KC_F9, KC_F10, KC_F11, KC_F12 }, {KC_TRNS, KC_TRNS, KC_LGUI, KC_TRNS, KC_BSPC, KC_LALT, KC_SPC, KC_TRNS, LSFT(KC_LBRC), LSFT(KC_RBRC), RESET} } From 91b1aa0994ad2296d03148d9bec8c455ef105fcb Mon Sep 17 00:00:00 2001 From: Xyverz Date: Tue, 18 Oct 2016 16:34:42 -0700 Subject: [PATCH 008/117] Add files via upload Minor layout changes --- keyboards/preonic/keymaps/xyverz/keymap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/preonic/keymaps/xyverz/keymap.c b/keyboards/preonic/keymaps/xyverz/keymap.c index adc7392e5c..bc4692f3ec 100644 --- a/keyboards/preonic/keymaps/xyverz/keymap.c +++ b/keyboards/preonic/keymaps/xyverz/keymap.c @@ -97,7 +97,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH}, {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS}, {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT}, - {KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, KC_SPC, KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_ENT } + {KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, KC_SPC, KC_SPC, RAISE, KC_UP, KC_DOWN, KC_LGUI, KC_ENT } }, /* Lower @@ -339,4 +339,4 @@ void play_goodbye_tone() _delay_ms(150); } -#endif \ No newline at end of file +#endif From 61eb35191a482aafde7e5eaa66c9b4a6fc455488 Mon Sep 17 00:00:00 2001 From: xyverz Date: Mon, 31 Oct 2016 17:58:22 -0700 Subject: [PATCH 009/117] Adding more keymaps. --- keyboards/clueboard/keymaps/xyverz/keymap.c | 108 ++++++++++++++++++++ keyboards/gh60/keymaps/xyverz/keymap | 61 +++++++++++ keyboards/gh60/keymaps/xyverz/keymap.c | 101 ++++++++++++++++++ keyboards/gh60/keymaps/xyverz/keymap_orig.c | 61 +++++++++++ 4 files changed, 331 insertions(+) create mode 100644 keyboards/clueboard/keymaps/xyverz/keymap.c create mode 100644 keyboards/gh60/keymaps/xyverz/keymap create mode 100644 keyboards/gh60/keymaps/xyverz/keymap.c create mode 100644 keyboards/gh60/keymaps/xyverz/keymap_orig.c diff --git a/keyboards/clueboard/keymaps/xyverz/keymap.c b/keyboards/clueboard/keymaps/xyverz/keymap.c new file mode 100644 index 0000000000..01f158bf0f --- /dev/null +++ b/keyboards/clueboard/keymaps/xyverz/keymap.c @@ -0,0 +1,108 @@ +#include "clueboard.h" + +// Used for SHIFT_ESC +#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 1 +#define _RS 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: (Base Layer) Default Layer + * ,--------------------------------------------------------------------------. ,----. + * |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| BS| |PGUP| + * |--------------------------------------------------------------------------| |----| + * | Tab| Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |PGDN| + * |--------------------------------------------------------------------------| `----' + * |Capslck| A| S| D| F| G| H| J| K| L| ;| '| # | Ent| + * |-----------------------------------------------------------------------------. + * |Shift| BS| Z| X| C| V| B| N| M| ,| .| /| BS|Shift| UP| + * |------------------------------------------------------------------------|----|----. + * | Ctrl| Gui| Alt| MHen| Space| Space| Hen| Alt| Ctrl| _FL|LEFT|DOWN|RGHT| + * `----------------------------------------------------------------------------------' + */ +[_BL] = KEYMAP( + F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_PGUP, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, \ + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, KC_SPC,KC_SPC, KC_HENK, KC_RALT, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT), + + /* Keymap _FL: Function Layer + * ,--------------------------------------------------------------------------. ,----. + * | `| F1| F2| F3| F4| F5| F6| F7| F8| F9| F10| F11| F12| | Del| |BLIN| + * |--------------------------------------------------------------------------| |----| + * | | | | | | | | |PScr|SLck|Paus| | | | |BLDE| + * |--------------------------------------------------------------------------| `----' + * | | | _RS| | | | | | | | | | | | + * |-----------------------------------------------------------------------------. + * | | | | | | | | | | | | | | |PGUP| + * |------------------------------------------------------------------------|----|----. + * | | | | | | | | | | _FL|HOME|PGDN| END| + * `----------------------------------------------------------------------------------' + */ +[_FL] = KEYMAP( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_DEL, BL_STEP, \ + KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_HOME, KC_PGDN, KC_END), + + /* Keymap _RS: Reset layer + * ,--------------------------------------------------------------------------. ,----. + * | | | | | | | | | | | | | | | | | | + * |--------------------------------------------------------------------------| |----| + * | | | | |RESET| | | | | | | | | | | | + * |--------------------------------------------------------------------------| `----' + * | | | _RS| | | | | | | | | | | | + * |-----------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |------------------------------------------------------------------------|----|----. + * | | | | | | | | | | _FL| | | | + * `----------------------------------------------------------------------------------' + */ +[_RS] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, RGB_VAI, \ + KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAD, \ + KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + MO(_FL), KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), RGB_SAI, \ + KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, RGB_MOD, RGB_MOD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_HUD, RGB_SAD, RGB_HUI), +}; + +enum function_id { + SHIFT_ESC, +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(SHIFT_ESC), +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + static uint8_t shift_esc_shift_mask; + switch (id) { + case SHIFT_ESC: + shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; + if (record->event.pressed) { + if (shift_esc_shift_mask) { + add_key(KC_GRV); + send_keyboard_report(); + } else { + add_key(KC_ESC); + send_keyboard_report(); + } + } else { + if (shift_esc_shift_mask) { + del_key(KC_GRV); + send_keyboard_report(); + } else { + del_key(KC_ESC); + send_keyboard_report(); + } + } + break; + } +} diff --git a/keyboards/gh60/keymaps/xyverz/keymap b/keyboards/gh60/keymaps/xyverz/keymap new file mode 100644 index 0000000000..85b998a467 --- /dev/null +++ b/keyboards/gh60/keymaps/xyverz/keymap @@ -0,0 +1,61 @@ +#include "gh60.h" +#include "action_layer.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* 0: qwerty */ + KEYMAP( + ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, LBRC,RBRC,BSPC, \ + TAB, QUOT,COMM,DOT, P, Y, F, G, C, R, L, SLSH,EQL, BSLS, \ + FN0, A, O, E, U, I, D, H, T, N, S, MINS,NO, ENT, \ + LSFT,NO, SCLN,Q, J, K, X, B, M, W, V, Z, NO, RSFT, \ + LCTL,LALT,LGUI, SPC, NO, RGUI,RALT,RCTL,FN0), + /* 1: fn */ + KEYMAP( + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, \ + TRNS,TRNS,UP, TRNS,TRNS,TRNS,TRNS,PGUP,UP, PGDN,PSCR,SLCK,PAUS,TRNS, \ + TRNS,LEFT,DOWN,RGHT,TRNS,TRNS,HOME,LEFT,DOWN,RGHT,INS, DEL, TRNS,TRNS, \ + CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,END, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS), +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_LAYER_MOMENTARY(1), // to Fn overlay +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; + +void matrix_scan_user(void) { + +//Layer LED indicators + uint32_t layer = layer_state; + + if (layer & (1<<1)) { + gh60_wasd_leds_on(); + gh60_fn_led_on(); + } else { + gh60_wasd_leds_off(); + gh60_fn_led_off(); + } + + if (layer & (1<<2)) { + gh60_poker_leds_on(); + gh60_esc_led_on(); + } else { + gh60_poker_leds_off(); + gh60_esc_led_off(); + } + +}; diff --git a/keyboards/gh60/keymaps/xyverz/keymap.c b/keyboards/gh60/keymaps/xyverz/keymap.c new file mode 100644 index 0000000000..f0211a88b9 --- /dev/null +++ b/keyboards/gh60/keymaps/xyverz/keymap.c @@ -0,0 +1,101 @@ +#include "gh60.h" +#include "action_layer.h" +#include "eeconfig.h" + + +extern keymap_config_t keymap_config; + + +// Used for SHIFT_ESC +#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QW 0 +#define _DV 1 +#define _CM 2 +#define _FL 3 + +// Macro name shortcuts +#define QWERTY M(_QW) +#define DVORAK M(_DV) +#define COLEMAK M(_CM) + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +[_QW] = { /* Layer 0: Qwerty */ + {KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC}, + {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS}, + {MO(_FL), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, XXXXXXX, KC_ENT }, + {KC_LSFT, XXXXXXX, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, XXXXXXX, KC_RSFT}, + {KC_LCTL, KC_LALT, KC_LGUI, XXXXXXX, XXXXXXX, KC_SPC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_RGUI, KC_RALT, KC_RCTL, MO(_FL)} + }, + +[_DV] = { /* Layer 1: Dvorak */ + {KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_BSPC}, + {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSLS}, + {MO(_FL), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, XXXXXXX, KC_ENT }, + {KC_LSFT, XXXXXXX, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, XXXXXXX, KC_RSFT}, + {KC_LCTL, KC_LALT, KC_LGUI, XXXXXXX, XXXXXXX, KC_SPC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_RGUI, KC_RALT, KC_RCTL, MO(_FL)} + }, + +[_CM] = { /* Layer 2: Colemak */ + {KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC}, + {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS}, + {MO(_FL), KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, XXXXXXX, KC_ENT }, + {KC_LSFT, XXXXXXX, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, XXXXXXX, KC_RSFT}, + {KC_LCTL, KC_LALT, KC_LGUI, XXXXXXX, XXXXXXX, KC_SPC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_RGUI, KC_RALT, KC_RCTL, MO(_FL)} + }, + +[_FL] = { /* Layer 3: Functions */ + {_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL }, + {_______, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_UP, KC_PGDN, KC_PSCR, KC_SLCK, KC_PAUS, _______}, + {_______, _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, XXXXXXX, _______}, + {KC_CAPS, XXXXXXX, _______, KC_MUTE, KC_VOLD, KC_VOLU, KC_END, _______, _______, _______, _______, _______, XXXXXXX, _______}, + {QWERTY, DVORAK, COLEMAK, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______} + }, + + +}; + +enum function_id { + SHIFT_ESC, +}; + + +const uint16_t PROGMEM fn_actions[] = { + +}; + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch(id) { + case _DV: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_DV); + } + break; + case _QW: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_QW); + } + break; + case _CM: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_CM); + } + break; + } + return MACRO_NONE; +}; diff --git a/keyboards/gh60/keymaps/xyverz/keymap_orig.c b/keyboards/gh60/keymaps/xyverz/keymap_orig.c new file mode 100644 index 0000000000..85b998a467 --- /dev/null +++ b/keyboards/gh60/keymaps/xyverz/keymap_orig.c @@ -0,0 +1,61 @@ +#include "gh60.h" +#include "action_layer.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* 0: qwerty */ + KEYMAP( + ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, LBRC,RBRC,BSPC, \ + TAB, QUOT,COMM,DOT, P, Y, F, G, C, R, L, SLSH,EQL, BSLS, \ + FN0, A, O, E, U, I, D, H, T, N, S, MINS,NO, ENT, \ + LSFT,NO, SCLN,Q, J, K, X, B, M, W, V, Z, NO, RSFT, \ + LCTL,LALT,LGUI, SPC, NO, RGUI,RALT,RCTL,FN0), + /* 1: fn */ + KEYMAP( + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, \ + TRNS,TRNS,UP, TRNS,TRNS,TRNS,TRNS,PGUP,UP, PGDN,PSCR,SLCK,PAUS,TRNS, \ + TRNS,LEFT,DOWN,RGHT,TRNS,TRNS,HOME,LEFT,DOWN,RGHT,INS, DEL, TRNS,TRNS, \ + CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,END, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS), +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_LAYER_MOMENTARY(1), // to Fn overlay +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; + +void matrix_scan_user(void) { + +//Layer LED indicators + uint32_t layer = layer_state; + + if (layer & (1<<1)) { + gh60_wasd_leds_on(); + gh60_fn_led_on(); + } else { + gh60_wasd_leds_off(); + gh60_fn_led_off(); + } + + if (layer & (1<<2)) { + gh60_poker_leds_on(); + gh60_esc_led_on(); + } else { + gh60_poker_leds_off(); + gh60_esc_led_off(); + } + +}; From 063328344ada87757595d6b6b11023a6848da2e4 Mon Sep 17 00:00:00 2001 From: xyverz Date: Mon, 31 Oct 2016 18:04:01 -0700 Subject: [PATCH 010/117] Removed files that weren't supposed to be uploaded from gh60 keymap folder --- keyboards/gh60/keymaps/xyverz/keymap | 61 --------------------- keyboards/gh60/keymaps/xyverz/keymap_orig.c | 61 --------------------- 2 files changed, 122 deletions(-) delete mode 100644 keyboards/gh60/keymaps/xyverz/keymap delete mode 100644 keyboards/gh60/keymaps/xyverz/keymap_orig.c diff --git a/keyboards/gh60/keymaps/xyverz/keymap b/keyboards/gh60/keymaps/xyverz/keymap deleted file mode 100644 index 85b998a467..0000000000 --- a/keyboards/gh60/keymaps/xyverz/keymap +++ /dev/null @@ -1,61 +0,0 @@ -#include "gh60.h" -#include "action_layer.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* 0: qwerty */ - KEYMAP( - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, LBRC,RBRC,BSPC, \ - TAB, QUOT,COMM,DOT, P, Y, F, G, C, R, L, SLSH,EQL, BSLS, \ - FN0, A, O, E, U, I, D, H, T, N, S, MINS,NO, ENT, \ - LSFT,NO, SCLN,Q, J, K, X, B, M, W, V, Z, NO, RSFT, \ - LCTL,LALT,LGUI, SPC, NO, RGUI,RALT,RCTL,FN0), - /* 1: fn */ - KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, \ - TRNS,TRNS,UP, TRNS,TRNS,TRNS,TRNS,PGUP,UP, PGDN,PSCR,SLCK,PAUS,TRNS, \ - TRNS,LEFT,DOWN,RGHT,TRNS,TRNS,HOME,LEFT,DOWN,RGHT,INS, DEL, TRNS,TRNS, \ - CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,END, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS), -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_MOMENTARY(1), // to Fn overlay -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - } else { - unregister_code(KC_RSFT); - } - break; - } - return MACRO_NONE; -}; - -void matrix_scan_user(void) { - -//Layer LED indicators - uint32_t layer = layer_state; - - if (layer & (1<<1)) { - gh60_wasd_leds_on(); - gh60_fn_led_on(); - } else { - gh60_wasd_leds_off(); - gh60_fn_led_off(); - } - - if (layer & (1<<2)) { - gh60_poker_leds_on(); - gh60_esc_led_on(); - } else { - gh60_poker_leds_off(); - gh60_esc_led_off(); - } - -}; diff --git a/keyboards/gh60/keymaps/xyverz/keymap_orig.c b/keyboards/gh60/keymaps/xyverz/keymap_orig.c deleted file mode 100644 index 85b998a467..0000000000 --- a/keyboards/gh60/keymaps/xyverz/keymap_orig.c +++ /dev/null @@ -1,61 +0,0 @@ -#include "gh60.h" -#include "action_layer.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* 0: qwerty */ - KEYMAP( - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, LBRC,RBRC,BSPC, \ - TAB, QUOT,COMM,DOT, P, Y, F, G, C, R, L, SLSH,EQL, BSLS, \ - FN0, A, O, E, U, I, D, H, T, N, S, MINS,NO, ENT, \ - LSFT,NO, SCLN,Q, J, K, X, B, M, W, V, Z, NO, RSFT, \ - LCTL,LALT,LGUI, SPC, NO, RGUI,RALT,RCTL,FN0), - /* 1: fn */ - KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, \ - TRNS,TRNS,UP, TRNS,TRNS,TRNS,TRNS,PGUP,UP, PGDN,PSCR,SLCK,PAUS,TRNS, \ - TRNS,LEFT,DOWN,RGHT,TRNS,TRNS,HOME,LEFT,DOWN,RGHT,INS, DEL, TRNS,TRNS, \ - CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,END, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS), -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_MOMENTARY(1), // to Fn overlay -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - } else { - unregister_code(KC_RSFT); - } - break; - } - return MACRO_NONE; -}; - -void matrix_scan_user(void) { - -//Layer LED indicators - uint32_t layer = layer_state; - - if (layer & (1<<1)) { - gh60_wasd_leds_on(); - gh60_fn_led_on(); - } else { - gh60_wasd_leds_off(); - gh60_fn_led_off(); - } - - if (layer & (1<<2)) { - gh60_poker_leds_on(); - gh60_esc_led_on(); - } else { - gh60_poker_leds_off(); - gh60_esc_led_off(); - } - -}; From 8dd422ffe1a84416dd4a8d38878979f5b7bbd51b Mon Sep 17 00:00:00 2001 From: xyverz Date: Mon, 31 Oct 2016 18:27:05 -0700 Subject: [PATCH 011/117] Updates to keymap file. --- keyboards/gh60/keymaps/xyverz/keymap.c | 66 ++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 9 deletions(-) diff --git a/keyboards/gh60/keymaps/xyverz/keymap.c b/keyboards/gh60/keymaps/xyverz/keymap.c index f0211a88b9..e83a7f5a32 100644 --- a/keyboards/gh60/keymaps/xyverz/keymap.c +++ b/keyboards/gh60/keymaps/xyverz/keymap.c @@ -6,9 +6,6 @@ extern keymap_config_t keymap_config; -// Used for SHIFT_ESC -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) - // Each layer gets a name for readability, which is then used in the keymap matrix below. // The underscores don't mean anything - you can have a layer called STUFF or any other name. // Layer names don't all need to be of the same length, obviously, and you can also skip them @@ -29,6 +26,20 @@ extern keymap_config_t keymap_config; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * _QW: Qwerty Layer + * ,-----------------------------------------------------------. + * |ESC | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| Backsp| + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| + * |-----------------------------------------------------------| + * |Fn | A| S| D| F| G| H| J| K| L| ;| '| Return| + * |-----------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /| Shift| + * |-----------------------------------------------------------| + * |Ctrl|Alt |Gui | Space |Gui |Alt |Ctrl| Fn| + * `-----------------------------------------------------------' + */ [_QW] = { /* Layer 0: Qwerty */ {KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC}, {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS}, @@ -37,6 +48,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {KC_LCTL, KC_LALT, KC_LGUI, XXXXXXX, XXXXXXX, KC_SPC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_RGUI, KC_RALT, KC_RCTL, MO(_FL)} }, + /* + * _DV: Dvorak Layer + * ,-----------------------------------------------------------. + * |ESC | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| [| ]| Backsp| + * |-----------------------------------------------------------| + * |Tab | '| ,| .| P| Y| F| G| C| R| L| /| =| \| + * |-----------------------------------------------------------| + * |Fn | A| O| E| U| I| D| H| T| N| S| -| Return| + * |-----------------------------------------------------------| + * |Shift | ;| Q| J| K| X| B| M| W| V| Z| Shift| + * |-----------------------------------------------------------| + * |Ctrl|Alt |Gui | Space |Gui |Alt |Ctrl| Fn| + * `-----------------------------------------------------------' + */ [_DV] = { /* Layer 1: Dvorak */ {KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_BSPC}, {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSLS}, @@ -45,6 +70,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {KC_LCTL, KC_LALT, KC_LGUI, XXXXXXX, XXXXXXX, KC_SPC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_RGUI, KC_RALT, KC_RCTL, MO(_FL)} }, + /* + * _CM: Colemak Layer + * ,-----------------------------------------------------------. + * |ESC | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| Backsp| + * |-----------------------------------------------------------| + * |Tab | Q| W| F| P| G| J| L| U| Y| ;| [| ]| \| + * |-----------------------------------------------------------| + * |Fn | A| R| S| T| D| H| N| E| I| O| '| Return| + * |-----------------------------------------------------------| + * |Shift | Z| X| C| V| B| K| M| ,| .| /| Shift| + * |-----------------------------------------------------------| + * |Ctrl|Alt |Gui | Space |Gui |Alt |Ctrl| Fn| + * `-----------------------------------------------------------' + */ [_CM] = { /* Layer 2: Colemak */ {KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC}, {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS}, @@ -53,22 +92,31 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {KC_LCTL, KC_LALT, KC_LGUI, XXXXXXX, XXXXXXX, KC_SPC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_RGUI, KC_RALT, KC_RCTL, MO(_FL)} }, + /* + * _FL: Function Layer + * ,-----------------------------------------------------------. + * | |F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12| Del| + * |-----------------------------------------------------------| + * | | | | | | | |PgU| Up|PgD|PSc|SLk|Pau| | + * |-----------------------------------------------------------| + * | | |MPr|MPl|MNx| |Hom| Lt| Dn| Rt| | | | + * |-----------------------------------------------------------| + * |CAPS | |Mut|VlD|VlU| |End| | | | | | + * |-----------------------------------------------------------| + * |_QW |_DV |_CM | | | | | | + * `-----------------------------------------------------------' + */ [_FL] = { /* Layer 3: Functions */ {_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL }, {_______, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_UP, KC_PGDN, KC_PSCR, KC_SLCK, KC_PAUS, _______}, {_______, _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, XXXXXXX, _______}, - {KC_CAPS, XXXXXXX, _______, KC_MUTE, KC_VOLD, KC_VOLU, KC_END, _______, _______, _______, _______, _______, XXXXXXX, _______}, + {KC_CAPS, XXXXXXX, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, KC_END, _______, _______, _______, _______, XXXXXXX, _______}, {QWERTY, DVORAK, COLEMAK, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______} }, }; -enum function_id { - SHIFT_ESC, -}; - - const uint16_t PROGMEM fn_actions[] = { }; From 592b90dd221d3847d359b9a4dbd258b9ceb2b3ce Mon Sep 17 00:00:00 2001 From: xyverz Date: Tue, 13 Dec 2016 18:05:45 -0800 Subject: [PATCH 012/117] Changes --- keyboards/planck/keymaps/xyverz/keymap.c | 10 +- keyboards/preonic/keymaps/xyverz/keymap.c | 196 +++++++------------ keyboards/preonic/keymaps/xyverz/makefile.mk | 1 - 3 files changed, 72 insertions(+), 135 deletions(-) delete mode 100644 keyboards/preonic/keymaps/xyverz/makefile.mk diff --git a/keyboards/planck/keymaps/xyverz/keymap.c b/keyboards/planck/keymaps/xyverz/keymap.c index bbb83faf1c..94ace2af56 100644 --- a/keyboards/planck/keymaps/xyverz/keymap.c +++ b/keyboards/planck/keymaps/xyverz/keymap.c @@ -44,14 +44,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------|------+------+------+------+------+------| * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * | Brite| Ctrl | Alt | GUI |Lower | Bksp |Space |Raise | Left | Down | Up |Right | * `-----------------------------------------------------------------------------------' */ [_QWERTY] = { {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT}, - {KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, KC_BSPC, KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_ENT } + {KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, GUI_T(KC_BSPC), KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_ENT } }, /* Colemak @@ -62,14 +62,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------|------+------+------+------+------+------| * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * | Brite| Ctrl | Alt | GUI |Lower | Bksp |Space |Raise | Left | Down | Up |Right | * `-----------------------------------------------------------------------------------' */ [_COLEMAK] = { {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT}, - {KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, KC_BSPC, KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_ENT } + {KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, GUI_T(KC_BSPC), KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_ENT } }, /* Dvorak @@ -87,7 +87,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH}, {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS}, {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT}, - {KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, KC_BSPC, KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_ENT } + {KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, GUI_T(KC_BSPC), KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_ENT } }, /* Lower diff --git a/keyboards/preonic/keymaps/xyverz/keymap.c b/keyboards/preonic/keymaps/xyverz/keymap.c index bc4692f3ec..b224014606 100644 --- a/keyboards/preonic/keymaps/xyverz/keymap.c +++ b/keyboards/preonic/keymaps/xyverz/keymap.c @@ -14,22 +14,16 @@ #define _DVORAK 2 #define _LOWER 3 #define _RAISE 4 -#define _MUSIC 5 #define _ADJUST 16 -// Macro name shortcuts -#define QWERTY M(_QWERTY) -#define COLEMAK M(_COLEMAK) -#define DVORAK M(_DVORAK) -#define LOWER M(_LOWER) -#define RAISE M(_RAISE) -#define M_BL 5 -#define AUD_OFF M(6) -#define AUD_ON M(7) -#define MUS_OFF M(8) -#define MUS_ON M(9) -#define VC_IN M(10) -#define VC_DE M(11) +enum preonic_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + BACKLIT +}; // Fillers to make layering more clear #define _______ KC_TRNS @@ -47,7 +41,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------|------+------+------+------+------+------| * | Shift| Z | X | C | V | B | N | M | , | . | / | Shift| * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Ctrl | Alt | Left |Right |Lower | Space |Raise | Up | Down | GUI |Enter | + * | Ctrl | Alt | Left |Right |Lower | Bksp |Space |Raise | Up | Down | GUI |Enter | * `-----------------------------------------------------------------------------------' */ [_QWERTY] = { @@ -55,7 +49,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL}, {KC_MINS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT}, - {KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, KC_SPC, KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_ENT } + {KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, GUI_T(KC_BSPC), KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_ENT } }, /* Colemak @@ -66,17 +60,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+-------------+------+------+------+------+------| * | Esc | A | R | S | T | D | H | N | E | I | O | " | * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * | Shift| Z | X | C | V | B | K | M | , | . | / | Shift| * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * | Ctrl | Alt | Left |Right |Lower | Bksp |Space |Raise | Up | Down | GUI |Enter | * `-----------------------------------------------------------------------------------' */ [_COLEMAK] = { {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL}, {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, - {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT}, + {KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, GUI_T(KC_BSPC), KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_ENT } }, /* Dvorak @@ -89,7 +83,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------|------+------+------+------+------+------| * | Shift| ; | Q | J | K | X | B | M | W | V | Z | Shift| * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Ctrl | Alt | Left |Right |Lower | Space |Raise | Up | Down | GUI |Enter | + * | Ctrl | Alt | Left |Right |Lower | Bksp |Space |Raise | Up | Down | GUI |Enter | * `-----------------------------------------------------------------------------------' */ [_DVORAK] = { @@ -97,7 +91,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH}, {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS}, {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT}, - {KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, KC_SPC, KC_SPC, RAISE, KC_UP, KC_DOWN, KC_LGUI, KC_ENT } + {KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, GUI_T(KC_BSPC), KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_ENT } }, /* Lower @@ -110,7 +104,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------|------+------+------+------+------+------| * | | F7 | F8 | F9 | F10 | F11 | F12 | | Mute | Vol- | Vol+ | | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Brite| | Home | End | | Ins | | PgUp | PgDN | |Enter | + * | Brite| | Home | End | | Del | Ins | | PgUp | PgDN | |Enter | * `-----------------------------------------------------------------------------------' */ [_LOWER] = { @@ -118,7 +112,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL}, {KC_CAPS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______}, - {M(M_BL), _______, KC_HOME, KC_END, _______, KC_INS, KC_INS, _______, KC_PGUP, KC_PGDN, _______, _______} + {BACKLIT, _______, KC_HOME, KC_END, _______, KC_DEL, KC_INS, _______, KC_PGUP, KC_PGDN, _______, _______} }, /* Raise @@ -131,7 +125,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------|------+------+------+------+------+------| * | | F7 | F8 | F9 | F10 | F11 | F12 | | Prev | Play | Next | | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Brite| | Home | End | | Ins | | PgUp | PgDN | |Enter | + * | Brite| | Home | End | | Del | Ins | | PgUp | PgDN | |Enter | * `-----------------------------------------------------------------------------------' */ [_RAISE] = { @@ -139,18 +133,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL}, {KC_CAPS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______}, - {M(M_BL), _______, KC_HOME, KC_END, _______, KC_INS, KC_INS, _______, KC_PGUP, KC_PGDN, _______, _______} -}, - -/* Music (reserved for process_action_user) - * - */ -[_MUSIC] = { - {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, - {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, - {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, - {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}, - {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, LOWER, XXXXXXX, XXXXXXX, RAISE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX} + {BACKLIT, _______, KC_HOME, KC_END, _______, KC_DEL, KC_INS, _______, KC_PGUP, KC_PGDN, _______, _______} }, /* Adjust (Lower + Raise) @@ -169,32 +152,29 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_ADJUST] = { {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12}, {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, - {_______, _______, _______, AUD_ON, AUD_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______}, - {_______, VC_DE, VC_IN, MUS_ON, MUS_OFF, _______, _______, _______, _______, _______, _______, _______}, + {_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______}, + {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} } -}; - -const uint16_t PROGMEM fn_actions[] = { - }; #ifdef AUDIO_ENABLE -float start_up[][2] = { - {440.0*pow(2.0,(14)/12.0), 20}, - {440.0*pow(2.0,(26)/12.0), 8}, - {440.0*pow(2.0,(18)/12.0), 20}, - {440.0*pow(2.0,(26)/12.0), 8} +float tone_startup[][2] = { + {NOTE_B5, 20}, + {NOTE_B6, 8}, + {NOTE_DS6, 20}, + {NOTE_B6, 8} }; float tone_qwerty[][2] = SONG(QWERTY_SOUND); float tone_dvorak[][2] = SONG(DVORAK_SOUND); float tone_colemak[][2] = SONG(COLEMAK_SOUND); -float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); -float goodbye[][2] = SONG(GOODBYE_SOUND); +float tone_goodbye[][2] = SONG(GOODBYE_SOUND); + +float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); #endif void persistant_default_layer_set(uint16_t default_layer) { @@ -202,34 +182,36 @@ void persistant_default_layer_set(uint16_t default_layer) { default_layer_set(default_layer); } -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - switch(id) { - case _QWERTY: +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: if (record->event.pressed) { #ifdef AUDIO_ENABLE PLAY_NOTE_ARRAY(tone_qwerty, false, 0); #endif persistant_default_layer_set(1UL<<_QWERTY); } + return false; break; - case _COLEMAK: + case COLEMAK: if (record->event.pressed) { #ifdef AUDIO_ENABLE PLAY_NOTE_ARRAY(tone_colemak, false, 0); #endif persistant_default_layer_set(1UL<<_COLEMAK); } + return false; break; - case _DVORAK: + case DVORAK: if (record->event.pressed) { #ifdef AUDIO_ENABLE PLAY_NOTE_ARRAY(tone_dvorak, false, 0); #endif persistant_default_layer_set(1UL<<_DVORAK); } + return false; break; - case _LOWER: + case LOWER: if (record->event.pressed) { layer_on(_LOWER); update_tri_layer(_LOWER, _RAISE, _ADJUST); @@ -237,8 +219,9 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) layer_off(_LOWER); update_tri_layer(_LOWER, _RAISE, _ADJUST); } + return false; break; - case _RAISE: + case RAISE: if (record->event.pressed) { layer_on(_RAISE); update_tri_layer(_LOWER, _RAISE, _ADJUST); @@ -246,8 +229,9 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) layer_off(_RAISE); update_tri_layer(_LOWER, _RAISE, _ADJUST); } + return false; break; - case M_BL: + case BACKLIT: if (record->event.pressed) { register_code(KC_RSFT); #ifdef BACKLIGHT_ENABLE @@ -256,87 +240,41 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) } else { unregister_code(KC_RSFT); } - break; - case 6: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - audio_off(); - #endif - } - break; - case 7: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - audio_on(); - PLAY_NOTE_ARRAY(start_up, false, 0); - #endif - } - break; - case 8: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - layer_off(_MUSIC); - stop_all_notes(); - #endif - } - break; - case 9: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(music_scale, false, 0); - layer_on(_MUSIC); - #endif - } - break; - case 10: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - voice_iterate(); - PLAY_NOTE_ARRAY(music_scale, false, 0); - #endif - } - break; - case 11: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - voice_deiterate(); - PLAY_NOTE_ARRAY(music_scale, false, 0); - #endif - } - break; + return false; + break; } - return MACRO_NONE; + return true; }; - void matrix_init_user(void) { - #ifdef AUDIO_ENABLE - _delay_ms(20); // gets rid of tick - PLAY_NOTE_ARRAY(start_up, false, 0); - #endif + #ifdef AUDIO_ENABLE + startup_user(); + #endif } #ifdef AUDIO_ENABLE -uint8_t starting_note = 0x0C; -int offset = 7; - -void process_action_user(keyrecord_t *record) { - - if (IS_LAYER_ON(_MUSIC)) { - if (record->event.pressed) { - play_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF); - } else { - stop_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row))); - } - } - +void startup_user() +{ + _delay_ms(20); // gets rid of tick + PLAY_NOTE_ARRAY(tone_startup, false, 0); } -void play_goodbye_tone() +void shutdown_user() { - PLAY_NOTE_ARRAY(goodbye, false, 0); - _delay_ms(150); + PLAY_NOTE_ARRAY(tone_goodbye, false, 0); + _delay_ms(150); + stop_all_notes(); +} + +void music_on_user(void) +{ + music_scale_user(); +} + +void music_scale_user(void) +{ + PLAY_NOTE_ARRAY(music_scale, false, 0); } #endif diff --git a/keyboards/preonic/keymaps/xyverz/makefile.mk b/keyboards/preonic/keymaps/xyverz/makefile.mk deleted file mode 100644 index 628167ff66..0000000000 --- a/keyboards/preonic/keymaps/xyverz/makefile.mk +++ /dev/null @@ -1 +0,0 @@ -AUDIO_ENABLE = yes \ No newline at end of file From 79343f1c6cde28c454eac0a577d0d7dbf3aa2f17 Mon Sep 17 00:00:00 2001 From: xyverz Date: Sun, 8 Jan 2017 21:44:31 -0800 Subject: [PATCH 013/117] Usaility changes to keymap, tidying up a bit. --- keyboards/preonic/keymaps/xyverz/keymap.c | 24 +++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/keyboards/preonic/keymaps/xyverz/keymap.c b/keyboards/preonic/keymaps/xyverz/keymap.c index b224014606..b4d18f9a22 100644 --- a/keyboards/preonic/keymaps/xyverz/keymap.c +++ b/keyboards/preonic/keymaps/xyverz/keymap.c @@ -54,11 +54,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Colemak * ,-----------------------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | * |------+------+------+------+------+------+------+------+------+------+------+------| * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Del | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | R | S | T | D | H | N | E | I | O | " | + * | Bksp | A | R | S | T | D | H | N | E | I | O | " | * |------+------+------+------+------+------|------+------+------+------+------+------| * | Shift| Z | X | C | V | B | K | M | , | . | / | Shift| * |------+------+------+------+------+------+------+------+------+------+------+------| @@ -66,9 +66,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_COLEMAK] = { - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL}, - {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, + {KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT}, {KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, GUI_T(KC_BSPC), KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_ENT } }, @@ -98,9 +98,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,-----------------------------------------------------------------------------------. * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | | | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Caps | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * | Caps | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | * |------+------+------+------+------+------|------+------+------+------+------+------| * | | F7 | F8 | F9 | F10 | F11 | F12 | | Mute | Vol- | Vol+ | | * |------+------+------+------+------+------+------+------+------+------+------+------| @@ -109,8 +109,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_LOWER] = { {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL}, - {KC_CAPS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, + {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PIPE}, + {KC_CAPS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, _______}, {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______}, {BACKLIT, _______, KC_HOME, KC_END, _______, KC_DEL, KC_INS, _______, KC_PGUP, KC_PGDN, _______, _______} }, @@ -119,9 +119,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,-----------------------------------------------------------------------------------. * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | \ | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Caps | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * | Caps | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | | * |------+------+------+------+------+------|------+------+------+------+------+------| * | | F7 | F8 | F9 | F10 | F11 | F12 | | Prev | Play | Next | | * |------+------+------+------+------+------+------+------+------+------+------+------| @@ -130,8 +130,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_RAISE] = { {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL}, - {KC_CAPS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, + {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSLS}, + {KC_CAPS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, _______}, {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______}, {BACKLIT, _______, KC_HOME, KC_END, _______, KC_DEL, KC_INS, _______, KC_PGUP, KC_PGDN, _______, _______} }, From 7a9a5d0e626aaaff96b99f251d048d24e07289f9 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Mon, 9 Jan 2017 19:08:46 -0800 Subject: [PATCH 014/117] Add files via upload tidying up the keymap --- keyboards/atreus/keymaps/xyverz/keymap.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/keyboards/atreus/keymaps/xyverz/keymap.c b/keyboards/atreus/keymaps/xyverz/keymap.c index f976b05319..66fdebb50b 100644 --- a/keyboards/atreus/keymaps/xyverz/keymap.c +++ b/keyboards/atreus/keymaps/xyverz/keymap.c @@ -28,25 +28,25 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_DV] = { /* Dvorak */ {KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_NO, KC_F, KC_G, KC_C, KC_R, KC_L }, {KC_A, KC_O, KC_E, KC_U, KC_I, KC_NO, KC_D, KC_H, KC_T, KC_N, KC_S }, - {SFT_T(KC_SCLN), KC_Q, KC_J, KC_K, KC_X, CTL_T(KC_BSPC), KC_B, KC_M, KC_W, KC_V, SFT_T(KC_Z) }, + {SFT_T(KC_SCLN), KC_Q, KC_J, KC_K, KC_X, CTL_T(KC_DEL), KC_B, KC_M, KC_W, KC_V, SFT_T(KC_Z) }, {KC_ESC, KC_TAB, KC_LGUI, MO(_L2), KC_BSPC, ALT_T(KC_ENT), KC_SPC, MO(_L1), KC_MINS, KC_SLSH, KC_EQL} }, [_QW] = { /* Qwerty */ {KC_Q, KC_W, KC_E, KC_R, KC_T, KC_NO, KC_Y, KC_U, KC_I, KC_O, KC_P }, {KC_A, KC_S, KC_D, KC_F, KC_G, KC_NO, KC_H, KC_J, KC_K, KC_L, KC_SCLN}, - {SFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, CTL_T(KC_BSPC), KC_N, KC_M, KC_COMM, KC_DOT, SFT_T(KC_SLSH) }, - {KC_ESC, KC_TAB, KC_LGUI, MO(_L2), KC_BSPC, ALT_T(KC_ENT), KC_SPC, MO(_L1), KC_MINS, KC_QUOT, KC_ENT} + {SFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, CTL_T(KC_DEL), KC_N, KC_M, KC_COMM, KC_DOT, SFT_T(KC_SLSH) }, + {KC_ESC, KC_TAB, KC_LGUI, MO(_L2), KC_BSPC, ALT_T(KC_ENT), KC_SPC, MO(_L1), KC_MINS, KC_QUOT, KC_EQL} }, [_CM] = { /* Colemak */ {KC_Q, KC_W, KC_F, KC_P, KC_G, KC_NO, KC_J, KC_L, KC_U, KC_Y, KC_SCLN}, {KC_A, KC_R, KC_S, KC_T, KC_D, KC_NO, KC_H, KC_N, KC_E, KC_I, KC_O }, - {SFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, CTL_T(KC_BSPC), KC_K, KC_M, KC_COMM, KC_DOT, SFT_T(KC_SLSH) }, - {KC_ESC, KC_TAB, KC_LGUI, MO(_L2), KC_BSPC, ALT_T(KC_ENT), KC_SPC, MO(_L1), KC_MINS, KC_QUOT, KC_ENT} + {SFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, CTL_T(KC_DEL), KC_K, KC_M, KC_COMM, KC_DOT, SFT_T(KC_SLSH) }, + {KC_ESC, KC_TAB, KC_LGUI, MO(_L2), KC_BSPC, ALT_T(KC_ENT), KC_SPC, MO(_L1), KC_MINS, KC_QUOT, KC_EQL} }, [_L1] = { /* LAYER 1 */ {KC_1, KC_2, KC_3, KC_4, KC_5, KC_NO, KC_6, KC_7, KC_8, KC_9, KC_0 }, {KC_TAB, KC_INS, KC_UP, KC_DEL, KC_HOME, KC_NO, KC_PGUP, KC_MUTE, KC_VOLD, KC_VOLU, KC_BSLS}, - {KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, KC_LCTL, KC_PGDN, KC_MPRV, KC_MPLY, KC_MNXT, KC_TRNS}, + {KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, KC_LCTL, KC_PGDN, KC_MPRV, KC_MPLY, KC_MNXT, KC_BSLS}, {KC_TRNS, KC_GRV, KC_LGUI, KC_TRNS, KC_DEL, KC_LALT, KC_SPC, KC_TRNS, KC_LBRC, KC_RBRC, KC_ENT } }, [_L2] = { /* LAYER 2 */ From 1074642c3685816852f0fe58ccdf59a83fca9f47 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Fri, 13 Jan 2017 01:51:52 -0800 Subject: [PATCH 015/117] initial commit of my Atreus62 keymap --- keyboards/atreus62/keymaps/xyverz/keymap.c | 93 ++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 keyboards/atreus62/keymaps/xyverz/keymap.c diff --git a/keyboards/atreus62/keymaps/xyverz/keymap.c b/keyboards/atreus62/keymaps/xyverz/keymap.c new file mode 100644 index 0000000000..cf59cd6092 --- /dev/null +++ b/keyboards/atreus62/keymaps/xyverz/keymap.c @@ -0,0 +1,93 @@ +// this is the style you want to emulate. +// This is the canonical layout file for the Quantum project. If you want to add another keyboard, + +#include "atreus62.h" +#include "action_layer.h" +#include "eeconfig.h" + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _DV 0 +#define _QW 1 +#define _CM 2 +#define _L1 3 +#define _L2 4 + +// Macro name shortcuts +#define DVORAK M(_DV) +#define QWERTY M(_QW) +#define COLEMAK M(_CM) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_DV] = { /* dvorak */ + { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL }, + { KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_TRNS, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH }, + { KC_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, KC_TRNS, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS }, + { KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_LGUI, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT }, + { KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, MO(_L1), KC_BSPC, KC_ENT, KC_SPC, MO(_L2), KC_UP, KC_DOWN, KC_RGUI, KC_RCTL } + }, + + [_QW] = { /* qwerty */ + { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS }, + { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_TRNS, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL }, + { KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_TRNS, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT }, + { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LGUI, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT }, + { KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, MO(_L1), KC_BSPC, KC_ENT, KC_SPC, MO(_L2), KC_UP, KC_DOWN, KC_RGUI, KC_RCTL } + }, + + [_CM] = { /* colemak */ + { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS }, + { KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_TRNS, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL }, + { KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_TRNS, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT }, + { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LGUI, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT }, + { KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, MO(_L1), KC_BSPC, KC_ENT, KC_SPC, MO(_L2), KC_UP, KC_DOWN, KC_RGUI, KC_RCTL } + }, + [_L1] = { + { KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_BSPC }, + { KC_TRNS, KC_F11, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F12, KC_BSLS }, + { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LCBR, KC_RCBR, KC_TRNS }, + { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS }, + { KC_TRNS, KC_TRNS, KC_HOME, KC_END, KC_TRNS, KC_DEL, KC_TRNS, KC_INS, KC_TRNS, KC_PGUP, KC_PGDN, KC_TRNS, KC_TRNS } + }, + [_L2] = { + { KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_BSPC }, + { KC_TRNS, KC_F11, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F12, KC_PIPE }, + { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LBRC, KC_RBRC, KC_TRNS }, + { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MPLY, KC_MNXT, KC_TRNS, KC_TRNS }, + { KC_TRNS, KC_TRNS, KC_HOME, KC_END, KC_TRNS, KC_DEL, KC_TRNS, KC_INS, KC_TRNS, KC_PGUP, KC_PGDN, KC_TRNS, KC_TRNS } + }, + +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch(id) { + case _DV: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_DV); + } + break; + case _QW: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_QW); + } + break; + case _CM: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_CM); + } + break; + } + return MACRO_NONE; +}; From c8a0ab18676ff0f4ca92eaafba84e481406b7912 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Thu, 19 Jan 2017 06:49:59 -0800 Subject: [PATCH 016/117] Changes to Atreus62 keymap, adding Let's Split keymap. --- keyboards/atreus62/keymaps/xyverz/keymap.c | 159 +++++++++++++++------ 1 file changed, 112 insertions(+), 47 deletions(-) diff --git a/keyboards/atreus62/keymaps/xyverz/keymap.c b/keyboards/atreus62/keymaps/xyverz/keymap.c index cf59cd6092..e2d8126f41 100644 --- a/keyboards/atreus62/keymaps/xyverz/keymap.c +++ b/keyboards/atreus62/keymaps/xyverz/keymap.c @@ -1,6 +1,34 @@ +/* This is the Atreus62 keyboard layout by Xyverz aka u/Zrevyx on r/mk + I've blatantly stolen what works for me from the Planck and Preonic + layouts and modified this file to fit me. Initial credet goes to + u/profet23 for the doing all the work and adding this keyboard to + QMK in the first place. + + I've got Dvorak, Qwerty, and Colemak layouts at this time, with the + possibility of adding more in the future. + + The bottom row is fairly Kinesis-ish since the Contour and Advantage + keyboards have been my daily drivers for the last 17 years. I hope + You can get some enjoyment out of this layout should you chose it! + +CHANGELOG: + + 0.1 - Initial commit. Based off of Profet's default keymap. + 0.2 - Converted to a more Planck/Preonic keymap style file with + persistent layers enabled. Renamed layers to reflect OLKB maps. + Added a TODO list. + +TODO: + + * Make the layout more efficient, even if it means changing the RAISE + and LOWER functionality. + * Add legends in comments for each layer. Maybe. + * Add a gaming layer. + +*/ + // this is the style you want to emulate. // This is the canonical layout file for the Quantum project. If you want to add another keyboard, - #include "atreus62.h" #include "action_layer.h" #include "eeconfig.h" @@ -9,54 +37,69 @@ // The underscores don't mean anything - you can have a layer called STUFF or any other name. // Layer names don't all need to be of the same length, obviously, and you can also skip them // entirely and just use numbers. -#define _DV 0 -#define _QW 1 -#define _CM 2 -#define _L1 3 -#define _L2 4 +#define _DVORAK 0 +#define _QWERTY 1 +#define _COLEMAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 -// Macro name shortcuts -#define DVORAK M(_DV) -#define QWERTY M(_QW) -#define COLEMAK M(_CM) +enum atreus52_keycodes { + DVORAK = SAFE_RANGE, + QWERTY, + COLEMAK, + LOWER, + RAISE +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_DV] = { /* dvorak */ - { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL }, - { KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_TRNS, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH }, - { KC_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, KC_TRNS, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS }, + [_DVORAK] = { /* dvorak */ + { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, _______, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS }, + { KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, _______, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH }, + { KC_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, _______, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS }, { KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_LGUI, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT }, - { KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, MO(_L1), KC_BSPC, KC_ENT, KC_SPC, MO(_L2), KC_UP, KC_DOWN, KC_RGUI, KC_RCTL } + { KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, KC_BSPC, KC_ENT, KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_RCTL } }, - [_QW] = { /* qwerty */ - { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS }, - { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_TRNS, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL }, - { KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_TRNS, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT }, + [_QWERTY] = { /* qwerty */ + { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, _______, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS }, + { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, _______, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL }, + { KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, _______, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT }, { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LGUI, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT }, - { KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, MO(_L1), KC_BSPC, KC_ENT, KC_SPC, MO(_L2), KC_UP, KC_DOWN, KC_RGUI, KC_RCTL } + { KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, KC_BSPC, KC_ENT, KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_RCTL } }, - [_CM] = { /* colemak */ - { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS }, - { KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_TRNS, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL }, - { KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_TRNS, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT }, + [_COLEMAK] = { /* colemak */ + { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, _______, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS }, + { KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, _______, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL }, + { KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D, _______, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT }, { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LGUI, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT }, - { KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, MO(_L1), KC_BSPC, KC_ENT, KC_SPC, MO(_L2), KC_UP, KC_DOWN, KC_RGUI, KC_RCTL } + { KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, KC_BSPC, KC_ENT, KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_RCTL} }, - [_L1] = { - { KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_BSPC }, - { KC_TRNS, KC_F11, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F12, KC_BSLS }, - { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LCBR, KC_RCBR, KC_TRNS }, - { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS }, - { KC_TRNS, KC_TRNS, KC_HOME, KC_END, KC_TRNS, KC_DEL, KC_TRNS, KC_INS, KC_TRNS, KC_PGUP, KC_PGDN, KC_TRNS, KC_TRNS } + [_LOWER] = { + { KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12 }, + { KC_TILD, KC_GRV, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PIPE }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PLUS, KC_LCBR, KC_RCBR, _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______ }, + { _______, _______, KC_HOME, KC_END, _______, KC_DEL, _______, KC_INS, _______, KC_PGUP, KC_PGDN, _______, _______ } }, - [_L2] = { - { KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_BSPC }, - { KC_TRNS, KC_F11, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F12, KC_PIPE }, - { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LBRC, KC_RBRC, KC_TRNS }, - { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MPLY, KC_MNXT, KC_TRNS, KC_TRNS }, - { KC_TRNS, KC_TRNS, KC_HOME, KC_END, KC_TRNS, KC_DEL, KC_TRNS, KC_INS, KC_TRNS, KC_PGUP, KC_PGDN, KC_TRNS, KC_TRNS } + [_RAISE] = { + { KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12 }, + { KC_TILD, KC_GRV, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_BSLS }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_EQL, KC_LBRC, KC_RBRC, _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______ }, + { _______, _______, KC_HOME, KC_END, _______, KC_DEL, _______, KC_INS, _______, KC_PGUP, KC_PGDN, _______, _______ } + }, + [_ADJUST] = { + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + { _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, QWERTY, COLEMAK, DVORAK, _______, _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ } }, }; @@ -70,24 +113,46 @@ void persistant_default_layer_set(uint16_t default_layer) { default_layer_set(default_layer); } -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - switch(id) { - case _DV: +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: if (record->event.pressed) { - persistant_default_layer_set(1UL<<_DV); + persistant_default_layer_set(1UL<<_QWERTY); } + return false; break; - case _QW: + case COLEMAK: if (record->event.pressed) { - persistant_default_layer_set(1UL<<_QW); + persistant_default_layer_set(1UL<<_COLEMAK); } + return false; break; - case _CM: + case DVORAK: if (record->event.pressed) { - persistant_default_layer_set(1UL<<_CM); + persistant_default_layer_set(1UL<<_DVORAK); } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; break; } - return MACRO_NONE; + return true; }; From 80bc59858539383713c9d9f771ae293b1153674f Mon Sep 17 00:00:00 2001 From: Xyverz Date: Thu, 19 Jan 2017 06:51:24 -0800 Subject: [PATCH 017/117] Added Let's Split --- keyboards/lets_split/keymaps/xyverz/keymap.c | 191 +++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100644 keyboards/lets_split/keymaps/xyverz/keymap.c diff --git a/keyboards/lets_split/keymaps/xyverz/keymap.c b/keyboards/lets_split/keymaps/xyverz/keymap.c new file mode 100644 index 0000000000..62ee4b41d3 --- /dev/null +++ b/keyboards/lets_split/keymaps/xyverz/keymap.c @@ -0,0 +1,191 @@ +#include "lets_split.h" +#include "action_layer.h" +#include "eeconfig.h" + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 + +enum planck_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + ADJUST +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt | GUI |Lower | Bksp |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = KEYMAP ( \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,\ + KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, GUI_T(KC_BSPC), KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_ENT \ +), + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt | GUI |Lower | Bksp |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = KEYMAP ( \ + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ + KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, GUI_T(KC_BSPC), KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_ENT \ +), + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | Tab | " | , | . | P | Y | F | G | C | R | L | / | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S | - | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z | Shift| + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | Alt | Left |Right |Lower | Bksp |Space |Raise | Up | Down | GUI |Enter | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = KEYMAP ( \ + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, \ + KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, \ + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, \ + KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, GUI_T(KC_BSPC), KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_ENT \ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Caps | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | Mute | Vol- | Vol+ | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| | Home | End | | Del | Ins | | PgUp | PgDN | |Enter | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = KEYMAP ( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \ + KC_CAPS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, \ + _______, _______, KC_HOME, KC_END, _______, KC_DEL, KC_INS, _______, KC_PGUP, KC_PGDN, _______, _______ \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Caps | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | Prev | Play | Next | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| | Home | End | | Del | Ins | | PgUp | PgDN | |Enter | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = KEYMAP ( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, \ + KC_CAPS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, \ + _______, _______, KC_HOME, KC_END, _______, KC_DEL, KC_INS, _______, KC_PGUP, KC_PGDN, _______, _______ \ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = KEYMAP ( \ + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL , \ + _______, _______, _______, _______, _______, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +) + + +}; + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + } + return true; +} \ No newline at end of file From 4f163b006e95852e374a71449c121c8aa47ab5a5 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Mon, 30 Jan 2017 00:00:09 -0800 Subject: [PATCH 018/117] First revision of the XK-66 keyboard. --- keyboards/handwired/xk66/Makefile | 3 + keyboards/handwired/xk66/config.h | 162 ++++++++++++++++++ .../handwired/xk66/keymaps/default/Makefile | 21 +++ .../handwired/xk66/keymaps/default/config.h | 8 + .../handwired/xk66/keymaps/default/keymap.c | 90 ++++++++++ .../handwired/xk66/keymaps/default/readme.md | 1 + keyboards/handwired/xk66/readme.md | 28 +++ keyboards/handwired/xk66/rules.mk | 67 ++++++++ keyboards/handwired/xk66/xk66.c | 8 + keyboards/handwired/xk66/xk66.h | 25 +++ 10 files changed, 413 insertions(+) create mode 100644 keyboards/handwired/xk66/Makefile create mode 100644 keyboards/handwired/xk66/config.h create mode 100644 keyboards/handwired/xk66/keymaps/default/Makefile create mode 100644 keyboards/handwired/xk66/keymaps/default/config.h create mode 100644 keyboards/handwired/xk66/keymaps/default/keymap.c create mode 100644 keyboards/handwired/xk66/keymaps/default/readme.md create mode 100644 keyboards/handwired/xk66/readme.md create mode 100644 keyboards/handwired/xk66/rules.mk create mode 100644 keyboards/handwired/xk66/xk66.c create mode 100644 keyboards/handwired/xk66/xk66.h diff --git a/keyboards/handwired/xk66/Makefile b/keyboards/handwired/xk66/Makefile new file mode 100644 index 0000000000..bd09e5885d --- /dev/null +++ b/keyboards/handwired/xk66/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../../Makefile +endif diff --git a/keyboards/handwired/xk66/config.h b/keyboards/handwired/xk66/config.h new file mode 100644 index 0000000000..02ff2a6bf7 --- /dev/null +++ b/keyboards/handwired/xk66/config.h @@ -0,0 +1,162 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Xyverz +#define PRODUCT XK-66 +#define DESCRIPTION A hand-wired 66-key keyboard by Xyverz + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 14 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +#define MATRIX_ROW_PINS { B5, B4, D7, D6, D4 } +#define MATRIX_COL_PINS { B6, F7, F6, F5, F4, F1, F0, D1, D0, B7, B3, B2, B1, B0 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/handwired/xk66/keymaps/default/Makefile b/keyboards/handwired/xk66/keymaps/default/Makefile new file mode 100644 index 0000000000..f4671a9d11 --- /dev/null +++ b/keyboards/handwired/xk66/keymaps/default/Makefile @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/handwired/xk66/keymaps/default/config.h b/keyboards/handwired/xk66/keymaps/default/config.h new file mode 100644 index 0000000000..df06a26206 --- /dev/null +++ b/keyboards/handwired/xk66/keymaps/default/config.h @@ -0,0 +1,8 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +// place overrides here + +#endif \ No newline at end of file diff --git a/keyboards/handwired/xk66/keymaps/default/keymap.c b/keyboards/handwired/xk66/keymaps/default/keymap.c new file mode 100644 index 0000000000..61b3bd97fb --- /dev/null +++ b/keyboards/handwired/xk66/keymaps/default/keymap.c @@ -0,0 +1,90 @@ +#include "xk66.h" +#include "action_layer.h" +#include "eeconfig.h" + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _DV 0 +#define _QW 1 +#define _CM 2 +#define _FL 3 + +// Macro name shortcuts +#define QWERTY M(_QW) +#define DVORAK M(_DV) +#define COLEMAK M(_CM) + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[_DV] = KEYMAP ( /* Dvorak */ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_BSPC, \ + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSLS, \ + MO(_FL), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, \ + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, \ + KC_LCTL, KC_LALT, KC_LGUI, KC_LEFT, KC_RGHT, KC_BSPC, KC_SPC, KC_UP, KC_DOWN, KC_RGUI, KC_RALT, KC_RCTL, MO(_FL) + ), + +[_QW] = KEYMAP ( /* Qwerty */ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ + MO(_FL), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + KC_LCTL, KC_LALT, KC_LGUI, KC_LEFT, KC_RGHT, KC_BSPC, KC_SPC, KC_UP, KC_DOWN, KC_RGUI, KC_RALT, KC_RCTL, MO(_FL) + ), + +[_CM] = KEYMAP ( /* Colemak */ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, \ + MO(_FL), KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + KC_LCTL, KC_LALT, KC_LGUI, KC_LEFT, KC_RGHT, KC_BSPC, KC_SPC, KC_UP, KC_DOWN, KC_RGUI, KC_RALT, KC_RCTL, MO(_FL) + ), + +[_FL] = KEYMAP ( /* Function Layer 1 */ + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, QWERTY, DVORAK, COLEMAK, _______, _______, _______, \ + KC_CAPS, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______, _______, _______, _______, \ + RESET, _______, _______, KC_HOME, KC_END, KC_DEL, KC_INS, KC_PGUP, KC_PGDN, _______, _______, _______, _______ + ), + +}; + + +const uint16_t PROGMEM fn_actions[] = { + +}; + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch(id) { + case _DV: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_DV); + } + break; + case _QW: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_QW); + } + break; + case _CM: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_CM); + } + break; + } + return MACRO_NONE; +}; diff --git a/keyboards/handwired/xk66/keymaps/default/readme.md b/keyboards/handwired/xk66/keymaps/default/readme.md new file mode 100644 index 0000000000..6940fdd7c6 --- /dev/null +++ b/keyboards/handwired/xk66/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for handwired/xk66 \ No newline at end of file diff --git a/keyboards/handwired/xk66/readme.md b/keyboards/handwired/xk66/readme.md new file mode 100644 index 0000000000..2aac6bde33 --- /dev/null +++ b/keyboards/handwired/xk66/readme.md @@ -0,0 +1,28 @@ +handwired/xk66 keyboard firmware +====================== + +## Quantum MK Firmware + +For the full Quantum feature list, see [the parent readme](/). + +## Building + +Download or clone the whole firmware and navigate to the keyboards/handwired/xk66 folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file. + +Depending on which keymap you would like to use, you will have to compile slightly differently. + +### Default + +To build with the default keymap, simply run `make default`. + +### Other Keymaps + +Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files. + +To build the firmware binary hex file with a keymap just do `make` with a keymap like this: + +``` +$ make [default|jack|] +``` + +Keymaps follow the format **__\.c__** and are stored in the `keymaps` folder. diff --git a/keyboards/handwired/xk66/rules.mk b/keyboards/handwired/xk66/rules.mk new file mode 100644 index 0000000000..707a5385be --- /dev/null +++ b/keyboards/handwired/xk66/rules.mk @@ -0,0 +1,67 @@ +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=512 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE ?= yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= yes # Console for debug(+400) +COMMAND_ENABLE ?= yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE ?= no # USB Nkey Rollover +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE ?= no # MIDI controls +UNICODE_ENABLE ?= no # Unicode +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE ?= no # Audio output on port C6 diff --git a/keyboards/handwired/xk66/xk66.c b/keyboards/handwired/xk66/xk66.c new file mode 100644 index 0000000000..3c3e31949e --- /dev/null +++ b/keyboards/handwired/xk66/xk66.c @@ -0,0 +1,8 @@ +#include "xk66.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} diff --git a/keyboards/handwired/xk66/xk66.h b/keyboards/handwired/xk66/xk66.h new file mode 100644 index 0000000000..38fe129e44 --- /dev/null +++ b/keyboards/handwired/xk66/xk66.h @@ -0,0 +1,25 @@ +#ifndef XK66_H +#define XK66_H + +#include "quantum.h" +#include "led.h" + + +// This a shortcut to help you visually see your layout. +// The first section contains all of the arguements +// The second converts the arguments into a two-dimensional array +#define KEYMAP( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0a, K0b, K0c, K0d, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1a, K1b, K1c, K1d, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, K2d, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, K3c, \ + K40, K41, K42, K43, K44, K45, K46, K48, K49, K4a, K4b, K4c, K4d \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0a, K0b, K0c, K0d }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1a, K1b, K1c, K1d }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, KC_NO, K2d }, \ + { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, K3c, KC_NO }, \ + { K40, K41, K42, K43, K44, K45, K46, KC_NO, K48, K49, K4a, K4b, K4c, K4d } \ +} + +#endif \ No newline at end of file From 060f075fd1961b9835eece4bb6882b238fa68610 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Tue, 7 Feb 2017 22:14:56 -0800 Subject: [PATCH 019/117] Added another handwired board, the Atreus50. Added a layer for WOW to my Atreus62. --- keyboards/atreus62/keymaps/xyverz/keymap.c | 23 +++- keyboards/handwired/atreus50/Makefile | 3 + keyboards/handwired/atreus50/atreus50.c | 1 + keyboards/handwired/atreus50/atreus50.h | 18 +++ keyboards/handwired/atreus50/config.h | 58 ++++++++ .../atreus50/keymaps/default/Makefile | 21 +++ .../atreus50/keymaps/default/keymap.c | 128 ++++++++++++++++++ keyboards/handwired/atreus50/rules.mk | 56 ++++++++ 8 files changed, 305 insertions(+), 3 deletions(-) create mode 100644 keyboards/handwired/atreus50/Makefile create mode 100644 keyboards/handwired/atreus50/atreus50.c create mode 100644 keyboards/handwired/atreus50/atreus50.h create mode 100644 keyboards/handwired/atreus50/config.h create mode 100644 keyboards/handwired/atreus50/keymaps/default/Makefile create mode 100644 keyboards/handwired/atreus50/keymaps/default/keymap.c create mode 100644 keyboards/handwired/atreus50/rules.mk diff --git a/keyboards/atreus62/keymaps/xyverz/keymap.c b/keyboards/atreus62/keymaps/xyverz/keymap.c index e2d8126f41..7b7c69f57a 100644 --- a/keyboards/atreus62/keymaps/xyverz/keymap.c +++ b/keyboards/atreus62/keymaps/xyverz/keymap.c @@ -40,14 +40,16 @@ TODO: #define _DVORAK 0 #define _QWERTY 1 #define _COLEMAK 2 -#define _LOWER 3 -#define _RAISE 4 +#define _WOW 3 +#define _LOWER 4 +#define _RAISE 5 #define _ADJUST 16 enum atreus52_keycodes { DVORAK = SAFE_RANGE, QWERTY, COLEMAK, + WOW, LOWER, RAISE }; @@ -80,6 +82,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LGUI, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT }, { KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, KC_BSPC, KC_ENT, KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_RCTL} }, + + [_WOW] = { /* Dvorak with minor modifications for playing World of Warcraft */ + { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, _______, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS }, + { KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, _______, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH }, + { KC_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, _______, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS }, + { KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_LALT, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT }, + { KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, KC_BSPC, CTL_T(KC_ENT), KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_ENT } + }, + [_LOWER] = { { KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12 }, { KC_TILD, KC_GRV, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PIPE }, @@ -97,7 +108,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_ADJUST] = { { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, { _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - { _______, _______, _______, _______, _______, _______, _______, _______, QWERTY, COLEMAK, DVORAK, _______, _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, QWERTY, COLEMAK, DVORAK, _______, WOW }, { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ } }, @@ -133,6 +144,12 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; + case WOW: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_WOW); + } + return false; + break; case LOWER: if (record->event.pressed) { layer_on(_LOWER); diff --git a/keyboards/handwired/atreus50/Makefile b/keyboards/handwired/atreus50/Makefile new file mode 100644 index 0000000000..bd09e5885d --- /dev/null +++ b/keyboards/handwired/atreus50/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../../Makefile +endif diff --git a/keyboards/handwired/atreus50/atreus50.c b/keyboards/handwired/atreus50/atreus50.c new file mode 100644 index 0000000000..dd0dbdaac9 --- /dev/null +++ b/keyboards/handwired/atreus50/atreus50.c @@ -0,0 +1 @@ +#include "atreus50.h" diff --git a/keyboards/handwired/atreus50/atreus50.h b/keyboards/handwired/atreus50/atreus50.h new file mode 100644 index 0000000000..5d27109cca --- /dev/null +++ b/keyboards/handwired/atreus50/atreus50.h @@ -0,0 +1,18 @@ +#ifndef ATREUS50_H +#define ATREUS50_H + +#include "quantum.h" + +#define KEYMAP( \ + K000, K001, K002, K003, K004, K005, K007, K008, K009, K010, K011, K012, \ + K100, K101, K102, K103, K104, K105, K107, K108, K109, K110, K111, K112, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312 \ +) { \ + { K000, K001, K002, K003, K004, K005, KC_NO, K007, K008, K009, K010, K011, K012 }, \ + { K100, K101, K102, K103, K104, K105, KC_NO, K107, K108, K109, K110, K111, K112 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212 }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312 } \ +} + +#endif \ No newline at end of file diff --git a/keyboards/handwired/atreus50/config.h b/keyboards/handwired/atreus50/config.h new file mode 100644 index 0000000000..0248032a01 --- /dev/null +++ b/keyboards/handwired/atreus50/config.h @@ -0,0 +1,58 @@ +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER qmkbuilder +#define PRODUCT Atreus50 +#define DESCRIPTION Keyboard + +/* key matrix size */ +#define MATRIX_ROWS 4 +#define MATRIX_COLS 13 + +/* key matrix pins */ +#define MATRIX_ROW_PINS { F4, F5, F6, F7 } +#define MATRIX_COL_PINS { D3, D2, D1, D0, D4, C6, D7, E6, B4, B5, B6, B2, B3 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* number of backlight levels */ + +#ifdef BACKLIGHT_PIN +#define BACKLIGHT_LEVELS 3 +#endif + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE + +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* prevent stuck modifiers */ +#define PREVENT_STUCK_MODIFIERS + + +#ifdef RGB_DI_PIN +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 0 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#endif + +#endif \ No newline at end of file diff --git a/keyboards/handwired/atreus50/keymaps/default/Makefile b/keyboards/handwired/atreus50/keymaps/default/Makefile new file mode 100644 index 0000000000..43fee26686 --- /dev/null +++ b/keyboards/handwired/atreus50/keymaps/default/Makefile @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/handwired/atreus50/keymaps/default/keymap.c b/keyboards/handwired/atreus50/keymaps/default/keymap.c new file mode 100644 index 0000000000..b3dc17cb1a --- /dev/null +++ b/keyboards/handwired/atreus50/keymaps/default/keymap.c @@ -0,0 +1,128 @@ +// This is the canonical layout file for the Quantum project. If you want to add another keyboard, +// this is the style you want to emulate. + +#include "atreus50.h" +#include "action_layer.h" +#include "eeconfig.h" + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _DVORAK 0 +#define _QWERTY 1 +#define _COLEMAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 + +enum planck_keycodes { + DVORAK = SAFE_RANGE, + QWERTY, + COLEMAK, + LOWER, + RAISE, + BACKLIT +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_DVORAK] = { /* dvorak */ + { KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, _______, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH }, + { KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, _______, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS }, + { KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_ENT, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT }, + { KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, KC_BSPC, KC_LGUI, KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_RCTL } + }, + + [_QWERTY] = { /* qwerty */ + { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, _______, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL }, + { KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, _______, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT }, + { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ENT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT }, + { KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, KC_BSPC, KC_LGUI, KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_RCTL } + }, + + [_COLEMAK] = { /* colemak */ + { KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, _______, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL }, + { KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, _______, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT }, + { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ENT, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT }, + { KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, KC_BSPC, KC_LGUI, KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_RCTL} + }, + + [_LOWER] = { + { KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, _______, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______ }, + { KC_CAPS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE }, + { _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, KC_F12, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______ }, + { _______, _______, KC_HOME, KC_END, _______, KC_DEL, _______, KC_INS, _______, KC_PGUP, KC_PGDN, _______, _______ } + }, + [_RAISE] = { + { KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, _______, KC_6, KC_7, KC_8, KC_9, KC_0, _______ }, + { KC_CAPS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS }, + { _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, KC_F12, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______ }, + { _______, _______, KC_HOME, KC_END, _______, KC_DEL, _______, KC_INS, _______, KC_PGUP, KC_PGDN, _______, _______ } + }, + [_ADJUST] = { + { KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12 }, + { _______, RESET, _______, _______, _______, _______, _______, _______, QWERTY, COLEMAK, DVORAK, _______, _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ } + }, + +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + } + return true; +}; \ No newline at end of file diff --git a/keyboards/handwired/atreus50/rules.mk b/keyboards/handwired/atreus50/rules.mk new file mode 100644 index 0000000000..1f8e943be7 --- /dev/null +++ b/keyboards/handwired/atreus50/rules.mk @@ -0,0 +1,56 @@ +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE ?= yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= no # Console for debug(+400) +COMMAND_ENABLE ?= no # Commands for debug and configuration +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +NKRO_ENABLE ?= yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality +AUDIO_ENABLE ?= no +RGBLIGHT_ENABLE ?= no \ No newline at end of file From 4d7105c2cf47c7604b54cdf488b4eb9d08c1f1cf Mon Sep 17 00:00:00 2001 From: Xyverz Date: Fri, 10 Feb 2017 23:30:08 -0800 Subject: [PATCH 020/117] Added RGB Underglow to my Preonic --- keyboards/preonic/keymaps/xyverz/Makefile | 23 +++++++++++++++++ keyboards/preonic/keymaps/xyverz/config.h | 21 ++++++++++++++++ keyboards/preonic/keymaps/xyverz/keymap.c | 30 +++++++++++------------ 3 files changed, 59 insertions(+), 15 deletions(-) create mode 100644 keyboards/preonic/keymaps/xyverz/Makefile create mode 100644 keyboards/preonic/keymaps/xyverz/config.h diff --git a/keyboards/preonic/keymaps/xyverz/Makefile b/keyboards/preonic/keymaps/xyverz/Makefile new file mode 100644 index 0000000000..ea5f6c164e --- /dev/null +++ b/keyboards/preonic/keymaps/xyverz/Makefile @@ -0,0 +1,23 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/preonic/keymaps/xyverz/config.h b/keyboards/preonic/keymaps/xyverz/config.h new file mode 100644 index 0000000000..4e12921fef --- /dev/null +++ b/keyboards/preonic/keymaps/xyverz/config.h @@ -0,0 +1,21 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +// Number of backlight levels +#undef BACKLIGHT_LEVELS +#define BACKLIGHT_LEVELS 3 + +/* ws2812 RGB LED */ +#undef RGB_DI_PIN +#define RGB_DI_PIN B3 +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 11 // Number of LEDs +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 +#define RGBLIGHT_VAL_STEP 17 + + +#endif \ No newline at end of file diff --git a/keyboards/preonic/keymaps/xyverz/keymap.c b/keyboards/preonic/keymaps/xyverz/keymap.c index b4d18f9a22..c8457cda1f 100644 --- a/keyboards/preonic/keymaps/xyverz/keymap.c +++ b/keyboards/preonic/keymaps/xyverz/keymap.c @@ -46,7 +46,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_QWERTY] = { {KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL}, + {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL }, {KC_MINS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT}, {KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, GUI_T(KC_BSPC), KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_ENT } @@ -67,7 +67,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_COLEMAK] = { {KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL}, + {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL }, {KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT}, {KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, GUI_T(KC_BSPC), KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_ENT } @@ -75,7 +75,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Dvorak * ,-----------------------------------------------------------------------------------. - * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | \ | * |------+------+------+------+------+------+------+------+------+------+------+------| * | Tab | " | , | . | P | Y | F | G | C | R | L | / | * |------+------+------+------+------+-------------+------+------+------+------+------| @@ -87,7 +87,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_DVORAK] = { - {KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS}, {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH}, {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS}, {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT}, @@ -96,7 +96,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Lower * ,-----------------------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | * |------+------+------+------+------+-------------+------+------+------+------+------| * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | | | * |------+------+------+------+------+-------------+------+------+------+------+------| @@ -108,7 +108,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_LOWER] = { - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______}, {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PIPE}, {KC_CAPS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, _______}, {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______}, @@ -117,7 +117,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Raise * ,-----------------------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | * |------+------+------+------+------+------+------+------+------+------+------+------| * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | \ | * |------+------+------+------+------+-------------+------+------+------+------+------| @@ -129,7 +129,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_RAISE] = { - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______}, {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSLS}, {KC_CAPS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, _______}, {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______}, @@ -140,20 +140,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,-----------------------------------------------------------------------------------. * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | Reset| | | | | | | | | | Del | + * | | Reset| | | | | | | | | | | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Audoff|Aud on|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * | | | | | |AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | * |------+------+------+------+------+------|------+------+------+------+------+------| - * | |Voice-|Voice+|Musoff|Mus on| | | | | | | | + * | |RGB ON| MODE | HUE+ | HUE- | SAT+ | SAT- | VAL+ | VAL- | | | | * |------+------+------+------+------+------+------+------+------+------+------+------| * | | | | | | | | | | | | * `-----------------------------------------------------------------------------------' */ [_ADJUST] = { - {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12}, - {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, - {_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______}, - {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______}, + {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12 }, + {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + {_______, _______, _______, _______, _______, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______}, + {_______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} } From 134c354fc502b43798add95b7b154b2bc520e4e6 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Sat, 11 Feb 2017 21:54:05 -0800 Subject: [PATCH 021/117] Adding a config file so that I can get RGB underglow for my Let's Split --- keyboards/lets_split/keymaps/xyverz/config.h | 37 ++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 keyboards/lets_split/keymaps/xyverz/config.h diff --git a/keyboards/lets_split/keymaps/xyverz/config.h b/keyboards/lets_split/keymaps/xyverz/config.h new file mode 100644 index 0000000000..87808a97a8 --- /dev/null +++ b/keyboards/lets_split/keymaps/xyverz/config.h @@ -0,0 +1,37 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + + +#define USE_SERIAL + +#define MASTER_LEFT +// #define _MASTER_RIGHT +// #define EE_HANDS + +#ifdef SUBPROJECT_rev1 + #include "../../rev1/config.h" +#endif +#ifdef SUBPROJECT_rev2 + #include "../../rev2/config.h" + /* RGB Underglow */ + #undef RGBLED_NUM + #define RGBLIGHT_ANIMATIONS + #define RGBLED_NUM 8 +#endif +#ifdef SUBPROJECT_rev2fliphalf + #include "../../rev2fliphalf/config.h" +#endif From 489415009491847ac1855ef5586e2fdcf303aa19 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Sat, 11 Feb 2017 21:54:58 -0800 Subject: [PATCH 022/117] Changes to the keymap to accommodate the RGB Underglow lighting. --- keyboards/lets_split/keymaps/xyverz/keymap.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/keyboards/lets_split/keymaps/xyverz/keymap.c b/keyboards/lets_split/keymaps/xyverz/keymap.c index 62ee4b41d3..d52eb40aea 100644 --- a/keyboards/lets_split/keymaps/xyverz/keymap.c +++ b/keyboards/lets_split/keymaps/xyverz/keymap.c @@ -126,15 +126,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+-------------+------+------+------+------+------| * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | * |------+------+------+------+------+------|------+------+------+------+------+------| - * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | + * | |RGB ON| MODE | HUE+ | HUE- | SAT+ | SAT- | VAL+ | VAL- | | | | * |------+------+------+------+------+------+------+------+------+------+------+------| * | | | | | | | | | | | | * `-----------------------------------------------------------------------------------' */ [_ADJUST] = KEYMAP ( \ - _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL , \ - _______, _______, _______, _______, _______, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12 , \ + _______, RESET, _______, _______, _______, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ + _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ ) @@ -188,4 +188,4 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { break; } return true; -} \ No newline at end of file +} From ea20a064b98b962a723a1ae03ebc27e3f8897321 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Wed, 15 Feb 2017 20:14:32 -0800 Subject: [PATCH 023/117] Added my keymap to the Kinesis project. --- keyboards/kinesis/keymaps/xyverz/Makefile | 21 ++ keyboards/kinesis/keymaps/xyverz/config.h | 8 + keyboards/kinesis/keymaps/xyverz/keymap.c | 226 +++++++++++++++++++++ keyboards/kinesis/keymaps/xyverz/readme.md | 1 + 4 files changed, 256 insertions(+) create mode 100644 keyboards/kinesis/keymaps/xyverz/Makefile create mode 100644 keyboards/kinesis/keymaps/xyverz/config.h create mode 100644 keyboards/kinesis/keymaps/xyverz/keymap.c create mode 100644 keyboards/kinesis/keymaps/xyverz/readme.md diff --git a/keyboards/kinesis/keymaps/xyverz/Makefile b/keyboards/kinesis/keymaps/xyverz/Makefile new file mode 100644 index 0000000000..1da780b841 --- /dev/null +++ b/keyboards/kinesis/keymaps/xyverz/Makefile @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/kinesis/keymaps/xyverz/config.h b/keyboards/kinesis/keymaps/xyverz/config.h new file mode 100644 index 0000000000..8893d122e0 --- /dev/null +++ b/keyboards/kinesis/keymaps/xyverz/config.h @@ -0,0 +1,8 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +// place overrides here + +#endif diff --git a/keyboards/kinesis/keymaps/xyverz/keymap.c b/keyboards/kinesis/keymaps/xyverz/keymap.c new file mode 100644 index 0000000000..7c5148ac20 --- /dev/null +++ b/keyboards/kinesis/keymaps/xyverz/keymap.c @@ -0,0 +1,226 @@ +#include "kinesis.h" +#include "action_layer.h" +#include "eeconfig.h" + +extern keymap_config_t keymap_config; + +#define _DV 0 // Dvorak layer +#define _QW 1 // Qwerty layer +#define _CM 2 // Colemak layer +#define _LO 3 // Media Layer +#define _RA 4 // Keypad Layer + +// Macro name shortcuts +#define DVORAK M(_DV) +#define QWERTY M(_QW) +#define COLEMAK M(_CM) + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +/**************************************************************************************************** +* +* Keymap: Default Layer in Qwerty +* +* ,-------------------------------------------------------------------------------------------------------------------. +* | Esc | F1 | F2 | F3 | F4 | F5 | F6 | F8 | F9 | F10 | F12 | PSCR | SLCK | PAUS | FN0 | BOOT | +* |--------+------+------+------+------+------+---------------------------+------+------+------+------+------+--------| +* | =+ | 1! | 2@ | 3# | 4$ | 5% | | 6^ | 7& | 8* | 9( | 0) | -_ | +* |--------+------+------+------+------+------| +------+------+------+------+------+--------| +* | Tab | Q | W | E | R | T | | Y | U | I | O | P | \| | +* |--------+------+------+------+------+------| |------+------+------+------+------+--------| +* | Caps | A | S | D | F | G | | H | J | K | L | ;: | '" | +* |--------+------+------+------+------+------| |------+------+------+------+------+--------| +* | Shift | Z | X | C | V | B | | N | M | ,. | .> | /? | Shift | +* `--------+------+------+------+------+------- `------+------+------+------+------+--------' +* | `~ | INS | Left | Right| | Up | Down | [{ | ]} | +* `---------------------------' `---------------------------' +* ,-------------. ,-------------. +* | Ctrl | Alt | | Gui | Ctrl | +* ,------|------|------| |------+------+------. +* | | | Home | | PgUp | | | +* | BkSp | Del |------| |------|Return| Space| +* | | | End | | PgDn | | | +* `--------------------' `--------------------' +*/ + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +[_DV] = KEYMAP( + // Left Hand + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, + KC_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, + KC_GRV, KC_INS, KC_LEFT, KC_RGHT, + // Left Thumb + KC_LCTL, KC_LALT, + KC_HOME, + KC_BSPC, LT(_LO, KC_DEL), KC_END, + + // Right Hand + KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, MO(_LO), MO(_RA), + KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS, + KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, + KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, + KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, + KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, + // Right Thumb + KC_RGUI, KC_RCTL, + KC_PGUP, + KC_PGDN, LT(_RA, KC_ENT), KC_SPC + ), + +[_QW] = KEYMAP( + // Left Hand + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, + KC_GRV, KC_INS, KC_LEFT, KC_RGHT, + // Left Thumb + KC_LCTL, KC_LALT, + KC_HOME, + KC_BSPC, LT(_LO, KC_DEL), KC_END, + + // Right Hand + KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, MO(_LO), MO(_RA), + KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS, + KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL , + KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, + // Right Thumb + KC_RGUI, KC_RCTL, + KC_PGUP, + KC_PGDN, LT(_RA, KC_ENT), KC_SPC + ), + +[_CM] = KEYMAP( + // Left Hand + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, + KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, + KC_GRV, KC_INS, KC_LEFT, KC_RGHT, + // Left Thumb + KC_LCTL, KC_LALT, + KC_HOME, + KC_BSPC, LT(_LO, KC_DEL), KC_END, + + // Right Hand + KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, MO(_LO), MO(_RA), + KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL, + KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, + KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, + // Right Thumb + KC_RGUI, KC_RCTL, + KC_PGUP, + KC_PGDN, LT(_RA, KC_ENT), KC_SPC + ), + +[_LO] = KEYMAP( + // Left Hand + _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, + _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, _______, + _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, + _______, KC_MSTP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MSEL, + _______, _______, _______, _______, + // Left Thumb + _______, _______, + _______, + _______, _______, _______, + + // Right Hand + _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12, + _______, _______, _______, _______, _______, _______, + _______, _______, KC_PLUS, KC_LCBR, KC_RCBR, _______, + _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, + _______, _______, _______, _______, + // Right Thumb + _______, _______, + _______, + _______, _______, _______ + ), + +[_RA] = KEYMAP( + // Left Hand + _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, + _______, _______, _______, _______, _______, _______, + _______, _______, QWERTY, COLEMAK, DVORAK, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, + // Left Thumb + _______, _______, + _______, + _______, _______, _______, + + // Right Hand */ + _______, _______, _______, RESET, _______, _______, _______, _______, _______, + KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12, + _______, _______, _______, _______, _______, _______, + _______, _______, KC_EQL, KC_LBRC, KC_RBRC, _______, + _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, + _______, _______, _______, _______, + // Right Thumb + _______, _______, + _______, + _______, _______, _______ + ) + +}; + + +const uint16_t PROGMEM fn_actions[] = { + +}; + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch(id) { + case _DV: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_DV); + } + break; + case _QW: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_QW); + } + break; + case _CM: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_CM); + } + break; + } + return MACRO_NONE; +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + +}; diff --git a/keyboards/kinesis/keymaps/xyverz/readme.md b/keyboards/kinesis/keymaps/xyverz/readme.md new file mode 100644 index 0000000000..da033be1e9 --- /dev/null +++ b/keyboards/kinesis/keymaps/xyverz/readme.md @@ -0,0 +1 @@ +# The default keymap for kinesis-advantage From 1dabceb19782f5856afe66a499020699604b2319 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Wed, 15 Feb 2017 21:56:48 -0800 Subject: [PATCH 024/117] minor adjustments. --- keyboards/kinesis/keymaps/xyverz/keymap.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/keyboards/kinesis/keymaps/xyverz/keymap.c b/keyboards/kinesis/keymaps/xyverz/keymap.c index 7c5148ac20..fb2d3bc06c 100644 --- a/keyboards/kinesis/keymaps/xyverz/keymap.c +++ b/keyboards/kinesis/keymaps/xyverz/keymap.c @@ -54,25 +54,25 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_DV] = KEYMAP( // Left Hand KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, + KC_RBRC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_GRV, KC_INS, KC_LEFT, KC_RGHT, // Left Thumb - KC_LCTL, KC_LALT, + CTL_T(KC_ESC), KC_LALT, KC_HOME, KC_BSPC, LT(_LO, KC_DEL), KC_END, // Right Hand KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, MO(_LO), MO(_RA), - KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS, - KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, + KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, + KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSLS, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, - KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, + KC_UP, KC_DOWN, KC_SLSH, KC_EQL, // Right Thumb - KC_RGUI, KC_RCTL, + KC_RGUI, CTL_T(KC_ESC), KC_PGUP, KC_PGDN, LT(_RA, KC_ENT), KC_SPC ), From 80d5649f25f7cdd7596eb453576dca9eb680a5cd Mon Sep 17 00:00:00 2001 From: Xyverz Date: Wed, 15 Feb 2017 22:54:52 -0800 Subject: [PATCH 025/117] More refinements to my Kinesis keymap. Added a readme.md file. --- keyboards/kinesis/keymaps/xyverz/keymap.c | 195 +++++++++++++++------ keyboards/kinesis/keymaps/xyverz/readme.md | 131 +++++++++++++- 2 files changed, 270 insertions(+), 56 deletions(-) diff --git a/keyboards/kinesis/keymaps/xyverz/keymap.c b/keyboards/kinesis/keymaps/xyverz/keymap.c index fb2d3bc06c..b8e06fe305 100644 --- a/keyboards/kinesis/keymaps/xyverz/keymap.c +++ b/keyboards/kinesis/keymaps/xyverz/keymap.c @@ -7,8 +7,8 @@ extern keymap_config_t keymap_config; #define _DV 0 // Dvorak layer #define _QW 1 // Qwerty layer #define _CM 2 // Colemak layer -#define _LO 3 // Media Layer -#define _RA 4 // Keypad Layer +#define _MD 3 // Media Layer +#define _KP 4 // Keypad Layer // Macro name shortcuts #define DVORAK M(_DV) @@ -23,30 +23,115 @@ extern keymap_config_t keymap_config; #define _______ KC_TRNS #define XXXXXXX KC_NO -/**************************************************************************************************** -* -* Keymap: Default Layer in Qwerty -* -* ,-------------------------------------------------------------------------------------------------------------------. -* | Esc | F1 | F2 | F3 | F4 | F5 | F6 | F8 | F9 | F10 | F12 | PSCR | SLCK | PAUS | FN0 | BOOT | -* |--------+------+------+------+------+------+---------------------------+------+------+------+------+------+--------| -* | =+ | 1! | 2@ | 3# | 4$ | 5% | | 6^ | 7& | 8* | 9( | 0) | -_ | -* |--------+------+------+------+------+------| +------+------+------+------+------+--------| -* | Tab | Q | W | E | R | T | | Y | U | I | O | P | \| | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* | Caps | A | S | D | F | G | | H | J | K | L | ;: | '" | -* |--------+------+------+------+------+------| |------+------+------+------+------+--------| -* | Shift | Z | X | C | V | B | | N | M | ,. | .> | /? | Shift | -* `--------+------+------+------+------+------- `------+------+------+------+------+--------' -* | `~ | INS | Left | Right| | Up | Down | [{ | ]} | -* `---------------------------' `---------------------------' -* ,-------------. ,-------------. -* | Ctrl | Alt | | Gui | Ctrl | -* ,------|------|------| |------+------+------. -* | | | Home | | PgUp | | | -* | BkSp | Del |------| |------|Return| Space| -* | | | End | | PgDn | | | -* `--------------------' `--------------------' +/* + + Function Keys on All Layers (Keypad toggles): + ,-----------------------------------------------------------------. + | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | + `-----------------------------------------------------------------' + ,-----------------------------------------------------------------. + | F9 | F10 | F11 | F12 | PScr | SLck | Paus | Keypad | RESET | + `-----------------------------------------------------------------' + + Dvorak layer: + ,-------------------------------------------.,-------------------------------------------. + | ] | 1 | 2 | 3 | 4 | 5 || 6 | 7 | 8 | 9 | 0 | [ | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | Tab | ' | , | . | P | Y || F | G | C | R | L | \ | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | CapsLk | A | O | E | U | I || D | H | T | N | S | - | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | LShift | Z | X | C | V | X || B | M | W | V | Z | RShift | + `--------+------+------+------+------+------'`------+------+------+------+------+--------' + | ` | INS | Left | Rght | | Up | Dn | / | = | + `---------------------------' `---------------------------' + ,--------------.,--------------. + |Ctr/ESC| LAlt || RGUI |Ctr/ESC| + ,------|-------|------||------+-------+-------. + | | Del | Home || PgUp | Enter | | + | BkSp | / |------||------| / | Space | + | | Media | End || PgDn | KeyPd | | + `---------------------'`----------------------' + + QWERTY layer: + ,-------------------------------------------.,-------------------------------------------. + | = | 1 | 2 | 3 | 4 | 5 || 6 | 7 | 8 | 9 | 0 | - | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | Tab | Q | W | E | R | T || Y | U | I | O | P | \ | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | CapsLk | A | S | D | F | G || H | J | K | L | ; | ' | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | LShift | Z | X | C | V | B || N | M | , | . | / | RShift | + `--------+------+------+------+------+------'`------+------+------+------+------+--------' + | ` | INS | Left | Rght | | Up | Dn | [ | ] | + `---------------------------' `---------------------------' + ,--------------.,--------------. + |Ctr/ESC| LAlt || RGUI |Ctr/ESC| + ,------|-------|------||------+-------+-------. + | | Del | Home || PgUp | Enter | | + | BkSp | / |------||------| / | Space | + | | Media | End || PgDn | KeyPd | | + `---------------------'`----------------------' + + Colemak layer: + ,-------------------------------------------.,-------------------------------------------. + | = | 1 | 2 | 3 | 4 | 5 || 6 | 7 | 8 | 9 | 0 | - | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | Tab | Q | W | F | P | G || J | L | U | Y | ; | \ | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | BkSpc | A | R | S | T | D || H | N | E | I | O | ' | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | LShift | Z | X | C | V | B || K | M | , | . | / | RShift | + `--------+------+------+------+------+------'`------+------+------+------+------+--------' + | ` | INS | Left | Rght | | Up | Dn | [ | ] | + `---------------------------' `---------------------------' + ,--------------.,--------------. + |Ctr/ESC| LAlt || RGUI |Ctr/ESC| + ,------|-------|------||------+-------+-------. + | | Del | Home || PgUp | Enter | | + | BkSp | / |------||------| / | Space | + | | Media | End || PgDn | KeyPd | | + `---------------------'`----------------------' + + Media layer: + ,-------------------------------------------.,-------------------------------------------. + | F11 | F1 | F2 | F3 | F4 | F5 || F6 | F7 | F8 | F9 | F10 | F12 | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | | | | | | || | | | | | | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | | | | | | || | Mute | Vol- | Vol+ | | | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | | | | | | || Stop | Prev | Play | Next | Sel | | + `--------+------+------+------+------+------'`------+------+------+------+------+--------' + | | | | | | | | | | + `---------------------------' `---------------------------' + ,-------------.,-------------. + | | || | | + ,------|------|------||------+------+------. + | | | || | | | + | | |------||------| | | + | | | || | | | + `--------------------'`--------------------' + + Keypad layer: + ,-------------------------------------------.,-------------------------------------------. + | Power | | | | | || | NmLk | KP = | KP / | KP * | | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | Sleep | | | | | || | KP 7 | KP 8 | KP 9 | KP - | | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | Wake | | | | | || | KP 4 | KP 5 | KP 6 | KP + | | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | | |QWERTY|Colemk|Dvorak| || | KP 1 | KP 2 | KP 3 |KP Ent| | + `--------+------+------+------+------+------'`------+------+------+------+------+--------' + | | | | | | | | KP . |KP Ent| | + `---------------------------' `----------------------------------' + ,-------------.,-------------. + | | || | | + ,------|------|------||------+------+------. + | | | || | | | + | | |------||------| | KP 0 | + | | | || | | | + `--------------------'`--------------------' */ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -62,10 +147,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Left Thumb CTL_T(KC_ESC), KC_LALT, KC_HOME, - KC_BSPC, LT(_LO, KC_DEL), KC_END, + KC_BSPC, LT(_MD, KC_DEL), KC_END, // Right Hand - KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, MO(_LO), MO(_RA), + KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, TG(_KP), RESET, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSLS, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, @@ -74,7 +159,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Right Thumb KC_RGUI, CTL_T(KC_ESC), KC_PGUP, - KC_PGDN, LT(_RA, KC_ENT), KC_SPC + KC_PGDN, LT(_KP, KC_ENT), KC_SPC ), [_QW] = KEYMAP( @@ -86,21 +171,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_GRV, KC_INS, KC_LEFT, KC_RGHT, // Left Thumb - KC_LCTL, KC_LALT, + CTL_T(KC_ESC), KC_LALT, KC_HOME, - KC_BSPC, LT(_LO, KC_DEL), KC_END, + KC_BSPC, LT(_MD, KC_DEL), KC_END, // Right Hand - KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, MO(_LO), MO(_RA), + KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, TG(_KP), RESET, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL , KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, // Right Thumb - KC_RGUI, KC_RCTL, + KC_RGUI, CTL_T(KC_ESC), KC_PGUP, - KC_PGDN, LT(_RA, KC_ENT), KC_SPC + KC_PGDN, LT(_KP, KC_ENT), KC_SPC ), [_CM] = KEYMAP( @@ -112,30 +197,30 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_GRV, KC_INS, KC_LEFT, KC_RGHT, // Left Thumb - KC_LCTL, KC_LALT, + CTL_T(KC_ESC), KC_LALT, KC_HOME, - KC_BSPC, LT(_LO, KC_DEL), KC_END, + KC_BSPC, LT(_MD, KC_DEL), KC_END, // Right Hand - KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, MO(_LO), MO(_RA), + KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, TG(_KP), RESET, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, // Right Thumb - KC_RGUI, KC_RCTL, + KC_RGUI, CTL_T(KC_ESC), KC_PGUP, - KC_PGDN, LT(_RA, KC_ENT), KC_SPC + KC_PGDN, LT(_KP, KC_ENT), KC_SPC ), -[_LO] = KEYMAP( +[_MD] = KEYMAP( // Left Hand _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, - _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, _______, - _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, - _______, KC_MSTP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MSEL, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, // Left Thumb _______, _______, @@ -146,8 +231,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12, _______, _______, _______, _______, _______, _______, - _______, _______, KC_PLUS, KC_LCBR, KC_RCBR, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, + KC_MSTP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MSEL, _______, _______, _______, _______, _______, // Right Thumb _______, _______, @@ -155,12 +240,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______ ), -[_RA] = KEYMAP( +[_KP] = KEYMAP( // Left Hand _______, _______, _______, _______, _______, _______, _______, _______, _______, - KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, - _______, _______, _______, _______, _______, _______, - _______, _______, QWERTY, COLEMAK, DVORAK, _______, + KC_PWR, _______, _______, _______, _______, _______, + KC_SLEP, _______, _______, _______, _______, _______, + KC_WAKE, _______, QWERTY, COLEMAK, DVORAK, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, // Left Thumb @@ -169,16 +254,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, // Right Hand */ - _______, _______, _______, RESET, _______, _______, _______, _______, _______, - KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12, - _______, _______, _______, _______, _______, _______, - _______, _______, KC_EQL, KC_LBRC, KC_RBRC, _______, - _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, - _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_NLCK, KC_PEQL, KC_PSLS, KC_PAST, _______, + _______, KC_P7, KC_P8, KC_P9, KC_PMNS, _______, + _______, KC_P4, KC_P5, KC_P6, KC_PPLS, _______, + _______, KC_P1, KC_P2, KC_P3, KC_PENT, _______, + _______, _______, KC_PDOT, KC_PENT, // Right Thumb _______, _______, _______, - _______, _______, _______ + _______, _______, KC_P0 ) }; diff --git a/keyboards/kinesis/keymaps/xyverz/readme.md b/keyboards/kinesis/keymaps/xyverz/readme.md index da033be1e9..3433a94c54 100644 --- a/keyboards/kinesis/keymaps/xyverz/readme.md +++ b/keyboards/kinesis/keymaps/xyverz/readme.md @@ -1 +1,130 @@ -# The default keymap for kinesis-advantage +# Xyverz's Kinesis Keymap + +## About this keymap: + +The Dvorak layout shown here stems from my early Kinesis years, using the Contour PS/2 with a Dvorak software layout. Because of this, the RBRC and LBRC were on opposite sides of the board in the corner keys. I've decided to continue using this layout with my QMK Kinesis. + +The QWERTY layout shown here is based entirely on the Kinesis Advantage layout. The Colemak layout is merely an adaptation of that. + +I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar to the default Planck layouts. + +## Still to do: + + * Need to figure out a better position for the ESC key. + * Come up with a function for the empty keys shown in the alpha layers below. + * Fix the CapsLock, NumLock, and ScrLck LEDs. + +### Function Keys on All Layers (keypad toggles): + ,-----------------------------------------------------------------. + | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | + `-----------------------------------------------------------------' + ,-----------------------------------------------------------------. + | F9 | F10 | F11 | F12 | PScr | SLck | Paus | Keypad | RESET | + `-----------------------------------------------------------------' + +### Layer 0: Dvorak layer + + ,-------------------------------------------.,-------------------------------------------. + | ] | 1 | 2 | 3 | 4 | 5 || 6 | 7 | 8 | 9 | 0 | [ | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | Tab | ' | , | . | P | Y || F | G | C | R | L | \ | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | CapsLk | A | O | E | U | I || D | H | T | N | S | - | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | LShift | Z | X | C | V | X || B | M | W | V | Z | RShift | + `--------+------+------+------+------+------'`------+------+------+------+------+--------' + | ` | INS | Left | Rght | | Up | Dn | / | = | + `---------------------------' `---------------------------' + ,--------------.,--------------. + |Ctr/ESC| LAlt || RGUI |Ctr/ESC| + ,------|-------|------||------+-------+-------. + | | Del | Home || PgUp | Enter | | + | BkSp | / |------||------| / | Space | + | | Media | End || PgDn | KeyPd | | + `---------------------'`----------------------' + +### Layer 1: QWERTY layer + + ,-------------------------------------------.,-------------------------------------------. + | = | 1 | 2 | 3 | 4 | 5 || 6 | 7 | 8 | 9 | 0 | - | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | Tab | Q | W | E | R | T || Y | U | I | O | P | \ | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | CapsLk | A | S | D | F | G || H | J | K | L | ; | ' | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | LShift | Z | X | C | V | B || N | M | , | . | / | RShift | + `--------+------+------+------+------+------'`------+------+------+------+------+--------' + | ` | INS | Left | Rght | | Up | Dn | [ | ] | + `---------------------------' `---------------------------' + ,--------------.,--------------. + |Ctr/ESC| LAlt || RGUI |Ctr/ESC| + ,------|-------|------||------+-------+-------. + | | Del | Home || PgUp | Enter | | + | BkSp | / |------||------| / | Space | + | | Media | End || PgDn | KeyPd | | + `---------------------'`----------------------' + +### Keymap 2: Colemak layer + + ,-------------------------------------------.,-------------------------------------------. + | = | 1 | 2 | 3 | 4 | 5 || 6 | 7 | 8 | 9 | 0 | - | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | Tab | Q | W | F | P | G || J | L | U | Y | ; | \ | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | BkSpc | A | R | S | T | D || H | N | E | I | O | ' | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | LShift | Z | X | C | V | B || K | M | , | . | / | RShift | + `--------+------+------+------+------+------'`------+------+------+------+------+--------' + | ` | INS | Left | Rght | | Up | Dn | [ | ] | + `---------------------------' `---------------------------' + ,--------------.,--------------. + |Ctr/ESC| LAlt || RGUI |Ctr/ESC| + ,------|-------|------||------+-------+-------. + | | Del | Home || PgUp | Enter | | + | BkSp | / |------||------| / | Space | + | | Media | End || PgDn | KeyPd | | + `---------------------'`----------------------' + +### layer 3 : Media layer + + ,-------------------------------------------.,-------------------------------------------. + | F11 | F1 | F2 | F3 | F4 | F5 || F6 | F7 | F8 | F9 | F10 | F12 | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | | | | | | || | | | | | | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | | | | | | || | Mute | Vol- | Vol+ | | | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | | | | | | || Stop | Prev | Play | Next | Sel | | + `--------+------+------+------+------+------'`------+------+------+------+------+--------' + | | | | | | | | | | + `---------------------------' `---------------------------' + ,-------------.,-------------. + | | || | | + ,------|------|------||------+------+------. + | | | || | | | + | | |------||------| | | + | | | || | | | + `--------------------'`--------------------' + + + +### Keymap 4: Keypad layer + + ,-------------------------------------------.,-------------------------------------------. + | Power | | | | | || | NmLk | KP = | KP / | KP * | | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | Sleep | | | | | || | KP 7 | KP 8 | KP 9 | KP - | | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | Wake | | | | | || | KP 4 | KP 5 | KP 6 | KP + | | + |--------+------+------+------+------+------||------+------+------+------+------+--------| + | | |QWERTY|Colemk|Dvorak| || | KP 1 | KP 2 | KP 3 |KP Ent| | + `--------+------+------+------+------+------'`------+------+------+------+------+--------' + | | | | | | | | KP . |KP Ent| | + `---------------------------' `----------------------------------' + ,-------------.,-------------. + | | || | | + ,------|------|------||------+------+------. + | | | || | | | + | | |------||------| | KP 0 | + | | | || | | | + `--------------------'`--------------------' From 6fa6e6c4c6d772de6898bdd2ad303c5667339555 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Wed, 15 Feb 2017 23:01:27 -0800 Subject: [PATCH 026/117] Fixed inaccuracies in keymap comments and the readme. --- keyboards/kinesis/keymaps/xyverz/keymap.c | 4 ++-- keyboards/kinesis/keymaps/xyverz/readme.md | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/keyboards/kinesis/keymaps/xyverz/keymap.c b/keyboards/kinesis/keymaps/xyverz/keymap.c index b8e06fe305..f3184c140d 100644 --- a/keyboards/kinesis/keymaps/xyverz/keymap.c +++ b/keyboards/kinesis/keymaps/xyverz/keymap.c @@ -119,9 +119,9 @@ extern keymap_config_t keymap_config; |--------+------+------+------+------+------||------+------+------+------+------+--------| | Sleep | | | | | || | KP 7 | KP 8 | KP 9 | KP - | | |--------+------+------+------+------+------||------+------+------+------+------+--------| - | Wake | | | | | || | KP 4 | KP 5 | KP 6 | KP + | | + | Wake | |QWERTY|Colemk|Dvorak| || | KP 4 | KP 5 | KP 6 | KP + | | |--------+------+------+------+------+------||------+------+------+------+------+--------| - | | |QWERTY|Colemk|Dvorak| || | KP 1 | KP 2 | KP 3 |KP Ent| | + | | | | | | || | KP 1 | KP 2 | KP 3 |KP Ent| | `--------+------+------+------+------+------'`------+------+------+------+------+--------' | | | | | | | | KP . |KP Ent| | `---------------------------' `----------------------------------' diff --git a/keyboards/kinesis/keymaps/xyverz/readme.md b/keyboards/kinesis/keymaps/xyverz/readme.md index 3433a94c54..06cd674779 100644 --- a/keyboards/kinesis/keymaps/xyverz/readme.md +++ b/keyboards/kinesis/keymaps/xyverz/readme.md @@ -18,9 +18,9 @@ I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar t ,-----------------------------------------------------------------. | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | `-----------------------------------------------------------------' - ,-----------------------------------------------------------------. - | F9 | F10 | F11 | F12 | PScr | SLck | Paus | Keypad | RESET | - `-----------------------------------------------------------------' + ,-----------------------------------------------------------------. + | F9 | F10 | F11 | F12 | PScr | SLck | Paus | Keypad | RESET | + `-----------------------------------------------------------------' ### Layer 0: Dvorak layer @@ -115,9 +115,9 @@ I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar t |--------+------+------+------+------+------||------+------+------+------+------+--------| | Sleep | | | | | || | KP 7 | KP 8 | KP 9 | KP - | | |--------+------+------+------+------+------||------+------+------+------+------+--------| - | Wake | | | | | || | KP 4 | KP 5 | KP 6 | KP + | | + | Wake | |QWERTY|Colemk|Dvorak| || | KP 4 | KP 5 | KP 6 | KP + | | |--------+------+------+------+------+------||------+------+------+------+------+--------| - | | |QWERTY|Colemk|Dvorak| || | KP 1 | KP 2 | KP 3 |KP Ent| | + | | | | | | || | KP 1 | KP 2 | KP 3 |KP Ent| | `--------+------+------+------+------+------'`------+------+------+------+------+--------' | | | | | | | | KP . |KP Ent| | `---------------------------' `----------------------------------' From ca1ec7b121c973fae614e69093f40ee9ba25e629 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Thu, 16 Feb 2017 13:48:54 -0800 Subject: [PATCH 027/117] Fixed the TODO list. --- keyboards/kinesis/keymaps/xyverz/readme.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/keyboards/kinesis/keymaps/xyverz/readme.md b/keyboards/kinesis/keymaps/xyverz/readme.md index 06cd674779..11aedec54b 100644 --- a/keyboards/kinesis/keymaps/xyverz/readme.md +++ b/keyboards/kinesis/keymaps/xyverz/readme.md @@ -10,9 +10,7 @@ I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar t ## Still to do: - * Need to figure out a better position for the ESC key. - * Come up with a function for the empty keys shown in the alpha layers below. - * Fix the CapsLock, NumLock, and ScrLck LEDs. + * Implement the CapsLock, NumLock, and ScrLck LEDs on the off-chance that I decide to actually solder some to the keyboard. ### Function Keys on All Layers (keypad toggles): ,-----------------------------------------------------------------. From 5abe05147c5b3113327d5d40db0ee12d759c73d3 Mon Sep 17 00:00:00 2001 From: nstickney Date: Sun, 19 Feb 2017 21:25:35 -0600 Subject: [PATCH 028/117] familiar layout v0.1 from ErgoDox-EZ configurator --- keyboards/ergodox/keymaps/familiar/keymap.c | 111 ++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 keyboards/ergodox/keymaps/familiar/keymap.c diff --git a/keyboards/ergodox/keymaps/familiar/keymap.c b/keyboards/ergodox/keymaps/familiar/keymap.c new file mode 100644 index 0000000000..7cd81a87c5 --- /dev/null +++ b/keyboards/ergodox/keymaps/familiar/keymap.c @@ -0,0 +1,111 @@ +#include "ergodox.h" +#include "debug.h" +#include "action_layer.h" +#include "version.h" + + +#include "keymap_german.h" + +#include "keymap_nordic.h" + + + +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, // can always be here + EPRM, + VRSN, + RGB_SLD, + +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [0] = KEYMAP(KC_ESCAPE,KC_1,KC_2,KC_3,KC_4,KC_5,KC_MINUS,KC_DELETE,KC_Q,KC_W,KC_E,KC_R,KC_T,KC_HOME,KC_TAB,KC_A,KC_S,KC_D,KC_F,KC_G,KC_LSPO,KC_Z,KC_X,KC_C,KC_V,KC_B,KC_END,CTL_T(KC_LGUI),KC_APPLICATION,KC_GRAVE,KC_QUOTE,KC_BSLASH,KC_AUDIO_VOL_DOWN,KC_AUDIO_VOL_UP,KC_AUDIO_MUTE,ALT_T(KC_SPACE),MO(1),KC_RALT,KC_KP_PLUS,KC_6,KC_7,KC_8,KC_9,KC_0,KC_PSCREEN,KC_PGUP,KC_Y,KC_U,KC_I,KC_O,KC_P,KC_BSPACE,KC_H,KC_J,KC_K,KC_L,KC_SCOLON,KC_ENTER,KC_PGDOWN,KC_N,KC_M,KC_COMMA,KC_DOT,KC_KP_SLASH,KC_RSPC,KC_LBRACKET,KC_RBRACKET,KC_TRANSPARENT,KC_APPLICATION,CTL_T(KC_RGUI),KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_RALT,MO(1),ALT_T(KC_SPACE)), + + [1] = KEYMAP(M(0),KC_F1,KC_F2,KC_F3,KC_F4,KC_F5,KC_F11,KC_PAUSE,KC_TRANSPARENT,KC_TRANSPARENT,KC_UP,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_LEFT,KC_DOWN,KC_RIGHT,KC_TRANSPARENT,KC_TRANSPARENT,KC_MEDIA_PREV_TRACK,KC_MEDIA_STOP,KC_MEDIA_PLAY_PAUSE,KC_MEDIA_NEXT_TRACK,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_F12,KC_F6,KC_F7,KC_F8,KC_F9,KC_F10,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_INSERT,KC_LEFT,KC_DOWN,KC_UP,KC_RIGHT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT), + +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_TAP_TOGGLE(1) +}; + +// leaving this in place for compatibilty with old keymaps cloned and re-compiled. +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch(id) { + case 0: + if (record->event.pressed) { + SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); + } + break; + } + return MACRO_NONE; +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + // dynamically generate these. + case EPRM: + if (record->event.pressed) { + eeconfig_init(); + } + return false; + break; + case VRSN: + if (record->event.pressed) { + SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); + } + return false; + break; + case RGB_SLD: + if (record->event.pressed) { + rgblight_mode(1); + } + return false; + break; + + } + return true; +} + +void matrix_scan_user(void) { + + uint8_t layer = biton32(layer_state); + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (layer) { + case 1: + ergodox_right_led_1_on(); + break; + case 2: + ergodox_right_led_2_on(); + break; + case 3: + ergodox_right_led_3_on(); + break; + case 4: + ergodox_right_led_1_on(); + ergodox_right_led_2_on(); + break; + case 5: + ergodox_right_led_1_on(); + ergodox_right_led_3_on(); + break; + case 6: + ergodox_right_led_2_on(); + ergodox_right_led_3_on(); + break; + case 7: + ergodox_right_led_1_on(); + ergodox_right_led_2_on(); + ergodox_right_led_3_on(); + break; + default: + break; + } + +}; From 9b40dd796ea2aae9f342dc4d9e7d431d8448e1b9 Mon Sep 17 00:00:00 2001 From: nstickney Date: Thu, 23 Feb 2017 21:13:45 -0600 Subject: [PATCH 029/117] familiar layout graphics, etc --- keyboards/ergodox/keymaps/familiar/HNTR.svg | 7253 ++++++++++++++++ .../ergodox/keymaps/familiar/familiar.json | 865 ++ .../ergodox/keymaps/familiar/familiar.png | Bin 0 -> 102059 bytes .../ergodox/keymaps/familiar/familiar.svg | 7131 ++++++++++++++++ .../keymaps/familiar/familiar_stick.svg | 7592 +++++++++++++++++ keyboards/ergodox/keymaps/familiar/hntr.json | 634 ++ keyboards/ergodox/keymaps/familiar/hntr.png | Bin 0 -> 77473 bytes 7 files changed, 23475 insertions(+) create mode 100644 keyboards/ergodox/keymaps/familiar/HNTR.svg create mode 100644 keyboards/ergodox/keymaps/familiar/familiar.json create mode 100644 keyboards/ergodox/keymaps/familiar/familiar.png create mode 100644 keyboards/ergodox/keymaps/familiar/familiar.svg create mode 100644 keyboards/ergodox/keymaps/familiar/familiar_stick.svg create mode 100644 keyboards/ergodox/keymaps/familiar/hntr.json create mode 100644 keyboards/ergodox/keymaps/familiar/hntr.png diff --git a/keyboards/ergodox/keymaps/familiar/HNTR.svg b/keyboards/ergodox/keymaps/familiar/HNTR.svg new file mode 100644 index 0000000000..a419e7ab8b --- /dev/null +++ b/keyboards/ergodox/keymaps/familiar/HNTR.svg @@ -0,0 +1,7253 @@ + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PanningHold down Scroll Wheel to pan with mouseUp/Down - Scroll WheelLeft/Right - Shift + Scroll WheelZooming- Ctrl + Scroll View to zoom in/out- Press 1, 2, 4, or 5 for preset zoom views.Zoom Tool (F3) :- Left click to zoom in- Right click to zoom out + + + Keyboards + + + + + + + + + To avoid delays and errors in your order you must convert all of your fonts and text to vector data + This layout is used for your legends only. Keycap colors need to be defined with the online designer tool.Please check out our online tutorials at support.wasdkeyboards.comfor help and instructions regarding layout creation. + + + Quick Start:1. Enable Layers by going to: Layer > Layers (Ctrl + Shift + L) *The layers window can be expanded by dragging the area under the opacity slider.2. Use the Eyeball Icons to toggle visibility for preset layers3. Use the Select tool to move and scale objects (F1)4. Use the Text Tool to add and edit text (F8) + + Managing Layers1. Enable Layers by pressing Ctrl + Shift + L2. The Layer window can be enlarged by dragging thearea under the Opacity slider.3. Use the Eyeball Icon to toggle layer visibility.4. Use the Lock Icon to toggle the ability to edit layer.5. To add a layer, use the button from Layers panel. + + + Manipulating ObjectsThe Select Tool (F1) allows you to select and move,scale, and delete objects. Select an object, then drag the object to move it. You can drag the arrows around the object to scale it.Holding Ctrl while moving will keep the object locked onthe same X or Y axis. Holding Ctrl while scaling will keep the size ratio locked. + Inkscape Tutorial + FAQ (Frequently Asked Questions)I can't see any layers, I just see one layer or no layers when I open the layers panel.This happens when you drag and drop the layout file into Inkscape which "imports" it instead of opening it. Please close your Inkscape window, go back to the original file, right click it and choose "edit with Inkscape". What are the grids for on the layout? Can I place objects outside the grid?Yes. The grids are for reference only. You can snap the grids to use our standard margins. You can print all the way to the edge of the frame. There is a +/-0.01" tolerance, so we suggest that you stay within the grids when possible.Can I put a graphic that spans over multiple keys? Yes. Large images will be cropped to the top face of the keys. The areas in between the keys will not be printed.Advanced users can use a clipping mask to get a better idea of what the final image will look like.How can I change the color of the printing?We have tutorials in our support center that can show you how to add colors to your text and images.Go to support.wasdkeyboards.comI want to edit the Mac-style layouts, but the text is not editable.The Mac layout text is not editable since the font is not common. The font used is VAG Rounded-Light. + Adding text1. Click on the Text Tool (F8)2. Click on the area where you want add text3. Type your text4. Font and size and can changed in the text toolbar5. Use the Select Tool (F1) to reposition thetext if necessary. + + + + Editing font type and size1. Use the Select Tool (F1) select the objects youwant to edit.2. Click on the Text Tool (F8)3. Use the text toolbar to change font type and text size + + + + + Editing textUse the Select Tool (F1) and double click a singletext object.-or-Use the Text Tool (F8) and click on a single text object. + + + + Adding stock artworkCommonly used icons and symbols are available within the file.1. Turn on the visibility of the layer titled: "Stock Artwork"2. Use the Select Tool (F1) to select the object you want to use.3. Press Ctrl + C to copy4. Select the layer you want to paste the object to, then press Ctrl + V5. You can then use the Select Tool (F1) to move and/or scale the object to proper size. See "Snapping" for tips on aligning objects. + Adding custom artNormal graphics can be added into the file, but you must convert thegraphic to a path.1. Copy the graphic from another program. (Usually Right Click > Copy)2. Select the layer you want to paste the graphic to, then press Ctrl + V-or-1. File > Import (Ctrl + I) and select the file you want to import.2. Select the Embed option and click OK.3. Select the graphic, and goto Path > Trace Bitmap (Shift + Alt + B)4. Make sure your graphic is selected, then select a Scan option andclick OK. The graphic will be traced, and will overlay the original object.5. Move the new object into position and delete the original image. + + + SnappingEnabling snapping allows you to snap objects at various reference points of other objects which will allow you to quickly and accurately align objects to each other.Make sure Snap Controls Toolbar is displayed on the right hand side. (View > Show/Hide > Snap Controls Bar)Make sure Snapping is enabled (Toggle with "%")Hover over the various points to see what snappingare available. You can turn each one on/off.Drag objects over other objects to snap. You may need to zoom in or out to snap to certain objects. Turning off irrelevant points will also make it easier to snap. + + Copy and PasteCtrl + C: Copy objectCtrl + V: Paste objectCtrl + Alt + V: Paste in placeShift + Ctrl + V: Paste style + Guide LinesYou can use Guides to help align objects. Click and drag from the rulerson the edge of the document.Enable snapping to guides in the Snap Control Bar You can Show/Hide Guides by going to View > Guides + + + WASD Keyboards 104/87-Key Design Template + IMPORTANT: + Before saving and uploading your file: select all of your text; go to Path > Object to Path (Ctrl+Shift+C) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 😎 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/keyboards/ergodox/keymaps/familiar/familiar.json b/keyboards/ergodox/keymaps/familiar/familiar.json new file mode 100644 index 0000000000..e80f99e5f0 --- /dev/null +++ b/keyboards/ergodox/keymaps/familiar/familiar.json @@ -0,0 +1,865 @@ +[ + { + "name": "ErgoDox Familiar (CosmicStick Colors)", + "author": "Stick" + }, + [ + { + "x": 3.5, + "c": "#FFF8E7", + "t": "#403e3a", + "fa": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 7, + 0 + ] + }, + "\n\n#\nF3\n\n\n³\n\n\n3", + { + "x": 10.5, + "fa": [ + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 7, + 0 + ] + }, + "*\nF8\n\n\n\n\n\n¾\n\n8" + ], + [ + { + "y": -0.87, + "x": 2.5 + }, + "\n\n@\nF2\n\n\n²\n\n\n2", + { + "x": 1, + "fa": [ + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 7, + 0 + ] + }, + "¤\n\n$\nF4\n\n\n£\n\n\n4", + { + "x": 8.5, + "fa": [ + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 7, + 0 + ] + }, + "&\nF7\n\n\n\n\n\n½\n\n7", + { + "x": 1 + }, + "(\nF9\n\n\n\n\n\n‘\n\n9" + ], + [ + { + "y": -0.8699999999999999, + "x": 5.5 + }, + "\n\n%\nF5\n\n\n€\n\n\n5", + "\n\n_\nF11\n\n\n¥\n\n\n-", + { + "x": 4.5, + "fa": [ + 0, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 7, + 0 + ] + }, + "+\nF12\n÷\n\n\n\n\n×\n\n=", + "^\nF6\n\n\n\n\n\n¼\n\n6" + ], + [ + { + "y": -0.88, + "c": "#605d57", + "t": "#FFF8E7", + "a": 7, + "w": 1.5 + }, + "ESCAPE", + { + "c": "#FFF8E7", + "t": "#403e3a", + "a": 4, + "fa": [ + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 7, + 0 + ] + }, + "¡\n\n!\nF1\n\n\n¹\n\n\n1", + { + "x": 14.5, + "fa": [ + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 7, + 0 + ] + }, + ")\nF10\n\n/\n\n\n\n’\n\n0", + { + "c": "#605d57", + "t": "#FFF8E7", + "a": 7, + "w": 1.5 + }, + "SYSREQ" + ], + [ + { + "y": -0.3799999999999999, + "x": 3.5, + "c": "#993300", + "a": 4 + }, + "\n\n\n↑\n\n\né\n\n\nE", + { + "x": 10.5, + "c": "#FFF8E7", + "t": "#403e3a" + }, + "\n\n\n5\n\n\n\ní\n\nI" + ], + [ + { + "y": -0.8700000000000001, + "x": 2.5, + "a": 6, + "fa": [ + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 7 + ] + }, + "å\n\n\n\n\n\n\n\nW", + { + "x": 1 + }, + "®\n\n\n\n\n\n\n\nR", + { + "x": 8.5, + "a": 4, + "fa": [ + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 7, + 7, + 0 + ] + }, + "\n\n\n4\n\n\n\nú\n\nU", + { + "x": 1 + }, + "\n\n\n6\n\n\n\nó\n\nO" + ], + [ + { + "y": -0.8699999999999999, + "x": 5.5, + "a": 6 + }, + "þ\n\n\n\n\n\n\n\nT", + { + "c": "#605d57", + "t": "#FFF8E7", + "a": 7, + "f": 3, + "h": 1.5 + }, + "HOME", + { + "x": 4.5, + "f": 3, + "h": 1.5 + }, + "PAGE UP", + { + "c": "#FFF8E7", + "t": "#403e3a", + "a": 6, + "fa": [ + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 7 + ] + }, + "\n\nü\n\n\n\n\n\nY" + ], + [ + { + "y": -0.8799999999999999, + "c": "#605d57", + "t": "#FFF8E7", + "a": 4, + "w": 1.5 + }, + "\n\n\nBREAK\n\n\n\n\n\nDELETE", + { + "c": "#FFF8E7", + "t": "#403e3a", + "a": 6 + }, + "ä\n\n\n\n\n\n\n\nQ", + { + "x": 14.5, + "a": 4, + "fa": [ + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 7, + 7, + 0 + ] + }, + "\n\n\n×\n\n\n\nö\n\nP", + { + "c": "#605d57", + "t": "#FFF8E7", + "fa": [ + 1, + 1 + ], + "w": 1.5 + }, + "\nINSERT\n\n\n\n\n\n\n\nBCKSPC" + ], + [ + { + "y": -0.3799999999999999, + "x": 3.5, + "c": "#993300", + "fa": [ + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 7, + 0 + ] + }, + "Ð\n\n\n↓\n\n\nð\n\n\nD", + { + "x": 10.5, + "c": "#FFF8E7", + "t": "#403e3a" + }, + "\n\n\n2\n\n\n\n\n\nK" + ], + [ + { + "y": -0.8700000000000001, + "x": 2.5, + "c": "#993300", + "t": "#FFF8E7" + }, + "§\n\n\n←\n\n\nß\n\n\nS", + { + "x": 1 + }, + "\n\n\n→\n\n\n\n\n\nF", + { + "x": 8.5, + "c": "#FFF8E7", + "t": "#403e3a" + }, + "\n\n\n1\n\n\n\n\n\nJ", + { + "x": 1, + "fa": [ + 1, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 7, + 0 + ] + }, + "\n\n\n3\n\n\n\nø\n\nL" + ], + [ + { + "y": -0.8799999999999999, + "x": 5.5, + "a": 7, + "fa": [ + 7 + ] + }, + "G", + { + "x": 6.5 + }, + "H" + ], + [ + { + "y": -0.8700000000000001, + "c": "#605d57", + "t": "#FFF8E7", + "f": 3, + "w": 1.5 + }, + "TAB", + { + "c": "#FFF8E7", + "t": "#403e3a", + "a": 6, + "fa": [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 7 + ] + }, + "á\n\n\n\n\n\n\n\nA", + { + "x": 14.5, + "a": 4, + "fa": [ + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 7, + 7, + 0 + ] + }, + ":\n\n°\n-\n\n\n\n¶\n\n;", + { + "c": "#605d57", + "t": "#FFF8E7", + "a": 7, + "w": 1.5 + }, + "ENTER" + ], + [ + { + "y": -0.6299999999999999, + "x": 6.5, + "h": 1.5 + }, + "END", + { + "x": 4.5, + "h": 1.5 + }, + "PAGE DOWN" + ], + [ + { + "y": -0.75, + "x": 3.5, + "c": "#FFF8E7", + "t": "#403e3a", + "a": 4, + "fa": [ + 1, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 7, + 7, + 0 + ] + }, + "¢\n\n\n\n\n\n©\n\n\nC", + { + "x": 10.5, + "fa": [ + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 7, + 7, + 0 + ] + }, + "<\n\n\n0\n\n\n\nç\n\n," + ], + [ + { + "y": -0.8700000000000001, + "x": 2.5, + "a": 7, + "fa": [ + 7 + ] + }, + "X", + { + "x": 1 + }, + "V", + { + "x": 8.5, + "a": 6, + "fa": [ + 7, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 7 + ] + }, + "\n\nµ\n\n\n\n\n\nM", + { + "x": 1, + "a": 4, + "fa": [ + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 7, + 7, + 0 + ] + }, + ">\n\n\n\n\n\n\n\n\n." + ], + [ + { + "y": -0.8799999999999999, + "x": 5.5, + "a": 7, + "fa": [ + 7 + ] + }, + "B", + { + "x": 6.5, + "a": 6, + "fa": [ + 7, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 7 + ] + }, + "\n\nñ\n\n\n\n\n\nN" + ], + [ + { + "y": -0.8700000000000001, + "c": "#403e3a", + "t": "#FFF8E7", + "a": 5, + "fa": [ + 1, + 0, + 1, + 0, + 0, + 0, + 7 + ], + "w": 1.5 + }, + "SHIFT\n\n\n\n\n\n(", + { + "c": "#FFF8E7", + "t": "#403e3a", + "a": 6, + "fa": [ + 1, + 0, + 1, + 0, + 0, + 0, + 7, + 0, + 7 + ] + }, + "æ\n\n\n\n\n\n\n\nZ", + { + "x": 14.5, + "a": 4, + "fa": [ + 0, + 0, + 1, + 1, + 0, + 0, + 7, + 1, + 7, + 7, + 0 + ] + }, + "?\n\n\n+\n\n\n\n¿\n\n/", + { + "c": "#403e3a", + "t": "#FFF8E7", + "a": 5, + "fa": [ + 1, + 0, + 1, + 1, + 0, + 0, + 7 + ], + "w": 1.5 + }, + "SHIFT\n\n\n\n\n\n)" + ], + [ + { + "y": -0.3799999999999999, + "x": 3.5, + "c": "#FFF8E7", + "t": "#403e3a", + "a": 4, + "fa": [ + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 7, + 0 + ] + }, + "¨\n\n\"\n\n\n\n´\n\n\n'", + { + "x": 10.5, + "fa": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 7, + 0 + ] + }, + "}\n\n\n\n\n\n\n»\n\n]" + ], + [ + { + "y": -0.8700000000000001, + "x": 2.5 + }, + "\n\n~\n\n\n\n\n\n\n`", + { + "x": 1, + "fa": [ + 1, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 7, + 0 + ] + }, + "¦\n\n|\n\n\n\n¬\n\n\n\\", + { + "x": 8.5, + "fa": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 0, + 7, + 0 + ] + }, + "{\n\n\n\n\n\n\n«\n\n[", + { + "x": 1, + "c": "#605d57", + "t": "#FFF8E7", + "a": 7 + }, + "PRNT SCRN" + ], + [ + { + "y": -0.75, + "x": 0.5, + "c": "#006699", + "a": 4, + "fa": [ + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 1, + 1 + ] + }, + "\n\n\nFLASH\n\n\n\n\nCTRL\nGUI", + { + "c": "#403e3a", + "a": 5, + "fa": [ + 1 + ] + }, + "CTL+SFT\n\n\n\n\n\nMENU", + { + "x": 14.5 + }, + "CTL+SFT\n\n\n\n\n\nMENU", + { + "c": "#006699", + "a": 4, + "fa": [ + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ] + }, + "\nFLASH\n\n\n\n\n\n\nCTRL\nGUI" + ], + [ + { + "r": 30, + "rx": 6.5, + "ry": 4.25, + "y": -1, + "x": 1, + "c": "#605d57", + "fa": [ + 1, + 1, + 0, + 1 + ] + }, + "\n\n\nKBDBRT-\n\n\n\n\n\nVOL-", + "\n\n\nKBDBRT+\n\n\n\n\n\nVOL+" + ], + [ + { + "c": "#FFF8E7", + "t": "#403e3a", + "a": 5, + "h": 2 + }, + "ALT", + { + "c": "#403e3a", + "t": "#FFF8E7", + "a": 7, + "f": 3, + "h": 2 + }, + "FN", + { + "c": "#605d57", + "f": 3 + }, + "MUTE" + ], + [ + { + "x": 2, + "c": "#403e3a", + "a": 5 + }, + "ALTGR\n\n\n\n\n\nLDR" + ], + [ + { + "r": -30, + "rx": 13, + "y": -1, + "x": -3, + "c": "#605d57", + "a": 4 + }, + "\n\n\nKBDBRT-\n\n\n\n\n\nBRT-", + "\n\n\nKBDBRT+\n\n\n\n\n\nBRT+" + ], + [ + { + "x": -3, + "a": 7, + "f": 3 + }, + "NUM LOCK", + { + "c": "#403e3a", + "f": 3, + "h": 2 + }, + "FN", + { + "c": "#FFF8E7", + "t": "#403e3a", + "a": 5, + "h": 2 + }, + "ALT" + ], + [ + { + "x": -3, + "c": "#403e3a", + "t": "#FFF8E7" + }, + "ALTGR\n\n\n\n\n\nLDR" + ] +] \ No newline at end of file diff --git a/keyboards/ergodox/keymaps/familiar/familiar.png b/keyboards/ergodox/keymaps/familiar/familiar.png new file mode 100644 index 0000000000000000000000000000000000000000..4d61846eb89d9a8f0a0cfde1359de0338e2735db GIT binary patch literal 102059 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

B%HJA2E3M=!)Og z-5GsL*S_5H?&6JeW#@aJ7Drz_m{+~y!fv5wLR&VjH<>Cs`}#Ss@<$eFdA9 z+zvE6ExGi7LE7qFal=!FZo7o9eyTlFCnSiv?%~l{vSDlTt10m-yv5I3S21mwDd^7d zk#UWY@qyC1x4XXjtbEmB;NK<6Sbys3%V3?&KMri>C`{=2q35@~Z_Dcm%dX|$SkZjI zciMruJ=KD%#kTIybL9zt6Sljlb?XX&7l9A2lx>SRI@f zTTjIB&0g(1`Boi80pkt(zdXAmbNr*xtku__|F>K5ebKq(YpmO)`>%J;V%S!)CgNjP z>Zz+4`g|YX{oQ1{s`~por8pj0E0bH^pZ<7owg?(#B*!yKX8)dJR<>mBwZD%ulP@3Z zTdjT!w6R&Q$HPCvrJ~&GLckFY8G$INfVoB6w3pn-<^SGp_&#nTbIvFJ4FU#!^VePc zeKOej(oxA*rnZJr?`2!v*^cyNuY0+^?$hJCzQ?I89l>ueUvZo}S@xqvgvWty7J=zW z4*%<31uZttU-BT`=}x!)e!DgMemZ-=iesS8P;Rz1n*Drgok#jX1WL zSKFt)x%9H8yx8&i-esx1O&kt8q^--=Xr0(^x@c`kNA<^-`~KcKy=L+rZJ(L1Hm*y( zT<|?&ZKSM_0;5pD^oFw=Cn&Y;zENo^q|j*Q(4f>-E-g7vq@e#iv}rW$^xuX5!(O^R zTwAj8d*0?vX^t!kPH*n*_5S+)@@7}F8(O7XRz*#nI`y=ePDRm%iU|$AhwnC)187GNzDep(>0* z3XKwi9jzUV%KU7K!39TGT&#!`QeZqUe4t4@TI_?qcap$?B>v)XXXj=qqlyV3zmk#{ z-`cmg<=xlLi!EzXC76zVTgfT>DYX6D+ovmPr~VH0^6L7M+f~eYrF2X0T6V3ay>D1n znXL8#r6xV0hTL9;*Je3yI&2IRwj36?v%6e>uVGA%eq0xehk_x8gx;M9i-N)l61i#X zRG%4~iPzX${XOjQ@&4!Hua0E9U9;$5u<7&i_P#n%+5L%lj`73e%UIs18QfA#O6XZ+ z?#5)Mu-b=7ML?8suWyilg0B*r%Uv-q7bUiJTMHgKf%aJj{@A>Eb0)(!ml^vfGjOV~ zHug%JcXe3T|EmcN37H~t{z$t5BPj8F5Mazr&Q^}jgreKdQSuZIO>b^|(T!q_G8h7FW;96-T`%;0ovP;zrJ z5!UuZmjSC1Y_7#H4P=FaB1gaxkB+n?Rgl{-l(-zZu=D8o*wU+^lDj5wfYKwV$YDTX zRP-IVxjFsn%gf7O-;%Yjt8q?Fe*9$38lCf@lSGxkfd>gf1lhRQy?<4oto6Dqc99Rq zPMkS&=EbF@+$S-O28lGJb6mM{WyP&qw|3pzTU{zHaD{aJv}o{Vys$zW)5r&(9?l7Qg+< zZ)b?&DUi(!oE2>jQBhH`Sy``U+g5#rzvY2_oHKpJ>KGUp7(8A5T-G@yGywns C`n_xb literal 0 HcmV?d00001 diff --git a/keyboards/ergodox/keymaps/familiar/img/HNTR.svg b/keyboards/ergodox/keymaps/familiar/img/HNTR.svg deleted file mode 100644 index a419e7ab8b..0000000000 --- a/keyboards/ergodox/keymaps/familiar/img/HNTR.svg +++ /dev/null @@ -1,7253 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PanningHold down Scroll Wheel to pan with mouseUp/Down - Scroll WheelLeft/Right - Shift + Scroll WheelZooming- Ctrl + Scroll View to zoom in/out- Press 1, 2, 4, or 5 for preset zoom views.Zoom Tool (F3) :- Left click to zoom in- Right click to zoom out - - - Keyboards - - - - - - - - - To avoid delays and errors in your order you must convert all of your fonts and text to vector data - This layout is used for your legends only. Keycap colors need to be defined with the online designer tool.Please check out our online tutorials at support.wasdkeyboards.comfor help and instructions regarding layout creation. - - - Quick Start:1. Enable Layers by going to: Layer > Layers (Ctrl + Shift + L) *The layers window can be expanded by dragging the area under the opacity slider.2. Use the Eyeball Icons to toggle visibility for preset layers3. Use the Select tool to move and scale objects (F1)4. Use the Text Tool to add and edit text (F8) - - Managing Layers1. Enable Layers by pressing Ctrl + Shift + L2. The Layer window can be enlarged by dragging thearea under the Opacity slider.3. Use the Eyeball Icon to toggle layer visibility.4. Use the Lock Icon to toggle the ability to edit layer.5. To add a layer, use the button from Layers panel. - - - Manipulating ObjectsThe Select Tool (F1) allows you to select and move,scale, and delete objects. Select an object, then drag the object to move it. You can drag the arrows around the object to scale it.Holding Ctrl while moving will keep the object locked onthe same X or Y axis. Holding Ctrl while scaling will keep the size ratio locked. - Inkscape Tutorial - FAQ (Frequently Asked Questions)I can't see any layers, I just see one layer or no layers when I open the layers panel.This happens when you drag and drop the layout file into Inkscape which "imports" it instead of opening it. Please close your Inkscape window, go back to the original file, right click it and choose "edit with Inkscape". What are the grids for on the layout? Can I place objects outside the grid?Yes. The grids are for reference only. You can snap the grids to use our standard margins. You can print all the way to the edge of the frame. There is a +/-0.01" tolerance, so we suggest that you stay within the grids when possible.Can I put a graphic that spans over multiple keys? Yes. Large images will be cropped to the top face of the keys. The areas in between the keys will not be printed.Advanced users can use a clipping mask to get a better idea of what the final image will look like.How can I change the color of the printing?We have tutorials in our support center that can show you how to add colors to your text and images.Go to support.wasdkeyboards.comI want to edit the Mac-style layouts, but the text is not editable.The Mac layout text is not editable since the font is not common. The font used is VAG Rounded-Light. - Adding text1. Click on the Text Tool (F8)2. Click on the area where you want add text3. Type your text4. Font and size and can changed in the text toolbar5. Use the Select Tool (F1) to reposition thetext if necessary. - - - - Editing font type and size1. Use the Select Tool (F1) select the objects youwant to edit.2. Click on the Text Tool (F8)3. Use the text toolbar to change font type and text size - - - - - Editing textUse the Select Tool (F1) and double click a singletext object.-or-Use the Text Tool (F8) and click on a single text object. - - - - Adding stock artworkCommonly used icons and symbols are available within the file.1. Turn on the visibility of the layer titled: "Stock Artwork"2. Use the Select Tool (F1) to select the object you want to use.3. Press Ctrl + C to copy4. Select the layer you want to paste the object to, then press Ctrl + V5. You can then use the Select Tool (F1) to move and/or scale the object to proper size. See "Snapping" for tips on aligning objects. - Adding custom artNormal graphics can be added into the file, but you must convert thegraphic to a path.1. Copy the graphic from another program. (Usually Right Click > Copy)2. Select the layer you want to paste the graphic to, then press Ctrl + V-or-1. File > Import (Ctrl + I) and select the file you want to import.2. Select the Embed option and click OK.3. Select the graphic, and goto Path > Trace Bitmap (Shift + Alt + B)4. Make sure your graphic is selected, then select a Scan option andclick OK. The graphic will be traced, and will overlay the original object.5. Move the new object into position and delete the original image. - - - SnappingEnabling snapping allows you to snap objects at various reference points of other objects which will allow you to quickly and accurately align objects to each other.Make sure Snap Controls Toolbar is displayed on the right hand side. (View > Show/Hide > Snap Controls Bar)Make sure Snapping is enabled (Toggle with "%")Hover over the various points to see what snappingare available. You can turn each one on/off.Drag objects over other objects to snap. You may need to zoom in or out to snap to certain objects. Turning off irrelevant points will also make it easier to snap. - - Copy and PasteCtrl + C: Copy objectCtrl + V: Paste objectCtrl + Alt + V: Paste in placeShift + Ctrl + V: Paste style - Guide LinesYou can use Guides to help align objects. Click and drag from the rulerson the edge of the document.Enable snapping to guides in the Snap Control Bar You can Show/Hide Guides by going to View > Guides - - - WASD Keyboards 104/87-Key Design Template - IMPORTANT: - Before saving and uploading your file: select all of your text; go to Path > Object to Path (Ctrl+Shift+C) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 😎 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/keyboards/ergodox/keymaps/familiar/img/familiar.json b/keyboards/ergodox/keymaps/familiar/img/familiar.json deleted file mode 100644 index e80f99e5f0..0000000000 --- a/keyboards/ergodox/keymaps/familiar/img/familiar.json +++ /dev/null @@ -1,865 +0,0 @@ -[ - { - "name": "ErgoDox Familiar (CosmicStick Colors)", - "author": "Stick" - }, - [ - { - "x": 3.5, - "c": "#FFF8E7", - "t": "#403e3a", - "fa": [ - 0, - 0, - 0, - 1, - 0, - 0, - 1, - 0, - 0, - 7, - 0 - ] - }, - "\n\n#\nF3\n\n\n³\n\n\n3", - { - "x": 10.5, - "fa": [ - 0, - 1, - 0, - 1, - 0, - 0, - 1, - 1, - 0, - 7, - 0 - ] - }, - "*\nF8\n\n\n\n\n\n¾\n\n8" - ], - [ - { - "y": -0.87, - "x": 2.5 - }, - "\n\n@\nF2\n\n\n²\n\n\n2", - { - "x": 1, - "fa": [ - 1, - 1, - 0, - 1, - 0, - 0, - 1, - 1, - 0, - 7, - 0 - ] - }, - "¤\n\n$\nF4\n\n\n£\n\n\n4", - { - "x": 8.5, - "fa": [ - 0, - 1, - 0, - 1, - 0, - 0, - 1, - 1, - 0, - 7, - 0 - ] - }, - "&\nF7\n\n\n\n\n\n½\n\n7", - { - "x": 1 - }, - "(\nF9\n\n\n\n\n\n‘\n\n9" - ], - [ - { - "y": -0.8699999999999999, - "x": 5.5 - }, - "\n\n%\nF5\n\n\n€\n\n\n5", - "\n\n_\nF11\n\n\n¥\n\n\n-", - { - "x": 4.5, - "fa": [ - 0, - 1, - 1, - 1, - 0, - 0, - 1, - 1, - 0, - 7, - 0 - ] - }, - "+\nF12\n÷\n\n\n\n\n×\n\n=", - "^\nF6\n\n\n\n\n\n¼\n\n6" - ], - [ - { - "y": -0.88, - "c": "#605d57", - "t": "#FFF8E7", - "a": 7, - "w": 1.5 - }, - "ESCAPE", - { - "c": "#FFF8E7", - "t": "#403e3a", - "a": 4, - "fa": [ - 1, - 1, - 0, - 1, - 0, - 0, - 1, - 1, - 0, - 7, - 0 - ] - }, - "¡\n\n!\nF1\n\n\n¹\n\n\n1", - { - "x": 14.5, - "fa": [ - 0, - 1, - 0, - 1, - 0, - 0, - 1, - 1, - 0, - 7, - 0 - ] - }, - ")\nF10\n\n/\n\n\n\n’\n\n0", - { - "c": "#605d57", - "t": "#FFF8E7", - "a": 7, - "w": 1.5 - }, - "SYSREQ" - ], - [ - { - "y": -0.3799999999999999, - "x": 3.5, - "c": "#993300", - "a": 4 - }, - "\n\n\n↑\n\n\né\n\n\nE", - { - "x": 10.5, - "c": "#FFF8E7", - "t": "#403e3a" - }, - "\n\n\n5\n\n\n\ní\n\nI" - ], - [ - { - "y": -0.8700000000000001, - "x": 2.5, - "a": 6, - "fa": [ - 1, - 1, - 0, - 1, - 0, - 0, - 1, - 1, - 7 - ] - }, - "å\n\n\n\n\n\n\n\nW", - { - "x": 1 - }, - "®\n\n\n\n\n\n\n\nR", - { - "x": 8.5, - "a": 4, - "fa": [ - 1, - 1, - 0, - 1, - 0, - 0, - 1, - 1, - 7, - 7, - 0 - ] - }, - "\n\n\n4\n\n\n\nú\n\nU", - { - "x": 1 - }, - "\n\n\n6\n\n\n\nó\n\nO" - ], - [ - { - "y": -0.8699999999999999, - "x": 5.5, - "a": 6 - }, - "þ\n\n\n\n\n\n\n\nT", - { - "c": "#605d57", - "t": "#FFF8E7", - "a": 7, - "f": 3, - "h": 1.5 - }, - "HOME", - { - "x": 4.5, - "f": 3, - "h": 1.5 - }, - "PAGE UP", - { - "c": "#FFF8E7", - "t": "#403e3a", - "a": 6, - "fa": [ - 1, - 1, - 1, - 1, - 0, - 0, - 1, - 1, - 7 - ] - }, - "\n\nü\n\n\n\n\n\nY" - ], - [ - { - "y": -0.8799999999999999, - "c": "#605d57", - "t": "#FFF8E7", - "a": 4, - "w": 1.5 - }, - "\n\n\nBREAK\n\n\n\n\n\nDELETE", - { - "c": "#FFF8E7", - "t": "#403e3a", - "a": 6 - }, - "ä\n\n\n\n\n\n\n\nQ", - { - "x": 14.5, - "a": 4, - "fa": [ - 1, - 1, - 1, - 1, - 0, - 0, - 1, - 1, - 7, - 7, - 0 - ] - }, - "\n\n\n×\n\n\n\nö\n\nP", - { - "c": "#605d57", - "t": "#FFF8E7", - "fa": [ - 1, - 1 - ], - "w": 1.5 - }, - "\nINSERT\n\n\n\n\n\n\n\nBCKSPC" - ], - [ - { - "y": -0.3799999999999999, - "x": 3.5, - "c": "#993300", - "fa": [ - 1, - 1, - 0, - 1, - 0, - 0, - 1, - 0, - 0, - 7, - 0 - ] - }, - "Ð\n\n\n↓\n\n\nð\n\n\nD", - { - "x": 10.5, - "c": "#FFF8E7", - "t": "#403e3a" - }, - "\n\n\n2\n\n\n\n\n\nK" - ], - [ - { - "y": -0.8700000000000001, - "x": 2.5, - "c": "#993300", - "t": "#FFF8E7" - }, - "§\n\n\n←\n\n\nß\n\n\nS", - { - "x": 1 - }, - "\n\n\n→\n\n\n\n\n\nF", - { - "x": 8.5, - "c": "#FFF8E7", - "t": "#403e3a" - }, - "\n\n\n1\n\n\n\n\n\nJ", - { - "x": 1, - "fa": [ - 1, - 1, - 0, - 1, - 0, - 0, - 1, - 1, - 0, - 7, - 0 - ] - }, - "\n\n\n3\n\n\n\nø\n\nL" - ], - [ - { - "y": -0.8799999999999999, - "x": 5.5, - "a": 7, - "fa": [ - 7 - ] - }, - "G", - { - "x": 6.5 - }, - "H" - ], - [ - { - "y": -0.8700000000000001, - "c": "#605d57", - "t": "#FFF8E7", - "f": 3, - "w": 1.5 - }, - "TAB", - { - "c": "#FFF8E7", - "t": "#403e3a", - "a": 6, - "fa": [ - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 7 - ] - }, - "á\n\n\n\n\n\n\n\nA", - { - "x": 14.5, - "a": 4, - "fa": [ - 0, - 0, - 1, - 1, - 0, - 0, - 0, - 1, - 7, - 7, - 0 - ] - }, - ":\n\n°\n-\n\n\n\n¶\n\n;", - { - "c": "#605d57", - "t": "#FFF8E7", - "a": 7, - "w": 1.5 - }, - "ENTER" - ], - [ - { - "y": -0.6299999999999999, - "x": 6.5, - "h": 1.5 - }, - "END", - { - "x": 4.5, - "h": 1.5 - }, - "PAGE DOWN" - ], - [ - { - "y": -0.75, - "x": 3.5, - "c": "#FFF8E7", - "t": "#403e3a", - "a": 4, - "fa": [ - 1, - 0, - 1, - 1, - 0, - 0, - 1, - 1, - 7, - 7, - 0 - ] - }, - "¢\n\n\n\n\n\n©\n\n\nC", - { - "x": 10.5, - "fa": [ - 0, - 0, - 1, - 1, - 0, - 0, - 1, - 1, - 7, - 7, - 0 - ] - }, - "<\n\n\n0\n\n\n\nç\n\n," - ], - [ - { - "y": -0.8700000000000001, - "x": 2.5, - "a": 7, - "fa": [ - 7 - ] - }, - "X", - { - "x": 1 - }, - "V", - { - "x": 8.5, - "a": 6, - "fa": [ - 7, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 7 - ] - }, - "\n\nµ\n\n\n\n\n\nM", - { - "x": 1, - "a": 4, - "fa": [ - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 7, - 7, - 0 - ] - }, - ">\n\n\n\n\n\n\n\n\n." - ], - [ - { - "y": -0.8799999999999999, - "x": 5.5, - "a": 7, - "fa": [ - 7 - ] - }, - "B", - { - "x": 6.5, - "a": 6, - "fa": [ - 7, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 7 - ] - }, - "\n\nñ\n\n\n\n\n\nN" - ], - [ - { - "y": -0.8700000000000001, - "c": "#403e3a", - "t": "#FFF8E7", - "a": 5, - "fa": [ - 1, - 0, - 1, - 0, - 0, - 0, - 7 - ], - "w": 1.5 - }, - "SHIFT\n\n\n\n\n\n(", - { - "c": "#FFF8E7", - "t": "#403e3a", - "a": 6, - "fa": [ - 1, - 0, - 1, - 0, - 0, - 0, - 7, - 0, - 7 - ] - }, - "æ\n\n\n\n\n\n\n\nZ", - { - "x": 14.5, - "a": 4, - "fa": [ - 0, - 0, - 1, - 1, - 0, - 0, - 7, - 1, - 7, - 7, - 0 - ] - }, - "?\n\n\n+\n\n\n\n¿\n\n/", - { - "c": "#403e3a", - "t": "#FFF8E7", - "a": 5, - "fa": [ - 1, - 0, - 1, - 1, - 0, - 0, - 7 - ], - "w": 1.5 - }, - "SHIFT\n\n\n\n\n\n)" - ], - [ - { - "y": -0.3799999999999999, - "x": 3.5, - "c": "#FFF8E7", - "t": "#403e3a", - "a": 4, - "fa": [ - 1, - 0, - 0, - 1, - 0, - 0, - 1, - 0, - 0, - 7, - 0 - ] - }, - "¨\n\n\"\n\n\n\n´\n\n\n'", - { - "x": 10.5, - "fa": [ - 0, - 0, - 0, - 1, - 0, - 0, - 1, - 1, - 0, - 7, - 0 - ] - }, - "}\n\n\n\n\n\n\n»\n\n]" - ], - [ - { - "y": -0.8700000000000001, - "x": 2.5 - }, - "\n\n~\n\n\n\n\n\n\n`", - { - "x": 1, - "fa": [ - 1, - 0, - 0, - 1, - 0, - 0, - 1, - 1, - 0, - 7, - 0 - ] - }, - "¦\n\n|\n\n\n\n¬\n\n\n\\", - { - "x": 8.5, - "fa": [ - 0, - 0, - 0, - 1, - 0, - 0, - 1, - 1, - 0, - 7, - 0 - ] - }, - "{\n\n\n\n\n\n\n«\n\n[", - { - "x": 1, - "c": "#605d57", - "t": "#FFF8E7", - "a": 7 - }, - "PRNT SCRN" - ], - [ - { - "y": -0.75, - "x": 0.5, - "c": "#006699", - "a": 4, - "fa": [ - 0, - 0, - 0, - 1, - 0, - 0, - 1, - 1, - 1 - ] - }, - "\n\n\nFLASH\n\n\n\n\nCTRL\nGUI", - { - "c": "#403e3a", - "a": 5, - "fa": [ - 1 - ] - }, - "CTL+SFT\n\n\n\n\n\nMENU", - { - "x": 14.5 - }, - "CTL+SFT\n\n\n\n\n\nMENU", - { - "c": "#006699", - "a": 4, - "fa": [ - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 1 - ] - }, - "\nFLASH\n\n\n\n\n\n\nCTRL\nGUI" - ], - [ - { - "r": 30, - "rx": 6.5, - "ry": 4.25, - "y": -1, - "x": 1, - "c": "#605d57", - "fa": [ - 1, - 1, - 0, - 1 - ] - }, - "\n\n\nKBDBRT-\n\n\n\n\n\nVOL-", - "\n\n\nKBDBRT+\n\n\n\n\n\nVOL+" - ], - [ - { - "c": "#FFF8E7", - "t": "#403e3a", - "a": 5, - "h": 2 - }, - "ALT", - { - "c": "#403e3a", - "t": "#FFF8E7", - "a": 7, - "f": 3, - "h": 2 - }, - "FN", - { - "c": "#605d57", - "f": 3 - }, - "MUTE" - ], - [ - { - "x": 2, - "c": "#403e3a", - "a": 5 - }, - "ALTGR\n\n\n\n\n\nLDR" - ], - [ - { - "r": -30, - "rx": 13, - "y": -1, - "x": -3, - "c": "#605d57", - "a": 4 - }, - "\n\n\nKBDBRT-\n\n\n\n\n\nBRT-", - "\n\n\nKBDBRT+\n\n\n\n\n\nBRT+" - ], - [ - { - "x": -3, - "a": 7, - "f": 3 - }, - "NUM LOCK", - { - "c": "#403e3a", - "f": 3, - "h": 2 - }, - "FN", - { - "c": "#FFF8E7", - "t": "#403e3a", - "a": 5, - "h": 2 - }, - "ALT" - ], - [ - { - "x": -3, - "c": "#403e3a", - "t": "#FFF8E7" - }, - "ALTGR\n\n\n\n\n\nLDR" - ] -] \ No newline at end of file diff --git a/keyboards/ergodox/keymaps/familiar/img/familiar.png b/keyboards/ergodox/keymaps/familiar/img/familiar.png deleted file mode 100644 index 4d61846eb89d9a8f0a0cfde1359de0338e2735db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102059 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

cBNeva_o@Ek+=U- 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 z∫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 diff --git a/keyboards/ergodox/keymaps/familiar/img/familiar.svg b/keyboards/ergodox/keymaps/familiar/img/familiar.svg deleted file mode 100644 index 94e7cae602..0000000000 --- a/keyboards/ergodox/keymaps/familiar/img/familiar.svg +++ /dev/null @@ -1,7131 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PanningHold down Scroll Wheel to pan with mouseUp/Down - Scroll WheelLeft/Right - Shift + Scroll WheelZooming- Ctrl + Scroll View to zoom in/out- Press 1, 2, 4, or 5 for preset zoom views.Zoom Tool (F3) :- Left click to zoom in- Right click to zoom out - - - Keyboards - - - - - - - - - To avoid delays and errors in your order you must convert all of your fonts and text to vector data - This layout is used for your legends only. Keycap colors need to be defined with the online designer tool.Please check out our online tutorials at support.wasdkeyboards.comfor help and instructions regarding layout creation. - - - Quick Start:1. Enable Layers by going to: Layer > Layers (Ctrl + Shift + L) *The layers window can be expanded by dragging the area under the opacity slider.2. Use the Eyeball Icons to toggle visibility for preset layers3. Use the Select tool to move and scale objects (F1)4. Use the Text Tool to add and edit text (F8) - - Managing Layers1. Enable Layers by pressing Ctrl + Shift + L2. The Layer window can be enlarged by dragging thearea under the Opacity slider.3. Use the Eyeball Icon to toggle layer visibility.4. Use the Lock Icon to toggle the ability to edit layer.5. To add a layer, use the button from Layers panel. - - - Manipulating ObjectsThe Select Tool (F1) allows you to select and move,scale, and delete objects. Select an object, then drag the object to move it. You can drag the arrows around the object to scale it.Holding Ctrl while moving will keep the object locked onthe same X or Y axis. Holding Ctrl while scaling will keep the size ratio locked. - Inkscape Tutorial - FAQ (Frequently Asked Questions)I can't see any layers, I just see one layer or no layers when I open the layers panel.This happens when you drag and drop the layout file into Inkscape which "imports" it instead of opening it. Please close your Inkscape window, go back to the original file, right click it and choose "edit with Inkscape". What are the grids for on the layout? Can I place objects outside the grid?Yes. The grids are for reference only. You can snap the grids to use our standard margins. You can print all the way to the edge of the frame. There is a +/-0.01" tolerance, so we suggest that you stay within the grids when possible.Can I put a graphic that spans over multiple keys? Yes. Large images will be cropped to the top face of the keys. The areas in between the keys will not be printed.Advanced users can use a clipping mask to get a better idea of what the final image will look like.How can I change the color of the printing?We have tutorials in our support center that can show you how to add colors to your text and images.Go to support.wasdkeyboards.comI want to edit the Mac-style layouts, but the text is not editable.The Mac layout text is not editable since the font is not common. The font used is VAG Rounded-Light. - Adding text1. Click on the Text Tool (F8)2. Click on the area where you want add text3. Type your text4. Font and size and can changed in the text toolbar5. Use the Select Tool (F1) to reposition thetext if necessary. - - - - Editing font type and size1. Use the Select Tool (F1) select the objects youwant to edit.2. Click on the Text Tool (F8)3. Use the text toolbar to change font type and text size - - - - - Editing textUse the Select Tool (F1) and double click a singletext object.-or-Use the Text Tool (F8) and click on a single text object. - - - - Adding stock artworkCommonly used icons and symbols are available within the file.1. Turn on the visibility of the layer titled: "Stock Artwork"2. Use the Select Tool (F1) to select the object you want to use.3. Press Ctrl + C to copy4. Select the layer you want to paste the object to, then press Ctrl + V5. You can then use the Select Tool (F1) to move and/or scale the object to proper size. See "Snapping" for tips on aligning objects. - Adding custom artNormal graphics can be added into the file, but you must convert thegraphic to a path.1. Copy the graphic from another program. (Usually Right Click > Copy)2. Select the layer you want to paste the graphic to, then press Ctrl + V-or-1. File > Import (Ctrl + I) and select the file you want to import.2. Select the Embed option and click OK.3. Select the graphic, and goto Path > Trace Bitmap (Shift + Alt + B)4. Make sure your graphic is selected, then select a Scan option andclick OK. The graphic will be traced, and will overlay the original object.5. Move the new object into position and delete the original image. - - - SnappingEnabling snapping allows you to snap objects at various reference points of other objects which will allow you to quickly and accurately align objects to each other.Make sure Snap Controls Toolbar is displayed on the right hand side. (View > Show/Hide > Snap Controls Bar)Make sure Snapping is enabled (Toggle with "%")Hover over the various points to see what snappingare available. You can turn each one on/off.Drag objects over other objects to snap. You may need to zoom in or out to snap to certain objects. Turning off irrelevant points will also make it easier to snap. - - Copy and PasteCtrl + C: Copy objectCtrl + V: Paste objectCtrl + Alt + V: Paste in placeShift + Ctrl + V: Paste style - Guide LinesYou can use Guides to help align objects. Click and drag from the rulerson the edge of the document.Enable snapping to guides in the Snap Control Bar You can Show/Hide Guides by going to View > Guides - - - WASD Keyboards 104/87-Key Design Template - IMPORTANT: - Before saving and uploading your file: select all of your text; go to Path > Object to Path (Ctrl+Shift+C) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/keyboards/ergodox/keymaps/familiar/img/familiar_stick.svg b/keyboards/ergodox/keymaps/familiar/img/familiar_stick.svg deleted file mode 100644 index 18ec937e28..0000000000 --- a/keyboards/ergodox/keymaps/familiar/img/familiar_stick.svg +++ /dev/null @@ -1,7592 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PanningHold down Scroll Wheel to pan with mouseUp/Down - Scroll WheelLeft/Right - Shift + Scroll WheelZooming- Ctrl + Scroll View to zoom in/out- Press 1, 2, 4, or 5 for preset zoom views.Zoom Tool (F3) :- Left click to zoom in- Right click to zoom out - - - Keyboards - - - - - - - - - To avoid delays and errors in your order you must convert all of your fonts and text to vector data - This layout is used for your legends only. Keycap colors need to be defined with the online designer tool.Please check out our online tutorials at support.wasdkeyboards.comfor help and instructions regarding layout creation. - - - Quick Start:1. Enable Layers by going to: Layer > Layers (Ctrl + Shift + L) *The layers window can be expanded by dragging the area under the opacity slider.2. Use the Eyeball Icons to toggle visibility for preset layers3. Use the Select tool to move and scale objects (F1)4. Use the Text Tool to add and edit text (F8) - - Managing Layers1. Enable Layers by pressing Ctrl + Shift + L2. The Layer window can be enlarged by dragging thearea under the Opacity slider.3. Use the Eyeball Icon to toggle layer visibility.4. Use the Lock Icon to toggle the ability to edit layer.5. To add a layer, use the button from Layers panel. - - - Manipulating ObjectsThe Select Tool (F1) allows you to select and move,scale, and delete objects. Select an object, then drag the object to move it. You can drag the arrows around the object to scale it.Holding Ctrl while moving will keep the object locked onthe same X or Y axis. Holding Ctrl while scaling will keep the size ratio locked. - Inkscape Tutorial - FAQ (Frequently Asked Questions)I can't see any layers, I just see one layer or no layers when I open the layers panel.This happens when you drag and drop the layout file into Inkscape which "imports" it instead of opening it. Please close your Inkscape window, go back to the original file, right click it and choose "edit with Inkscape". What are the grids for on the layout? Can I place objects outside the grid?Yes. The grids are for reference only. You can snap the grids to use our standard margins. You can print all the way to the edge of the frame. There is a +/-0.01" tolerance, so we suggest that you stay within the grids when possible.Can I put a graphic that spans over multiple keys? Yes. Large images will be cropped to the top face of the keys. The areas in between the keys will not be printed.Advanced users can use a clipping mask to get a better idea of what the final image will look like.How can I change the color of the printing?We have tutorials in our support center that can show you how to add colors to your text and images.Go to support.wasdkeyboards.comI want to edit the Mac-style layouts, but the text is not editable.The Mac layout text is not editable since the font is not common. The font used is VAG Rounded-Light. - Adding text1. Click on the Text Tool (F8)2. Click on the area where you want add text3. Type your text4. Font and size and can changed in the text toolbar5. Use the Select Tool (F1) to reposition thetext if necessary. - - - - Editing font type and size1. Use the Select Tool (F1) select the objects youwant to edit.2. Click on the Text Tool (F8)3. Use the text toolbar to change font type and text size - - - - - Editing textUse the Select Tool (F1) and double click a singletext object.-or-Use the Text Tool (F8) and click on a single text object. - - - - Adding stock artworkCommonly used icons and symbols are available within the file.1. Turn on the visibility of the layer titled: "Stock Artwork"2. Use the Select Tool (F1) to select the object you want to use.3. Press Ctrl + C to copy4. Select the layer you want to paste the object to, then press Ctrl + V5. You can then use the Select Tool (F1) to move and/or scale the object to proper size. See "Snapping" for tips on aligning objects. - Adding custom artNormal graphics can be added into the file, but you must convert thegraphic to a path.1. Copy the graphic from another program. (Usually Right Click > Copy)2. Select the layer you want to paste the graphic to, then press Ctrl + V-or-1. File > Import (Ctrl + I) and select the file you want to import.2. Select the Embed option and click OK.3. Select the graphic, and goto Path > Trace Bitmap (Shift + Alt + B)4. Make sure your graphic is selected, then select a Scan option andclick OK. The graphic will be traced, and will overlay the original object.5. Move the new object into position and delete the original image. - - - SnappingEnabling snapping allows you to snap objects at various reference points of other objects which will allow you to quickly and accurately align objects to each other.Make sure Snap Controls Toolbar is displayed on the right hand side. (View > Show/Hide > Snap Controls Bar)Make sure Snapping is enabled (Toggle with "%")Hover over the various points to see what snappingare available. You can turn each one on/off.Drag objects over other objects to snap. You may need to zoom in or out to snap to certain objects. Turning off irrelevant points will also make it easier to snap. - - Copy and PasteCtrl + C: Copy objectCtrl + V: Paste objectCtrl + Alt + V: Paste in placeShift + Ctrl + V: Paste style - Guide LinesYou can use Guides to help align objects. Click and drag from the rulerson the edge of the document.Enable snapping to guides in the Snap Control Bar You can Show/Hide Guides by going to View > Guides - - - WASD Keyboards 104/87-Key Design Template - IMPORTANT: - Before saving and uploading your file: select all of your text; go to Path > Object to Path (Ctrl+Shift+C) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/keyboards/ergodox/keymaps/familiar/img/hntr.json b/keyboards/ergodox/keymaps/familiar/img/hntr.json deleted file mode 100644 index c1aae552be..0000000000 --- a/keyboards/ergodox/keymaps/familiar/img/hntr.json +++ /dev/null @@ -1,634 +0,0 @@ -[ - { - "name": "Infinity ErgoDox - H.NT.R" - }, - [ - { - "x": 3.5, - "c": "#e3e2dd", - "t": "#525554", - "fa": [ - 0, - 0, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 5 - ] - }, - "\n\n#\nF3\n\n\n\n\n\n3", - { - "x": 10.5, - "fa": [ - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 5 - ] - }, - "*\nF8\n\n\n\n\n\n\n\n8" - ], - [ - { - "y": -0.875, - "x": 2.5 - }, - "\n\n@\nF2\n\n\n\n\n\n2", - { - "x": 1 - }, - "\n\n$\nF4\n\n\n\n\n\n4", - { - "x": 8.5 - }, - "&\nF7\n\n\n\n\n\n\n\n7", - { - "x": 1 - }, - "(\nF9\n\n\n\n\n\n\n\n9" - ], - [ - { - "y": -0.875, - "x": 5.5 - }, - "\n\n%\nF5\n\n\n\n\n\n5", - "\n\n\nF11", - { - "x": 4.5 - }, - "\nF12", - "^\nF6\n\n\n\n\n\n\n\n6" - ], - [ - { - "y": -0.875, - "c": "#525554", - "t": "#e3e2dd", - "a": 7, - "f": 3, - "w": 1.5 - }, - "CYCLE LAYER", - { - "c": "#e3e2dd", - "t": "#525554", - "a": 4, - "f": 3 - }, - "\n\n!\nF1\n\n\n\n\n\n1", - { - "x": 14.5, - "f": 3 - }, - ")\nF10\n\n\n/\n\n\n\n\n0", - { - "c": "#525554", - "t": "#e3e2dd", - "a": 7, - "f": 3, - "w": 1.5 - }, - "CYCLE LAYER" - ], - [ - { - "y": -0.375, - "x": 3.5, - "c": "#c0472c", - "a": 4, - "fa": [ - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 1, - 5 - ] - }, - "\n\n\nPG UP\n▲\n\n\n\ne\nO", - { - "x": 10.5, - "c": "#e3e2dd", - "t": "#525554" - }, - "\n]\n\n\n5\n\n\n\ni\nL" - ], - [ - { - "y": -0.875, - "x": 2.5, - "a": 7, - "fa": [ - 5 - ] - }, - "W", - { - "x": 1, - "a": 5, - "fa": [ - 1, - 0, - 0, - 0, - 0, - 0, - 5 - ] - }, - "r\n\n\n\n\n\nU", - { - "x": 8.5, - "a": 4, - "fa": [ - 1, - 1, - 0, - 0, - 0, - 0, - 5, - 0, - 1, - 5 - ] - }, - "\n[\n\n\n4\n\n\n\nu\nD", - { - "x": 1 - }, - "\n?\n\n\n6\n\n\n\no\nG" - ], - [ - { - "y": -0.875, - "x": 5.5, - "a": 5 - }, - "t\n\n\n\n\n\nJ", - { - "a": 7, - "h": 1.5 - }, - "", - { - "x": 4.5, - "h": 1.5 - }, - "", - { - "a": 5 - }, - "y\n\n\n\n\n\nK" - ], - [ - { - "y": -0.875, - "c": "#525554", - "t": "#e3e2dd", - "a": 7, - "f": 3, - "w": 1.5 - }, - "DELETE", - { - "c": "#e3e2dd", - "t": "#525554", - "fa": [ - 5 - ] - }, - "Q", - { - "x": 14.5, - "a": 4, - "fa": [ - 5, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 5 - ] - }, - "\n|\n\n\n×\n\n\n\n\nP", - { - "c": "#525554", - "t": "#e3e2dd", - "a": 7, - "f": 3, - "w": 1.5 - }, - "⌫" - ], - [ - { - "y": -0.375, - "x": 3.5, - "c": "#c0472c", - "a": 4, - "fa": [ - 5, - 1, - 0, - 1, - 0, - 0, - 0, - 0, - 1, - 5 - ] - }, - "\n\n\nPG DN\n▼\n\n\n\nd\nE", - { - "x": 10.5, - "c": "#e3e2dd", - "t": "#525554" - }, - "\n)\n\n\n2\n\n\n\nk\nN" - ], - [ - { - "y": -0.875, - "x": 2.5, - "c": "#c0472c", - "t": "#e3e2dd" - }, - "\n\n\nHOME\n◀\n\n\n\ns\nI", - { - "x": 1 - }, - "\n\n\nEND\n▶\n\n\n\nf\nA", - { - "x": 8.5, - "c": "#e3e2dd", - "t": "#525554" - }, - "\n(\n\n\n1\n\n\n\nj\nH", - { - "x": 1 - }, - "\n/\n\n\n3\n\n\n\nl\nT" - ], - [ - { - "y": -0.875, - "x": 5.5, - "fa": [ - 5, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 1, - 5 - ] - }, - "\n\n:\n\n\n\n\n\ng\n;", - { - "x": 6.5, - "a": 5, - "fa": [ - 1, - 1, - 1, - 1, - 0, - 0, - 5 - ] - }, - "h\n\n\n\n\n\nF" - ], - [ - { - "y": -0.875, - "c": "#525554", - "t": "#e3e2dd", - "a": 7, - "f": 3, - "w": 1.5 - }, - "TAB", - { - "c": "#e3e2dd", - "t": "#525554", - "a": 5 - }, - "a\n\n\n\n\n\nS", - { - "x": 14.5, - "a": 4, - "fa": [ - 1, - 1, - 1, - 1, - 0, - 0, - 5, - 0, - 1, - 5 - ] - }, - "\n\\\n\n\n-\n\n\n\n;\nR", - { - "c": "#525554", - "t": "#e3e2dd", - "a": 7, - "f": 3, - "w": 1.5 - }, - "ENTER" - ], - [ - { - "y": -0.625, - "x": 6.5, - "c": "#e3e2dd", - "t": "#525554", - "h": 1.5 - }, - "", - { - "x": 4.5, - "h": 1.5 - }, - "" - ], - [ - { - "y": -0.75, - "x": 3.5, - "a": 4 - }, - "\n\n\n-\n\n\n\n\n\nC", - { - "x": 10.5 - }, - "<\n}\n\n\n.\n\n\n\n\n," - ], - [ - { - "y": -0.875, - "x": 2.5 - }, - "\n\n\n=\n\n\n\n\n\nX", - { - "x": 1 - }, - "\n\n\n—\n\n\n\n\n\nV", - { - "x": 8.5 - }, - "\n{\n\n\n0\n\n\n\n\nM", - { - "x": 1 - }, - ">\n~\n\n\nENTER\n\n\n\n\n." - ], - [ - { - "y": -0.875, - "x": 5.5 - }, - "\n\n\n_\n\n\n\n\nb\nY", - { - "x": 6.5, - "a": 5 - }, - "n\n\n\n\n\n\nB" - ], - [ - { - "y": -0.875, - "c": "#525554", - "t": "#e3e2dd", - "a": 7, - "f": 3, - "w": 1.5 - }, - "ALT", - { - "c": "#e3e2dd", - "t": "#525554", - "a": 4 - }, - "\n\n\n+\n\n\n\n\n\nZ", - { - "x": 14.5 - }, - "\"\n`\n\n\n+\n\n\n\n/\n'", - { - "c": "#525554", - "t": "#e3e2dd", - "a": 7, - "f": 3, - "w": 1.5 - }, - "ALT" - ], - [ - { - "y": -0.375, - "x": 3.5, - "f": 3 - }, - "END", - { - "x": 10.5, - "f": 3 - }, - "PAGE UP" - ], - [ - { - "y": -0.875, - "x": 2.5, - "f": 3 - }, - "HOME", - { - "x": 1, - "f": 3 - }, - "🔒2", - { - "x": 8.5, - "f": 3 - }, - "🔒3", - { - "x": 1, - "f": 3 - }, - "PAGE DOWN" - ], - [ - { - "y": -0.75, - "x": 0.5, - "c": "#0075ad", - "a": 4, - "fa": [ - 1, - 1, - 1, - 1, - 0, - 0, - 5, - 0, - 1, - 9 - ] - }, - "\n\n\nFLASH\n\n\n\n\n\nΑ", - { - "c": "#525554", - "a": 7, - "f": 3 - }, - "MENU", - { - "x": 14.5, - "f": 3 - }, - "MENU", - { - "c": "#0075ad", - "a": 4, - "f": 3 - }, - "\nFLASH\n\n\n\n\n\n\n\nΩ" - ], - [ - { - "y": 1.125, - "c": "#c0472c", - "fa": [ - 1, - 1, - 1, - 1, - 0, - 0, - 5, - 0, - 1, - 5 - ], - "w": 6 - }, - "SHIFTED\nLAYER 4\nSHIFTED\nLAYER 4\nLAYER 2 (LEFT) / LAYER 3 (RIGHT)\n\n\n\nqwerty (layer 1)\nMAIN LAYER" - ], - [ - { - "r": 30, - "rx": 6.5, - "ry": 4.25, - "y": -1, - "x": 1, - "c": "#525554", - "fa": [ - 1, - 1, - 1, - 1 - ] - }, - "\n\n\n🔅-\n\n\n\n\n\n🔉", - "\n\n\n🔆+\n\n\n\n\n\n🔊" - ], - [ - { - "a": 7, - "f": 3, - "h": 2 - }, - "SHIFT", - { - "f": 3, - "h": 2 - }, - "ƒ4", - { - "f": 3 - }, - "🔒1" - ], - [ - { - "x": 2, - "f": 3 - }, - "CTRL" - ], - [ - { - "r": -30, - "rx": 13, - "y": -1, - "x": -3, - "a": 4, - "f": 3 - }, - "\n🔅-\n\n\n\n\n\n\n\n🔅-", - { - "f": 3 - }, - "\n🔆+\n\n\n\n\n\n\n\n🔆+" - ], - [ - { - "x": -3, - "a": 7, - "f": 3 - }, - "🔒1", - { - "f": 3, - "h": 2 - }, - "ƒ4", - { - "c": "#e3e2dd", - "t": "#525554", - "h": 2 - }, - "" - ], - [ - { - "x": -3, - "c": "#525554", - "t": "#e3e2dd", - "f": 3 - }, - "CTRL" - ] -] \ No newline at end of file diff --git a/keyboards/ergodox/keymaps/familiar/img/hntr.png b/keyboards/ergodox/keymaps/familiar/img/hntr.png deleted file mode 100644 index 519d152df5817293c100034d04ab31a6d6fd9cd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77473 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 Date: Fri, 7 Apr 2017 19:23:27 -0700 Subject: [PATCH 078/117] Corrected a missed typo in the readme. --- keyboards/atreus/keymaps/xyverz/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/atreus/keymaps/xyverz/readme.md b/keyboards/atreus/keymaps/xyverz/readme.md index 5187e5d3e2..98df9d77dd 100644 --- a/keyboards/atreus/keymaps/xyverz/readme.md +++ b/keyboards/atreus/keymaps/xyverz/readme.md @@ -46,7 +46,7 @@ I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar t |------+------+------+------+------|------.,------|------+------+------+------+------| |Shft Z| X | C | V | B | CTRL ||Alt / | K | M | , | . |Shft /| |------+------+------+------+------| ||Enter |------+------+------+------+------| - | Esc | Tab | GUI | LOWER| BkSp |------'`------| Spc | RAISE| - | ' | RGUI | + | Esc | Tab | GUI | LOWER| BkSp |------'`------| Spc | RAISE| - | ' | \ | `----------------------------------' `----------------------------------' ### layer 3 : LOWER layer From 9237b95ebe9bbcab92ecc9138135d4d8f6d0a23f Mon Sep 17 00:00:00 2001 From: Xyverz Date: Fri, 7 Apr 2017 19:42:05 -0700 Subject: [PATCH 079/117] More missed keycodes; added PSCR, SLCK, and PAUS to ADJUST layer. --- keyboards/atreus/keymaps/xyverz/keymap.c | 4 ++-- keyboards/atreus/keymaps/xyverz/readme.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/keyboards/atreus/keymaps/xyverz/keymap.c b/keyboards/atreus/keymaps/xyverz/keymap.c index 3c61d66d01..560a9d301b 100644 --- a/keyboards/atreus/keymaps/xyverz/keymap.c +++ b/keyboards/atreus/keymaps/xyverz/keymap.c @@ -128,7 +128,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ,----------------------------------. ,----------------------------------. | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | |------+------+------+------+------| |------+------+------+------+------| - | F11 | | | | | | | | | | F12 | + | F11 | | | | | | | PrSc | ScLk | Paus | F12 | |------+------+------+------+------|------.,------|------+------+------+------+------| | |QWERTY|COLEMK|DVORAK| | || | | | | | | |------+------+------+------+------| || |------+------+------+------+------| @@ -136,7 +136,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { `----------------------------------' `----------------------------------'*/ [_ADJUST] = { {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, XXXXXXX, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10 }, - {KC_F11, _______, _______, _______, _______, XXXXXXX, _______, _______, _______, _______, KC_F12 }, + {KC_F11, _______, _______, _______, _______, XXXXXXX, _______, KC_PSCR, KC_SLCK, KC_PAUS, KC_F12 }, {_______, QWERTY, COLEMAK, DVORAK, _______, _______, _______, _______, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET } } diff --git a/keyboards/atreus/keymaps/xyverz/readme.md b/keyboards/atreus/keymaps/xyverz/readme.md index 98df9d77dd..e7e217804e 100644 --- a/keyboards/atreus/keymaps/xyverz/readme.md +++ b/keyboards/atreus/keymaps/xyverz/readme.md @@ -79,7 +79,7 @@ I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar t ,----------------------------------. ,----------------------------------. | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | |------+------+------+------+------| |------+------+------+------+------| - | F11 | | | | | | | | | | F12 | + | F11 | | | | | | | PScr | SLck | Paus | F12 | |------+------+------+------+------|------.,------|------+------+------+------+------| | |QWERTY|COLEMK|DVORAK| | || | | | | | | |------+------+------+------+------| || |------+------+------+------+------| From a11053bda8f6263cf85c6127975cf3364f25083c Mon Sep 17 00:00:00 2001 From: Xyverz Date: Sat, 8 Apr 2017 22:53:46 -0700 Subject: [PATCH 080/117] Cleaned up the keymap: Added MOD_TAP aliases for keymap.c readability. Updated README to document said changes. Added additional Dvorak layer to make using the CMD key easier on Macs. --- keyboards/atreus/keymaps/xyverz/keymap.c | 41 +++++++++++++++++++---- keyboards/atreus/keymaps/xyverz/readme.md | 27 ++++++++++++--- 2 files changed, 57 insertions(+), 11 deletions(-) diff --git a/keyboards/atreus/keymaps/xyverz/keymap.c b/keyboards/atreus/keymaps/xyverz/keymap.c index 560a9d301b..ed943eb669 100644 --- a/keyboards/atreus/keymaps/xyverz/keymap.c +++ b/keyboards/atreus/keymaps/xyverz/keymap.c @@ -15,14 +15,16 @@ extern keymap_config_t keymap_config; #define _DVORAK 0 #define _QWERTY 1 #define _COLEMAK 2 -#define _LOWER 3 -#define _RAISE 4 +#define _DVORMAC 3 +#define _LOWER 4 +#define _RAISE 5 #define _ADJUST 16 enum planck_keycodes { DVORAK = SAFE_RANGE, QWERTY, COLEMAK, + DVORMAC, LOWER, RAISE, BACKLIT @@ -33,6 +35,8 @@ enum planck_keycodes { #define SFTSLSH SFT_T(KC_SLSH) #define SFTZED SFT_T(KC_Z) #define ALTENT ALT_T(KC_ENT) +#define ESCTRL CTL_T(KC_ESC) +#define TABALT ALT_T(KC_TAB) // Fillers to make layering more clear #define _______ KC_TRNS @@ -53,7 +57,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, XXXXXXX, KC_F, KC_G, KC_C, KC_R, KC_L }, {KC_A, KC_O, KC_E, KC_U, KC_I, XXXXXXX, KC_D, KC_H, KC_T, KC_N, KC_S }, {SFTSCLN, KC_Q, KC_J, KC_K, KC_X, KC_LCTL, KC_B, KC_M, KC_W, KC_V, SFTZED }, - {KC_ESC, KC_TAB, KC_LGUI, LOWER, KC_BSPC, ALTENT, KC_SPC, RAISE, KC_MINS, KC_SLSH, KC_BSLS} + {ESCTRL, TABALT, KC_LGUI, LOWER, KC_BSPC, ALTENT, KC_SPC, RAISE, KC_MINS, KC_SLSH, KC_BSLS} }, /* QWERTY Layer @@ -70,7 +74,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {KC_Q, KC_W, KC_E, KC_R, KC_T, XXXXXXX, KC_Y, KC_U, KC_I, KC_O, KC_P }, {KC_A, KC_S, KC_D, KC_F, KC_G, XXXXXXX, KC_H, KC_J, KC_K, KC_L, KC_SCLN}, {SFTZED, KC_X, KC_C, KC_V, KC_B, KC_LCTL, KC_N, KC_M, KC_COMM, KC_DOT, SFTSLSH}, - {KC_ESC, KC_TAB, KC_LGUI, LOWER, KC_BSPC, ALTENT, KC_SPC, RAISE, KC_MINS, KC_QUOT, KC_BSLS} + {ESCTRL, TABALT, KC_LGUI, LOWER, KC_BSPC, ALTENT, KC_SPC, RAISE, KC_MINS, KC_QUOT, KC_BSLS} }, /* Colemak Layer @@ -87,7 +91,24 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {KC_Q, KC_W, KC_F, KC_P, KC_G, XXXXXXX, KC_J, KC_L, KC_U, KC_Y, KC_SCLN}, {KC_A, KC_R, KC_S, KC_T, KC_D, XXXXXXX, KC_H, KC_N, KC_E, KC_I, KC_O }, {SFTZED, KC_X, KC_C, KC_V, KC_B, KC_LCTL, KC_K, KC_M, KC_COMM, KC_DOT, SFTSLSH}, - {KC_ESC, KC_TAB, KC_LGUI, LOWER, KC_BSPC, ALTENT, KC_SPC, RAISE, KC_MINS, KC_QUOT, KC_BSLS} + {ESCTRL, TABALT, KC_LGUI, LOWER, KC_BSPC, ALTENT, KC_SPC, RAISE, KC_MINS, KC_QUOT, KC_BSLS} + }, + +/* Dvorak Layer with Command key on left thumb instead of Control + ,----------------------------------. ,----------------------------------. + | ' | , | . | P | Y | | F | G | C | R | L | + |------+------+------+------+------| |------+------+------+------+------| + | A | O | E | U | I | | D | H | T | N | S | + |------+------+------+------+------|------.,------|------+------+------+------+------| + |SFT/ ;| Q | J | K | X | CMD ||Alt / | B | M | W | V |SFT/ Z| + |------+------+------+------+------| ||Enter |------+------+------+------+------| + | Esc | Tab | GUI | LOWER| BkSp |------'`------| Spc | RAISE| - | / | \ | + `----------------------------------' `----------------------------------' */ + [_DVORMAC] = { + {KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, XXXXXXX, KC_F, KC_G, KC_C, KC_R, KC_L }, + {KC_A, KC_O, KC_E, KC_U, KC_I, XXXXXXX, KC_D, KC_H, KC_T, KC_N, KC_S }, + {SFTSCLN, KC_Q, KC_J, KC_K, KC_X, KC_LGUI, KC_B, KC_M, KC_W, KC_V, SFTZED }, + {ESCTRL, TABALT, KC_LGUI, LOWER, KC_BSPC, ALTENT, KC_SPC, RAISE, KC_MINS, KC_SLSH, KC_BSLS} }, /* LOWER Layer @@ -130,14 +151,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |------+------+------+------+------| |------+------+------+------+------| | F11 | | | | | | | PrSc | ScLk | Paus | F12 | |------+------+------+------+------|------.,------|------+------+------+------+------| - | |QWERTY|COLEMK|DVORAK| | || | | | | | | + | |QWERTY|COLEMK|DVORAK|DVORMC| || | | | | | | |------+------+------+------+------| || |------+------+------+------+------| | | | | | |------'`------| | | | | RESET| `----------------------------------' `----------------------------------'*/ [_ADJUST] = { {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, XXXXXXX, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10 }, {KC_F11, _______, _______, _______, _______, XXXXXXX, _______, KC_PSCR, KC_SLCK, KC_PAUS, KC_F12 }, - {_______, QWERTY, COLEMAK, DVORAK, _______, _______, _______, _______, _______, _______, _______}, + {_______, QWERTY, COLEMAK, DVORAK, DVORMAC, _______, _______, _______, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET } } @@ -172,6 +193,12 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; + case DVORMAC: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_DVORMAC); + } + return false; + break; case LOWER: if (record->event.pressed) { layer_on(_LOWER); diff --git a/keyboards/atreus/keymaps/xyverz/readme.md b/keyboards/atreus/keymaps/xyverz/readme.md index e7e217804e..ec7d836c17 100644 --- a/keyboards/atreus/keymaps/xyverz/readme.md +++ b/keyboards/atreus/keymaps/xyverz/readme.md @@ -7,8 +7,15 @@ time, but still very much like the original Atreus keymap. I've managed to get t implemented (more like copied) the RAISE/LOWER/ADJUST layers. This is a work in progress, but I think I'm closer to a final go with this. +I'm using MOD_TAP quite a bit in this keymap. On all layers, R4 pinky keys use mod-tap and are SHIFT when held +and their normal keys when tapped. In addition, ESC and TAB are also set as Ctrl and ALT respectively when held, +and Enter/ALT on the right thumb key for all layers. + I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar to the default Planck layouts. +Recently added: Documentation, Formatting, and another Dvorak layer that has Command on the left thumb, instead of +Control. + ## Still to do: * Enjoy this revision; figure out new things later. @@ -49,7 +56,19 @@ I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar t | Esc | Tab | GUI | LOWER| BkSp |------'`------| Spc | RAISE| - | ' | \ | `----------------------------------' `----------------------------------' -### layer 3 : LOWER layer +### Keymap 3: Dvorak for Mac layout + + ,----------------------------------. ,----------------------------------. + | ' | , | . | P | Y | | F | G | C | R | L | + |------+------+------+------+------| |------+------+------+------+------| + | A | O | E | U | I | | D | H | T | N | S | + |------+------+------+------+------|------.,------|------+------+------+------+------| + |SFT/ ;| Q | J | K | X | CMD ||Alt / | B | M | W | V |SFT/ Z| + |------+------+------+------+------| ||Enter |------+------+------+------+------| + | Esc | Tab | GUI | LOWER| BkSp |------'`------| Spc | RAISE| - | / | \ | + `----------------------------------' `----------------------------------' + +### Keymap 4: LOWER layer ,----------------------------------. ,----------------------------------. | ! | @ | # | $ | % | | ^ | & | * | ( | ) | @@ -62,7 +81,7 @@ I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar t `----------------------------------' `----------------------------------' -### Keymap 4: RAISE layer +### Keymap 5: RAISE layer ,----------------------------------. ,----------------------------------. | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | @@ -74,14 +93,14 @@ I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar t | ` | | | | Del |------'`------| Ins | | | | | `----------------------------------' `----------------------------------' -### Keymap 5: ADJUST layer +### Keymap 6: ADJUST layer ,----------------------------------. ,----------------------------------. | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | |------+------+------+------+------| |------+------+------+------+------| | F11 | | | | | | | PScr | SLck | Paus | F12 | |------+------+------+------+------|------.,------|------+------+------+------+------| - | |QWERTY|COLEMK|DVORAK| | || | | | | | | + | |QWERTY|COLEMK|DVORAK|DVORMC| || | | | | | | |------+------+------+------+------| || |------+------+------+------+------| | | | | | |------'`------| | | | | RESET| `----------------------------------' `----------------------------------' From a875299d9aa9f0f1d2e01bedfaae0cb15c182e27 Mon Sep 17 00:00:00 2001 From: Dylan Khor Date: Sun, 9 Apr 2017 02:02:40 -0400 Subject: [PATCH 081/117] Added breathing macros and removed mappings to unused layouts --- keyboards/planck/keymaps/khord/config.h | 1 + keyboards/planck/keymaps/khord/keymap.c | 42 ++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/keyboards/planck/keymaps/khord/config.h b/keyboards/planck/keymaps/khord/config.h index 008f3a5c2c..83dece50ea 100644 --- a/keyboards/planck/keymaps/khord/config.h +++ b/keyboards/planck/keymaps/khord/config.h @@ -48,6 +48,7 @@ along with this program. If not, see . /* number of backlight levels */ #define BACKLIGHT_LEVELS 3 +#define BACKLIGHT_BREATHING /* Set 0 if debouncing isn't needed */ #define DEBOUNCING_DELAY 5 diff --git a/keyboards/planck/keymaps/khord/keymap.c b/keyboards/planck/keymaps/khord/keymap.c index 8001a0986d..e371e5b70b 100644 --- a/keyboards/planck/keymaps/khord/keymap.c +++ b/keyboards/planck/keymaps/khord/keymap.c @@ -37,6 +37,14 @@ enum planck_keycodes { #define _______ KC_TRNS #define XXXXXXX KC_NO +#define MACRO_BREATH_TOGGLE 21 +#define MACRO_BREATH_SPEED_INC 23 +#define MACRO_BREATH_SPEED_DEC 24 +#define MACRO_BREATH_DEFAULT 25 +#define M_BRTOG M(MACRO_BREATH_TOGGLE) +#define M_BRINC M(MACRO_BREATH_SPEED_INC) +#define M_BRDEC M(MACRO_BREATH_SPEED_DEC) +#define M_BRDFT M(MACRO_BREATH_DEFAULT) // Tap Dance Declarations enum { ESC_CAP = 0, @@ -173,10 +181,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_ADJUST] = { - {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, - {_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______}, - {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, C_A_INS, C_A_DEL} + {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, M_BRDFT, KC_DEL }, + {_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, _______, _______, M_BRINC, _______}, + {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, M_BRDEC, C_A_INS}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, M_BRTOG, C_A_DEL} } @@ -210,6 +218,32 @@ void persistant_default_layer_set(uint16_t default_layer) { default_layer_set(default_layer); } +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { + switch(id) { + case MACRO_BREATH_TOGGLE: + if (record->event.pressed) { + breathing_toggle(); + } + break; + case MACRO_BREATH_SPEED_INC: + if (record->event.pressed) { + breathing_speed_inc(1); + } + break; + case MACRO_BREATH_SPEED_DEC: + if (record->event.pressed) { + breathing_speed_dec(1); + } + break; + case MACRO_BREATH_DEFAULT: + if (record->event.pressed) { + breathing_defaults(); + } + break; + } + return MACRO_NONE; +} + bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case QWERTY: From aee9b10e92a597984ba9693b2dfcf597ca380a70 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sun, 10 Jul 2016 23:45:39 +0300 Subject: [PATCH 082/117] Add a keyboard specific visualizer --- keyboards/ergodox/infinity/Makefile | 2 +- keyboards/ergodox/infinity/rules.mk | 2 +- keyboards/ergodox/infinity/visualizer.c | 168 ++++++++++++++++++++++++ quantum/visualizer/visualizer.mk | 4 + 4 files changed, 174 insertions(+), 2 deletions(-) create mode 100644 keyboards/ergodox/infinity/visualizer.c diff --git a/keyboards/ergodox/infinity/Makefile b/keyboards/ergodox/infinity/Makefile index 191c6bb664..bd09e5885d 100644 --- a/keyboards/ergodox/infinity/Makefile +++ b/keyboards/ergodox/infinity/Makefile @@ -1,3 +1,3 @@ ifndef MAKEFILE_INCLUDED include ../../../Makefile -endif \ No newline at end of file +endif diff --git a/keyboards/ergodox/infinity/rules.mk b/keyboards/ergodox/infinity/rules.mk index 473a6dfec6..1b011cd589 100644 --- a/keyboards/ergodox/infinity/rules.mk +++ b/keyboards/ergodox/infinity/rules.mk @@ -59,7 +59,7 @@ OPT_DEFS += -DCORTEX_VTOR_INIT=0x00002000 # CUSTOM_MATRIX ?= yes # Custom matrix file SERIAL_LINK_ENABLE = yes -VISUALIZER_ENABLE ?= no #temporarily disabled to make everything compile +VISUALIZER_ENABLE ?= yes LCD_ENABLE ?= yes LED_ENABLE ?= yes LCD_BACKLIGHT_ENABLE ?= yes diff --git a/keyboards/ergodox/infinity/visualizer.c b/keyboards/ergodox/infinity/visualizer.c new file mode 100644 index 0000000000..c0d335ce6a --- /dev/null +++ b/keyboards/ergodox/infinity/visualizer.c @@ -0,0 +1,168 @@ +/* +Copyright 2016 Fred Sundvik + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +// Currently we are assuming that both the backlight and LCD are enabled +// But it's entirely possible to write a custom visualizer that use only +// one of them +#ifndef LCD_BACKLIGHT_ENABLE +#error This visualizer needs that LCD backlight is enabled +#endif + +#ifndef LCD_ENABLE +#error This visualizer needs that LCD is enabled +#endif + +#include "visualizer.h" +#include "led_test.h" + +static const char* welcome_text[] = {"TMK", "Infinity Ergodox"}; + +// Just an example how to write custom keyframe functions, we could have moved +// all this into the init function +bool display_welcome(keyframe_animation_t* animation, visualizer_state_t* state) { + (void)animation; + // Read the uGFX documentation for information how to use the displays + // http://wiki.ugfx.org/index.php/Main_Page + gdispClear(White); + // You can use static variables for things that can't be found in the animation + // or state structs + gdispDrawString(0, 3, welcome_text[0], state->font_dejavusansbold12, Black); + gdispDrawString(0, 15, welcome_text[1], state->font_dejavusansbold12, Black); + // Always remember to flush the display + gdispFlush(); + // you could set the backlight color as well, but we won't do it here, since + // it's part of the following animation + // lcd_backlight_color(hue, saturation, intensity); + // We don't need constant updates, just drawing the screen once is enough + return false; +} + +// Feel free to modify the animations below, or even add new ones if needed + +// Don't worry, if the startup animation is long, you can use the keyboard like normal +// during that time +static keyframe_animation_t startup_animation = { + .num_frames = 4, + .loop = false, + .frame_lengths = {0, gfxMillisecondsToTicks(1000), gfxMillisecondsToTicks(5000), 0}, + .frame_functions = { + display_welcome, + keyframe_animate_backlight_color, + keyframe_no_operation, + enable_visualization + }, +}; + +// The color animation animates the LCD color when you change layers +static keyframe_animation_t color_animation = { + .num_frames = 2, + .loop = false, + // Note that there's a 200 ms no-operation frame, + // this prevents the color from changing when activating the layer + // momentarily + .frame_lengths = {gfxMillisecondsToTicks(200), gfxMillisecondsToTicks(500)}, + .frame_functions = {keyframe_no_operation, keyframe_animate_backlight_color}, +}; + +// The LCD animation alternates between the layer name display and a +// bitmap that displays all active layers +static keyframe_animation_t lcd_animation = { + .num_frames = 2, + .loop = true, + .frame_lengths = {gfxMillisecondsToTicks(2000), gfxMillisecondsToTicks(2000)}, + .frame_functions = {keyframe_display_layer_text, keyframe_display_layer_bitmap}, +}; + +static keyframe_animation_t suspend_animation = { + .num_frames = 3, + .loop = false, + .frame_lengths = {0, gfxMillisecondsToTicks(1000), 0}, + .frame_functions = { + keyframe_display_layer_text, + keyframe_animate_backlight_color, + keyframe_disable_lcd_and_backlight, + }, +}; + +static keyframe_animation_t resume_animation = { + .num_frames = 5, + .loop = false, + .frame_lengths = {0, 0, gfxMillisecondsToTicks(1000), gfxMillisecondsToTicks(5000), 0}, + .frame_functions = { + keyframe_enable_lcd_and_backlight, + display_welcome, + keyframe_animate_backlight_color, + keyframe_no_operation, + enable_visualization, + }, +}; + +void initialize_user_visualizer(visualizer_state_t* state) { + // The brightness will be dynamically adjustable in the future + // But for now, change it here. + lcd_backlight_brightness(0x50); + state->current_lcd_color = LCD_COLOR(0x00, 0x00, 0xFF); + state->target_lcd_color = LCD_COLOR(0x10, 0xFF, 0xFF); + start_keyframe_animation(&startup_animation); + start_keyframe_animation(&led_test_animation); +} + +void update_user_visualizer_state(visualizer_state_t* state) { + // Add more tests, change the colors and layer texts here + // Usually you want to check the high bits (higher layers first) + // because that's the order layers are processed for keypresses + // You can for check for example: + // state->status.layer + // state->status.default_layer + // state->status.leds (see led.h for available statuses) + if (state->status.layer & 0x8) { + state->target_lcd_color = LCD_COLOR(0xC0, 0xB0, 0xFF); + state->layer_text = "Numpad"; + } + else if (state->status.layer & 0x4) { + state->target_lcd_color = LCD_COLOR(0, 0xB0, 0xFF); + state->layer_text = "KBD functions"; + } + else if (state->status.layer & 0x2) { + state->target_lcd_color = LCD_COLOR(0x80, 0xB0, 0xFF); + state->layer_text = "Function keys"; + } + else { + state->target_lcd_color = LCD_COLOR(0x40, 0xB0, 0xFF); + state->layer_text = "Default"; + } + // You can also stop existing animations, and start your custom ones here + // remember that you should normally have only one animation for the LCD + // and one for the background. But you can also combine them if you want. + start_keyframe_animation(&lcd_animation); + start_keyframe_animation(&color_animation); +} + +void user_visualizer_suspend(visualizer_state_t* state) { + state->layer_text = "Suspending..."; + uint8_t hue = LCD_HUE(state->current_lcd_color); + uint8_t sat = LCD_SAT(state->current_lcd_color); + state->target_lcd_color = LCD_COLOR(hue, sat, 0); + start_keyframe_animation(&suspend_animation); +} + +void user_visualizer_resume(visualizer_state_t* state) { + state->current_lcd_color = LCD_COLOR(0x00, 0x00, 0x00); + state->target_lcd_color = LCD_COLOR(0x10, 0xFF, 0xFF); + start_keyframe_animation(&resume_animation); + start_keyframe_animation(&led_test_animation); +} diff --git a/quantum/visualizer/visualizer.mk b/quantum/visualizer/visualizer.mk index 2f4a41d66f..ecdeba1eee 100644 --- a/quantum/visualizer/visualizer.mk +++ b/quantum/visualizer/visualizer.mk @@ -50,7 +50,11 @@ ifneq ("$(wildcard $(KEYMAP_PATH)/visualizer.c)","") SRC += keyboards/$(KEYBOARD)/keymaps/$(KEYMAP)/visualizer.c else ifeq ("$(wildcard $(SUBPROJECT_PATH)/keymaps/$(KEYMAP)/visualizer.c)","") + ifeq ("$(wildcard $(SUBPROJECT_PATH)/visualizer.c)","") $(error "$(KEYMAP_PATH)/visualizer.c" does not exist) + else + SRC += keyboards/$(KEYBOARD)/$(SUBPROJECT)/visualizer.c + endif else SRC += keyboards/$(KEYBOARD)/$(SUBPROJECT)/keymaps/$(KEYMAP)/visualizer.c endif From bb86be1f1f3927a7ce339cb9439c97914af24754 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sun, 28 Aug 2016 23:08:34 +0300 Subject: [PATCH 083/117] Remove unneeded makefile include --- keyboards/ergodox/ez/rules.mk | 4 ---- keyboards/ergodox/infinity/rules.mk | 4 ---- 2 files changed, 8 deletions(-) diff --git a/keyboards/ergodox/ez/rules.mk b/keyboards/ergodox/ez/rules.mk index 64b2db8158..6cd1c0c4f7 100644 --- a/keyboards/ergodox/ez/rules.mk +++ b/keyboards/ergodox/ez/rules.mk @@ -74,7 +74,3 @@ OPT_DEFS += -DBOOTLOADER_SIZE=512 SLEEP_LED_ENABLE = no API_SYSEX_ENABLE ?= no RGBLIGHT_ENABLE ?= yes - -ifndef QUANTUM_DIR - include ../../../Makefile -endif diff --git a/keyboards/ergodox/infinity/rules.mk b/keyboards/ergodox/infinity/rules.mk index 1b011cd589..d51574acae 100644 --- a/keyboards/ergodox/infinity/rules.mk +++ b/keyboards/ergodox/infinity/rules.mk @@ -66,10 +66,6 @@ LCD_BACKLIGHT_ENABLE ?= yes MIDI_ENABLE = no RGBLIGHT_ENABLE = no -ifndef QUANTUM_DIR - include ../../../Makefile -endif - ifdef LCD_ENABLE include $(SUBPROJECT_PATH)/drivers/gdisp/st7565ergodox/driver.mk endif From f5c89416527a3ec435ed49137fd2bf4af216024c Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sun, 28 Aug 2016 23:25:39 +0300 Subject: [PATCH 084/117] UGFX is compiled once per keyboard instead of keymap --- build_keyboard.mk | 8 ++++---- .../infinity/drivers/gdisp/st7565ergodox/board_ST7565.h | 2 -- quantum/visualizer/visualizer.mk | 4 ++-- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/build_keyboard.mk b/build_keyboard.mk index 82464d5830..ad92892e27 100644 --- a/build_keyboard.mk +++ b/build_keyboard.mk @@ -258,12 +258,12 @@ endif OUTPUTS := $(KEYMAP_OUTPUT) $(KEYBOARD_OUTPUT) $(KEYMAP_OUTPUT)_SRC := $(SRC) -$(KEYMAP_OUTPUT)_DEFS := $(OPT_DEFS) -DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYMAP=\"$(KEYMAP)\" +$(KEYMAP_OUTPUT)_DEFS := $(OPT_DEFS) $(GFXDEFS) -DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYMAP=\"$(KEYMAP)\" $(KEYMAP_OUTPUT)_INC := $(VPATH) $(EXTRAINCDIRS) $(KEYMAP_OUTPUT)_CONFIG := $(CONFIG_H) -$(KEYBOARD_OUTPUT)_SRC := $(CHIBISRC) -$(KEYBOARD_OUTPUT)_DEFS := $(PROJECT_DEFS) -$(KEYBOARD_OUTPUT)_INC := $(PROJECT_INC) +$(KEYBOARD_OUTPUT)_SRC := $(CHIBISRC) $(GFXSRC) +$(KEYBOARD_OUTPUT)_DEFS := $(PROJECT_DEFS) $(GFXDEFS) +$(KEYBOARD_OUTPUT)_INC := $(PROJECT_INC) $(GFXINC) $(KEYBOARD_OUTPUT)_CONFIG := $(PROJECT_CONFIG) # Default target. diff --git a/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/board_ST7565.h b/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/board_ST7565.h index 290571ce5b..abda0bd858 100644 --- a/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/board_ST7565.h +++ b/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/board_ST7565.h @@ -8,8 +8,6 @@ #ifndef _GDISP_LLD_BOARD_H #define _GDISP_LLD_BOARD_H -#include "print.h" - #define ST7565_LCD_BIAS ST7565_LCD_BIAS_9 // actually 6 #define ST7565_ADC ST7565_ADC_NORMAL #define ST7565_COM_SCAN ST7565_COM_SCAN_DEC diff --git a/quantum/visualizer/visualizer.mk b/quantum/visualizer/visualizer.mk index ecdeba1eee..8f5fb89334 100644 --- a/quantum/visualizer/visualizer.mk +++ b/quantum/visualizer/visualizer.mk @@ -43,8 +43,8 @@ OPT_DEFS += -DLED_ENABLE endif include $(GFXLIB)/gfx.mk -SRC += $(patsubst $(TOP_DIR)/%,%,$(GFXSRC)) -OPT_DEFS += $(patsubst %,-D%,$(patsubst -D%,%,$(GFXDEFS))) +GFXSRC := $(patsubst $(TOP_DIR)/%,%,$(GFXSRC)) +GFXDEFS := $(patsubst %,-D%,$(patsubst -D%,%,$(GFXDEFS))) ifneq ("$(wildcard $(KEYMAP_PATH)/visualizer.c)","") SRC += keyboards/$(KEYBOARD)/keymaps/$(KEYMAP)/visualizer.c From 6039a4f6edefbad7604a9533d445091cd646f240 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Tue, 28 Mar 2017 09:59:29 +0300 Subject: [PATCH 085/117] Empty implementation of has_onshot_mods_timed_out When the timeout is zero or not defined, the function now returns false. Fixes a linker error when the visualizer is enabled --- tmk_core/common/action_util.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tmk_core/common/action_util.c b/tmk_core/common/action_util.c index cb4b252648..77848c0923 100644 --- a/tmk_core/common/action_util.c +++ b/tmk_core/common/action_util.c @@ -58,9 +58,13 @@ void set_oneshot_locked_mods(int8_t mods) { oneshot_locked_mods = mods; } void clear_oneshot_locked_mods(void) { oneshot_locked_mods = 0; } #if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0)) static int16_t oneshot_time = 0; -inline bool has_oneshot_mods_timed_out() { +bool has_oneshot_mods_timed_out(void) { return TIMER_DIFF_16(timer_read(), oneshot_time) >= ONESHOT_TIMEOUT; } +#else +bool has_oneshot_mods_timed_out(void) { + return false; +} #endif #endif From 503565d1742ed458c992192a05f6ffe1db053135 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Fri, 31 Mar 2017 22:51:00 +0300 Subject: [PATCH 086/117] Only re-send matrix every 5ms The previous 1ms value was too often, and wouldn't always leave time for the visualizer --- quantum/serial_link/system/serial_link.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quantum/serial_link/system/serial_link.c b/quantum/serial_link/system/serial_link.c index 75c7e77a76..b3bee62a18 100644 --- a/quantum/serial_link/system/serial_link.c +++ b/quantum/serial_link/system/serial_link.c @@ -212,7 +212,7 @@ void serial_link_update(void) { systime_t current_time = chVTGetSystemTimeX(); systime_t delta = current_time - last_update; - if (changed || delta > US2ST(1000)) { + if (changed || delta > US2ST(5000)) { last_update = current_time; last_matrix = matrix; matrix_object_t* m = begin_write_keyboard_matrix(); From 2b24d35846693a3365a35b6ee9bc31b70659cfcf Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Fri, 31 Mar 2017 23:58:10 +0300 Subject: [PATCH 087/117] Hopefully finally fix the corrupt LCD The SPI bus is now selected and deselected before each set of commands. Also speed up things by buffering many commands into a single batch. --- .../gdisp/st7565ergodox/board_ST7565.h | 46 +-- .../gdisp/st7565ergodox/gdisp_lld_ST7565.c | 371 ++++++++++-------- 2 files changed, 217 insertions(+), 200 deletions(-) diff --git a/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/board_ST7565.h b/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/board_ST7565.h index abda0bd858..c2092b5e8d 100644 --- a/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/board_ST7565.h +++ b/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/board_ST7565.h @@ -37,10 +37,14 @@ // MSB First // CLK Low by default static const SPIConfig spi1config = { - NULL, - /* HW dependent part.*/ - ST7565_GPIOPORT, - ST7565_SS_PIN, + // Operation complete callback or @p NULL. + .end_cb = NULL, + //The chip select line port - when not using pcs. + .ssport = ST7565_GPIOPORT, + // brief The chip select line pad number - when not using pcs. + .sspad=ST7565_SS_PIN, + // SPI initialization data. + .tar0 = SPIx_CTARn_FMSZ(7) | SPIx_CTARn_ASC(7) | SPIx_CTARn_DT(7) @@ -50,13 +54,10 @@ static const SPIConfig spi1config = { //SPI_CR1_BR_0 }; -static bool_t st7565_is_data_mode = 1; - static GFXINLINE void init_board(GDisplay *g) { (void) g; palSetPadModeNamed(A0, PAL_MODE_OUTPUT_PUSHPULL); palSetPad(ST7565_GPIOPORT, ST7565_A0_PIN); - st7565_is_data_mode = 1; palSetPadModeNamed(RST, PAL_MODE_OUTPUT_PUSHPULL); palSetPad(ST7565_GPIOPORT, ST7565_RST_PIN); palSetPadModeRaw(MOSI, ST7565_SPI_MODE); @@ -65,7 +66,6 @@ static GFXINLINE void init_board(GDisplay *g) { spiInit(); spiStart(&SPID1, &spi1config); - spiSelect(&SPID1); } static GFXINLINE void post_init_board(GDisplay *g) { @@ -86,39 +86,27 @@ static GFXINLINE void acquire_bus(GDisplay *g) { (void) g; // Only the LCD is using the SPI bus, so no need to acquire // spiAcquireBus(&SPID1); + spiSelect(&SPID1); } static GFXINLINE void release_bus(GDisplay *g) { (void) g; // Only the LCD is using the SPI bus, so no need to release //spiReleaseBus(&SPID1); + spiUnselect(&SPID1); } -static GFXINLINE void write_cmd(GDisplay *g, uint8_t cmd) { - (void) g; - if (st7565_is_data_mode) { - // The sleeps need to be at lest 10 vs 25 ns respectively - // So let's sleep two ticks, one tick might not be enough - // if we are at the end of the tick - chThdSleep(2); - palClearPad(ST7565_GPIOPORT, ST7565_A0_PIN); - chThdSleep(2); - st7565_is_data_mode = 0; - } - spiSend(&SPID1, 1, &cmd); +static GFXINLINE void enter_data_mode(GDisplay *g) { + palSetPad(ST7565_GPIOPORT, ST7565_A0_PIN); } +static GFXINLINE void enter_cmd_mode(GDisplay *g) { + palClearPad(ST7565_GPIOPORT, ST7565_A0_PIN); +} + + static GFXINLINE void write_data(GDisplay *g, uint8_t* data, uint16_t length) { (void) g; - if (!st7565_is_data_mode) { - // The sleeps need to be at lest 10 vs 25 ns respectively - // So let's sleep two ticks, one tick might not be enough - // if we are at the end of the tick - chThdSleep(2); - palSetPad(ST7565_GPIOPORT, ST7565_A0_PIN); - chThdSleep(2); - st7565_is_data_mode = 1; - } spiSend(&SPID1, length, data); } diff --git a/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/gdisp_lld_ST7565.c b/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/gdisp_lld_ST7565.c index c33aea81a8..4547f14193 100644 --- a/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/gdisp_lld_ST7565.c +++ b/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/gdisp_lld_ST7565.c @@ -20,16 +20,16 @@ /*===========================================================================*/ #ifndef GDISP_SCREEN_HEIGHT - #define GDISP_SCREEN_HEIGHT 32 +#define GDISP_SCREEN_HEIGHT 32 #endif #ifndef GDISP_SCREEN_WIDTH - #define GDISP_SCREEN_WIDTH 128 +#define GDISP_SCREEN_WIDTH 128 #endif #ifndef GDISP_INITIAL_CONTRAST - #define GDISP_INITIAL_CONTRAST 0 +#define GDISP_INITIAL_CONTRAST 0 #endif #ifndef GDISP_INITIAL_BACKLIGHT - #define GDISP_INITIAL_BACKLIGHT 100 +#define GDISP_INITIAL_BACKLIGHT 100 #endif #define GDISP_FLG_NEEDFLUSH (GDISP_FLG_DRIVER<<0) @@ -40,16 +40,16 @@ /* Driver config defaults for backward compatibility. */ /*===========================================================================*/ #ifndef ST7565_LCD_BIAS - #define ST7565_LCD_BIAS ST7565_LCD_BIAS_7 +#define ST7565_LCD_BIAS ST7565_LCD_BIAS_7 #endif #ifndef ST7565_ADC - #define ST7565_ADC ST7565_ADC_NORMAL +#define ST7565_ADC ST7565_ADC_NORMAL #endif #ifndef ST7565_COM_SCAN - #define ST7565_COM_SCAN ST7565_COM_SCAN_INC +#define ST7565_COM_SCAN ST7565_COM_SCAN_INC #endif #ifndef ST7565_PAGE_ORDER - #define ST7565_PAGE_ORDER 0,1,2,3 +#define ST7565_PAGE_ORDER 0,1,2,3 #endif /*===========================================================================*/ @@ -58,12 +58,24 @@ typedef struct{ bool_t buffer2; + uint8_t data_pos; + uint8_t data[16]; uint8_t ram[GDISP_SCREEN_HEIGHT * GDISP_SCREEN_WIDTH / 8]; }PrivData; // Some common routines and macros #define PRIV(g) ((PrivData*)g->priv) #define RAM(g) (PRIV(g)->ram) + +static GFXINLINE void write_cmd(GDisplay* g, uint8_t cmd) { + PRIV(g)->data[PRIV(g)->data_pos++] = cmd; +} + +static GFXINLINE void flush_cmd(GDisplay* g) { + write_data(g, PRIV(g)->data, PRIV(g)->data_pos); + PRIV(g)->data_pos = 0; +} + #define write_cmd2(g, cmd1, cmd2) { write_cmd(g, cmd1); write_cmd(g, cmd2); } #define write_cmd3(g, cmd1, cmd2, cmd3) { write_cmd(g, cmd1); write_cmd(g, cmd2); write_cmd(g, cmd3); } @@ -86,207 +98,224 @@ typedef struct{ */ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) { - // The private area is the display surface. - g->priv = gfxAlloc(sizeof(PrivData)); - PRIV(g)->buffer2 = false; + // The private area is the display surface. + g->priv = gfxAlloc(sizeof(PrivData)); + PRIV(g)->buffer2 = false; + PRIV(g)->data_pos = 0; - // Initialise the board interface - init_board(g); + // Initialise the board interface + init_board(g); - // Hardware reset - setpin_reset(g, TRUE); - gfxSleepMilliseconds(20); - setpin_reset(g, FALSE); - gfxSleepMilliseconds(20); + // Hardware reset + setpin_reset(g, TRUE); + gfxSleepMilliseconds(20); + setpin_reset(g, FALSE); + gfxSleepMilliseconds(20); - acquire_bus(g); + acquire_bus(g); + enter_cmd_mode(g); write_cmd(g, ST7565_DISPLAY_OFF); - write_cmd(g, ST7565_LCD_BIAS); + write_cmd(g, ST7565_LCD_BIAS); write_cmd(g, ST7565_ADC); write_cmd(g, ST7565_COM_SCAN); - + write_cmd(g, ST7565_START_LINE | 0); - write_cmd(g, ST7565_RESISTOR_RATIO | 0x6); + write_cmd(g, ST7565_RESISTOR_RATIO | 0x6); - // turn on voltage converter (VC=1, VR=0, VF=0) - write_cmd(g, ST7565_POWER_CONTROL | 0x04); - delay_ms(50); + // turn on voltage converter (VC=1, VR=0, VF=0) + write_cmd(g, ST7565_POWER_CONTROL | 0x04); + flush_cmd(g); + delay_ms(50); - // turn on voltage regulator (VC=1, VR=1, VF=0) - write_cmd(g, ST7565_POWER_CONTROL | 0x06); - delay_ms(50); + // turn on voltage regulator (VC=1, VR=1, VF=0) + write_cmd(g, ST7565_POWER_CONTROL | 0x06); + flush_cmd(g); + delay_ms(50); - // turn on voltage follower (VC=1, VR=1, VF=1) - write_cmd(g, ST7565_POWER_CONTROL | 0x07); - delay_ms(50); + // turn on voltage follower (VC=1, VR=1, VF=1) + write_cmd(g, ST7565_POWER_CONTROL | 0x07); + flush_cmd(g); + delay_ms(50); - write_cmd(g, 0xE2); + write_cmd(g, 0xE2); write_cmd(g, ST7565_COM_SCAN); - write_cmd2(g, ST7565_CONTRAST, GDISP_INITIAL_CONTRAST*64/101); - //write_cmd2(g, ST7565_CONTRAST, 0); - write_cmd(g, ST7565_DISPLAY_ON); - write_cmd(g, ST7565_ALLON_NORMAL); - write_cmd(g, ST7565_INVERT_DISPLAY); + write_cmd2(g, ST7565_CONTRAST, GDISP_INITIAL_CONTRAST*64/101); + //write_cmd2(g, ST7565_CONTRAST, 0); + write_cmd(g, ST7565_DISPLAY_ON); + write_cmd(g, ST7565_ALLON_NORMAL); + write_cmd(g, ST7565_INVERT_DISPLAY); - write_cmd(g, ST7565_RMW); + write_cmd(g, ST7565_RMW); + flush_cmd(g); // Finish Init post_init_board(g); - // Release the bus - release_bus(g); + // Release the bus + release_bus(g); - /* Initialise the GDISP structure */ - g->g.Width = GDISP_SCREEN_WIDTH; - g->g.Height = GDISP_SCREEN_HEIGHT; - g->g.Orientation = GDISP_ROTATE_0; - g->g.Powermode = powerOn; - g->g.Backlight = GDISP_INITIAL_BACKLIGHT; - g->g.Contrast = GDISP_INITIAL_CONTRAST; - return TRUE; + /* Initialise the GDISP structure */ + g->g.Width = GDISP_SCREEN_WIDTH; + g->g.Height = GDISP_SCREEN_HEIGHT; + g->g.Orientation = GDISP_ROTATE_0; + g->g.Powermode = powerOn; + g->g.Backlight = GDISP_INITIAL_BACKLIGHT; + g->g.Contrast = GDISP_INITIAL_CONTRAST; + return TRUE; } #if GDISP_HARDWARE_FLUSH - LLDSPEC void gdisp_lld_flush(GDisplay *g) { - unsigned p; +LLDSPEC void gdisp_lld_flush(GDisplay *g) { + unsigned p; - // Don't flush if we don't need it. - if (!(g->flags & GDISP_FLG_NEEDFLUSH)) - return; + // Don't flush if we don't need it. + if (!(g->flags & GDISP_FLG_NEEDFLUSH)) + return; - acquire_bus(g); - unsigned dstOffset = (PRIV(g)->buffer2 ? 4 : 0); - for (p = 0; p < 4; p++) { - write_cmd(g, ST7565_PAGE | (p + dstOffset)); - write_cmd(g, ST7565_COLUMN_MSB | 0); - write_cmd(g, ST7565_COLUMN_LSB | 0); - write_cmd(g, ST7565_RMW); - write_data(g, RAM(g) + (p*GDISP_SCREEN_WIDTH), GDISP_SCREEN_WIDTH); - } - unsigned line = (PRIV(g)->buffer2 ? 32 : 0); - write_cmd(g, ST7565_START_LINE | line); - PRIV(g)->buffer2 = !PRIV(g)->buffer2; - release_bus(g); + acquire_bus(g); + enter_cmd_mode(g); + unsigned dstOffset = (PRIV(g)->buffer2 ? 4 : 0); + for (p = 0; p < 4; p++) { + write_cmd(g, ST7565_PAGE | (p + dstOffset)); + write_cmd(g, ST7565_COLUMN_MSB | 0); + write_cmd(g, ST7565_COLUMN_LSB | 0); + write_cmd(g, ST7565_RMW); + flush_cmd(g); + enter_data_mode(g); + write_data(g, RAM(g) + (p*GDISP_SCREEN_WIDTH), GDISP_SCREEN_WIDTH); + enter_cmd_mode(g); + } + unsigned line = (PRIV(g)->buffer2 ? 32 : 0); + write_cmd(g, ST7565_START_LINE | line); + flush_cmd(g); + PRIV(g)->buffer2 = !PRIV(g)->buffer2; + release_bus(g); - g->flags &= ~GDISP_FLG_NEEDFLUSH; - } + g->flags &= ~GDISP_FLG_NEEDFLUSH; +} #endif #if GDISP_HARDWARE_DRAWPIXEL - LLDSPEC void gdisp_lld_draw_pixel(GDisplay *g) { - coord_t x, y; +LLDSPEC void gdisp_lld_draw_pixel(GDisplay *g) { + coord_t x, y; - switch(g->g.Orientation) { - default: - case GDISP_ROTATE_0: - x = g->p.x; - y = g->p.y; - break; - case GDISP_ROTATE_90: - x = g->p.y; - y = GDISP_SCREEN_HEIGHT-1 - g->p.x; - break; - case GDISP_ROTATE_180: - x = GDISP_SCREEN_WIDTH-1 - g->p.x; - y = GDISP_SCREEN_HEIGHT-1 - g->p.y; - break; - case GDISP_ROTATE_270: - x = GDISP_SCREEN_HEIGHT-1 - g->p.y; - y = g->p.x; - break; - } - if (gdispColor2Native(g->p.color) != Black) - RAM(g)[xyaddr(x, y)] |= xybit(y); - else - RAM(g)[xyaddr(x, y)] &= ~xybit(y); - g->flags |= GDISP_FLG_NEEDFLUSH; - } + switch(g->g.Orientation) { + default: + case GDISP_ROTATE_0: + x = g->p.x; + y = g->p.y; + break; + case GDISP_ROTATE_90: + x = g->p.y; + y = GDISP_SCREEN_HEIGHT-1 - g->p.x; + break; + case GDISP_ROTATE_180: + x = GDISP_SCREEN_WIDTH-1 - g->p.x; + y = GDISP_SCREEN_HEIGHT-1 - g->p.y; + break; + case GDISP_ROTATE_270: + x = GDISP_SCREEN_HEIGHT-1 - g->p.y; + y = g->p.x; + break; + } + if (gdispColor2Native(g->p.color) != Black) + RAM(g)[xyaddr(x, y)] |= xybit(y); + else + RAM(g)[xyaddr(x, y)] &= ~xybit(y); + g->flags |= GDISP_FLG_NEEDFLUSH; +} #endif #if GDISP_HARDWARE_PIXELREAD - LLDSPEC color_t gdisp_lld_get_pixel_color(GDisplay *g) { - coord_t x, y; +LLDSPEC color_t gdisp_lld_get_pixel_color(GDisplay *g) { + coord_t x, y; - switch(g->g.Orientation) { - default: - case GDISP_ROTATE_0: - x = g->p.x; - y = g->p.y; - break; - case GDISP_ROTATE_90: - x = g->p.y; - y = GDISP_SCREEN_HEIGHT-1 - g->p.x; - break; - case GDISP_ROTATE_180: - x = GDISP_SCREEN_WIDTH-1 - g->p.x; - y = GDISP_SCREEN_HEIGHT-1 - g->p.y; - break; - case GDISP_ROTATE_270: - x = GDISP_SCREEN_HEIGHT-1 - g->p.y; - y = g->p.x; - break; - } - return (RAM(g)[xyaddr(x, y)] & xybit(y)) ? White : Black; - } + switch(g->g.Orientation) { + default: + case GDISP_ROTATE_0: + x = g->p.x; + y = g->p.y; + break; + case GDISP_ROTATE_90: + x = g->p.y; + y = GDISP_SCREEN_HEIGHT-1 - g->p.x; + break; + case GDISP_ROTATE_180: + x = GDISP_SCREEN_WIDTH-1 - g->p.x; + y = GDISP_SCREEN_HEIGHT-1 - g->p.y; + break; + case GDISP_ROTATE_270: + x = GDISP_SCREEN_HEIGHT-1 - g->p.y; + y = g->p.x; + break; + } + return (RAM(g)[xyaddr(x, y)] & xybit(y)) ? White : Black; +} #endif #if GDISP_NEED_CONTROL && GDISP_HARDWARE_CONTROL - LLDSPEC void gdisp_lld_control(GDisplay *g) { - switch(g->p.x) { - case GDISP_CONTROL_POWER: - if (g->g.Powermode == (powermode_t)g->p.ptr) - return; - switch((powermode_t)g->p.ptr) { - case powerOff: - case powerSleep: - case powerDeepSleep: - acquire_bus(g); - write_cmd(g, ST7565_DISPLAY_OFF); - release_bus(g); - break; - case powerOn: - acquire_bus(g); - write_cmd(g, ST7565_DISPLAY_ON); - release_bus(g); - break; - default: - return; - } - g->g.Powermode = (powermode_t)g->p.ptr; - return; +LLDSPEC void gdisp_lld_control(GDisplay *g) { + switch(g->p.x) { + case GDISP_CONTROL_POWER: + if (g->g.Powermode == (powermode_t)g->p.ptr) + return; + switch((powermode_t)g->p.ptr) { + case powerOff: + case powerSleep: + case powerDeepSleep: + acquire_bus(g); + enter_cmd_mode(g); + write_cmd(g, ST7565_DISPLAY_OFF); + flush_cmd(g); + release_bus(g); + break; + case powerOn: + acquire_bus(g); + enter_cmd_mode(g); + write_cmd(g, ST7565_DISPLAY_ON); + flush_cmd(g); + release_bus(g); + break; + default: + return; + } + g->g.Powermode = (powermode_t)g->p.ptr; + return; - case GDISP_CONTROL_ORIENTATION: - if (g->g.Orientation == (orientation_t)g->p.ptr) - return; - switch((orientation_t)g->p.ptr) { - /* Rotation is handled by the drawing routines */ - case GDISP_ROTATE_0: - case GDISP_ROTATE_180: - g->g.Height = GDISP_SCREEN_HEIGHT; - g->g.Width = GDISP_SCREEN_WIDTH; - break; - case GDISP_ROTATE_90: - case GDISP_ROTATE_270: - g->g.Height = GDISP_SCREEN_WIDTH; - g->g.Width = GDISP_SCREEN_HEIGHT; - break; - default: - return; - } - g->g.Orientation = (orientation_t)g->p.ptr; - return; + case GDISP_CONTROL_ORIENTATION: + if (g->g.Orientation == (orientation_t)g->p.ptr) + return; + switch((orientation_t)g->p.ptr) { + /* Rotation is handled by the drawing routines */ + case GDISP_ROTATE_0: + case GDISP_ROTATE_180: + g->g.Height = GDISP_SCREEN_HEIGHT; + g->g.Width = GDISP_SCREEN_WIDTH; + break; + case GDISP_ROTATE_90: + case GDISP_ROTATE_270: + g->g.Height = GDISP_SCREEN_WIDTH; + g->g.Width = GDISP_SCREEN_HEIGHT; + break; + default: + return; + } + g->g.Orientation = (orientation_t)g->p.ptr; + return; - case GDISP_CONTROL_CONTRAST: - if ((unsigned)g->p.ptr > 100) - g->p.ptr = (void *)100; - acquire_bus(g); - write_cmd2(g, ST7565_CONTRAST, ((((unsigned)g->p.ptr)<<6)/101) & 0x3F); - release_bus(g); - g->g.Contrast = (unsigned)g->p.ptr; - return; - } - } + case GDISP_CONTROL_CONTRAST: + if ((unsigned)g->p.ptr > 100) + g->p.ptr = (void *)100; + acquire_bus(g); + enter_cmd_mode(g); + write_cmd2(g, ST7565_CONTRAST, ((((unsigned)g->p.ptr)<<6)/101) & 0x3F); + flush_cmd(g); + release_bus(g); + g->g.Contrast = (unsigned)g->p.ptr; + return; + } +} #endif // GDISP_NEED_CONTROL #endif // GFX_USE_GDISP From a8f5897b976ee9f16b1798db38fb0ee4b8981c9e Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sat, 1 Apr 2017 16:36:34 +0300 Subject: [PATCH 088/117] Add support for blitting to the Infinity LCD --- .../gdisp/st7565ergodox/gdisp_lld_ST7565.c | 26 +++++++++++++++++++ .../gdisp/st7565ergodox/gdisp_lld_config.h | 11 ++++---- keyboards/ergodox/infinity/gfxconf.h | 2 +- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/gdisp_lld_ST7565.c b/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/gdisp_lld_ST7565.c index 4547f14193..2c8a168e76 100644 --- a/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/gdisp_lld_ST7565.c +++ b/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/gdisp_lld_ST7565.c @@ -254,6 +254,32 @@ LLDSPEC color_t gdisp_lld_get_pixel_color(GDisplay *g) { } #endif +LLDSPEC void gdisp_lld_blit_area(GDisplay *g) { + uint8_t* buffer = (uint8_t*)g->p.ptr; + int linelength = g->p.cx; + for (int i = 0; i < g->p.cy; i++) { + unsigned dstx = g->p.x; + unsigned dsty = g->p.y + i; + unsigned srcx = g->p.x1; + unsigned srcy = g->p.y1 + i; + unsigned srcbit = srcy * g->p.x2 + srcx; + for(int j=0; j < linelength; j++) { + uint8_t src = buffer[srcbit / 8]; + uint8_t bit = 7-(srcbit % 8); + uint8_t bitset = (src >> bit) & 1; + uint8_t* dst = &(RAM(g)[xyaddr(dstx, dsty)]); + if (bitset) { + *dst |= xybit(dsty); + } + else { + *dst &= ~xybit(dsty); + } + dstx++; + srcbit++; + } + } +} + #if GDISP_NEED_CONTROL && GDISP_HARDWARE_CONTROL LLDSPEC void gdisp_lld_control(GDisplay *g) { switch(g->p.x) { diff --git a/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/gdisp_lld_config.h b/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/gdisp_lld_config.h index 48587b9e14..2b66a877c8 100644 --- a/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/gdisp_lld_config.h +++ b/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/gdisp_lld_config.h @@ -14,12 +14,13 @@ /* Driver hardware support. */ /*===========================================================================*/ -#define GDISP_HARDWARE_FLUSH TRUE // This controller requires flushing -#define GDISP_HARDWARE_DRAWPIXEL TRUE -#define GDISP_HARDWARE_PIXELREAD TRUE -#define GDISP_HARDWARE_CONTROL TRUE +#define GDISP_HARDWARE_FLUSH TRUE // This controller requires flushing +#define GDISP_HARDWARE_DRAWPIXEL TRUE +#define GDISP_HARDWARE_PIXELREAD TRUE +#define GDISP_HARDWARE_CONTROL TRUE +#define GDISP_HARDWARE_BITFILLS TRUE -#define GDISP_LLD_PIXELFORMAT GDISP_PIXELFORMAT_MONO +#define GDISP_LLD_PIXELFORMAT GDISP_PIXELFORMAT_MONO #endif /* GFX_USE_GDISP */ diff --git a/keyboards/ergodox/infinity/gfxconf.h b/keyboards/ergodox/infinity/gfxconf.h index 8caa577b73..45b9f58580 100644 --- a/keyboards/ergodox/infinity/gfxconf.h +++ b/keyboards/ergodox/infinity/gfxconf.h @@ -143,7 +143,7 @@ #define GDISP_HARDWARE_DRAWPIXEL TRUE #define GDISP_HARDWARE_CLEARS FALSE #define GDISP_HARDWARE_FILLS FALSE - #define GDISP_HARDWARE_BITFILLS FALSE + //#define GDISP_HARDWARE_BITFILLS FALSE #define GDISP_HARDWARE_SCROLL FALSE #define GDISP_HARDWARE_PIXELREAD TRUE #define GDISP_HARDWARE_CONTROL TRUE From e6f7a8a47a82258725683980b83e215c8323aef2 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sat, 1 Apr 2017 16:37:31 +0300 Subject: [PATCH 089/117] Display QMK logo at startup of Infinity Ergodox --- keyboards/ergodox/infinity/lcd_logo.png | Bin 0 -> 490 bytes keyboards/ergodox/infinity/visualizer.c | 89 +++++++++++++++++------- 2 files changed, 65 insertions(+), 24 deletions(-) create mode 100644 keyboards/ergodox/infinity/lcd_logo.png diff --git a/keyboards/ergodox/infinity/lcd_logo.png b/keyboards/ergodox/infinity/lcd_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6cf26fc6783a5b586eedbc6ff0940e124795e9bf GIT binary patch literal 490 zcmeAS@N?(olHy`uVBq!ia0y~yU}#`qU{K&-V_;yorBtBGz`(fC)5S5QV$R!{H-!!> zaJc%u`Tu|8WjjOXm77w8xu2^Rnit(YvF-iu-71MU)5{fRdUGjQXf`}p!q7CCiQ}C2 zsS8oRJ6CVr^zv4Xh3(8{4F-ctCob$QIk_RT!hXjcrl@TDre=e__eZ~;DtI4sciN|z z|9c<#F|6Ghl&!nMh+P>80?SHNv!VRJl9|RX~F=n$W*86nq6VrpR zmfbub{nKT(Gfha_);5*Lkh`4e!MDfOyk4)D{k^b__hTVO@?< zzq58j=-t(4+B#;i6g*jyT_~V>J~@u@gRJjGa%6p5=d1f7d zrL(E6&^mnWs&@Xyge&t3cbagnU3~P_1<9-Zk3R-qK7Mg~. #include "visualizer.h" #include "led_test.h" -static const char* welcome_text[] = {"TMK", "Infinity Ergodox"}; +// To generate an image array like this +// Ensure the image is 128 x 32 or smaller +// Convert the bitmap to a C array using a program like http://www.riuson.com/lcd-image-converter/ +// Ensure the the conversion process produces a monochrome format array - 1 bit/pixel, left to right, top to bottom +// Update array in the source code with the C array produced by the conversion program -// Just an example how to write custom keyframe functions, we could have moved -// all this into the init function -bool display_welcome(keyframe_animation_t* animation, visualizer_state_t* state) { +// The image below is generated from lcd_logo.png +static const uint8_t image_data_lcd_logo[512] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0xfe, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x38, 0x38, 0x06, 0x29, 0x41, 0x24, 0x52, 0x24, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x38, 0x38, 0x09, 0x55, 0x42, 0xaa, 0xaa, 0xaa, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x38, 0x38, 0x09, 0x55, 0x82, 0x28, 0xaa, 0xae, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x38, 0x38, 0x09, 0x55, 0x43, 0x28, 0xaa, 0xaa, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x38, 0x38, 0x0a, 0x55, 0x42, 0x28, 0xaa, 0xaa, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x38, 0x38, 0x05, 0x45, 0x42, 0x28, 0x89, 0x4a, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x38, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x38, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0xff, 0x80, 0x04, 0x45, 0x14, 0xa4, 0x92, 0x83, 0x52, 0x22, 0x22, 0x36, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xba, 0x84, 0x55, 0x55, 0x57, 0x45, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x00, 0x08, 0xaa, 0xaa, 0xaa, 0x92, 0xb2, 0x55, 0x55, 0x42, 0x65, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x00, 0x08, 0xaa, 0xaa, 0xaa, 0x92, 0x81, 0x56, 0x65, 0x42, 0x45, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0x92, 0x81, 0x54, 0x45, 0x42, 0x45, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x00, 0x04, 0x48, 0xa2, 0x4a, 0x89, 0x06, 0x24, 0x42, 0x41, 0x36, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const uint32_t logo_background_color = LCD_COLOR(0x00, 0x00, 0x80); +static const uint32_t initial_color = LCD_COLOR(0, 0, 0xFF); + +bool display_logo(keyframe_animation_t* animation, visualizer_state_t* state) { + (void)state; (void)animation; + (void)state; // Read the uGFX documentation for information how to use the displays // http://wiki.ugfx.org/index.php/Main_Page gdispClear(White); + // You can use static variables for things that can't be found in the animation - // or state structs - gdispDrawString(0, 3, welcome_text[0], state->font_dejavusansbold12, Black); - gdispDrawString(0, 15, welcome_text[1], state->font_dejavusansbold12, Black); + // or state structs, here we use the image + + //gdispGBlitArea is a tricky function to use since it supports blitting part of the image + // if you have full screen image, then just use 128 and 32 for both source and target dimensions + gdispGBlitArea(GDISP, 0, 0, 128, 32, 0, 0, 128, (pixel_t*)image_data_lcd_logo); + // Always remember to flush the display gdispFlush(); - // you could set the backlight color as well, but we won't do it here, since - // it's part of the following animation - // lcd_backlight_color(hue, saturation, intensity); - // We don't need constant updates, just drawing the screen once is enough return false; } @@ -56,13 +99,12 @@ bool display_welcome(keyframe_animation_t* animation, visualizer_state_t* state) // Don't worry, if the startup animation is long, you can use the keyboard like normal // during that time static keyframe_animation_t startup_animation = { - .num_frames = 4, + .num_frames = 3, .loop = false, - .frame_lengths = {0, gfxMillisecondsToTicks(1000), gfxMillisecondsToTicks(5000), 0}, + .frame_lengths = {0, gfxMillisecondsToTicks(10000), 0}, .frame_functions = { - display_welcome, + display_logo, keyframe_animate_backlight_color, - keyframe_no_operation, enable_visualization }, }; @@ -78,6 +120,7 @@ static keyframe_animation_t color_animation = { .frame_functions = {keyframe_no_operation, keyframe_animate_backlight_color}, }; + // The LCD animation alternates between the layer name display and a // bitmap that displays all active layers static keyframe_animation_t lcd_animation = { @@ -99,14 +142,13 @@ static keyframe_animation_t suspend_animation = { }; static keyframe_animation_t resume_animation = { - .num_frames = 5, + .num_frames = 4, .loop = false, - .frame_lengths = {0, 0, gfxMillisecondsToTicks(1000), gfxMillisecondsToTicks(5000), 0}, + .frame_lengths = {0, 0, gfxMillisecondsToTicks(10000), 0}, .frame_functions = { keyframe_enable_lcd_and_backlight, - display_welcome, + display_logo, keyframe_animate_backlight_color, - keyframe_no_operation, enable_visualization, }, }; @@ -115,10 +157,9 @@ void initialize_user_visualizer(visualizer_state_t* state) { // The brightness will be dynamically adjustable in the future // But for now, change it here. lcd_backlight_brightness(0x50); - state->current_lcd_color = LCD_COLOR(0x00, 0x00, 0xFF); - state->target_lcd_color = LCD_COLOR(0x10, 0xFF, 0xFF); + state->current_lcd_color = initial_color; + state->target_lcd_color = logo_background_color; start_keyframe_animation(&startup_animation); - start_keyframe_animation(&led_test_animation); } void update_user_visualizer_state(visualizer_state_t* state) { @@ -161,8 +202,8 @@ void user_visualizer_suspend(visualizer_state_t* state) { } void user_visualizer_resume(visualizer_state_t* state) { - state->current_lcd_color = LCD_COLOR(0x00, 0x00, 0x00); - state->target_lcd_color = LCD_COLOR(0x10, 0xFF, 0xFF); + state->current_lcd_color = initial_color; + state->target_lcd_color = logo_background_color; start_keyframe_animation(&resume_animation); start_keyframe_animation(&led_test_animation); } From bc97413bf70b1906b387dea35bb22575ec57eff8 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sat, 1 Apr 2017 16:38:12 +0300 Subject: [PATCH 090/117] Disable LEDs on Infinity Ergodox --- keyboards/ergodox/infinity/rules.mk | 2 +- keyboards/ergodox/infinity/visualizer.c | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/keyboards/ergodox/infinity/rules.mk b/keyboards/ergodox/infinity/rules.mk index d51574acae..aaadfe34b5 100644 --- a/keyboards/ergodox/infinity/rules.mk +++ b/keyboards/ergodox/infinity/rules.mk @@ -61,7 +61,7 @@ CUSTOM_MATRIX ?= yes # Custom matrix file SERIAL_LINK_ENABLE = yes VISUALIZER_ENABLE ?= yes LCD_ENABLE ?= yes -LED_ENABLE ?= yes +LED_ENABLE ?= no LCD_BACKLIGHT_ENABLE ?= yes MIDI_ENABLE = no RGBLIGHT_ENABLE = no diff --git a/keyboards/ergodox/infinity/visualizer.c b/keyboards/ergodox/infinity/visualizer.c index 0ce1d4ae4e..c8fc3d78ef 100644 --- a/keyboards/ergodox/infinity/visualizer.c +++ b/keyboards/ergodox/infinity/visualizer.c @@ -27,7 +27,6 @@ along with this program. If not, see . #endif #include "visualizer.h" -#include "led_test.h" // To generate an image array like this // Ensure the image is 128 x 32 or smaller @@ -205,5 +204,4 @@ void user_visualizer_resume(visualizer_state_t* state) { state->current_lcd_color = initial_color; state->target_lcd_color = logo_background_color; start_keyframe_animation(&resume_animation); - start_keyframe_animation(&led_test_animation); } From f113f95440f8cd7377930868656caf515dbd609c Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sat, 1 Apr 2017 17:43:38 +0300 Subject: [PATCH 091/117] Move CIE1931 and breathing tables to its own file --- build_keyboard.mk | 23 ++++++ .../gdisp/IS31FL3731C/gdisp_IS31FL3731C.c | 37 ++-------- quantum/led_tables.c | 71 +++++++++++++++++++ quantum/led_tables.h | 30 ++++++++ quantum/rgblight.c | 58 ++------------- quantum/visualizer/visualizer.mk | 4 +- 6 files changed, 136 insertions(+), 87 deletions(-) create mode 100644 quantum/led_tables.c create mode 100644 quantum/led_tables.h diff --git a/build_keyboard.mk b/build_keyboard.mk index ad92892e27..79d2b6b0f0 100644 --- a/build_keyboard.mk +++ b/build_keyboard.mk @@ -196,6 +196,8 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes) OPT_DEFS += -DRGBLIGHT_ENABLE SRC += $(QUANTUM_DIR)/light_ws2812.c SRC += $(QUANTUM_DIR)/rgblight.c + CIE1931_CURVE = yes + LED_BREATHING_TABLE = yes endif ifeq ($(strip $(TAP_DANCE_ENABLE)), yes) @@ -223,6 +225,27 @@ ifneq ($(strip $(MAX_VARIABLE_TRACE_SIZE)),) endif endif +ifeq ($(strip $(LCD_ENABLE)), yes) +CIE1931_CURVE = yes +endif + +ifeq ($(strip $(LED_ENABLE)), yes) +CIE1931_CURVE = yes +endif + +ifeq ($(strip $(CIE1931_CURVE)), yes) + OPT_DEFS += -DUSE_CIE1931_CURVE + LED_TABLES = yes +endif +ifeq ($(strip $(LED_BREATHING_TABLE)), yes) + OPT_DEFS += -DUSE_LED_BREATHING_TABLE + LED_TABLES = yes +endif + +ifeq ($(strip $(LED_TABLES)), yes) + SRC += $(QUANTUM_DIR)/led_tables.c +endif + # Optimize size but this may cause error "relocation truncated to fit" #EXTRALDFLAGS = -Wl,--relax diff --git a/keyboards/ergodox/infinity/drivers/gdisp/IS31FL3731C/gdisp_IS31FL3731C.c b/keyboards/ergodox/infinity/drivers/gdisp/IS31FL3731C/gdisp_IS31FL3731C.c index 1d21f0c498..ea09c4bb0c 100644 --- a/keyboards/ergodox/infinity/drivers/gdisp/IS31FL3731C/gdisp_IS31FL3731C.c +++ b/keyboards/ergodox/infinity/drivers/gdisp/IS31FL3731C/gdisp_IS31FL3731C.c @@ -25,6 +25,10 @@ along with this program. If not, see . #include "board_IS31FL3731C.h" + +// Can't include led_tables from here +extern const uint8_t CIE1931_CURVE[]; + /*===========================================================================*/ /* Driver local definitions. */ /*===========================================================================*/ @@ -100,37 +104,6 @@ along with this program. If not, see . #define IS31 -//Generated by http://jared.geek.nz/2013/feb/linear-led-pwm -const unsigned char cie[256] = { - 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, - 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, - 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, - 7, 8, 8, 8, 8, 9, 9, 9, 10, 10, - 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, - 13, 14, 14, 15, 15, 15, 16, 16, 17, 17, - 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, - 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, - 28, 28, 29, 29, 30, 31, 31, 32, 32, 33, - 34, 34, 35, 36, 37, 37, 38, 39, 39, 40, - 41, 42, 43, 43, 44, 45, 46, 47, 47, 48, - 49, 50, 51, 52, 53, 54, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 70, 71, 72, 73, 74, 75, 76, 77, 79, - 80, 81, 82, 83, 85, 86, 87, 88, 90, 91, - 92, 94, 95, 96, 98, 99, 100, 102, 103, 105, - 106, 108, 109, 110, 112, 113, 115, 116, 118, 120, - 121, 123, 124, 126, 128, 129, 131, 132, 134, 136, - 138, 139, 141, 143, 145, 146, 148, 150, 152, 154, - 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, - 175, 177, 179, 181, 183, 185, 187, 189, 191, 193, - 196, 198, 200, 202, 204, 207, 209, 211, 214, 216, - 218, 220, 223, 225, 228, 230, 232, 235, 237, 240, - 242, 245, 247, 250, 252, 255, -}; - - /*===========================================================================*/ /* Driver local functions. */ /*===========================================================================*/ @@ -231,7 +204,7 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) { uint8_t* src = PRIV(g)->frame_buffer; for (int y=0;ywrite_buffer[get_led_address(g, x, y)]=cie[*src]; + PRIV(g)->write_buffer[get_led_address(g, x, y)]=CIE1931_CURVE[*src]; ++src; } } diff --git a/quantum/led_tables.c b/quantum/led_tables.c new file mode 100644 index 0000000000..b99f262097 --- /dev/null +++ b/quantum/led_tables.c @@ -0,0 +1,71 @@ +/* +Copyright 2017 Fred Sundvik + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include "led_tables.h" + + +#ifdef USE_CIE1931_CURVE +// Lightness curve using the CIE 1931 lightness formula +//Generated by the python script provided in http://jared.geek.nz/2013/feb/linear-led-pwm +const uint8_t CIE1931_CURVE[] PROGMEM = { + 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, + 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, + 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, + 7, 8, 8, 8, 8, 9, 9, 9, 10, 10, + 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, + 13, 14, 14, 15, 15, 15, 16, 16, 17, 17, + 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, + 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, + 28, 28, 29, 29, 30, 31, 31, 32, 32, 33, + 34, 34, 35, 36, 37, 37, 38, 39, 39, 40, + 41, 42, 43, 43, 44, 45, 46, 47, 47, 48, + 49, 50, 51, 52, 53, 54, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 70, 71, 72, 73, 74, 75, 76, 77, 79, + 80, 81, 82, 83, 85, 86, 87, 88, 90, 91, + 92, 94, 95, 96, 98, 99, 100, 102, 103, 105, + 106, 108, 109, 110, 112, 113, 115, 116, 118, 120, + 121, 123, 124, 126, 128, 129, 131, 132, 134, 136, + 138, 139, 141, 143, 145, 146, 148, 150, 152, 154, + 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, + 175, 177, 179, 181, 183, 185, 187, 189, 191, 193, + 196, 198, 200, 202, 204, 207, 209, 211, 214, 216, + 218, 220, 223, 225, 228, 230, 232, 235, 237, 240, + 242, 245, 247, 250, 252, 255, + }; +#endif + +#ifdef USE_LED_BREATHING_TABLE +const uint8_t LED_BREATHING_TABLE[] PROGMEM = { + 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 9, + 10, 11, 12, 14, 15, 17, 18, 20, 21, 23, 25, 27, 29, 31, 33, 35, + 37, 40, 42, 44, 47, 49, 52, 54, 57, 59, 62, 65, 67, 70, 73, 76, + 79, 82, 85, 88, 90, 93, 97, 100, 103, 106, 109, 112, 115, 118, 121, 124, + 127, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 162, 165, 167, 170, 173, + 176, 179, 182, 185, 188, 190, 193, 196, 198, 201, 203, 206, 208, 211, 213, 215, + 218, 220, 222, 224, 226, 228, 230, 232, 234, 235, 237, 238, 240, 241, 243, 244, + 245, 246, 248, 249, 250, 250, 251, 252, 253, 253, 254, 254, 254, 255, 255, 255, + 255, 255, 255, 255, 254, 254, 254, 253, 253, 252, 251, 250, 250, 249, 248, 246, + 245, 244, 243, 241, 240, 238, 237, 235, 234, 232, 230, 228, 226, 224, 222, 220, + 218, 215, 213, 211, 208, 206, 203, 201, 198, 196, 193, 190, 188, 185, 182, 179, + 176, 173, 170, 167, 165, 162, 158, 155, 152, 149, 146, 143, 140, 137, 134, 131, + 128, 124, 121, 118, 115, 112, 109, 106, 103, 100, 97, 93, 90, 88, 85, 82, + 79, 76, 73, 70, 67, 65, 62, 59, 57, 54, 52, 49, 47, 44, 42, 40, + 37, 35, 33, 31, 29, 27, 25, 23, 21, 20, 18, 17, 15, 14, 12, 11, + 10, 9, 7, 6, 5, 5, 4, 3, 2, 2, 1, 1, 1, 0, 0, 0 +}; +#endif diff --git a/quantum/led_tables.h b/quantum/led_tables.h new file mode 100644 index 0000000000..af49bf3323 --- /dev/null +++ b/quantum/led_tables.h @@ -0,0 +1,30 @@ +/* +Copyright 2017 Fred Sundvik + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef LED_TABLES_H +#define LED_TABLES_H + +#include "progmem.h" +#include + +#ifdef USE_CIE1931_CURVE +extern const uint8_t CIE1931_CURVE[] PROGMEM; +#endif + +#ifdef USE_LED_BREATHING_TABLE +extern const uint8_t LED_BREATHING_TABLE[] PROGMEM; +#endif + +#endif diff --git a/quantum/rgblight.c b/quantum/rgblight.c index eff70aae1d..4eec2a7762 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -20,56 +20,8 @@ #include "timer.h" #include "rgblight.h" #include "debug.h" +#include "led_tables.h" -// Lightness curve using the CIE 1931 lightness formula -//Generated by the python script provided in http://jared.geek.nz/2013/feb/linear-led-pwm -const uint8_t DIM_CURVE[] PROGMEM = { - 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, - 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, - 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, - 7, 8, 8, 8, 8, 9, 9, 9, 10, 10, - 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, - 13, 14, 14, 15, 15, 15, 16, 16, 17, 17, - 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, - 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, - 28, 28, 29, 29, 30, 31, 31, 32, 32, 33, - 34, 34, 35, 36, 37, 37, 38, 39, 39, 40, - 41, 42, 43, 43, 44, 45, 46, 47, 47, 48, - 49, 50, 51, 52, 53, 54, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 70, 71, 72, 73, 74, 75, 76, 77, 79, - 80, 81, 82, 83, 85, 86, 87, 88, 90, 91, - 92, 94, 95, 96, 98, 99, 100, 102, 103, 105, - 106, 108, 109, 110, 112, 113, 115, 116, 118, 120, - 121, 123, 124, 126, 128, 129, 131, 132, 134, 136, - 138, 139, 141, 143, 145, 146, 148, 150, 152, 154, - 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, - 175, 177, 179, 181, 183, 185, 187, 189, 191, 193, - 196, 198, 200, 202, 204, 207, 209, 211, 214, 216, - 218, 220, 223, 225, 228, 230, 232, 235, 237, 240, - 242, 245, 247, 250, 252, 255, - }; - -const uint8_t RGBLED_BREATHING_TABLE[] PROGMEM = { - 0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 9, - 10, 11, 12, 14, 15, 17, 18, 20, 21, 23, 25, 27, 29, 31, 33, 35, - 37, 40, 42, 44, 47, 49, 52, 54, 57, 59, 62, 65, 67, 70, 73, 76, - 79, 82, 85, 88, 90, 93, 97, 100, 103, 106, 109, 112, 115, 118, 121, 124, - 127, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 162, 165, 167, 170, 173, - 176, 179, 182, 185, 188, 190, 193, 196, 198, 201, 203, 206, 208, 211, 213, 215, - 218, 220, 222, 224, 226, 228, 230, 232, 234, 235, 237, 238, 240, 241, 243, 244, - 245, 246, 248, 249, 250, 250, 251, 252, 253, 253, 254, 254, 254, 255, 255, 255, - 255, 255, 255, 255, 254, 254, 254, 253, 253, 252, 251, 250, 250, 249, 248, 246, - 245, 244, 243, 241, 240, 238, 237, 235, 234, 232, 230, 228, 226, 224, 222, 220, - 218, 215, 213, 211, 208, 206, 203, 201, 198, 196, 193, 190, 188, 185, 182, 179, - 176, 173, 170, 167, 165, 162, 158, 155, 152, 149, 146, 143, 140, 137, 134, 131, - 128, 124, 121, 118, 115, 112, 109, 106, 103, 100, 97, 93, 90, 88, 85, 82, - 79, 76, 73, 70, 67, 65, 62, 59, 57, 54, 52, 49, 47, 44, 42, 40, - 37, 35, 33, 31, 29, 27, 25, 23, 21, 20, 18, 17, 15, 14, 12, 11, - 10, 9, 7, 6, 5, 5, 4, 3, 2, 2, 1, 1, 1, 0, 0, 0 -}; __attribute__ ((weak)) const uint8_t RGBLED_BREATHING_INTERVALS[] PROGMEM = {30, 20, 10, 5}; @@ -135,9 +87,9 @@ void sethsv(uint16_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1) { break; } } - r = pgm_read_byte(&DIM_CURVE[r]); - g = pgm_read_byte(&DIM_CURVE[g]); - b = pgm_read_byte(&DIM_CURVE[b]); + r = pgm_read_byte(&CIE1931_CURVE[r]); + g = pgm_read_byte(&CIE1931_CURVE[g]); + b = pgm_read_byte(&CIE1931_CURVE[b]); setrgb(r, g, b, led1); } @@ -509,7 +461,7 @@ void rgblight_effect_breathing(uint8_t interval) { } last_timer = timer_read(); - rgblight_sethsv_noeeprom(rgblight_config.hue, rgblight_config.sat, pgm_read_byte(&RGBLED_BREATHING_TABLE[pos])); + rgblight_sethsv_noeeprom(rgblight_config.hue, rgblight_config.sat, pgm_read_byte(&LED_BREATHING_TABLE[pos])); pos = (pos + 1) % 256; } void rgblight_effect_rainbow_mood(uint8_t interval) { diff --git a/quantum/visualizer/visualizer.mk b/quantum/visualizer/visualizer.mk index 8f5fb89334..3861cb1f04 100644 --- a/quantum/visualizer/visualizer.mk +++ b/quantum/visualizer/visualizer.mk @@ -32,12 +32,12 @@ OPT_DEFS += -DLCD_ENABLE ULIBS += -lm endif -ifdef LCD_BACKLIGHT_ENABLE +ifeq ($(strip $(LCD_ENABLE)), yes) SRC += $(VISUALIZER_DIR)/lcd_backlight.c OPT_DEFS += -DLCD_BACKLIGHT_ENABLE endif -ifdef LED_ENABLE +ifeq ($(strip $(LED_ENABLE)), yes) SRC += $(VISUALIZER_DIR)/led_test.c OPT_DEFS += -DLED_ENABLE endif From 951b6f33a0dc479d29831aaa5c73fc526faf0471 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sat, 1 Apr 2017 21:28:27 +0300 Subject: [PATCH 092/117] CIE 1931 for the LCD backlight --- keyboards/ergodox/infinity/infinity.c | 29 ++++++++++++++++++++++--- keyboards/ergodox/infinity/visualizer.c | 6 ++--- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/keyboards/ergodox/infinity/infinity.c b/keyboards/ergodox/infinity/infinity.c index 02db67eaf2..ecc072abbe 100644 --- a/keyboards/ergodox/infinity/infinity.c +++ b/keyboards/ergodox/infinity/infinity.c @@ -70,10 +70,33 @@ void lcd_backlight_hal_init(void) { RGB_PORT->PCR[BLUE_PIN] = RGB_MODE; } +static uint16_t cie_lightness(uint16_t v) { + // The CIE 1931 formula for lightness + // Y = luminance (output) 0-1 + // L = lightness input 0 - 100 + + // Y = (L* / 902.3) if L* <= 8 + // Y = ((L* + 16) / 116)^3 if L* > 8 + + float l = 100.0f * (v / 65535.0f); + float y = 0.0f; + if (l <= 8.0f) { + y = l / 902.3; + } + else { + y = ((l + 16.0f) / 116.0f); + y = y * y * y; + if (y > 1.0f) { + y = 1.0f; + } + } + return y * 65535.0f; +} + void lcd_backlight_hal_color(uint16_t r, uint16_t g, uint16_t b) { - CHANNEL_RED.CnV = r; - CHANNEL_GREEN.CnV = g; - CHANNEL_BLUE.CnV = b; + CHANNEL_RED.CnV = cie_lightness(r); + CHANNEL_GREEN.CnV = cie_lightness(g); + CHANNEL_BLUE.CnV = cie_lightness(b); } __attribute__ ((weak)) diff --git a/keyboards/ergodox/infinity/visualizer.c b/keyboards/ergodox/infinity/visualizer.c index c8fc3d78ef..12336fdc57 100644 --- a/keyboards/ergodox/infinity/visualizer.c +++ b/keyboards/ergodox/infinity/visualizer.c @@ -70,8 +70,8 @@ static const uint8_t image_data_lcd_logo[512] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -static const uint32_t logo_background_color = LCD_COLOR(0x00, 0x00, 0x80); -static const uint32_t initial_color = LCD_COLOR(0, 0, 0xFF); +static const uint32_t logo_background_color = LCD_COLOR(0x00, 0x00, 0xFF); +static const uint32_t initial_color = LCD_COLOR(0, 0, 0); bool display_logo(keyframe_animation_t* animation, visualizer_state_t* state) { (void)state; @@ -155,7 +155,7 @@ static keyframe_animation_t resume_animation = { void initialize_user_visualizer(visualizer_state_t* state) { // The brightness will be dynamically adjustable in the future // But for now, change it here. - lcd_backlight_brightness(0x50); + lcd_backlight_brightness(130); state->current_lcd_color = initial_color; state->target_lcd_color = logo_background_color; start_keyframe_animation(&startup_animation); From 9a4ce28683b667ab67d48d92196bab7e277d4800 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sat, 1 Apr 2017 22:52:58 +0300 Subject: [PATCH 093/117] Display layer bitmap and keyboard led states on the LCD --- keyboards/ergodox/infinity/visualizer.c | 86 ++++++++++++++++--------- quantum/visualizer/visualizer.c | 38 ++++++++++- quantum/visualizer/visualizer.h | 4 +- 3 files changed, 97 insertions(+), 31 deletions(-) diff --git a/keyboards/ergodox/infinity/visualizer.c b/keyboards/ergodox/infinity/visualizer.c index 12336fdc57..6af3a72ee1 100644 --- a/keyboards/ergodox/infinity/visualizer.c +++ b/keyboards/ergodox/infinity/visualizer.c @@ -73,6 +73,14 @@ static const uint8_t image_data_lcd_logo[512] = { static const uint32_t logo_background_color = LCD_COLOR(0x00, 0x00, 0xFF); static const uint32_t initial_color = LCD_COLOR(0, 0, 0); +typedef enum { + LCD_STATE_INITIAL, + LCD_STATE_LAYER_BITMAP, + LCD_STATE_BITMAP_AND_LEDS, +} lcd_state_t; + +static lcd_state_t lcd_state = LCD_STATE_INITIAL; + bool display_logo(keyframe_animation_t* animation, visualizer_state_t* state) { (void)state; (void)animation; @@ -122,11 +130,18 @@ static keyframe_animation_t color_animation = { // The LCD animation alternates between the layer name display and a // bitmap that displays all active layers -static keyframe_animation_t lcd_animation = { +static keyframe_animation_t lcd_bitmap_animation = { + .num_frames = 1, + .loop = false, + .frame_lengths = {gfxMillisecondsToTicks(0)}, + .frame_functions = {keyframe_display_layer_bitmap}, +}; + +static keyframe_animation_t lcd_bitmap_leds_animation = { .num_frames = 2, .loop = true, .frame_lengths = {gfxMillisecondsToTicks(2000), gfxMillisecondsToTicks(2000)}, - .frame_functions = {keyframe_display_layer_text, keyframe_display_layer_bitmap}, + .frame_functions = {keyframe_display_layer_bitmap, keyframe_display_led_states}, }; static keyframe_animation_t suspend_animation = { @@ -158,38 +173,50 @@ void initialize_user_visualizer(visualizer_state_t* state) { lcd_backlight_brightness(130); state->current_lcd_color = initial_color; state->target_lcd_color = logo_background_color; + lcd_state = LCD_STATE_INITIAL; start_keyframe_animation(&startup_animation); } -void update_user_visualizer_state(visualizer_state_t* state) { - // Add more tests, change the colors and layer texts here - // Usually you want to check the high bits (higher layers first) - // because that's the order layers are processed for keypresses - // You can for check for example: - // state->status.layer - // state->status.default_layer - // state->status.leds (see led.h for available statuses) - if (state->status.layer & 0x8) { - state->target_lcd_color = LCD_COLOR(0xC0, 0xB0, 0xFF); - state->layer_text = "Numpad"; - } - else if (state->status.layer & 0x4) { - state->target_lcd_color = LCD_COLOR(0, 0xB0, 0xFF); - state->layer_text = "KBD functions"; - } - else if (state->status.layer & 0x2) { - state->target_lcd_color = LCD_COLOR(0x80, 0xB0, 0xFF); - state->layer_text = "Function keys"; - } - else { +void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard_status_t prev_status) { + // Check the status here to start and stop animations + // You might have to save some state, like the current animation here so that you can start the right + // This function is called every time the status changes + + // NOTE that this is called from the visualizer thread, so don't access anything else outside the status + // This is also important because the slave won't have access to the active layer for example outside the + // status. + + if (lcd_state == LCD_STATE_INITIAL) { state->target_lcd_color = LCD_COLOR(0x40, 0xB0, 0xFF); - state->layer_text = "Default"; + start_keyframe_animation(&color_animation); + } + + if (state->status.leds) { + if (lcd_state != LCD_STATE_BITMAP_AND_LEDS || + state->status.leds != prev_status.leds || + state->status.layer != prev_status.layer || + state->status.default_layer != prev_status.default_layer) { + + // NOTE: that it doesn't matter if the animation isn't playing, stop will do nothing in that case + stop_keyframe_animation(&lcd_bitmap_animation); + + lcd_state = LCD_STATE_BITMAP_AND_LEDS; + // For information: + // The logic in this function makes sure that this doesn't happen, but if you call start on an + // animation that is already playing it will be restarted. + start_keyframe_animation(&lcd_bitmap_leds_animation); + } + } else { + if (lcd_state != LCD_STATE_LAYER_BITMAP || + state->status.layer != prev_status.layer || + state->status.default_layer != prev_status.default_layer) { + + stop_keyframe_animation(&lcd_bitmap_leds_animation); + + lcd_state = LCD_STATE_LAYER_BITMAP; + start_keyframe_animation(&lcd_bitmap_animation); + } } - // You can also stop existing animations, and start your custom ones here - // remember that you should normally have only one animation for the LCD - // and one for the background. But you can also combine them if you want. - start_keyframe_animation(&lcd_animation); - start_keyframe_animation(&color_animation); } void user_visualizer_suspend(visualizer_state_t* state) { @@ -203,5 +230,6 @@ void user_visualizer_suspend(visualizer_state_t* state) { void user_visualizer_resume(visualizer_state_t* state) { state->current_lcd_color = initial_color; state->target_lcd_color = logo_background_color; + lcd_state = LCD_STATE_INITIAL; start_keyframe_animation(&resume_animation); } diff --git a/quantum/visualizer/visualizer.c b/quantum/visualizer/visualizer.c index 5826d909e4..62ebebceed 100644 --- a/quantum/visualizer/visualizer.c +++ b/quantum/visualizer/visualizer.c @@ -56,6 +56,8 @@ SOFTWARE. // mods status #include "action_util.h" +#include "led.h" + static visualizer_keyboard_status_t current_status = { .layer = 0xFFFFFFFF, .default_layer = 0xFFFFFFFF, @@ -350,6 +352,39 @@ bool keyframe_display_mods_bitmap(keyframe_animation_t* animation, visualizer_st gdispFlush(); return false; } + +bool keyframe_display_led_states(keyframe_animation_t* animation, visualizer_state_t* state) +{ + char output[sizeof("NUM CAPS SCRL COMP KANA")]; + uint8_t pos = 0; + + if (state->status.leds & (1u << USB_LED_NUM_LOCK)) { + memcpy(output + pos, "NUM ", 4); + pos += 4; + } + if (state->status.leds & (1u << USB_LED_CAPS_LOCK)) { + memcpy(output + pos, "CAPS ", 5); + pos += 5; + } + if (state->status.leds & (1u << USB_LED_SCROLL_LOCK)) { + memcpy(output + pos, "SCRL ", 5); + pos += 5; + } + if (state->status.leds & (1u << USB_LED_COMPOSE)) { + memcpy(output + pos, "COMP ", 5); + pos += 5; + } + if (state->status.leds & (1u << USB_LED_KANA)) { + memcpy(output + pos, "KANA ", 5); + pos += 5; + } + output[pos] = 0; + gdispClear(White); + gdispDrawString(0, 10, output, state->font_dejavusansbold12, Black); + gdispFlush(); + return false; +} + #endif // LCD_ENABLE bool keyframe_disable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state) { @@ -433,8 +468,9 @@ static DECLARE_THREAD_FUNCTION(visualizerThread, arg) { user_visualizer_suspend(&state); } else { + visualizer_keyboard_status_t prev_status = state.status; state.status = current_status; - update_user_visualizer_state(&state); + update_user_visualizer_state(&state, prev_status); } state.prev_lcd_color = state.current_lcd_color; } diff --git a/quantum/visualizer/visualizer.h b/quantum/visualizer/visualizer.h index 315af50228..2c81cb9f71 100644 --- a/quantum/visualizer/visualizer.h +++ b/quantum/visualizer/visualizer.h @@ -136,6 +136,8 @@ bool keyframe_display_layer_text(keyframe_animation_t* animation, visualizer_sta bool keyframe_display_layer_bitmap(keyframe_animation_t* animation, visualizer_state_t* state); // Displays a bitmap (0/1) of all the currently active mods bool keyframe_display_mods_bitmap(keyframe_animation_t* animation, visualizer_state_t* state); +// Displays the keyboard led states (CAPS (Caps lock), NUM (Num lock), SCRL (Scroll lock), COMP (Compose), KANA) +bool keyframe_display_led_states(keyframe_animation_t* animation, visualizer_state_t* state); bool keyframe_disable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state); bool keyframe_enable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state); @@ -146,7 +148,7 @@ bool enable_visualization(keyframe_animation_t* animation, visualizer_state_t* s // These functions have to be implemented by the user void initialize_user_visualizer(visualizer_state_t* state); -void update_user_visualizer_state(visualizer_state_t* state); +void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard_status_t prev_status); void user_visualizer_suspend(visualizer_state_t* state); void user_visualizer_resume(visualizer_state_t* state); From 39385144e7dc3337e623cdc8147b4a441f22fd62 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sun, 2 Apr 2017 01:31:04 +0300 Subject: [PATCH 094/117] Emulate Ergodox EZ leds by LCD colors --- keyboards/ergodox/infinity/config.h | 2 + keyboards/ergodox/infinity/infinity.c | 22 ++- keyboards/ergodox/infinity/infinity.h | 71 ++++++---- keyboards/ergodox/infinity/visualizer.c | 175 ++++++++++++++++++++++-- quantum/visualizer/visualizer.c | 25 +++- quantum/visualizer/visualizer.h | 8 ++ 6 files changed, 258 insertions(+), 45 deletions(-) diff --git a/keyboards/ergodox/infinity/config.h b/keyboards/ergodox/infinity/config.h index 9e264083be..6cde193e13 100644 --- a/keyboards/ergodox/infinity/config.h +++ b/keyboards/ergodox/infinity/config.h @@ -54,6 +54,8 @@ along with this program. If not, see . // The visualizer needs gfx thread priorities #define VISUALIZER_THREAD_PRIORITY (NORMAL_PRIORITY - 2) +#define VISUALIZER_USER_DATA_SIZE 16 + /* * Feature disable options * These options are also useful to firmware size reduction. diff --git a/keyboards/ergodox/infinity/infinity.c b/keyboards/ergodox/infinity/infinity.c index ecc072abbe..62259ed3f6 100644 --- a/keyboards/ergodox/infinity/infinity.c +++ b/keyboards/ergodox/infinity/infinity.c @@ -126,34 +126,48 @@ void matrix_scan_kb(void) { matrix_scan_user(); } +__attribute__ ((weak)) void ergodox_board_led_on(void){ } +__attribute__ ((weak)) void ergodox_right_led_1_on(void){ } +__attribute__ ((weak)) void ergodox_right_led_2_on(void){ } +__attribute__ ((weak)) void ergodox_right_led_3_on(void){ } -void ergodox_right_led_on(uint8_t led){ -} - +__attribute__ ((weak)) void ergodox_board_led_off(void){ } +__attribute__ ((weak)) void ergodox_right_led_1_off(void){ } +__attribute__ ((weak)) void ergodox_right_led_2_off(void){ } +__attribute__ ((weak)) void ergodox_right_led_3_off(void){ } -void ergodox_right_led_off(uint8_t led){ +__attribute__ ((weak)) +void ergodox_right_led_1_set(uint8_t n) { +} + +__attribute__ ((weak)) +void ergodox_right_led_2_set(uint8_t n) { +} + +__attribute__ ((weak)) +void ergodox_right_led_3_set(uint8_t n) { } #ifdef ONEHAND_ENABLE diff --git a/keyboards/ergodox/infinity/infinity.h b/keyboards/ergodox/infinity/infinity.h index fec9e565cd..73a0f4bf70 100644 --- a/keyboards/ergodox/infinity/infinity.h +++ b/keyboards/ergodox/infinity/infinity.h @@ -7,13 +7,38 @@ void ergodox_board_led_on(void); void ergodox_right_led_1_on(void); void ergodox_right_led_2_on(void); void ergodox_right_led_3_on(void); -void ergodox_right_led_on(uint8_t led); + +inline void ergodox_right_led_on(uint8_t led) { + switch (led) { + case 0: + ergodox_right_led_1_on(); + break; + case 1: + ergodox_right_led_2_on(); + break; + case 2: + ergodox_right_led_3_on(); + break; + } +} void ergodox_board_led_off(void); void ergodox_right_led_1_off(void); void ergodox_right_led_2_off(void); void ergodox_right_led_3_off(void); -void ergodox_right_led_off(uint8_t led); +inline void ergodox_right_led_off(uint8_t led) { + switch (led) { + case 0: + ergodox_right_led_1_off(); + break; + case 1: + ergodox_right_led_2_off(); + break; + case 2: + ergodox_right_led_3_off(); + break; + } +} inline void ergodox_led_all_on(void) { @@ -31,36 +56,22 @@ inline void ergodox_led_all_off(void) ergodox_right_led_3_off(); } -inline void ergodox_right_led_1_set(uint8_t n){ - if (n) { - ergodox_right_led_1_on(); - } else { - ergodox_right_led_1_off(); - } -} - -inline void ergodox_right_led_2_set(uint8_t n){ - if (n) { - ergodox_right_led_2_on(); - } else { - ergodox_right_led_2_off(); - } -} - -inline void ergodox_right_led_3_set(uint8_t n){ - if (n) { - ergodox_right_led_3_on(); - } else { - ergodox_right_led_3_off(); - } -} +void ergodox_right_led_1_set(uint8_t n); +void ergodox_right_led_2_set(uint8_t n); +void ergodox_right_led_3_set(uint8_t n); inline void ergodox_right_led_set(uint8_t led, uint8_t n){ - if (n) { - ergodox_right_led_on(led); - } else { - ergodox_right_led_off(led); - } + switch (led) { + case 0: + ergodox_right_led_1_set(n); + break; + case 1: + ergodox_right_led_2_set(n); + break; + case 2: + ergodox_right_led_3_set(n); + break; + } } inline void ergodox_led_all_set(uint8_t n) { diff --git a/keyboards/ergodox/infinity/visualizer.c b/keyboards/ergodox/infinity/visualizer.c index 6af3a72ee1..7bc42fbc70 100644 --- a/keyboards/ergodox/infinity/visualizer.c +++ b/keyboards/ergodox/infinity/visualizer.c @@ -27,6 +27,7 @@ along with this program. If not, see . #endif #include "visualizer.h" +#include "system/serial_link.h" // To generate an image array like this // Ensure the image is 128 x 32 or smaller @@ -73,6 +74,15 @@ static const uint8_t image_data_lcd_logo[512] = { static const uint32_t logo_background_color = LCD_COLOR(0x00, 0x00, 0xFF); static const uint32_t initial_color = LCD_COLOR(0, 0, 0); +static const uint32_t led_emulation_colors[4] = { + LCD_COLOR(0, 0, 0), + LCD_COLOR(255, 255, 255), + LCD_COLOR(84, 255, 255), + LCD_COLOR(168, 255, 255), +}; + +static uint32_t next_led_target_color = 0; + typedef enum { LCD_STATE_INITIAL, LCD_STATE_LAYER_BITMAP, @@ -81,6 +91,19 @@ typedef enum { static lcd_state_t lcd_state = LCD_STATE_INITIAL; +typedef struct { + uint8_t led_on; + uint8_t led1; + uint8_t led2; + uint8_t led3; +} visualizer_user_data_t; + +// Don't access from visualization function, use the visualizer state instead +static visualizer_user_data_t user_data_keyboard = {}; + +_Static_assert(sizeof(visualizer_user_data_t) <= VISUALIZER_USER_DATA_SIZE, + "Please increase the VISUALIZER_USER_DATA_SIZE"); + bool display_logo(keyframe_animation_t* animation, visualizer_state_t* state) { (void)state; (void)animation; @@ -117,16 +140,27 @@ static keyframe_animation_t startup_animation = { }; // The color animation animates the LCD color when you change layers -static keyframe_animation_t color_animation = { - .num_frames = 2, +static keyframe_animation_t one_led_color = { + .num_frames = 1, .loop = false, - // Note that there's a 200 ms no-operation frame, - // this prevents the color from changing when activating the layer - // momentarily - .frame_lengths = {gfxMillisecondsToTicks(200), gfxMillisecondsToTicks(500)}, - .frame_functions = {keyframe_no_operation, keyframe_animate_backlight_color}, + .frame_lengths = {gfxMillisecondsToTicks(0)}, + .frame_functions = {keyframe_set_backlight_color}, }; +bool swap_led_target_color(keyframe_animation_t* animation, visualizer_state_t* state) { + uint32_t temp = next_led_target_color; + next_led_target_color = state->target_lcd_color; + state->target_lcd_color = temp; + return false; +} + +// The color animation animates the LCD color when you change layers +static keyframe_animation_t two_led_colors = { + .num_frames = 2, + .loop = true, + .frame_lengths = {gfxMillisecondsToTicks(1000), gfxMillisecondsToTicks(0)}, + .frame_functions = {keyframe_set_backlight_color, swap_led_target_color}, +}; // The LCD animation alternates between the layer name display and a // bitmap that displays all active layers @@ -177,6 +211,45 @@ void initialize_user_visualizer(visualizer_state_t* state) { start_keyframe_animation(&startup_animation); } +static const uint32_t red; +static const uint32_t green; +static const uint32_t blue; + +inline bool is_led_on(visualizer_user_data_t* user_data, uint8_t num) { + return user_data->led_on & (1u << num); +} + +static uint8_t get_led_index_master(visualizer_user_data_t* user_data) { + for (int i=0; i < 3; i++) { + if (is_led_on(user_data, i)) { + return i + 1; + } + } + return 0; +} + +static uint8_t get_led_index_slave(visualizer_user_data_t* user_data) { + uint8_t master_index = get_led_index_master(user_data); + if (master_index!=0) { + for (int i=master_index; i < 3; i++) { + if (is_led_on(user_data, i)) { + return i + 1; + } + } + } + + return 0; +} + +static uint8_t get_secondary_led_index(visualizer_user_data_t* user_data) { + if (is_led_on(user_data, 0) && + is_led_on(user_data, 1) && + is_led_on(user_data, 2)) { + return 3; + } + return 0; +} + void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard_status_t prev_status) { // Check the status here to start and stop animations // You might have to save some state, like the current animation here so that you can start the right @@ -186,9 +259,38 @@ void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard // This is also important because the slave won't have access to the active layer for example outside the // status. - if (lcd_state == LCD_STATE_INITIAL) { - state->target_lcd_color = LCD_COLOR(0x40, 0xB0, 0xFF); - start_keyframe_animation(&color_animation); + + visualizer_user_data_t* user_data_new = (visualizer_user_data_t*)state->status.user_data; + visualizer_user_data_t* user_data_old = (visualizer_user_data_t*)prev_status.user_data; + + uint8_t new_index; + uint8_t old_index; + + if (is_serial_link_master()) { + new_index = get_led_index_master(user_data_new); + old_index = get_led_index_master(user_data_old); + } + else { + new_index = get_led_index_slave(user_data_new); + old_index = get_led_index_slave(user_data_old); + } + uint8_t new_secondary_index = get_secondary_led_index(user_data_new); + uint8_t old_secondary_index = get_secondary_led_index(user_data_old); + + if (lcd_state == LCD_STATE_INITIAL || + new_index != old_index || + new_secondary_index != old_secondary_index) { + + if (new_secondary_index != 0) { + state->target_lcd_color = led_emulation_colors[new_index]; + next_led_target_color = led_emulation_colors[new_secondary_index]; + stop_keyframe_animation(&one_led_color); + start_keyframe_animation(&two_led_colors); + } else { + state->target_lcd_color = led_emulation_colors[new_index]; + stop_keyframe_animation(&two_led_colors); + start_keyframe_animation(&one_led_color); + } } if (state->status.leds) { @@ -233,3 +335,56 @@ void user_visualizer_resume(visualizer_state_t* state) { lcd_state = LCD_STATE_INITIAL; start_keyframe_animation(&resume_animation); } + +void ergodox_board_led_on(void){ + // No board led support +} + +void ergodox_right_led_1_on(void){ + user_data_keyboard.led_on |= (1u << 0); + visualizer_set_user_data(&user_data_keyboard); +} + +void ergodox_right_led_2_on(void){ + user_data_keyboard.led_on |= (1u << 1); + visualizer_set_user_data(&user_data_keyboard); +} + +void ergodox_right_led_3_on(void){ + user_data_keyboard.led_on |= (1u << 2); + visualizer_set_user_data(&user_data_keyboard); +} + +void ergodox_board_led_off(void){ + // No board led support +} + +void ergodox_right_led_1_off(void){ + user_data_keyboard.led_on &= ~(1u << 0); + visualizer_set_user_data(&user_data_keyboard); +} + +void ergodox_right_led_2_off(void){ + user_data_keyboard.led_on &= ~(1u << 1); + visualizer_set_user_data(&user_data_keyboard); +} + +void ergodox_right_led_3_off(void){ + user_data_keyboard.led_on &= ~(1u << 2); + visualizer_set_user_data(&user_data_keyboard); +} + +void ergodox_right_led_1_set(uint8_t n) { + user_data_keyboard.led1 = n; + visualizer_set_user_data(&user_data_keyboard); +} + +void ergodox_right_led_2_set(uint8_t n) { + user_data_keyboard.led2 = n; + visualizer_set_user_data(&user_data_keyboard); +} + +void ergodox_right_led_3_set(uint8_t n) { + user_data_keyboard.led3 = n; + visualizer_set_user_data(&user_data_keyboard); +} diff --git a/quantum/visualizer/visualizer.c b/quantum/visualizer/visualizer.c index 62ebebceed..bff0df4947 100644 --- a/quantum/visualizer/visualizer.c +++ b/quantum/visualizer/visualizer.c @@ -64,6 +64,9 @@ static visualizer_keyboard_status_t current_status = { .mods = 0xFF, .leds = 0xFFFFFFFF, .suspended = false, +#ifdef VISUALIZER_USER_DATA_SIZE + .user_data = {0} +#endif }; static bool same_status(visualizer_keyboard_status_t* status1, visualizer_keyboard_status_t* status2) { @@ -71,11 +74,19 @@ static bool same_status(visualizer_keyboard_status_t* status1, visualizer_keyboa status1->default_layer == status2->default_layer && status1->mods == status2->mods && status1->leds == status2->leds && - status1->suspended == status2->suspended; + status1->suspended == status2->suspended +#ifdef VISUALIZER_USER_DATA_SIZE + && memcmp(status1->user_data, status2->user_data, VISUALIZER_USER_DATA_SIZE) == 0 +#endif + ; } static bool visualizer_enabled = false; +#ifdef VISUALIZER_USER_DATA_SIZE +static uint8_t user_data[VISUALIZER_USER_DATA_SIZE]; +#endif + #define MAX_SIMULTANEOUS_ANIMATIONS 4 static keyframe_animation_t* animations[MAX_SIMULTANEOUS_ANIMATIONS] = {}; @@ -431,6 +442,9 @@ static DECLARE_THREAD_FUNCTION(visualizerThread, arg) { .mods = 0xFF, .leds = 0xFFFFFFFF, .suspended = false, +#ifdef VISUALIZER_USER_DATA_SIZE + .user_data = {0}, +#endif }; visualizer_state_t state = { @@ -590,6 +604,12 @@ uint8_t visualizer_get_mods() { return mods; } +#ifdef VISUALIZER_USER_DATA_SIZE +void visualizer_set_user_data(void* u) { + memcpy(user_data, u, VISUALIZER_USER_DATA_SIZE); +} +#endif + void visualizer_update(uint32_t default_state, uint32_t state, uint8_t mods, uint32_t leds) { // Note that there's a small race condition here, the thread could read // a state where one of these are set but not the other. But this should @@ -618,6 +638,9 @@ void visualizer_update(uint32_t default_state, uint32_t state, uint8_t mods, uin .leds = leds, .suspended = current_status.suspended, }; +#ifdef VISUALIZER_USER_DATA_SIZE + memcpy(new_status.user_data, user_data, VISUALIZER_USER_DATA_SIZE); +#endif if (!same_status(¤t_status, &new_status)) { changed = true; current_status = new_status; diff --git a/quantum/visualizer/visualizer.h b/quantum/visualizer/visualizer.h index 2c81cb9f71..beb8f2ab41 100644 --- a/quantum/visualizer/visualizer.h +++ b/quantum/visualizer/visualizer.h @@ -68,6 +68,9 @@ typedef struct { uint8_t mods; uint32_t leds; // See led.h for available statuses bool suspended; +#ifdef VISUALIZER_USER_DATA_SIZE + uint8_t user_data[VISUALIZER_USER_DATA_SIZE]; +#endif } visualizer_keyboard_status_t; // The state struct is used by the various keyframe functions @@ -146,6 +149,11 @@ bool keyframe_enable_lcd_and_backlight(keyframe_animation_t* animation, visualiz // directly from the initalize_user_visualizer function (the animation can be null) bool enable_visualization(keyframe_animation_t* animation, visualizer_state_t* state); +// The master can set userdata which will be transferred to the slave +#ifdef VISUALIZER_USER_DATA_SIZE +void visualizer_set_user_data(void* user_data); +#endif + // These functions have to be implemented by the user void initialize_user_visualizer(visualizer_state_t* state); void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard_status_t prev_status); From 5fbaf31dc26a7bb27eb276ec419255e92b293d60 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sun, 2 Apr 2017 02:29:50 +0300 Subject: [PATCH 095/117] Brightness for Ergodox Infinity emulated LEDs --- keyboards/ergodox/infinity/config.h | 2 +- keyboards/ergodox/infinity/visualizer.c | 76 ++++++++++++++++++------- quantum/visualizer/lcd_backlight.h | 4 ++ quantum/visualizer/visualizer.c | 2 +- quantum/visualizer/visualizer.h | 2 +- 5 files changed, 63 insertions(+), 23 deletions(-) diff --git a/keyboards/ergodox/infinity/config.h b/keyboards/ergodox/infinity/config.h index 6cde193e13..95f713819e 100644 --- a/keyboards/ergodox/infinity/config.h +++ b/keyboards/ergodox/infinity/config.h @@ -40,7 +40,7 @@ along with this program. If not, see . /* number of backlight levels */ #define BACKLIGHT_LEVELS 3 -#define LED_BRIGHTNESS_LO 15 +#define LED_BRIGHTNESS_LO 100 #define LED_BRIGHTNESS_HI 255 /* define if matrix has ghost */ diff --git a/keyboards/ergodox/infinity/visualizer.c b/keyboards/ergodox/infinity/visualizer.c index 7bc42fbc70..c7afd9384c 100644 --- a/keyboards/ergodox/infinity/visualizer.c +++ b/keyboards/ergodox/infinity/visualizer.c @@ -99,7 +99,12 @@ typedef struct { } visualizer_user_data_t; // Don't access from visualization function, use the visualizer state instead -static visualizer_user_data_t user_data_keyboard = {}; +static visualizer_user_data_t user_data_keyboard = { + .led_on = 0, + .led1 = LED_BRIGHTNESS_HI, + .led2 = LED_BRIGHTNESS_HI, + .led3 = LED_BRIGHTNESS_HI, +}; _Static_assert(sizeof(visualizer_user_data_t) <= VISUALIZER_USER_DATA_SIZE, "Please increase the VISUALIZER_USER_DATA_SIZE"); @@ -250,18 +255,21 @@ static uint8_t get_secondary_led_index(visualizer_user_data_t* user_data) { return 0; } -void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard_status_t prev_status) { - // Check the status here to start and stop animations - // You might have to save some state, like the current animation here so that you can start the right - // This function is called every time the status changes - - // NOTE that this is called from the visualizer thread, so don't access anything else outside the status - // This is also important because the slave won't have access to the active layer for example outside the - // status. - +static uint8_t get_brightness(visualizer_user_data_t* user_data, uint8_t index) { + switch (index) { + case 1: + return user_data->led1; + case 2: + return user_data->led2; + case 3: + return user_data->led3; + } + return 0; +} +static void update_emulated_leds(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) { visualizer_user_data_t* user_data_new = (visualizer_user_data_t*)state->status.user_data; - visualizer_user_data_t* user_data_old = (visualizer_user_data_t*)prev_status.user_data; + visualizer_user_data_t* user_data_old = (visualizer_user_data_t*)prev_status->user_data; uint8_t new_index; uint8_t old_index; @@ -277,27 +285,41 @@ void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard uint8_t new_secondary_index = get_secondary_led_index(user_data_new); uint8_t old_secondary_index = get_secondary_led_index(user_data_old); + uint8_t old_brightness = get_brightness(user_data_old, old_index); + uint8_t new_brightness = get_brightness(user_data_new, new_index); + + uint8_t old_secondary_brightness = get_brightness(user_data_old, old_secondary_index); + uint8_t new_secondary_brightness = get_brightness(user_data_new, new_secondary_index); + if (lcd_state == LCD_STATE_INITIAL || new_index != old_index || - new_secondary_index != old_secondary_index) { + new_secondary_index != old_secondary_index || + new_brightness != old_brightness || + new_secondary_brightness != old_secondary_brightness) { if (new_secondary_index != 0) { - state->target_lcd_color = led_emulation_colors[new_index]; - next_led_target_color = led_emulation_colors[new_secondary_index]; + state->target_lcd_color = change_lcd_color_intensity( + led_emulation_colors[new_index], new_brightness); + next_led_target_color = change_lcd_color_intensity( + led_emulation_colors[new_secondary_index], new_secondary_brightness); + stop_keyframe_animation(&one_led_color); start_keyframe_animation(&two_led_colors); } else { - state->target_lcd_color = led_emulation_colors[new_index]; + state->target_lcd_color = change_lcd_color_intensity( + led_emulation_colors[new_index], new_brightness); stop_keyframe_animation(&two_led_colors); start_keyframe_animation(&one_led_color); } } +} +static void update_lcd_text(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) { if (state->status.leds) { if (lcd_state != LCD_STATE_BITMAP_AND_LEDS || - state->status.leds != prev_status.leds || - state->status.layer != prev_status.layer || - state->status.default_layer != prev_status.default_layer) { + state->status.leds != prev_status->leds || + state->status.layer != prev_status->layer || + state->status.default_layer != prev_status->default_layer) { // NOTE: that it doesn't matter if the animation isn't playing, stop will do nothing in that case stop_keyframe_animation(&lcd_bitmap_animation); @@ -310,8 +332,8 @@ void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard } } else { if (lcd_state != LCD_STATE_LAYER_BITMAP || - state->status.layer != prev_status.layer || - state->status.default_layer != prev_status.default_layer) { + state->status.layer != prev_status->layer || + state->status.default_layer != prev_status->default_layer) { stop_keyframe_animation(&lcd_bitmap_leds_animation); @@ -321,6 +343,20 @@ void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard } } +void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) { + // Check the status here to start and stop animations + // You might have to save some state, like the current animation here so that you can start the right + // This function is called every time the status changes + + // NOTE that this is called from the visualizer thread, so don't access anything else outside the status + // This is also important because the slave won't have access to the active layer for example outside the + // status. + + update_emulated_leds(state, prev_status); + update_lcd_text(state, prev_status); + +} + void user_visualizer_suspend(visualizer_state_t* state) { state->layer_text = "Suspending..."; uint8_t hue = LCD_HUE(state->current_lcd_color); diff --git a/quantum/visualizer/lcd_backlight.h b/quantum/visualizer/lcd_backlight.h index dd3e37a064..14dde64a1a 100644 --- a/quantum/visualizer/lcd_backlight.h +++ b/quantum/visualizer/lcd_backlight.h @@ -32,6 +32,10 @@ SOFTWARE. #define LCD_SAT(color) ((color >> 8) & 0xFF) #define LCD_INT(color) (color & 0xFF) +inline uint32_t change_lcd_color_intensity(uint32_t color, uint8_t new_intensity) { + return (color & 0xFFFFFF00) | new_intensity; +} + void lcd_backlight_init(void); void lcd_backlight_color(uint8_t hue, uint8_t saturation, uint8_t intensity); void lcd_backlight_brightness(uint8_t b); diff --git a/quantum/visualizer/visualizer.c b/quantum/visualizer/visualizer.c index bff0df4947..3b3f51b1ff 100644 --- a/quantum/visualizer/visualizer.c +++ b/quantum/visualizer/visualizer.c @@ -484,7 +484,7 @@ static DECLARE_THREAD_FUNCTION(visualizerThread, arg) { else { visualizer_keyboard_status_t prev_status = state.status; state.status = current_status; - update_user_visualizer_state(&state, prev_status); + update_user_visualizer_state(&state, &prev_status); } state.prev_lcd_color = state.current_lcd_color; } diff --git a/quantum/visualizer/visualizer.h b/quantum/visualizer/visualizer.h index beb8f2ab41..e8ace5b37b 100644 --- a/quantum/visualizer/visualizer.h +++ b/quantum/visualizer/visualizer.h @@ -156,7 +156,7 @@ void visualizer_set_user_data(void* user_data); // These functions have to be implemented by the user void initialize_user_visualizer(visualizer_state_t* state); -void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard_status_t prev_status); +void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status); void user_visualizer_suspend(visualizer_state_t* state); void user_visualizer_resume(visualizer_state_t* state); From 65e8127c91c6a0fc027a1a482de443302e00d019 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Mon, 3 Apr 2017 22:08:34 +0300 Subject: [PATCH 096/117] Add visualizer for Ergodox default --- .../ergodox/keymaps/default/visualizer.c | 426 ++++++++++++++++++ 1 file changed, 426 insertions(+) create mode 100644 keyboards/ergodox/keymaps/default/visualizer.c diff --git a/keyboards/ergodox/keymaps/default/visualizer.c b/keyboards/ergodox/keymaps/default/visualizer.c new file mode 100644 index 0000000000..c7afd9384c --- /dev/null +++ b/keyboards/ergodox/keymaps/default/visualizer.c @@ -0,0 +1,426 @@ +/* +Copyright 2016 Fred Sundvik + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +// Currently we are assuming that both the backlight and LCD are enabled +// But it's entirely possible to write a custom visualizer that use only +// one of them +#ifndef LCD_BACKLIGHT_ENABLE +#error This visualizer needs that LCD backlight is enabled +#endif + +#ifndef LCD_ENABLE +#error This visualizer needs that LCD is enabled +#endif + +#include "visualizer.h" +#include "system/serial_link.h" + +// To generate an image array like this +// Ensure the image is 128 x 32 or smaller +// Convert the bitmap to a C array using a program like http://www.riuson.com/lcd-image-converter/ +// Ensure the the conversion process produces a monochrome format array - 1 bit/pixel, left to right, top to bottom +// Update array in the source code with the C array produced by the conversion program + +// The image below is generated from lcd_logo.png +static const uint8_t image_data_lcd_logo[512] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0xfe, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x38, 0x38, 0x06, 0x29, 0x41, 0x24, 0x52, 0x24, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x38, 0x38, 0x09, 0x55, 0x42, 0xaa, 0xaa, 0xaa, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x38, 0x38, 0x09, 0x55, 0x82, 0x28, 0xaa, 0xae, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x38, 0x38, 0x09, 0x55, 0x43, 0x28, 0xaa, 0xaa, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x38, 0x38, 0x0a, 0x55, 0x42, 0x28, 0xaa, 0xaa, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x38, 0x38, 0x05, 0x45, 0x42, 0x28, 0x89, 0x4a, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x38, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x38, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0xff, 0x80, 0x04, 0x45, 0x14, 0xa4, 0x92, 0x83, 0x52, 0x22, 0x22, 0x36, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xba, 0x84, 0x55, 0x55, 0x57, 0x45, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x00, 0x08, 0xaa, 0xaa, 0xaa, 0x92, 0xb2, 0x55, 0x55, 0x42, 0x65, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x00, 0x08, 0xaa, 0xaa, 0xaa, 0x92, 0x81, 0x56, 0x65, 0x42, 0x45, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0x92, 0x81, 0x54, 0x45, 0x42, 0x45, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x00, 0x04, 0x48, 0xa2, 0x4a, 0x89, 0x06, 0x24, 0x42, 0x41, 0x36, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const uint32_t logo_background_color = LCD_COLOR(0x00, 0x00, 0xFF); +static const uint32_t initial_color = LCD_COLOR(0, 0, 0); + +static const uint32_t led_emulation_colors[4] = { + LCD_COLOR(0, 0, 0), + LCD_COLOR(255, 255, 255), + LCD_COLOR(84, 255, 255), + LCD_COLOR(168, 255, 255), +}; + +static uint32_t next_led_target_color = 0; + +typedef enum { + LCD_STATE_INITIAL, + LCD_STATE_LAYER_BITMAP, + LCD_STATE_BITMAP_AND_LEDS, +} lcd_state_t; + +static lcd_state_t lcd_state = LCD_STATE_INITIAL; + +typedef struct { + uint8_t led_on; + uint8_t led1; + uint8_t led2; + uint8_t led3; +} visualizer_user_data_t; + +// Don't access from visualization function, use the visualizer state instead +static visualizer_user_data_t user_data_keyboard = { + .led_on = 0, + .led1 = LED_BRIGHTNESS_HI, + .led2 = LED_BRIGHTNESS_HI, + .led3 = LED_BRIGHTNESS_HI, +}; + +_Static_assert(sizeof(visualizer_user_data_t) <= VISUALIZER_USER_DATA_SIZE, + "Please increase the VISUALIZER_USER_DATA_SIZE"); + +bool display_logo(keyframe_animation_t* animation, visualizer_state_t* state) { + (void)state; + (void)animation; + (void)state; + // Read the uGFX documentation for information how to use the displays + // http://wiki.ugfx.org/index.php/Main_Page + gdispClear(White); + + // You can use static variables for things that can't be found in the animation + // or state structs, here we use the image + + //gdispGBlitArea is a tricky function to use since it supports blitting part of the image + // if you have full screen image, then just use 128 and 32 for both source and target dimensions + gdispGBlitArea(GDISP, 0, 0, 128, 32, 0, 0, 128, (pixel_t*)image_data_lcd_logo); + + // Always remember to flush the display + gdispFlush(); + return false; +} + +// Feel free to modify the animations below, or even add new ones if needed + +// Don't worry, if the startup animation is long, you can use the keyboard like normal +// during that time +static keyframe_animation_t startup_animation = { + .num_frames = 3, + .loop = false, + .frame_lengths = {0, gfxMillisecondsToTicks(10000), 0}, + .frame_functions = { + display_logo, + keyframe_animate_backlight_color, + enable_visualization + }, +}; + +// The color animation animates the LCD color when you change layers +static keyframe_animation_t one_led_color = { + .num_frames = 1, + .loop = false, + .frame_lengths = {gfxMillisecondsToTicks(0)}, + .frame_functions = {keyframe_set_backlight_color}, +}; + +bool swap_led_target_color(keyframe_animation_t* animation, visualizer_state_t* state) { + uint32_t temp = next_led_target_color; + next_led_target_color = state->target_lcd_color; + state->target_lcd_color = temp; + return false; +} + +// The color animation animates the LCD color when you change layers +static keyframe_animation_t two_led_colors = { + .num_frames = 2, + .loop = true, + .frame_lengths = {gfxMillisecondsToTicks(1000), gfxMillisecondsToTicks(0)}, + .frame_functions = {keyframe_set_backlight_color, swap_led_target_color}, +}; + +// The LCD animation alternates between the layer name display and a +// bitmap that displays all active layers +static keyframe_animation_t lcd_bitmap_animation = { + .num_frames = 1, + .loop = false, + .frame_lengths = {gfxMillisecondsToTicks(0)}, + .frame_functions = {keyframe_display_layer_bitmap}, +}; + +static keyframe_animation_t lcd_bitmap_leds_animation = { + .num_frames = 2, + .loop = true, + .frame_lengths = {gfxMillisecondsToTicks(2000), gfxMillisecondsToTicks(2000)}, + .frame_functions = {keyframe_display_layer_bitmap, keyframe_display_led_states}, +}; + +static keyframe_animation_t suspend_animation = { + .num_frames = 3, + .loop = false, + .frame_lengths = {0, gfxMillisecondsToTicks(1000), 0}, + .frame_functions = { + keyframe_display_layer_text, + keyframe_animate_backlight_color, + keyframe_disable_lcd_and_backlight, + }, +}; + +static keyframe_animation_t resume_animation = { + .num_frames = 4, + .loop = false, + .frame_lengths = {0, 0, gfxMillisecondsToTicks(10000), 0}, + .frame_functions = { + keyframe_enable_lcd_and_backlight, + display_logo, + keyframe_animate_backlight_color, + enable_visualization, + }, +}; + +void initialize_user_visualizer(visualizer_state_t* state) { + // The brightness will be dynamically adjustable in the future + // But for now, change it here. + lcd_backlight_brightness(130); + state->current_lcd_color = initial_color; + state->target_lcd_color = logo_background_color; + lcd_state = LCD_STATE_INITIAL; + start_keyframe_animation(&startup_animation); +} + +static const uint32_t red; +static const uint32_t green; +static const uint32_t blue; + +inline bool is_led_on(visualizer_user_data_t* user_data, uint8_t num) { + return user_data->led_on & (1u << num); +} + +static uint8_t get_led_index_master(visualizer_user_data_t* user_data) { + for (int i=0; i < 3; i++) { + if (is_led_on(user_data, i)) { + return i + 1; + } + } + return 0; +} + +static uint8_t get_led_index_slave(visualizer_user_data_t* user_data) { + uint8_t master_index = get_led_index_master(user_data); + if (master_index!=0) { + for (int i=master_index; i < 3; i++) { + if (is_led_on(user_data, i)) { + return i + 1; + } + } + } + + return 0; +} + +static uint8_t get_secondary_led_index(visualizer_user_data_t* user_data) { + if (is_led_on(user_data, 0) && + is_led_on(user_data, 1) && + is_led_on(user_data, 2)) { + return 3; + } + return 0; +} + +static uint8_t get_brightness(visualizer_user_data_t* user_data, uint8_t index) { + switch (index) { + case 1: + return user_data->led1; + case 2: + return user_data->led2; + case 3: + return user_data->led3; + } + return 0; +} + +static void update_emulated_leds(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) { + visualizer_user_data_t* user_data_new = (visualizer_user_data_t*)state->status.user_data; + visualizer_user_data_t* user_data_old = (visualizer_user_data_t*)prev_status->user_data; + + uint8_t new_index; + uint8_t old_index; + + if (is_serial_link_master()) { + new_index = get_led_index_master(user_data_new); + old_index = get_led_index_master(user_data_old); + } + else { + new_index = get_led_index_slave(user_data_new); + old_index = get_led_index_slave(user_data_old); + } + uint8_t new_secondary_index = get_secondary_led_index(user_data_new); + uint8_t old_secondary_index = get_secondary_led_index(user_data_old); + + uint8_t old_brightness = get_brightness(user_data_old, old_index); + uint8_t new_brightness = get_brightness(user_data_new, new_index); + + uint8_t old_secondary_brightness = get_brightness(user_data_old, old_secondary_index); + uint8_t new_secondary_brightness = get_brightness(user_data_new, new_secondary_index); + + if (lcd_state == LCD_STATE_INITIAL || + new_index != old_index || + new_secondary_index != old_secondary_index || + new_brightness != old_brightness || + new_secondary_brightness != old_secondary_brightness) { + + if (new_secondary_index != 0) { + state->target_lcd_color = change_lcd_color_intensity( + led_emulation_colors[new_index], new_brightness); + next_led_target_color = change_lcd_color_intensity( + led_emulation_colors[new_secondary_index], new_secondary_brightness); + + stop_keyframe_animation(&one_led_color); + start_keyframe_animation(&two_led_colors); + } else { + state->target_lcd_color = change_lcd_color_intensity( + led_emulation_colors[new_index], new_brightness); + stop_keyframe_animation(&two_led_colors); + start_keyframe_animation(&one_led_color); + } + } +} + +static void update_lcd_text(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) { + if (state->status.leds) { + if (lcd_state != LCD_STATE_BITMAP_AND_LEDS || + state->status.leds != prev_status->leds || + state->status.layer != prev_status->layer || + state->status.default_layer != prev_status->default_layer) { + + // NOTE: that it doesn't matter if the animation isn't playing, stop will do nothing in that case + stop_keyframe_animation(&lcd_bitmap_animation); + + lcd_state = LCD_STATE_BITMAP_AND_LEDS; + // For information: + // The logic in this function makes sure that this doesn't happen, but if you call start on an + // animation that is already playing it will be restarted. + start_keyframe_animation(&lcd_bitmap_leds_animation); + } + } else { + if (lcd_state != LCD_STATE_LAYER_BITMAP || + state->status.layer != prev_status->layer || + state->status.default_layer != prev_status->default_layer) { + + stop_keyframe_animation(&lcd_bitmap_leds_animation); + + lcd_state = LCD_STATE_LAYER_BITMAP; + start_keyframe_animation(&lcd_bitmap_animation); + } + } +} + +void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) { + // Check the status here to start and stop animations + // You might have to save some state, like the current animation here so that you can start the right + // This function is called every time the status changes + + // NOTE that this is called from the visualizer thread, so don't access anything else outside the status + // This is also important because the slave won't have access to the active layer for example outside the + // status. + + update_emulated_leds(state, prev_status); + update_lcd_text(state, prev_status); + +} + +void user_visualizer_suspend(visualizer_state_t* state) { + state->layer_text = "Suspending..."; + uint8_t hue = LCD_HUE(state->current_lcd_color); + uint8_t sat = LCD_SAT(state->current_lcd_color); + state->target_lcd_color = LCD_COLOR(hue, sat, 0); + start_keyframe_animation(&suspend_animation); +} + +void user_visualizer_resume(visualizer_state_t* state) { + state->current_lcd_color = initial_color; + state->target_lcd_color = logo_background_color; + lcd_state = LCD_STATE_INITIAL; + start_keyframe_animation(&resume_animation); +} + +void ergodox_board_led_on(void){ + // No board led support +} + +void ergodox_right_led_1_on(void){ + user_data_keyboard.led_on |= (1u << 0); + visualizer_set_user_data(&user_data_keyboard); +} + +void ergodox_right_led_2_on(void){ + user_data_keyboard.led_on |= (1u << 1); + visualizer_set_user_data(&user_data_keyboard); +} + +void ergodox_right_led_3_on(void){ + user_data_keyboard.led_on |= (1u << 2); + visualizer_set_user_data(&user_data_keyboard); +} + +void ergodox_board_led_off(void){ + // No board led support +} + +void ergodox_right_led_1_off(void){ + user_data_keyboard.led_on &= ~(1u << 0); + visualizer_set_user_data(&user_data_keyboard); +} + +void ergodox_right_led_2_off(void){ + user_data_keyboard.led_on &= ~(1u << 1); + visualizer_set_user_data(&user_data_keyboard); +} + +void ergodox_right_led_3_off(void){ + user_data_keyboard.led_on &= ~(1u << 2); + visualizer_set_user_data(&user_data_keyboard); +} + +void ergodox_right_led_1_set(uint8_t n) { + user_data_keyboard.led1 = n; + visualizer_set_user_data(&user_data_keyboard); +} + +void ergodox_right_led_2_set(uint8_t n) { + user_data_keyboard.led2 = n; + visualizer_set_user_data(&user_data_keyboard); +} + +void ergodox_right_led_3_set(uint8_t n) { + user_data_keyboard.led3 = n; + visualizer_set_user_data(&user_data_keyboard); +} From fa6da78ff3c96a71ed65684e276352700843d539 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Mon, 3 Apr 2017 23:00:58 +0300 Subject: [PATCH 097/117] Simple layer display on Infinity Ergodox default layout --- .../ergodox/keymaps/default/visualizer.c | 284 ++++-------------- 1 file changed, 61 insertions(+), 223 deletions(-) diff --git a/keyboards/ergodox/keymaps/default/visualizer.c b/keyboards/ergodox/keymaps/default/visualizer.c index c7afd9384c..d99d5f7026 100644 --- a/keyboards/ergodox/keymaps/default/visualizer.c +++ b/keyboards/ergodox/keymaps/default/visualizer.c @@ -1,5 +1,5 @@ /* -Copyright 2016 Fred Sundvik +Copyright 2017 Fred Sundvik This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -74,15 +74,6 @@ static const uint8_t image_data_lcd_logo[512] = { static const uint32_t logo_background_color = LCD_COLOR(0x00, 0x00, 0xFF); static const uint32_t initial_color = LCD_COLOR(0, 0, 0); -static const uint32_t led_emulation_colors[4] = { - LCD_COLOR(0, 0, 0), - LCD_COLOR(255, 255, 255), - LCD_COLOR(84, 255, 255), - LCD_COLOR(168, 255, 255), -}; - -static uint32_t next_led_target_color = 0; - typedef enum { LCD_STATE_INITIAL, LCD_STATE_LAYER_BITMAP, @@ -91,24 +82,6 @@ typedef enum { static lcd_state_t lcd_state = LCD_STATE_INITIAL; -typedef struct { - uint8_t led_on; - uint8_t led1; - uint8_t led2; - uint8_t led3; -} visualizer_user_data_t; - -// Don't access from visualization function, use the visualizer state instead -static visualizer_user_data_t user_data_keyboard = { - .led_on = 0, - .led1 = LED_BRIGHTNESS_HI, - .led2 = LED_BRIGHTNESS_HI, - .led3 = LED_BRIGHTNESS_HI, -}; - -_Static_assert(sizeof(visualizer_user_data_t) <= VISUALIZER_USER_DATA_SIZE, - "Please increase the VISUALIZER_USER_DATA_SIZE"); - bool display_logo(keyframe_animation_t* animation, visualizer_state_t* state) { (void)state; (void)animation; @@ -144,43 +117,34 @@ static keyframe_animation_t startup_animation = { }, }; -// The color animation animates the LCD color when you change layers -static keyframe_animation_t one_led_color = { - .num_frames = 1, - .loop = false, - .frame_lengths = {gfxMillisecondsToTicks(0)}, - .frame_functions = {keyframe_set_backlight_color}, -}; - -bool swap_led_target_color(keyframe_animation_t* animation, visualizer_state_t* state) { - uint32_t temp = next_led_target_color; - next_led_target_color = state->target_lcd_color; - state->target_lcd_color = temp; - return false; -} - -// The color animation animates the LCD color when you change layers -static keyframe_animation_t two_led_colors = { - .num_frames = 2, - .loop = true, - .frame_lengths = {gfxMillisecondsToTicks(1000), gfxMillisecondsToTicks(0)}, - .frame_functions = {keyframe_set_backlight_color, swap_led_target_color}, -}; - // The LCD animation alternates between the layer name display and a // bitmap that displays all active layers -static keyframe_animation_t lcd_bitmap_animation = { - .num_frames = 1, - .loop = false, - .frame_lengths = {gfxMillisecondsToTicks(0)}, - .frame_functions = {keyframe_display_layer_bitmap}, -}; - -static keyframe_animation_t lcd_bitmap_leds_animation = { +static keyframe_animation_t lcd_layer_bitmap_animation = { .num_frames = 2, .loop = true, - .frame_lengths = {gfxMillisecondsToTicks(2000), gfxMillisecondsToTicks(2000)}, - .frame_functions = {keyframe_display_layer_bitmap, keyframe_display_led_states}, + .frame_lengths = { + gfxMillisecondsToTicks(2000), + gfxMillisecondsToTicks(2000) + }, + .frame_functions = { + keyframe_display_layer_text, + keyframe_display_layer_bitmap + }, +}; + +static keyframe_animation_t lcd_layer_bitmap_leds_animation = { + .num_frames = 3, + .loop = true, + .frame_lengths = { + gfxMillisecondsToTicks(2000), + gfxMillisecondsToTicks(2000), + gfxMillisecondsToTicks(2000) + }, + .frame_functions = { + keyframe_display_layer_text, + keyframe_display_led_states, + keyframe_display_layer_bitmap, + }, }; static keyframe_animation_t suspend_animation = { @@ -206,6 +170,17 @@ static keyframe_animation_t resume_animation = { }, }; +// The color animation animates the LCD color when you change layers +static keyframe_animation_t color_animation = { + .num_frames = 2, + .loop = false, + // Note that there's a 200 ms no-operation frame, + // this prevents the color from changing when activating the layer + // momentarily + .frame_lengths = {gfxMillisecondsToTicks(200), gfxMillisecondsToTicks(500)}, + .frame_functions = {keyframe_no_operation, keyframe_animate_backlight_color}, +}; + void initialize_user_visualizer(visualizer_state_t* state) { // The brightness will be dynamically adjustable in the future // But for now, change it here. @@ -216,105 +191,32 @@ void initialize_user_visualizer(visualizer_state_t* state) { start_keyframe_animation(&startup_animation); } -static const uint32_t red; -static const uint32_t green; -static const uint32_t blue; +void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) { + // Add more tests, change the colors and layer texts here + // Usually you want to check the high bits (higher layers first) + // because that's the order layers are processed for keypresses + // You can for check for example: + // state->status.layer + // state->status.default_layer + // state->status.leds (see led.h for available statuses) -inline bool is_led_on(visualizer_user_data_t* user_data, uint8_t num) { - return user_data->led_on & (1u << num); -} - -static uint8_t get_led_index_master(visualizer_user_data_t* user_data) { - for (int i=0; i < 3; i++) { - if (is_led_on(user_data, i)) { - return i + 1; - } + if (state->status.layer & 0x4) { + state->target_lcd_color = LCD_COLOR(0, 0xB0, 0xFF); + state->layer_text = "Media & Mouse"; } - return 0; -} - -static uint8_t get_led_index_slave(visualizer_user_data_t* user_data) { - uint8_t master_index = get_led_index_master(user_data); - if (master_index!=0) { - for (int i=master_index; i < 3; i++) { - if (is_led_on(user_data, i)) { - return i + 1; - } - } - } - - return 0; -} - -static uint8_t get_secondary_led_index(visualizer_user_data_t* user_data) { - if (is_led_on(user_data, 0) && - is_led_on(user_data, 1) && - is_led_on(user_data, 2)) { - return 3; - } - return 0; -} - -static uint8_t get_brightness(visualizer_user_data_t* user_data, uint8_t index) { - switch (index) { - case 1: - return user_data->led1; - case 2: - return user_data->led2; - case 3: - return user_data->led3; - } - return 0; -} - -static void update_emulated_leds(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) { - visualizer_user_data_t* user_data_new = (visualizer_user_data_t*)state->status.user_data; - visualizer_user_data_t* user_data_old = (visualizer_user_data_t*)prev_status->user_data; - - uint8_t new_index; - uint8_t old_index; - - if (is_serial_link_master()) { - new_index = get_led_index_master(user_data_new); - old_index = get_led_index_master(user_data_old); + else if (state->status.layer & 0x2) { + state->target_lcd_color = LCD_COLOR(0x80, 0xB0, 0xFF); + state->layer_text = "Symbol"; } else { - new_index = get_led_index_slave(user_data_new); - old_index = get_led_index_slave(user_data_old); + state->target_lcd_color = LCD_COLOR(0x40, 0xB0, 0xFF); + state->layer_text = "Default"; } - uint8_t new_secondary_index = get_secondary_led_index(user_data_new); - uint8_t old_secondary_index = get_secondary_led_index(user_data_old); - uint8_t old_brightness = get_brightness(user_data_old, old_index); - uint8_t new_brightness = get_brightness(user_data_new, new_index); - - uint8_t old_secondary_brightness = get_brightness(user_data_old, old_secondary_index); - uint8_t new_secondary_brightness = get_brightness(user_data_new, new_secondary_index); - - if (lcd_state == LCD_STATE_INITIAL || - new_index != old_index || - new_secondary_index != old_secondary_index || - new_brightness != old_brightness || - new_secondary_brightness != old_secondary_brightness) { - - if (new_secondary_index != 0) { - state->target_lcd_color = change_lcd_color_intensity( - led_emulation_colors[new_index], new_brightness); - next_led_target_color = change_lcd_color_intensity( - led_emulation_colors[new_secondary_index], new_secondary_brightness); - - stop_keyframe_animation(&one_led_color); - start_keyframe_animation(&two_led_colors); - } else { - state->target_lcd_color = change_lcd_color_intensity( - led_emulation_colors[new_index], new_brightness); - stop_keyframe_animation(&two_led_colors); - start_keyframe_animation(&one_led_color); - } + if (lcd_state == LCD_STATE_INITIAL || state->status.layer != prev_status->layer) { + start_keyframe_animation(&color_animation); } -} -static void update_lcd_text(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) { if (state->status.leds) { if (lcd_state != LCD_STATE_BITMAP_AND_LEDS || state->status.leds != prev_status->leds || @@ -322,39 +224,28 @@ static void update_lcd_text(visualizer_state_t* state, visualizer_keyboard_statu state->status.default_layer != prev_status->default_layer) { // NOTE: that it doesn't matter if the animation isn't playing, stop will do nothing in that case - stop_keyframe_animation(&lcd_bitmap_animation); + stop_keyframe_animation(&lcd_layer_bitmap_animation); lcd_state = LCD_STATE_BITMAP_AND_LEDS; // For information: // The logic in this function makes sure that this doesn't happen, but if you call start on an // animation that is already playing it will be restarted. - start_keyframe_animation(&lcd_bitmap_leds_animation); + start_keyframe_animation(&lcd_layer_bitmap_leds_animation); } } else { if (lcd_state != LCD_STATE_LAYER_BITMAP || state->status.layer != prev_status->layer || state->status.default_layer != prev_status->default_layer) { - stop_keyframe_animation(&lcd_bitmap_leds_animation); + stop_keyframe_animation(&lcd_layer_bitmap_leds_animation); lcd_state = LCD_STATE_LAYER_BITMAP; - start_keyframe_animation(&lcd_bitmap_animation); + start_keyframe_animation(&lcd_layer_bitmap_animation); } } -} - -void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) { - // Check the status here to start and stop animations - // You might have to save some state, like the current animation here so that you can start the right - // This function is called every time the status changes - - // NOTE that this is called from the visualizer thread, so don't access anything else outside the status - // This is also important because the slave won't have access to the active layer for example outside the - // status. - - update_emulated_leds(state, prev_status); - update_lcd_text(state, prev_status); - + // You can also stop existing animations, and start your custom ones here + // remember that you should normally have only one animation for the LCD + // and one for the background. But you can also combine them if you want. } void user_visualizer_suspend(visualizer_state_t* state) { @@ -371,56 +262,3 @@ void user_visualizer_resume(visualizer_state_t* state) { lcd_state = LCD_STATE_INITIAL; start_keyframe_animation(&resume_animation); } - -void ergodox_board_led_on(void){ - // No board led support -} - -void ergodox_right_led_1_on(void){ - user_data_keyboard.led_on |= (1u << 0); - visualizer_set_user_data(&user_data_keyboard); -} - -void ergodox_right_led_2_on(void){ - user_data_keyboard.led_on |= (1u << 1); - visualizer_set_user_data(&user_data_keyboard); -} - -void ergodox_right_led_3_on(void){ - user_data_keyboard.led_on |= (1u << 2); - visualizer_set_user_data(&user_data_keyboard); -} - -void ergodox_board_led_off(void){ - // No board led support -} - -void ergodox_right_led_1_off(void){ - user_data_keyboard.led_on &= ~(1u << 0); - visualizer_set_user_data(&user_data_keyboard); -} - -void ergodox_right_led_2_off(void){ - user_data_keyboard.led_on &= ~(1u << 1); - visualizer_set_user_data(&user_data_keyboard); -} - -void ergodox_right_led_3_off(void){ - user_data_keyboard.led_on &= ~(1u << 2); - visualizer_set_user_data(&user_data_keyboard); -} - -void ergodox_right_led_1_set(uint8_t n) { - user_data_keyboard.led1 = n; - visualizer_set_user_data(&user_data_keyboard); -} - -void ergodox_right_led_2_set(uint8_t n) { - user_data_keyboard.led2 = n; - visualizer_set_user_data(&user_data_keyboard); -} - -void ergodox_right_led_3_set(uint8_t n) { - user_data_keyboard.led3 = n; - visualizer_set_user_data(&user_data_keyboard); -} From 05bc4880ddc9e904cfa1773caff1ae81977d2a76 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Tue, 4 Apr 2017 22:29:40 +0300 Subject: [PATCH 098/117] Tweaks to the Ergodox default visualizer No animation, display led statuses and layer name on the same screen Don't display layer bitmap Fully saturated colors for caps, less saturated ones normally --- .../ergodox/keymaps/default/visualizer.c | 76 +++++-------------- quantum/visualizer/visualizer.c | 28 ++++++- quantum/visualizer/visualizer.h | 1 + 3 files changed, 44 insertions(+), 61 deletions(-) diff --git a/keyboards/ergodox/keymaps/default/visualizer.c b/keyboards/ergodox/keymaps/default/visualizer.c index d99d5f7026..305aaae157 100644 --- a/keyboards/ergodox/keymaps/default/visualizer.c +++ b/keyboards/ergodox/keymaps/default/visualizer.c @@ -28,6 +28,7 @@ along with this program. If not, see . #include "visualizer.h" #include "system/serial_link.h" +#include "led.h" // To generate an image array like this // Ensure the image is 128 x 32 or smaller @@ -117,34 +118,11 @@ static keyframe_animation_t startup_animation = { }, }; -// The LCD animation alternates between the layer name display and a -// bitmap that displays all active layers -static keyframe_animation_t lcd_layer_bitmap_animation = { - .num_frames = 2, - .loop = true, - .frame_lengths = { - gfxMillisecondsToTicks(2000), - gfxMillisecondsToTicks(2000) - }, - .frame_functions = { - keyframe_display_layer_text, - keyframe_display_layer_bitmap - }, -}; - -static keyframe_animation_t lcd_layer_bitmap_leds_animation = { - .num_frames = 3, - .loop = true, - .frame_lengths = { - gfxMillisecondsToTicks(2000), - gfxMillisecondsToTicks(2000), - gfxMillisecondsToTicks(2000) - }, - .frame_functions = { - keyframe_display_layer_text, - keyframe_display_led_states, - keyframe_display_layer_bitmap, - }, +static keyframe_animation_t lcd_layer_display = { + .num_frames = 1, + .loop = false, + .frame_lengths = {gfxMillisecondsToTicks(0)}, + .frame_functions = {keyframe_display_layer_and_led_states} }; static keyframe_animation_t suspend_animation = { @@ -200,49 +178,31 @@ void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard // state->status.default_layer // state->status.leds (see led.h for available statuses) + uint8_t saturation = 60; + if (state->status.leds & (1u << USB_LED_CAPS_LOCK)) { + saturation = 255; + } if (state->status.layer & 0x4) { - state->target_lcd_color = LCD_COLOR(0, 0xB0, 0xFF); + state->target_lcd_color = LCD_COLOR(0, saturation, 0xFF); state->layer_text = "Media & Mouse"; } else if (state->status.layer & 0x2) { - state->target_lcd_color = LCD_COLOR(0x80, 0xB0, 0xFF); + state->target_lcd_color = LCD_COLOR(168, saturation, 0xFF); state->layer_text = "Symbol"; } else { - state->target_lcd_color = LCD_COLOR(0x40, 0xB0, 0xFF); + state->target_lcd_color = LCD_COLOR(84, saturation, 0xFF); state->layer_text = "Default"; } - if (lcd_state == LCD_STATE_INITIAL || state->status.layer != prev_status->layer) { + if (lcd_state == LCD_STATE_INITIAL || + state->status.layer != prev_status->layer || + state->status.default_layer != prev_status->default_layer || + state->status.leds != prev_status->leds) { start_keyframe_animation(&color_animation); + start_keyframe_animation(&lcd_layer_display); } - if (state->status.leds) { - if (lcd_state != LCD_STATE_BITMAP_AND_LEDS || - state->status.leds != prev_status->leds || - state->status.layer != prev_status->layer || - state->status.default_layer != prev_status->default_layer) { - - // NOTE: that it doesn't matter if the animation isn't playing, stop will do nothing in that case - stop_keyframe_animation(&lcd_layer_bitmap_animation); - - lcd_state = LCD_STATE_BITMAP_AND_LEDS; - // For information: - // The logic in this function makes sure that this doesn't happen, but if you call start on an - // animation that is already playing it will be restarted. - start_keyframe_animation(&lcd_layer_bitmap_leds_animation); - } - } else { - if (lcd_state != LCD_STATE_LAYER_BITMAP || - state->status.layer != prev_status->layer || - state->status.default_layer != prev_status->default_layer) { - - stop_keyframe_animation(&lcd_layer_bitmap_leds_animation); - - lcd_state = LCD_STATE_LAYER_BITMAP; - start_keyframe_animation(&lcd_layer_bitmap_animation); - } - } // You can also stop existing animations, and start your custom ones here // remember that you should normally have only one animation for the LCD // and one for the background. But you can also combine them if you want. diff --git a/quantum/visualizer/visualizer.c b/quantum/visualizer/visualizer.c index 3b3f51b1ff..2533eb7090 100644 --- a/quantum/visualizer/visualizer.c +++ b/quantum/visualizer/visualizer.c @@ -364,9 +364,9 @@ bool keyframe_display_mods_bitmap(keyframe_animation_t* animation, visualizer_st return false; } -bool keyframe_display_led_states(keyframe_animation_t* animation, visualizer_state_t* state) -{ - char output[sizeof("NUM CAPS SCRL COMP KANA")]; +#define LED_STATE_STRING_SIZE sizeof("NUM CAPS SCRL COMP KANA") + +static void get_led_state_string(char* output, visualizer_state_t* state) { uint8_t pos = 0; if (state->status.leds & (1u << USB_LED_NUM_LOCK)) { @@ -390,12 +390,34 @@ bool keyframe_display_led_states(keyframe_animation_t* animation, visualizer_sta pos += 5; } output[pos] = 0; +} + +bool keyframe_display_led_states(keyframe_animation_t* animation, visualizer_state_t* state) +{ + (void)animation; + char output[LED_STATE_STRING_SIZE]; + get_led_state_string(output, state); gdispClear(White); gdispDrawString(0, 10, output, state->font_dejavusansbold12, Black); gdispFlush(); return false; } +bool keyframe_display_layer_and_led_states(keyframe_animation_t* animation, visualizer_state_t* state) { + (void)animation; + gdispClear(White); + uint8_t y = 10; + if (state->status.leds) { + char output[LED_STATE_STRING_SIZE]; + get_led_state_string(output, state); + gdispDrawString(0, 1, output, state->font_dejavusansbold12, Black); + y = 17; + } + gdispDrawString(0, y, state->layer_text, state->font_dejavusansbold12, Black); + gdispFlush(); + return false; +} + #endif // LCD_ENABLE bool keyframe_disable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state) { diff --git a/quantum/visualizer/visualizer.h b/quantum/visualizer/visualizer.h index e8ace5b37b..3b05c305e2 100644 --- a/quantum/visualizer/visualizer.h +++ b/quantum/visualizer/visualizer.h @@ -141,6 +141,7 @@ bool keyframe_display_layer_bitmap(keyframe_animation_t* animation, visualizer_s bool keyframe_display_mods_bitmap(keyframe_animation_t* animation, visualizer_state_t* state); // Displays the keyboard led states (CAPS (Caps lock), NUM (Num lock), SCRL (Scroll lock), COMP (Compose), KANA) bool keyframe_display_led_states(keyframe_animation_t* animation, visualizer_state_t* state); +bool keyframe_display_layer_and_led_states(keyframe_animation_t* animation, visualizer_state_t* state); bool keyframe_disable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state); bool keyframe_enable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state); From 05530b193f4d4476b01c2e7f882619a81194888a Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Wed, 5 Apr 2017 07:48:51 +0300 Subject: [PATCH 099/117] Delete visualizer example integration It's much better to refer to the actual code than to to try to keep some examples up to date. --- .../example_integration/callbacks.c | 36 -- .../visualizer/example_integration/gfxconf.h | 325 ------------------ .../example_integration/lcd_backlight_hal.c | 91 ----- .../example_integration/visualizer_user.c | 121 ------- 4 files changed, 573 deletions(-) delete mode 100644 quantum/visualizer/example_integration/callbacks.c delete mode 100644 quantum/visualizer/example_integration/gfxconf.h delete mode 100644 quantum/visualizer/example_integration/lcd_backlight_hal.c delete mode 100644 quantum/visualizer/example_integration/visualizer_user.c diff --git a/quantum/visualizer/example_integration/callbacks.c b/quantum/visualizer/example_integration/callbacks.c deleted file mode 100644 index 2539615d65..0000000000 --- a/quantum/visualizer/example_integration/callbacks.c +++ /dev/null @@ -1,36 +0,0 @@ -/* -The MIT License (MIT) - -Copyright (c) 2016 Fred Sundvik - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ - -#include "keyboard.h" -#include "action_layer.h" -#include "visualizer.h" -#include "host.h" - -void post_keyboard_init(void) { - visualizer_init(); -} - -void post_keyboard_task() { - visualizer_set_state(default_layer_state, layer_state, host_keyboard_leds()); -} diff --git a/quantum/visualizer/example_integration/gfxconf.h b/quantum/visualizer/example_integration/gfxconf.h deleted file mode 100644 index 304c5d187a..0000000000 --- a/quantum/visualizer/example_integration/gfxconf.h +++ /dev/null @@ -1,325 +0,0 @@ -/** - * This file has a different license to the rest of the uGFX system. - * You can copy, modify and distribute this file as you see fit. - * You do not need to publish your source modifications to this file. - * The only thing you are not permitted to do is to relicense it - * under a different license. - */ - -/** - * Copy this file into your project directory and rename it as gfxconf.h - * Edit your copy to turn on the uGFX features you want to use. - * The values below are the defaults. - * - * Only remove the comments from lines where you want to change the - * default value. This allows definitions to be included from - * driver makefiles when required and provides the best future - * compatibility for your project. - * - * Please use spaces instead of tabs in this file. - */ - -#ifndef _GFXCONF_H -#define _GFXCONF_H - - -/////////////////////////////////////////////////////////////////////////// -// GOS - One of these must be defined, preferably in your Makefile // -/////////////////////////////////////////////////////////////////////////// -#define GFX_USE_OS_CHIBIOS TRUE -//#define GFX_USE_OS_FREERTOS FALSE -// #define GFX_FREERTOS_USE_TRACE FALSE -//#define GFX_USE_OS_WIN32 FALSE -//#define GFX_USE_OS_LINUX FALSE -//#define GFX_USE_OS_OSX FALSE -//#define GFX_USE_OS_ECOS FALSE -//#define GFX_USE_OS_RAWRTOS FALSE -//#define GFX_USE_OS_ARDUINO FALSE -//#define GFX_USE_OS_KEIL FALSE -//#define GFX_USE_OS_CMSIS FALSE -//#define GFX_USE_OS_RAW32 FALSE -// #define INTERRUPTS_OFF() optional_code -// #define INTERRUPTS_ON() optional_code -// These are not defined by default for some reason -#define GOS_NEED_X_THREADS FALSE -#define GOS_NEED_X_HEAP FALSE - -// Options that (should where relevant) apply to all operating systems - #define GFX_NO_INLINE FALSE -// #define GFX_COMPILER GFX_COMPILER_UNKNOWN -// #define GFX_CPU GFX_CPU_UNKNOWN -// #define GFX_OS_HEAP_SIZE 0 -// #define GFX_OS_NO_INIT FALSE -// #define GFX_OS_INIT_NO_WARNING FALSE -// #define GFX_OS_PRE_INIT_FUNCTION myHardwareInitRoutine -// #define GFX_OS_EXTRA_INIT_FUNCTION myOSInitRoutine -// #define GFX_OS_EXTRA_DEINIT_FUNCTION myOSDeInitRoutine - - -/////////////////////////////////////////////////////////////////////////// -// GDISP // -/////////////////////////////////////////////////////////////////////////// -#define GFX_USE_GDISP TRUE - -//#define GDISP_NEED_AUTOFLUSH FALSE -//#define GDISP_NEED_TIMERFLUSH FALSE -//#define GDISP_NEED_VALIDATION TRUE -//#define GDISP_NEED_CLIP TRUE -//#define GDISP_NEED_CIRCLE FALSE -//#define GDISP_NEED_ELLIPSE FALSE -//#define GDISP_NEED_ARC FALSE -//#define GDISP_NEED_ARCSECTORS FALSE -//#define GDISP_NEED_CONVEX_POLYGON FALSE -//#define GDISP_NEED_SCROLL FALSE -//#define GDISP_NEED_PIXELREAD FALSE -//#define GDISP_NEED_CONTROL FALSE -//#define GDISP_NEED_QUERY FALSE -//#define GDISP_NEED_MULTITHREAD FALSE -//#define GDISP_NEED_STREAMING FALSE -#define GDISP_NEED_TEXT TRUE -// #define GDISP_NEED_TEXT_WORDWRAP FALSE -// #define GDISP_NEED_ANTIALIAS FALSE -// #define GDISP_NEED_UTF8 FALSE - #define GDISP_NEED_TEXT_KERNING TRUE -// #define GDISP_INCLUDE_FONT_UI1 FALSE -// #define GDISP_INCLUDE_FONT_UI2 FALSE // The smallest preferred font. -// #define GDISP_INCLUDE_FONT_LARGENUMBERS FALSE -// #define GDISP_INCLUDE_FONT_DEJAVUSANS10 FALSE -// #define GDISP_INCLUDE_FONT_DEJAVUSANS12 FALSE -// #define GDISP_INCLUDE_FONT_DEJAVUSANS16 FALSE -// #define GDISP_INCLUDE_FONT_DEJAVUSANS20 FALSE -// #define GDISP_INCLUDE_FONT_DEJAVUSANS24 FALSE -// #define GDISP_INCLUDE_FONT_DEJAVUSANS32 FALSE - #define GDISP_INCLUDE_FONT_DEJAVUSANSBOLD12 TRUE -// #define GDISP_INCLUDE_FONT_FIXED_10X20 FALSE -// #define GDISP_INCLUDE_FONT_FIXED_7X14 FALSE - #define GDISP_INCLUDE_FONT_FIXED_5X8 TRUE -// #define GDISP_INCLUDE_FONT_DEJAVUSANS12_AA FALSE -// #define GDISP_INCLUDE_FONT_DEJAVUSANS16_AA FALSE -// #define GDISP_INCLUDE_FONT_DEJAVUSANS20_AA FALSE -// #define GDISP_INCLUDE_FONT_DEJAVUSANS24_AA FALSE -// #define GDISP_INCLUDE_FONT_DEJAVUSANS32_AA FALSE -// #define GDISP_INCLUDE_FONT_DEJAVUSANSBOLD12_AA FALSE -// #define GDISP_INCLUDE_USER_FONTS FALSE - -//#define GDISP_NEED_IMAGE FALSE -// #define GDISP_NEED_IMAGE_NATIVE FALSE -// #define GDISP_NEED_IMAGE_GIF FALSE -// #define GDISP_NEED_IMAGE_BMP FALSE -// #define GDISP_NEED_IMAGE_BMP_1 FALSE -// #define GDISP_NEED_IMAGE_BMP_4 FALSE -// #define GDISP_NEED_IMAGE_BMP_4_RLE FALSE -// #define GDISP_NEED_IMAGE_BMP_8 FALSE -// #define GDISP_NEED_IMAGE_BMP_8_RLE FALSE -// #define GDISP_NEED_IMAGE_BMP_16 FALSE -// #define GDISP_NEED_IMAGE_BMP_24 FALSE -// #define GDISP_NEED_IMAGE_BMP_32 FALSE -// #define GDISP_NEED_IMAGE_JPG FALSE -// #define GDISP_NEED_IMAGE_PNG FALSE -// #define GDISP_NEED_IMAGE_ACCOUNTING FALSE - -//#define GDISP_NEED_PIXMAP FALSE -// #define GDISP_NEED_PIXMAP_IMAGE FALSE - -//#define GDISP_DEFAULT_ORIENTATION GDISP_ROTATE_LANDSCAPE // If not defined the native hardware orientation is used. -//#define GDISP_LINEBUF_SIZE 128 -//#define GDISP_STARTUP_COLOR Black -#define GDISP_NEED_STARTUP_LOGO FALSE - -//#define GDISP_TOTAL_DISPLAYS 1 - -//#define GDISP_DRIVER_LIST GDISPVMT_Win32, GDISPVMT_Win32 -// #ifdef GDISP_DRIVER_LIST -// // For code and speed optimization define as TRUE or FALSE if all controllers have the same capability -// #define GDISP_HARDWARE_STREAM_WRITE FALSE -// #define GDISP_HARDWARE_STREAM_READ FALSE -// #define GDISP_HARDWARE_STREAM_POS FALSE -// #define GDISP_HARDWARE_DRAWPIXEL FALSE -// #define GDISP_HARDWARE_CLEARS FALSE -// #define GDISP_HARDWARE_FILLS FALSE -// #define GDISP_HARDWARE_BITFILLS FALSE -// #define GDISP_HARDWARE_SCROLL FALSE -// #define GDISP_HARDWARE_PIXELREAD FALSE -// #define GDISP_HARDWARE_CONTROL FALSE -// #define GDISP_HARDWARE_QUERY FALSE -// #define GDISP_HARDWARE_CLIP FALSE - - #define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_RGB888 -// #endif - -// The custom format is not defined for some reason, so define it as error -// so we don't get compiler warnings -#define GDISP_PIXELFORMAT_CUSTOM GDISP_PIXELFORMAT_ERROR - -#define GDISP_USE_GFXNET FALSE -// #define GDISP_GFXNET_PORT 13001 -// #define GDISP_GFXNET_CUSTOM_LWIP_STARTUP FALSE -// #define GDISP_DONT_WAIT_FOR_NET_DISPLAY FALSE -// #define GDISP_GFXNET_UNSAFE_SOCKETS FALSE - - -/////////////////////////////////////////////////////////////////////////// -// GWIN // -/////////////////////////////////////////////////////////////////////////// -#define GFX_USE_GWIN FALSE - -//#define GWIN_NEED_WINDOWMANAGER FALSE -// #define GWIN_REDRAW_IMMEDIATE FALSE -// #define GWIN_REDRAW_SINGLEOP FALSE -// #define GWIN_NEED_FLASHING FALSE -// #define GWIN_FLASHING_PERIOD 250 - -//#define GWIN_NEED_CONSOLE FALSE -// #define GWIN_CONSOLE_USE_HISTORY FALSE -// #define GWIN_CONSOLE_HISTORY_AVERAGING FALSE -// #define GWIN_CONSOLE_HISTORY_ATCREATE FALSE -// #define GWIN_CONSOLE_ESCSEQ FALSE -// #define GWIN_CONSOLE_USE_BASESTREAM FALSE -// #define GWIN_CONSOLE_USE_FLOAT FALSE -//#define GWIN_NEED_GRAPH FALSE -//#define GWIN_NEED_GL3D FALSE - -//#define GWIN_NEED_WIDGET FALSE -//#define GWIN_FOCUS_HIGHLIGHT_WIDTH 1 -// #define GWIN_NEED_LABEL FALSE -// #define GWIN_LABEL_ATTRIBUTE FALSE -// #define GWIN_NEED_BUTTON FALSE -// #define GWIN_BUTTON_LAZY_RELEASE FALSE -// #define GWIN_NEED_SLIDER FALSE -// #define GWIN_SLIDER_NOSNAP FALSE -// #define GWIN_SLIDER_DEAD_BAND 5 -// #define GWIN_SLIDER_TOGGLE_INC 20 -// #define GWIN_NEED_CHECKBOX FALSE -// #define GWIN_NEED_IMAGE FALSE -// #define GWIN_NEED_IMAGE_ANIMATION FALSE -// #define GWIN_NEED_RADIO FALSE -// #define GWIN_NEED_LIST FALSE -// #define GWIN_NEED_LIST_IMAGES FALSE -// #define GWIN_NEED_PROGRESSBAR FALSE -// #define GWIN_PROGRESSBAR_AUTO FALSE -// #define GWIN_NEED_KEYBOARD FALSE -// #define GWIN_KEYBOARD_DEFAULT_LAYOUT VirtualKeyboard_English1 -// #define GWIN_NEED_KEYBOARD_ENGLISH1 TRUE -// #define GWIN_NEED_TEXTEDIT FALSE -// #define GWIN_FLAT_STYLING FALSE -// #define GWIN_WIDGET_TAGS FALSE - -//#define GWIN_NEED_CONTAINERS FALSE -// #define GWIN_NEED_CONTAINER FALSE -// #define GWIN_NEED_FRAME FALSE -// #define GWIN_NEED_TABSET FALSE -// #define GWIN_TABSET_TABHEIGHT 18 - - -/////////////////////////////////////////////////////////////////////////// -// GEVENT // -/////////////////////////////////////////////////////////////////////////// -#define GFX_USE_GEVENT FALSE - -//#define GEVENT_ASSERT_NO_RESOURCE FALSE -//#define GEVENT_MAXIMUM_SIZE 32 -//#define GEVENT_MAX_SOURCE_LISTENERS 32 - - -/////////////////////////////////////////////////////////////////////////// -// GTIMER // -/////////////////////////////////////////////////////////////////////////// -#define GFX_USE_GTIMER FALSE - -//#define GTIMER_THREAD_PRIORITY HIGH_PRIORITY -//#define GTIMER_THREAD_WORKAREA_SIZE 2048 - - -/////////////////////////////////////////////////////////////////////////// -// GQUEUE // -/////////////////////////////////////////////////////////////////////////// -#define GFX_USE_GQUEUE FALSE - -//#define GQUEUE_NEED_ASYNC FALSE -//#define GQUEUE_NEED_GSYNC FALSE -//#define GQUEUE_NEED_FSYNC FALSE -//#define GQUEUE_NEED_BUFFERS FALSE - -/////////////////////////////////////////////////////////////////////////// -// GINPUT // -/////////////////////////////////////////////////////////////////////////// -#define GFX_USE_GINPUT FALSE - -//#define GINPUT_NEED_MOUSE FALSE -// #define GINPUT_TOUCH_STARTRAW FALSE -// #define GINPUT_TOUCH_NOTOUCH FALSE -// #define GINPUT_TOUCH_NOCALIBRATE FALSE -// #define GINPUT_TOUCH_NOCALIBRATE_GUI FALSE -// #define GINPUT_MOUSE_POLL_PERIOD 25 -// #define GINPUT_MOUSE_CLICK_TIME 300 -// #define GINPUT_TOUCH_CXTCLICK_TIME 700 -// #define GINPUT_TOUCH_USER_CALIBRATION_LOAD FALSE -// #define GINPUT_TOUCH_USER_CALIBRATION_SAVE FALSE -// #define GMOUSE_DRIVER_LIST GMOUSEVMT_Win32, GMOUSEVMT_Win32 -//#define GINPUT_NEED_KEYBOARD FALSE -// #define GINPUT_KEYBOARD_POLL_PERIOD 200 -// #define GKEYBOARD_DRIVER_LIST GKEYBOARDVMT_Win32, GKEYBOARDVMT_Win32 -// #define GKEYBOARD_LAYOUT_OFF FALSE -// #define GKEYBOARD_LAYOUT_SCANCODE2_US FALSE -//#define GINPUT_NEED_TOGGLE FALSE -//#define GINPUT_NEED_DIAL FALSE - - -/////////////////////////////////////////////////////////////////////////// -// GFILE // -/////////////////////////////////////////////////////////////////////////// -#define GFX_USE_GFILE FALSE - -//#define GFILE_NEED_PRINTG FALSE -//#define GFILE_NEED_SCANG FALSE -//#define GFILE_NEED_STRINGS FALSE -//#define GFILE_NEED_FILELISTS FALSE -//#define GFILE_NEED_STDIO FALSE -//#define GFILE_NEED_NOAUTOMOUNT FALSE -//#define GFILE_NEED_NOAUTOSYNC FALSE - -//#define GFILE_NEED_MEMFS FALSE -//#define GFILE_NEED_ROMFS FALSE -//#define GFILE_NEED_RAMFS FALSE -//#define GFILE_NEED_FATFS FALSE -//#define GFILE_NEED_NATIVEFS FALSE -//#define GFILE_NEED_CHBIOSFS FALSE - -//#define GFILE_ALLOW_FLOATS FALSE -//#define GFILE_ALLOW_DEVICESPECIFIC FALSE -//#define GFILE_MAX_GFILES 3 - -/////////////////////////////////////////////////////////////////////////// -// GADC // -/////////////////////////////////////////////////////////////////////////// -#define GFX_USE_GADC FALSE - -//#define GADC_MAX_LOWSPEED_DEVICES 4 - - -/////////////////////////////////////////////////////////////////////////// -// GAUDIO // -/////////////////////////////////////////////////////////////////////////// -#define GFX_USE_GAUDIO FALSE -// There seems to be a bug in the ugfx code, the wrong define is used -// So define it in order to avoid warnings -#define GFX_USE_GAUDIN GFX_USE_GAUDIO -// #define GAUDIO_NEED_PLAY FALSE -// #define GAUDIO_NEED_RECORD FALSE - - -/////////////////////////////////////////////////////////////////////////// -// GMISC // -/////////////////////////////////////////////////////////////////////////// -#define GFX_USE_GMISC FALSE - -//#define GMISC_NEED_ARRAYOPS FALSE -//#define GMISC_NEED_FASTTRIG FALSE -//#define GMISC_NEED_FIXEDTRIG FALSE -//#define GMISC_NEED_INVSQRT FALSE -// #define GMISC_INVSQRT_MIXED_ENDIAN FALSE -// #define GMISC_INVSQRT_REAL_SLOW FALSE -//#define GMISC_NEED_MATRIXFLOAT2D FALSE -//#define GMISC_NEED_MATRIXFIXED2D FALSE - -#endif /* _GFXCONF_H */ diff --git a/quantum/visualizer/example_integration/lcd_backlight_hal.c b/quantum/visualizer/example_integration/lcd_backlight_hal.c deleted file mode 100644 index 913131b169..0000000000 --- a/quantum/visualizer/example_integration/lcd_backlight_hal.c +++ /dev/null @@ -1,91 +0,0 @@ -/* -The MIT License (MIT) - -Copyright (c) 2016 Fred Sundvik - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ - -#include "lcd_backlight.h" -#include "hal.h" - -#define RED_PIN 1 -#define GREEN_PIN 2 -#define BLUE_PIN 3 -#define CHANNEL_RED FTM0->CHANNEL[0] -#define CHANNEL_GREEN FTM0->CHANNEL[1] -#define CHANNEL_BLUE FTM0->CHANNEL[2] - -#define RGB_PORT PORTC -#define RGB_PORT_GPIO GPIOC - -// Base FTM clock selection (72 MHz system clock) -// @ 0xFFFF period, 72 MHz / (0xFFFF * 2) = Actual period -// Higher pre-scalar will use the most power (also look the best) -// Pre-scalar calculations -// 0 - 72 MHz -> 549 Hz -// 1 - 36 MHz -> 275 Hz -// 2 - 18 MHz -> 137 Hz -// 3 - 9 MHz -> 69 Hz (Slightly visible flicker) -// 4 - 4 500 kHz -> 34 Hz (Visible flickering) -// 5 - 2 250 kHz -> 17 Hz -// 6 - 1 125 kHz -> 9 Hz -// 7 - 562 500 Hz -> 4 Hz -// Using a higher pre-scalar without flicker is possible but FTM0_MOD will need to be reduced -// Which will reduce the brightness range -#define PRESCALAR_DEFINE 0 - -void lcd_backlight_hal_init(void) { - // Setup Backlight - SIM->SCGC6 |= SIM_SCGC6_FTM0; - FTM0->CNT = 0; // Reset counter - - // PWM Period - // 16-bit maximum - FTM0->MOD = 0xFFFF; - - // Set FTM to PWM output - Edge Aligned, Low-true pulses -#define CNSC_MODE FTM_SC_CPWMS | FTM_SC_PS(4) | FTM_SC_CLKS(0) - CHANNEL_RED.CnSC = CNSC_MODE; - CHANNEL_GREEN.CnSC = CNSC_MODE; - CHANNEL_BLUE.CnSC = CNSC_MODE; - - // System clock, /w prescalar setting - FTM0->SC = FTM_SC_CLKS(1) | FTM_SC_PS(PRESCALAR_DEFINE); - - CHANNEL_RED.CnV = 0; - CHANNEL_GREEN.CnV = 0; - CHANNEL_BLUE.CnV = 0; - - RGB_PORT_GPIO->PDDR |= (1 << RED_PIN); - RGB_PORT_GPIO->PDDR |= (1 << GREEN_PIN); - RGB_PORT_GPIO->PDDR |= (1 << BLUE_PIN); - -#define RGB_MODE PORTx_PCRn_SRE | PORTx_PCRn_DSE | PORTx_PCRn_MUX(4) - RGB_PORT->PCR[RED_PIN] = RGB_MODE; - RGB_PORT->PCR[GREEN_PIN] = RGB_MODE; - RGB_PORT->PCR[BLUE_PIN] = RGB_MODE; -} - -void lcd_backlight_hal_color(uint16_t r, uint16_t g, uint16_t b) { - CHANNEL_RED.CnV = r; - CHANNEL_GREEN.CnV = g; - CHANNEL_BLUE.CnV = b; -} - diff --git a/quantum/visualizer/example_integration/visualizer_user.c b/quantum/visualizer/example_integration/visualizer_user.c deleted file mode 100644 index fc09fe2eaf..0000000000 --- a/quantum/visualizer/example_integration/visualizer_user.c +++ /dev/null @@ -1,121 +0,0 @@ -/* -The MIT License (MIT) - -Copyright (c) 2016 Fred Sundvik - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ - -// Currently we are assuming that both the backlight and LCD are enabled -// But it's entirely possible to write a custom visualizer that use only -// one of them -#ifndef LCD_BACKLIGHT_ENABLE -#error This visualizer needs that LCD backlight is enabled -#endif - -#ifndef LCD_ENABLE -#error This visualizer needs that LCD is enabled -#endif - -#include "visualizer.h" - -static const char* welcome_text[] = {"TMK", "Infinity Ergodox"}; - -// Just an example how to write custom keyframe functions, we could have moved -// all this into the init function -bool display_welcome(keyframe_animation_t* animation, visualizer_state_t* state) { - (void)animation; - // Read the uGFX documentation for information how to use the displays - // http://wiki.ugfx.org/index.php/Main_Page - gdispClear(White); - // You can use static variables for things that can't be found in the animation - // or state structs - gdispDrawString(0, 3, welcome_text[0], state->font_dejavusansbold12, Black); - gdispDrawString(0, 15, welcome_text[1], state->font_dejavusansbold12, Black); - // Always remember to flush the display - gdispFlush(); - // you could set the backlight color as well, but we won't do it here, since - // it's part of the following animation - // lcd_backlight_color(hue, saturation, intensity); - // We don't need constant updates, just drawing the screen once is enough - return false; -} - -// Feel free to modify the animations below, or even add new ones if needed - -// Don't worry, if the startup animation is long, you can use the keyboard like normal -// during that time -static keyframe_animation_t startup_animation = { - .num_frames = 4, - .loop = false, - .frame_lengths = {0, MS2ST(1000), MS2ST(5000), 0}, - .frame_functions = {display_welcome, keyframe_animate_backlight_color, keyframe_no_operation, enable_visualization}, -}; - -// The color animation animates the LCD color when you change layers -static keyframe_animation_t color_animation = { - .num_frames = 2, - .loop = false, - // Note that there's a 200 ms no-operation frame, - // this prevents the color from changing when activating the layer - // momentarily - .frame_lengths = {MS2ST(200), MS2ST(500)}, - .frame_functions = {keyframe_no_operation, keyframe_animate_backlight_color}, -}; - -// The LCD animation alternates between the layer name display and a -// bitmap that displays all active layers -static keyframe_animation_t lcd_animation = { - .num_frames = 2, - .loop = true, - .frame_lengths = {MS2ST(2000), MS2ST(2000)}, - .frame_functions = {keyframe_display_layer_text, keyframe_display_layer_bitmap}, -}; - -void initialize_user_visualizer(visualizer_state_t* state) { - // The brightness will be dynamically adjustable in the future - // But for now, change it here. - lcd_backlight_brightness(0x50); - state->current_lcd_color = LCD_COLOR(0x00, 0x00, 0xFF); - state->target_lcd_color = LCD_COLOR(0x10, 0xFF, 0xFF); - start_keyframe_animation(&startup_animation); -} - -void update_user_visualizer_state(visualizer_state_t* state) { - // Add more tests, change the colors and layer texts here - // Usually you want to check the high bits (higher layers first) - // because that's the order layers are processed for keypresses - // You can for check for example: - // state->status.layer - // state->status.default_layer - // state->status.leds (see led.h for available statuses) - if (state->status.layer & 0x2) { - state->target_lcd_color = LCD_COLOR(0xA0, 0xB0, 0xFF); - state->layer_text = "Layer 2"; - } - else { - state->target_lcd_color = LCD_COLOR(0x50, 0xB0, 0xFF); - state->layer_text = "Layer 1"; - } - // You can also stop existing animations, and start your custom ones here - // remember that you should normally have only one animation for the LCD - // and one for the background. But you can also combine them if you want. - start_keyframe_animation(&lcd_animation); - start_keyframe_animation(&color_animation); -} From 5815c5d317b02d688990980fdf01848e81247c21 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Wed, 5 Apr 2017 08:40:39 +0300 Subject: [PATCH 100/117] Move LCD keyframes to its own file --- keyboards/ergodox/infinity/visualizer.c | 7 +- .../ergodox/keymaps/default/visualizer.c | 5 +- quantum/visualizer/lcd_keyframes.c | 160 ++++++++++++++++++ quantum/visualizer/lcd_keyframes.h | 33 ++++ quantum/visualizer/visualizer.c | 150 +--------------- quantum/visualizer/visualizer.h | 9 - quantum/visualizer/visualizer.mk | 1 + 7 files changed, 203 insertions(+), 162 deletions(-) create mode 100644 quantum/visualizer/lcd_keyframes.c create mode 100644 quantum/visualizer/lcd_keyframes.h diff --git a/keyboards/ergodox/infinity/visualizer.c b/keyboards/ergodox/infinity/visualizer.c index c7afd9384c..3abed08db0 100644 --- a/keyboards/ergodox/infinity/visualizer.c +++ b/keyboards/ergodox/infinity/visualizer.c @@ -27,6 +27,7 @@ along with this program. If not, see . #endif #include "visualizer.h" +#include "lcd_keyframes.h" #include "system/serial_link.h" // To generate an image array like this @@ -173,14 +174,14 @@ static keyframe_animation_t lcd_bitmap_animation = { .num_frames = 1, .loop = false, .frame_lengths = {gfxMillisecondsToTicks(0)}, - .frame_functions = {keyframe_display_layer_bitmap}, + .frame_functions = {lcd_keyframe_display_layer_bitmap}, }; static keyframe_animation_t lcd_bitmap_leds_animation = { .num_frames = 2, .loop = true, .frame_lengths = {gfxMillisecondsToTicks(2000), gfxMillisecondsToTicks(2000)}, - .frame_functions = {keyframe_display_layer_bitmap, keyframe_display_led_states}, + .frame_functions = {lcd_keyframe_display_layer_bitmap, lcd_keyframe_display_led_states}, }; static keyframe_animation_t suspend_animation = { @@ -188,7 +189,7 @@ static keyframe_animation_t suspend_animation = { .loop = false, .frame_lengths = {0, gfxMillisecondsToTicks(1000), 0}, .frame_functions = { - keyframe_display_layer_text, + lcd_keyframe_display_layer_text, keyframe_animate_backlight_color, keyframe_disable_lcd_and_backlight, }, diff --git a/keyboards/ergodox/keymaps/default/visualizer.c b/keyboards/ergodox/keymaps/default/visualizer.c index 305aaae157..ef87ac4195 100644 --- a/keyboards/ergodox/keymaps/default/visualizer.c +++ b/keyboards/ergodox/keymaps/default/visualizer.c @@ -27,6 +27,7 @@ along with this program. If not, see . #endif #include "visualizer.h" +#include "lcd_keyframes.h" #include "system/serial_link.h" #include "led.h" @@ -122,7 +123,7 @@ static keyframe_animation_t lcd_layer_display = { .num_frames = 1, .loop = false, .frame_lengths = {gfxMillisecondsToTicks(0)}, - .frame_functions = {keyframe_display_layer_and_led_states} + .frame_functions = {lcd_keyframe_display_layer_and_led_states} }; static keyframe_animation_t suspend_animation = { @@ -130,7 +131,7 @@ static keyframe_animation_t suspend_animation = { .loop = false, .frame_lengths = {0, gfxMillisecondsToTicks(1000), 0}, .frame_functions = { - keyframe_display_layer_text, + lcd_keyframe_display_layer_text, keyframe_animate_backlight_color, keyframe_disable_lcd_and_backlight, }, diff --git a/quantum/visualizer/lcd_keyframes.c b/quantum/visualizer/lcd_keyframes.c new file mode 100644 index 0000000000..00d9734e6a --- /dev/null +++ b/quantum/visualizer/lcd_keyframes.c @@ -0,0 +1,160 @@ +/* Copyright 2017 Fred Sundvik + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "lcd_keyframes.h" +#include +#include "action_util.h" +#include "led.h" + +bool lcd_keyframe_display_layer_text(keyframe_animation_t* animation, visualizer_state_t* state) { + (void)animation; + gdispClear(White); + gdispDrawString(0, 10, state->layer_text, state->font_dejavusansbold12, Black); + gdispFlush(); + return false; +} + +static void format_layer_bitmap_string(uint16_t default_layer, uint16_t layer, char* buffer) { + for (int i=0; i<16;i++) + { + uint32_t mask = (1u << i); + if (default_layer & mask) { + if (layer & mask) { + *buffer = 'B'; + } else { + *buffer = 'D'; + } + } else if (layer & mask) { + *buffer = '1'; + } else { + *buffer = '0'; + } + ++buffer; + + if (i==3 || i==7 || i==11) { + *buffer = ' '; + ++buffer; + } + } + *buffer = 0; +} + +bool lcd_keyframe_display_layer_bitmap(keyframe_animation_t* animation, visualizer_state_t* state) { + (void)animation; + const char* layer_help = "1=On D=Default B=Both"; + char layer_buffer[16 + 4]; // 3 spaces and one null terminator + gdispClear(White); + gdispDrawString(0, 0, layer_help, state->font_fixed5x8, Black); + format_layer_bitmap_string(state->status.default_layer, state->status.layer, layer_buffer); + gdispDrawString(0, 10, layer_buffer, state->font_fixed5x8, Black); + format_layer_bitmap_string(state->status.default_layer >> 16, state->status.layer >> 16, layer_buffer); + gdispDrawString(0, 20, layer_buffer, state->font_fixed5x8, Black); + gdispFlush(); + return false; +} + +static void format_mods_bitmap_string(uint8_t mods, char* buffer) { + *buffer = ' '; + ++buffer; + + for (int i = 0; i<8; i++) + { + uint32_t mask = (1u << i); + if (mods & mask) { + *buffer = '1'; + } else { + *buffer = '0'; + } + ++buffer; + + if (i==3) { + *buffer = ' '; + ++buffer; + } + } + *buffer = 0; +} + +bool lcd_keyframe_display_mods_bitmap(keyframe_animation_t* animation, visualizer_state_t* state) { + (void)animation; + + const char* title = "Modifier states"; + const char* mods_header = " CSAG CSAG "; + char status_buffer[12]; + + gdispClear(White); + gdispDrawString(0, 0, title, state->font_fixed5x8, Black); + gdispDrawString(0, 10, mods_header, state->font_fixed5x8, Black); + format_mods_bitmap_string(state->status.mods, status_buffer); + gdispDrawString(0, 20, status_buffer, state->font_fixed5x8, Black); + + gdispFlush(); + return false; +} + +#define LED_STATE_STRING_SIZE sizeof("NUM CAPS SCRL COMP KANA") + +static void get_led_state_string(char* output, visualizer_state_t* state) { + uint8_t pos = 0; + + if (state->status.leds & (1u << USB_LED_NUM_LOCK)) { + memcpy(output + pos, "NUM ", 4); + pos += 4; + } + if (state->status.leds & (1u << USB_LED_CAPS_LOCK)) { + memcpy(output + pos, "CAPS ", 5); + pos += 5; + } + if (state->status.leds & (1u << USB_LED_SCROLL_LOCK)) { + memcpy(output + pos, "SCRL ", 5); + pos += 5; + } + if (state->status.leds & (1u << USB_LED_COMPOSE)) { + memcpy(output + pos, "COMP ", 5); + pos += 5; + } + if (state->status.leds & (1u << USB_LED_KANA)) { + memcpy(output + pos, "KANA ", 5); + pos += 5; + } + output[pos] = 0; +} + +bool lcd_keyframe_display_led_states(keyframe_animation_t* animation, visualizer_state_t* state) +{ + (void)animation; + char output[LED_STATE_STRING_SIZE]; + get_led_state_string(output, state); + gdispClear(White); + gdispDrawString(0, 10, output, state->font_dejavusansbold12, Black); + gdispFlush(); + return false; +} + +bool lcd_keyframe_display_layer_and_led_states(keyframe_animation_t* animation, visualizer_state_t* state) { + (void)animation; + gdispClear(White); + uint8_t y = 10; + if (state->status.leds) { + char output[LED_STATE_STRING_SIZE]; + get_led_state_string(output, state); + gdispDrawString(0, 1, output, state->font_dejavusansbold12, Black); + y = 17; + } + gdispDrawString(0, y, state->layer_text, state->font_dejavusansbold12, Black); + gdispFlush(); + return false; +} diff --git a/quantum/visualizer/lcd_keyframes.h b/quantum/visualizer/lcd_keyframes.h new file mode 100644 index 0000000000..0c9f39ab8c --- /dev/null +++ b/quantum/visualizer/lcd_keyframes.h @@ -0,0 +1,33 @@ +/* Copyright 2017 Fred Sundvik + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef QUANTUM_VISUALIZER_LCD_KEYFRAMES_H_ +#define QUANTUM_VISUALIZER_LCD_KEYFRAMES_H_ + +#include "visualizer.h" + +// Displays the layer text centered vertically on the screen +bool lcd_keyframe_display_layer_text(keyframe_animation_t* animation, visualizer_state_t* state); +// Displays a bitmap (0/1) of all the currently active layers +bool lcd_keyframe_display_layer_bitmap(keyframe_animation_t* animation, visualizer_state_t* state); +// Displays a bitmap (0/1) of all the currently active mods +bool lcd_keyframe_display_mods_bitmap(keyframe_animation_t* animation, visualizer_state_t* state); +// Displays the keyboard led states (CAPS (Caps lock), NUM (Num lock), SCRL (Scroll lock), COMP (Compose), KANA) +bool lcd_keyframe_display_led_states(keyframe_animation_t* animation, visualizer_state_t* state); +// Displays both the layer text and the led states +bool lcd_keyframe_display_layer_and_led_states(keyframe_animation_t* animation, visualizer_state_t* state); + +#endif /* QUANTUM_VISUALIZER_LCD_KEYFRAMES_H_ */ diff --git a/quantum/visualizer/visualizer.c b/quantum/visualizer/visualizer.c index 2533eb7090..514d7c44e0 100644 --- a/quantum/visualizer/visualizer.c +++ b/quantum/visualizer/visualizer.c @@ -48,16 +48,13 @@ SOFTWARE. #include "serial_link/system/serial_link.h" #endif +#include "action_util.h" + // Define this in config.h #ifndef VISUALIZER_THREAD_PRIORITY #define "Visualizer thread priority not defined" #endif -// mods status -#include "action_util.h" - -#include "led.h" - static visualizer_keyboard_status_t current_status = { .layer = 0xFFFFFFFF, .default_layer = 0xFFFFFFFF, @@ -277,149 +274,6 @@ bool keyframe_set_backlight_color(keyframe_animation_t* animation, visualizer_st } #endif // LCD_BACKLIGHT_ENABLE -#ifdef LCD_ENABLE -bool keyframe_display_layer_text(keyframe_animation_t* animation, visualizer_state_t* state) { - (void)animation; - gdispClear(White); - gdispDrawString(0, 10, state->layer_text, state->font_dejavusansbold12, Black); - gdispFlush(); - return false; -} - -static void format_layer_bitmap_string(uint16_t default_layer, uint16_t layer, char* buffer) { - for (int i=0; i<16;i++) - { - uint32_t mask = (1u << i); - if (default_layer & mask) { - if (layer & mask) { - *buffer = 'B'; - } else { - *buffer = 'D'; - } - } else if (layer & mask) { - *buffer = '1'; - } else { - *buffer = '0'; - } - ++buffer; - - if (i==3 || i==7 || i==11) { - *buffer = ' '; - ++buffer; - } - } - *buffer = 0; -} - -bool keyframe_display_layer_bitmap(keyframe_animation_t* animation, visualizer_state_t* state) { - (void)animation; - const char* layer_help = "1=On D=Default B=Both"; - char layer_buffer[16 + 4]; // 3 spaces and one null terminator - gdispClear(White); - gdispDrawString(0, 0, layer_help, state->font_fixed5x8, Black); - format_layer_bitmap_string(state->status.default_layer, state->status.layer, layer_buffer); - gdispDrawString(0, 10, layer_buffer, state->font_fixed5x8, Black); - format_layer_bitmap_string(state->status.default_layer >> 16, state->status.layer >> 16, layer_buffer); - gdispDrawString(0, 20, layer_buffer, state->font_fixed5x8, Black); - gdispFlush(); - return false; -} - -static void format_mods_bitmap_string(uint8_t mods, char* buffer) { - *buffer = ' '; - ++buffer; - - for (int i = 0; i<8; i++) - { - uint32_t mask = (1u << i); - if (mods & mask) { - *buffer = '1'; - } else { - *buffer = '0'; - } - ++buffer; - - if (i==3) { - *buffer = ' '; - ++buffer; - } - } - *buffer = 0; -} - -bool keyframe_display_mods_bitmap(keyframe_animation_t* animation, visualizer_state_t* state) { - (void)animation; - - const char* title = "Modifier states"; - const char* mods_header = " CSAG CSAG "; - char status_buffer[12]; - - gdispClear(White); - gdispDrawString(0, 0, title, state->font_fixed5x8, Black); - gdispDrawString(0, 10, mods_header, state->font_fixed5x8, Black); - format_mods_bitmap_string(state->status.mods, status_buffer); - gdispDrawString(0, 20, status_buffer, state->font_fixed5x8, Black); - - gdispFlush(); - return false; -} - -#define LED_STATE_STRING_SIZE sizeof("NUM CAPS SCRL COMP KANA") - -static void get_led_state_string(char* output, visualizer_state_t* state) { - uint8_t pos = 0; - - if (state->status.leds & (1u << USB_LED_NUM_LOCK)) { - memcpy(output + pos, "NUM ", 4); - pos += 4; - } - if (state->status.leds & (1u << USB_LED_CAPS_LOCK)) { - memcpy(output + pos, "CAPS ", 5); - pos += 5; - } - if (state->status.leds & (1u << USB_LED_SCROLL_LOCK)) { - memcpy(output + pos, "SCRL ", 5); - pos += 5; - } - if (state->status.leds & (1u << USB_LED_COMPOSE)) { - memcpy(output + pos, "COMP ", 5); - pos += 5; - } - if (state->status.leds & (1u << USB_LED_KANA)) { - memcpy(output + pos, "KANA ", 5); - pos += 5; - } - output[pos] = 0; -} - -bool keyframe_display_led_states(keyframe_animation_t* animation, visualizer_state_t* state) -{ - (void)animation; - char output[LED_STATE_STRING_SIZE]; - get_led_state_string(output, state); - gdispClear(White); - gdispDrawString(0, 10, output, state->font_dejavusansbold12, Black); - gdispFlush(); - return false; -} - -bool keyframe_display_layer_and_led_states(keyframe_animation_t* animation, visualizer_state_t* state) { - (void)animation; - gdispClear(White); - uint8_t y = 10; - if (state->status.leds) { - char output[LED_STATE_STRING_SIZE]; - get_led_state_string(output, state); - gdispDrawString(0, 1, output, state->font_dejavusansbold12, Black); - y = 17; - } - gdispDrawString(0, y, state->layer_text, state->font_dejavusansbold12, Black); - gdispFlush(); - return false; -} - -#endif // LCD_ENABLE - bool keyframe_disable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state) { (void)animation; (void)state; diff --git a/quantum/visualizer/visualizer.h b/quantum/visualizer/visualizer.h index 3b05c305e2..440044fd3d 100644 --- a/quantum/visualizer/visualizer.h +++ b/quantum/visualizer/visualizer.h @@ -133,15 +133,6 @@ bool keyframe_no_operation(keyframe_animation_t* animation, visualizer_state_t* bool keyframe_animate_backlight_color(keyframe_animation_t* animation, visualizer_state_t* state); // Sets the backlight color to the target color bool keyframe_set_backlight_color(keyframe_animation_t* animation, visualizer_state_t* state); -// Displays the layer text centered vertically on the screen -bool keyframe_display_layer_text(keyframe_animation_t* animation, visualizer_state_t* state); -// Displays a bitmap (0/1) of all the currently active layers -bool keyframe_display_layer_bitmap(keyframe_animation_t* animation, visualizer_state_t* state); -// Displays a bitmap (0/1) of all the currently active mods -bool keyframe_display_mods_bitmap(keyframe_animation_t* animation, visualizer_state_t* state); -// Displays the keyboard led states (CAPS (Caps lock), NUM (Num lock), SCRL (Scroll lock), COMP (Compose), KANA) -bool keyframe_display_led_states(keyframe_animation_t* animation, visualizer_state_t* state); -bool keyframe_display_layer_and_led_states(keyframe_animation_t* animation, visualizer_state_t* state); bool keyframe_disable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state); bool keyframe_enable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state); diff --git a/quantum/visualizer/visualizer.mk b/quantum/visualizer/visualizer.mk index 3861cb1f04..325cefd6f8 100644 --- a/quantum/visualizer/visualizer.mk +++ b/quantum/visualizer/visualizer.mk @@ -34,6 +34,7 @@ endif ifeq ($(strip $(LCD_ENABLE)), yes) SRC += $(VISUALIZER_DIR)/lcd_backlight.c +SRC += $(VISUALIZER_DIR)/lcd_keyframes.c OPT_DEFS += -DLCD_BACKLIGHT_ENABLE endif From 5ba228b684a32c1099efc6207842a56ff102961a Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Wed, 5 Apr 2017 08:48:30 +0300 Subject: [PATCH 101/117] Move LCD backlight keyframes to its own file --- keyboards/ergodox/infinity/visualizer.c | 11 ++-- .../ergodox/keymaps/default/visualizer.c | 9 +-- quantum/visualizer/lcd_backlight_keyframes.c | 61 +++++++++++++++++++ quantum/visualizer/lcd_backlight_keyframes.h | 27 ++++++++ quantum/visualizer/visualizer.c | 46 -------------- quantum/visualizer/visualizer.h | 4 -- quantum/visualizer/visualizer.mk | 1 + 7 files changed, 100 insertions(+), 59 deletions(-) create mode 100644 quantum/visualizer/lcd_backlight_keyframes.c create mode 100644 quantum/visualizer/lcd_backlight_keyframes.h diff --git a/keyboards/ergodox/infinity/visualizer.c b/keyboards/ergodox/infinity/visualizer.c index 3abed08db0..bbed4e9897 100644 --- a/keyboards/ergodox/infinity/visualizer.c +++ b/keyboards/ergodox/infinity/visualizer.c @@ -28,6 +28,7 @@ along with this program. If not, see . #include "visualizer.h" #include "lcd_keyframes.h" +#include "lcd_backlight_keyframes.h" #include "system/serial_link.h" // To generate an image array like this @@ -140,7 +141,7 @@ static keyframe_animation_t startup_animation = { .frame_lengths = {0, gfxMillisecondsToTicks(10000), 0}, .frame_functions = { display_logo, - keyframe_animate_backlight_color, + backlight_keyframe_animate_color, enable_visualization }, }; @@ -150,7 +151,7 @@ static keyframe_animation_t one_led_color = { .num_frames = 1, .loop = false, .frame_lengths = {gfxMillisecondsToTicks(0)}, - .frame_functions = {keyframe_set_backlight_color}, + .frame_functions = {backlight_keyframe_set_color}, }; bool swap_led_target_color(keyframe_animation_t* animation, visualizer_state_t* state) { @@ -165,7 +166,7 @@ static keyframe_animation_t two_led_colors = { .num_frames = 2, .loop = true, .frame_lengths = {gfxMillisecondsToTicks(1000), gfxMillisecondsToTicks(0)}, - .frame_functions = {keyframe_set_backlight_color, swap_led_target_color}, + .frame_functions = {backlight_keyframe_set_color, swap_led_target_color}, }; // The LCD animation alternates between the layer name display and a @@ -190,7 +191,7 @@ static keyframe_animation_t suspend_animation = { .frame_lengths = {0, gfxMillisecondsToTicks(1000), 0}, .frame_functions = { lcd_keyframe_display_layer_text, - keyframe_animate_backlight_color, + backlight_keyframe_animate_color, keyframe_disable_lcd_and_backlight, }, }; @@ -202,7 +203,7 @@ static keyframe_animation_t resume_animation = { .frame_functions = { keyframe_enable_lcd_and_backlight, display_logo, - keyframe_animate_backlight_color, + backlight_keyframe_animate_color, enable_visualization, }, }; diff --git a/keyboards/ergodox/keymaps/default/visualizer.c b/keyboards/ergodox/keymaps/default/visualizer.c index ef87ac4195..07f5a44ab3 100644 --- a/keyboards/ergodox/keymaps/default/visualizer.c +++ b/keyboards/ergodox/keymaps/default/visualizer.c @@ -28,6 +28,7 @@ along with this program. If not, see . #include "visualizer.h" #include "lcd_keyframes.h" +#include "lcd_backlight_keyframes.h" #include "system/serial_link.h" #include "led.h" @@ -114,7 +115,7 @@ static keyframe_animation_t startup_animation = { .frame_lengths = {0, gfxMillisecondsToTicks(10000), 0}, .frame_functions = { display_logo, - keyframe_animate_backlight_color, + backlight_keyframe_animate_color, enable_visualization }, }; @@ -132,7 +133,7 @@ static keyframe_animation_t suspend_animation = { .frame_lengths = {0, gfxMillisecondsToTicks(1000), 0}, .frame_functions = { lcd_keyframe_display_layer_text, - keyframe_animate_backlight_color, + backlight_keyframe_animate_color, keyframe_disable_lcd_and_backlight, }, }; @@ -144,7 +145,7 @@ static keyframe_animation_t resume_animation = { .frame_functions = { keyframe_enable_lcd_and_backlight, display_logo, - keyframe_animate_backlight_color, + backlight_keyframe_animate_color, enable_visualization, }, }; @@ -157,7 +158,7 @@ static keyframe_animation_t color_animation = { // this prevents the color from changing when activating the layer // momentarily .frame_lengths = {gfxMillisecondsToTicks(200), gfxMillisecondsToTicks(500)}, - .frame_functions = {keyframe_no_operation, keyframe_animate_backlight_color}, + .frame_functions = {keyframe_no_operation, backlight_keyframe_animate_color}, }; void initialize_user_visualizer(visualizer_state_t* state) { diff --git a/quantum/visualizer/lcd_backlight_keyframes.c b/quantum/visualizer/lcd_backlight_keyframes.c new file mode 100644 index 0000000000..0964737087 --- /dev/null +++ b/quantum/visualizer/lcd_backlight_keyframes.c @@ -0,0 +1,61 @@ +/* Copyright 2017 Fred Sundvik + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "lcd_backlight_keyframes.h" + +bool backlight_keyframe_animate_color(keyframe_animation_t* animation, visualizer_state_t* state) { + int frame_length = animation->frame_lengths[animation->current_frame]; + int current_pos = frame_length - animation->time_left_in_frame; + uint8_t t_h = LCD_HUE(state->target_lcd_color); + uint8_t t_s = LCD_SAT(state->target_lcd_color); + uint8_t t_i = LCD_INT(state->target_lcd_color); + uint8_t p_h = LCD_HUE(state->prev_lcd_color); + uint8_t p_s = LCD_SAT(state->prev_lcd_color); + uint8_t p_i = LCD_INT(state->prev_lcd_color); + + uint8_t d_h1 = t_h - p_h; //Modulo arithmetic since we want to wrap around + int d_h2 = t_h - p_h; + // Chose the shortest way around + int d_h = abs(d_h2) < d_h1 ? d_h2 : d_h1; + int d_s = t_s - p_s; + int d_i = t_i - p_i; + + int hue = (d_h * current_pos) / frame_length; + int sat = (d_s * current_pos) / frame_length; + int intensity = (d_i * current_pos) / frame_length; + //dprintf("%X -> %X = %X\n", p_h, t_h, hue); + hue += p_h; + sat += p_s; + intensity += p_i; + state->current_lcd_color = LCD_COLOR(hue, sat, intensity); + lcd_backlight_color( + LCD_HUE(state->current_lcd_color), + LCD_SAT(state->current_lcd_color), + LCD_INT(state->current_lcd_color)); + + return true; +} + +bool backlight_keyframe_set_color(keyframe_animation_t* animation, visualizer_state_t* state) { + (void)animation; + state->prev_lcd_color = state->target_lcd_color; + state->current_lcd_color = state->target_lcd_color; + lcd_backlight_color( + LCD_HUE(state->current_lcd_color), + LCD_SAT(state->current_lcd_color), + LCD_INT(state->current_lcd_color)); + return false; +} diff --git a/quantum/visualizer/lcd_backlight_keyframes.h b/quantum/visualizer/lcd_backlight_keyframes.h new file mode 100644 index 0000000000..8cd5a46c6a --- /dev/null +++ b/quantum/visualizer/lcd_backlight_keyframes.h @@ -0,0 +1,27 @@ +/* Copyright 2017 Fred Sundvik + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef QUANTUM_VISUALIZER_LCD_BACKLIGHT_KEYFRAMES_H_ +#define QUANTUM_VISUALIZER_LCD_BACKLIGHT_KEYFRAMES_H_ + +#include "visualizer.h" + +// Animates the LCD backlight color between the current color and the target color (of the state) +bool backlight_keyframe_animate_color(keyframe_animation_t* animation, visualizer_state_t* state); +// Sets the backlight color to the target color +bool backlight_keyframe_set_color(keyframe_animation_t* animation, visualizer_state_t* state); + +#endif /* QUANTUM_VISUALIZER_LCD_BACKLIGHT_KEYFRAMES_H_ */ diff --git a/quantum/visualizer/visualizer.c b/quantum/visualizer/visualizer.c index 514d7c44e0..6ebd806e40 100644 --- a/quantum/visualizer/visualizer.c +++ b/quantum/visualizer/visualizer.c @@ -228,52 +228,6 @@ bool keyframe_no_operation(keyframe_animation_t* animation, visualizer_state_t* return false; } -#ifdef LCD_BACKLIGHT_ENABLE -bool keyframe_animate_backlight_color(keyframe_animation_t* animation, visualizer_state_t* state) { - int frame_length = animation->frame_lengths[animation->current_frame]; - int current_pos = frame_length - animation->time_left_in_frame; - uint8_t t_h = LCD_HUE(state->target_lcd_color); - uint8_t t_s = LCD_SAT(state->target_lcd_color); - uint8_t t_i = LCD_INT(state->target_lcd_color); - uint8_t p_h = LCD_HUE(state->prev_lcd_color); - uint8_t p_s = LCD_SAT(state->prev_lcd_color); - uint8_t p_i = LCD_INT(state->prev_lcd_color); - - uint8_t d_h1 = t_h - p_h; //Modulo arithmetic since we want to wrap around - int d_h2 = t_h - p_h; - // Chose the shortest way around - int d_h = abs(d_h2) < d_h1 ? d_h2 : d_h1; - int d_s = t_s - p_s; - int d_i = t_i - p_i; - - int hue = (d_h * current_pos) / frame_length; - int sat = (d_s * current_pos) / frame_length; - int intensity = (d_i * current_pos) / frame_length; - //dprintf("%X -> %X = %X\n", p_h, t_h, hue); - hue += p_h; - sat += p_s; - intensity += p_i; - state->current_lcd_color = LCD_COLOR(hue, sat, intensity); - lcd_backlight_color( - LCD_HUE(state->current_lcd_color), - LCD_SAT(state->current_lcd_color), - LCD_INT(state->current_lcd_color)); - - return true; -} - -bool keyframe_set_backlight_color(keyframe_animation_t* animation, visualizer_state_t* state) { - (void)animation; - state->prev_lcd_color = state->target_lcd_color; - state->current_lcd_color = state->target_lcd_color; - lcd_backlight_color( - LCD_HUE(state->current_lcd_color), - LCD_SAT(state->current_lcd_color), - LCD_INT(state->current_lcd_color)); - return false; -} -#endif // LCD_BACKLIGHT_ENABLE - bool keyframe_disable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state) { (void)animation; (void)state; diff --git a/quantum/visualizer/visualizer.h b/quantum/visualizer/visualizer.h index 440044fd3d..5c870dbfe9 100644 --- a/quantum/visualizer/visualizer.h +++ b/quantum/visualizer/visualizer.h @@ -129,10 +129,6 @@ void run_next_keyframe(keyframe_animation_t* animation, visualizer_state_t* stat // Some predefined keyframe functions that can be used by the user code // Does nothing, useful for adding delays bool keyframe_no_operation(keyframe_animation_t* animation, visualizer_state_t* state); -// Animates the LCD backlight color between the current color and the target color (of the state) -bool keyframe_animate_backlight_color(keyframe_animation_t* animation, visualizer_state_t* state); -// Sets the backlight color to the target color -bool keyframe_set_backlight_color(keyframe_animation_t* animation, visualizer_state_t* state); bool keyframe_disable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state); bool keyframe_enable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state); diff --git a/quantum/visualizer/visualizer.mk b/quantum/visualizer/visualizer.mk index 325cefd6f8..c9eb8c5bbd 100644 --- a/quantum/visualizer/visualizer.mk +++ b/quantum/visualizer/visualizer.mk @@ -35,6 +35,7 @@ endif ifeq ($(strip $(LCD_ENABLE)), yes) SRC += $(VISUALIZER_DIR)/lcd_backlight.c SRC += $(VISUALIZER_DIR)/lcd_keyframes.c +SRC += $(VISUALIZER_DIR)/lcd_backlight_keyframes.c OPT_DEFS += -DLCD_BACKLIGHT_ENABLE endif From 1e7585e76771e1a2d8ca733fc09c19f9fa0e903c Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Wed, 5 Apr 2017 09:21:18 +0300 Subject: [PATCH 102/117] Separated backlight and LCD disable/enable Also moved them to correct places --- keyboards/ergodox/infinity/visualizer.c | 14 +++++++------ .../ergodox/keymaps/default/visualizer.c | 14 +++++++------ quantum/visualizer/lcd_backlight_keyframes.c | 16 ++++++++++++++ quantum/visualizer/lcd_backlight_keyframes.h | 3 +++ quantum/visualizer/lcd_keyframes.c | 14 +++++++++++++ quantum/visualizer/lcd_keyframes.h | 4 ++++ quantum/visualizer/visualizer.c | 21 ------------------- quantum/visualizer/visualizer.h | 3 --- 8 files changed, 53 insertions(+), 36 deletions(-) diff --git a/keyboards/ergodox/infinity/visualizer.c b/keyboards/ergodox/infinity/visualizer.c index bbed4e9897..8e684d9919 100644 --- a/keyboards/ergodox/infinity/visualizer.c +++ b/keyboards/ergodox/infinity/visualizer.c @@ -186,22 +186,24 @@ static keyframe_animation_t lcd_bitmap_leds_animation = { }; static keyframe_animation_t suspend_animation = { - .num_frames = 3, + .num_frames = 4, .loop = false, - .frame_lengths = {0, gfxMillisecondsToTicks(1000), 0}, + .frame_lengths = {0, gfxMillisecondsToTicks(1000), 0, 0}, .frame_functions = { lcd_keyframe_display_layer_text, backlight_keyframe_animate_color, - keyframe_disable_lcd_and_backlight, + lcd_keyframe_disable, + lcd_keyframe_disable, }, }; static keyframe_animation_t resume_animation = { - .num_frames = 4, + .num_frames = 5, .loop = false, - .frame_lengths = {0, 0, gfxMillisecondsToTicks(10000), 0}, + .frame_lengths = {0, 0, 0, gfxMillisecondsToTicks(10000), 0}, .frame_functions = { - keyframe_enable_lcd_and_backlight, + lcd_keyframe_enable, + backlight_keyframe_enable, display_logo, backlight_keyframe_animate_color, enable_visualization, diff --git a/keyboards/ergodox/keymaps/default/visualizer.c b/keyboards/ergodox/keymaps/default/visualizer.c index 07f5a44ab3..5ee49c9bc2 100644 --- a/keyboards/ergodox/keymaps/default/visualizer.c +++ b/keyboards/ergodox/keymaps/default/visualizer.c @@ -128,22 +128,24 @@ static keyframe_animation_t lcd_layer_display = { }; static keyframe_animation_t suspend_animation = { - .num_frames = 3, + .num_frames = 4, .loop = false, - .frame_lengths = {0, gfxMillisecondsToTicks(1000), 0}, + .frame_lengths = {0, gfxMillisecondsToTicks(1000), 0, 0}, .frame_functions = { lcd_keyframe_display_layer_text, backlight_keyframe_animate_color, - keyframe_disable_lcd_and_backlight, + lcd_keyframe_disable, + lcd_keyframe_disable, }, }; static keyframe_animation_t resume_animation = { - .num_frames = 4, + .num_frames = 5, .loop = false, - .frame_lengths = {0, 0, gfxMillisecondsToTicks(10000), 0}, + .frame_lengths = {0, 0, 0, gfxMillisecondsToTicks(10000), 0}, .frame_functions = { - keyframe_enable_lcd_and_backlight, + lcd_keyframe_enable, + backlight_keyframe_enable, display_logo, backlight_keyframe_animate_color, enable_visualization, diff --git a/quantum/visualizer/lcd_backlight_keyframes.c b/quantum/visualizer/lcd_backlight_keyframes.c index 0964737087..8436d4e3dd 100644 --- a/quantum/visualizer/lcd_backlight_keyframes.c +++ b/quantum/visualizer/lcd_backlight_keyframes.c @@ -59,3 +59,19 @@ bool backlight_keyframe_set_color(keyframe_animation_t* animation, visualizer_st LCD_INT(state->current_lcd_color)); return false; } + +bool backlight_keyframe_disable(keyframe_animation_t* animation, visualizer_state_t* state) { + (void)animation; + (void)state; + lcd_backlight_hal_color(0, 0, 0); + return false; +} + +bool backlight_keyframe_enable(keyframe_animation_t* animation, visualizer_state_t* state) { + (void)animation; + (void)state; + lcd_backlight_color(LCD_HUE(state->current_lcd_color), + LCD_SAT(state->current_lcd_color), + LCD_INT(state->current_lcd_color)); + return false; +} diff --git a/quantum/visualizer/lcd_backlight_keyframes.h b/quantum/visualizer/lcd_backlight_keyframes.h index 8cd5a46c6a..e1c125cf91 100644 --- a/quantum/visualizer/lcd_backlight_keyframes.h +++ b/quantum/visualizer/lcd_backlight_keyframes.h @@ -24,4 +24,7 @@ bool backlight_keyframe_animate_color(keyframe_animation_t* animation, visualize // Sets the backlight color to the target color bool backlight_keyframe_set_color(keyframe_animation_t* animation, visualizer_state_t* state); +bool backlight_keyframe_disable(keyframe_animation_t* animation, visualizer_state_t* state); +bool backlight_keyframe_enable(keyframe_animation_t* animation, visualizer_state_t* state); + #endif /* QUANTUM_VISUALIZER_LCD_BACKLIGHT_KEYFRAMES_H_ */ diff --git a/quantum/visualizer/lcd_keyframes.c b/quantum/visualizer/lcd_keyframes.c index 00d9734e6a..74f6e3b470 100644 --- a/quantum/visualizer/lcd_keyframes.c +++ b/quantum/visualizer/lcd_keyframes.c @@ -158,3 +158,17 @@ bool lcd_keyframe_display_layer_and_led_states(keyframe_animation_t* animation, gdispFlush(); return false; } + +bool lcd_keyframe_disable(keyframe_animation_t* animation, visualizer_state_t* state) { + (void)animation; + (void)state; + gdispSetPowerMode(powerOff); + return false; +} + +bool lcd_keyframe_enable(keyframe_animation_t* animation, visualizer_state_t* state) { + (void)animation; + (void)state; + gdispSetPowerMode(powerOn); + return false; +} diff --git a/quantum/visualizer/lcd_keyframes.h b/quantum/visualizer/lcd_keyframes.h index 0c9f39ab8c..8f79a541c8 100644 --- a/quantum/visualizer/lcd_keyframes.h +++ b/quantum/visualizer/lcd_keyframes.h @@ -30,4 +30,8 @@ bool lcd_keyframe_display_led_states(keyframe_animation_t* animation, visualizer // Displays both the layer text and the led states bool lcd_keyframe_display_layer_and_led_states(keyframe_animation_t* animation, visualizer_state_t* state); +bool lcd_keyframe_disable(keyframe_animation_t* animation, visualizer_state_t* state); +bool lcd_keyframe_enable(keyframe_animation_t* animation, visualizer_state_t* state); + + #endif /* QUANTUM_VISUALIZER_LCD_KEYFRAMES_H_ */ diff --git a/quantum/visualizer/visualizer.c b/quantum/visualizer/visualizer.c index 6ebd806e40..98cd7ba554 100644 --- a/quantum/visualizer/visualizer.c +++ b/quantum/visualizer/visualizer.c @@ -228,27 +228,6 @@ bool keyframe_no_operation(keyframe_animation_t* animation, visualizer_state_t* return false; } -bool keyframe_disable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state) { - (void)animation; - (void)state; -#ifdef LCD_ENABLE - gdispSetPowerMode(powerOff); -#endif -#ifdef LCD_BACKLIGHT_ENABLE - lcd_backlight_hal_color(0, 0, 0); -#endif - return false; -} - -bool keyframe_enable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state) { - (void)animation; - (void)state; -#ifdef LCD_ENABLE - gdispSetPowerMode(powerOn); -#endif - return false; -} - bool enable_visualization(keyframe_animation_t* animation, visualizer_state_t* state) { (void)animation; (void)state; diff --git a/quantum/visualizer/visualizer.h b/quantum/visualizer/visualizer.h index 5c870dbfe9..f37ce8416e 100644 --- a/quantum/visualizer/visualizer.h +++ b/quantum/visualizer/visualizer.h @@ -130,9 +130,6 @@ void run_next_keyframe(keyframe_animation_t* animation, visualizer_state_t* stat // Does nothing, useful for adding delays bool keyframe_no_operation(keyframe_animation_t* animation, visualizer_state_t* state); -bool keyframe_disable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state); -bool keyframe_enable_lcd_and_backlight(keyframe_animation_t* animation, visualizer_state_t* state); - // Call this once, when the initial animation has finished, alternatively you can call it // directly from the initalize_user_visualizer function (the animation can be null) bool enable_visualization(keyframe_animation_t* animation, visualizer_state_t* state); From 64d63ab42281318d891434fbc00277043298dd70 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Wed, 5 Apr 2017 10:08:25 +0300 Subject: [PATCH 103/117] Remove the need to manually enable the visualizer --- keyboards/ergodox/infinity/visualizer.c | 6 ++-- .../ergodox/keymaps/default/visualizer.c | 6 ++-- quantum/visualizer/visualizer.c | 28 ++++++++++--------- quantum/visualizer/visualizer.h | 14 ++++++---- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/keyboards/ergodox/infinity/visualizer.c b/keyboards/ergodox/infinity/visualizer.c index 8e684d9919..0897ea348b 100644 --- a/keyboards/ergodox/infinity/visualizer.c +++ b/keyboards/ergodox/infinity/visualizer.c @@ -136,13 +136,12 @@ bool display_logo(keyframe_animation_t* animation, visualizer_state_t* state) { // Don't worry, if the startup animation is long, you can use the keyboard like normal // during that time static keyframe_animation_t startup_animation = { - .num_frames = 3, + .num_frames = 2, .loop = false, .frame_lengths = {0, gfxMillisecondsToTicks(10000), 0}, .frame_functions = { display_logo, backlight_keyframe_animate_color, - enable_visualization }, }; @@ -198,7 +197,7 @@ static keyframe_animation_t suspend_animation = { }; static keyframe_animation_t resume_animation = { - .num_frames = 5, + .num_frames = 4, .loop = false, .frame_lengths = {0, 0, 0, gfxMillisecondsToTicks(10000), 0}, .frame_functions = { @@ -206,7 +205,6 @@ static keyframe_animation_t resume_animation = { backlight_keyframe_enable, display_logo, backlight_keyframe_animate_color, - enable_visualization, }, }; diff --git a/keyboards/ergodox/keymaps/default/visualizer.c b/keyboards/ergodox/keymaps/default/visualizer.c index 5ee49c9bc2..73d864c646 100644 --- a/keyboards/ergodox/keymaps/default/visualizer.c +++ b/keyboards/ergodox/keymaps/default/visualizer.c @@ -110,13 +110,12 @@ bool display_logo(keyframe_animation_t* animation, visualizer_state_t* state) { // Don't worry, if the startup animation is long, you can use the keyboard like normal // during that time static keyframe_animation_t startup_animation = { - .num_frames = 3, + .num_frames = 2, .loop = false, .frame_lengths = {0, gfxMillisecondsToTicks(10000), 0}, .frame_functions = { display_logo, backlight_keyframe_animate_color, - enable_visualization }, }; @@ -140,7 +139,7 @@ static keyframe_animation_t suspend_animation = { }; static keyframe_animation_t resume_animation = { - .num_frames = 5, + .num_frames = 4, .loop = false, .frame_lengths = {0, 0, 0, gfxMillisecondsToTicks(10000), 0}, .frame_functions = { @@ -148,7 +147,6 @@ static keyframe_animation_t resume_animation = { backlight_keyframe_enable, display_logo, backlight_keyframe_animate_color, - enable_visualization, }, }; diff --git a/quantum/visualizer/visualizer.c b/quantum/visualizer/visualizer.c index 98cd7ba554..5fbd12031e 100644 --- a/quantum/visualizer/visualizer.c +++ b/quantum/visualizer/visualizer.c @@ -154,6 +154,14 @@ void stop_all_keyframe_animations(void) { } } +static uint8_t get_num_running_animations(void) { + uint8_t count = 0; + for (int i=0;icurrent_frame, @@ -228,14 +236,6 @@ bool keyframe_no_operation(keyframe_animation_t* animation, visualizer_state_t* return false; } -bool enable_visualization(keyframe_animation_t* animation, visualizer_state_t* state) { - (void)animation; - (void)state; - dprint("User visualizer inited\n"); - visualizer_enabled = true; - return false; -} - // TODO: Optimize the stack size, this is probably way too big static DECLARE_THREAD_STACK(visualizerThreadStack, 1024); static DECLARE_THREAD_FUNCTION(visualizerThread, arg) { @@ -276,13 +276,15 @@ static DECLARE_THREAD_FUNCTION(visualizerThread, arg) { systemticks_t sleep_time = TIME_INFINITE; systemticks_t current_time = gfxSystemTicks(); + bool force_update = true; while(true) { systemticks_t new_time = gfxSystemTicks(); systemticks_t delta = new_time - current_time; current_time = new_time; bool enabled = visualizer_enabled; - if (!same_status(&state.status, ¤t_status)) { + if (force_update || !same_status(&state.status, ¤t_status)) { + force_update = false; if (visualizer_enabled) { if (current_status.suspended) { stop_all_keyframe_animations(); @@ -320,10 +322,10 @@ static DECLARE_THREAD_FUNCTION(visualizerThread, arg) { #ifdef EMULATOR draw_emulator(); #endif - // The animation can enable the visualizer - // And we might need to update the state when that happens - // so don't sleep - if (enabled != visualizer_enabled) { + // Enable the visualizer when the startup or the suspend animation has finished + if (!visualizer_enabled && state.status.suspended == false && get_num_running_animations() == 0) { + visualizer_enabled = true; + force_update = true; sleep_time = 0; } diff --git a/quantum/visualizer/visualizer.h b/quantum/visualizer/visualizer.h index f37ce8416e..4639348492 100644 --- a/quantum/visualizer/visualizer.h +++ b/quantum/visualizer/visualizer.h @@ -130,20 +130,22 @@ void run_next_keyframe(keyframe_animation_t* animation, visualizer_state_t* stat // Does nothing, useful for adding delays bool keyframe_no_operation(keyframe_animation_t* animation, visualizer_state_t* state); -// Call this once, when the initial animation has finished, alternatively you can call it -// directly from the initalize_user_visualizer function (the animation can be null) -bool enable_visualization(keyframe_animation_t* animation, visualizer_state_t* state); - // The master can set userdata which will be transferred to the slave #ifdef VISUALIZER_USER_DATA_SIZE void visualizer_set_user_data(void* user_data); #endif // These functions have to be implemented by the user -void initialize_user_visualizer(visualizer_state_t* state); +// Called regularly each time the state has changed (but not every scan loop) void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status); +// Called when the computer goes to suspend, will also stop calling update_user_visualizer_state void user_visualizer_suspend(visualizer_state_t* state); +// You have to start at least one animation as a response to the following two functions +// When the animation has finished the visualizer will resume normal operation and start calling the +// update_user_visualizer_state again +// Called when the keyboard boots up +void initialize_user_visualizer(visualizer_state_t* state); +// Called when the computer resumes from a suspend void user_visualizer_resume(visualizer_state_t* state); - #endif /* VISUALIZER_H */ From b7041d06aef4dcf2f2a47504a699e538cfb1d9ac Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Wed, 5 Apr 2017 10:14:24 +0300 Subject: [PATCH 104/117] Move common visualizer keyframes into visualizer_keyframes.h --- keyboards/ergodox/infinity/visualizer.c | 1 + .../ergodox/keymaps/default/visualizer.c | 1 + quantum/visualizer/visualizer.c | 6 ----- quantum/visualizer/visualizer.h | 6 +---- quantum/visualizer/visualizer.mk | 3 ++- quantum/visualizer/visualizer_keyframes.c | 23 ++++++++++++++++ quantum/visualizer/visualizer_keyframes.h | 26 +++++++++++++++++++ 7 files changed, 54 insertions(+), 12 deletions(-) create mode 100644 quantum/visualizer/visualizer_keyframes.c create mode 100644 quantum/visualizer/visualizer_keyframes.h diff --git a/keyboards/ergodox/infinity/visualizer.c b/keyboards/ergodox/infinity/visualizer.c index 0897ea348b..2e10fdd709 100644 --- a/keyboards/ergodox/infinity/visualizer.c +++ b/keyboards/ergodox/infinity/visualizer.c @@ -27,6 +27,7 @@ along with this program. If not, see . #endif #include "visualizer.h" +#include "visualizer_keyframes.h" #include "lcd_keyframes.h" #include "lcd_backlight_keyframes.h" #include "system/serial_link.h" diff --git a/keyboards/ergodox/keymaps/default/visualizer.c b/keyboards/ergodox/keymaps/default/visualizer.c index 73d864c646..f6159e1ef1 100644 --- a/keyboards/ergodox/keymaps/default/visualizer.c +++ b/keyboards/ergodox/keymaps/default/visualizer.c @@ -27,6 +27,7 @@ along with this program. If not, see . #endif #include "visualizer.h" +#include "visualizer_keyframes.h" #include "lcd_keyframes.h" #include "lcd_backlight_keyframes.h" #include "system/serial_link.h" diff --git a/quantum/visualizer/visualizer.c b/quantum/visualizer/visualizer.c index 5fbd12031e..2479a64c7f 100644 --- a/quantum/visualizer/visualizer.c +++ b/quantum/visualizer/visualizer.c @@ -230,12 +230,6 @@ void run_next_keyframe(keyframe_animation_t* animation, visualizer_state_t* stat (*temp_animation.frame_functions[next_frame])(&temp_animation, &temp_state); } -bool keyframe_no_operation(keyframe_animation_t* animation, visualizer_state_t* state) { - (void)animation; - (void)state; - return false; -} - // TODO: Optimize the stack size, this is probably way too big static DECLARE_THREAD_STACK(visualizerThreadStack, 1024); static DECLARE_THREAD_FUNCTION(visualizerThread, arg) { diff --git a/quantum/visualizer/visualizer.h b/quantum/visualizer/visualizer.h index 4639348492..d6f279e101 100644 --- a/quantum/visualizer/visualizer.h +++ b/quantum/visualizer/visualizer.h @@ -34,7 +34,7 @@ SOFTWARE. #include "lcd_backlight.h" #endif -// use this function to merget both real_mods and oneshot_mods in a uint16_t +// use this function to merge both real_mods and oneshot_mods in a uint16_t uint8_t visualizer_get_mods(void); // This need to be called once at the start @@ -126,10 +126,6 @@ void stop_keyframe_animation(keyframe_animation_t* animation); // Useful for crossfades for example void run_next_keyframe(keyframe_animation_t* animation, visualizer_state_t* state); -// Some predefined keyframe functions that can be used by the user code -// Does nothing, useful for adding delays -bool keyframe_no_operation(keyframe_animation_t* animation, visualizer_state_t* state); - // The master can set userdata which will be transferred to the slave #ifdef VISUALIZER_USER_DATA_SIZE void visualizer_set_user_data(void* user_data); diff --git a/quantum/visualizer/visualizer.mk b/quantum/visualizer/visualizer.mk index c9eb8c5bbd..799379e3d6 100644 --- a/quantum/visualizer/visualizer.mk +++ b/quantum/visualizer/visualizer.mk @@ -20,7 +20,8 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -SRC += $(VISUALIZER_DIR)/visualizer.c +SRC += $(VISUALIZER_DIR)/visualizer.c \ + $(VISUALIZER_DIR)/visualizer_keyframes.c EXTRAINCDIRS += $(GFXINC) $(VISUALIZER_DIR) GFXLIB = $(LIB_PATH)/ugfx VPATH += $(VISUALIZER_PATH) diff --git a/quantum/visualizer/visualizer_keyframes.c b/quantum/visualizer/visualizer_keyframes.c new file mode 100644 index 0000000000..8f6a7e15a4 --- /dev/null +++ b/quantum/visualizer/visualizer_keyframes.c @@ -0,0 +1,23 @@ +/* Copyright 2017 Fred Sundvik + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "visualizer_keyframes.h" + +bool keyframe_no_operation(keyframe_animation_t* animation, visualizer_state_t* state) { + (void)animation; + (void)state; + return false; +} diff --git a/quantum/visualizer/visualizer_keyframes.h b/quantum/visualizer/visualizer_keyframes.h new file mode 100644 index 0000000000..9ef7653c5e --- /dev/null +++ b/quantum/visualizer/visualizer_keyframes.h @@ -0,0 +1,26 @@ +/* Copyright 2017 Fred Sundvik + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef QUANTUM_VISUALIZER_VISUALIZER_KEYFRAMES_H_ +#define QUANTUM_VISUALIZER_VISUALIZER_KEYFRAMES_H_ + +#include "visualizer.h" + +// Some predefined keyframe functions that can be used by the user code +// Does nothing, useful for adding delays +bool keyframe_no_operation(keyframe_animation_t* animation, visualizer_state_t* state); + +#endif /* QUANTUM_VISUALIZER_VISUALIZER_KEYFRAMES_H_ */ From 3994fb1e79615af849aa03378293831f59c9b259 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Fri, 7 Apr 2017 10:51:53 +0300 Subject: [PATCH 105/117] Yet another try to fix the LCD corruption It turns out that the ChibiOS K20 SPI driver doesn't handle the chip select, so it needs to be done manually. Acquiring the bus is not enough since the pin was in the wrong mode. This is now fixed. Also increase the frequency of the SPI from around 200kHz to nearly 20 Mhz. --- .../gdisp/st7565ergodox/board_ST7565.h | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/board_ST7565.h b/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/board_ST7565.h index c2092b5e8d..e8c17e6e33 100644 --- a/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/board_ST7565.h +++ b/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/board_ST7565.h @@ -45,15 +45,28 @@ static const SPIConfig spi1config = { .sspad=ST7565_SS_PIN, // SPI initialization data. .tar0 = - SPIx_CTARn_FMSZ(7) - | SPIx_CTARn_ASC(7) - | SPIx_CTARn_DT(7) - | SPIx_CTARn_CSSCK(7) - | SPIx_CTARn_PBR(0) - | SPIx_CTARn_BR(7) - //SPI_CR1_BR_0 + SPIx_CTARn_FMSZ(7) // Frame size = 8 bytes + | SPIx_CTARn_ASC(1) // After SCK Delay Scaler (min 50 ns) = 55.56ns + | SPIx_CTARn_DT(0) // Delay After Transfer Scaler (no minimum)= 27.78ns + | SPIx_CTARn_CSSCK(0) // PCS to SCK Delay Scaler (min 20 ns) = 27.78ns + | SPIx_CTARn_PBR(0) // Baud Rate Prescaler = 2 + | SPIx_CTARn_BR(0) // Baud rate (min 50ns) = 55.56ns }; +static GFXINLINE void acquire_bus(GDisplay *g) { + (void) g; + // Only the LCD is using the SPI bus, so no need to acquire + // spiAcquireBus(&SPID1); + spiSelect(&SPID1); +} + +static GFXINLINE void release_bus(GDisplay *g) { + (void) g; + // Only the LCD is using the SPI bus, so no need to release + //spiReleaseBus(&SPID1); + spiUnselect(&SPID1); +} + static GFXINLINE void init_board(GDisplay *g) { (void) g; palSetPadModeNamed(A0, PAL_MODE_OUTPUT_PUSHPULL); @@ -62,10 +75,11 @@ static GFXINLINE void init_board(GDisplay *g) { palSetPad(ST7565_GPIOPORT, ST7565_RST_PIN); palSetPadModeRaw(MOSI, ST7565_SPI_MODE); palSetPadModeRaw(SLCK, ST7565_SPI_MODE); - palSetPadModeRaw(SS, ST7565_SPI_MODE); + palSetPadModeRaw(SS, PAL_MODE_OUTPUT_PUSHPULL); spiInit(); spiStart(&SPID1, &spi1config); + release_bus(g); } static GFXINLINE void post_init_board(GDisplay *g) { @@ -82,20 +96,6 @@ static GFXINLINE void setpin_reset(GDisplay *g, bool_t state) { } } -static GFXINLINE void acquire_bus(GDisplay *g) { - (void) g; - // Only the LCD is using the SPI bus, so no need to acquire - // spiAcquireBus(&SPID1); - spiSelect(&SPID1); -} - -static GFXINLINE void release_bus(GDisplay *g) { - (void) g; - // Only the LCD is using the SPI bus, so no need to release - //spiReleaseBus(&SPID1); - spiUnselect(&SPID1); -} - static GFXINLINE void enter_data_mode(GDisplay *g) { palSetPad(ST7565_GPIOPORT, ST7565_A0_PIN); } From 995002fa912545128625ec2d8c53cff5de560b97 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Fri, 7 Apr 2017 10:55:29 +0300 Subject: [PATCH 106/117] LCD initialization sequence according to the docs The LCD initialization show now be much better and faster with no flickering at the startup. Also fix the contrast control. --- .../gdisp/st7565ergodox/gdisp_lld_ST7565.c | 40 +++++-------------- .../drivers/gdisp/st7565ergodox/st7565.h | 2 + 2 files changed, 13 insertions(+), 29 deletions(-) diff --git a/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/gdisp_lld_ST7565.c b/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/gdisp_lld_ST7565.c index 2c8a168e76..0de457a7ae 100644 --- a/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/gdisp_lld_ST7565.c +++ b/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/gdisp_lld_ST7565.c @@ -26,7 +26,7 @@ #define GDISP_SCREEN_WIDTH 128 #endif #ifndef GDISP_INITIAL_CONTRAST -#define GDISP_INITIAL_CONTRAST 0 +#define GDISP_INITIAL_CONTRAST 35 #endif #ifndef GDISP_INITIAL_BACKLIGHT #define GDISP_INITIAL_BACKLIGHT 100 @@ -111,41 +111,25 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) { gfxSleepMilliseconds(20); setpin_reset(g, FALSE); gfxSleepMilliseconds(20); - acquire_bus(g); enter_cmd_mode(g); - write_cmd(g, ST7565_DISPLAY_OFF); + + write_cmd(g, ST7565_RESET); write_cmd(g, ST7565_LCD_BIAS); write_cmd(g, ST7565_ADC); write_cmd(g, ST7565_COM_SCAN); - write_cmd(g, ST7565_START_LINE | 0); + write_cmd(g, ST7565_RESISTOR_RATIO | 0x1); + write_cmd2(g, ST7565_CONTRAST, GDISP_INITIAL_CONTRAST); - write_cmd(g, ST7565_RESISTOR_RATIO | 0x6); - - // turn on voltage converter (VC=1, VR=0, VF=0) - write_cmd(g, ST7565_POWER_CONTROL | 0x04); - flush_cmd(g); - delay_ms(50); - - // turn on voltage regulator (VC=1, VR=1, VF=0) - write_cmd(g, ST7565_POWER_CONTROL | 0x06); - flush_cmd(g); - delay_ms(50); - - // turn on voltage follower (VC=1, VR=1, VF=1) + // turn on internal power supply (VC=1, VR=1, VF=1) write_cmd(g, ST7565_POWER_CONTROL | 0x07); - flush_cmd(g); - delay_ms(50); - write_cmd(g, 0xE2); - write_cmd(g, ST7565_COM_SCAN); - write_cmd2(g, ST7565_CONTRAST, GDISP_INITIAL_CONTRAST*64/101); - //write_cmd2(g, ST7565_CONTRAST, 0); - write_cmd(g, ST7565_DISPLAY_ON); - write_cmd(g, ST7565_ALLON_NORMAL); write_cmd(g, ST7565_INVERT_DISPLAY); + write_cmd(g, ST7565_ALLON_NORMAL); + write_cmd(g, ST7565_DISPLAY_ON); + write_cmd(g, ST7565_START_LINE | 0); write_cmd(g, ST7565_RMW); flush_cmd(g); @@ -331,14 +315,12 @@ LLDSPEC void gdisp_lld_control(GDisplay *g) { return; case GDISP_CONTROL_CONTRAST: - if ((unsigned)g->p.ptr > 100) - g->p.ptr = (void *)100; + g->g.Contrast = (unsigned)g->p.ptr & 63; acquire_bus(g); enter_cmd_mode(g); - write_cmd2(g, ST7565_CONTRAST, ((((unsigned)g->p.ptr)<<6)/101) & 0x3F); + write_cmd2(g, ST7565_CONTRAST, g->g.Contrast); flush_cmd(g); release_bus(g); - g->g.Contrast = (unsigned)g->p.ptr; return; } } diff --git a/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/st7565.h b/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/st7565.h index 48636b33d6..24924ff050 100644 --- a/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/st7565.h +++ b/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/st7565.h @@ -34,4 +34,6 @@ #define ST7565_RESISTOR_RATIO 0x20 #define ST7565_POWER_CONTROL 0x28 +#define ST7565_RESET 0xE2 + #endif /* _ST7565_H */ From 3eb8785e8770c07e6a4280c50240d5d951461911 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sat, 8 Apr 2017 20:10:20 +0300 Subject: [PATCH 107/117] Add automatic flush for the LCD screen --- .../infinity/drivers/gdisp/st7565ergodox/gdisp_lld_ST7565.c | 1 + keyboards/ergodox/infinity/visualizer.c | 2 -- keyboards/ergodox/keymaps/default/visualizer.c | 2 -- quantum/visualizer/lcd_keyframes.c | 5 ----- quantum/visualizer/visualizer.c | 4 ++++ 5 files changed, 5 insertions(+), 9 deletions(-) diff --git a/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/gdisp_lld_ST7565.c b/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/gdisp_lld_ST7565.c index 0de457a7ae..5b7b6d44c4 100644 --- a/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/gdisp_lld_ST7565.c +++ b/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/gdisp_lld_ST7565.c @@ -262,6 +262,7 @@ LLDSPEC void gdisp_lld_blit_area(GDisplay *g) { srcbit++; } } + g->flags |= GDISP_FLG_NEEDFLUSH; } #if GDISP_NEED_CONTROL && GDISP_HARDWARE_CONTROL diff --git a/keyboards/ergodox/infinity/visualizer.c b/keyboards/ergodox/infinity/visualizer.c index 2e10fdd709..6f9b0210a7 100644 --- a/keyboards/ergodox/infinity/visualizer.c +++ b/keyboards/ergodox/infinity/visualizer.c @@ -127,8 +127,6 @@ bool display_logo(keyframe_animation_t* animation, visualizer_state_t* state) { // if you have full screen image, then just use 128 and 32 for both source and target dimensions gdispGBlitArea(GDISP, 0, 0, 128, 32, 0, 0, 128, (pixel_t*)image_data_lcd_logo); - // Always remember to flush the display - gdispFlush(); return false; } diff --git a/keyboards/ergodox/keymaps/default/visualizer.c b/keyboards/ergodox/keymaps/default/visualizer.c index f6159e1ef1..1b0f12f250 100644 --- a/keyboards/ergodox/keymaps/default/visualizer.c +++ b/keyboards/ergodox/keymaps/default/visualizer.c @@ -101,8 +101,6 @@ bool display_logo(keyframe_animation_t* animation, visualizer_state_t* state) { // if you have full screen image, then just use 128 and 32 for both source and target dimensions gdispGBlitArea(GDISP, 0, 0, 128, 32, 0, 0, 128, (pixel_t*)image_data_lcd_logo); - // Always remember to flush the display - gdispFlush(); return false; } diff --git a/quantum/visualizer/lcd_keyframes.c b/quantum/visualizer/lcd_keyframes.c index 74f6e3b470..c6e04d0ca4 100644 --- a/quantum/visualizer/lcd_keyframes.c +++ b/quantum/visualizer/lcd_keyframes.c @@ -23,7 +23,6 @@ bool lcd_keyframe_display_layer_text(keyframe_animation_t* animation, visualizer (void)animation; gdispClear(White); gdispDrawString(0, 10, state->layer_text, state->font_dejavusansbold12, Black); - gdispFlush(); return false; } @@ -62,7 +61,6 @@ bool lcd_keyframe_display_layer_bitmap(keyframe_animation_t* animation, visualiz gdispDrawString(0, 10, layer_buffer, state->font_fixed5x8, Black); format_layer_bitmap_string(state->status.default_layer >> 16, state->status.layer >> 16, layer_buffer); gdispDrawString(0, 20, layer_buffer, state->font_fixed5x8, Black); - gdispFlush(); return false; } @@ -101,7 +99,6 @@ bool lcd_keyframe_display_mods_bitmap(keyframe_animation_t* animation, visualize format_mods_bitmap_string(state->status.mods, status_buffer); gdispDrawString(0, 20, status_buffer, state->font_fixed5x8, Black); - gdispFlush(); return false; } @@ -140,7 +137,6 @@ bool lcd_keyframe_display_led_states(keyframe_animation_t* animation, visualizer get_led_state_string(output, state); gdispClear(White); gdispDrawString(0, 10, output, state->font_dejavusansbold12, Black); - gdispFlush(); return false; } @@ -155,7 +151,6 @@ bool lcd_keyframe_display_layer_and_led_states(keyframe_animation_t* animation, y = 17; } gdispDrawString(0, y, state->layer_text, state->font_dejavusansbold12, Black); - gdispFlush(); return false; } diff --git a/quantum/visualizer/visualizer.c b/quantum/visualizer/visualizer.c index 2479a64c7f..6f134097f0 100644 --- a/quantum/visualizer/visualizer.c +++ b/quantum/visualizer/visualizer.c @@ -313,6 +313,10 @@ static DECLARE_THREAD_FUNCTION(visualizerThread, arg) { gdispGFlush(LED_DISPLAY); #endif +#ifdef LCD_ENABLE + gdispGFlush(LCD_DISPLAY); +#endif + #ifdef EMULATOR draw_emulator(); #endif From df67169d4260881443d88b142855d4aa2def6dc3 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sat, 8 Apr 2017 21:19:44 +0300 Subject: [PATCH 108/117] Move LCD logo to visualizer resources --- keyboards/ergodox/infinity/visualizer.c | 44 +------------ .../ergodox/keymaps/default/visualizer.c | 44 +------------ quantum/visualizer/resources/lcd_logo.c | 61 ++++++++++++++++++ .../visualizer/resources}/lcd_logo.png | Bin quantum/visualizer/resources/resources.h | 27 ++++++++ quantum/visualizer/visualizer.mk | 2 + 6 files changed, 94 insertions(+), 84 deletions(-) create mode 100644 quantum/visualizer/resources/lcd_logo.c rename {keyboards/ergodox/infinity => quantum/visualizer/resources}/lcd_logo.png (100%) create mode 100644 quantum/visualizer/resources/resources.h diff --git a/keyboards/ergodox/infinity/visualizer.c b/keyboards/ergodox/infinity/visualizer.c index 6f9b0210a7..90933b00a4 100644 --- a/keyboards/ergodox/infinity/visualizer.c +++ b/keyboards/ergodox/infinity/visualizer.c @@ -32,47 +32,7 @@ along with this program. If not, see . #include "lcd_backlight_keyframes.h" #include "system/serial_link.h" -// To generate an image array like this -// Ensure the image is 128 x 32 or smaller -// Convert the bitmap to a C array using a program like http://www.riuson.com/lcd-image-converter/ -// Ensure the the conversion process produces a monochrome format array - 1 bit/pixel, left to right, top to bottom -// Update array in the source code with the C array produced by the conversion program - -// The image below is generated from lcd_logo.png -static const uint8_t image_data_lcd_logo[512] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xf8, 0xfe, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x38, 0x38, 0x06, 0x29, 0x41, 0x24, 0x52, 0x24, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x38, 0x38, 0x09, 0x55, 0x42, 0xaa, 0xaa, 0xaa, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x38, 0x38, 0x09, 0x55, 0x82, 0x28, 0xaa, 0xae, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x38, 0x38, 0x09, 0x55, 0x43, 0x28, 0xaa, 0xaa, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x38, 0x38, 0x0a, 0x55, 0x42, 0x28, 0xaa, 0xaa, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x38, 0x38, 0x05, 0x45, 0x42, 0x28, 0x89, 0x4a, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x38, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1c, 0x38, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0e, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x03, 0xff, 0x80, 0x04, 0x45, 0x14, 0xa4, 0x92, 0x83, 0x52, 0x22, 0x22, 0x36, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xba, 0x84, 0x55, 0x55, 0x57, 0x45, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x00, 0x08, 0xaa, 0xaa, 0xaa, 0x92, 0xb2, 0x55, 0x55, 0x42, 0x65, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x00, 0x08, 0xaa, 0xaa, 0xaa, 0x92, 0x81, 0x56, 0x65, 0x42, 0x45, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0x92, 0x81, 0x54, 0x45, 0x42, 0x45, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x00, 0x04, 0x48, 0xa2, 0x4a, 0x89, 0x06, 0x24, 0x42, 0x41, 0x36, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; +#include "resources/resources.h" static const uint32_t logo_background_color = LCD_COLOR(0x00, 0x00, 0xFF); static const uint32_t initial_color = LCD_COLOR(0, 0, 0); @@ -125,7 +85,7 @@ bool display_logo(keyframe_animation_t* animation, visualizer_state_t* state) { //gdispGBlitArea is a tricky function to use since it supports blitting part of the image // if you have full screen image, then just use 128 and 32 for both source and target dimensions - gdispGBlitArea(GDISP, 0, 0, 128, 32, 0, 0, 128, (pixel_t*)image_data_lcd_logo); + gdispGBlitArea(GDISP, 0, 0, 128, 32, 0, 0, 128, (pixel_t*)resource_lcd_logo); return false; } diff --git a/keyboards/ergodox/keymaps/default/visualizer.c b/keyboards/ergodox/keymaps/default/visualizer.c index 1b0f12f250..f03702f602 100644 --- a/keyboards/ergodox/keymaps/default/visualizer.c +++ b/keyboards/ergodox/keymaps/default/visualizer.c @@ -33,47 +33,7 @@ along with this program. If not, see . #include "system/serial_link.h" #include "led.h" -// To generate an image array like this -// Ensure the image is 128 x 32 or smaller -// Convert the bitmap to a C array using a program like http://www.riuson.com/lcd-image-converter/ -// Ensure the the conversion process produces a monochrome format array - 1 bit/pixel, left to right, top to bottom -// Update array in the source code with the C array produced by the conversion program - -// The image below is generated from lcd_logo.png -static const uint8_t image_data_lcd_logo[512] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xf8, 0xfe, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x38, 0x38, 0x06, 0x29, 0x41, 0x24, 0x52, 0x24, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x38, 0x38, 0x09, 0x55, 0x42, 0xaa, 0xaa, 0xaa, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x38, 0x38, 0x09, 0x55, 0x82, 0x28, 0xaa, 0xae, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x38, 0x38, 0x09, 0x55, 0x43, 0x28, 0xaa, 0xaa, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x38, 0x38, 0x0a, 0x55, 0x42, 0x28, 0xaa, 0xaa, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x38, 0x38, 0x05, 0x45, 0x42, 0x28, 0x89, 0x4a, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x38, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1c, 0x38, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0e, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x03, 0xff, 0x80, 0x04, 0x45, 0x14, 0xa4, 0x92, 0x83, 0x52, 0x22, 0x22, 0x36, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xba, 0x84, 0x55, 0x55, 0x57, 0x45, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x00, 0x08, 0xaa, 0xaa, 0xaa, 0x92, 0xb2, 0x55, 0x55, 0x42, 0x65, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x00, 0x08, 0xaa, 0xaa, 0xaa, 0x92, 0x81, 0x56, 0x65, 0x42, 0x45, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0x92, 0x81, 0x54, 0x45, 0x42, 0x45, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x00, 0x04, 0x48, 0xa2, 0x4a, 0x89, 0x06, 0x24, 0x42, 0x41, 0x36, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; +#include "resources/resources.h" static const uint32_t logo_background_color = LCD_COLOR(0x00, 0x00, 0xFF); static const uint32_t initial_color = LCD_COLOR(0, 0, 0); @@ -99,7 +59,7 @@ bool display_logo(keyframe_animation_t* animation, visualizer_state_t* state) { //gdispGBlitArea is a tricky function to use since it supports blitting part of the image // if you have full screen image, then just use 128 and 32 for both source and target dimensions - gdispGBlitArea(GDISP, 0, 0, 128, 32, 0, 0, 128, (pixel_t*)image_data_lcd_logo); + gdispGBlitArea(GDISP, 0, 0, 128, 32, 0, 0, 128, (pixel_t*)resource_lcd_logo); return false; } diff --git a/quantum/visualizer/resources/lcd_logo.c b/quantum/visualizer/resources/lcd_logo.c new file mode 100644 index 0000000000..d1a0ffa7f9 --- /dev/null +++ b/quantum/visualizer/resources/lcd_logo.c @@ -0,0 +1,61 @@ +/* Copyright 2017 Fred Sundvik + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "resources.h" + + +// To generate an image array like this +// Ensure the image is 128 x 32 or smaller +// Convert the bitmap to a C array using a program like http://www.riuson.com/lcd-image-converter/ +// Ensure the the conversion process produces a monochrome format array - 1 bit/pixel, left to right, top to bottom +// Update array in the source code with the C array produced by the conversion program + +// The image below is generated from lcd_logo.png +const uint8_t resource_lcd_logo[512] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0xfe, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x38, 0x38, 0x06, 0x29, 0x41, 0x24, 0x52, 0x24, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x38, 0x38, 0x09, 0x55, 0x42, 0xaa, 0xaa, 0xaa, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x38, 0x38, 0x09, 0x55, 0x82, 0x28, 0xaa, 0xae, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x38, 0x38, 0x09, 0x55, 0x43, 0x28, 0xaa, 0xaa, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x38, 0x38, 0x0a, 0x55, 0x42, 0x28, 0xaa, 0xaa, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x38, 0x38, 0x05, 0x45, 0x42, 0x28, 0x89, 0x4a, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x38, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x38, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0xff, 0x80, 0x04, 0x45, 0x14, 0xa4, 0x92, 0x83, 0x52, 0x22, 0x22, 0x36, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xba, 0x84, 0x55, 0x55, 0x57, 0x45, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x00, 0x08, 0xaa, 0xaa, 0xaa, 0x92, 0xb2, 0x55, 0x55, 0x42, 0x65, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x00, 0x08, 0xaa, 0xaa, 0xaa, 0x92, 0x81, 0x56, 0x65, 0x42, 0x45, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0x92, 0x81, 0x54, 0x45, 0x42, 0x45, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x00, 0x04, 0x48, 0xa2, 0x4a, 0x89, 0x06, 0x24, 0x42, 0x41, 0x36, 0x00, 0x00, + 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + diff --git a/keyboards/ergodox/infinity/lcd_logo.png b/quantum/visualizer/resources/lcd_logo.png similarity index 100% rename from keyboards/ergodox/infinity/lcd_logo.png rename to quantum/visualizer/resources/lcd_logo.png diff --git a/quantum/visualizer/resources/resources.h b/quantum/visualizer/resources/resources.h new file mode 100644 index 0000000000..1ea27a5364 --- /dev/null +++ b/quantum/visualizer/resources/resources.h @@ -0,0 +1,27 @@ +/* Copyright 2017 Fred Sundvik + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef QUANTUM_VISUALIZER_RESOURCES_RESOURCES_H_ +#define QUANTUM_VISUALIZER_RESOURCES_RESOURCES_H_ + +#include + +#ifdef LCD_ENABLE +extern const uint8_t resource_lcd_logo[]; +#endif + + +#endif /* QUANTUM_VISUALIZER_RESOURCES_RESOURCES_H_ */ diff --git a/quantum/visualizer/visualizer.mk b/quantum/visualizer/visualizer.mk index 799379e3d6..7c8e98d67b 100644 --- a/quantum/visualizer/visualizer.mk +++ b/quantum/visualizer/visualizer.mk @@ -37,6 +37,8 @@ ifeq ($(strip $(LCD_ENABLE)), yes) SRC += $(VISUALIZER_DIR)/lcd_backlight.c SRC += $(VISUALIZER_DIR)/lcd_keyframes.c SRC += $(VISUALIZER_DIR)/lcd_backlight_keyframes.c +# Note, that the linker will strip out any resources that are not actually in use +SRC += $(VISUALIZER_DIR)/resources/lcd_logo.c OPT_DEFS += -DLCD_BACKLIGHT_ENABLE endif From 3074269c4a07ff7f1ab2a76ebdb8904cd642e283 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sat, 8 Apr 2017 21:30:11 +0300 Subject: [PATCH 109/117] Move the logo drawing keyframe to lcd_keyframes --- keyboards/ergodox/infinity/visualizer.c | 22 ++----------------- .../ergodox/keymaps/default/visualizer.c | 22 ++----------------- quantum/visualizer/lcd_keyframes.c | 19 ++++++++++++++++ quantum/visualizer/lcd_keyframes.h | 2 ++ 4 files changed, 25 insertions(+), 40 deletions(-) diff --git a/keyboards/ergodox/infinity/visualizer.c b/keyboards/ergodox/infinity/visualizer.c index 90933b00a4..bac85c593c 100644 --- a/keyboards/ergodox/infinity/visualizer.c +++ b/keyboards/ergodox/infinity/visualizer.c @@ -72,24 +72,6 @@ static visualizer_user_data_t user_data_keyboard = { _Static_assert(sizeof(visualizer_user_data_t) <= VISUALIZER_USER_DATA_SIZE, "Please increase the VISUALIZER_USER_DATA_SIZE"); -bool display_logo(keyframe_animation_t* animation, visualizer_state_t* state) { - (void)state; - (void)animation; - (void)state; - // Read the uGFX documentation for information how to use the displays - // http://wiki.ugfx.org/index.php/Main_Page - gdispClear(White); - - // You can use static variables for things that can't be found in the animation - // or state structs, here we use the image - - //gdispGBlitArea is a tricky function to use since it supports blitting part of the image - // if you have full screen image, then just use 128 and 32 for both source and target dimensions - gdispGBlitArea(GDISP, 0, 0, 128, 32, 0, 0, 128, (pixel_t*)resource_lcd_logo); - - return false; -} - // Feel free to modify the animations below, or even add new ones if needed // Don't worry, if the startup animation is long, you can use the keyboard like normal @@ -99,7 +81,7 @@ static keyframe_animation_t startup_animation = { .loop = false, .frame_lengths = {0, gfxMillisecondsToTicks(10000), 0}, .frame_functions = { - display_logo, + lcd_keyframe_draw_logo, backlight_keyframe_animate_color, }, }; @@ -162,7 +144,7 @@ static keyframe_animation_t resume_animation = { .frame_functions = { lcd_keyframe_enable, backlight_keyframe_enable, - display_logo, + lcd_keyframe_draw_logo, backlight_keyframe_animate_color, }, }; diff --git a/keyboards/ergodox/keymaps/default/visualizer.c b/keyboards/ergodox/keymaps/default/visualizer.c index f03702f602..afa6f1bdd7 100644 --- a/keyboards/ergodox/keymaps/default/visualizer.c +++ b/keyboards/ergodox/keymaps/default/visualizer.c @@ -46,24 +46,6 @@ typedef enum { static lcd_state_t lcd_state = LCD_STATE_INITIAL; -bool display_logo(keyframe_animation_t* animation, visualizer_state_t* state) { - (void)state; - (void)animation; - (void)state; - // Read the uGFX documentation for information how to use the displays - // http://wiki.ugfx.org/index.php/Main_Page - gdispClear(White); - - // You can use static variables for things that can't be found in the animation - // or state structs, here we use the image - - //gdispGBlitArea is a tricky function to use since it supports blitting part of the image - // if you have full screen image, then just use 128 and 32 for both source and target dimensions - gdispGBlitArea(GDISP, 0, 0, 128, 32, 0, 0, 128, (pixel_t*)resource_lcd_logo); - - return false; -} - // Feel free to modify the animations below, or even add new ones if needed // Don't worry, if the startup animation is long, you can use the keyboard like normal @@ -73,7 +55,7 @@ static keyframe_animation_t startup_animation = { .loop = false, .frame_lengths = {0, gfxMillisecondsToTicks(10000), 0}, .frame_functions = { - display_logo, + lcd_keyframe_draw_logo, backlight_keyframe_animate_color, }, }; @@ -104,7 +86,7 @@ static keyframe_animation_t resume_animation = { .frame_functions = { lcd_keyframe_enable, backlight_keyframe_enable, - display_logo, + lcd_keyframe_draw_logo, backlight_keyframe_animate_color, }, }; diff --git a/quantum/visualizer/lcd_keyframes.c b/quantum/visualizer/lcd_keyframes.c index c6e04d0ca4..df11861ddc 100644 --- a/quantum/visualizer/lcd_keyframes.c +++ b/quantum/visualizer/lcd_keyframes.c @@ -18,6 +18,7 @@ #include #include "action_util.h" #include "led.h" +#include "resources/resources.h" bool lcd_keyframe_display_layer_text(keyframe_animation_t* animation, visualizer_state_t* state) { (void)animation; @@ -154,6 +155,24 @@ bool lcd_keyframe_display_layer_and_led_states(keyframe_animation_t* animation, return false; } +bool lcd_keyframe_draw_logo(keyframe_animation_t* animation, visualizer_state_t* state) { + (void)state; + (void)animation; + // Read the uGFX documentation for information how to use the displays + // http://wiki.ugfx.org/index.php/Main_Page + gdispClear(White); + + // You can use static variables for things that can't be found in the animation + // or state structs, here we use the image + + //gdispGBlitArea is a tricky function to use since it supports blitting part of the image + // if you have full screen image, then just use 128 and 32 for both source and target dimensions + gdispGBlitArea(GDISP, 0, 0, 128, 32, 0, 0, 128, (pixel_t*)resource_lcd_logo); + + return false; +} + + bool lcd_keyframe_disable(keyframe_animation_t* animation, visualizer_state_t* state) { (void)animation; (void)state; diff --git a/quantum/visualizer/lcd_keyframes.h b/quantum/visualizer/lcd_keyframes.h index 8f79a541c8..2e912b4c73 100644 --- a/quantum/visualizer/lcd_keyframes.h +++ b/quantum/visualizer/lcd_keyframes.h @@ -29,6 +29,8 @@ bool lcd_keyframe_display_mods_bitmap(keyframe_animation_t* animation, visualize bool lcd_keyframe_display_led_states(keyframe_animation_t* animation, visualizer_state_t* state); // Displays both the layer text and the led states bool lcd_keyframe_display_layer_and_led_states(keyframe_animation_t* animation, visualizer_state_t* state); +// Displays the QMK logo on the LCD screen +bool lcd_keyframe_draw_logo(keyframe_animation_t* animation, visualizer_state_t* state); bool lcd_keyframe_disable(keyframe_animation_t* animation, visualizer_state_t* state); bool lcd_keyframe_enable(keyframe_animation_t* animation, visualizer_state_t* state); From ed1710589f2f63e485c8780c7c8c03e0f65136a0 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sat, 8 Apr 2017 21:34:30 +0300 Subject: [PATCH 110/117] Fix suspend not disabling backlight --- keyboards/ergodox/infinity/visualizer.c | 2 +- keyboards/ergodox/keymaps/default/visualizer.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/ergodox/infinity/visualizer.c b/keyboards/ergodox/infinity/visualizer.c index bac85c593c..8c3f3f29fc 100644 --- a/keyboards/ergodox/infinity/visualizer.c +++ b/keyboards/ergodox/infinity/visualizer.c @@ -133,7 +133,7 @@ static keyframe_animation_t suspend_animation = { lcd_keyframe_display_layer_text, backlight_keyframe_animate_color, lcd_keyframe_disable, - lcd_keyframe_disable, + backlight_keyframe_disable, }, }; diff --git a/keyboards/ergodox/keymaps/default/visualizer.c b/keyboards/ergodox/keymaps/default/visualizer.c index afa6f1bdd7..6a7178968b 100644 --- a/keyboards/ergodox/keymaps/default/visualizer.c +++ b/keyboards/ergodox/keymaps/default/visualizer.c @@ -75,7 +75,7 @@ static keyframe_animation_t suspend_animation = { lcd_keyframe_display_layer_text, backlight_keyframe_animate_color, lcd_keyframe_disable, - lcd_keyframe_disable, + backlight_keyframe_disable, }, }; From c6ca996f4eaa4cce90e02c123230e1e655c9465a Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sat, 8 Apr 2017 22:30:37 +0300 Subject: [PATCH 111/117] Combine startup and resume animations --- .../gdisp/st7565ergodox/gdisp_lld_ST7565.c | 3 +-- keyboards/ergodox/infinity/visualizer.c | 20 +++++-------------- quantum/visualizer/lcd_backlight.c | 8 ++++---- 3 files changed, 10 insertions(+), 21 deletions(-) diff --git a/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/gdisp_lld_ST7565.c b/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/gdisp_lld_ST7565.c index 5b7b6d44c4..b04ad02935 100644 --- a/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/gdisp_lld_ST7565.c +++ b/keyboards/ergodox/infinity/drivers/gdisp/st7565ergodox/gdisp_lld_ST7565.c @@ -127,7 +127,6 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) { write_cmd(g, ST7565_INVERT_DISPLAY); write_cmd(g, ST7565_ALLON_NORMAL); - write_cmd(g, ST7565_DISPLAY_ON); write_cmd(g, ST7565_START_LINE | 0); write_cmd(g, ST7565_RMW); @@ -143,7 +142,7 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) { g->g.Width = GDISP_SCREEN_WIDTH; g->g.Height = GDISP_SCREEN_HEIGHT; g->g.Orientation = GDISP_ROTATE_0; - g->g.Powermode = powerOn; + g->g.Powermode = powerOff; g->g.Backlight = GDISP_INITIAL_BACKLIGHT; g->g.Contrast = GDISP_INITIAL_CONTRAST; return TRUE; diff --git a/keyboards/ergodox/infinity/visualizer.c b/keyboards/ergodox/infinity/visualizer.c index 8c3f3f29fc..7ae371c5fc 100644 --- a/keyboards/ergodox/infinity/visualizer.c +++ b/keyboards/ergodox/infinity/visualizer.c @@ -77,10 +77,12 @@ _Static_assert(sizeof(visualizer_user_data_t) <= VISUALIZER_USER_DATA_SIZE, // Don't worry, if the startup animation is long, you can use the keyboard like normal // during that time static keyframe_animation_t startup_animation = { - .num_frames = 2, + .num_frames = 4, .loop = false, - .frame_lengths = {0, gfxMillisecondsToTicks(10000), 0}, + .frame_lengths = {0, 0, 0, gfxMillisecondsToTicks(10000), 0}, .frame_functions = { + lcd_keyframe_enable, + backlight_keyframe_enable, lcd_keyframe_draw_logo, backlight_keyframe_animate_color, }, @@ -137,18 +139,6 @@ static keyframe_animation_t suspend_animation = { }, }; -static keyframe_animation_t resume_animation = { - .num_frames = 4, - .loop = false, - .frame_lengths = {0, 0, 0, gfxMillisecondsToTicks(10000), 0}, - .frame_functions = { - lcd_keyframe_enable, - backlight_keyframe_enable, - lcd_keyframe_draw_logo, - backlight_keyframe_animate_color, - }, -}; - void initialize_user_visualizer(visualizer_state_t* state) { // The brightness will be dynamically adjustable in the future // But for now, change it here. @@ -312,7 +302,7 @@ void user_visualizer_resume(visualizer_state_t* state) { state->current_lcd_color = initial_color; state->target_lcd_color = logo_background_color; lcd_state = LCD_STATE_INITIAL; - start_keyframe_animation(&resume_animation); + start_keyframe_animation(&startup_animation); } void ergodox_board_led_on(void){ diff --git a/quantum/visualizer/lcd_backlight.c b/quantum/visualizer/lcd_backlight.c index 70187d1e00..00de3fab52 100644 --- a/quantum/visualizer/lcd_backlight.c +++ b/quantum/visualizer/lcd_backlight.c @@ -25,10 +25,10 @@ SOFTWARE. #include "lcd_backlight.h" #include -static uint8_t current_hue = 0x00; -static uint8_t current_saturation = 0x00; -static uint8_t current_intensity = 0xFF; -static uint8_t current_brightness = 0x7F; +static uint8_t current_hue = 0; +static uint8_t current_saturation = 0; +static uint8_t current_intensity = 0; +static uint8_t current_brightness = 0; void lcd_backlight_init(void) { lcd_backlight_hal_init(); From 306353bf06e5e5a76890ffb0c48a4dcca76c4399 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sat, 8 Apr 2017 22:48:18 +0300 Subject: [PATCH 112/117] Create a file for shared Ergodox Infinity animations --- keyboards/ergodox/infinity/animations.c | 54 +++++++++++++++++++ keyboards/ergodox/infinity/animations.h | 25 +++++++++ keyboards/ergodox/infinity/rules.mk | 5 +- keyboards/ergodox/infinity/visualizer.c | 38 ++----------- .../ergodox/keymaps/default/visualizer.c | 45 ++-------------- 5 files changed, 90 insertions(+), 77 deletions(-) create mode 100644 keyboards/ergodox/infinity/animations.c create mode 100644 keyboards/ergodox/infinity/animations.h diff --git a/keyboards/ergodox/infinity/animations.c b/keyboards/ergodox/infinity/animations.c new file mode 100644 index 0000000000..54ab994607 --- /dev/null +++ b/keyboards/ergodox/infinity/animations.c @@ -0,0 +1,54 @@ +/* Copyright 2017 Fred Sundvik + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "animations.h" +#include "visualizer.h" +#ifdef LCD_ENABLE +#include "lcd_keyframes.h" +#endif +#ifdef LCD_BACKLIGHT_ENABLE +#include "lcd_backlight_keyframes.h" +#endif + +#if defined(VISUALIZER_ENABLE) && defined(LCD_ENABLE) && defined(LCD_BACKLIGHT_ENABLE) + +// Don't worry, if the startup animation is long, you can use the keyboard like normal +// during that time +keyframe_animation_t default_startup_animation = { + .num_frames = 4, + .loop = false, + .frame_lengths = {0, 0, 0, gfxMillisecondsToTicks(5000), 0}, + .frame_functions = { + lcd_keyframe_enable, + backlight_keyframe_enable, + lcd_keyframe_draw_logo, + backlight_keyframe_animate_color, + }, +}; + +keyframe_animation_t default_suspend_animation = { + .num_frames = 4, + .loop = false, + .frame_lengths = {0, gfxMillisecondsToTicks(1000), 0, 0}, + .frame_functions = { + lcd_keyframe_display_layer_text, + backlight_keyframe_animate_color, + lcd_keyframe_disable, + backlight_keyframe_disable, + }, +}; + +#endif diff --git a/keyboards/ergodox/infinity/animations.h b/keyboards/ergodox/infinity/animations.h new file mode 100644 index 0000000000..0c441ff7e9 --- /dev/null +++ b/keyboards/ergodox/infinity/animations.h @@ -0,0 +1,25 @@ +/* Copyright 2017 Fred Sundvik + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef KEYBOARDS_ERGODOX_INFINITY_ANIMATIONS_H_ +#define KEYBOARDS_ERGODOX_INFINITY_ANIMATIONS_H_ + +#include "visualizer.h" + +extern keyframe_animation_t default_startup_animation; +extern keyframe_animation_t default_suspend_animation; + +#endif /* KEYBOARDS_ERGODOX_INFINITY_ANIMATIONS_H_ */ diff --git a/keyboards/ergodox/infinity/rules.mk b/keyboards/ergodox/infinity/rules.mk index aaadfe34b5..9e6170d89a 100644 --- a/keyboards/ergodox/infinity/rules.mk +++ b/keyboards/ergodox/infinity/rules.mk @@ -1,6 +1,7 @@ # project specific files SRC = matrix.c \ - led.c + led.c \ + animations.c ## chip/board settings # - the next two should match the directories in @@ -72,4 +73,4 @@ endif ifdef LED_ENABLE include $(SUBPROJECT_PATH)/drivers/gdisp/IS31FL3731C/driver.mk -endif +endif \ No newline at end of file diff --git a/keyboards/ergodox/infinity/visualizer.c b/keyboards/ergodox/infinity/visualizer.c index 7ae371c5fc..a4b09a34d0 100644 --- a/keyboards/ergodox/infinity/visualizer.c +++ b/keyboards/ergodox/infinity/visualizer.c @@ -31,8 +31,7 @@ along with this program. If not, see . #include "lcd_keyframes.h" #include "lcd_backlight_keyframes.h" #include "system/serial_link.h" - -#include "resources/resources.h" +#include "animations.h" static const uint32_t logo_background_color = LCD_COLOR(0x00, 0x00, 0xFF); static const uint32_t initial_color = LCD_COLOR(0, 0, 0); @@ -74,19 +73,6 @@ _Static_assert(sizeof(visualizer_user_data_t) <= VISUALIZER_USER_DATA_SIZE, // Feel free to modify the animations below, or even add new ones if needed -// Don't worry, if the startup animation is long, you can use the keyboard like normal -// during that time -static keyframe_animation_t startup_animation = { - .num_frames = 4, - .loop = false, - .frame_lengths = {0, 0, 0, gfxMillisecondsToTicks(10000), 0}, - .frame_functions = { - lcd_keyframe_enable, - backlight_keyframe_enable, - lcd_keyframe_draw_logo, - backlight_keyframe_animate_color, - }, -}; // The color animation animates the LCD color when you change layers static keyframe_animation_t one_led_color = { @@ -127,18 +113,6 @@ static keyframe_animation_t lcd_bitmap_leds_animation = { .frame_functions = {lcd_keyframe_display_layer_bitmap, lcd_keyframe_display_led_states}, }; -static keyframe_animation_t suspend_animation = { - .num_frames = 4, - .loop = false, - .frame_lengths = {0, gfxMillisecondsToTicks(1000), 0, 0}, - .frame_functions = { - lcd_keyframe_display_layer_text, - backlight_keyframe_animate_color, - lcd_keyframe_disable, - backlight_keyframe_disable, - }, -}; - void initialize_user_visualizer(visualizer_state_t* state) { // The brightness will be dynamically adjustable in the future // But for now, change it here. @@ -146,13 +120,9 @@ void initialize_user_visualizer(visualizer_state_t* state) { state->current_lcd_color = initial_color; state->target_lcd_color = logo_background_color; lcd_state = LCD_STATE_INITIAL; - start_keyframe_animation(&startup_animation); + start_keyframe_animation(&default_startup_animation); } -static const uint32_t red; -static const uint32_t green; -static const uint32_t blue; - inline bool is_led_on(visualizer_user_data_t* user_data, uint8_t num) { return user_data->led_on & (1u << num); } @@ -295,14 +265,14 @@ void user_visualizer_suspend(visualizer_state_t* state) { uint8_t hue = LCD_HUE(state->current_lcd_color); uint8_t sat = LCD_SAT(state->current_lcd_color); state->target_lcd_color = LCD_COLOR(hue, sat, 0); - start_keyframe_animation(&suspend_animation); + start_keyframe_animation(&default_suspend_animation); } void user_visualizer_resume(visualizer_state_t* state) { state->current_lcd_color = initial_color; state->target_lcd_color = logo_background_color; lcd_state = LCD_STATE_INITIAL; - start_keyframe_animation(&startup_animation); + start_keyframe_animation(&default_startup_animation); } void ergodox_board_led_on(void){ diff --git a/keyboards/ergodox/keymaps/default/visualizer.c b/keyboards/ergodox/keymaps/default/visualizer.c index 6a7178968b..779de00506 100644 --- a/keyboards/ergodox/keymaps/default/visualizer.c +++ b/keyboards/ergodox/keymaps/default/visualizer.c @@ -32,8 +32,7 @@ along with this program. If not, see . #include "lcd_backlight_keyframes.h" #include "system/serial_link.h" #include "led.h" - -#include "resources/resources.h" +#include "animations.h" static const uint32_t logo_background_color = LCD_COLOR(0x00, 0x00, 0xFF); static const uint32_t initial_color = LCD_COLOR(0, 0, 0); @@ -48,18 +47,6 @@ static lcd_state_t lcd_state = LCD_STATE_INITIAL; // Feel free to modify the animations below, or even add new ones if needed -// Don't worry, if the startup animation is long, you can use the keyboard like normal -// during that time -static keyframe_animation_t startup_animation = { - .num_frames = 2, - .loop = false, - .frame_lengths = {0, gfxMillisecondsToTicks(10000), 0}, - .frame_functions = { - lcd_keyframe_draw_logo, - backlight_keyframe_animate_color, - }, -}; - static keyframe_animation_t lcd_layer_display = { .num_frames = 1, .loop = false, @@ -67,30 +54,6 @@ static keyframe_animation_t lcd_layer_display = { .frame_functions = {lcd_keyframe_display_layer_and_led_states} }; -static keyframe_animation_t suspend_animation = { - .num_frames = 4, - .loop = false, - .frame_lengths = {0, gfxMillisecondsToTicks(1000), 0, 0}, - .frame_functions = { - lcd_keyframe_display_layer_text, - backlight_keyframe_animate_color, - lcd_keyframe_disable, - backlight_keyframe_disable, - }, -}; - -static keyframe_animation_t resume_animation = { - .num_frames = 4, - .loop = false, - .frame_lengths = {0, 0, 0, gfxMillisecondsToTicks(10000), 0}, - .frame_functions = { - lcd_keyframe_enable, - backlight_keyframe_enable, - lcd_keyframe_draw_logo, - backlight_keyframe_animate_color, - }, -}; - // The color animation animates the LCD color when you change layers static keyframe_animation_t color_animation = { .num_frames = 2, @@ -109,7 +72,7 @@ void initialize_user_visualizer(visualizer_state_t* state) { state->current_lcd_color = initial_color; state->target_lcd_color = logo_background_color; lcd_state = LCD_STATE_INITIAL; - start_keyframe_animation(&startup_animation); + start_keyframe_animation(&default_startup_animation); } void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) { @@ -156,12 +119,12 @@ void user_visualizer_suspend(visualizer_state_t* state) { uint8_t hue = LCD_HUE(state->current_lcd_color); uint8_t sat = LCD_SAT(state->current_lcd_color); state->target_lcd_color = LCD_COLOR(hue, sat, 0); - start_keyframe_animation(&suspend_animation); + start_keyframe_animation(&default_suspend_animation); } void user_visualizer_resume(visualizer_state_t* state) { state->current_lcd_color = initial_color; state->target_lcd_color = logo_background_color; lcd_state = LCD_STATE_INITIAL; - start_keyframe_animation(&resume_animation); + start_keyframe_animation(&default_startup_animation); } From c5d2b7ff16f81a8061127e0ec636cf9b914725c5 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sat, 8 Apr 2017 23:04:27 +0300 Subject: [PATCH 113/117] Rename led test to led_keyframes and move animation to Ergodox --- keyboards/ergodox/infinity/animations.c | 55 +++++++++++++++++- keyboards/ergodox/infinity/animations.h | 5 ++ .../{led_test.c => led_keyframes.c} | 57 +++---------------- .../{led_test.h => led_keyframes.h} | 20 +++---- quantum/visualizer/visualizer.mk | 2 +- 5 files changed, 78 insertions(+), 61 deletions(-) rename quantum/visualizer/{led_test.c => led_keyframes.c} (68%) rename quantum/visualizer/{led_test.h => led_keyframes.h} (69%) diff --git a/keyboards/ergodox/infinity/animations.c b/keyboards/ergodox/infinity/animations.c index 54ab994607..4c9f6d9c85 100644 --- a/keyboards/ergodox/infinity/animations.c +++ b/keyboards/ergodox/infinity/animations.c @@ -14,6 +14,8 @@ * along with this program. If not, see . */ +#if defined(VISUALIZER_ENABLE) + #include "animations.h" #include "visualizer.h" #ifdef LCD_ENABLE @@ -23,7 +25,14 @@ #include "lcd_backlight_keyframes.h" #endif -#if defined(VISUALIZER_ENABLE) && defined(LCD_ENABLE) && defined(LCD_BACKLIGHT_ENABLE) +#ifdef LED_ENABLE +#include "led_keyframes.h" +#endif + +#include "visualizer_keyframes.h" + + +#if defined(LCD_ENABLE) && defined(LCD_BACKLIGHT_ENABLE) // Don't worry, if the startup animation is long, you can use the keyboard like normal // during that time @@ -50,5 +59,49 @@ keyframe_animation_t default_suspend_animation = { backlight_keyframe_disable, }, }; +#endif + +#if defined(LED_ENABLE) +#define CROSSFADE_TIME 1000 +#define GRADIENT_TIME 3000 + +keyframe_animation_t led_test_animation = { + .num_frames = 14, + .loop = true, + .frame_lengths = { + gfxMillisecondsToTicks(1000), // fade in + gfxMillisecondsToTicks(1000), // no op (leds on) + gfxMillisecondsToTicks(1000), // fade out + gfxMillisecondsToTicks(CROSSFADE_TIME), // crossfade + gfxMillisecondsToTicks(GRADIENT_TIME), // left to rigt (outside in) + gfxMillisecondsToTicks(CROSSFADE_TIME), // crossfade + gfxMillisecondsToTicks(GRADIENT_TIME), // top_to_bottom + 0, // mirror leds + gfxMillisecondsToTicks(CROSSFADE_TIME), // crossfade + gfxMillisecondsToTicks(GRADIENT_TIME), // left_to_right (mirrored, so inside out) + gfxMillisecondsToTicks(CROSSFADE_TIME), // crossfade + gfxMillisecondsToTicks(GRADIENT_TIME), // top_to_bottom + 0, // normal leds + gfxMillisecondsToTicks(CROSSFADE_TIME), // crossfade + + }, + .frame_functions = { + led_keyframe_fade_in_all, + keyframe_no_operation, + led_keyframe_fade_out_all, + led_keyframe_crossfade, + led_keyframe_left_to_right_gradient, + led_keyframe_crossfade, + led_keyframe_top_to_bottom_gradient, + led_keyframe_mirror_orientation, + led_keyframe_crossfade, + led_keyframe_left_to_right_gradient, + led_keyframe_crossfade, + led_keyframe_top_to_bottom_gradient, + led_keyframe_normal_orientation, + led_keyframe_crossfade, + }, +}; +#endif #endif diff --git a/keyboards/ergodox/infinity/animations.h b/keyboards/ergodox/infinity/animations.h index 0c441ff7e9..6d8b9830d9 100644 --- a/keyboards/ergodox/infinity/animations.h +++ b/keyboards/ergodox/infinity/animations.h @@ -19,7 +19,12 @@ #include "visualizer.h" +// You can use these default animations, but of course you can also write your own custom ones instead extern keyframe_animation_t default_startup_animation; extern keyframe_animation_t default_suspend_animation; +// An animation for testing and demonstrating the led support, should probably not be used for real world +// cases +extern keyframe_animation_t led_test_animation; + #endif /* KEYBOARDS_ERGODOX_INFINITY_ANIMATIONS_H_ */ diff --git a/quantum/visualizer/led_test.c b/quantum/visualizer/led_keyframes.c similarity index 68% rename from quantum/visualizer/led_test.c rename to quantum/visualizer/led_keyframes.c index a9abace8df..2dacd990d1 100644 --- a/quantum/visualizer/led_test.c +++ b/quantum/visualizer/led_keyframes.c @@ -21,50 +21,9 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include "led_test.h" #include "gfx.h" #include "math.h" - -#define CROSSFADE_TIME 1000 -#define GRADIENT_TIME 3000 - -keyframe_animation_t led_test_animation = { - .num_frames = 14, - .loop = true, - .frame_lengths = { - gfxMillisecondsToTicks(1000), // fade in - gfxMillisecondsToTicks(1000), // no op (leds on) - gfxMillisecondsToTicks(1000), // fade out - gfxMillisecondsToTicks(CROSSFADE_TIME), // crossfade - gfxMillisecondsToTicks(GRADIENT_TIME), // left to rigt (outside in) - gfxMillisecondsToTicks(CROSSFADE_TIME), // crossfade - gfxMillisecondsToTicks(GRADIENT_TIME), // top_to_bottom - 0, // mirror leds - gfxMillisecondsToTicks(CROSSFADE_TIME), // crossfade - gfxMillisecondsToTicks(GRADIENT_TIME), // left_to_right (mirrored, so inside out) - gfxMillisecondsToTicks(CROSSFADE_TIME), // crossfade - gfxMillisecondsToTicks(GRADIENT_TIME), // top_to_bottom - 0, // normal leds - gfxMillisecondsToTicks(CROSSFADE_TIME), // crossfade - - }, - .frame_functions = { - keyframe_fade_in_all_leds, - keyframe_no_operation, - keyframe_fade_out_all_leds, - keyframe_led_crossfade, - keyframe_led_left_to_right_gradient, - keyframe_led_crossfade, - keyframe_led_top_to_bottom_gradient, - keyframe_mirror_led_orientation, - keyframe_led_crossfade, - keyframe_led_left_to_right_gradient, - keyframe_led_crossfade, - keyframe_led_top_to_bottom_gradient, - keyframe_normal_led_orientation, - keyframe_led_crossfade, - }, -}; +#include "led_keyframes.h" static uint8_t fade_led_color(keyframe_animation_t* animation, int from, int to) { int frame_length = animation->frame_lengths[animation->current_frame]; @@ -96,19 +55,19 @@ static uint8_t compute_gradient_color(float t, float index, float num) { return (uint8_t)(255.0f * v); } -bool keyframe_fade_in_all_leds(keyframe_animation_t* animation, visualizer_state_t* state) { +bool led_keyframe_fade_in_all(keyframe_animation_t* animation, visualizer_state_t* state) { (void)state; keyframe_fade_all_leds_from_to(animation, 0, 255); return true; } -bool keyframe_fade_out_all_leds(keyframe_animation_t* animation, visualizer_state_t* state) { +bool led_keyframe_fade_out_all(keyframe_animation_t* animation, visualizer_state_t* state) { (void)state; keyframe_fade_all_leds_from_to(animation, 255, 0); return true; } -bool keyframe_led_left_to_right_gradient(keyframe_animation_t* animation, visualizer_state_t* state) { +bool led_keyframe_left_to_right_gradient(keyframe_animation_t* animation, visualizer_state_t* state) { (void)state; float frame_length = animation->frame_lengths[animation->current_frame]; float current_pos = frame_length - animation->time_left_in_frame; @@ -120,7 +79,7 @@ bool keyframe_led_left_to_right_gradient(keyframe_animation_t* animation, visual return true; } -bool keyframe_led_top_to_bottom_gradient(keyframe_animation_t* animation, visualizer_state_t* state) { +bool led_keyframe_top_to_bottom_gradient(keyframe_animation_t* animation, visualizer_state_t* state) { (void)state; float frame_length = animation->frame_lengths[animation->current_frame]; float current_pos = frame_length - animation->time_left_in_frame; @@ -139,7 +98,7 @@ static void copy_current_led_state(uint8_t* dest) { } } } -bool keyframe_led_crossfade(keyframe_animation_t* animation, visualizer_state_t* state) { +bool led_keyframe_crossfade(keyframe_animation_t* animation, visualizer_state_t* state) { (void)state; if (animation->first_update_of_frame) { copy_current_led_state(&crossfade_start_frame[0][0]); @@ -155,14 +114,14 @@ bool keyframe_led_crossfade(keyframe_animation_t* animation, visualizer_state_t* return true; } -bool keyframe_mirror_led_orientation(keyframe_animation_t* animation, visualizer_state_t* state) { +bool led_keyframe_mirror_orientation(keyframe_animation_t* animation, visualizer_state_t* state) { (void)state; (void)animation; gdispGSetOrientation(LED_DISPLAY, GDISP_ROTATE_180); return false; } -bool keyframe_normal_led_orientation(keyframe_animation_t* animation, visualizer_state_t* state) { +bool led_keyframe_normal_orientation(keyframe_animation_t* animation, visualizer_state_t* state) { (void)state; (void)animation; gdispGSetOrientation(LED_DISPLAY, GDISP_ROTATE_0); diff --git a/quantum/visualizer/led_test.h b/quantum/visualizer/led_keyframes.h similarity index 69% rename from quantum/visualizer/led_test.h rename to quantum/visualizer/led_keyframes.h index 5e2325753e..a689430417 100644 --- a/quantum/visualizer/led_test.h +++ b/quantum/visualizer/led_keyframes.h @@ -22,20 +22,20 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#ifndef TMK_VISUALIZER_LED_TEST_H_ -#define TMK_VISUALIZER_LED_TEST_H_ +#ifndef LED_KEYFRAMES_H +#define LED_KEYFRAMES_H #include "visualizer.h" -bool keyframe_fade_in_all_leds(keyframe_animation_t* animation, visualizer_state_t* state); -bool keyframe_fade_out_all_leds(keyframe_animation_t* animation, visualizer_state_t* state); -bool keyframe_led_left_to_right_gradient(keyframe_animation_t* animation, visualizer_state_t* state); -bool keyframe_led_top_to_bottom_gradient(keyframe_animation_t* animation, visualizer_state_t* state); -bool keyframe_led_crossfade(keyframe_animation_t* animation, visualizer_state_t* state); -bool keyframe_mirror_led_orientation(keyframe_animation_t* animation, visualizer_state_t* state); -bool keyframe_normal_led_orientation(keyframe_animation_t* animation, visualizer_state_t* state); +bool led_keyframe_fade_in_all(keyframe_animation_t* animation, visualizer_state_t* state); +bool led_keyframe_fade_out_all(keyframe_animation_t* animation, visualizer_state_t* state); +bool led_keyframe_left_to_right_gradient(keyframe_animation_t* animation, visualizer_state_t* state); +bool led_keyframe_top_to_bottom_gradient(keyframe_animation_t* animation, visualizer_state_t* state); +bool led_keyframe_crossfade(keyframe_animation_t* animation, visualizer_state_t* state); +bool led_keyframe_mirror_orientation(keyframe_animation_t* animation, visualizer_state_t* state); +bool led_keyframe_normal_orientation(keyframe_animation_t* animation, visualizer_state_t* state); extern keyframe_animation_t led_test_animation; -#endif /* TMK_VISUALIZER_LED_TEST_H_ */ +#endif /* LED_KEYFRAMES_H */ diff --git a/quantum/visualizer/visualizer.mk b/quantum/visualizer/visualizer.mk index 7c8e98d67b..5f710124bc 100644 --- a/quantum/visualizer/visualizer.mk +++ b/quantum/visualizer/visualizer.mk @@ -43,7 +43,7 @@ OPT_DEFS += -DLCD_BACKLIGHT_ENABLE endif ifeq ($(strip $(LED_ENABLE)), yes) -SRC += $(VISUALIZER_DIR)/led_test.c +SRC += $(VISUALIZER_DIR)/led_keyframes.c OPT_DEFS += -DLED_ENABLE endif From 65b7bf68785b5b1d4257ba4fd95c3f53df230985 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sun, 9 Apr 2017 18:32:10 +0300 Subject: [PATCH 114/117] Extract Ergodox default visualizer into simple_visualizer It's good enough if you only want to change the lcd text and color. --- .../ergodox/infinity/simple_visualizer.h | 123 ++++++++++++++++++ .../ergodox/keymaps/default/visualizer.c | 102 +-------------- 2 files changed, 130 insertions(+), 95 deletions(-) create mode 100644 keyboards/ergodox/infinity/simple_visualizer.h diff --git a/keyboards/ergodox/infinity/simple_visualizer.h b/keyboards/ergodox/infinity/simple_visualizer.h new file mode 100644 index 0000000000..ded8a3222e --- /dev/null +++ b/keyboards/ergodox/infinity/simple_visualizer.h @@ -0,0 +1,123 @@ +/* Copyright 2017 Fred Sundvik + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef KEYBOARDS_ERGODOX_INFINITY_SIMPLE_VISUALIZER_H_ +#define KEYBOARDS_ERGODOX_INFINITY_SIMPLE_VISUALIZER_H_ + +// Currently we are assuming that both the backlight and LCD are enabled +// But it's entirely possible to write a custom visualizer that use only +// one of them +#ifndef LCD_BACKLIGHT_ENABLE +#error This visualizer needs that LCD backlight is enabled +#endif + +#ifndef LCD_ENABLE +#error This visualizer needs that LCD is enabled +#endif + +#include "visualizer.h" +#include "visualizer_keyframes.h" +#include "lcd_keyframes.h" +#include "lcd_backlight_keyframes.h" +#include "system/serial_link.h" +#include "led.h" +#include "animations.h" + +static const uint32_t logo_background_color = LCD_COLOR(0x00, 0x00, 0xFF); +static const uint32_t initial_color = LCD_COLOR(0, 0, 0); + +static bool initial_update = true; + +// Feel free to modify the animations below, or even add new ones if needed + +static keyframe_animation_t lcd_layer_display = { + .num_frames = 1, + .loop = false, + .frame_lengths = {gfxMillisecondsToTicks(0)}, + .frame_functions = {lcd_keyframe_display_layer_and_led_states} +}; + +// The color animation animates the LCD color when you change layers +static keyframe_animation_t color_animation = { + .num_frames = 2, + .loop = false, + // Note that there's a 200 ms no-operation frame, + // this prevents the color from changing when activating the layer + // momentarily + .frame_lengths = {gfxMillisecondsToTicks(200), gfxMillisecondsToTicks(500)}, + .frame_functions = {keyframe_no_operation, backlight_keyframe_animate_color}, +}; + +void initialize_user_visualizer(visualizer_state_t* state) { + // The brightness will be dynamically adjustable in the future + // But for now, change it here. + lcd_backlight_brightness(130); + state->current_lcd_color = initial_color; + state->target_lcd_color = logo_background_color; + initial_update = true; + start_keyframe_animation(&default_startup_animation); +} + + +// This function should be implemented by the keymap visualizer +// Don't change anything else than state->target_lcd_color and state->layer_text as that's the only thing +// that the simple_visualizer assumes that you are updating +// Also make sure that the buffer passed to state->layer_text remains valid until the previous animation is +// stopped. This can be done by either double buffering it or by using constant strings +static void get_visualizer_layer_and_color(visualizer_state_t* state); + +void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) { + // Add more tests, change the colors and layer texts here + // Usually you want to check the high bits (higher layers first) + // because that's the order layers are processed for keypresses + // You can for check for example: + // state->status.layer + // state->status.default_layer + // state->status.leds (see led.h for available statuses) + + uint32_t prev_color = state->target_lcd_color; + const char* prev_layer_text = state->layer_text; + + get_visualizer_layer_and_color(state); + + if (initial_update || prev_color != state->target_lcd_color) { + start_keyframe_animation(&color_animation); + } + + if (initial_update || prev_layer_text != state->layer_text) { + start_keyframe_animation(&lcd_layer_display); + } + // You can also stop existing animations, and start your custom ones here + // remember that you should normally have only one animation for the LCD + // and one for the background. But you can also combine them if you want. +} + +void user_visualizer_suspend(visualizer_state_t* state) { + state->layer_text = "Suspending..."; + uint8_t hue = LCD_HUE(state->current_lcd_color); + uint8_t sat = LCD_SAT(state->current_lcd_color); + state->target_lcd_color = LCD_COLOR(hue, sat, 0); + start_keyframe_animation(&default_suspend_animation); +} + +void user_visualizer_resume(visualizer_state_t* state) { + state->current_lcd_color = initial_color; + state->target_lcd_color = logo_background_color; + initial_update = true; + start_keyframe_animation(&default_startup_animation); +} + +#endif /* KEYBOARDS_ERGODOX_INFINITY_SIMPLE_VISUALIZER_H_ */ diff --git a/keyboards/ergodox/keymaps/default/visualizer.c b/keyboards/ergodox/keymaps/default/visualizer.c index 779de00506..502e53f3d1 100644 --- a/keyboards/ergodox/keymaps/default/visualizer.c +++ b/keyboards/ergodox/keymaps/default/visualizer.c @@ -15,75 +15,14 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -// Currently we are assuming that both the backlight and LCD are enabled -// But it's entirely possible to write a custom visualizer that use only -// one of them -#ifndef LCD_BACKLIGHT_ENABLE -#error This visualizer needs that LCD backlight is enabled -#endif - -#ifndef LCD_ENABLE -#error This visualizer needs that LCD is enabled -#endif - -#include "visualizer.h" -#include "visualizer_keyframes.h" -#include "lcd_keyframes.h" -#include "lcd_backlight_keyframes.h" -#include "system/serial_link.h" -#include "led.h" -#include "animations.h" - -static const uint32_t logo_background_color = LCD_COLOR(0x00, 0x00, 0xFF); -static const uint32_t initial_color = LCD_COLOR(0, 0, 0); - -typedef enum { - LCD_STATE_INITIAL, - LCD_STATE_LAYER_BITMAP, - LCD_STATE_BITMAP_AND_LEDS, -} lcd_state_t; - -static lcd_state_t lcd_state = LCD_STATE_INITIAL; - -// Feel free to modify the animations below, or even add new ones if needed - -static keyframe_animation_t lcd_layer_display = { - .num_frames = 1, - .loop = false, - .frame_lengths = {gfxMillisecondsToTicks(0)}, - .frame_functions = {lcd_keyframe_display_layer_and_led_states} -}; - -// The color animation animates the LCD color when you change layers -static keyframe_animation_t color_animation = { - .num_frames = 2, - .loop = false, - // Note that there's a 200 ms no-operation frame, - // this prevents the color from changing when activating the layer - // momentarily - .frame_lengths = {gfxMillisecondsToTicks(200), gfxMillisecondsToTicks(500)}, - .frame_functions = {keyframe_no_operation, backlight_keyframe_animate_color}, -}; - -void initialize_user_visualizer(visualizer_state_t* state) { - // The brightness will be dynamically adjustable in the future - // But for now, change it here. - lcd_backlight_brightness(130); - state->current_lcd_color = initial_color; - state->target_lcd_color = logo_background_color; - lcd_state = LCD_STATE_INITIAL; - start_keyframe_animation(&default_startup_animation); -} - -void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) { - // Add more tests, change the colors and layer texts here - // Usually you want to check the high bits (higher layers first) - // because that's the order layers are processed for keypresses - // You can for check for example: - // state->status.layer - // state->status.default_layer - // state->status.leds (see led.h for available statuses) +#include "simple_visualizer.h" +// This function should be implemented by the keymap visualizer +// Don't change anything else than state->target_lcd_color and state->layer_text as that's the only thing +// that the simple_visualizer assumes that you are updating +// Also make sure that the buffer passed to state->layer_text remains valid until the previous animation is +// stopped. This can be done by either double buffering it or by using constant strings +static void get_visualizer_layer_and_color(visualizer_state_t* state) { uint8_t saturation = 60; if (state->status.leds & (1u << USB_LED_CAPS_LOCK)) { saturation = 255; @@ -100,31 +39,4 @@ void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard state->target_lcd_color = LCD_COLOR(84, saturation, 0xFF); state->layer_text = "Default"; } - - if (lcd_state == LCD_STATE_INITIAL || - state->status.layer != prev_status->layer || - state->status.default_layer != prev_status->default_layer || - state->status.leds != prev_status->leds) { - start_keyframe_animation(&color_animation); - start_keyframe_animation(&lcd_layer_display); - } - - // You can also stop existing animations, and start your custom ones here - // remember that you should normally have only one animation for the LCD - // and one for the background. But you can also combine them if you want. -} - -void user_visualizer_suspend(visualizer_state_t* state) { - state->layer_text = "Suspending..."; - uint8_t hue = LCD_HUE(state->current_lcd_color); - uint8_t sat = LCD_SAT(state->current_lcd_color); - state->target_lcd_color = LCD_COLOR(hue, sat, 0); - start_keyframe_animation(&default_suspend_animation); -} - -void user_visualizer_resume(visualizer_state_t* state) { - state->current_lcd_color = initial_color; - state->target_lcd_color = logo_background_color; - lcd_state = LCD_STATE_INITIAL; - start_keyframe_animation(&default_startup_animation); } From dc96fa24e488ebb899d38c8360916b27142f56eb Mon Sep 17 00:00:00 2001 From: Joe DeVivo Date: Mon, 10 Apr 2017 17:19:27 -0700 Subject: [PATCH 115/117] mimic atreus firmware defaults --- keyboards/atreus/keymaps/default/keymap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/atreus/keymaps/default/keymap.c b/keyboards/atreus/keymaps/default/keymap.c index ce92e89c9c..15ebad14d4 100644 --- a/keyboards/atreus/keymaps/default/keymap.c +++ b/keyboards/atreus/keymaps/default/keymap.c @@ -39,8 +39,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_LW] = { /* [> LOWER <] */ {KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_TRNS, KC_UP, KC_F7, KC_F8, KC_F9, KC_F10}, {KC_DELT, KC_LEFT, KC_DOWN, KC_RGHT, KC_DOWN, KC_TRNS, KC_DOWN, KC_F4, KC_F5, KC_F6, KC_F11}, - {KC_TRNS, KC_VOLU, KC_TRNS, KC_TRNS, RESET, KC_LCTL, KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F12}, - {KC_TRNS, KC_VOLD, KC_LGUI, KC_LSFT, KC_BSPC, KC_LALT, KC_SPC, DF(_QW), KC_PSCR, KC_SLCK, KC_PAUS} + {KC_NO, KC_VOLU, KC_NO, KC_NO, RESET, KC_LCTL, KC_NO, KC_F1, KC_F2, KC_F3, KC_F12}, + {KC_NO, KC_VOLD, KC_LGUI, KC_LSFT, KC_BSPC, KC_LALT, KC_SPC, TO(_QW), KC_PSCR, KC_SLCK, KC_PAUS} }}; const uint16_t PROGMEM fn_actions[] = { From 1d5567a3a9ae1ca45bd5ff09f21edb7d1388afc3 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Wed, 12 Apr 2017 09:52:40 +0300 Subject: [PATCH 116/117] Fix code formatting in build_keyboard.mk --- build_keyboard.mk | 165 +++++++++++++++++++++++----------------------- 1 file changed, 83 insertions(+), 82 deletions(-) diff --git a/build_keyboard.mk b/build_keyboard.mk index 79d2b6b0f0..9da8277db9 100644 --- a/build_keyboard.mk +++ b/build_keyboard.mk @@ -7,11 +7,11 @@ endif include common.mk ifneq ($(SUBPROJECT),) - TARGET ?= $(KEYBOARD)_$(SUBPROJECT)_$(KEYMAP) - KEYBOARD_OUTPUT := $(BUILD_DIR)/obj_$(KEYBOARD)_$(SUBPROJECT) + TARGET ?= $(KEYBOARD)_$(SUBPROJECT)_$(KEYMAP) + KEYBOARD_OUTPUT := $(BUILD_DIR)/obj_$(KEYBOARD)_$(SUBPROJECT) else - TARGET ?= $(KEYBOARD)_$(KEYMAP) - KEYBOARD_OUTPUT := $(BUILD_DIR)/obj_$(KEYBOARD) + TARGET ?= $(KEYBOARD)_$(KEYMAP) + KEYBOARD_OUTPUT := $(BUILD_DIR)/obj_$(KEYBOARD) endif # Force expansion @@ -20,15 +20,15 @@ TARGET := $(TARGET) MASTER ?= left ifdef master - MASTER = $(master) + MASTER = $(master) endif ifeq ($(MASTER),right) - OPT_DEFS += -DMASTER_IS_ON_RIGHT + OPT_DEFS += -DMASTER_IS_ON_RIGHT else - ifneq ($(MASTER),left) + ifneq ($(MASTER),left) $(error MASTER does not have a valid value(left/right)) - endif + endif endif @@ -56,31 +56,31 @@ endif # We can assume a ChibiOS target When MCU_FAMILY is defined, since it's not used for LUFA ifdef MCU_FAMILY - PLATFORM=CHIBIOS + PLATFORM=CHIBIOS else - PLATFORM=AVR + PLATFORM=AVR endif ifeq ($(PLATFORM),CHIBIOS) - include $(TMK_PATH)/protocol/chibios.mk - include $(TMK_PATH)/chibios.mk - OPT_OS = chibios - ifneq ("$(wildcard $(SUBPROJECT_PATH)/bootloader_defs.h)","") - OPT_DEFS += -include $(SUBPROJECT_PATH)/bootloader_defs.h - else ifneq ("$(wildcard $(SUBPROJECT_PATH)/boards/$(BOARD)/bootloader_defs.h)","") - OPT_DEFS += -include $(SUBPROJECT_PATH)/boards/$(BOARD)/bootloader_defs.h - else ifneq ("$(wildcard $(KEYBOARD_PATH)/bootloader_defs.h)","") - OPT_DEFS += -include $(KEYBOARD_PATH)/bootloader_defs.h - else ifneq ("$(wildcard $(KEYBOARD_PATH)/boards/$(BOARD)/bootloader_defs.h)","") - OPT_DEFS += -include $(KEYBOARD_PATH)/boards/$(BOARD)/bootloader_defs.h - endif + include $(TMK_PATH)/protocol/chibios.mk + include $(TMK_PATH)/chibios.mk + OPT_OS = chibios + ifneq ("$(wildcard $(SUBPROJECT_PATH)/bootloader_defs.h)","") + OPT_DEFS += -include $(SUBPROJECT_PATH)/bootloader_defs.h + else ifneq ("$(wildcard $(SUBPROJECT_PATH)/boards/$(BOARD)/bootloader_defs.h)","") + OPT_DEFS += -include $(SUBPROJECT_PATH)/boards/$(BOARD)/bootloader_defs.h + else ifneq ("$(wildcard $(KEYBOARD_PATH)/bootloader_defs.h)","") + OPT_DEFS += -include $(KEYBOARD_PATH)/bootloader_defs.h + else ifneq ("$(wildcard $(KEYBOARD_PATH)/boards/$(BOARD)/bootloader_defs.h)","") + OPT_DEFS += -include $(KEYBOARD_PATH)/boards/$(BOARD)/bootloader_defs.h + endif endif CONFIG_H = $(KEYBOARD_PATH)/config.h ifneq ($(SUBPROJECT),) - ifneq ("$(wildcard $(SUBPROJECT_C))","") - CONFIG_H = $(SUBPROJECT_PATH)/config.h - endif + ifneq ("$(wildcard $(SUBPROJECT_C))","") + CONFIG_H = $(SUBPROJECT_PATH)/config.h + endif endif # Save the defines and includes here, so we don't include any keymap specific ones @@ -112,30 +112,30 @@ KEYMAP_OUTPUT := $(BUILD_DIR)/obj_$(TARGET) ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","") - CONFIG_H = $(KEYMAP_PATH)/config.h + CONFIG_H = $(KEYMAP_PATH)/config.h endif # # project specific files SRC += $(KEYBOARD_C) \ - $(KEYMAP_C) \ - $(QUANTUM_DIR)/quantum.c \ - $(QUANTUM_DIR)/keymap_common.c \ - $(QUANTUM_DIR)/keycode_config.c \ - $(QUANTUM_DIR)/process_keycode/process_leader.c + $(KEYMAP_C) \ + $(QUANTUM_DIR)/quantum.c \ + $(QUANTUM_DIR)/keymap_common.c \ + $(QUANTUM_DIR)/keycode_config.c \ + $(QUANTUM_DIR)/process_keycode/process_leader.c ifneq ($(SUBPROJECT),) - SRC += $(SUBPROJECT_C) + SRC += $(SUBPROJECT_C) endif ifndef CUSTOM_MATRIX - SRC += $(QUANTUM_DIR)/matrix.c + SRC += $(QUANTUM_DIR)/matrix.c endif ifeq ($(strip $(API_SYSEX_ENABLE)), yes) - OPT_DEFS += -DAPI_SYSEX_ENABLE - SRC += $(QUANTUM_DIR)/api/api_sysex.c - OPT_DEFS += -DAPI_ENABLE - SRC += $(QUANTUM_DIR)/api.c + OPT_DEFS += -DAPI_SYSEX_ENABLE + SRC += $(QUANTUM_DIR)/api/api_sysex.c + OPT_DEFS += -DAPI_ENABLE + SRC += $(QUANTUM_DIR)/api.c MIDI_ENABLE=yes endif @@ -144,25 +144,25 @@ MUSIC_ENABLE := 0 ifeq ($(strip $(AUDIO_ENABLE)), yes) OPT_DEFS += -DAUDIO_ENABLE MUSIC_ENABLE := 1 - SRC += $(QUANTUM_DIR)/process_keycode/process_audio.c - SRC += $(QUANTUM_DIR)/audio/audio.c - SRC += $(QUANTUM_DIR)/audio/voices.c - SRC += $(QUANTUM_DIR)/audio/luts.c + SRC += $(QUANTUM_DIR)/process_keycode/process_audio.c + SRC += $(QUANTUM_DIR)/audio/audio.c + SRC += $(QUANTUM_DIR)/audio/voices.c + SRC += $(QUANTUM_DIR)/audio/luts.c endif ifeq ($(strip $(MIDI_ENABLE)), yes) OPT_DEFS += -DMIDI_ENABLE - MUSIC_ENABLE := 1 - SRC += $(QUANTUM_DIR)/process_keycode/process_midi.c + MUSIC_ENABLE := 1 + SRC += $(QUANTUM_DIR)/process_keycode/process_midi.c endif ifeq ($(MUSIC_ENABLE), 1) - SRC += $(QUANTUM_DIR)/process_keycode/process_music.c + SRC += $(QUANTUM_DIR)/process_keycode/process_music.c endif ifeq ($(strip $(COMBO_ENABLE)), yes) OPT_DEFS += -DCOMBO_ENABLE - SRC += $(QUANTUM_DIR)/process_keycode/process_combo.c + SRC += $(QUANTUM_DIR)/process_keycode/process_combo.c endif ifeq ($(strip $(VIRTSER_ENABLE)), yes) @@ -171,79 +171,80 @@ endif ifeq ($(strip $(FAUXCLICKY_ENABLE)), yes) OPT_DEFS += -DFAUXCLICKY_ENABLE - SRC += $(QUANTUM_DIR)/fauxclicky.c + SRC += $(QUANTUM_DIR)/fauxclicky.c endif ifeq ($(strip $(UCIS_ENABLE)), yes) - OPT_DEFS += -DUCIS_ENABLE - SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c - SRC += $(QUANTUM_DIR)/process_keycode/process_ucis.c + OPT_DEFS += -DUCIS_ENABLE + SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c + SRC += $(QUANTUM_DIR)/process_keycode/process_ucis.c endif ifeq ($(strip $(UNICODEMAP_ENABLE)), yes) - OPT_DEFS += -DUNICODEMAP_ENABLE - SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c - SRC += $(QUANTUM_DIR)/process_keycode/process_unicodemap.c + OPT_DEFS += -DUNICODEMAP_ENABLE + SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c + SRC += $(QUANTUM_DIR)/process_keycode/process_unicodemap.c endif ifeq ($(strip $(UNICODE_ENABLE)), yes) OPT_DEFS += -DUNICODE_ENABLE - SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c - SRC += $(QUANTUM_DIR)/process_keycode/process_unicode.c + SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c + SRC += $(QUANTUM_DIR)/process_keycode/process_unicode.c endif ifeq ($(strip $(RGBLIGHT_ENABLE)), yes) - OPT_DEFS += -DRGBLIGHT_ENABLE - SRC += $(QUANTUM_DIR)/light_ws2812.c - SRC += $(QUANTUM_DIR)/rgblight.c + OPT_DEFS += -DRGBLIGHT_ENABLE + SRC += $(QUANTUM_DIR)/light_ws2812.c + SRC += $(QUANTUM_DIR)/rgblight.c CIE1931_CURVE = yes LED_BREATHING_TABLE = yes endif ifeq ($(strip $(TAP_DANCE_ENABLE)), yes) - OPT_DEFS += -DTAP_DANCE_ENABLE - SRC += $(QUANTUM_DIR)/process_keycode/process_tap_dance.c + OPT_DEFS += -DTAP_DANCE_ENABLE + SRC += $(QUANTUM_DIR)/process_keycode/process_tap_dance.c endif ifeq ($(strip $(PRINTING_ENABLE)), yes) - OPT_DEFS += -DPRINTING_ENABLE - SRC += $(QUANTUM_DIR)/process_keycode/process_printer.c - SRC += $(TMK_DIR)/protocol/serial_uart.c + OPT_DEFS += -DPRINTING_ENABLE + SRC += $(QUANTUM_DIR)/process_keycode/process_printer.c + SRC += $(TMK_DIR)/protocol/serial_uart.c endif ifeq ($(strip $(SERIAL_LINK_ENABLE)), yes) - SRC += $(patsubst $(QUANTUM_PATH)/%,%,$(SERIAL_SRC)) - OPT_DEFS += $(SERIAL_DEFS) - VAPTH += $(SERIAL_PATH) + SRC += $(patsubst $(QUANTUM_PATH)/%,%,$(SERIAL_SRC)) + OPT_DEFS += $(SERIAL_DEFS) + VAPTH += $(SERIAL_PATH) endif ifneq ($(strip $(VARIABLE_TRACE)),) - SRC += $(QUANTUM_DIR)/variable_trace.c - OPT_DEFS += -DNUM_TRACED_VARIABLES=$(strip $(VARIABLE_TRACE)) + SRC += $(QUANTUM_DIR)/variable_trace.c + OPT_DEFS += -DNUM_TRACED_VARIABLES=$(strip $(VARIABLE_TRACE)) ifneq ($(strip $(MAX_VARIABLE_TRACE_SIZE)),) - OPT_DEFS += -DMAX_VARIABLE_TRACE_SIZE=$(strip $(MAX_VARIABLE_TRACE_SIZE)) + OPT_DEFS += -DMAX_VARIABLE_TRACE_SIZE=$(strip $(MAX_VARIABLE_TRACE_SIZE)) endif endif ifeq ($(strip $(LCD_ENABLE)), yes) -CIE1931_CURVE = yes + CIE1931_CURVE = yes endif ifeq ($(strip $(LED_ENABLE)), yes) -CIE1931_CURVE = yes + CIE1931_CURVE = yes endif ifeq ($(strip $(CIE1931_CURVE)), yes) - OPT_DEFS += -DUSE_CIE1931_CURVE - LED_TABLES = yes + OPT_DEFS += -DUSE_CIE1931_CURVE + LED_TABLES = yes endif + ifeq ($(strip $(LED_BREATHING_TABLE)), yes) - OPT_DEFS += -DUSE_LED_BREATHING_TABLE - LED_TABLES = yes + OPT_DEFS += -DUSE_LED_BREATHING_TABLE + LED_TABLES = yes endif ifeq ($(strip $(LED_TABLES)), yes) - SRC += $(QUANTUM_DIR)/led_tables.c + SRC += $(QUANTUM_DIR)/led_tables.c endif # Optimize size but this may cause error "relocation truncated to fit" @@ -252,7 +253,7 @@ endif # Search Path VPATH += $(KEYMAP_PATH) ifneq ($(SUBPROJECT),) - VPATH += $(SUBPROJECT_PATH) + VPATH += $(SUBPROJECT_PATH) endif VPATH += $(KEYBOARD_PATH) VPATH += $(COMMON_VPATH) @@ -266,17 +267,17 @@ EXTRALDFLAGS += $(TMK_COMMON_LDFLAGS) ifeq ($(PLATFORM),AVR) ifeq ($(strip $(PROTOCOL)), VUSB) - include $(TMK_PATH)/protocol/vusb.mk + include $(TMK_PATH)/protocol/vusb.mk else - include $(TMK_PATH)/protocol/lufa.mk + include $(TMK_PATH)/protocol/lufa.mk endif - include $(TMK_PATH)/avr.mk + include $(TMK_PATH)/avr.mk endif ifeq ($(strip $(VISUALIZER_ENABLE)), yes) - VISUALIZER_DIR = $(QUANTUM_DIR)/visualizer - VISUALIZER_PATH = $(QUANTUM_PATH)/visualizer - include $(VISUALIZER_PATH)/visualizer.mk + VISUALIZER_DIR = $(QUANTUM_DIR)/visualizer + VISUALIZER_PATH = $(QUANTUM_PATH)/visualizer + include $(VISUALIZER_PATH)/visualizer.mk endif OUTPUTS := $(KEYMAP_OUTPUT) $(KEYBOARD_OUTPUT) From 446b34edecc644e03073b92ff6886f367d3bf29f Mon Sep 17 00:00:00 2001 From: kamisamamizu Date: Wed, 12 Apr 2017 12:18:38 +0200 Subject: [PATCH 117/117] Fixed position of BSLS and BSPC They were in the incorrect positions before. --- keyboards/xd60/keymaps/default/keymap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/xd60/keymaps/default/keymap.c b/keyboards/xd60/keymaps/default/keymap.c index 11be9afca2..784088d530 100644 --- a/keyboards/xd60/keymaps/default/keymap.c +++ b/keyboards/xd60/keymaps/default/keymap.c @@ -5,8 +5,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // 0: Base Layer KEYMAP( - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_GRV, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NO, KC_ENT, \ KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DEL, \ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RGUI, F(0), KC_LEFT, KC_DOWN, KC_RIGHT),

cBNeva_o@Ek+=U- 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 z∫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 literal 0 HcmV?d00001 diff --git a/keyboards/ergodox/keymaps/familiar/familiar.svg b/keyboards/ergodox/keymaps/familiar/familiar.svg new file mode 100644 index 0000000000..94e7cae602 --- /dev/null +++ b/keyboards/ergodox/keymaps/familiar/familiar.svg @@ -0,0 +1,7131 @@ + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PanningHold down Scroll Wheel to pan with mouseUp/Down - Scroll WheelLeft/Right - Shift + Scroll WheelZooming- Ctrl + Scroll View to zoom in/out- Press 1, 2, 4, or 5 for preset zoom views.Zoom Tool (F3) :- Left click to zoom in- Right click to zoom out + + + Keyboards + + + + + + + + + To avoid delays and errors in your order you must convert all of your fonts and text to vector data + This layout is used for your legends only. Keycap colors need to be defined with the online designer tool.Please check out our online tutorials at support.wasdkeyboards.comfor help and instructions regarding layout creation. + + + Quick Start:1. Enable Layers by going to: Layer > Layers (Ctrl + Shift + L) *The layers window can be expanded by dragging the area under the opacity slider.2. Use the Eyeball Icons to toggle visibility for preset layers3. Use the Select tool to move and scale objects (F1)4. Use the Text Tool to add and edit text (F8) + + Managing Layers1. Enable Layers by pressing Ctrl + Shift + L2. The Layer window can be enlarged by dragging thearea under the Opacity slider.3. Use the Eyeball Icon to toggle layer visibility.4. Use the Lock Icon to toggle the ability to edit layer.5. To add a layer, use the button from Layers panel. + + + Manipulating ObjectsThe Select Tool (F1) allows you to select and move,scale, and delete objects. Select an object, then drag the object to move it. You can drag the arrows around the object to scale it.Holding Ctrl while moving will keep the object locked onthe same X or Y axis. Holding Ctrl while scaling will keep the size ratio locked. + Inkscape Tutorial + FAQ (Frequently Asked Questions)I can't see any layers, I just see one layer or no layers when I open the layers panel.This happens when you drag and drop the layout file into Inkscape which "imports" it instead of opening it. Please close your Inkscape window, go back to the original file, right click it and choose "edit with Inkscape". What are the grids for on the layout? Can I place objects outside the grid?Yes. The grids are for reference only. You can snap the grids to use our standard margins. You can print all the way to the edge of the frame. There is a +/-0.01" tolerance, so we suggest that you stay within the grids when possible.Can I put a graphic that spans over multiple keys? Yes. Large images will be cropped to the top face of the keys. The areas in between the keys will not be printed.Advanced users can use a clipping mask to get a better idea of what the final image will look like.How can I change the color of the printing?We have tutorials in our support center that can show you how to add colors to your text and images.Go to support.wasdkeyboards.comI want to edit the Mac-style layouts, but the text is not editable.The Mac layout text is not editable since the font is not common. The font used is VAG Rounded-Light. + Adding text1. Click on the Text Tool (F8)2. Click on the area where you want add text3. Type your text4. Font and size and can changed in the text toolbar5. Use the Select Tool (F1) to reposition thetext if necessary. + + + + Editing font type and size1. Use the Select Tool (F1) select the objects youwant to edit.2. Click on the Text Tool (F8)3. Use the text toolbar to change font type and text size + + + + + Editing textUse the Select Tool (F1) and double click a singletext object.-or-Use the Text Tool (F8) and click on a single text object. + + + + Adding stock artworkCommonly used icons and symbols are available within the file.1. Turn on the visibility of the layer titled: "Stock Artwork"2. Use the Select Tool (F1) to select the object you want to use.3. Press Ctrl + C to copy4. Select the layer you want to paste the object to, then press Ctrl + V5. You can then use the Select Tool (F1) to move and/or scale the object to proper size. See "Snapping" for tips on aligning objects. + Adding custom artNormal graphics can be added into the file, but you must convert thegraphic to a path.1. Copy the graphic from another program. (Usually Right Click > Copy)2. Select the layer you want to paste the graphic to, then press Ctrl + V-or-1. File > Import (Ctrl + I) and select the file you want to import.2. Select the Embed option and click OK.3. Select the graphic, and goto Path > Trace Bitmap (Shift + Alt + B)4. Make sure your graphic is selected, then select a Scan option andclick OK. The graphic will be traced, and will overlay the original object.5. Move the new object into position and delete the original image. + + + SnappingEnabling snapping allows you to snap objects at various reference points of other objects which will allow you to quickly and accurately align objects to each other.Make sure Snap Controls Toolbar is displayed on the right hand side. (View > Show/Hide > Snap Controls Bar)Make sure Snapping is enabled (Toggle with "%")Hover over the various points to see what snappingare available. You can turn each one on/off.Drag objects over other objects to snap. You may need to zoom in or out to snap to certain objects. Turning off irrelevant points will also make it easier to snap. + + Copy and PasteCtrl + C: Copy objectCtrl + V: Paste objectCtrl + Alt + V: Paste in placeShift + Ctrl + V: Paste style + Guide LinesYou can use Guides to help align objects. Click and drag from the rulerson the edge of the document.Enable snapping to guides in the Snap Control Bar You can Show/Hide Guides by going to View > Guides + + + WASD Keyboards 104/87-Key Design Template + IMPORTANT: + Before saving and uploading your file: select all of your text; go to Path > Object to Path (Ctrl+Shift+C) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/keyboards/ergodox/keymaps/familiar/familiar_stick.svg b/keyboards/ergodox/keymaps/familiar/familiar_stick.svg new file mode 100644 index 0000000000..18ec937e28 --- /dev/null +++ b/keyboards/ergodox/keymaps/familiar/familiar_stick.svg @@ -0,0 +1,7592 @@ + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PanningHold down Scroll Wheel to pan with mouseUp/Down - Scroll WheelLeft/Right - Shift + Scroll WheelZooming- Ctrl + Scroll View to zoom in/out- Press 1, 2, 4, or 5 for preset zoom views.Zoom Tool (F3) :- Left click to zoom in- Right click to zoom out + + + Keyboards + + + + + + + + + To avoid delays and errors in your order you must convert all of your fonts and text to vector data + This layout is used for your legends only. Keycap colors need to be defined with the online designer tool.Please check out our online tutorials at support.wasdkeyboards.comfor help and instructions regarding layout creation. + + + Quick Start:1. Enable Layers by going to: Layer > Layers (Ctrl + Shift + L) *The layers window can be expanded by dragging the area under the opacity slider.2. Use the Eyeball Icons to toggle visibility for preset layers3. Use the Select tool to move and scale objects (F1)4. Use the Text Tool to add and edit text (F8) + + Managing Layers1. Enable Layers by pressing Ctrl + Shift + L2. The Layer window can be enlarged by dragging thearea under the Opacity slider.3. Use the Eyeball Icon to toggle layer visibility.4. Use the Lock Icon to toggle the ability to edit layer.5. To add a layer, use the button from Layers panel. + + + Manipulating ObjectsThe Select Tool (F1) allows you to select and move,scale, and delete objects. Select an object, then drag the object to move it. You can drag the arrows around the object to scale it.Holding Ctrl while moving will keep the object locked onthe same X or Y axis. Holding Ctrl while scaling will keep the size ratio locked. + Inkscape Tutorial + FAQ (Frequently Asked Questions)I can't see any layers, I just see one layer or no layers when I open the layers panel.This happens when you drag and drop the layout file into Inkscape which "imports" it instead of opening it. Please close your Inkscape window, go back to the original file, right click it and choose "edit with Inkscape". What are the grids for on the layout? Can I place objects outside the grid?Yes. The grids are for reference only. You can snap the grids to use our standard margins. You can print all the way to the edge of the frame. There is a +/-0.01" tolerance, so we suggest that you stay within the grids when possible.Can I put a graphic that spans over multiple keys? Yes. Large images will be cropped to the top face of the keys. The areas in between the keys will not be printed.Advanced users can use a clipping mask to get a better idea of what the final image will look like.How can I change the color of the printing?We have tutorials in our support center that can show you how to add colors to your text and images.Go to support.wasdkeyboards.comI want to edit the Mac-style layouts, but the text is not editable.The Mac layout text is not editable since the font is not common. The font used is VAG Rounded-Light. + Adding text1. Click on the Text Tool (F8)2. Click on the area where you want add text3. Type your text4. Font and size and can changed in the text toolbar5. Use the Select Tool (F1) to reposition thetext if necessary. + + + + Editing font type and size1. Use the Select Tool (F1) select the objects youwant to edit.2. Click on the Text Tool (F8)3. Use the text toolbar to change font type and text size + + + + + Editing textUse the Select Tool (F1) and double click a singletext object.-or-Use the Text Tool (F8) and click on a single text object. + + + + Adding stock artworkCommonly used icons and symbols are available within the file.1. Turn on the visibility of the layer titled: "Stock Artwork"2. Use the Select Tool (F1) to select the object you want to use.3. Press Ctrl + C to copy4. Select the layer you want to paste the object to, then press Ctrl + V5. You can then use the Select Tool (F1) to move and/or scale the object to proper size. See "Snapping" for tips on aligning objects. + Adding custom artNormal graphics can be added into the file, but you must convert thegraphic to a path.1. Copy the graphic from another program. (Usually Right Click > Copy)2. Select the layer you want to paste the graphic to, then press Ctrl + V-or-1. File > Import (Ctrl + I) and select the file you want to import.2. Select the Embed option and click OK.3. Select the graphic, and goto Path > Trace Bitmap (Shift + Alt + B)4. Make sure your graphic is selected, then select a Scan option andclick OK. The graphic will be traced, and will overlay the original object.5. Move the new object into position and delete the original image. + + + SnappingEnabling snapping allows you to snap objects at various reference points of other objects which will allow you to quickly and accurately align objects to each other.Make sure Snap Controls Toolbar is displayed on the right hand side. (View > Show/Hide > Snap Controls Bar)Make sure Snapping is enabled (Toggle with "%")Hover over the various points to see what snappingare available. You can turn each one on/off.Drag objects over other objects to snap. You may need to zoom in or out to snap to certain objects. Turning off irrelevant points will also make it easier to snap. + + Copy and PasteCtrl + C: Copy objectCtrl + V: Paste objectCtrl + Alt + V: Paste in placeShift + Ctrl + V: Paste style + Guide LinesYou can use Guides to help align objects. Click and drag from the rulerson the edge of the document.Enable snapping to guides in the Snap Control Bar You can Show/Hide Guides by going to View > Guides + + + WASD Keyboards 104/87-Key Design Template + IMPORTANT: + Before saving and uploading your file: select all of your text; go to Path > Object to Path (Ctrl+Shift+C) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/keyboards/ergodox/keymaps/familiar/hntr.json b/keyboards/ergodox/keymaps/familiar/hntr.json new file mode 100644 index 0000000000..c1aae552be --- /dev/null +++ b/keyboards/ergodox/keymaps/familiar/hntr.json @@ -0,0 +1,634 @@ +[ + { + "name": "Infinity ErgoDox - H.NT.R" + }, + [ + { + "x": 3.5, + "c": "#e3e2dd", + "t": "#525554", + "fa": [ + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 5 + ] + }, + "\n\n#\nF3\n\n\n\n\n\n3", + { + "x": 10.5, + "fa": [ + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 5 + ] + }, + "*\nF8\n\n\n\n\n\n\n\n8" + ], + [ + { + "y": -0.875, + "x": 2.5 + }, + "\n\n@\nF2\n\n\n\n\n\n2", + { + "x": 1 + }, + "\n\n$\nF4\n\n\n\n\n\n4", + { + "x": 8.5 + }, + "&\nF7\n\n\n\n\n\n\n\n7", + { + "x": 1 + }, + "(\nF9\n\n\n\n\n\n\n\n9" + ], + [ + { + "y": -0.875, + "x": 5.5 + }, + "\n\n%\nF5\n\n\n\n\n\n5", + "\n\n\nF11", + { + "x": 4.5 + }, + "\nF12", + "^\nF6\n\n\n\n\n\n\n\n6" + ], + [ + { + "y": -0.875, + "c": "#525554", + "t": "#e3e2dd", + "a": 7, + "f": 3, + "w": 1.5 + }, + "CYCLE LAYER", + { + "c": "#e3e2dd", + "t": "#525554", + "a": 4, + "f": 3 + }, + "\n\n!\nF1\n\n\n\n\n\n1", + { + "x": 14.5, + "f": 3 + }, + ")\nF10\n\n\n/\n\n\n\n\n0", + { + "c": "#525554", + "t": "#e3e2dd", + "a": 7, + "f": 3, + "w": 1.5 + }, + "CYCLE LAYER" + ], + [ + { + "y": -0.375, + "x": 3.5, + "c": "#c0472c", + "a": 4, + "fa": [ + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 5 + ] + }, + "\n\n\nPG UP\n▲\n\n\n\ne\nO", + { + "x": 10.5, + "c": "#e3e2dd", + "t": "#525554" + }, + "\n]\n\n\n5\n\n\n\ni\nL" + ], + [ + { + "y": -0.875, + "x": 2.5, + "a": 7, + "fa": [ + 5 + ] + }, + "W", + { + "x": 1, + "a": 5, + "fa": [ + 1, + 0, + 0, + 0, + 0, + 0, + 5 + ] + }, + "r\n\n\n\n\n\nU", + { + "x": 8.5, + "a": 4, + "fa": [ + 1, + 1, + 0, + 0, + 0, + 0, + 5, + 0, + 1, + 5 + ] + }, + "\n[\n\n\n4\n\n\n\nu\nD", + { + "x": 1 + }, + "\n?\n\n\n6\n\n\n\no\nG" + ], + [ + { + "y": -0.875, + "x": 5.5, + "a": 5 + }, + "t\n\n\n\n\n\nJ", + { + "a": 7, + "h": 1.5 + }, + "", + { + "x": 4.5, + "h": 1.5 + }, + "", + { + "a": 5 + }, + "y\n\n\n\n\n\nK" + ], + [ + { + "y": -0.875, + "c": "#525554", + "t": "#e3e2dd", + "a": 7, + "f": 3, + "w": 1.5 + }, + "DELETE", + { + "c": "#e3e2dd", + "t": "#525554", + "fa": [ + 5 + ] + }, + "Q", + { + "x": 14.5, + "a": 4, + "fa": [ + 5, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 5 + ] + }, + "\n|\n\n\n×\n\n\n\n\nP", + { + "c": "#525554", + "t": "#e3e2dd", + "a": 7, + "f": 3, + "w": 1.5 + }, + "⌫" + ], + [ + { + "y": -0.375, + "x": 3.5, + "c": "#c0472c", + "a": 4, + "fa": [ + 5, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 5 + ] + }, + "\n\n\nPG DN\n▼\n\n\n\nd\nE", + { + "x": 10.5, + "c": "#e3e2dd", + "t": "#525554" + }, + "\n)\n\n\n2\n\n\n\nk\nN" + ], + [ + { + "y": -0.875, + "x": 2.5, + "c": "#c0472c", + "t": "#e3e2dd" + }, + "\n\n\nHOME\n◀\n\n\n\ns\nI", + { + "x": 1 + }, + "\n\n\nEND\n▶\n\n\n\nf\nA", + { + "x": 8.5, + "c": "#e3e2dd", + "t": "#525554" + }, + "\n(\n\n\n1\n\n\n\nj\nH", + { + "x": 1 + }, + "\n/\n\n\n3\n\n\n\nl\nT" + ], + [ + { + "y": -0.875, + "x": 5.5, + "fa": [ + 5, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 5 + ] + }, + "\n\n:\n\n\n\n\n\ng\n;", + { + "x": 6.5, + "a": 5, + "fa": [ + 1, + 1, + 1, + 1, + 0, + 0, + 5 + ] + }, + "h\n\n\n\n\n\nF" + ], + [ + { + "y": -0.875, + "c": "#525554", + "t": "#e3e2dd", + "a": 7, + "f": 3, + "w": 1.5 + }, + "TAB", + { + "c": "#e3e2dd", + "t": "#525554", + "a": 5 + }, + "a\n\n\n\n\n\nS", + { + "x": 14.5, + "a": 4, + "fa": [ + 1, + 1, + 1, + 1, + 0, + 0, + 5, + 0, + 1, + 5 + ] + }, + "\n\\\n\n\n-\n\n\n\n;\nR", + { + "c": "#525554", + "t": "#e3e2dd", + "a": 7, + "f": 3, + "w": 1.5 + }, + "ENTER" + ], + [ + { + "y": -0.625, + "x": 6.5, + "c": "#e3e2dd", + "t": "#525554", + "h": 1.5 + }, + "", + { + "x": 4.5, + "h": 1.5 + }, + "" + ], + [ + { + "y": -0.75, + "x": 3.5, + "a": 4 + }, + "\n\n\n-\n\n\n\n\n\nC", + { + "x": 10.5 + }, + "<\n}\n\n\n.\n\n\n\n\n," + ], + [ + { + "y": -0.875, + "x": 2.5 + }, + "\n\n\n=\n\n\n\n\n\nX", + { + "x": 1 + }, + "\n\n\n—\n\n\n\n\n\nV", + { + "x": 8.5 + }, + "\n{\n\n\n0\n\n\n\n\nM", + { + "x": 1 + }, + ">\n~\n\n\nENTER\n\n\n\n\n." + ], + [ + { + "y": -0.875, + "x": 5.5 + }, + "\n\n\n_\n\n\n\n\nb\nY", + { + "x": 6.5, + "a": 5 + }, + "n\n\n\n\n\n\nB" + ], + [ + { + "y": -0.875, + "c": "#525554", + "t": "#e3e2dd", + "a": 7, + "f": 3, + "w": 1.5 + }, + "ALT", + { + "c": "#e3e2dd", + "t": "#525554", + "a": 4 + }, + "\n\n\n+\n\n\n\n\n\nZ", + { + "x": 14.5 + }, + "\"\n`\n\n\n+\n\n\n\n/\n'", + { + "c": "#525554", + "t": "#e3e2dd", + "a": 7, + "f": 3, + "w": 1.5 + }, + "ALT" + ], + [ + { + "y": -0.375, + "x": 3.5, + "f": 3 + }, + "END", + { + "x": 10.5, + "f": 3 + }, + "PAGE UP" + ], + [ + { + "y": -0.875, + "x": 2.5, + "f": 3 + }, + "HOME", + { + "x": 1, + "f": 3 + }, + "🔒2", + { + "x": 8.5, + "f": 3 + }, + "🔒3", + { + "x": 1, + "f": 3 + }, + "PAGE DOWN" + ], + [ + { + "y": -0.75, + "x": 0.5, + "c": "#0075ad", + "a": 4, + "fa": [ + 1, + 1, + 1, + 1, + 0, + 0, + 5, + 0, + 1, + 9 + ] + }, + "\n\n\nFLASH\n\n\n\n\n\nΑ", + { + "c": "#525554", + "a": 7, + "f": 3 + }, + "MENU", + { + "x": 14.5, + "f": 3 + }, + "MENU", + { + "c": "#0075ad", + "a": 4, + "f": 3 + }, + "\nFLASH\n\n\n\n\n\n\n\nΩ" + ], + [ + { + "y": 1.125, + "c": "#c0472c", + "fa": [ + 1, + 1, + 1, + 1, + 0, + 0, + 5, + 0, + 1, + 5 + ], + "w": 6 + }, + "SHIFTED\nLAYER 4\nSHIFTED\nLAYER 4\nLAYER 2 (LEFT) / LAYER 3 (RIGHT)\n\n\n\nqwerty (layer 1)\nMAIN LAYER" + ], + [ + { + "r": 30, + "rx": 6.5, + "ry": 4.25, + "y": -1, + "x": 1, + "c": "#525554", + "fa": [ + 1, + 1, + 1, + 1 + ] + }, + "\n\n\n🔅-\n\n\n\n\n\n🔉", + "\n\n\n🔆+\n\n\n\n\n\n🔊" + ], + [ + { + "a": 7, + "f": 3, + "h": 2 + }, + "SHIFT", + { + "f": 3, + "h": 2 + }, + "ƒ4", + { + "f": 3 + }, + "🔒1" + ], + [ + { + "x": 2, + "f": 3 + }, + "CTRL" + ], + [ + { + "r": -30, + "rx": 13, + "y": -1, + "x": -3, + "a": 4, + "f": 3 + }, + "\n🔅-\n\n\n\n\n\n\n\n🔅-", + { + "f": 3 + }, + "\n🔆+\n\n\n\n\n\n\n\n🔆+" + ], + [ + { + "x": -3, + "a": 7, + "f": 3 + }, + "🔒1", + { + "f": 3, + "h": 2 + }, + "ƒ4", + { + "c": "#e3e2dd", + "t": "#525554", + "h": 2 + }, + "" + ], + [ + { + "x": -3, + "c": "#525554", + "t": "#e3e2dd", + "f": 3 + }, + "CTRL" + ] +] \ No newline at end of file diff --git a/keyboards/ergodox/keymaps/familiar/hntr.png b/keyboards/ergodox/keymaps/familiar/hntr.png new file mode 100644 index 0000000000000000000000000000000000000000..519d152df5817293c100034d04ab31a6d6fd9cd5 GIT binary patch literal 77473 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 Date: Thu, 23 Feb 2017 22:24:32 -0600 Subject: [PATCH 030/117] initial layer of familiar layout) --- keyboards/ergodox/keymaps/familiar/keymap.c | 104 +++++++++++++------- 1 file changed, 67 insertions(+), 37 deletions(-) diff --git a/keyboards/ergodox/keymaps/familiar/keymap.c b/keyboards/ergodox/keymaps/familiar/keymap.c index 7cd81a87c5..3688eb1fce 100644 --- a/keyboards/ergodox/keymaps/familiar/keymap.c +++ b/keyboards/ergodox/keymaps/familiar/keymap.c @@ -3,42 +3,82 @@ #include "action_layer.h" #include "version.h" - -#include "keymap_german.h" - -#include "keymap_nordic.h" - - +#define BASE 0 // default layer +//#define FUNC 1 // function, media, arrow keys +//#define NUMP 2 // numpad +//#define INTL 3 // international symbols enum custom_keycodes { PLACEHOLDER = SAFE_RANGE, // can always be here EPRM, VRSN, - RGB_SLD, - + RGB_SLD }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - [0] = KEYMAP(KC_ESCAPE,KC_1,KC_2,KC_3,KC_4,KC_5,KC_MINUS,KC_DELETE,KC_Q,KC_W,KC_E,KC_R,KC_T,KC_HOME,KC_TAB,KC_A,KC_S,KC_D,KC_F,KC_G,KC_LSPO,KC_Z,KC_X,KC_C,KC_V,KC_B,KC_END,CTL_T(KC_LGUI),KC_APPLICATION,KC_GRAVE,KC_QUOTE,KC_BSLASH,KC_AUDIO_VOL_DOWN,KC_AUDIO_VOL_UP,KC_AUDIO_MUTE,ALT_T(KC_SPACE),MO(1),KC_RALT,KC_KP_PLUS,KC_6,KC_7,KC_8,KC_9,KC_0,KC_PSCREEN,KC_PGUP,KC_Y,KC_U,KC_I,KC_O,KC_P,KC_BSPACE,KC_H,KC_J,KC_K,KC_L,KC_SCOLON,KC_ENTER,KC_PGDOWN,KC_N,KC_M,KC_COMMA,KC_DOT,KC_KP_SLASH,KC_RSPC,KC_LBRACKET,KC_RBRACKET,KC_TRANSPARENT,KC_APPLICATION,CTL_T(KC_RGUI),KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_RALT,MO(1),ALT_T(KC_SPACE)), - - [1] = KEYMAP(M(0),KC_F1,KC_F2,KC_F3,KC_F4,KC_F5,KC_F11,KC_PAUSE,KC_TRANSPARENT,KC_TRANSPARENT,KC_UP,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_LEFT,KC_DOWN,KC_RIGHT,KC_TRANSPARENT,KC_TRANSPARENT,KC_MEDIA_PREV_TRACK,KC_MEDIA_STOP,KC_MEDIA_PLAY_PAUSE,KC_MEDIA_NEXT_TRACK,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_F12,KC_F6,KC_F7,KC_F8,KC_F9,KC_F10,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_INSERT,KC_LEFT,KC_DOWN,KC_UP,KC_RIGHT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT,KC_TRANSPARENT), - +/* Keymap 0: Basic layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | 5 | - | | = | 6 | 7 | 8 | 9 | 0 | SYSREQ | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | DEL | Q | W | E | R | T | HOME | | PGUP | Y | U | I | O | P | BKSP | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | TAB | A | S | D | F | G |------| |------| H | J | K | L | ; | ENTER | + * |--------+------+------+------+------+------| END | | PGDN |------+------+------+------+------+--------| + * | (/LSFT | Z | X | C | V | B | | | | N | M | , | . | / | )/RSFT | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |LGUI/LCTRL|MENU| ` | ' | CAPS | | [ | ] | \ |MENU|RGUI/RCTRL| + * `------------------------------------' `------------------------------------' + * ,-------------. ,-------------. + * | VOL- | VOL+ | | BRT- | BRT+ | + * ,------|------|------| |------+------+------. + * | ALT/ | | MUTE | | NUM | | ALT/ | + * | SPC | LAY1 |------| |------| LAY1 | SPC | + * | | | LAY3 | | LAY2 | | | + * `--------------------' `--------------------' + */ +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* +[BASE] = KEYMAP( // layer 0 : default + // left hand + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, + KC_DEL, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_HOME, + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_END, + KC_LCTL, KC_LGUI,KC_GRV, KC_QUOT,KC_CAPS, + KC_VOLD, KC_VOLU, + KC_MUTE, + ALT_T(KC_SPC), MO(BASE), MO(BASE), + // right hand + KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_SYSREQ, + KC_PGUP, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENTER, + KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, + KC_LBRC, KC_RBRC, KC_BSLS, KC_RGUI, KC_RCTL, + KC_VOLD, KC_VOLU, + KC_NLCK, + TT(BASE), MO(BASE), ALT_T(KC_SPC) + ), }; const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_LAYER_TAP_TOGGLE(1) + [1] = ACTION_LAYER_TAP_TOGGLE(BASE) // FN1 - Momentary Layer 1 (Function Keys) }; -// leaving this in place for compatibilty with old keymaps cloned and re-compiled. const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { + // MACRODOWN only works in this function switch(id) { case 0: if (record->event.pressed) { SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); } break; + case 1: + if (record->event.pressed) { // For resetting EEPROM + eeconfig_init(); + } + break; } return MACRO_NONE; }; @@ -60,15 +100,23 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { break; case RGB_SLD: if (record->event.pressed) { - rgblight_mode(1); + #ifdef RGBLIGHT_ENABLE + rgblight_mode(1); + #endif } return false; break; - } return true; } +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + +}; + + +// Runs constantly in the background, in a loop. void matrix_scan_user(void) { uint8_t layer = biton32(layer_state); @@ -78,33 +126,15 @@ void matrix_scan_user(void) { ergodox_right_led_2_off(); ergodox_right_led_3_off(); switch (layer) { + // TODO: Make this relevant to the ErgoDox EZ. case 1: ergodox_right_led_1_on(); break; case 2: ergodox_right_led_2_on(); break; - case 3: - ergodox_right_led_3_on(); - break; - case 4: - ergodox_right_led_1_on(); - ergodox_right_led_2_on(); - break; - case 5: - ergodox_right_led_1_on(); - ergodox_right_led_3_on(); - break; - case 6: - ergodox_right_led_2_on(); - ergodox_right_led_3_on(); - break; - case 7: - ergodox_right_led_1_on(); - ergodox_right_led_2_on(); - ergodox_right_led_3_on(); - break; default: + // none break; } From ebc6948e969f0785619a4caa6e0a9574388a6dab Mon Sep 17 00:00:00 2001 From: nstickney Date: Fri, 24 Feb 2017 17:11:19 -0600 Subject: [PATCH 031/117] first two layers of ErgoDox Familiar completeC --- keyboards/ergodox/keymaps/familiar/keymap.c | 68 +++++++++++++++++---- 1 file changed, 55 insertions(+), 13 deletions(-) diff --git a/keyboards/ergodox/keymaps/familiar/keymap.c b/keyboards/ergodox/keymaps/familiar/keymap.c index 3688eb1fce..e68e77f79c 100644 --- a/keyboards/ergodox/keymaps/familiar/keymap.c +++ b/keyboards/ergodox/keymaps/familiar/keymap.c @@ -4,7 +4,7 @@ #include "version.h" #define BASE 0 // default layer -//#define FUNC 1 // function, media, arrow keys +#define ARRW 1 // function, media, arrow keys //#define NUMP 2 // numpad //#define INTL 3 // international symbols @@ -16,53 +16,95 @@ enum custom_keycodes { }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* /* Keymap 0: Basic layer * * ,--------------------------------------------------. ,--------------------------------------------------. * | ESC | 1 | 2 | 3 | 4 | 5 | - | | = | 6 | 7 | 8 | 9 | 0 | SYSREQ | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | DEL | Q | W | E | R | T | HOME | | PGUP | Y | U | I | O | P | BKSP | + * | DEL | Q | W | E | R | T | HOME | | PGUP | Y | U | I | O | P | BKSP | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * | TAB | A | S | D | F | G |------| |------| H | J | K | L | ; | ENTER | * |--------+------+------+------+------+------| END | | PGDN |------+------+------+------+------+--------| * | (/LSFT | Z | X | C | V | B | | | | N | M | , | . | / | )/RSFT | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * |LGUI/LCTRL|MENU| ` | ' | CAPS | | [ | ] | \ |MENU|RGUI/RCTRL| + * | LCTRL | LGUI | ` | ' |PRTSCR| | [ | ] | \ | RGUI | RCTRL | * `------------------------------------' `------------------------------------' * ,-------------. ,-------------. * | VOL- | VOL+ | | BRT- | BRT+ | * ,------|------|------| |------+------+------. - * | ALT/ | | MUTE | | NUM | | ALT/ | + * | ALT/ | | MUTE | | NUMLK| | ALT/ | * | SPC | LAY1 |------| |------| LAY1 | SPC | - * | | | LAY3 | | LAY2 | | | + * | | | LAY3 | |TTLAY2| | | * `--------------------' `--------------------' */ -// If it accepts an argument (i.e, is a function), it doesn't need KC_. -// Otherwise, it needs KC_* [BASE] = KEYMAP( // layer 0 : default // left hand KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, KC_DEL, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_HOME, KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_END, - KC_LCTL, KC_LGUI,KC_GRV, KC_QUOT,KC_CAPS, - KC_VOLD, KC_VOLU, + KC_LCTL, KC_LGUI,KC_GRV, KC_QUOT,KC_PSCR, + KC_VOLD, KC_VOLU, KC_MUTE, - ALT_T(KC_SPC), MO(BASE), MO(BASE), + ALT_T(KC_SPC), MO(ARRW), TT(BASE), // right hand KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_SYSREQ, KC_PGUP, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENTER, KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, KC_LBRC, KC_RBRC, KC_BSLS, KC_RGUI, KC_RCTL, - KC_VOLD, KC_VOLU, + KC_VOLD, KC_VOLU, KC_NLCK, - TT(BASE), MO(BASE), ALT_T(KC_SPC) + TT(BASE), MO(ARRW), ALT_T(KC_SPC) + ), + +/* Keymap 0: Basic layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | UP | | | | | | | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | LEFT | DOWN |RIGHT | |------| |------| LEFT | DOWN | UP | RIGHT| | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | |M_PREV|M_STOP|M_PLPS|M_NEXT| | | | | | | | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `------------------------------------' `------------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +[ARRW] = KEYMAP(// layer 1 : functions and arrows + // left hand + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, + KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS ), }; const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_LAYER_TAP_TOGGLE(BASE) // FN1 - Momentary Layer 1 (Function Keys) + [1] = ACTION_LAYER_TAP_TOGGLE(ARRW) // FN1 - Momentary Layer 1 (Function Keys) }; const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) From b69b214d524bb658152c5b2491cb270b8464aeb4 Mon Sep 17 00:00:00 2001 From: nstickney Date: Sat, 25 Feb 2017 22:04:21 -0600 Subject: [PATCH 032/117] making numbers more familiar --- keyboards/ergodox/keymaps/familiar/keymap.c | 226 ++++++++++++-------- 1 file changed, 132 insertions(+), 94 deletions(-) diff --git a/keyboards/ergodox/keymaps/familiar/keymap.c b/keyboards/ergodox/keymaps/familiar/keymap.c index e68e77f79c..e79e961092 100644 --- a/keyboards/ergodox/keymaps/familiar/keymap.c +++ b/keyboards/ergodox/keymaps/familiar/keymap.c @@ -5,8 +5,10 @@ #define BASE 0 // default layer #define ARRW 1 // function, media, arrow keys -//#define NUMP 2 // numpad -//#define INTL 3 // international symbols +#define NUMP 2 // numpad +#define INTL 3 // international symbols + +#define _______ KC_TRNS // Make the layouts easier to read enum custom_keycodes { PLACEHOLDER = SAFE_RANGE, // can always be here @@ -18,58 +20,100 @@ enum custom_keycodes { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // If it accepts an argument (i.e, is a function), it doesn't need KC_. // Otherwise, it needs KC_* -/* Keymap 0: Basic layer +/* layer 0 : default * * ,--------------------------------------------------. ,--------------------------------------------------. - * | ESC | 1 | 2 | 3 | 4 | 5 | - | | = | 6 | 7 | 8 | 9 | 0 | SYSREQ | + * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 0 | - | = | BCKSPC | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | DEL | Q | W | E | R | T | HOME | | PGUP | Y | U | I | O | P | BKSP | + * | TAB | Q | W | E | R | T | HOME | | PGUP | Y | U | I | O | P | DELETE | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | TAB | A | S | D | F | G |------| |------| H | J | K | L | ; | ENTER | + * | INSERT | A | S | D | F | G |------| |------| H | J | K | L | ; | ENTER | * |--------+------+------+------+------+------| END | | PGDN |------+------+------+------+------+--------| * | (/LSFT | Z | X | C | V | B | | | | N | M | , | . | / | )/RSFT | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | LCTRL | LGUI | ` | ' |PRTSCR| | [ | ] | \ | RGUI | RCTRL | + * | LCTRL | LGUI | | ' |PRTSCR| | [ | ] | \ | RGUI | RCTRL | * `------------------------------------' `------------------------------------' * ,-------------. ,-------------. * | VOL- | VOL+ | | BRT- | BRT+ | * ,------|------|------| |------+------+------. * | ALT/ | | MUTE | | NUMLK| | ALT/ | * | SPC | LAY1 |------| |------| LAY1 | SPC | - * | | | LAY3 | |TTLAY2| | | + * | | | LAY3 | | LAY2 | | | * `--------------------' `--------------------' */ -[BASE] = KEYMAP( // layer 0 : default +[BASE] = KEYMAP( // left hand - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, - KC_DEL, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_HOME, - KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, - KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_END, - KC_LCTL, KC_LGUI,KC_GRV, KC_QUOT,KC_PSCR, - KC_VOLD, KC_VOLU, - KC_MUTE, - ALT_T(KC_SPC), MO(ARRW), TT(BASE), + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_HOME, + KC_INS, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_END, + KC_LCTL, KC_LGUI, _______, KC_QUOT, KC_PSCR, + KC_VOLD, KC_VOLU, + KC_MUTE, + ALT_T(KC_SPC), MO(ARRW), TG(INTL), // right hand - KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_SYSREQ, - KC_PGUP, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, - KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENTER, - KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, - KC_LBRC, KC_RBRC, KC_BSLS, KC_RGUI, KC_RCTL, + KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + KC_PGUP, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL, + KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENTER, + KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, + KC_LBRC, KC_RBRC, KC_BSLS, KC_RGUI, KC_RCTL, KC_VOLD, KC_VOLU, KC_NLCK, - TT(BASE), MO(ARRW), ALT_T(KC_SPC) + TG(NUMP), MO(ARRW), ALT_T(KC_SPC) ), -/* Keymap 0: Basic layer +/* layer 1 : functions and arrows * * ,--------------------------------------------------. ,--------------------------------------------------. - * | | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | | + * | SYSREQ | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | PAUSE | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * | | | | UP | | | | | | | | | | | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * | | | LEFT | DOWN |RIGHT | |------| |------| LEFT | DOWN | UP | RIGHT| | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | |M_PREV|M_STOP|M_PLPS|M_NEXT| | | | | | | | | | | + * | |M_PREV|M_STOP|M_PLPS|M_NEXT| | | | | | | | | UP | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | LEFT | DOWN | RIGHT | + * `------------------------------------' `------------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +[ARRW] = KEYMAP( + // left hand + KC_SYSREQ, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, + _______, _______, _______, KC_UP, _______, _______, _______, + _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, + _______, _______, + _______, + _______, _______, _______, + // right hand + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PAUSE, + _______, _______, _______, _______, _______, _______, _______, + KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, + _______, _______, _______, _______, _______, KC_UP, _______, + _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, + _______, _______, + _______, + _______, _______, _______ + ), + +/* layer 2 : numberpad + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | |------| |------| | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' * | | | | | | | | | | | | * `------------------------------------' `------------------------------------' @@ -81,83 +125,75 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | * `--------------------' `--------------------' */ -[ARRW] = KEYMAP(// layer 1 : functions and arrows +[NUMP] = KEYMAP( // left hand - KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, - KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, + _______, _______, + _______, + _______, _______, _______, // right hand - KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, + _______, _______, + _______, + _______, _______, _______ + ), + +/* layer 3: International symbols, etc + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | |------| |------| | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `------------------------------------' `------------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +[INTL] = KEYMAP( + // left hand + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, + _______, _______, + _______, + _______, _______, _______, + // right hand + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, + _______, _______, + _______, + _______, _______, _______ ), }; -const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_LAYER_TAP_TOGGLE(ARRW) // FN1 - Momentary Layer 1 (Function Keys) -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - if (record->event.pressed) { - SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); - } - break; - case 1: - if (record->event.pressed) { // For resetting EEPROM - eeconfig_init(); - } - break; - } - return MACRO_NONE; -}; - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - // dynamically generate these. - case EPRM: - if (record->event.pressed) { - eeconfig_init(); - } - return false; - break; - case VRSN: - if (record->event.pressed) { - SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); - } - return false; - break; - case RGB_SLD: - if (record->event.pressed) { - #ifdef RGBLIGHT_ENABLE - rgblight_mode(1); - #endif - } - return false; - break; - } - return true; -} - // Runs just one time when the keyboard initializes. void matrix_init_user(void) { }; - // Runs constantly in the background, in a loop. void matrix_scan_user(void) { @@ -168,13 +204,15 @@ void matrix_scan_user(void) { ergodox_right_led_2_off(); ergodox_right_led_3_off(); switch (layer) { - // TODO: Make this relevant to the ErgoDox EZ. case 1: ergodox_right_led_1_on(); break; case 2: ergodox_right_led_2_on(); break; + case 3: + ergodox_right_led_3_on(); + break; default: // none break; From 871ac5058acb413a3393a54cb5b33f0b52c630cf Mon Sep 17 00:00:00 2001 From: Xyverz Date: Sun, 26 Feb 2017 19:45:57 -0800 Subject: [PATCH 033/117] Minor changes to the keymap: Moved thumb-cluster ESC to Media and Keypad layers --- keyboards/kinesis/keymaps/xyverz/keymap.c | 30 +++++++++++------------ 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/keyboards/kinesis/keymaps/xyverz/keymap.c b/keyboards/kinesis/keymaps/xyverz/keymap.c index f3184c140d..39b835b53e 100644 --- a/keyboards/kinesis/keymaps/xyverz/keymap.c +++ b/keyboards/kinesis/keymaps/xyverz/keymap.c @@ -46,7 +46,7 @@ extern keymap_config_t keymap_config; | ` | INS | Left | Rght | | Up | Dn | / | = | `---------------------------' `---------------------------' ,--------------.,--------------. - |Ctr/ESC| LAlt || RGUI |Ctr/ESC| + | LCtl | LAlt || RGUI | RCtl | ,------|-------|------||------+-------+-------. | | Del | Home || PgUp | Enter | | | BkSp | / |------||------| / | Space | @@ -66,7 +66,7 @@ extern keymap_config_t keymap_config; | ` | INS | Left | Rght | | Up | Dn | [ | ] | `---------------------------' `---------------------------' ,--------------.,--------------. - |Ctr/ESC| LAlt || RGUI |Ctr/ESC| + | LCtl | LAlt || RGUI | RCtl | ,------|-------|------||------+-------+-------. | | Del | Home || PgUp | Enter | | | BkSp | / |------||------| / | Space | @@ -86,7 +86,7 @@ extern keymap_config_t keymap_config; | ` | INS | Left | Rght | | Up | Dn | [ | ] | `---------------------------' `---------------------------' ,--------------.,--------------. - |Ctr/ESC| LAlt || RGUI |Ctr/ESC| + | LCtl | LAlt || RGUI | RCtl | ,------|-------|------||------+-------+-------. | | Del | Home || PgUp | Enter | | | BkSp | / |------||------| / | Space | @@ -106,7 +106,7 @@ extern keymap_config_t keymap_config; | | | | | | | | | | `---------------------------' `---------------------------' ,-------------.,-------------. - | | || | | + | ESC | || | ESC | ,------|------|------||------+------+------. | | | || | | | | | |------||------| | | @@ -126,7 +126,7 @@ extern keymap_config_t keymap_config; | | | | | | | | KP . |KP Ent| | `---------------------------' `----------------------------------' ,-------------.,-------------. - | | || | | + | ESC | || | ESC | ,------|------|------||------+------+------. | | | || | | | | | |------||------| | KP 0 | @@ -145,7 +145,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_GRV, KC_INS, KC_LEFT, KC_RGHT, // Left Thumb - CTL_T(KC_ESC), KC_LALT, + KC_LCTL, KC_LALT, KC_HOME, KC_BSPC, LT(_MD, KC_DEL), KC_END, @@ -157,7 +157,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_UP, KC_DOWN, KC_SLSH, KC_EQL, // Right Thumb - KC_RGUI, CTL_T(KC_ESC), + KC_RGUI, KC_RCTL, KC_PGUP, KC_PGDN, LT(_KP, KC_ENT), KC_SPC ), @@ -171,7 +171,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_GRV, KC_INS, KC_LEFT, KC_RGHT, // Left Thumb - CTL_T(KC_ESC), KC_LALT, + KC_LCTL, KC_LALT, KC_HOME, KC_BSPC, LT(_MD, KC_DEL), KC_END, @@ -183,7 +183,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, // Right Thumb - KC_RGUI, CTL_T(KC_ESC), + KC_RGUI, KC_RCTL, KC_PGUP, KC_PGDN, LT(_KP, KC_ENT), KC_SPC ), @@ -197,7 +197,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_GRV, KC_INS, KC_LEFT, KC_RGHT, // Left Thumb - CTL_T(KC_ESC), KC_LALT, + KC_LCTL, KC_LALT, KC_HOME, KC_BSPC, LT(_MD, KC_DEL), KC_END, @@ -209,7 +209,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, // Right Thumb - KC_RGUI, CTL_T(KC_ESC), + KC_RGUI, KC_RCTL, KC_PGUP, KC_PGDN, LT(_KP, KC_ENT), KC_SPC ), @@ -223,7 +223,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, // Left Thumb - _______, _______, + KC_ESC, _______, _______, _______, _______, _______, @@ -235,7 +235,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_MSTP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MSEL, _______, _______, _______, _______, _______, // Right Thumb - _______, _______, + _______, KC_ESC, _______, _______, _______, _______ ), @@ -249,7 +249,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, // Left Thumb - _______, _______, + KC_ESC, _______, _______, _______, _______, _______, @@ -261,7 +261,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, KC_P1, KC_P2, KC_P3, KC_PENT, _______, _______, _______, KC_PDOT, KC_PENT, // Right Thumb - _______, _______, + _______, KC_ESC, _______, _______, _______, KC_P0 ) From d91e09f1169ebe7611f41f3a1a80151f18ee9247 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Sun, 26 Feb 2017 19:49:10 -0800 Subject: [PATCH 034/117] Updates to the README.md --- keyboards/kinesis/keymaps/xyverz/readme.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/keyboards/kinesis/keymaps/xyverz/readme.md b/keyboards/kinesis/keymaps/xyverz/readme.md index 11aedec54b..cfd631a5b4 100644 --- a/keyboards/kinesis/keymaps/xyverz/readme.md +++ b/keyboards/kinesis/keymaps/xyverz/readme.md @@ -34,7 +34,7 @@ I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar t | ` | INS | Left | Rght | | Up | Dn | / | = | `---------------------------' `---------------------------' ,--------------.,--------------. - |Ctr/ESC| LAlt || RGUI |Ctr/ESC| + | LCtl | LAlt || RGUI | RCtl | ,------|-------|------||------+-------+-------. | | Del | Home || PgUp | Enter | | | BkSp | / |------||------| / | Space | @@ -55,7 +55,7 @@ I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar t | ` | INS | Left | Rght | | Up | Dn | [ | ] | `---------------------------' `---------------------------' ,--------------.,--------------. - |Ctr/ESC| LAlt || RGUI |Ctr/ESC| + | LCtl | LAlt || RGUI | RCtl | ,------|-------|------||------+-------+-------. | | Del | Home || PgUp | Enter | | | BkSp | / |------||------| / | Space | @@ -76,7 +76,7 @@ I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar t | ` | INS | Left | Rght | | Up | Dn | [ | ] | `---------------------------' `---------------------------' ,--------------.,--------------. - |Ctr/ESC| LAlt || RGUI |Ctr/ESC| + | LCtl | LAlt || RGUI | RCtl | ,------|-------|------||------+-------+-------. | | Del | Home || PgUp | Enter | | | BkSp | / |------||------| / | Space | @@ -97,7 +97,7 @@ I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar t | | | | | | | | | | `---------------------------' `---------------------------' ,-------------.,-------------. - | | || | | + | ESC | || | ESC | ,------|------|------||------+------+------. | | | || | | | | | |------||------| | | @@ -120,7 +120,7 @@ I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar t | | | | | | | | KP . |KP Ent| | `---------------------------' `----------------------------------' ,-------------.,-------------. - | | || | | + | ESC | || | ESC | ,------|------|------||------+------+------. | | | || | | | | | |------||------| | KP 0 | From 68808b22c09c020e33287480fc9c1ed9f42af059 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Fri, 3 Mar 2017 19:27:24 -0800 Subject: [PATCH 035/117] Final tweaks to my Kinesis keymap and readme --- keyboards/kinesis/keymaps/xyverz/keymap.c | 21 ++++++--------------- keyboards/kinesis/keymaps/xyverz/readme.md | 14 +++++++------- 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/keyboards/kinesis/keymaps/xyverz/keymap.c b/keyboards/kinesis/keymaps/xyverz/keymap.c index 39b835b53e..62f47773c7 100644 --- a/keyboards/kinesis/keymaps/xyverz/keymap.c +++ b/keyboards/kinesis/keymaps/xyverz/keymap.c @@ -19,10 +19,6 @@ extern keymap_config_t keymap_config; #define _______ KC_TRNS #define XXXXXXX KC_NO -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - /* Function Keys on All Layers (Keypad toggles): @@ -106,7 +102,7 @@ extern keymap_config_t keymap_config; | | | | | | | | | | `---------------------------' `---------------------------' ,-------------.,-------------. - | ESC | || | ESC | + | | || | | ,------|------|------||------+------+------. | | | || | | | | | |------||------| | | @@ -126,7 +122,7 @@ extern keymap_config_t keymap_config; | | | | | | | | KP . |KP Ent| | `---------------------------' `----------------------------------' ,-------------.,-------------. - | ESC | || | ESC | + | | || | | ,------|------|------||------+------+------. | | | || | | | | | |------||------| | KP 0 | @@ -223,7 +219,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, // Left Thumb - KC_ESC, _______, + _______, _______, _______, _______, _______, _______, @@ -235,7 +231,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_MSTP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MSEL, _______, _______, _______, _______, _______, // Right Thumb - _______, KC_ESC, + _______, _______, _______, _______, _______, _______ ), @@ -249,7 +245,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, // Left Thumb - KC_ESC, _______, + _______, _______, _______, _______, _______, _______, @@ -261,7 +257,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, KC_P1, KC_P2, KC_P3, KC_PENT, _______, _______, _______, KC_PDOT, KC_PENT, // Right Thumb - _______, KC_ESC, + _______, _______, _______, _______, _______, KC_P0 ) @@ -304,8 +300,3 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) void matrix_init_user(void) { }; - -// Runs constantly in the background, in a loop. -void matrix_scan_user(void) { - -}; diff --git a/keyboards/kinesis/keymaps/xyverz/readme.md b/keyboards/kinesis/keymaps/xyverz/readme.md index cfd631a5b4..a10d7c2ba8 100644 --- a/keyboards/kinesis/keymaps/xyverz/readme.md +++ b/keyboards/kinesis/keymaps/xyverz/readme.md @@ -14,10 +14,10 @@ I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar t ### Function Keys on All Layers (keypad toggles): ,-----------------------------------------------------------------. - | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | + | Esc | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | `-----------------------------------------------------------------' ,-----------------------------------------------------------------. - | F9 | F10 | F11 | F12 | PScr | SLck | Paus | Keypad | RESET | + | F9 | F10 | F11 | F12 | PScr | SLck | Paus | Keypad | Reset | `-----------------------------------------------------------------' ### Layer 0: Dvorak layer @@ -31,7 +31,7 @@ I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar t |--------+------+------+------+------+------||------+------+------+------+------+--------| | LShift | Z | X | C | V | X || B | M | W | V | Z | RShift | `--------+------+------+------+------+------'`------+------+------+------+------+--------' - | ` | INS | Left | Rght | | Up | Dn | / | = | + | ` | Ins | Left | Rght | | Up | Dn | / | = | `---------------------------' `---------------------------' ,--------------.,--------------. | LCtl | LAlt || RGUI | RCtl | @@ -52,7 +52,7 @@ I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar t |--------+------+------+------+------+------||------+------+------+------+------+--------| | LShift | Z | X | C | V | B || N | M | , | . | / | RShift | `--------+------+------+------+------+------'`------+------+------+------+------+--------' - | ` | INS | Left | Rght | | Up | Dn | [ | ] | + | ` | Ins | Left | Rght | | Up | Dn | [ | ] | `---------------------------' `---------------------------' ,--------------.,--------------. | LCtl | LAlt || RGUI | RCtl | @@ -73,7 +73,7 @@ I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar t |--------+------+------+------+------+------||------+------+------+------+------+--------| | LShift | Z | X | C | V | B || K | M | , | . | / | RShift | `--------+------+------+------+------+------'`------+------+------+------+------+--------' - | ` | INS | Left | Rght | | Up | Dn | [ | ] | + | ` | Ins | Left | Rght | | Up | Dn | [ | ] | `---------------------------' `---------------------------' ,--------------.,--------------. | LCtl | LAlt || RGUI | RCtl | @@ -97,7 +97,7 @@ I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar t | | | | | | | | | | `---------------------------' `---------------------------' ,-------------.,-------------. - | ESC | || | ESC | + | | || | | ,------|------|------||------+------+------. | | | || | | | | | |------||------| | | @@ -120,7 +120,7 @@ I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar t | | | | | | | | KP . |KP Ent| | `---------------------------' `----------------------------------' ,-------------.,-------------. - | ESC | || | ESC | + | | || | | ,------|------|------||------+------+------. | | | || | | | | | |------||------| | KP 0 | From fbbf618a46efad60da0724211145f9e9401b96b4 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Sun, 5 Mar 2017 03:48:10 -0800 Subject: [PATCH 036/117] Removed preceeding underscore from MASTER_RIGHT in config.h --- keyboards/lets_split/keymaps/xyverz/config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/lets_split/keymaps/xyverz/config.h b/keyboards/lets_split/keymaps/xyverz/config.h index 87808a97a8..1b5be030ec 100644 --- a/keyboards/lets_split/keymaps/xyverz/config.h +++ b/keyboards/lets_split/keymaps/xyverz/config.h @@ -19,7 +19,7 @@ along with this program. If not, see . #define USE_SERIAL #define MASTER_LEFT -// #define _MASTER_RIGHT +// #define MASTER_RIGHT // #define EE_HANDS #ifdef SUBPROJECT_rev1 From 4880e72b77cd934dfc2e9ae4397bd7466ca002e5 Mon Sep 17 00:00:00 2001 From: nstickney Date: Tue, 7 Mar 2017 22:30:43 -0600 Subject: [PATCH 037/117] SLASH and WHACK functions added (based on algernon's CT_TA) --- keyboards/ergodox/config.h | 2 +- keyboards/ergodox/keymaps/familiar/Makefile | 5 + keyboards/ergodox/keymaps/familiar/config.h | 37 +++++ keyboards/ergodox/keymaps/familiar/keymap.c | 146 +++++++++++++++----- 4 files changed, 157 insertions(+), 33 deletions(-) create mode 100644 keyboards/ergodox/keymaps/familiar/Makefile create mode 100644 keyboards/ergodox/keymaps/familiar/config.h diff --git a/keyboards/ergodox/config.h b/keyboards/ergodox/config.h index 3618598320..994a8c6433 100644 --- a/keyboards/ergodox/config.h +++ b/keyboards/ergodox/config.h @@ -34,4 +34,4 @@ #endif -#endif /* KEYBOARDS_ERGODOX_CONFIG_H_ */ \ No newline at end of file +#endif /* KEYBOARDS_ERGODOX_CONFIG_H_ */ diff --git a/keyboards/ergodox/keymaps/familiar/Makefile b/keyboards/ergodox/keymaps/familiar/Makefile new file mode 100644 index 0000000000..f795271f0a --- /dev/null +++ b/keyboards/ergodox/keymaps/familiar/Makefile @@ -0,0 +1,5 @@ +TAP_DANCE_ENABLE = yes + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/ergodox/keymaps/familiar/config.h b/keyboards/ergodox/keymaps/familiar/config.h new file mode 100644 index 0000000000..994a8c6433 --- /dev/null +++ b/keyboards/ergodox/keymaps/familiar/config.h @@ -0,0 +1,37 @@ +#ifndef KEYBOARDS_ERGODOX_CONFIG_H_ +#define KEYBOARDS_ERGODOX_CONFIG_H_ + +#define MOUSEKEY_INTERVAL 20 +#define MOUSEKEY_DELAY 0 +#define MOUSEKEY_TIME_TO_MAX 5 +#define MOUSEKEY_MAX_SPEED 2 +#define MOUSEKEY_WHEEL_DELAY 0 + +#define TAPPING_TOGGLE 1 + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +#define TAPPING_TERM 200 +#define IGNORE_MOD_TAP_INTERRUPT // this makes it possible to do rolling combos (zx) with keys that convert to other keys on hold (z becomes ctrl when you hold it, and when this option isn't enabled, z rapidly followed by x actually sends Ctrl-x. That's bad.) + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL)) || \ + keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)) \ +) + +#ifdef SUBPROJECT_ez + #include "ez/config.h" +#endif +#ifdef SUBPROJECT_infinity + #include "infinity/config.h" +#endif + + +#endif /* KEYBOARDS_ERGODOX_CONFIG_H_ */ diff --git a/keyboards/ergodox/keymaps/familiar/keymap.c b/keyboards/ergodox/keymaps/familiar/keymap.c index e79e961092..c4ecdee511 100644 --- a/keyboards/ergodox/keymaps/familiar/keymap.c +++ b/keyboards/ergodox/keymaps/familiar/keymap.c @@ -8,13 +8,14 @@ #define NUMP 2 // numpad #define INTL 3 // international symbols -#define _______ KC_TRNS // Make the layouts easier to read +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO -enum custom_keycodes { - PLACEHOLDER = SAFE_RANGE, // can always be here - EPRM, - VRSN, - RGB_SLD +// Tap Dance Codes +enum { + SLASH, + WHACK, }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -23,51 +24,51 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* layer 0 : default * * ,--------------------------------------------------. ,--------------------------------------------------. - * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 0 | - | = | BCKSPC | + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 0 | - | = | BCKSPC | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * | TAB | Q | W | E | R | T | HOME | | PGUP | Y | U | I | O | P | DELETE | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | INSERT | A | S | D | F | G |------| |------| H | J | K | L | ; | ENTER | + * | NOOP | A | S | D | F | G |------| |------| H | J | K | L | ; | ENTER | * |--------+------+------+------+------+------| END | | PGDN |------+------+------+------+------+--------| - * | (/LSFT | Z | X | C | V | B | | | | N | M | , | . | / | )/RSFT | + * | (/LSFT | Z | X | C | V | B | | | | N | M | , | . | UP | )/RSFT | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | LCTRL | LGUI | | ' |PRTSCR| | [ | ] | \ | RGUI | RCTRL | + * | LCTRL | LGUI | MENU | ' | NOOP | | [ | ] | LEFT | DOWN | RIGHT | * `------------------------------------' `------------------------------------' * ,-------------. ,-------------. - * | VOL- | VOL+ | | BRT- | BRT+ | + * |PRTSCR| ESC | | VOL- | VOL+ | * ,------|------|------| |------+------+------. - * | ALT/ | | MUTE | | NUMLK| | ALT/ | - * | SPC | LAY1 |------| |------| LAY1 | SPC | + * | ALT/ | | NUMLK| | MUTE | | ALT/ | + * | SPC | SLASH|------| |------|WHACK | SPC | * | | | LAY3 | | LAY2 | | | * `--------------------' `--------------------' */ [BASE] = KEYMAP( // left hand - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_HOME, - KC_INS, KC_A, KC_S, KC_D, KC_F, KC_G, + XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_END, - KC_LCTL, KC_LGUI, _______, KC_QUOT, KC_PSCR, - KC_VOLD, KC_VOLU, - KC_MUTE, - ALT_T(KC_SPC), MO(ARRW), TG(INTL), + KC_LCTL, KC_LGUI, KC_MENU, KC_QUOT, XXXXXXX, + KC_INS, KC_ESC, + KC_NLCK, + ALT_T(KC_SPC), TD(SLASH), TG(INTL), // right hand KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENTER, - KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, - KC_LBRC, KC_RBRC, KC_BSLS, KC_RGUI, KC_RCTL, + KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_RSPC, + KC_LBRC, KC_RBRC, KC_LEFT, KC_DOWN, KC_RGHT, KC_VOLD, KC_VOLU, - KC_NLCK, - TG(NUMP), MO(ARRW), ALT_T(KC_SPC) + KC_MUTE, + TG(NUMP), TD(WHACK), ALT_T(KC_SPC) ), /* layer 1 : functions and arrows * * ,--------------------------------------------------. ,--------------------------------------------------. - * | SYSREQ | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | PAUSE | + * | | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | | | UP | | | | | | | | | | | | + * | | | | UP | | | | | | | | | | | INSERT | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * | | | LEFT | DOWN |RIGHT | |------| |------| LEFT | DOWN | UP | RIGHT| | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| @@ -76,26 +77,26 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | LEFT | DOWN | RIGHT | * `------------------------------------' `------------------------------------' * ,-------------. ,-------------. - * | | | | | | + * |SYSREQ| PAUSE| | | | * ,------|------|------| |------+------+------. - * | | | | | | | | + * | | | SCRLK| | | | | * | | |------| |------| | | * | | | | | | | | * `--------------------' `--------------------' */ [ARRW] = KEYMAP( // left hand - KC_SYSREQ, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, _______, _______, KC_UP, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, - _______, + KC_SYSREQ, KC_PAUSE, + KC_SLCK, _______, _______, _______, // right hand - KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PAUSE, - _______, _______, _______, _______, _______, _______, _______, + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, + _______, _______, _______, _______, _______, _______, KC_INS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, KC_UP, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, @@ -189,6 +190,87 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; +// See https://github.com/algernon/ergodox-layout/blob/master/keymap.c +// When holding the SLASH or WHACK key, the ARRW layer activates while the key is held. +// Tapping the key produces the / or \ key. Double-tapping it toggles the ARRW layer +// on until a third tap. + +typedef struct { + bool layer_toggle; + bool sticky; +} td_ta_state_t; + +static void ang_tap_dance_s_finished (qk_tap_dance_state_t *state, void *user_data) { + td_ta_state_t *td_ta = (td_ta_state_t *) user_data; + + if (td_ta->sticky) { + td_ta->sticky = false; + td_ta->layer_toggle = false; + layer_off (ARRW); + return; + } + + if (state->count == 1 && !state->pressed) { + register_code (KC_SLSH); + td_ta->sticky = false; + td_ta->layer_toggle = false; + } else { + td_ta->layer_toggle = true; + layer_on (ARRW); + td_ta->sticky = (state->count == 2); + } +} + +static void ang_tap_dance_s_reset (qk_tap_dance_state_t *state, void *user_data) { + td_ta_state_t *td_ta = (td_ta_state_t *) user_data; + + if (!td_ta->layer_toggle) + unregister_code (KC_SLSH); + if (!td_ta->sticky) + layer_off (ARRW); +} + +static void ang_tap_dance_w_finished (qk_tap_dance_state_t *state, void *user_data) { + td_ta_state_t *td_ta = (td_ta_state_t *) user_data; + + if (td_ta->sticky) { + td_ta->sticky = false; + td_ta->layer_toggle = false; + layer_off (ARRW); + return; + } + + if (state->count == 1 && !state->pressed) { + register_code (KC_BSLS); + td_ta->sticky = false; + td_ta->layer_toggle = false; + } else { + td_ta->layer_toggle = true; + layer_on (ARRW); + td_ta->sticky = (state->count == 2); + } +} + +static void ang_tap_dance_w_reset (qk_tap_dance_state_t *state, void *user_data) { + td_ta_state_t *td_ta = (td_ta_state_t *) user_data; + + if (!td_ta->layer_toggle) + unregister_code (KC_BSLS); + if (!td_ta->sticky) + layer_off (ARRW); +} + +qk_tap_dance_action_t tap_dance_actions[] = { + [SLASH] = { + .fn = { NULL, ang_tap_dance_s_finished, ang_tap_dance_s_reset }, + .user_data = (void *)&((td_ta_state_t) { false, false }) + }, + [WHACK] = { + .fn = { NULL, ang_tap_dance_w_finished, ang_tap_dance_w_reset }, + .user_data = (void *)&((td_ta_state_t) { false, false }) + } +}; + // Runs just one time when the keyboard initializes. void matrix_init_user(void) { From 29e7003fc22de30d0b467ff9263a3462c3970dd9 Mon Sep 17 00:00:00 2001 From: nstickney Date: Tue, 7 Mar 2017 22:31:14 -0600 Subject: [PATCH 038/117] SLASH and WHACK functions added (based on algernon's CT_TA) --- keyboards/ergodox/keymaps/familiar/config.h | 37 --------------------- 1 file changed, 37 deletions(-) delete mode 100644 keyboards/ergodox/keymaps/familiar/config.h diff --git a/keyboards/ergodox/keymaps/familiar/config.h b/keyboards/ergodox/keymaps/familiar/config.h deleted file mode 100644 index 994a8c6433..0000000000 --- a/keyboards/ergodox/keymaps/familiar/config.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef KEYBOARDS_ERGODOX_CONFIG_H_ -#define KEYBOARDS_ERGODOX_CONFIG_H_ - -#define MOUSEKEY_INTERVAL 20 -#define MOUSEKEY_DELAY 0 -#define MOUSEKEY_TIME_TO_MAX 5 -#define MOUSEKEY_MAX_SPEED 2 -#define MOUSEKEY_WHEEL_DELAY 0 - -#define TAPPING_TOGGLE 1 - -/* define if matrix has ghost */ -//#define MATRIX_HAS_GHOST - -#define TAPPING_TERM 200 -#define IGNORE_MOD_TAP_INTERRUPT // this makes it possible to do rolling combos (zx) with keys that convert to other keys on hold (z becomes ctrl when you hold it, and when this option isn't enabled, z rapidly followed by x actually sends Ctrl-x. That's bad.) - -/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ -#define LOCKING_SUPPORT_ENABLE -/* Locking resynchronize hack */ -#define LOCKING_RESYNC_ENABLE - -/* key combination for command */ -#define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL)) || \ - keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)) \ -) - -#ifdef SUBPROJECT_ez - #include "ez/config.h" -#endif -#ifdef SUBPROJECT_infinity - #include "infinity/config.h" -#endif - - -#endif /* KEYBOARDS_ERGODOX_CONFIG_H_ */ From fa44e8d4dca234847548656f4f38bce14bf33b31 Mon Sep 17 00:00:00 2001 From: nstickney Date: Wed, 8 Mar 2017 16:26:45 -0600 Subject: [PATCH 039/117] corralled image files --- .../keymaps/familiar/{ => img}/HNTR.svg | 0 .../keymaps/familiar/{ => img}/familiar.json | 0 .../keymaps/familiar/{ => img}/familiar.png | Bin .../keymaps/familiar/{ => img}/familiar.svg | 0 .../familiar/{ => img}/familiar_stick.svg | 0 .../keymaps/familiar/{ => img}/hntr.json | 0 .../keymaps/familiar/{ => img}/hntr.png | Bin keyboards/ergodox/keymaps/familiar/keymap.c | 26 +++++++++--------- 8 files changed, 13 insertions(+), 13 deletions(-) rename keyboards/ergodox/keymaps/familiar/{ => img}/HNTR.svg (100%) rename keyboards/ergodox/keymaps/familiar/{ => img}/familiar.json (100%) rename keyboards/ergodox/keymaps/familiar/{ => img}/familiar.png (100%) rename keyboards/ergodox/keymaps/familiar/{ => img}/familiar.svg (100%) rename keyboards/ergodox/keymaps/familiar/{ => img}/familiar_stick.svg (100%) rename keyboards/ergodox/keymaps/familiar/{ => img}/hntr.json (100%) rename keyboards/ergodox/keymaps/familiar/{ => img}/hntr.png (100%) diff --git a/keyboards/ergodox/keymaps/familiar/HNTR.svg b/keyboards/ergodox/keymaps/familiar/img/HNTR.svg similarity index 100% rename from keyboards/ergodox/keymaps/familiar/HNTR.svg rename to keyboards/ergodox/keymaps/familiar/img/HNTR.svg diff --git a/keyboards/ergodox/keymaps/familiar/familiar.json b/keyboards/ergodox/keymaps/familiar/img/familiar.json similarity index 100% rename from keyboards/ergodox/keymaps/familiar/familiar.json rename to keyboards/ergodox/keymaps/familiar/img/familiar.json diff --git a/keyboards/ergodox/keymaps/familiar/familiar.png b/keyboards/ergodox/keymaps/familiar/img/familiar.png similarity index 100% rename from keyboards/ergodox/keymaps/familiar/familiar.png rename to keyboards/ergodox/keymaps/familiar/img/familiar.png diff --git a/keyboards/ergodox/keymaps/familiar/familiar.svg b/keyboards/ergodox/keymaps/familiar/img/familiar.svg similarity index 100% rename from keyboards/ergodox/keymaps/familiar/familiar.svg rename to keyboards/ergodox/keymaps/familiar/img/familiar.svg diff --git a/keyboards/ergodox/keymaps/familiar/familiar_stick.svg b/keyboards/ergodox/keymaps/familiar/img/familiar_stick.svg similarity index 100% rename from keyboards/ergodox/keymaps/familiar/familiar_stick.svg rename to keyboards/ergodox/keymaps/familiar/img/familiar_stick.svg diff --git a/keyboards/ergodox/keymaps/familiar/hntr.json b/keyboards/ergodox/keymaps/familiar/img/hntr.json similarity index 100% rename from keyboards/ergodox/keymaps/familiar/hntr.json rename to keyboards/ergodox/keymaps/familiar/img/hntr.json diff --git a/keyboards/ergodox/keymaps/familiar/hntr.png b/keyboards/ergodox/keymaps/familiar/img/hntr.png similarity index 100% rename from keyboards/ergodox/keymaps/familiar/hntr.png rename to keyboards/ergodox/keymaps/familiar/img/hntr.png diff --git a/keyboards/ergodox/keymaps/familiar/keymap.c b/keyboards/ergodox/keymaps/familiar/keymap.c index c4ecdee511..46069b0dbc 100644 --- a/keyboards/ergodox/keymaps/familiar/keymap.c +++ b/keyboards/ergodox/keymaps/familiar/keymap.c @@ -37,9 +37,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,-------------. ,-------------. * |PRTSCR| ESC | | VOL- | VOL+ | * ,------|------|------| |------+------+------. - * | ALT/ | | NUMLK| | MUTE | | ALT/ | - * | SPC | SLASH|------| |------|WHACK | SPC | - * | | | LAY3 | | LAY2 | | | + * | ALT/ |SLASH/| NUMLK| | MUTE |WHACK/| ALT/ | + * | SPC |MO(1)/|------| |------|MO(1)/| SPC | + * | |TG(1) | LAY3 | | LAY2 |TG(1) | | * `--------------------' `--------------------' */ [BASE] = KEYMAP( @@ -72,9 +72,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * | | | LEFT | DOWN |RIGHT | |------| |------| LEFT | DOWN | UP | RIGHT| | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | |M_PREV|M_STOP|M_PLPS|M_NEXT| | | | | | | | | UP | | + * | |M_PREV|M_STOP|M_PLPS|M_NEXT| | | | | | | | | PGUP | | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | | | | | | LEFT | DOWN | RIGHT | + * | | | | | | | | | HOME | PGDN | END | * `------------------------------------' `------------------------------------' * ,-------------. ,-------------. * |SYSREQ| PAUSE| | | | @@ -98,8 +98,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, _______, KC_INS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, - _______, _______, _______, _______, _______, KC_UP, _______, - _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, + _______, _______, _______, _______, _______, KC_PGUP, _______, + _______, _______, KC_HOME, KC_PGDN, KC_END, _______, _______, _______, _______, _______, _______ @@ -200,7 +200,7 @@ typedef struct { bool sticky; } td_ta_state_t; -static void ang_tap_dance_s_finished (qk_tap_dance_state_t *state, void *user_data) { +static void slash_finished (qk_tap_dance_state_t *state, void *user_data) { td_ta_state_t *td_ta = (td_ta_state_t *) user_data; if (td_ta->sticky) { @@ -221,7 +221,7 @@ static void ang_tap_dance_s_finished (qk_tap_dance_state_t *state, void *user_da } } -static void ang_tap_dance_s_reset (qk_tap_dance_state_t *state, void *user_data) { +static void slash_reset (qk_tap_dance_state_t *state, void *user_data) { td_ta_state_t *td_ta = (td_ta_state_t *) user_data; if (!td_ta->layer_toggle) @@ -230,7 +230,7 @@ static void ang_tap_dance_s_reset (qk_tap_dance_state_t *state, void *user_data) layer_off (ARRW); } -static void ang_tap_dance_w_finished (qk_tap_dance_state_t *state, void *user_data) { +static void whack_finished (qk_tap_dance_state_t *state, void *user_data) { td_ta_state_t *td_ta = (td_ta_state_t *) user_data; if (td_ta->sticky) { @@ -251,7 +251,7 @@ static void ang_tap_dance_w_finished (qk_tap_dance_state_t *state, void *user_da } } -static void ang_tap_dance_w_reset (qk_tap_dance_state_t *state, void *user_data) { +static void whack_reset (qk_tap_dance_state_t *state, void *user_data) { td_ta_state_t *td_ta = (td_ta_state_t *) user_data; if (!td_ta->layer_toggle) @@ -262,11 +262,11 @@ static void ang_tap_dance_w_reset (qk_tap_dance_state_t *state, void *user_data) qk_tap_dance_action_t tap_dance_actions[] = { [SLASH] = { - .fn = { NULL, ang_tap_dance_s_finished, ang_tap_dance_s_reset }, + .fn = { NULL, slash_finished, slash_reset }, .user_data = (void *)&((td_ta_state_t) { false, false }) }, [WHACK] = { - .fn = { NULL, ang_tap_dance_w_finished, ang_tap_dance_w_reset }, + .fn = { NULL, whack_finished, whack_reset }, .user_data = (void *)&((td_ta_state_t) { false, false }) } }; From 82cbe71bb52403f0c9cd23925c10cfdc97021919 Mon Sep 17 00:00:00 2001 From: nstickney Date: Wed, 8 Mar 2017 22:28:18 -0600 Subject: [PATCH 040/117] found LT(layer, kc) so I could take out TapDance code --- keyboards/ergodox/keymaps/familiar/Makefile | 5 - keyboards/ergodox/keymaps/familiar/keymap.c | 127 +++----------------- 2 files changed, 20 insertions(+), 112 deletions(-) delete mode 100644 keyboards/ergodox/keymaps/familiar/Makefile diff --git a/keyboards/ergodox/keymaps/familiar/Makefile b/keyboards/ergodox/keymaps/familiar/Makefile deleted file mode 100644 index f795271f0a..0000000000 --- a/keyboards/ergodox/keymaps/familiar/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -TAP_DANCE_ENABLE = yes - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/ergodox/keymaps/familiar/keymap.c b/keyboards/ergodox/keymaps/familiar/keymap.c index 46069b0dbc..34c48d5f34 100644 --- a/keyboards/ergodox/keymaps/familiar/keymap.c +++ b/keyboards/ergodox/keymaps/familiar/keymap.c @@ -12,12 +12,6 @@ #define _______ KC_TRNS #define XXXXXXX KC_NO -// Tap Dance Codes -enum { - SLASH, - WHACK, -}; - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // If it accepts an argument (i.e, is a function), it doesn't need KC_. // Otherwise, it needs KC_* @@ -28,30 +22,30 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * | TAB | Q | W | E | R | T | HOME | | PGUP | Y | U | I | O | P | DELETE | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | NOOP | A | S | D | F | G |------| |------| H | J | K | L | ; | ENTER | + * | CLEAR | A | S | D | F | G |------| |------| H | J | K | L | ; | ENTER | * |--------+------+------+------+------+------| END | | PGDN |------+------+------+------+------+--------| * | (/LSFT | Z | X | C | V | B | | | | N | M | , | . | UP | )/RSFT | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | LCTRL | LGUI | MENU | ' | NOOP | | [ | ] | LEFT | DOWN | RIGHT | + * | LCTRL | LGUI | MENU | ' | " | | [ | ] | LEFT | DOWN | RIGHT | * `------------------------------------' `------------------------------------' * ,-------------. ,-------------. * |PRTSCR| ESC | | VOL- | VOL+ | * ,------|------|------| |------+------+------. * | ALT/ |SLASH/| NUMLK| | MUTE |WHACK/| ALT/ | - * | SPC |MO(1)/|------| |------|MO(1)/| SPC | - * | |TG(1) | LAY3 | | LAY2 |TG(1) | | + * | SPC | MO(1)|------| |------|MO(1) | SPC | + * | | | LAY3 | | LAY2 | | | * `--------------------' `--------------------' */ [BASE] = KEYMAP( // left hand KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_HOME, - XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_CLEAR, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_END, - KC_LCTL, KC_LGUI, KC_MENU, KC_QUOT, XXXXXXX, + KC_LCTL, KC_LGUI, KC_MENU, KC_QUOT, S(KC_QUOT), KC_INS, KC_ESC, KC_NLCK, - ALT_T(KC_SPC), TD(SLASH), TG(INTL), + ALT_T(KC_SPC), LT(ARRW,KC_SLSH), TG(INTL), // right hand KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL, @@ -60,7 +54,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LBRC, KC_RBRC, KC_LEFT, KC_DOWN, KC_RGHT, KC_VOLD, KC_VOLU, KC_MUTE, - TG(NUMP), TD(WHACK), ALT_T(KC_SPC) + TG(NUMP), LT(ARRW,KC_BSLS), ALT_T(KC_SPC) ), /* layer 1 : functions and arrows @@ -70,7 +64,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * | | | | UP | | | | | | | | | | | INSERT | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | LEFT | DOWN |RIGHT | |------| |------| LEFT | DOWN | UP | RIGHT| | | + * |CAPSLOCK| | LEFT | DOWN |RIGHT | |------| |------| LEFT | DOWN | UP | RIGHT| | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * | |M_PREV|M_STOP|M_PLPS|M_NEXT| | | | | | | | | PGUP | | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' @@ -88,7 +82,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // left hand _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, _______, _______, KC_UP, _______, _______, _______, - _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, + KC_CAPS, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_SYSREQ, KC_PAUSE, @@ -108,15 +102,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* layer 2 : numberpad * * ,--------------------------------------------------. ,--------------------------------------------------. - * | | | | | | | | | | | | | | | | + * | | | | | | | | | | | ( | ) | ÷ | × | | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | | | | | | | | | | | | | | | + * | | | | | | | | | | | 7 | 8 | 9 | - | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | |------| |------| | | | | | | + * | | | | | | |------| |------| | 4 | 5 | 6 | + | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | | | | | | | | | | | + * | | | | | | | | | | | 1 | 2 | 3 | = | | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | | | | | | | | | + * | | | | | | | 0 | . | , | ENTER| | * `------------------------------------' `------------------------------------' * ,-------------. ,-------------. * | | | | | | @@ -137,11 +131,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, // right hand - _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, + _______, _______, S(KC_9), S(KC_0), KC_PSLS, KC_PAST, _______, + _______, _______, KC_KP_7, KC_KP_8, KC_KP_9, KC_PMNS, _______, + _______, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, _______, + _______, _______, KC_KP_1, KC_KP_2, KC_KP_3, KC_PEQL, _______, + KC_KP_0, KC_KP_DOT, KC_PCMM, KC_PENT, _______, _______, _______, _______, _______, _______, _______ @@ -190,87 +184,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -// See https://github.com/algernon/ergodox-layout/blob/master/keymap.c -// When holding the SLASH or WHACK key, the ARRW layer activates while the key is held. -// Tapping the key produces the / or \ key. Double-tapping it toggles the ARRW layer -// on until a third tap. - -typedef struct { - bool layer_toggle; - bool sticky; -} td_ta_state_t; - -static void slash_finished (qk_tap_dance_state_t *state, void *user_data) { - td_ta_state_t *td_ta = (td_ta_state_t *) user_data; - - if (td_ta->sticky) { - td_ta->sticky = false; - td_ta->layer_toggle = false; - layer_off (ARRW); - return; - } - - if (state->count == 1 && !state->pressed) { - register_code (KC_SLSH); - td_ta->sticky = false; - td_ta->layer_toggle = false; - } else { - td_ta->layer_toggle = true; - layer_on (ARRW); - td_ta->sticky = (state->count == 2); - } -} - -static void slash_reset (qk_tap_dance_state_t *state, void *user_data) { - td_ta_state_t *td_ta = (td_ta_state_t *) user_data; - - if (!td_ta->layer_toggle) - unregister_code (KC_SLSH); - if (!td_ta->sticky) - layer_off (ARRW); -} - -static void whack_finished (qk_tap_dance_state_t *state, void *user_data) { - td_ta_state_t *td_ta = (td_ta_state_t *) user_data; - - if (td_ta->sticky) { - td_ta->sticky = false; - td_ta->layer_toggle = false; - layer_off (ARRW); - return; - } - - if (state->count == 1 && !state->pressed) { - register_code (KC_BSLS); - td_ta->sticky = false; - td_ta->layer_toggle = false; - } else { - td_ta->layer_toggle = true; - layer_on (ARRW); - td_ta->sticky = (state->count == 2); - } -} - -static void whack_reset (qk_tap_dance_state_t *state, void *user_data) { - td_ta_state_t *td_ta = (td_ta_state_t *) user_data; - - if (!td_ta->layer_toggle) - unregister_code (KC_BSLS); - if (!td_ta->sticky) - layer_off (ARRW); -} - -qk_tap_dance_action_t tap_dance_actions[] = { - [SLASH] = { - .fn = { NULL, slash_finished, slash_reset }, - .user_data = (void *)&((td_ta_state_t) { false, false }) - }, - [WHACK] = { - .fn = { NULL, whack_finished, whack_reset }, - .user_data = (void *)&((td_ta_state_t) { false, false }) - } -}; - // Runs just one time when the keyboard initializes. void matrix_init_user(void) { From 9895e376e76ed528d042e6892a529ec448fea736 Mon Sep 17 00:00:00 2001 From: nstickney Date: Sun, 12 Mar 2017 14:51:33 -0500 Subject: [PATCH 041/117] added US-International support --- keyboards/ergodox/keymaps/familiar/Makefile | 1 + keyboards/ergodox/keymaps/familiar/keymap.c | 158 +++++++++++++------- 2 files changed, 105 insertions(+), 54 deletions(-) create mode 100644 keyboards/ergodox/keymaps/familiar/Makefile diff --git a/keyboards/ergodox/keymaps/familiar/Makefile b/keyboards/ergodox/keymaps/familiar/Makefile new file mode 100644 index 0000000000..61c3c22725 --- /dev/null +++ b/keyboards/ergodox/keymaps/familiar/Makefile @@ -0,0 +1 @@ +UNIS_ENABLE = yes diff --git a/keyboards/ergodox/keymaps/familiar/keymap.c b/keyboards/ergodox/keymaps/familiar/keymap.c index 34c48d5f34..08640b9fc4 100644 --- a/keyboards/ergodox/keymaps/familiar/keymap.c +++ b/keyboards/ergodox/keymaps/familiar/keymap.c @@ -3,10 +3,12 @@ #include "action_layer.h" #include "version.h" +// Layers #define BASE 0 // default layer -#define ARRW 1 // function, media, arrow keys -#define NUMP 2 // numpad -#define INTL 3 // international symbols +#define INTL 1 // international symbols +#define INSF 2 // international symbols shifted +#define NUMP 3 // numpad +#define ARRW 4 // function, media, arrow keys // Fillers to make layering more clear #define _______ KC_TRNS @@ -22,7 +24,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * | TAB | Q | W | E | R | T | HOME | | PGUP | Y | U | I | O | P | DELETE | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | CLEAR | A | S | D | F | G |------| |------| H | J | K | L | ; | ENTER | + * | MO(3) | A | S | D | F | G |------| |------| H | J | K | L | ; | ENTER | * |--------+------+------+------+------+------| END | | PGDN |------+------+------+------+------+--------| * | (/LSFT | Z | X | C | V | B | | | | N | M | , | . | UP | )/RSFT | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' @@ -40,10 +42,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // left hand KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_HOME, - KC_CLEAR, KC_A, KC_S, KC_D, KC_F, KC_G, + MO(INTL), KC_A, KC_S, KC_D, KC_F, KC_G, KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_END, KC_LCTL, KC_LGUI, KC_MENU, KC_QUOT, S(KC_QUOT), - KC_INS, KC_ESC, + KC_PSCR, KC_ESC, KC_NLCK, ALT_T(KC_SPC), LT(ARRW,KC_SLSH), TG(INTL), // right hand @@ -57,52 +59,96 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TG(NUMP), LT(ARRW,KC_BSLS), ALT_T(KC_SPC) ), -/* layer 1 : functions and arrows +/* layer 1: International symbols, etc * * ,--------------------------------------------------. ,--------------------------------------------------. - * | | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | | + * | ´ | ¡ | ² | ³ | ¤ | € | ¼ | | ½ | ¾ | ‘ | ’ | ¥ | × | | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | | | UP | | | | | | | | | | | INSERT | + * | | ä | å | é | ® | þ | | | | ü | ú | í | ó | ö | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * |CAPSLOCK| | LEFT | DOWN |RIGHT | |------| |------| LEFT | DOWN | UP | RIGHT| | | + * | | á | ß | ð | | |------| |------| | | | Ø | ° | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | |M_PREV|M_STOP|M_PLPS|M_NEXT| | | | | | | | | PGUP | | + * |MO(INSF)| æ | | © | | | | | | ñ | µ | ç | | |MO(INSF)| * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | | | | | | HOME | PGDN | END | + * | | | | ¬ | ¿ | | « | » | | | | * `------------------------------------' `------------------------------------' * ,-------------. ,-------------. - * |SYSREQ| PAUSE| | | | + * | | | | | | * ,------|------|------| |------+------+------. - * | | | SCRLK| | | | | + * | | | | | | | | * | | |------| |------| | | * | | | | | | | | * `--------------------' `--------------------' */ -[ARRW] = KEYMAP( +[INTL] = KEYMAP( // left hand - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, - _______, _______, _______, KC_UP, _______, _______, _______, - KC_CAPS, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, - _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, - KC_SYSREQ, KC_PAUSE, - KC_SLCK, - _______, _______, _______, + UC(0x00B4), UC(0x00A1), UC(0x00B2), UC(0x00B3), UC(0x00A4), UC(0x20AC), UC(0x00BC), + _______, UC(0x00E4), UC(0x00E5), UC(0x00E9), UC(0x00AE), UC(0x00FE), _______, + _______, UC(0x00E1), UC(0x00DF), UC(0x00F0), _______, _______, + MO(INSF), UC(0x00E6), _______, UC(0x00A9), _______, _______, _______, + _______, _______, _______, UC(0x00AC), UC(0x00BF), + _______, _______, + _______, + _______, _______, _______, // right hand - KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, - _______, _______, _______, _______, _______, _______, KC_INS, - KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, - _______, _______, _______, _______, _______, KC_PGUP, _______, - _______, _______, KC_HOME, KC_PGDN, KC_END, + UC(0x00BD), UC(0x00BE), UC(0x2018), UC(0x2019), UC(0x00A5), UC(0x00D7), _______, + _______, UC(0x00FC), UC(0x00FA), UC(0x00ED), UC(0x00F3), UC(0x00F6), _______, + _______, _______, _______, UC(0x00D8), UC(0x00B0), _______, + _______, UC(0x00F1), UC(0x00B5), UC(0x00E7), _______, _______, MO(INSF), + UC(0x00AB), UC(0x00BB), _______, _______, _______, _______, _______, _______, _______, _______, _______ ), -/* layer 2 : numberpad +/* layer 2 : international symbols, shifted + * This layer is an ugly workaround; it pretends that SHIFT still works normally on keys + * which don't produce an "upper case" or "shifted" international symobol. * * ,--------------------------------------------------. ,--------------------------------------------------. - * | | | | | | | | | | | ( | ) | ÷ | × | | + * | ¨ | ¹ | | | £ | | | | | | | | | ÷ | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | Ä | Å | É | | Þ | | | | Ü | Ú | Í | Ó | Ö | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | Á | § | Ð | | |------| |------| | | | Ø | ° | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | Æ | | ¢ | | | | | | Ñ | | Ç | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | ¦ | | | | | | | | + * `------------------------------------' `------------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +[INSF] = KEYMAP( + // left hand + UC(0x00A8), UC(0x00B9), S(KC_2), S(KC_3), UC(0x00A3), UC(0x2014), S(KC_6), + _______, UC(0x00C4), UC(0x00C5), UC(0x00C9), S(KC_R), UC(0x00DE), _______, + _______, UC(0x00C1), UC(0x00A7), UC(0x00D0), S(KC_F), S(KC_G), + _______, UC(0x00C6), S(KC_X), UC(0x00A2), S(KC_V), S(KC_B), _______, + _______, _______, _______, UC(0x00A6), _______, + _______, _______, + _______, + _______, _______, _______, + // right hand + S(KC_7), S(KC_8), S(KC_9), S(KC_0), S(KC_MINS), UC(0x00F7), _______, + _______, UC(0x00DC), UC(0x00DA), UC(0x00CD), UC(0x00D3), UC(0x00D6), _______, + S(KC_H), S(KC_J), S(KC_K), UC(0x00D8), UC(0x00B0), _______, + _______, UC(0x00D1), S(KC_M), UC(0x00C7), S(KC_DOT), _______, _______, + S(KC_LBRC), S(KC_RBRC), _______, _______, _______, + _______, _______, + _______, + _______, _______, _______ + ), + +/* layer 3: numberpad + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | ( | ) | / | * | | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * | | | | | | | | | | | 7 | 8 | 9 | - | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| @@ -141,43 +187,43 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______ ), -/* layer 3: International symbols, etc +/* layer 4 : functions and arrows * * ,--------------------------------------------------. ,--------------------------------------------------. - * | | | | | | | | | | | | | | | | + * | ESCAPE | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | | | | | | | | | | | | | | | + * | | | | UP | | | | | | | | | | | INSERT | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | |------| |------| | | | | | | + * |CAPSLOCK| | LEFT | DOWN |RIGHT | |------| |------| LEFT | DOWN | UP | RIGHT| | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | | | | | | | | | | | + * | |M_PREV|M_STOP|M_PLPS|M_NEXT| | | | | | | | | PGUP | | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | | | | | | | | | + * | | | | | | | | | HOME | PGDN | END | * `------------------------------------' `------------------------------------' * ,-------------. ,-------------. - * | | | | | | + * |SYSREQ| PAUSE| | | | * ,------|------|------| |------+------+------. - * | | | | | | | | + * | | | SCRLK| | | | | * | | |------| |------| | | * | | | | | | | | * `--------------------' `--------------------' */ -[INTL] = KEYMAP( +[ARRW] = KEYMAP( // left hand - _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, + _______, _______, _______, KC_UP, _______, _______, _______, + KC_CAPS, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, - _______, - _______, _______, _______, + KC_SYSREQ, KC_PAUSE, + KC_SLCK, + _______, _______, _______, // right hand - _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, + _______, _______, _______, _______, _______, _______, KC_INS, + KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, + _______, _______, _______, _______, _______, KC_PGUP, _______, + _______, _______, KC_HOME, KC_PGDN, KC_END, _______, _______, _______, _______, _______, _______ @@ -186,7 +232,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Runs just one time when the keyboard initializes. void matrix_init_user(void) { - + set_unicode_input_mode(UC_LNX); // Linux + //set_unicode_input_mode(UC_OSX); // Mac OSX + //set_unicode_input_mode(UC_WIN); // Windows (with registry key, see wiki) + //set_unicode_input_mode(UC_WINC); // Windows (with WinCompose, see wiki) }; // Runs constantly in the background, in a loop. @@ -199,13 +248,14 @@ void matrix_scan_user(void) { ergodox_right_led_2_off(); ergodox_right_led_3_off(); switch (layer) { - case 1: + case INTL: + case INSF: ergodox_right_led_1_on(); break; - case 2: + case NUMP: ergodox_right_led_2_on(); break; - case 3: + case ARRW: ergodox_right_led_3_on(); break; default: From d9efa02cfbd9aebd691711c326645ad6f8af71b1 Mon Sep 17 00:00:00 2001 From: nstickney Date: Sun, 12 Mar 2017 22:43:44 -0500 Subject: [PATCH 042/117] added README.md --- keyboards/ergodox/keymaps/familiar/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 keyboards/ergodox/keymaps/familiar/README.md diff --git a/keyboards/ergodox/keymaps/familiar/README.md b/keyboards/ergodox/keymaps/familiar/README.md new file mode 100644 index 0000000000..0b24853415 --- /dev/null +++ b/keyboards/ergodox/keymaps/familiar/README.md @@ -0,0 +1,3 @@ +# Familiar Layout for ErgoDox # +An ErgoDox layout meant to be as easy to learn as possible for typists coming from a standard +QWERTY US-International layout. From a03d946d0c4edf0c3e50812af7f3c826b958c945 Mon Sep 17 00:00:00 2001 From: Stick Date: Mon, 27 Mar 2017 21:18:12 -0500 Subject: [PATCH 043/117] fixed unicode input issue --- keyboards/ergodox/keymaps/familiar/Makefile | 1 - keyboards/ergodox/keymaps/familiar/keymap.c | 35 +++++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) delete mode 100644 keyboards/ergodox/keymaps/familiar/Makefile diff --git a/keyboards/ergodox/keymaps/familiar/Makefile b/keyboards/ergodox/keymaps/familiar/Makefile deleted file mode 100644 index 61c3c22725..0000000000 --- a/keyboards/ergodox/keymaps/familiar/Makefile +++ /dev/null @@ -1 +0,0 @@ -UNIS_ENABLE = yes diff --git a/keyboards/ergodox/keymaps/familiar/keymap.c b/keyboards/ergodox/keymaps/familiar/keymap.c index 08640b9fc4..153d73040c 100644 --- a/keyboards/ergodox/keymaps/familiar/keymap.c +++ b/keyboards/ergodox/keymaps/familiar/keymap.c @@ -20,29 +20,29 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* layer 0 : default * * ,--------------------------------------------------. ,--------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 0 | - | = | BCKSPC | + * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 0 | - | = | BCKSPC | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | TAB | Q | W | E | R | T | HOME | | PGUP | Y | U | I | O | P | DELETE | + * | ` | Q | W | E | R | T | HOME | | PGUP | Y | U | I | O | P | DELETE | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | MO(3) | A | S | D | F | G |------| |------| H | J | K | L | ; | ENTER | + * | TAB | A | S | D | F | G |------| |------| H | J | K | L | ; | ENTER | * |--------+------+------+------+------+------| END | | PGDN |------+------+------+------+------+--------| * | (/LSFT | Z | X | C | V | B | | | | N | M | , | . | UP | )/RSFT | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' * | LCTRL | LGUI | MENU | ' | " | | [ | ] | LEFT | DOWN | RIGHT | * `------------------------------------' `------------------------------------' * ,-------------. ,-------------. - * |PRTSCR| ESC | | VOL- | VOL+ | + * | VOL- | VOL+ | | VOL- | VOL+ | * ,------|------|------| |------+------+------. - * | ALT/ |SLASH/| NUMLK| | MUTE |WHACK/| ALT/ | - * | SPC | MO(1)|------| |------|MO(1) | SPC | + * | SPC/ |SLASH/| MUTE | |NUMLCK|WHACK/| SPC/ | + * | ALT | MO(1)|------| |------|MO(1) | ALT | * | | | LAY3 | | LAY2 | | | * `--------------------' `--------------------' */ [BASE] = KEYMAP( // left hand - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_HOME, - MO(INTL), KC_A, KC_S, KC_D, KC_F, KC_G, + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, + KC_GRV, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_HOME, + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_END, KC_LCTL, KC_LGUI, KC_MENU, KC_QUOT, S(KC_QUOT), KC_PSCR, KC_ESC, @@ -66,7 +66,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * | | ä | å | é | ® | þ | | | | ü | ú | í | ó | ö | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | á | ß | ð | | |------| |------| | | | Ø | ° | | + * | | á | ß | ð | | |------| |------| | | | ø | ¶ | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * |MO(INSF)| æ | | © | | | | | | ñ | µ | ç | | |MO(INSF)| * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' @@ -93,7 +93,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // right hand UC(0x00BD), UC(0x00BE), UC(0x2018), UC(0x2019), UC(0x00A5), UC(0x00D7), _______, _______, UC(0x00FC), UC(0x00FA), UC(0x00ED), UC(0x00F3), UC(0x00F6), _______, - _______, _______, _______, UC(0x00D8), UC(0x00B0), _______, + _______, _______, _______, UC(0x00F8), UC(0x00B6), _______, _______, UC(0x00F1), UC(0x00B5), UC(0x00E7), _______, _______, MO(INSF), UC(0x00AB), UC(0x00BB), _______, _______, _______, _______, _______, @@ -106,7 +106,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * which don't produce an "upper case" or "shifted" international symobol. * * ,--------------------------------------------------. ,--------------------------------------------------. - * | ¨ | ¹ | | | £ | | | | | | | | | ÷ | | + * | ¨ | ¹ | | | £ | | | | | | | | — | ÷ | | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * | | Ä | Å | É | | Þ | | | | Ü | Ú | Í | Ó | Ö | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| @@ -126,8 +126,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [INSF] = KEYMAP( // left hand - UC(0x00A8), UC(0x00B9), S(KC_2), S(KC_3), UC(0x00A3), UC(0x2014), S(KC_6), - _______, UC(0x00C4), UC(0x00C5), UC(0x00C9), S(KC_R), UC(0x00DE), _______, + UC(0x00A8), UC(0x00B9), _______, _______, UC(0x00A3), _______, _______, + _______, UC(0x00C4), UC(0x00C5), UC(0x00C9), _______, UC(0x00DE), _______, _______, UC(0x00C1), UC(0x00A7), UC(0x00D0), S(KC_F), S(KC_G), _______, UC(0x00C6), S(KC_X), UC(0x00A2), S(KC_V), S(KC_B), _______, _______, _______, _______, UC(0x00A6), _______, @@ -135,11 +135,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, // right hand - S(KC_7), S(KC_8), S(KC_9), S(KC_0), S(KC_MINS), UC(0x00F7), _______, + _______, _______, _______, _______, UC(0x2014), UC(0x00F7), _______, _______, UC(0x00DC), UC(0x00DA), UC(0x00CD), UC(0x00D3), UC(0x00D6), _______, S(KC_H), S(KC_J), S(KC_K), UC(0x00D8), UC(0x00B0), _______, - _______, UC(0x00D1), S(KC_M), UC(0x00C7), S(KC_DOT), _______, _______, - S(KC_LBRC), S(KC_RBRC), _______, _______, _______, + _______, UC(0x00D1), _______, UC(0x00C7), S(KC_DOT), _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ @@ -188,6 +188,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* layer 4 : functions and arrows + * This layer is at the top so that the functions still work no matter what layers are active. * * ,--------------------------------------------------. ,--------------------------------------------------. * | ESCAPE | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | | From b6280d0cac59c741db62a63072efd5de4887fc01 Mon Sep 17 00:00:00 2001 From: Stick Date: Mon, 27 Mar 2017 21:56:47 -0500 Subject: [PATCH 044/117] unsatisfied with ESC/GRV/TAB positioning --- keyboards/ergodox/keymaps/familiar/keymap.c | 32 ++++++++++----------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/keyboards/ergodox/keymaps/familiar/keymap.c b/keyboards/ergodox/keymaps/familiar/keymap.c index 153d73040c..c5f94afda8 100644 --- a/keyboards/ergodox/keymaps/familiar/keymap.c +++ b/keyboards/ergodox/keymaps/familiar/keymap.c @@ -22,16 +22,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,--------------------------------------------------. ,--------------------------------------------------. * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 0 | - | = | BCKSPC | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | ` | Q | W | E | R | T | HOME | | PGUP | Y | U | I | O | P | DELETE | + * | TAB | Q | W | E | R | T | HOME | | PGUP | Y | U | I | O | P | DELETE | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | TAB | A | S | D | F | G |------| |------| H | J | K | L | ; | ENTER | + * | ` | A | S | D | F | G |------| |------| H | J | K | L | ; | ENTER | * |--------+------+------+------+------+------| END | | PGDN |------+------+------+------+------+--------| * | (/LSFT | Z | X | C | V | B | | | | N | M | , | . | UP | )/RSFT | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' * | LCTRL | LGUI | MENU | ' | " | | [ | ] | LEFT | DOWN | RIGHT | * `------------------------------------' `------------------------------------' * ,-------------. ,-------------. - * | VOL- | VOL+ | | VOL- | VOL+ | + * | VOL- | VOL+ | | | | * ,------|------|------| |------+------+------. * | SPC/ |SLASH/| MUTE | |NUMLCK|WHACK/| SPC/ | * | ALT | MO(1)|------| |------|MO(1) | ALT | @@ -41,12 +41,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [BASE] = KEYMAP( // left hand KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, - KC_GRV, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_HOME, - KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_HOME, + KC_GRV, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_END, KC_LCTL, KC_LGUI, KC_MENU, KC_QUOT, S(KC_QUOT), - KC_PSCR, KC_ESC, - KC_NLCK, + KC_VOLD, KC_VOLU, + KC_MUTE, ALT_T(KC_SPC), LT(ARRW,KC_SLSH), TG(INTL), // right hand KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, @@ -54,8 +54,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENTER, KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_RSPC, KC_LBRC, KC_RBRC, KC_LEFT, KC_DOWN, KC_RGHT, - KC_VOLD, KC_VOLU, - KC_MUTE, + _______, _______, + KC_NLCK, TG(NUMP), LT(ARRW,KC_BSLS), ALT_T(KC_SPC) ), @@ -191,7 +191,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * This layer is at the top so that the functions still work no matter what layers are active. * * ,--------------------------------------------------. ,--------------------------------------------------. - * | ESCAPE | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | | + * | ESCAPE | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | SYSREQ | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * | | | | UP | | | | | | | | | | | INSERT | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| @@ -202,9 +202,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | HOME | PGDN | END | * `------------------------------------' `------------------------------------' * ,-------------. ,-------------. - * |SYSREQ| PAUSE| | | | + * | | PAUSE| | | | * ,------|------|------| |------+------+------. - * | | | SCRLK| | | | | + * | | | | |SCRLK | | | * | | |------| |------| | | * | | | | | | | | * `--------------------' `--------------------' @@ -216,17 +216,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_CAPS, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - KC_SYSREQ, KC_PAUSE, - KC_SLCK, + _______, KC_PAUSE, + _______, _______, _______, _______, // right hand - KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_SYSREQ, _______, _______, _______, _______, _______, _______, KC_INS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, _______, _______, KC_HOME, KC_PGDN, KC_END, _______, _______, - _______, + KC_SLCK, _______, _______, _______ ), }; From 571f39da663632b2f0592f1ad41d2985763bfcc2 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Wed, 29 Mar 2017 22:32:39 -0700 Subject: [PATCH 045/117] Tidied up keymaps, Makefiles that actually work, Clueboard make v1.0 --- keyboards/clueboard/keymaps/xyverz/Makefile | 49 ++++++++++++++++++++ keyboards/clueboard/keymaps/xyverz/keymap.c | 49 +++++++++++--------- keyboards/lets_split/keymaps/xyverz/keymap.c | 4 +- keyboards/planck/keymaps/xyverz/Makefile | 6 +++ keyboards/planck/keymaps/xyverz/keymap.c | 12 ++--- keyboards/planck/keymaps/xyverz/makefile.mk | 25 ---------- 6 files changed, 89 insertions(+), 56 deletions(-) create mode 100644 keyboards/clueboard/keymaps/xyverz/Makefile create mode 100644 keyboards/planck/keymaps/xyverz/Makefile delete mode 100644 keyboards/planck/keymaps/xyverz/makefile.mk diff --git a/keyboards/clueboard/keymaps/xyverz/Makefile b/keyboards/clueboard/keymaps/xyverz/Makefile new file mode 100644 index 0000000000..950dadf841 --- /dev/null +++ b/keyboards/clueboard/keymaps/xyverz/Makefile @@ -0,0 +1,49 @@ +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device. +# Please customize your programmer settings(PROGRAM_CMD) +# +# make teensy = Download the hex file to the device, using teensy_loader_cli. +# (must have teensy_loader_cli installed). +# +# make dfu = Download the hex file to the device, using dfu-programmer (must +# have dfu-programmer installed). +# +# make flip = Download the hex file to the device, using Atmel FLIP (must +# have Atmel FLIP installed). +# +# make dfu-ee = Download the eeprom file to the device, using dfu-programmer +# (must have dfu-programmer installed). +# +# make flip-ee = Download the eeprom file to the device, using Atmel FLIP +# (must have Atmel FLIP installed). +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + +# Build Options +# change to "no" to disable the options, or define them in the makefile.mk in +# the appropriate keymap folder that will get included automatically +# +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/clueboard/keymaps/xyverz/keymap.c b/keyboards/clueboard/keymaps/xyverz/keymap.c index 01f158bf0f..4539119731 100644 --- a/keyboards/clueboard/keymaps/xyverz/keymap.c +++ b/keyboards/clueboard/keymaps/xyverz/keymap.c @@ -1,3 +1,6 @@ +// Xyverz' keymap. +// It's based on the default keymap, but Dvorak! + #include "clueboard.h" // Used for SHIFT_ESC @@ -14,23 +17,23 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap _BL: (Base Layer) Default Layer * ,--------------------------------------------------------------------------. ,----. - * |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| BS| |PGUP| + * |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| [| ]| \| BS| |PGUP| * |--------------------------------------------------------------------------| |----| - * | Tab| Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |PGDN| + * | Tab| '| ,| .| P| Y| F| G| C| R| L| /| =| \| |PGDN| * |--------------------------------------------------------------------------| `----' - * |Capslck| A| S| D| F| G| H| J| K| L| ;| '| # | Ent| + * |_FL/Caps| A| O| E| U| I| H| D| H| T| N| S| - | Ent| * |-----------------------------------------------------------------------------. - * |Shift| BS| Z| X| C| V| B| N| M| ,| .| /| BS|Shift| UP| + * |Shift| BS| ;| Q| J| K| X| B| M| W| V| Z| BS|Shift| UP| * |------------------------------------------------------------------------|----|----. * | Ctrl| Gui| Alt| MHen| Space| Space| Hen| Alt| Ctrl| _FL|LEFT|DOWN|RGHT| * `----------------------------------------------------------------------------------' */ [_BL] = KEYMAP( - F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_PGUP, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, \ - KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, \ - KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, \ - KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, KC_SPC,KC_SPC, KC_HENK, KC_RALT, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT), + F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_GRV, KC_BSPC, KC_PGUP, \ + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSLS, KC_PGDN, \ + LT(_FL, KC_CAPS), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_NUHS, KC_ENT, \ + KC_LSFT, KC_RO, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_SLSH, KC_RSFT, KC_UP, \ + KC_LCTL, KC_LALT, KC_LGUI, KC_MHEN, KC_SPC, KC_SPC, KC_HENK, KC_RGUI, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT), /* Keymap _FL: Function Layer * ,--------------------------------------------------------------------------. ,----. @@ -46,31 +49,31 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `----------------------------------------------------------------------------------' */ [_FL] = KEYMAP( - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_DEL, BL_STEP, \ - KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_HOME, KC_PGDN, KC_END), + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_DEL, BL_STEP, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, MO(_RS), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), KC_HOME, KC_PGDN, KC_END), /* Keymap _RS: Reset layer * ,--------------------------------------------------------------------------. ,----. - * | | | | | | | | | | | | | | | | | | + * | | | | | | | | | | | | | | | RGB| |VAL+| * |--------------------------------------------------------------------------| |----| - * | | | | |RESET| | | | | | | | | | | | + * | | | | |RESET| | | | | | | | | | |VAL-| * |--------------------------------------------------------------------------| `----' * | | | _RS| | | | | | | | | | | | * |-----------------------------------------------------------------------------. - * | | | | | | | | | | | | | | | | + * | | | | | | | | | | | | | | |SAT+| * |------------------------------------------------------------------------|----|----. - * | | | | | | | | | | _FL| | | | + * | | | | | | | | | | _FL|HUE-|SAT-|HUE+| * `----------------------------------------------------------------------------------' */ [_RS] = KEYMAP( - KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, RGB_VAI, \ - KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAD, \ - KC_TRNS, KC_TRNS, MO(_RS),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - MO(_FL), KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), RGB_SAI, \ - KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, RGB_MOD, RGB_MOD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_HUD, RGB_SAD, RGB_HUI), + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, RGB_VAI, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAD, \ + KC_TRNS, KC_TRNS, MO(_RS), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + MO(_FL), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(_FL), RGB_SAI, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_MOD, RGB_MOD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_HUD, RGB_SAD, RGB_HUI), }; enum function_id { diff --git a/keyboards/lets_split/keymaps/xyverz/keymap.c b/keyboards/lets_split/keymaps/xyverz/keymap.c index d52eb40aea..216e946964 100644 --- a/keyboards/lets_split/keymaps/xyverz/keymap.c +++ b/keyboards/lets_split/keymaps/xyverz/keymap.c @@ -122,9 +122,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Adjust (Lower + Raise) * ,-----------------------------------------------------------------------------------. - * | | Reset| | | | | | | | | | Del | + * | F11 | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F12 | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * | | Reset| |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | * |------+------+------+------+------+------|------+------+------+------+------+------| * | |RGB ON| MODE | HUE+ | HUE- | SAT+ | SAT- | VAL+ | VAL- | | | | * |------+------+------+------+------+------+------+------+------+------+------+------| diff --git a/keyboards/planck/keymaps/xyverz/Makefile b/keyboards/planck/keymaps/xyverz/Makefile new file mode 100644 index 0000000000..55bf853a07 --- /dev/null +++ b/keyboards/planck/keymaps/xyverz/Makefile @@ -0,0 +1,6 @@ +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +AUDIO_ENABLE = no # Audio output on port C6 + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/planck/keymaps/xyverz/keymap.c b/keyboards/planck/keymaps/xyverz/keymap.c index 94ace2af56..329bb043a5 100644 --- a/keyboards/planck/keymaps/xyverz/keymap.c +++ b/keyboards/planck/keymaps/xyverz/keymap.c @@ -44,7 +44,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------|------+------+------+------+------+------| * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Brite| Ctrl | Alt | GUI |Lower | Bksp |Space |Raise | Left | Down | Up |Right | + * | Ctrl | Alt | Left |Right |Lower | Bksp |Space |Raise | Up | Down | GUI |Enter | * `-----------------------------------------------------------------------------------' */ [_QWERTY] = { @@ -62,7 +62,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------|------+------+------+------+------+------| * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Brite| Ctrl | Alt | GUI |Lower | Bksp |Space |Raise | Left | Down | Up |Right | + * | Ctrl | Alt | Left |Right |Lower | Bksp |Space |Raise | Up | Down | GUI |Enter | * `-----------------------------------------------------------------------------------' */ [_COLEMAK] = { @@ -128,9 +128,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Adjust (Lower + Raise) * ,-----------------------------------------------------------------------------------. - * | | Reset| | | | | | | | | | Del | + * | F11 | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F12 | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * | | Reset| |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | * |------+------+------+------+------+------|------+------+------+------+------+------| * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | * |------+------+------+------+------+------+------+------+------+------+------+------| @@ -138,8 +138,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_ADJUST] = { - {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, - {_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______}, + {KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12 }, + {_______, RESET, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______}, {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} } diff --git a/keyboards/planck/keymaps/xyverz/makefile.mk b/keyboards/planck/keymaps/xyverz/makefile.mk deleted file mode 100644 index 93a89bb4ab..0000000000 --- a/keyboards/planck/keymaps/xyverz/makefile.mk +++ /dev/null @@ -1,25 +0,0 @@ - - -# Build Options -# change to "no" to disable the options, or define them in the Makefile in -# the appropriate keymap folder that will get included automatically -# -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration -NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality -MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = yes # Audio output on port C6 -UNICODE_ENABLE = no # Unicode -BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. - -# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif From e508b5e04eaac5f56698333bdd2a9c2ffa89ab75 Mon Sep 17 00:00:00 2001 From: = <=> Date: Sun, 2 Apr 2017 18:27:24 +0900 Subject: [PATCH 046/117] Adds tong92's keymap to tv44 --- keyboards/tv44/keymaps/tong92/Makefile | 21 ++++ keyboards/tv44/keymaps/tong92/config.h | 12 +++ keyboards/tv44/keymaps/tong92/keymap.c | 138 ++++++++++++++++++++++++ keyboards/tv44/keymaps/tong92/readme.md | 52 +++++++++ 4 files changed, 223 insertions(+) create mode 100644 keyboards/tv44/keymaps/tong92/Makefile create mode 100644 keyboards/tv44/keymaps/tong92/config.h create mode 100644 keyboards/tv44/keymaps/tong92/keymap.c create mode 100644 keyboards/tv44/keymaps/tong92/readme.md diff --git a/keyboards/tv44/keymaps/tong92/Makefile b/keyboards/tv44/keymaps/tong92/Makefile new file mode 100644 index 0000000000..e60e3c5c5a --- /dev/null +++ b/keyboards/tv44/keymaps/tong92/Makefile @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = no # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/tv44/keymaps/tong92/config.h b/keyboards/tv44/keymaps/tong92/config.h new file mode 100644 index 0000000000..be959a823c --- /dev/null +++ b/keyboards/tv44/keymaps/tong92/config.h @@ -0,0 +1,12 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +// place overrides here +#ifdef BACKLIGHT_ENABLE + #define BACKLIGHT_PIN B2 + #define BACKLIGHT_LEVELS 7 +#endif + +#endif diff --git a/keyboards/tv44/keymaps/tong92/keymap.c b/keyboards/tv44/keymaps/tong92/keymap.c new file mode 100644 index 0000000000..4a16b3554f --- /dev/null +++ b/keyboards/tv44/keymaps/tong92/keymap.c @@ -0,0 +1,138 @@ +// This is the canonical layout file for the Quantum project. If you want to add another keyboard, +// this is the style you want to emulate. +//Author: tong92 + +#include "tv44.h" +#include "action_layer.h" +#include "eeconfig.h" +#ifdef BACKLIGHT_ENABLE + #include "backlight.h" +#endif + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define LOWER F(1) +#define RAISE F(2) +#define FTN MO(4) +#define MOUSE M(10) +#define GO_DEFT M(99) +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,--------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`-------| + * | Ctrl | A | S | D | F | G | H | J | K | L | ; | Enter| + * |-------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`------| + * | Shift | Z | X | C | V | B | N | M | , | . | / |Shift| + * |--------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----| + * | Ftn1 | GUI | Alt | Space/LOWER | Space/RAISE | ' | [ | ] | Alt | + * `--------------------------------------------------------------------------' + */ +[0] = { +{KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, +{KC_LCTL,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_ENT}, +{KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT,KC_SLSH,KC_RSFT }, +{FTN ,KC_LGUI,KC_LALT,LOWER,XXXXXXX,XXXXXXX,XXXXXXX,RAISE,KC_QUOT,KC_LBRC,KC_RBRC,KC_RALT} +}, +/* LOWER + * ,--------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | + * |------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`-------| + * | | F1 | F2 | F3 | F4 | F5 | F6 | - | + | [ | ] | \ | + * |-------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | HOME| PgUp| UP | PgDo| + * |--------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----| + * | | | | | | END | LEFT| Down|RIGHT| + * `--------------------------------------------------------------------------' + */ +[1] = { +{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______}, +{_______,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS,KC_PLUS,KC_LBRC,KC_RBRC,KC_BSLS }, +{_______,KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX,KC_HOME,KC_PGUP,KC_UP ,KC_PGDN }, +{XXXXXXX,_______,_______,_______,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,KC_END, KC_LEFT,KC_DOWN,KC_RIGHT} +}, +/* RAISE + * ,--------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | | + * |------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`-------| + * | | F1 | F2 | F3 | F4 | F5 | F6 | _ | = | { | } | | | + * |-------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | HOME| PgUp| UP | PgDo| + * |--------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----| + * | | | | | | END | LEFT| Down|RIGHT| + * `--------------------------------------------------------------------------' + */ +[2] ={ +{KC_TILD,KC_EXLM,KC_AT, KC_HASH,KC_DLR, KC_PERC,KC_CIRC,KC_AMPR,KC_ASTR,KC_LPRN,KC_RPRN,_______ }, +{_______,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS,KC_EQL, KC_LCBR,KC_RCBR,KC_PIPE }, +{_______,KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______,KC_HOME,KC_PGUP,KC_UP ,KC_PGDN }, +{XXXXXXX,_______,_______,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,_______,KC_END, KC_LEFT,KC_DOWN,KC_RIGHT} +}, +/* FTN + * ,--------------------------------------------------------------------------. + * | ESC |WinOf|WinUp| | |Sh+Ca| | PgUp| UP | PgDo|PrtSc| DELET | + * |------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`-------| + * | |WinLe|WinDo|WinRi| |Al+Ca|CapsL| LEFT| DOWN|RIGHT| | | + * |-------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`------| + * | |WinLW|WinRW| | |Ct+Ca|ScroL| HOME| | END | | Ctrl| + * |--------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----| + * | | DeskL | DeskR| Task Manager| DeskX | MOUSE| | | LED | + * `--------------------------------------------------------------------------' + */ +[4] = { +{KC_ESC ,LALT(KC_F4) ,LGUI(KC_UP) ,XXXXXXX ,XXXXXXX ,S(KC_CAPS) ,XXXXXXX,KC_PGUP,KC_UP,KC_PGDN,KC_PSCR,KC_DELT}, +{_______,LGUI(KC_LEFT) ,LGUI(KC_DOWN) ,LGUI(KC_RIGHT) ,XXXXXXX ,LALT(KC_CAPS),KC_CAPS,KC_LEFT,KC_DOWN,KC_RIGHT,XXXXXXX,XXXXXXX}, +{_______,LGUI(LSFT(KC_LEFT)),LGUI(LSFT(KC_RIGHT)),XXXXXXX ,XXXXXXX ,LCTL(KC_CAPS),KC_SLCK,KC_HOME,XXXXXXX,KC_END,XXXXXXX,KC_RCTL}, +{_______,LGUI(LCTL(KC_LEFT)),LGUI(LCTL(KC_RIGHT)),LCTL(LALT(KC_DELT)),XXXXXXX,XXXXXXX,XXXXXXX,LGUI(LCTL(KC_F4)),MOUSE,XXXXXXX,XXXXXXX,M(0)} +}, +/* MOUSE + * ,--------------------------------------------------------------------------. + * | | | |Mo_Up| | | |M_WhL|M_WhU|M_WhR| | RESET | + * |------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`-------| + * | | |Mo_Le|Mo_Do|Mo_Ri| | |M_Bt1|M_WhD|M_Bt2| | | + * |-------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`------| + * | | | | | | | |M_AC0|M_AC1|M_AC2| | | + * |--------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----| + * | | | | GO_DEFAULT | GO_DEFAULT | | | | | + * `--------------------------------------------------------------------------' + */ +[10] ={ +{XXXXXXX,XXXXXXX,XXXXXXX,KC_MS_U,XXXXXXX,XXXXXXX,XXXXXXX,KC_WH_L,KC_WH_U,KC_WH_R,XXXXXXX,RESET}, +{XXXXXXX,XXXXXXX,KC_MS_L,KC_MS_D,KC_MS_R,XXXXXXX,XXXXXXX,KC_BTN1,KC_WH_D,KC_BTN2,XXXXXXX,XXXXXXX}, +{XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,KC_ACL0,KC_ACL1,KC_ACL2,XXXXXXX,XXXXXXX}, +{XXXXXXX,XXXXXXX,XXXXXXX,GO_DEFT,XXXXXXX,XXXXXXX,XXXXXXX,GO_DEFT,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX} +} +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_TAP_KEY(1, KC_SPC), + [2] = ACTION_LAYER_TAP_KEY(2, KC_SPC) +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch(id) { + case 0: + if (record->event.pressed) { + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } + break; + case 10: + if (record->event.pressed) { + layer_on(10); + } + break; + case 99: + if (record->event.pressed) { + layer_off(10); + layer_off(4); + } + break; + } + return MACRO_NONE; +}; \ No newline at end of file diff --git a/keyboards/tv44/keymaps/tong92/readme.md b/keyboards/tv44/keymaps/tong92/readme.md new file mode 100644 index 0000000000..8208572568 --- /dev/null +++ b/keyboards/tv44/keymaps/tong92/readme.md @@ -0,0 +1,52 @@ +# The tong92's keymap for tv44 + +- Arrow Layout (45key) +- my keymap for Window User +- Mouse Layer : space -> Default Layer + +## Qwerty + ,--------------------------------------------------------------------------. + | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + |------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`-------| + | Ctrl | A | S | D | F | G | H | J | K | L | ; | Enter| + |-------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`------| + | Shift | Z | X | C | V | B | N | M | , | . | / |Shift| + |--------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----| + | Ftn1 | GUI | Alt | Space/LOWER | Space/RAISE | ' | [ | ] | Alt | + `--------------------------------------------------------------------------' + + +## RAISE + ,--------------------------------------------------------------------------. + | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | | + |------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`-------| + | | F1 | F2 | F3 | F4 | F5 | F6 | _ | = | { | } | | | + |-------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`------| + | | F7 | F8 | F9 | F10 | F11 | F12 | | HOME| PgUp| UP | PgDo| + |--------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----| + | | | | | | END | LEFT| Down|RIGHT| + `--------------------------------------------------------------------------' + + +## FTN + ,--------------------------------------------------------------------------. + | ESC |WinOf|WinUp| | |Sh+Ca| | PgUp| UP | PgDo|PrtSc| DELET | + |------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`-------| + | |WinLe|WinDo|WinRi| |Al+Ca|CapsL| LEFT| DOWN|RIGHT| | | + |-------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`------| + | |WinLW|WinRW| | |Ct+Ca|ScroL| HOME| | END | | Ctrl| + |--------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----| + | | DeskL | DeskR| Task Manager| DeskX | MOUSE| | | LED | + `--------------------------------------------------------------------------' + + +## MOUSE + ,--------------------------------------------------------------------------. + | | | |Mo_Up| | | |M_WhL|M_WhU|M_WhR| | RESET | + |------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`-------| + | | |Mo_Le|Mo_Do|Mo_Ri| | |M_Bt1|M_WhD|M_Bt2| | | + |-------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`------| + | | | | | | | |M_AC0|M_AC1|M_AC2| | | + |--------`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----`-----| + | | | | GO_DEFAULT | GO_DEFAULT | | | | | + `--------------------------------------------------------------------------' From f8ed4ed573c798bd40a1063072fd619732a2d49a Mon Sep 17 00:00:00 2001 From: Nurahmadie Date: Tue, 21 Feb 2017 09:39:51 +0700 Subject: [PATCH 047/117] Initial work for my kbod support in qmk_firmware - Wiring layout done No actual keymap yet --- keyboards/handwired/kbod/Makefile | 3 + keyboards/handwired/kbod/config.h | 162 ++++++++++++++++++ keyboards/handwired/kbod/kbod.c | 28 +++ keyboards/handwired/kbod/kbod.h | 25 +++ .../handwired/kbod/keymaps/default/Makefile | 21 +++ .../handwired/kbod/keymaps/default/config.h | 8 + .../handwired/kbod/keymaps/default/keymap.c | 44 +++++ .../handwired/kbod/keymaps/default/readme.md | 1 + keyboards/handwired/kbod/readme.md | 28 +++ keyboards/handwired/kbod/rules.mk | 68 ++++++++ 10 files changed, 388 insertions(+) create mode 100644 keyboards/handwired/kbod/Makefile create mode 100644 keyboards/handwired/kbod/config.h create mode 100644 keyboards/handwired/kbod/kbod.c create mode 100644 keyboards/handwired/kbod/kbod.h create mode 100644 keyboards/handwired/kbod/keymaps/default/Makefile create mode 100644 keyboards/handwired/kbod/keymaps/default/config.h create mode 100644 keyboards/handwired/kbod/keymaps/default/keymap.c create mode 100644 keyboards/handwired/kbod/keymaps/default/readme.md create mode 100644 keyboards/handwired/kbod/readme.md create mode 100644 keyboards/handwired/kbod/rules.mk diff --git a/keyboards/handwired/kbod/Makefile b/keyboards/handwired/kbod/Makefile new file mode 100644 index 0000000000..4e2a6f00fd --- /dev/null +++ b/keyboards/handwired/kbod/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../Makefile +endif \ No newline at end of file diff --git a/keyboards/handwired/kbod/config.h b/keyboards/handwired/kbod/config.h new file mode 100644 index 0000000000..e73b7d0865 --- /dev/null +++ b/keyboards/handwired/kbod/config.h @@ -0,0 +1,162 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER fudanchii +#define PRODUCT kbod +#define DESCRIPTION Keyboard of Disapproval + +/* key matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 8 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +#define MATRIX_ROW_PINS { C6, D7, E6, B4, B5, B6, B7, D6 } +#define MATRIX_COL_PINS { D0, D1, F0, F1, F4, F5, F6, F7 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/handwired/kbod/kbod.c b/keyboards/handwired/kbod/kbod.c new file mode 100644 index 0000000000..9a12cae0d2 --- /dev/null +++ b/keyboards/handwired/kbod/kbod.c @@ -0,0 +1,28 @@ +#include "kbod.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/handwired/kbod/kbod.h b/keyboards/handwired/kbod/kbod.h new file mode 100644 index 0000000000..629fb3eac8 --- /dev/null +++ b/keyboards/handwired/kbod/kbod.h @@ -0,0 +1,25 @@ +#ifndef KBOD_H +#define KBOD_H + +#include "quantum.h" + +// This a shortcut to help you visually see your layout. +// The following is an example using the Planck MIT layout +// The first section contains all of the arguements +// The second converts the arguments into a two-dimensional array +#define KEYMAP( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, K2C, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, \ + k40, k41, k42, k43, k44, k45, k46, k47 \ +) \ +{ \ + { k00, k01, k02, k03, k04, k05, k06, k07 }, { k08, k09, k0A, k0B, k0C, k0D, KC_NO, KC_NO }, \ + { k10, k11, k12, k13, k14, k15, k16, k17 }, { k18, k19, k1A, k1B, k1C, k1D, KC_NO, k3B }, \ + { k20, k21, k22, k23, k24, k25, k26, k27 }, { k28, k29, k2A, k2B, k2C, k38, k39, k3A }, \ + { k30, k31, k32, k33, k34, k35, k36, k37 }, \ + { k40, k41, k42, k43, k44, k45, k46, k47 }, \ +} + +#endif diff --git a/keyboards/handwired/kbod/keymaps/default/Makefile b/keyboards/handwired/kbod/keymaps/default/Makefile new file mode 100644 index 0000000000..0d9def930c --- /dev/null +++ b/keyboards/handwired/kbod/keymaps/default/Makefile @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/handwired/kbod/keymaps/default/config.h b/keyboards/handwired/kbod/keymaps/default/config.h new file mode 100644 index 0000000000..df06a26206 --- /dev/null +++ b/keyboards/handwired/kbod/keymaps/default/config.h @@ -0,0 +1,8 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +// place overrides here + +#endif \ No newline at end of file diff --git a/keyboards/handwired/kbod/keymaps/default/keymap.c b/keyboards/handwired/kbod/keymaps/default/keymap.c new file mode 100644 index 0000000000..9245270eb3 --- /dev/null +++ b/keyboards/handwired/kbod/keymaps/default/keymap.c @@ -0,0 +1,44 @@ +#include "kbod.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = KEYMAP( /* Base */ + KC_A, KC_1, KC_H, \ + KC_TAB, KC_SPC \ +), +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; + + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void led_set_user(uint8_t usb_led) { + +} \ No newline at end of file diff --git a/keyboards/handwired/kbod/keymaps/default/readme.md b/keyboards/handwired/kbod/keymaps/default/readme.md new file mode 100644 index 0000000000..3fe84c6194 --- /dev/null +++ b/keyboards/handwired/kbod/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for kbod \ No newline at end of file diff --git a/keyboards/handwired/kbod/readme.md b/keyboards/handwired/kbod/readme.md new file mode 100644 index 0000000000..179ab1d792 --- /dev/null +++ b/keyboards/handwired/kbod/readme.md @@ -0,0 +1,28 @@ +kbod keyboard firmware +====================== + +## Quantum MK Firmware + +For the full Quantum feature list, see [the parent readme](/). + +## Building + +Download or clone the whole firmware and navigate to the keyboards/kbod folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file. + +Depending on which keymap you would like to use, you will have to compile slightly differently. + +### Default + +To build with the default keymap, simply run `make default`. + +### Other Keymaps + +Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files. + +To build the firmware binary hex file with a keymap just do `make` with a keymap like this: + +``` +$ make [default|jack|] +``` + +Keymaps follow the format **__\.c__** and are stored in the `keymaps` folder. diff --git a/keyboards/handwired/kbod/rules.mk b/keyboards/handwired/kbod/rules.mk new file mode 100644 index 0000000000..4fcd147a9a --- /dev/null +++ b/keyboards/handwired/kbod/rules.mk @@ -0,0 +1,68 @@ +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= no # Console for debug(+400) +COMMAND_ENABLE ?= no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE ?= no # USB Nkey Rollover +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE ?= no # MIDI controls +UNICODE_ENABLE ?= no # Unicode +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE ?= no # Audio output on port C6 +FAUXCLICKY_ENABLE ?= no # Use buzzer to emulate clicky switches From 8b206e1e75f487a473b8a58223c857363ce0a6e4 Mon Sep 17 00:00:00 2001 From: Nurahmadie Date: Wed, 22 Feb 2017 06:40:48 +0700 Subject: [PATCH 048/117] Add initial keymap *crossfingers* --- keyboards/handwired/kbod/kbod.h | 4 - .../handwired/kbod/keymaps/default/keymap.c | 105 +++++++++++++----- 2 files changed, 77 insertions(+), 32 deletions(-) diff --git a/keyboards/handwired/kbod/kbod.h b/keyboards/handwired/kbod/kbod.h index 629fb3eac8..04ecdd3921 100644 --- a/keyboards/handwired/kbod/kbod.h +++ b/keyboards/handwired/kbod/kbod.h @@ -3,10 +3,6 @@ #include "quantum.h" -// This a shortcut to help you visually see your layout. -// The following is an example using the Planck MIT layout -// The first section contains all of the arguements -// The second converts the arguments into a two-dimensional array #define KEYMAP( \ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, \ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, \ diff --git a/keyboards/handwired/kbod/keymaps/default/keymap.c b/keyboards/handwired/kbod/keymaps/default/keymap.c index 9245270eb3..137ddf3878 100644 --- a/keyboards/handwired/kbod/keymaps/default/keymap.c +++ b/keyboards/handwired/kbod/keymaps/default/keymap.c @@ -1,44 +1,93 @@ #include "kbod.h" +#define _____ KC_TRNS + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = KEYMAP( /* Base */ - KC_A, KC_1, KC_H, \ - KC_TAB, KC_SPC \ -), + KEYMAP( /* Base */ + F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQUAL, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLASH, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOT, KC_ENTER, + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_RSPO, + LT(1, KC_LEAD), KC_LCTL, KC_LALT, KC_SPACE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL + ), + KEYMAP( /* Cursor layer */ + KC_GRAVE, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, + _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_INSERT, + _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_HOME, KC_END, _____, + _____, _____, _____, _____, _____, _____, _____, _____, KC_PGUP, KC_PGDN, KC_UP, _____, + _____, _____, _____, _____, _____, KC_LEFT, KC_DOWN, KC_RIGHT, _____ + ), + KEYMAP( /* Multimedia layer */ + _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, + _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, + _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, + _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_MS_BTN1, KC_MS_UP, _____, + LT(3, KC_LEAD), _____, _____, _____, _____, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_BTN3 + ), + KEYMAP( /* Multimedia layer */ + _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, + _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, + _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, + _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_MS_BTN1, KC_MS_WH_UP, _____, + _____, _____, _____, _____, _____, KC_MS_WH_LEFT, KC_MS_WH_DOWN, KC_MS_WH_RIGHT, KC_MS_BTN3 + ), }; const uint16_t PROGMEM fn_actions[] = { - + [0] = ACTION_FUNCTION(0), }; +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + static uint8_t shift_esc_shift_mask; + switch (id) { + case 0: + shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; + if (record->event.pressed) { + if (shift_esc_shift_mask) { + add_key(KC_GRV); + send_keyboard_report(); + } else { + add_key(KC_ESC); + send_keyboard_report(); + } + } else { + if (shift_esc_shift_mask) { + del_key(KC_GRV); + send_keyboard_report(); + } else { + del_key(KC_ESC); + send_keyboard_report(); + } + } + break; + } +} + + +LEADER_EXTERNS(); + +void matrix_scan_user(void) { + LEADER_DICTIONARY() { + leading = false; + leader_end(); + + SEQ_ONE_KEY(KC_B) { + layer_switch(0); + } + SEQ_ONE_KEY(KC_C) { + layer_switch(1); + } + SEQ_ONE_KEY(KC_M) { + layer_switch(2); + } + } +} + const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - // MACRODOWN only works in this function - switch(id) { - case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - } else { - unregister_code(KC_RSFT); - } - break; - } return MACRO_NONE; }; - -void matrix_init_user(void) { - -} - -void matrix_scan_user(void) { - -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - return true; -} - void led_set_user(uint8_t usb_led) { } \ No newline at end of file From 7614c6b7a75c93b248d36f039f919ab925afde32 Mon Sep 17 00:00:00 2001 From: Nurahmadie Date: Fri, 24 Feb 2017 12:06:10 +0700 Subject: [PATCH 049/117] Remove lead keys, fix some typos, rearrange layers --- keyboards/handwired/kbod/kbod.h | 2 +- .../handwired/kbod/keymaps/default/keymap.c | 37 +++++-------------- 2 files changed, 10 insertions(+), 29 deletions(-) diff --git a/keyboards/handwired/kbod/kbod.h b/keyboards/handwired/kbod/kbod.h index 04ecdd3921..3560636242 100644 --- a/keyboards/handwired/kbod/kbod.h +++ b/keyboards/handwired/kbod/kbod.h @@ -6,7 +6,7 @@ #define KEYMAP( \ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, \ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, \ - k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, K2C, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, \ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, \ k40, k41, k42, k43, k44, k45, k46, k47 \ ) \ diff --git a/keyboards/handwired/kbod/keymaps/default/keymap.c b/keyboards/handwired/kbod/keymaps/default/keymap.c index 137ddf3878..463b1fc8be 100644 --- a/keyboards/handwired/kbod/keymaps/default/keymap.c +++ b/keyboards/handwired/kbod/keymaps/default/keymap.c @@ -7,29 +7,29 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQUAL, KC_BSPC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLASH, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOT, KC_ENTER, - KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_RSPO, - LT(1, KC_LEAD), KC_LCTL, KC_LALT, KC_SPACE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_RSPC, + MO(1), KC_LCTL, KC_LALT, KC_SPACE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL ), KEYMAP( /* Cursor layer */ KC_GRAVE, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, - _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_INSERT, - _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_HOME, KC_END, _____, + TO(3), _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_INSERT, + TO(2), _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_HOME, KC_END, _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_PGUP, KC_PGDN, KC_UP, _____, - _____, _____, _____, _____, _____, KC_LEFT, KC_DOWN, KC_RIGHT, _____ + _____, _____, _____, _____, KC_LEFT, KC_DOWN, KC_RIGHT, _____ ), KEYMAP( /* Multimedia layer */ _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_MS_BTN1, KC_MS_UP, _____, - LT(3, KC_LEAD), _____, _____, _____, _____, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_BTN3 + TO(0), _____, _____, _____, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_BTN3 ), KEYMAP( /* Multimedia layer */ _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_MS_BTN1, KC_MS_WH_UP, _____, - _____, _____, _____, _____, _____, KC_MS_WH_LEFT, KC_MS_WH_DOWN, KC_MS_WH_RIGHT, KC_MS_BTN3 + TO(0), _____, _____, _____, KC_MS_WH_LEFT, KC_MS_WH_DOWN, KC_MS_WH_RIGHT, KC_MS_BTN3 ), }; @@ -37,6 +37,7 @@ const uint16_t PROGMEM fn_actions[] = { [0] = ACTION_FUNCTION(0), }; +#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { static uint8_t shift_esc_shift_mask; switch (id) { @@ -63,31 +64,11 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { } } - -LEADER_EXTERNS(); - -void matrix_scan_user(void) { - LEADER_DICTIONARY() { - leading = false; - leader_end(); - - SEQ_ONE_KEY(KC_B) { - layer_switch(0); - } - SEQ_ONE_KEY(KC_C) { - layer_switch(1); - } - SEQ_ONE_KEY(KC_M) { - layer_switch(2); - } - } -} - const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { return MACRO_NONE; }; void led_set_user(uint8_t usb_led) { - + } \ No newline at end of file From af7430b896bdc15dd007b2227ed0b6f2feb0634a Mon Sep 17 00:00:00 2001 From: Nurahmadie Date: Sat, 25 Feb 2017 12:36:53 +0700 Subject: [PATCH 050/117] Add capslock led, and audio buttons - Also change layer switch to momentary --- .../handwired/kbod/keymaps/default/keymap.c | 42 ++++++++++++------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/keyboards/handwired/kbod/keymaps/default/keymap.c b/keyboards/handwired/kbod/keymaps/default/keymap.c index 463b1fc8be..3514ffb98a 100644 --- a/keyboards/handwired/kbod/keymaps/default/keymap.c +++ b/keyboards/handwired/kbod/keymaps/default/keymap.c @@ -2,34 +2,36 @@ #define _____ KC_TRNS +#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KEYMAP( /* Base */ F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQUAL, KC_BSPC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLASH, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOT, KC_ENTER, - KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_RSPC, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_RSFT, MO(1), KC_LCTL, KC_LALT, KC_SPACE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL ), KEYMAP( /* Cursor layer */ KC_GRAVE, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, - TO(3), _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_INSERT, - TO(2), _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_HOME, KC_END, _____, - _____, _____, _____, _____, _____, _____, _____, _____, KC_PGUP, KC_PGDN, KC_UP, _____, - _____, _____, _____, _____, KC_LEFT, KC_DOWN, KC_RIGHT, _____ + MO(3), _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_INSERT, + MO(2), _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_HOME, _____, + _____, _____, _____, _____, _____, _____, _____, _____, KC_PGUP, KC_PGDN, KC_END, KC_UP, + _____, _____, _____, _____, _____, KC_LEFT, KC_DOWN, KC_RIGHT ), KEYMAP( /* Multimedia layer */ - _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, - _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, + TO(0), _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_AUDIO_MUTE, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, _____, + _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_PSCR, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, - _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_MS_BTN1, KC_MS_UP, _____, - TO(0), _____, _____, _____, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_BTN3 + _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, + _____, _____, _____, _____, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_BTN3 ), KEYMAP( /* Multimedia layer */ - _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, - _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, + TO(0), _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_AUDIO_MUTE, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, _____, + _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_PSCR, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, - _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_MS_BTN1, KC_MS_WH_UP, _____, - TO(0), _____, _____, _____, KC_MS_WH_LEFT, KC_MS_WH_DOWN, KC_MS_WH_RIGHT, KC_MS_BTN3 + _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_MS_BTN1, KC_MS_WH_UP, KC_MS_BTN2, + _____, _____, _____, _____, KC_MS_WH_LEFT, KC_MS_WH_DOWN, KC_MS_WH_RIGHT, KC_MS_BTN3 ), }; @@ -37,7 +39,7 @@ const uint16_t PROGMEM fn_actions[] = { [0] = ACTION_FUNCTION(0), }; -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) + void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { static uint8_t shift_esc_shift_mask; switch (id) { @@ -66,9 +68,17 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - return MACRO_NONE; + return MACRO_NONE; }; void led_set_user(uint8_t usb_led) { - + if (usb_led & _BV(USB_LED_CAPS_LOCK)) { + PORTB |= _BV(PB0); + } else { + PORTB &= ~_BV(PB0); + } +} + +void matrix_init_user(void) { + DDRB |= _BV(PB0); } \ No newline at end of file From c9dd11d5abec11aa046031c12b1aa5edc5efae77 Mon Sep 17 00:00:00 2001 From: Nurahmadie Date: Sat, 25 Feb 2017 13:30:18 +0700 Subject: [PATCH 051/117] Enable alt-F4 without [Fn] - Add led indicator when keymap not on base layer \o/ --- .../handwired/kbod/keymaps/default/keymap.c | 62 ++++++++++++------- 1 file changed, 41 insertions(+), 21 deletions(-) diff --git a/keyboards/handwired/kbod/keymaps/default/keymap.c b/keyboards/handwired/kbod/keymaps/default/keymap.c index 3514ffb98a..6f2805d9dc 100644 --- a/keyboards/handwired/kbod/keymaps/default/keymap.c +++ b/keyboards/handwired/kbod/keymaps/default/keymap.c @@ -2,11 +2,31 @@ #define _____ KC_TRNS -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) +#define MODS_PRESSED(btn) (get_mods() & (MOD_BIT(KC_L##btn)|MOD_BIT(KC_R##btn))) + +#define SET_WHETHER(mask, btn1, btn2) \ +if (record->event.pressed) { \ + if (mask) { \ + add_key(btn2); \ + send_keyboard_report(); \ + } else { \ + add_key(btn1); \ + send_keyboard_report(); \ + } \ +} else { \ + if (mask) { \ + del_key(btn2); \ + send_keyboard_report(); \ + } else { \ + del_key(btn1); \ + send_keyboard_report(); \ + } \ +} \ + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KEYMAP( /* Base */ - F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQUAL, KC_BSPC, + F(0), KC_1, KC_2, KC_3, F(1), KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQUAL, KC_BSPC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLASH, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOT, KC_ENTER, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_RSFT, @@ -37,31 +57,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM fn_actions[] = { [0] = ACTION_FUNCTION(0), + [1] = ACTION_FUNCTION(1), }; void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - static uint8_t shift_esc_shift_mask; + static uint8_t shift_esc_mask; + static uint8_t alt_mask; switch (id) { case 0: - shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; - if (record->event.pressed) { - if (shift_esc_shift_mask) { - add_key(KC_GRV); - send_keyboard_report(); - } else { - add_key(KC_ESC); - send_keyboard_report(); - } - } else { - if (shift_esc_shift_mask) { - del_key(KC_GRV); - send_keyboard_report(); - } else { - del_key(KC_ESC); - send_keyboard_report(); - } - } + shift_esc_mask = MODS_PRESSED(SHIFT); + SET_WHETHER(shift_esc_mask, KC_ESC, KC_GRAVE) + break; + case 1: + alt_mask = MODS_PRESSED(ALT); + SET_WHETHER(alt_mask, KC_4, KC_F4); break; } } @@ -81,4 +91,14 @@ void led_set_user(uint8_t usb_led) { void matrix_init_user(void) { DDRB |= _BV(PB0); + DDRC |= _BV(PC7); +} + +void matrix_scan_user(void) { + uint8_t layer = biton32(layer_state); + if (layer) { + PORTC |= _BV(PC7); + } else { + PORTC &= ~_BV(PC7); + } } \ No newline at end of file From 10105f645a7fdcf0d636e0eb2c768754521602a3 Mon Sep 17 00:00:00 2001 From: Nurahmadie Date: Sun, 26 Feb 2017 11:41:03 +0700 Subject: [PATCH 052/117] Add README --- .../handwired/kbod/keymaps/default/readme.md | 6 ++++- keyboards/handwired/kbod/readme.md | 25 ++++++------------- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/keyboards/handwired/kbod/keymaps/default/readme.md b/keyboards/handwired/kbod/keymaps/default/readme.md index 3fe84c6194..35c22ec007 100644 --- a/keyboards/handwired/kbod/keymaps/default/readme.md +++ b/keyboards/handwired/kbod/keymaps/default/readme.md @@ -1 +1,5 @@ -# The default keymap for kbod \ No newline at end of file +# The default keymap for kbod + +This is the default keymap for kbod, + +it consists of a base layer with QWERTY layout, a momentary cursor-layer, and mouse-keys and multimedia layers. \ No newline at end of file diff --git a/keyboards/handwired/kbod/readme.md b/keyboards/handwired/kbod/readme.md index 179ab1d792..bd58fdd384 100644 --- a/keyboards/handwired/kbod/readme.md +++ b/keyboards/handwired/kbod/readme.md @@ -1,28 +1,19 @@ -kbod keyboard firmware +KBOD keyboard firmware ====================== +KBOD is a 60% Keyboard kit, hand-wired, with Arduino Micro as its controller. It's utilize 8x8 matrix and has layout similar to GH-60 + ## Quantum MK Firmware For the full Quantum feature list, see [the parent readme](/). ## Building -Download or clone the whole firmware and navigate to the keyboards/kbod folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file. +Download or clone the whole firmware and use ```make handwired-kbod-default``` to generate the .hex file. You may flash it with avrdude -Depending on which keymap you would like to use, you will have to compile slightly differently. - -### Default - -To build with the default keymap, simply run `make default`. - -### Other Keymaps - -Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files. - -To build the firmware binary hex file with a keymap just do `make` with a keymap like this: +## Flashing +Something along this line: ``` -$ make [default|jack|] -``` - -Keymaps follow the format **__\.c__** and are stored in the `keymaps` folder. +avrdude -p m32u4 -c avr109 -P -C -e -u flash:w:handwired_kbod_default.hex +``` \ No newline at end of file From f5d78c739d48bad32409b3819c8d624d5e78c017 Mon Sep 17 00:00:00 2001 From: Nurahmadie Date: Sun, 26 Feb 2017 11:44:21 +0700 Subject: [PATCH 053/117] Forgot semicolon, and add reference link --- keyboards/handwired/kbod/keymaps/default/keymap.c | 2 +- keyboards/handwired/kbod/readme.md | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/keyboards/handwired/kbod/keymaps/default/keymap.c b/keyboards/handwired/kbod/keymaps/default/keymap.c index 6f2805d9dc..a6c09dd530 100644 --- a/keyboards/handwired/kbod/keymaps/default/keymap.c +++ b/keyboards/handwired/kbod/keymaps/default/keymap.c @@ -67,7 +67,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { switch (id) { case 0: shift_esc_mask = MODS_PRESSED(SHIFT); - SET_WHETHER(shift_esc_mask, KC_ESC, KC_GRAVE) + SET_WHETHER(shift_esc_mask, KC_ESC, KC_GRAVE); break; case 1: alt_mask = MODS_PRESSED(ALT); diff --git a/keyboards/handwired/kbod/readme.md b/keyboards/handwired/kbod/readme.md index bd58fdd384..67bf711bee 100644 --- a/keyboards/handwired/kbod/readme.md +++ b/keyboards/handwired/kbod/readme.md @@ -16,4 +16,6 @@ Something along this line: ``` avrdude -p m32u4 -c avr109 -P -C -e -u flash:w:handwired_kbod_default.hex -``` \ No newline at end of file +``` + +[More info](https://github.com/fudanchii/keyboard_of_disapproval) \ No newline at end of file From 15ddaa7f1929aa301a325b03c57e267524d56ea8 Mon Sep 17 00:00:00 2001 From: Nurahmadie Date: Sat, 11 Mar 2017 20:52:52 +0700 Subject: [PATCH 054/117] Fix layer stuck, and add numpad support --- keyboards/handwired/kbod/config.h | 5 +++++ .../handwired/kbod/keymaps/default/keymap.c | 20 +++++++++---------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/keyboards/handwired/kbod/config.h b/keyboards/handwired/kbod/config.h index e73b7d0865..f3d0c8bf2d 100644 --- a/keyboards/handwired/kbod/config.h +++ b/keyboards/handwired/kbod/config.h @@ -159,4 +159,9 @@ along with this program. If not, see . //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION +#define PREVENT_STUCK_MODIFIERS + +#undef TAPPING_TOGGLE +#define TAPPING_TOGGLE 2 + #endif diff --git a/keyboards/handwired/kbod/keymaps/default/keymap.c b/keyboards/handwired/kbod/keymaps/default/keymap.c index a6c09dd530..65c5f552c8 100644 --- a/keyboards/handwired/kbod/keymaps/default/keymap.c +++ b/keyboards/handwired/kbod/keymaps/default/keymap.c @@ -30,7 +30,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLASH, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOT, KC_ENTER, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_RSFT, - MO(1), KC_LCTL, KC_LALT, KC_SPACE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL + TT(1), KC_LCTL, KC_LALT, KC_SPACE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL ), KEYMAP( /* Cursor layer */ KC_GRAVE, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, @@ -39,19 +39,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _____, _____, _____, _____, _____, _____, _____, _____, KC_PGUP, KC_PGDN, KC_END, KC_UP, _____, _____, _____, _____, _____, KC_LEFT, KC_DOWN, KC_RIGHT ), - KEYMAP( /* Multimedia layer */ - TO(0), _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_AUDIO_MUTE, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, _____, - _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_PSCR, - _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, - _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, + KEYMAP( /* Keypad layer */ + TO(0), _____, _____, _____, _____, _____, _____, KC_P7, KC_P8, KC_P9, _____, KC_PMNS, KC_PPLS, _____, + _____, _____, _____, _____, _____, _____, _____, KC_P4, KC_P5, KC_P6, _____, _____, _____, _____, + _____, _____, _____, _____, _____, _____, _____, KC_P1, KC_P2, KC_P3, _____, _____, _____, + _____, _____, _____, _____, _____, _____, _____, KC_P0, _____, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, _____, _____, _____, _____, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_BTN3 ), KEYMAP( /* Multimedia layer */ TO(0), _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_AUDIO_MUTE, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, _____, - _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_PSCR, - _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, - _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_MS_BTN1, KC_MS_WH_UP, KC_MS_BTN2, - _____, _____, _____, _____, KC_MS_WH_LEFT, KC_MS_WH_DOWN, KC_MS_WH_RIGHT, KC_MS_BTN3 + _____, _____, KC_WAKE, _____, _____, _____, _____, _____, _____, _____, KC_MSTP, KC_MPRV, KC_MNXT, _____, + _____, _____, KC_SLEP, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, + _____, _____, KC_PWR, _____, _____, _____, _____, _____, _____, KC_MS_BTN1, KC_MS_WH_UP, KC_MS_BTN2, + _____, _____, _____, KC_MPLY, KC_MS_WH_LEFT, KC_MS_WH_DOWN, KC_MS_WH_RIGHT, KC_MS_BTN3 ), }; From 649d08742a7aec4001193bb5a7a35ca7935a9753 Mon Sep 17 00:00:00 2001 From: Nurahmadie Date: Tue, 28 Mar 2017 16:17:10 +0700 Subject: [PATCH 055/117] Use tap-toggle to move between layers. - Add PDOT key --- keyboards/handwired/kbod/keymaps/default/keymap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/handwired/kbod/keymaps/default/keymap.c b/keyboards/handwired/kbod/keymaps/default/keymap.c index 65c5f552c8..1386b742f5 100644 --- a/keyboards/handwired/kbod/keymaps/default/keymap.c +++ b/keyboards/handwired/kbod/keymaps/default/keymap.c @@ -34,16 +34,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), KEYMAP( /* Cursor layer */ KC_GRAVE, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, - MO(3), _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_INSERT, - MO(2), _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_HOME, _____, + TT(3), _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_INSERT, + TT(2), _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_HOME, _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_PGUP, KC_PGDN, KC_END, KC_UP, _____, _____, _____, _____, _____, KC_LEFT, KC_DOWN, KC_RIGHT ), KEYMAP( /* Keypad layer */ - TO(0), _____, _____, _____, _____, _____, _____, KC_P7, KC_P8, KC_P9, _____, KC_PMNS, KC_PPLS, _____, + TO(0), KC_1, KC_2, KC_3, F(1), KC_5, KC_6, KC_P7, KC_P8, KC_P9, KC_P0, KC_PMNS, KC_PPLS, KC_BSPC, _____, _____, _____, _____, _____, _____, _____, KC_P4, KC_P5, KC_P6, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_P1, KC_P2, KC_P3, _____, _____, _____, - _____, _____, _____, _____, _____, _____, _____, KC_P0, _____, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, + _____, _____, _____, _____, _____, _____, _____, KC_P0, KC_PDOT, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, _____, _____, _____, _____, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_BTN3 ), KEYMAP( /* Multimedia layer */ From 787304647961f4cb654188ddb88c22dd7991ab87 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Sun, 2 Apr 2017 14:48:33 -0700 Subject: [PATCH 056/117] removed my handwired boards to a new branch. --- keyboards/handwired/atreus50/Makefile | 3 - keyboards/handwired/atreus50/atreus50.c | 1 - keyboards/handwired/atreus50/atreus50.h | 18 -- keyboards/handwired/atreus50/config.h | 58 ------- .../atreus50/keymaps/default/Makefile | 21 --- .../atreus50/keymaps/default/keymap.c | 128 -------------- keyboards/handwired/atreus50/rules.mk | 56 ------ keyboards/handwired/xk66/Makefile | 3 - keyboards/handwired/xk66/config.h | 162 ------------------ .../handwired/xk66/keymaps/default/Makefile | 21 --- .../handwired/xk66/keymaps/default/config.h | 8 - .../handwired/xk66/keymaps/default/keymap.c | 90 ---------- .../handwired/xk66/keymaps/default/readme.md | 1 - keyboards/handwired/xk66/readme.md | 28 --- keyboards/handwired/xk66/rules.mk | 67 -------- keyboards/handwired/xk66/xk66.c | 8 - keyboards/handwired/xk66/xk66.h | 25 --- 17 files changed, 698 deletions(-) delete mode 100644 keyboards/handwired/atreus50/Makefile delete mode 100644 keyboards/handwired/atreus50/atreus50.c delete mode 100644 keyboards/handwired/atreus50/atreus50.h delete mode 100644 keyboards/handwired/atreus50/config.h delete mode 100644 keyboards/handwired/atreus50/keymaps/default/Makefile delete mode 100644 keyboards/handwired/atreus50/keymaps/default/keymap.c delete mode 100644 keyboards/handwired/atreus50/rules.mk delete mode 100644 keyboards/handwired/xk66/Makefile delete mode 100644 keyboards/handwired/xk66/config.h delete mode 100644 keyboards/handwired/xk66/keymaps/default/Makefile delete mode 100644 keyboards/handwired/xk66/keymaps/default/config.h delete mode 100644 keyboards/handwired/xk66/keymaps/default/keymap.c delete mode 100644 keyboards/handwired/xk66/keymaps/default/readme.md delete mode 100644 keyboards/handwired/xk66/readme.md delete mode 100644 keyboards/handwired/xk66/rules.mk delete mode 100644 keyboards/handwired/xk66/xk66.c delete mode 100644 keyboards/handwired/xk66/xk66.h diff --git a/keyboards/handwired/atreus50/Makefile b/keyboards/handwired/atreus50/Makefile deleted file mode 100644 index bd09e5885d..0000000000 --- a/keyboards/handwired/atreus50/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -ifndef MAKEFILE_INCLUDED - include ../../../Makefile -endif diff --git a/keyboards/handwired/atreus50/atreus50.c b/keyboards/handwired/atreus50/atreus50.c deleted file mode 100644 index dd0dbdaac9..0000000000 --- a/keyboards/handwired/atreus50/atreus50.c +++ /dev/null @@ -1 +0,0 @@ -#include "atreus50.h" diff --git a/keyboards/handwired/atreus50/atreus50.h b/keyboards/handwired/atreus50/atreus50.h deleted file mode 100644 index 5d27109cca..0000000000 --- a/keyboards/handwired/atreus50/atreus50.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef ATREUS50_H -#define ATREUS50_H - -#include "quantum.h" - -#define KEYMAP( \ - K000, K001, K002, K003, K004, K005, K007, K008, K009, K010, K011, K012, \ - K100, K101, K102, K103, K104, K105, K107, K108, K109, K110, K111, K112, \ - K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312 \ -) { \ - { K000, K001, K002, K003, K004, K005, KC_NO, K007, K008, K009, K010, K011, K012 }, \ - { K100, K101, K102, K103, K104, K105, KC_NO, K107, K108, K109, K110, K111, K112 }, \ - { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212 }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312 } \ -} - -#endif \ No newline at end of file diff --git a/keyboards/handwired/atreus50/config.h b/keyboards/handwired/atreus50/config.h deleted file mode 100644 index 0248032a01..0000000000 --- a/keyboards/handwired/atreus50/config.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef CONFIG_H -#define CONFIG_H - -#include "config_common.h" - -/* USB Device descriptor parameter */ -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x6060 -#define DEVICE_VER 0x0001 -#define MANUFACTURER qmkbuilder -#define PRODUCT Atreus50 -#define DESCRIPTION Keyboard - -/* key matrix size */ -#define MATRIX_ROWS 4 -#define MATRIX_COLS 13 - -/* key matrix pins */ -#define MATRIX_ROW_PINS { F4, F5, F6, F7 } -#define MATRIX_COL_PINS { D3, D2, D1, D0, D4, C6, D7, E6, B4, B5, B6, B2, B3 } -#define UNUSED_PINS - -/* COL2ROW or ROW2COL */ -#define DIODE_DIRECTION COL2ROW - -/* number of backlight levels */ - -#ifdef BACKLIGHT_PIN -#define BACKLIGHT_LEVELS 3 -#endif - -/* Set 0 if debouncing isn't needed */ -#define DEBOUNCING_DELAY 5 - -/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ -#define LOCKING_SUPPORT_ENABLE - -/* Locking resynchronize hack */ -#define LOCKING_RESYNC_ENABLE - -/* key combination for command */ -#define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ -) - -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - - -#ifdef RGB_DI_PIN -#define RGBLIGHT_ANIMATIONS -#define RGBLED_NUM 0 -#define RGBLIGHT_HUE_STEP 8 -#define RGBLIGHT_SAT_STEP 8 -#define RGBLIGHT_VAL_STEP 8 -#endif - -#endif \ No newline at end of file diff --git a/keyboards/handwired/atreus50/keymaps/default/Makefile b/keyboards/handwired/atreus50/keymaps/default/Makefile deleted file mode 100644 index 43fee26686..0000000000 --- a/keyboards/handwired/atreus50/keymaps/default/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -# Build Options -# change to "no" to disable the options, or define them in the Makefile in -# the appropriate keymap folder that will get included automatically -# -BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration -NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality -MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = no # Audio output on port C6 -UNICODE_ENABLE = no # Unicode -BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif \ No newline at end of file diff --git a/keyboards/handwired/atreus50/keymaps/default/keymap.c b/keyboards/handwired/atreus50/keymaps/default/keymap.c deleted file mode 100644 index b3dc17cb1a..0000000000 --- a/keyboards/handwired/atreus50/keymaps/default/keymap.c +++ /dev/null @@ -1,128 +0,0 @@ -// This is the canonical layout file for the Quantum project. If you want to add another keyboard, -// this is the style you want to emulate. - -#include "atreus50.h" -#include "action_layer.h" -#include "eeconfig.h" - -extern keymap_config_t keymap_config; - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -#define _DVORAK 0 -#define _QWERTY 1 -#define _COLEMAK 2 -#define _LOWER 3 -#define _RAISE 4 -#define _ADJUST 16 - -enum planck_keycodes { - DVORAK = SAFE_RANGE, - QWERTY, - COLEMAK, - LOWER, - RAISE, - BACKLIT -}; - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_DVORAK] = { /* dvorak */ - { KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, _______, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH }, - { KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, _______, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS }, - { KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_ENT, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT }, - { KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, KC_BSPC, KC_LGUI, KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_RCTL } - }, - - [_QWERTY] = { /* qwerty */ - { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, _______, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL }, - { KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, _______, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT }, - { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ENT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT }, - { KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, KC_BSPC, KC_LGUI, KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_RCTL } - }, - - [_COLEMAK] = { /* colemak */ - { KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, _______, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL }, - { KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, _______, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT }, - { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ENT, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT }, - { KC_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, KC_BSPC, KC_LGUI, KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_RCTL} - }, - - [_LOWER] = { - { KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, _______, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______ }, - { KC_CAPS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE }, - { _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, KC_F12, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______ }, - { _______, _______, KC_HOME, KC_END, _______, KC_DEL, _______, KC_INS, _______, KC_PGUP, KC_PGDN, _______, _______ } - }, - [_RAISE] = { - { KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, _______, KC_6, KC_7, KC_8, KC_9, KC_0, _______ }, - { KC_CAPS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS }, - { _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, KC_F12, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______ }, - { _______, _______, KC_HOME, KC_END, _______, KC_DEL, _______, KC_INS, _______, KC_PGUP, KC_PGDN, _______, _______ } - }, - [_ADJUST] = { - { KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12 }, - { _______, RESET, _______, _______, _______, _______, _______, _______, QWERTY, COLEMAK, DVORAK, _______, _______ }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ } - }, - -}; - -const uint16_t PROGMEM fn_actions[] = { - -}; - -void persistant_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - persistant_default_layer_set(1UL<<_QWERTY); - } - return false; - break; - case COLEMAK: - if (record->event.pressed) { - persistant_default_layer_set(1UL<<_COLEMAK); - } - return false; - break; - case DVORAK: - if (record->event.pressed) { - persistant_default_layer_set(1UL<<_DVORAK); - } - return false; - break; - case LOWER: - if (record->event.pressed) { - layer_on(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_LOWER); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case RAISE: - if (record->event.pressed) { - layer_on(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } else { - layer_off(_RAISE); - update_tri_layer(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - } - return true; -}; \ No newline at end of file diff --git a/keyboards/handwired/atreus50/rules.mk b/keyboards/handwired/atreus50/rules.mk deleted file mode 100644 index 1f8e943be7..0000000000 --- a/keyboards/handwired/atreus50/rules.mk +++ /dev/null @@ -1,56 +0,0 @@ -# MCU name -MCU = atmega32u4 - -# Processor frequency. -# This will define a symbol, F_CPU, in all source code files equal to the -# processor frequency in Hz. You can then use this symbol in your source code to -# calculate timings. Do NOT tack on a 'UL' at the end, this will be done -# automatically to create a 32-bit value in your source code. -# -# This will be an integer division of F_USB below, as it is sourced by -# F_USB after it has run through any CPU prescalers. Note that this value -# does not *change* the processor frequency - it should merely be updated to -# reflect the processor speed set externally so that the code can use accurate -# software delays. -F_CPU = 16000000 - -# -# LUFA specific -# -# Target architecture (see library "Board Types" documentation). -ARCH = AVR8 - -# Input clock frequency. -# This will define a symbol, F_USB, in all source code files equal to the -# input clock frequency (before any prescaling is performed) in Hz. This value may -# differ from F_CPU if prescaling is used on the latter, and is required as the -# raw input clock is fed directly to the PLL sections of the AVR for high speed -# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' -# at the end, this will be done automatically to create a 32-bit value in your -# source code. -# -# If no clock division is performed on the input clock inside the AVR (via the -# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. -F_USB = $(F_CPU) - -# Interrupt driven control endpoint task(+60) -OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT - - -# Boot Section Size in *bytes* -OPT_DEFS += -DBOOTLOADER_SIZE=4096 - - -# Build Options -# comment out to disable the options. -# -BOOTMAGIC_ENABLE ?= yes # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) -EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) -CONSOLE_ENABLE ?= no # Console for debug(+400) -COMMAND_ENABLE ?= no # Commands for debug and configuration -SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend -NKRO_ENABLE ?= yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality -AUDIO_ENABLE ?= no -RGBLIGHT_ENABLE ?= no \ No newline at end of file diff --git a/keyboards/handwired/xk66/Makefile b/keyboards/handwired/xk66/Makefile deleted file mode 100644 index bd09e5885d..0000000000 --- a/keyboards/handwired/xk66/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -ifndef MAKEFILE_INCLUDED - include ../../../Makefile -endif diff --git a/keyboards/handwired/xk66/config.h b/keyboards/handwired/xk66/config.h deleted file mode 100644 index 02ff2a6bf7..0000000000 --- a/keyboards/handwired/xk66/config.h +++ /dev/null @@ -1,162 +0,0 @@ -/* -Copyright 2012 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#ifndef CONFIG_H -#define CONFIG_H - -#include "config_common.h" - -/* USB Device descriptor parameter */ -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x6060 -#define DEVICE_VER 0x0001 -#define MANUFACTURER Xyverz -#define PRODUCT XK-66 -#define DESCRIPTION A hand-wired 66-key keyboard by Xyverz - -/* key matrix size */ -#define MATRIX_ROWS 5 -#define MATRIX_COLS 14 - -/* - * Keyboard Matrix Assignments - * - * Change this to how you wired your keyboard - * COLS: AVR pins used for columns, left to right - * ROWS: AVR pins used for rows, top to bottom - * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) - * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) - * -*/ -#define MATRIX_ROW_PINS { B5, B4, D7, D6, D4 } -#define MATRIX_COL_PINS { B6, F7, F6, F5, F4, F1, F0, D1, D0, B7, B3, B2, B1, B0 } -#define UNUSED_PINS - -/* COL2ROW or ROW2COL */ -#define DIODE_DIRECTION COL2ROW - -// #define BACKLIGHT_PIN B7 -// #define BACKLIGHT_BREATHING -// #define BACKLIGHT_LEVELS 3 - - -/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ -#define DEBOUNCING_DELAY 5 - -/* define if matrix has ghost (lacks anti-ghosting diodes) */ -//#define MATRIX_HAS_GHOST - -/* number of backlight levels */ - -/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ -#define LOCKING_SUPPORT_ENABLE -/* Locking resynchronize hack */ -#define LOCKING_RESYNC_ENABLE - -/* - * Force NKRO - * - * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved - * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the - * makefile for this to work.) - * - * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) - * until the next keyboard reset. - * - * NKRO may prevent your keystrokes from being detected in the BIOS, but it is - * fully operational during normal computer usage. - * - * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) - * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by - * bootmagic, NKRO mode will always be enabled until it is toggled again during a - * power-up. - * - */ -//#define FORCE_NKRO - -/* - * Magic Key Options - * - * Magic keys are hotkey commands that allow control over firmware functions of - * the keyboard. They are best used in combination with the HID Listen program, - * found here: https://www.pjrc.com/teensy/hid_listen.html - * - * The options below allow the magic key functionality to be changed. This is - * useful if your keyboard/keypad is missing keys and you want magic key support. - * - */ - -/* key combination for magic key command */ -#define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ -) - -/* control how magic key switches layers */ -//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true -//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true -//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false - -/* override magic key keymap */ -//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS -//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS -//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM -//#define MAGIC_KEY_HELP1 H -//#define MAGIC_KEY_HELP2 SLASH -//#define MAGIC_KEY_DEBUG D -//#define MAGIC_KEY_DEBUG_MATRIX X -//#define MAGIC_KEY_DEBUG_KBD K -//#define MAGIC_KEY_DEBUG_MOUSE M -//#define MAGIC_KEY_VERSION V -//#define MAGIC_KEY_STATUS S -//#define MAGIC_KEY_CONSOLE C -//#define MAGIC_KEY_LAYER0_ALT1 ESC -//#define MAGIC_KEY_LAYER0_ALT2 GRAVE -//#define MAGIC_KEY_LAYER0 0 -//#define MAGIC_KEY_LAYER1 1 -//#define MAGIC_KEY_LAYER2 2 -//#define MAGIC_KEY_LAYER3 3 -//#define MAGIC_KEY_LAYER4 4 -//#define MAGIC_KEY_LAYER5 5 -//#define MAGIC_KEY_LAYER6 6 -//#define MAGIC_KEY_LAYER7 7 -//#define MAGIC_KEY_LAYER8 8 -//#define MAGIC_KEY_LAYER9 9 -//#define MAGIC_KEY_BOOTLOADER PAUSE -//#define MAGIC_KEY_LOCK CAPS -//#define MAGIC_KEY_EEPROM E -//#define MAGIC_KEY_NKRO N -//#define MAGIC_KEY_SLEEP_LED Z - -/* - * Feature disable options - * These options are also useful to firmware size reduction. - */ - -/* disable debug print */ -//#define NO_DEBUG - -/* disable print */ -//#define NO_PRINT - -/* disable action features */ -//#define NO_ACTION_LAYER -//#define NO_ACTION_TAPPING -//#define NO_ACTION_ONESHOT -//#define NO_ACTION_MACRO -//#define NO_ACTION_FUNCTION - -#endif diff --git a/keyboards/handwired/xk66/keymaps/default/Makefile b/keyboards/handwired/xk66/keymaps/default/Makefile deleted file mode 100644 index f4671a9d11..0000000000 --- a/keyboards/handwired/xk66/keymaps/default/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -# Build Options -# change to "no" to disable the options, or define them in the Makefile in -# the appropriate keymap folder that will get included automatically -# -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration -NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality -MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = no # Audio output on port C6 -UNICODE_ENABLE = no # Unicode -BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif \ No newline at end of file diff --git a/keyboards/handwired/xk66/keymaps/default/config.h b/keyboards/handwired/xk66/keymaps/default/config.h deleted file mode 100644 index df06a26206..0000000000 --- a/keyboards/handwired/xk66/keymaps/default/config.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -// place overrides here - -#endif \ No newline at end of file diff --git a/keyboards/handwired/xk66/keymaps/default/keymap.c b/keyboards/handwired/xk66/keymaps/default/keymap.c deleted file mode 100644 index 61b3bd97fb..0000000000 --- a/keyboards/handwired/xk66/keymaps/default/keymap.c +++ /dev/null @@ -1,90 +0,0 @@ -#include "xk66.h" -#include "action_layer.h" -#include "eeconfig.h" - -extern keymap_config_t keymap_config; - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -#define _DV 0 -#define _QW 1 -#define _CM 2 -#define _FL 3 - -// Macro name shortcuts -#define QWERTY M(_QW) -#define DVORAK M(_DV) -#define COLEMAK M(_CM) - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[_DV] = KEYMAP ( /* Dvorak */ - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_BSPC, \ - KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSLS, \ - MO(_FL), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, \ - KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, \ - KC_LCTL, KC_LALT, KC_LGUI, KC_LEFT, KC_RGHT, KC_BSPC, KC_SPC, KC_UP, KC_DOWN, KC_RGUI, KC_RALT, KC_RCTL, MO(_FL) - ), - -[_QW] = KEYMAP ( /* Qwerty */ - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ - MO(_FL), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ - KC_LCTL, KC_LALT, KC_LGUI, KC_LEFT, KC_RGHT, KC_BSPC, KC_SPC, KC_UP, KC_DOWN, KC_RGUI, KC_RALT, KC_RCTL, MO(_FL) - ), - -[_CM] = KEYMAP ( /* Colemak */ - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ - KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, \ - MO(_FL), KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ - KC_LCTL, KC_LALT, KC_LGUI, KC_LEFT, KC_RGHT, KC_BSPC, KC_SPC, KC_UP, KC_DOWN, KC_RGUI, KC_RALT, KC_RCTL, MO(_FL) - ), - -[_FL] = KEYMAP ( /* Function Layer 1 */ - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, QWERTY, DVORAK, COLEMAK, _______, _______, _______, \ - KC_CAPS, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______, _______, _______, _______, \ - RESET, _______, _______, KC_HOME, KC_END, KC_DEL, KC_INS, KC_PGUP, KC_PGDN, _______, _______, _______, _______ - ), - -}; - - -const uint16_t PROGMEM fn_actions[] = { - -}; - -void persistant_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - switch(id) { - case _DV: - if (record->event.pressed) { - persistant_default_layer_set(1UL<<_DV); - } - break; - case _QW: - if (record->event.pressed) { - persistant_default_layer_set(1UL<<_QW); - } - break; - case _CM: - if (record->event.pressed) { - persistant_default_layer_set(1UL<<_CM); - } - break; - } - return MACRO_NONE; -}; diff --git a/keyboards/handwired/xk66/keymaps/default/readme.md b/keyboards/handwired/xk66/keymaps/default/readme.md deleted file mode 100644 index 6940fdd7c6..0000000000 --- a/keyboards/handwired/xk66/keymaps/default/readme.md +++ /dev/null @@ -1 +0,0 @@ -# The default keymap for handwired/xk66 \ No newline at end of file diff --git a/keyboards/handwired/xk66/readme.md b/keyboards/handwired/xk66/readme.md deleted file mode 100644 index 2aac6bde33..0000000000 --- a/keyboards/handwired/xk66/readme.md +++ /dev/null @@ -1,28 +0,0 @@ -handwired/xk66 keyboard firmware -====================== - -## Quantum MK Firmware - -For the full Quantum feature list, see [the parent readme](/). - -## Building - -Download or clone the whole firmware and navigate to the keyboards/handwired/xk66 folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file. - -Depending on which keymap you would like to use, you will have to compile slightly differently. - -### Default - -To build with the default keymap, simply run `make default`. - -### Other Keymaps - -Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files. - -To build the firmware binary hex file with a keymap just do `make` with a keymap like this: - -``` -$ make [default|jack|] -``` - -Keymaps follow the format **__\.c__** and are stored in the `keymaps` folder. diff --git a/keyboards/handwired/xk66/rules.mk b/keyboards/handwired/xk66/rules.mk deleted file mode 100644 index 707a5385be..0000000000 --- a/keyboards/handwired/xk66/rules.mk +++ /dev/null @@ -1,67 +0,0 @@ -# MCU name -#MCU = at90usb1287 -MCU = atmega32u4 - -# Processor frequency. -# This will define a symbol, F_CPU, in all source code files equal to the -# processor frequency in Hz. You can then use this symbol in your source code to -# calculate timings. Do NOT tack on a 'UL' at the end, this will be done -# automatically to create a 32-bit value in your source code. -# -# This will be an integer division of F_USB below, as it is sourced by -# F_USB after it has run through any CPU prescalers. Note that this value -# does not *change* the processor frequency - it should merely be updated to -# reflect the processor speed set externally so that the code can use accurate -# software delays. -F_CPU = 16000000 - - -# -# LUFA specific -# -# Target architecture (see library "Board Types" documentation). -ARCH = AVR8 - -# Input clock frequency. -# This will define a symbol, F_USB, in all source code files equal to the -# input clock frequency (before any prescaling is performed) in Hz. This value may -# differ from F_CPU if prescaling is used on the latter, and is required as the -# raw input clock is fed directly to the PLL sections of the AVR for high speed -# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' -# at the end, this will be done automatically to create a 32-bit value in your -# source code. -# -# If no clock division is performed on the input clock inside the AVR (via the -# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. -F_USB = $(F_CPU) - -# Interrupt driven control endpoint task(+60) -OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT - - -# Boot Section Size in *bytes* -# Teensy halfKay 512 -# Teensy++ halfKay 1024 -# Atmel DFU loader 4096 -# LUFA bootloader 4096 -# USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=512 - - -# Build Options -# change yes to no to disable -# -BOOTMAGIC_ENABLE ?= yes # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) -EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) -CONSOLE_ENABLE ?= yes # Console for debug(+400) -COMMAND_ENABLE ?= yes # Commands for debug and configuration -# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend -# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -NKRO_ENABLE ?= no # USB Nkey Rollover -BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default -MIDI_ENABLE ?= no # MIDI controls -UNICODE_ENABLE ?= no # Unicode -BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID -AUDIO_ENABLE ?= no # Audio output on port C6 diff --git a/keyboards/handwired/xk66/xk66.c b/keyboards/handwired/xk66/xk66.c deleted file mode 100644 index 3c3e31949e..0000000000 --- a/keyboards/handwired/xk66/xk66.c +++ /dev/null @@ -1,8 +0,0 @@ -#include "xk66.h" - -void matrix_init_kb(void) { - // put your keyboard start-up code here - // runs once when the firmware starts up - - matrix_init_user(); -} diff --git a/keyboards/handwired/xk66/xk66.h b/keyboards/handwired/xk66/xk66.h deleted file mode 100644 index 38fe129e44..0000000000 --- a/keyboards/handwired/xk66/xk66.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef XK66_H -#define XK66_H - -#include "quantum.h" -#include "led.h" - - -// This a shortcut to help you visually see your layout. -// The first section contains all of the arguements -// The second converts the arguments into a two-dimensional array -#define KEYMAP( \ - K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0a, K0b, K0c, K0d, \ - K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1a, K1b, K1c, K1d, \ - K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, K2d, \ - K30, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, K3c, \ - K40, K41, K42, K43, K44, K45, K46, K48, K49, K4a, K4b, K4c, K4d \ -) { \ - { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0a, K0b, K0c, K0d }, \ - { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1a, K1b, K1c, K1d }, \ - { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, KC_NO, K2d }, \ - { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, K3c, KC_NO }, \ - { K40, K41, K42, K43, K44, K45, K46, KC_NO, K48, K49, K4a, K4b, K4c, K4d } \ -} - -#endif \ No newline at end of file From 570b4605b2bdc7e2c9b83ab4991d4582148efb12 Mon Sep 17 00:00:00 2001 From: Alexander Schaefer Date: Sun, 2 Apr 2017 18:44:15 -0600 Subject: [PATCH 057/117] Update readme.md There's no readme specifically for the Ergodox EZ now, so link to the Ergodox readme. --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index b2dfc5f759..f7bf14b6ab 100644 --- a/readme.md +++ b/readme.md @@ -32,7 +32,7 @@ The OLKB product firmwares are maintained by [Jack Humbert](https://github.com/j This is not a tiny project. While this is the main readme, there are many other files you might want to consult. Here are some points of interest: * [**The Wiki**](https://github.com/qmk/qmk_firmware/wiki) - the entirety of the readme has been moved here -* The readme for your own keyboard: This is found under `keyboards//`. So for the ErgoDox EZ, it's [here](keyboards/ergodox/ez/); for the Planck, it's [here](keyboards/planck/) and so on. +* The readme for your own keyboard: This is found under `keyboards//`. So for the ErgoDox, it's [here](keyboards/ergodox/); for the Planck, it's [here](keyboards/planck/) and so on. * The list of possible keycodes you can use in your keymap is actually spread out in a few different places: * [doc/keycode.txt](doc/keycode.txt) - an explanation of those same keycodes. * [quantum/quantum_keycodes.h](quantum/quantum_keycodes.h) - this is where the QMK-specific aliases are all set up. Things like the Hyper and Meh key, the Leader key, and all of the other QMK innovations. These are also explained and documented below, but `quantum_keycodes.h` is where they're actually defined. From 344ebbac43ef510b29cdcdff2688186ee3ffead7 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Mon, 3 Apr 2017 11:32:54 -0400 Subject: [PATCH 058/117] Revert removal of avrdude make option --- keyboards/lets_split/rules.mk | 14 +++++++++++++- keyboards/lets_split/split_util.c | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/keyboards/lets_split/rules.mk b/keyboards/lets_split/rules.mk index ff159e0f06..79860ea35d 100644 --- a/keyboards/lets_split/rules.mk +++ b/keyboards/lets_split/rules.mk @@ -1,7 +1,7 @@ SRC += matrix.c \ i2c.c \ split_util.c \ - serial.c\ + serial.c \ ssd1306.c # MCU name @@ -74,3 +74,15 @@ USE_I2C ?= yes SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend CUSTOM_MATRIX = yes + +avrdude: build + ls /dev/tty* > /tmp/1; \ + echo "Reset your Pro Micro now"; \ + while [[ -z $$USB ]]; do \ + sleep 1; \ + ls /dev/tty* > /tmp/2; \ + USB=`diff /tmp/1 /tmp/2 | grep -o '/dev/tty.*'`; \ + done; \ + avrdude -p $(MCU) -c avr109 -P $$USB -U flash:w:$(BUILD_DIR)/$(TARGET).hex + +.PHONY: avrdude diff --git a/keyboards/lets_split/split_util.c b/keyboards/lets_split/split_util.c index 46586fbc00..39639c3b4b 100644 --- a/keyboards/lets_split/split_util.c +++ b/keyboards/lets_split/split_util.c @@ -21,7 +21,7 @@ static void setup_handedness(void) { #ifdef EE_HANDS isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS); #else - // I2c_MASTER_RIGHT ish deprecate use MASTER_RIGHT instead since this works for both serial and i2c: + // I2C_MASTER_RIGHT is deprecated, use MASTER_RIGHT instead, since this works for both serial and i2c #if defined(I2C_MASTER_RIGHT) || defined(MASTER_RIGHT) isLeftHand = !has_usb(); #else From 48f4c5997bd0e041379f592f3e1e0c306e5a5e4d Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Mon, 3 Apr 2017 12:06:28 -0400 Subject: [PATCH 059/117] Move defines for RGB to after the config.h include --- keyboards/lets_split/keymaps/hexwire/config.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/keyboards/lets_split/keymaps/hexwire/config.h b/keyboards/lets_split/keymaps/hexwire/config.h index 9c8c6d7f40..e5a779f633 100644 --- a/keyboards/lets_split/keymaps/hexwire/config.h +++ b/keyboards/lets_split/keymaps/hexwire/config.h @@ -20,13 +20,6 @@ along with this program. If not, see . #define TAPPING_TERM 150 -#undef RGBLED_NUM -#define RGBLIGHT_ANIMATIONS -#define RGBLED_NUM 8 -#define RGBLIGHT_HUE_STEP 8 -#define RGBLIGHT_SAT_STEP 8 -#define RGBLIGHT_VAL_STEP 8 - #ifdef SUBPROJECT_rev1 #include "../../rev1/config.h" #define COMPACT_KEYMAP( \ @@ -68,3 +61,10 @@ along with this program. If not, see . #ifdef SUBPROJECT_rev2fliphalf #include "../../rev2fliphalf/config.h" #endif + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 8 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 From de52bd5d8970a9b195d85c5367d4ecd125458976 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Mon, 3 Apr 2017 12:42:58 -0400 Subject: [PATCH 060/117] quick fix for space cadet shift --- quantum/quantum.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/quantum/quantum.c b/quantum/quantum.c index 62d9ef9232..4f4cee4e9b 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -135,7 +135,7 @@ void reset_keyboard(void) { #endif static bool shift_interrupted[2] = {0, 0}; -static uint16_t scs_timer = 0; +static uint16_t scs_timer[2] = {0, 0}; bool process_record_quantum(keyrecord_t *record) { @@ -395,7 +395,7 @@ bool process_record_quantum(keyrecord_t *record) { case KC_LSPO: { if (record->event.pressed) { shift_interrupted[0] = false; - scs_timer = timer_read (); + scs_timer[0] = timer_read (); register_mods(MOD_BIT(KC_LSFT)); } else { @@ -405,7 +405,7 @@ bool process_record_quantum(keyrecord_t *record) { shift_interrupted[1] = true; } #endif - if (!shift_interrupted[0] && timer_elapsed(scs_timer) < TAPPING_TERM) { + if (!shift_interrupted[0] && timer_elapsed(scs_timer[0]) < TAPPING_TERM) { register_code(LSPO_KEY); unregister_code(LSPO_KEY); } @@ -418,7 +418,7 @@ bool process_record_quantum(keyrecord_t *record) { case KC_RSPC: { if (record->event.pressed) { shift_interrupted[1] = false; - scs_timer = timer_read (); + scs_timer[1] = timer_read (); register_mods(MOD_BIT(KC_RSFT)); } else { @@ -428,7 +428,7 @@ bool process_record_quantum(keyrecord_t *record) { shift_interrupted[1] = true; } #endif - if (!shift_interrupted[1] && timer_elapsed(scs_timer) < TAPPING_TERM) { + if (!shift_interrupted[1] && timer_elapsed(scs_timer[1]) < TAPPING_TERM) { register_code(RSPC_KEY); unregister_code(RSPC_KEY); } From 4e51c1e3ca75c9abe45673866d026cc0f810a410 Mon Sep 17 00:00:00 2001 From: ishtob Date: Mon, 3 Apr 2017 13:17:41 -0400 Subject: [PATCH 061/117] Update ssd1306.c --- keyboards/lets_split/ssd1306.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/keyboards/lets_split/ssd1306.c b/keyboards/lets_split/ssd1306.c index 3c7816bb32..4bf3a87437 100644 --- a/keyboards/lets_split/ssd1306.c +++ b/keyboards/lets_split/ssd1306.c @@ -1,3 +1,4 @@ +#ifdef SSD1306OLED #include "config.h" #include "i2c.h" #include @@ -466,3 +467,4 @@ void iota_gfx_task(void) { iota_gfx_off(); } } +#endif From d0cfaba6d2f4ddf6aee7f05408971a0d4712bd60 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Mon, 3 Apr 2017 12:15:14 -0400 Subject: [PATCH 062/117] Revise KEYMAP macro to make left and right halves more clear --- keyboards/lets_split/rev1/rev1.h | 24 +++++----- keyboards/lets_split/rev2/rev2.h | 80 ++++++++++++++++---------------- 2 files changed, 52 insertions(+), 52 deletions(-) diff --git a/keyboards/lets_split/rev1/rev1.h b/keyboards/lets_split/rev1/rev1.h index 4667c9fb09..6bf9f0f038 100644 --- a/keyboards/lets_split/rev1/rev1.h +++ b/keyboards/lets_split/rev1/rev1.h @@ -9,20 +9,20 @@ //void promicro_bootloader_jmp(bool program); #define KEYMAP( \ - k00, k01, k02, k03, k04, k05, k40, k41, k42, k43, k44, k45, \ - k10, k11, k12, k13, k14, k15, k50, k51, k52, k53, k54, k55, \ - k20, k21, k22, k23, k24, k25, k60, k61, k62, k63, k64, k65, \ - k30, k31, k32, k33, k34, k35, k70, k71, k72, k73, k74, k75 \ + L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ + L30, L31, L32, L33, L34, L35, R30, R31, R32, R33, R34, R35 \ ) \ { \ - { k00, k01, k02, k03, k04, k05 }, \ - { k10, k11, k12, k13, k14, k15 }, \ - { k20, k21, k22, k23, k24, k25 }, \ - { k30, k31, k32, k33, k34, k35 }, \ - { k40, k41, k42, k43, k44, k45 }, \ - { k50, k51, k52, k53, k54, k55 }, \ - { k60, k61, k62, k63, k64, k65 }, \ - { k70, k71, k72, k73, k74, k75 } \ + { L00, L01, L02, L03, L04, L05 }, \ + { L10, L11, L12, L13, L14, L15 }, \ + { L20, L21, L22, L23, L24, L25 }, \ + { L30, L31, L32, L33, L34, L35 }, \ + { R00, R01, R02, R03, R04, R05 }, \ + { R10, R11, R12, R13, R14, R15 }, \ + { R20, R21, R22, R23, R24, R25 }, \ + { R30, R31, R32, R33, R34, R35 } \ } #endif \ No newline at end of file diff --git a/keyboards/lets_split/rev2/rev2.h b/keyboards/lets_split/rev2/rev2.h index 054731366e..0603827e08 100644 --- a/keyboards/lets_split/rev2/rev2.h +++ b/keyboards/lets_split/rev2/rev2.h @@ -10,62 +10,62 @@ #ifdef USE_I2C #include #ifdef __AVR__ -#include -#include + #include + #include #endif #ifdef SSD1306OLED -extern bool iota_gfx_init(void); -extern void iota_gfx_task(void); -extern bool iota_gfx_off(void); -extern bool iota_gfx_on(void); -extern void iota_gfx_flush(void); -extern void iota_gfx_write_char(uint8_t c); -extern void iota_gfx_write(const char *data); -extern void iota_gfx_write_P(const char *data); -extern void iota_gfx_clear_screen(void); + extern bool iota_gfx_init(void); + extern void iota_gfx_task(void); + extern bool iota_gfx_off(void); + extern bool iota_gfx_on(void); + extern void iota_gfx_flush(void); + extern void iota_gfx_write_char(uint8_t c); + extern void iota_gfx_write(const char *data); + extern void iota_gfx_write_P(const char *data); + extern void iota_gfx_clear_screen(void); #endif #endif //void promicro_bootloader_jmp(bool program); #ifndef FLIP_HALF -//Standard Keymap +// Standard Keymap +// (TRRS jack on the left half is to the right, TRRS jack on the right half is to the left) #define KEYMAP( \ - k40, k41, k42, k43, k44, k45, k05, k04, k03, k02, k01, k00, \ - k50, k51, k52, k53, k54, k55, k15, k14, k13, k12, k11, k10, \ - k60, k61, k62, k63, k64, k65, k25, k24, k23, k22, k21, k20, \ - k70, k71, k72, k73, k74, k75, k35, k34, k33, k32, k31, k30 \ + L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ + L30, L31, L32, L33, L34, L35, R30, R31, R32, R33, R34, R35 \ ) \ { \ - { k45, k44, k43, k42, k41, k40 }, \ - { k55, k54, k53, k52, k51, k50 }, \ - { k65, k64, k63, k62, k61, k60 }, \ - { k75, k74, k73, k72, k71, k70 }, \ - { k00, k01, k02, k03, k04, k05 }, \ - { k10, k11, k12, k13, k14, k15 }, \ - { k20, k21, k22, k23, k24, k25 }, \ - { k30, k31, k32, k33, k34, k35 } \ + { L00, L01, L02, L03, L04, L05 }, \ + { L10, L11, L12, L13, L14, L15 }, \ + { L20, L21, L22, L23, L24, L25 }, \ + { L30, L31, L32, L33, L34, L35 }, \ + { R05, R04, R03, R02, R01, R00 }, \ + { R15, R14, R13, R12, R11, R10 }, \ + { R25, R24, R23, R22, R21, R20 }, \ + { R35, R34, R33, R32, R31, R30 } \ } - #else -// Keymap with one side flipped +// Keymap with right side flipped +// (TRRS jack on both halves are to the right) #define KEYMAP( \ - k00, k01, k02, k03, k04, k05, k40, k41, k42, k43, k44, k45, \ - k10, k11, k12, k13, k14, k15, k50, k51, k52, k53, k54, k55, \ - k20, k21, k22, k23, k24, k25, k60, k61, k62, k63, k64, k65, \ - k30, k31, k32, k33, k34, k35, k70, k71, k72, k73, k74, k75 \ + L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ + L30, L31, L32, L33, L34, L35, R30, R31, R32, R33, R34, R35 \ ) \ { \ - { k00, k01, k02, k03, k04, k05 }, \ - { k10, k11, k12, k13, k14, k15 }, \ - { k20, k21, k22, k23, k24, k25 }, \ - { k30, k31, k32, k33, k34, k35 }, \ - { k45, k44, k43, k42, k41, k40 }, \ - { k55, k54, k53, k52, k51, k50 }, \ - { k65, k64, k63, k62, k61, k60 }, \ - { k75, k74, k73, k72, k71, k70 } \ + { L00, L01, L02, L03, L04, L05 }, \ + { L10, L11, L12, L13, L14, L15 }, \ + { L20, L21, L22, L23, L24, L25 }, \ + { L30, L31, L32, L33, L34, L35 }, \ + { R00, R01, R02, R03, R04, R05 }, \ + { R10, R11, R12, R13, R14, R15 }, \ + { R20, R21, R22, R23, R24, R25 }, \ + { R30, R31, R32, R33, R34, R35 } \ } #endif - -#endif \ No newline at end of file +#endif From 563961328be1605a7f3942f042572a0160ac2959 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Mon, 3 Apr 2017 12:31:38 -0400 Subject: [PATCH 063/117] Rename COMPACT_KEYMAP to KC_KEYMAP and move to lets_split.h --- keyboards/lets_split/keymaps/hexwire/config.h | 36 +------------------ keyboards/lets_split/keymaps/hexwire/keymap.c | 12 +++---- keyboards/lets_split/lets_split.h | 14 ++++++++ 3 files changed, 21 insertions(+), 41 deletions(-) diff --git a/keyboards/lets_split/keymaps/hexwire/config.h b/keyboards/lets_split/keymaps/hexwire/config.h index e5a779f633..27c24fe4be 100644 --- a/keyboards/lets_split/keymaps/hexwire/config.h +++ b/keyboards/lets_split/keymaps/hexwire/config.h @@ -19,47 +19,13 @@ along with this program. If not, see . #define USE_SERIAL #define TAPPING_TERM 150 +#define FLIP_HALF #ifdef SUBPROJECT_rev1 #include "../../rev1/config.h" - #define COMPACT_KEYMAP( \ - k00, k01, k02, k03, k04, k05, k40, k41, k42, k43, k44, k45, \ - k10, k11, k12, k13, k14, k15, k50, k51, k52, k53, k54, k55, \ - k20, k21, k22, k23, k24, k25, k60, k61, k62, k63, k64, k65, \ - k30, k31, k32, k33, k34, k35, k70, k71, k72, k73, k74, k75 \ - ) \ - { \ - { KC_##k00, KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05 }, \ - { KC_##k10, KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15 }, \ - { KC_##k20, KC_##k21, KC_##k22, KC_##k23, KC_##k24, KC_##k25 }, \ - { KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k35 }, \ - { KC_##k40, KC_##k41, KC_##k42, KC_##k43, KC_##k44, KC_##k45 }, \ - { KC_##k50, KC_##k51, KC_##k52, KC_##k53, KC_##k54, KC_##k55 }, \ - { KC_##k60, KC_##k61, KC_##k62, KC_##k63, KC_##k64, KC_##k65 }, \ - { KC_##k70, KC_##k71, KC_##k72, KC_##k73, KC_##k74, KC_##k75 } \ - } #endif #ifdef SUBPROJECT_rev2 #include "../../rev2/config.h" - #define COMPACT_KEYMAP( \ - k00, k01, k02, k03, k04, k05, k45, k44, k43, k42, k41, k40, \ - k10, k11, k12, k13, k14, k15, k55, k54, k53, k52, k51, k50, \ - k20, k21, k22, k23, k24, k25, k65, k64, k63, k62, k61, k60, \ - k30, k31, k32, k33, k34, k35, k75, k74, k73, k72, k71, k70 \ - ) \ - { \ - { KC_##k00, KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05 }, \ - { KC_##k10, KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15 }, \ - { KC_##k20, KC_##k21, KC_##k22, KC_##k23, KC_##k24, KC_##k25 }, \ - { KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k35 }, \ - { KC_##k40, KC_##k41, KC_##k42, KC_##k43, KC_##k44, KC_##k45 }, \ - { KC_##k50, KC_##k51, KC_##k52, KC_##k53, KC_##k54, KC_##k55 }, \ - { KC_##k60, KC_##k61, KC_##k62, KC_##k63, KC_##k64, KC_##k65 }, \ - { KC_##k70, KC_##k71, KC_##k72, KC_##k73, KC_##k74, KC_##k75 } \ - } -#endif -#ifdef SUBPROJECT_rev2fliphalf - #include "../../rev2fliphalf/config.h" #endif #undef RGBLED_NUM diff --git a/keyboards/lets_split/keymaps/hexwire/keymap.c b/keyboards/lets_split/keymaps/hexwire/keymap.c index f8370490d6..fcf3cde758 100644 --- a/keyboards/lets_split/keymaps/hexwire/keymap.c +++ b/keyboards/lets_split/keymaps/hexwire/keymap.c @@ -39,7 +39,7 @@ enum custom_keycodes { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_QWERTY] = COMPACT_KEYMAP( + [_QWERTY] = KC_KEYMAP( //,----+----+----+----+----+----. ,----+----+----+----+----+----. TAB , Q , W , E , R , T , Y , U , I , O , P ,MINS, //|----+----+----+----+----+----| |----+----+----+----+----+----| @@ -51,7 +51,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //`----+----+----+----+----+----' `----+----+----+----+----+----' ), - [_COLEMAK] = COMPACT_KEYMAP( + [_COLEMAK] = KC_KEYMAP( //,----+----+----+----+----+----. ,----+----+----+----+----+----. TAB , Q , W , F , P , G , J , L , U , Y ,SCLN,MINS, //|----+----+----+----+----+----| |----+----+----+----+----+----| @@ -63,7 +63,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //`----+----+----+----+----+----' `----+----+----+----+----+----' ), - [_DVORAK] = COMPACT_KEYMAP( + [_DVORAK] = KC_KEYMAP( //,----+----+----+----+----+----. ,----+----+----+----+----+----. TAB ,QUOT,COMM,DOT , P , Y , F , G , C , R , L ,MINS, //|----+----+----+----+----+----| |----+----+----+----+----+----| @@ -75,7 +75,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //`----+----+----+----+----+----' `----+----+----+----+----+----' ), - [_LOWER] = COMPACT_KEYMAP( + [_LOWER] = KC_KEYMAP( //,----+----+----+----+----+----. ,----+----+----+----+----+----. , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , , //|----+----+----+----+----+----| |----+----+----+----+----+----| @@ -87,7 +87,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //`----+----+----+----+----+----' `----+----+----+----+----+----' ), - [_RAISE] = COMPACT_KEYMAP( + [_RAISE] = KC_KEYMAP( //,----+----+----+----+----+----. ,----+----+----+----+----+----. ,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN, , //|----+----+----+----+----+----| |----+----+----+----+----+----| @@ -99,7 +99,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //`----+----+----+----+----+----' `----+----+----+----+----+----' ), - [_FN3] = COMPACT_KEYMAP( + [_FN3] = KC_KEYMAP( //,----+----+----+----+----+----. ,----+----+----+----+----+----. F12 , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 , //|----+----+----+----+----+----| |----+----+----+----+----+----| diff --git a/keyboards/lets_split/lets_split.h b/keyboards/lets_split/lets_split.h index 0de308c7a9..1892bf2cbd 100644 --- a/keyboards/lets_split/lets_split.h +++ b/keyboards/lets_split/lets_split.h @@ -11,6 +11,20 @@ #include "rev2fliphalf.h" #endif +// Used to create a keymap using only KC_ prefixed keys +#define KC_KEYMAP( \ + L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ + L30, L31, L32, L33, L34, L35, R30, R31, R32, R33, R34, R35 \ + ) \ + KEYMAP( \ + KC_##L00, KC_##L01, KC_##L02, KC_##L03, KC_##L04, KC_##L05, KC_##R00, KC_##R01, KC_##R02, KC_##R03, KC_##R04, KC_##R05, \ + KC_##L10, KC_##L11, KC_##L12, KC_##L13, KC_##L14, KC_##L15, KC_##R10, KC_##R11, KC_##R12, KC_##R13, KC_##R14, KC_##R15, \ + KC_##L20, KC_##L21, KC_##L22, KC_##L23, KC_##L24, KC_##L25, KC_##R20, KC_##R21, KC_##R22, KC_##R23, KC_##R24, KC_##R25, \ + KC_##L30, KC_##L31, KC_##L32, KC_##L33, KC_##L34, KC_##L35, KC_##R30, KC_##R31, KC_##R32, KC_##R33, KC_##R34, KC_##R35 \ + ) + #include "quantum.h" #endif \ No newline at end of file From d90ac762958eb77222a5277d64474f2aa3349176 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Mon, 3 Apr 2017 12:51:31 -0400 Subject: [PATCH 064/117] Move defines for RGB to after the config.h include --- .../lets_split/keymaps/OLED_sample/config.h | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/keyboards/lets_split/keymaps/OLED_sample/config.h b/keyboards/lets_split/keymaps/OLED_sample/config.h index 353ea368c6..8389ba111d 100644 --- a/keyboards/lets_split/keymaps/OLED_sample/config.h +++ b/keyboards/lets_split/keymaps/OLED_sample/config.h @@ -27,19 +27,16 @@ along with this program. If not, see . #define TAPPING_FORCE_HOLD #define TAPPING_TERM 100 +#ifdef SUBPROJECT_rev1 + #include "../../rev1/config.h" +#endif +#ifdef SUBPROJECT_rev2 + #include "../../rev2/config.h" +#endif + #undef RGBLED_NUM #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 6 #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17 #define RGBLIGHT_VAL_STEP 17 - - - - -#ifdef SUBPROJECT_rev1 - #include "../../rev1/config.h" -#endif -#ifdef SUBPROJECT_rev2 - #include "../../rev2/config.h" -#endif \ No newline at end of file From e3aeab356afd52299bf6cf05b5c99995ce167275 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Mon, 3 Apr 2017 13:04:34 -0400 Subject: [PATCH 065/117] Move SSD1306 function declarations to header file --- .../lets_split/keymaps/OLED_sample/keymap.c | 3 +++ keyboards/lets_split/rev2/rev2.c | 1 - keyboards/lets_split/rev2/rev2.h | 11 ----------- keyboards/lets_split/ssd1306.c | 3 +-- keyboards/lets_split/ssd1306.h | 17 +++++++++++++++++ 5 files changed, 21 insertions(+), 14 deletions(-) create mode 100644 keyboards/lets_split/ssd1306.h diff --git a/keyboards/lets_split/keymaps/OLED_sample/keymap.c b/keyboards/lets_split/keymaps/OLED_sample/keymap.c index 072b825abe..493ebcd3f2 100644 --- a/keyboards/lets_split/keymaps/OLED_sample/keymap.c +++ b/keyboards/lets_split/keymaps/OLED_sample/keymap.c @@ -6,6 +6,9 @@ #ifdef AUDIO_ENABLE #include "audio.h" #endif +#ifdef SSD1306OLED + #include "ssd1306.h" +#endif extern keymap_config_t keymap_config; diff --git a/keyboards/lets_split/rev2/rev2.c b/keyboards/lets_split/rev2/rev2.c index 8bfa171d01..20a4c6be1e 100644 --- a/keyboards/lets_split/rev2/rev2.c +++ b/keyboards/lets_split/rev2/rev2.c @@ -37,4 +37,3 @@ void shutdown_user(void) { stop_all_notes(); #endif } - diff --git a/keyboards/lets_split/rev2/rev2.h b/keyboards/lets_split/rev2/rev2.h index 0603827e08..0c4e8e7de1 100644 --- a/keyboards/lets_split/rev2/rev2.h +++ b/keyboards/lets_split/rev2/rev2.h @@ -13,17 +13,6 @@ #include #include #endif -#ifdef SSD1306OLED - extern bool iota_gfx_init(void); - extern void iota_gfx_task(void); - extern bool iota_gfx_off(void); - extern bool iota_gfx_on(void); - extern void iota_gfx_flush(void); - extern void iota_gfx_write_char(uint8_t c); - extern void iota_gfx_write(const char *data); - extern void iota_gfx_write_P(const char *data); - extern void iota_gfx_clear_screen(void); -#endif #endif //void promicro_bootloader_jmp(bool program); diff --git a/keyboards/lets_split/ssd1306.c b/keyboards/lets_split/ssd1306.c index 3c7816bb32..76348ab7f2 100644 --- a/keyboards/lets_split/ssd1306.c +++ b/keyboards/lets_split/ssd1306.c @@ -1,8 +1,7 @@ +#include "ssd1306.h" #include "config.h" #include "i2c.h" -#include #include -#include #include "print.h" #include "lets_split.h" #include "common/glcdfont.c" diff --git a/keyboards/lets_split/ssd1306.h b/keyboards/lets_split/ssd1306.h new file mode 100644 index 0000000000..b0c74f987e --- /dev/null +++ b/keyboards/lets_split/ssd1306.h @@ -0,0 +1,17 @@ +#ifndef SSD1306_H +#define SSD1306_H + +#include +#include + +bool iota_gfx_init(void); +void iota_gfx_task(void); +bool iota_gfx_off(void); +bool iota_gfx_on(void); +void iota_gfx_flush(void); +void iota_gfx_write_char(uint8_t c); +void iota_gfx_write(const char *data); +void iota_gfx_write_P(const char *data); +void iota_gfx_clear_screen(void); + +#endif From 133ed52466f1a6d29974f1efc1deddcdafe773a8 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Mon, 3 Apr 2017 13:23:23 -0400 Subject: [PATCH 066/117] =?UTF-8?q?Update=20Let=E2=80=99s=20Split=20readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- keyboards/lets_split/readme.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/keyboards/lets_split/readme.md b/keyboards/lets_split/readme.md index ecce3f4152..a8525a2e9d 100644 --- a/keyboards/lets_split/readme.md +++ b/keyboards/lets_split/readme.md @@ -7,6 +7,12 @@ Split keyboard firmware for Arduino Pro Micro or other ATmega32u4 based boards. +## Build Guide + +A build guide for putting together the Let's Split v2 can be found here: [An Overly Verbose Guide to Building a Let's Split Keyboard](https://github.com/nicinabox/lets-split-guide) + +There is additional information there about flashing and adding RGB underglow. + ## First Time Setup Download or clone the whole firmware and navigate to the keyboards/lets_split directory. Once your dev env is setup, you'll be able to generate the default .hex using: @@ -62,8 +68,8 @@ Apart from diodes and key switches for the keyboard matrix in each half, you will need: * 2 Arduino Pro Micro's. You can find theses on aliexpress for ≈3.50USD each. -* 2 TRS sockets -* 1 TRS cable. +* 2 TRRS sockets +* 1 TRRS cable. Alternatively, you can use any sort of cable and socket that has at least 3 wires. If you want to use I2C to communicate between halves, you will need a @@ -77,7 +83,7 @@ A speaker can be hooked-up to either side to the `5` (`C6`) pin and `GND`, and t Wiring ------ -The 3 wires of the TRS cable need to connect GND, VCC, and digital pin 3 (i.e. +The 3 wires of the TRRS cable need to connect GND, VCC, and digital pin 3 (i.e. PD0 on the ATmega32u4) between the two Pro Micros. Then wire your key matrix to any of the remaining 17 IO pins of the pro micro From ed9c18e86650496627e3a94c29c370e76a6e8313 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Mon, 3 Apr 2017 14:00:33 -0400 Subject: [PATCH 067/117] Remove flip-half from keymap --- keyboards/lets_split/keymaps/hexwire/config.h | 1 - 1 file changed, 1 deletion(-) diff --git a/keyboards/lets_split/keymaps/hexwire/config.h b/keyboards/lets_split/keymaps/hexwire/config.h index 27c24fe4be..e315d8c0c3 100644 --- a/keyboards/lets_split/keymaps/hexwire/config.h +++ b/keyboards/lets_split/keymaps/hexwire/config.h @@ -19,7 +19,6 @@ along with this program. If not, see . #define USE_SERIAL #define TAPPING_TERM 150 -#define FLIP_HALF #ifdef SUBPROJECT_rev1 #include "../../rev1/config.h" From 13c882a1fbd3fe3d4f703628df46f18fc69e09ea Mon Sep 17 00:00:00 2001 From: Erez Zukerman Date: Mon, 3 Apr 2017 15:11:42 -0400 Subject: [PATCH 068/117] disables space cadet rollover --- keyboards/ergodox/ez/config.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/keyboards/ergodox/ez/config.h b/keyboards/ergodox/ez/config.h index e4f95c302c..a3347de45e 100644 --- a/keyboards/ergodox/ez/config.h +++ b/keyboards/ergodox/ez/config.h @@ -49,6 +49,9 @@ along with this program. If not, see . #define RGBLIGHT_SAT_STEP 255 #define RGBLIGHT_VAL_STEP 12 +/* fix space cadet rollover issue */ +#define DISABLE_SPACE_CADET_ROLLOVER + // #define RGB_MIDI #define RGBW_BB_TWI From fbd9d04559962cb0db3a584d397f49371a4d7fb6 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Mon, 3 Apr 2017 16:16:46 -0400 Subject: [PATCH 069/117] Include use of either TRS or TRRS --- keyboards/lets_split/readme.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/keyboards/lets_split/readme.md b/keyboards/lets_split/readme.md index a8525a2e9d..7e5a546022 100644 --- a/keyboards/lets_split/readme.md +++ b/keyboards/lets_split/readme.md @@ -68,8 +68,7 @@ Apart from diodes and key switches for the keyboard matrix in each half, you will need: * 2 Arduino Pro Micro's. You can find theses on aliexpress for ≈3.50USD each. -* 2 TRRS sockets -* 1 TRRS cable. +* 2 TRRS sockets and 1 TRRS cable, or 2 TRS sockets and 1 TRS cable Alternatively, you can use any sort of cable and socket that has at least 3 wires. If you want to use I2C to communicate between halves, you will need a @@ -83,7 +82,7 @@ A speaker can be hooked-up to either side to the `5` (`C6`) pin and `GND`, and t Wiring ------ -The 3 wires of the TRRS cable need to connect GND, VCC, and digital pin 3 (i.e. +The 3 wires of the TRS/TRRS cable need to connect GND, VCC, and digital pin 3 (i.e. PD0 on the ATmega32u4) between the two Pro Micros. Then wire your key matrix to any of the remaining 17 IO pins of the pro micro From 1454d466e7180dd8f55a635a13153fc04a32d8bb Mon Sep 17 00:00:00 2001 From: Dan Saunders Date: Mon, 3 Apr 2017 15:14:45 -0600 Subject: [PATCH 070/117] Create twolayer.c fixed issue where Default.c "function key" does not work (actually it's changing my LED steps). Changed layout to be more user friendly for people that use the standard spacebar milled top plate. --- keyboards/atomic/keymaps/twolayer.c | 72 +++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 keyboards/atomic/keymaps/twolayer.c diff --git a/keyboards/atomic/keymaps/twolayer.c b/keyboards/atomic/keymaps/twolayer.c new file mode 100644 index 0000000000..8ea045d806 --- /dev/null +++ b/keyboards/atomic/keymaps/twolayer.c @@ -0,0 +1,72 @@ +#include "atomic.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* QWERTY - MIT ENHANCED / GRID COMPATIBLE + * .---------------------------------------------------------------------------------------------------------------------- 2u ------------. + * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | XXXXXX . BACKSP | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| + * | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | DEL | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------| + * | LCTRL1 | A | S | D | F | G | H | J | K | L | ; | ' | XXXXXX . ENTER | PG UP | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------| + * | LSHIFT | Z | X | C | V | B | N | M | , | . | / | XXXXXX . RSHIFT | UP | PG DN | + * |--------+--------+--------+--------+--------+- 6.25u ---------+--------+--------+--------+--------+-----------------+--------+--------| + * | BRITE | LALT | FN | XXXXXX . SPACE | RCTRL | RALT | FN | LEFT | DOWN | RIGHT | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + + [0] = { /* QWERTY */ + { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC }, + { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL }, + { KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_ENT, KC_PGUP }, + { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN }, + { M(0), KC_ALT, MO(1), KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RCTL, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT }, + }, + + +/* FUNCTION + * .---------------------------------------------------------------------------------------------------------------------- 2u ------------. + * | GRV | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | XXXXXX . | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| + * | SCR LK | F13 | F14 | F15 | F16 | F17 | F18 | F19 | F20 | F21 | F22 | F23 | F24 | PAUSE | PR SCR | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------| + * | CAP LK | MS BT5 | MS BT4 | MS BT3 | MS BT2 | SLOW M | FAST M | NEXT | VOL+ | VOL- | PLAY | | XXXXXX . | WHEEL+ | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------| + * | NUM LK | | | | | | | | INSERT | END1 | HOME | XXXXXX . | MOUS U | WHEEL- | + * |--------+--------+--------+--------+--------+- 6.25 ------------+--------+--------+------+--------+-----------------+--------+--------| + * | | | FN | XXXXXX . MS BT1 | | | FN | MOUS L | MOUS D | MOUS R | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + + [1] = { /* FUNCTION LAYER*/ + { KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ }, + { KC_SLCK, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_PAUS, KC_PSCR }, + { KC_CAPS, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, KC_ACL0, KC_ACL2, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, ___T___, ___T___, KC_WH_U }, + { KC_NLCK, _______, _______, _______, _______, _______, _______, _______, KC_INSERT, KC_END, KC_HOME, ___T___, ___T___, KC_MS_U, KC_WH_D }, + { _______, _______, MO(1), _______, _______, KC_BTN1, KC_BTN1, _______, _______, _______, _______, MO(1), KC_MS_L, KC_MS_D, KC_MS_R }, + }, +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(1), + [2] = ACTION_LAYER_MOMENTARY(1), +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; From e18768aa77985e3695f34b71f0e84547293e8104 Mon Sep 17 00:00:00 2001 From: Adam YH Lee Date: Mon, 21 Nov 2016 08:22:14 -0800 Subject: [PATCH 071/117] Add B1gtuna Miuni32 Miuni32 is a 30% ortholinear board. Please visit www.bigtuna.io for more information. --- keyboards/miuni32/Makefile | 3 + keyboards/miuni32/config.h | 170 ++++++++++++++++++++ keyboards/miuni32/keymaps/default/Makefile | 21 +++ keyboards/miuni32/keymaps/default/config.h | 8 + keyboards/miuni32/keymaps/default/keymap.c | 49 ++++++ keyboards/miuni32/keymaps/default/readme.md | 1 + keyboards/miuni32/miuni32.c | 28 ++++ keyboards/miuni32/miuni32.h | 15 ++ keyboards/miuni32/readme.md | 28 ++++ keyboards/miuni32/rules.mk | 67 ++++++++ 10 files changed, 390 insertions(+) create mode 100644 keyboards/miuni32/Makefile create mode 100644 keyboards/miuni32/config.h create mode 100644 keyboards/miuni32/keymaps/default/Makefile create mode 100644 keyboards/miuni32/keymaps/default/config.h create mode 100644 keyboards/miuni32/keymaps/default/keymap.c create mode 100644 keyboards/miuni32/keymaps/default/readme.md create mode 100644 keyboards/miuni32/miuni32.c create mode 100644 keyboards/miuni32/miuni32.h create mode 100644 keyboards/miuni32/readme.md create mode 100644 keyboards/miuni32/rules.mk diff --git a/keyboards/miuni32/Makefile b/keyboards/miuni32/Makefile new file mode 100644 index 0000000000..57b2ef62e5 --- /dev/null +++ b/keyboards/miuni32/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../Makefile +endif diff --git a/keyboards/miuni32/config.h b/keyboards/miuni32/config.h new file mode 100644 index 0000000000..4f9b685518 --- /dev/null +++ b/keyboards/miuni32/config.h @@ -0,0 +1,170 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Bigtuna.io +#define PRODUCT Miuni32 +#define DESCRIPTION A custom keyboard for writers + +/* key matrix size */ +#define MATRIX_ROWS 3 +#define MATRIX_COLS 11 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +#define MATRIX_ROW_PINS { F0, F4, D7} +#define MATRIX_COL_PINS { C6, C7, F7, F6, F1, E6, B7, B3, B2, B1, B0} +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION ROW2COL + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#define RGBLIGHT_TIMER +#define RGB_DI_PIN D0 // The pin your RGB strip is wired to +#define RGBLIGHT_TIMER // Require for fancier stuff (not compatible with audio) +#define RGBLED_NUM 7 // Number of LEDs +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 +#define RGBLIGHT_VAL_STEP 17 + +#endif diff --git a/keyboards/miuni32/keymaps/default/Makefile b/keyboards/miuni32/keymaps/default/Makefile new file mode 100644 index 0000000000..88a3aea741 --- /dev/null +++ b/keyboards/miuni32/keymaps/default/Makefile @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/miuni32/keymaps/default/config.h b/keyboards/miuni32/keymaps/default/config.h new file mode 100644 index 0000000000..df06a26206 --- /dev/null +++ b/keyboards/miuni32/keymaps/default/config.h @@ -0,0 +1,8 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +// place overrides here + +#endif \ No newline at end of file diff --git a/keyboards/miuni32/keymaps/default/keymap.c b/keyboards/miuni32/keymaps/default/keymap.c new file mode 100644 index 0000000000..15e2fa45c0 --- /dev/null +++ b/keyboards/miuni32/keymaps/default/keymap.c @@ -0,0 +1,49 @@ +#include "miuni32.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] ={ + {KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, + {KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_RSFT, KC_ENT}, + {KC_Z, KC_X, KC_C, KC_V, KC_V, KC_SPC, KC_B, KC_N, KC_M , MO(1), KC_RCTL} + }, +[1] ={ + {KC_PGUP, KC_UP, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL}, + {KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_HOME, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_END, KC_TRNS}, + {RGB_TOG, RGB_HUI, RGB_HUD, RGB_SAI, KC_TRNS, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, RGB_MOD}, + } +}; +const uint16_t PROGMEM fn_actions[] = { + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; + + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/miuni32/keymaps/default/readme.md b/keyboards/miuni32/keymaps/default/readme.md new file mode 100644 index 0000000000..4cff8ef5a3 --- /dev/null +++ b/keyboards/miuni32/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for miuni32 \ No newline at end of file diff --git a/keyboards/miuni32/miuni32.c b/keyboards/miuni32/miuni32.c new file mode 100644 index 0000000000..1c1983a564 --- /dev/null +++ b/keyboards/miuni32/miuni32.c @@ -0,0 +1,28 @@ +#include "miuni32.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/miuni32/miuni32.h b/keyboards/miuni32/miuni32.h new file mode 100644 index 0000000000..eecb17f81f --- /dev/null +++ b/keyboards/miuni32/miuni32.h @@ -0,0 +1,15 @@ +#ifndef MIUNI32_H +#define MIUNI32_H + +#include "quantum.h" + +#define KEYMAP( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A ) { \ + { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0A }, \ + { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K1A }, \ + { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2A } \ +} + +#endif diff --git a/keyboards/miuni32/readme.md b/keyboards/miuni32/readme.md new file mode 100644 index 0000000000..36696ddbcb --- /dev/null +++ b/keyboards/miuni32/readme.md @@ -0,0 +1,28 @@ +miuni32 keyboard firmware +====================== + +## Quantum MK Firmware + +For the full Quantum feature list, see [the parent readme](/). + +## Building + +Download or clone the whole firmware and navigate to the keyboards/miuni32 folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file. + +Depending on which keymap you would like to use, you will have to compile slightly differently. + +### Default + +To build with the default keymap, simply run `make default`. + +### Other Keymaps + +Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files. + +To build the firmware binary hex file with a keymap just do `make` with a keymap like this: + +``` +$ make [default|jack|] +``` + +Keymaps follow the format **__\.c__** and are stored in the `keymaps` folder. diff --git a/keyboards/miuni32/rules.mk b/keyboards/miuni32/rules.mk new file mode 100644 index 0000000000..55898147dd --- /dev/null +++ b/keyboards/miuni32/rules.mk @@ -0,0 +1,67 @@ +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=512 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= yes # Console for debug(+400) +COMMAND_ENABLE ?= yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE ?= no # USB Nkey Rollover +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE ?= no # MIDI controls +UNICODE_ENABLE ?= no # Unicode +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE ?= no # Audio output on port C6 From 8e7be3adda577ab58ed942d83e0d2ebd4ab07f88 Mon Sep 17 00:00:00 2001 From: Adam Lee Date: Tue, 4 Apr 2017 10:21:32 -0700 Subject: [PATCH 072/117] Set Bootloader Size to 4K Use Atmel's default bootloader size, rather than Teensy 2.0's [1]. [1] https://github.com/qmk/qmk_firmware/pull/1207#discussion_r109712786 --- keyboards/miuni32/rules.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/miuni32/rules.mk b/keyboards/miuni32/rules.mk index 55898147dd..ef8daf3caa 100644 --- a/keyboards/miuni32/rules.mk +++ b/keyboards/miuni32/rules.mk @@ -45,7 +45,7 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT # Atmel DFU loader 4096 # LUFA bootloader 4096 # USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=512 +OPT_DEFS += -DBOOTLOADER_SIZE=4096 # Build Options From 154305ce1be16b2c8abce5e5d4dee421f295d6b3 Mon Sep 17 00:00:00 2001 From: Gabe Y Date: Tue, 4 Apr 2017 22:39:28 -0700 Subject: [PATCH 073/117] Fix formatting in BUILD_GUIDE.md (#1208) --- doc/BUILD_GUIDE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/BUILD_GUIDE.md b/doc/BUILD_GUIDE.md index 1750191836..78cf00b917 100644 --- a/doc/BUILD_GUIDE.md +++ b/doc/BUILD_GUIDE.md @@ -96,7 +96,7 @@ The keyboard `config.h` is included only if the keymap one doesn't exist. The fo ``` #undef MY_SETTING #define MY_SETTING 4 -```c +``` For a value of `4` for this imaginary setting. So we `undef` it first, then `define` it. From 3a5f9faca969487bbf7eeaf0ba921dc0d9bef6d2 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Thu, 6 Apr 2017 22:02:38 -0700 Subject: [PATCH 074/117] Reworked Atreus keymap, added README --- keyboards/atreus/keymaps/xyverz/keymap.c | 190 +++++++++++++++++------ 1 file changed, 146 insertions(+), 44 deletions(-) diff --git a/keyboards/atreus/keymaps/xyverz/keymap.c b/keyboards/atreus/keymaps/xyverz/keymap.c index 66fdebb50b..4471b9caf3 100644 --- a/keyboards/atreus/keymaps/xyverz/keymap.c +++ b/keyboards/atreus/keymaps/xyverz/keymap.c @@ -12,49 +12,129 @@ extern keymap_config_t keymap_config; // The underscores don't mean anything - you can have a layer called STUFF or any other name. // Layer names don't all need to be of the same length, obviously, and you can also skip them // entirely and just use numbers. -#define _DV 0 -#define _QW 1 -#define _CM 2 -#define _L1 3 -#define _L2 4 +#define _DVORAK 0 +#define _QWERTY 1 +#define _COLEMAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 -// Macro name shortcuts -#define DVORAK M(_DV) -#define QWERTY M(_QW) -#define COLEMAK M(_CM) +enum planck_keycodes { + DVORAK = SAFE_RANGE, + QWERTY, + COLEMAK, + LOWER, + RAISE, + BACKLIT +}; +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_DV] = { /* Dvorak */ - {KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_NO, KC_F, KC_G, KC_C, KC_R, KC_L }, - {KC_A, KC_O, KC_E, KC_U, KC_I, KC_NO, KC_D, KC_H, KC_T, KC_N, KC_S }, - {SFT_T(KC_SCLN), KC_Q, KC_J, KC_K, KC_X, CTL_T(KC_DEL), KC_B, KC_M, KC_W, KC_V, SFT_T(KC_Z) }, - {KC_ESC, KC_TAB, KC_LGUI, MO(_L2), KC_BSPC, ALT_T(KC_ENT), KC_SPC, MO(_L1), KC_MINS, KC_SLSH, KC_EQL} +/* Dvorak Layer + ,----------------------------------. ,----------------------------------. + | ' | , | . | P | Y | | F | G | C | R | L | + |------+------+------+------+------| |------+------+------+------+------| + | A | O | E | U | I | | D | H | T | N | S | + |------+------+------+------+------|------.,------|------+------+------+------+------| + |SFT/ ;| Q | J | K | X | CTRL ||Alt / | B | M | W | V |SFT/ Z| + |------+------+------+------+------| ||Enter |------+------+------+------+------| + | Esc | Tab | GUI | LOWER| BkSp |------'`------| Spc | RAISE| - | / | \ | + `----------------------------------' `----------------------------------' */ + [_DVORAK] = { + {KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, XXXXXXX, KC_F, KC_G, KC_C, KC_R, KC_L }, + {KC_A, KC_O, KC_E, KC_U, KC_I, XXXXXXX, KC_D, KC_H, KC_T, KC_N, KC_S }, + {SFT_T(KC_SCLN), KC_Q, KC_J, KC_K, KC_X, KC_LCTL, KC_B, KC_M, KC_W, KC_V, SFT_T(KC_Z)}, + {KC_ESC, KC_TAB, KC_LGUI, LOWER, KC_BSPC, ALT_T(KC_ENT), KC_SPC, RAISE, KC_MINS, KC_SLSH, KC_BSLS } }, - [_QW] = { /* Qwerty */ - {KC_Q, KC_W, KC_E, KC_R, KC_T, KC_NO, KC_Y, KC_U, KC_I, KC_O, KC_P }, - {KC_A, KC_S, KC_D, KC_F, KC_G, KC_NO, KC_H, KC_J, KC_K, KC_L, KC_SCLN}, - {SFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, CTL_T(KC_DEL), KC_N, KC_M, KC_COMM, KC_DOT, SFT_T(KC_SLSH) }, - {KC_ESC, KC_TAB, KC_LGUI, MO(_L2), KC_BSPC, ALT_T(KC_ENT), KC_SPC, MO(_L1), KC_MINS, KC_QUOT, KC_EQL} + +/* QWERTY Layer + ,----------------------------------. ,----------------------------------. + | Q | W | E | R | T | | Y | U | I | O | P | + |------+------+------+------+------| |------+------+------+------+------| + | A | S | D | F | G | | H | J | K | L | ; | + |------+------+------+------+------|------.,------|------+------+------+------+------| + |SFT/ Z| X | C | V | B | CTRL ||Alt / | N | M | , | . |SFT/ /| + |------+------+------+------+------| ||Enter |------+------+------+------+------| + | Esc | Tab | GUI | LOWER| BkSp |------'`------| Spc | RAISE| - | ' | \ | + `----------------------------------' `----------------------------------' */ + [_QWERTY] = { + {KC_Q, KC_W, KC_E, KC_R, KC_T, XXXXXXX, KC_Y, KC_U, KC_I, KC_O, KC_P }, + {KC_A, KC_S, KC_D, KC_F, KC_G, XXXXXXX, KC_H, KC_J, KC_K, KC_L, KC_SCLN}, + {SFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_LCTL, KC_N, KC_M, KC_COMM, KC_DOT, SFT_T(KC_SLSH)}, + {KC_ESC, KC_TAB, KC_LGUI, LOWER, KC_BSPC, ALT_T(KC_ENT), KC_SPC, RAISE, KC_MINS, KC_QUOT, KC_BSLS } }, - [_CM] = { /* Colemak */ - {KC_Q, KC_W, KC_F, KC_P, KC_G, KC_NO, KC_J, KC_L, KC_U, KC_Y, KC_SCLN}, - {KC_A, KC_R, KC_S, KC_T, KC_D, KC_NO, KC_H, KC_N, KC_E, KC_I, KC_O }, - {SFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, CTL_T(KC_DEL), KC_K, KC_M, KC_COMM, KC_DOT, SFT_T(KC_SLSH) }, - {KC_ESC, KC_TAB, KC_LGUI, MO(_L2), KC_BSPC, ALT_T(KC_ENT), KC_SPC, MO(_L1), KC_MINS, KC_QUOT, KC_EQL} + +/* Colemak Layer + ,----------------------------------. ,----------------------------------. + | Q | W | F | P | G | | J | L | U | Y | L | + |------+------+------+------+------| |------+------+------+------+------| + | A | R | S | T | D | | H | N | E | I | S | + |------+------+------+------+------|------.,------|------+------+------+------+------| + |SFT/ Z| X | C | V | B | CTRL ||Alt / | K | M | , | . |SFT/ /| + |------+------+------+------+------| ||Enter |------+------+------+------+------| + | Esc | Tab | GUI | LOWER| BkSp |------'`------| Spc | RAISE| - | ' | RGUI | + `----------------------------------' `----------------------------------'*/ + [_COLEMAK] = { + {KC_Q, KC_W, KC_F, KC_P, KC_G, XXXXXXX, KC_J, KC_L, KC_U, KC_Y, KC_SCLN}, + {KC_A, KC_R, KC_S, KC_T, KC_D, XXXXXXX, KC_H, KC_N, KC_E, KC_I, KC_O }, + {SFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_LCTL, KC_K, KC_M, KC_COMM, KC_DOT, SFT_T(KC_SLSH)}, + {KC_ESC, KC_TAB, KC_LGUI, LOWER, KC_BSPC, ALT_T(KC_ENT), KC_SPC, RAISE, KC_MINS, KC_QUOT, KC_BSLS } }, - [_L1] = { /* LAYER 1 */ - {KC_1, KC_2, KC_3, KC_4, KC_5, KC_NO, KC_6, KC_7, KC_8, KC_9, KC_0 }, - {KC_TAB, KC_INS, KC_UP, KC_DEL, KC_HOME, KC_NO, KC_PGUP, KC_MUTE, KC_VOLD, KC_VOLU, KC_BSLS}, - {KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, KC_LCTL, KC_PGDN, KC_MPRV, KC_MPLY, KC_MNXT, KC_BSLS}, - {KC_TRNS, KC_GRV, KC_LGUI, KC_TRNS, KC_DEL, KC_LALT, KC_SPC, KC_TRNS, KC_LBRC, KC_RBRC, KC_ENT } + +/* LOWER Layer + ,----------------------------------. ,----------------------------------. + | ! | @ | # | $ | % | | ^ | & | * | ( | ) | + |------+------+------+------+------| |------+------+------+------+------| + | CAPS | | UP | | Home | | PgDn | | + | { | } | + |------+------+------+------+------|------.,------|------+------+------+------+------| + | | Left | Down | Right| End | || | PgUp | Mute | Vol- | Vol+ | | + |------+------+------+------+------| || |------+------+------+------+------| + | ~ | | | | Del |------'`------| Ins | | | | | + `----------------------------------' `----------------------------------'*/ + [_LOWER] = { + {KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, XXXXXXX, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN}, + {KC_CAPS, _______, KC_UP, _______, KC_HOME, XXXXXXX, KC_PGUP, _______, KC_PLUS, KC_LCBR, KC_RCBR}, + {_______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, _______, KC_PGDN, KC_MUTE, KC_VOLD, KC_VOLU, _______}, + {KC_TILD, _______, _______, _______, KC_DEL, _______, KC_INS, _______, _______, _______, _______} }, - [_L2] = { /* LAYER 2 */ - {KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_NO, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN}, - {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_NO, KC_TRNS, KC_F6, KC_F7, KC_F8, KC_PIPE}, - {KC_TRNS, KC_TRNS, DVORAK, QWERTY, COLEMAK, KC_LCTL, KC_TRNS, KC_F9, KC_F10, KC_F11, KC_F12 }, - {KC_TRNS, KC_TRNS, KC_LGUI, KC_TRNS, KC_BSPC, KC_LALT, KC_SPC, KC_TRNS, LSFT(KC_LBRC), LSFT(KC_RBRC), RESET} + +/* RAISE Layer + ,----------------------------------. ,----------------------------------. + | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | + |------+------+------+------+------| |------+------+------+------+------| + | CAPS | | UP | | Home | | PgDn | | = | [ | ] | + |------+------+------+------+------|------.,------|------+------+------+------+------| + | | Left | Down | Right| End | || | PgUp | Prev | Play | Next | | + |------+------+------+------+------| || |------+------+------+------+------| + | ` | | | | Del |------'`------| Ins | | | | | + `----------------------------------' `----------------------------------'*/ + [_RAISE] = { + {KC_1, KC_2, KC_3, KC_4, KC_5, XXXXXXX, KC_6, KC_7, KC_8, KC_9, KC_0 }, + {KC_CAPS, _______, KC_UP, _______, KC_HOME, XXXXXXX, KC_PGUP, _______, KC_EQL, KC_LBRC, KC_RBRC}, + {_______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, _______, KC_PGDN, KC_MPRV, KC_MPLY, KC_MNXT, _______}, + {KC_GRV, _______, _______, _______, KC_DEL, _______, KC_INS, _______, _______, _______, _______} + }, + +/* ADJUST Layer + ,----------------------------------. ,----------------------------------. + | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | + |------+------+------+------+------| |------+------+------+------+------| + | F11 | | | | | | | | | | F12 | + |------+------+------+------+------|------.,------|------+------+------+------+------| + | |QWERTY|COLEMK|DVORAK| | || | | | | | | + |------+------+------+------+------| || |------+------+------+------+------| + | | | | | |------'`------| | | | | RESET| + `----------------------------------' `----------------------------------'*/ + [_ADJUST] = { + {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, XXXXXXX, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10 }, + {KC_F11, _______, _______, _______, _______, XXXXXXX, _______, _______, _______, _______, KC_F12 }, + {_______, QWERTY, COLEMAK, DVORAK, _______, _______, _______, _______, _______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET } } + }; const uint16_t PROGMEM fn_actions[] = { @@ -66,24 +146,46 @@ void persistant_default_layer_set(uint16_t default_layer) { default_layer_set(default_layer); } -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - switch(id) { - case _DV: +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: if (record->event.pressed) { - persistant_default_layer_set(1UL<<_DV); + persistant_default_layer_set(1UL<<_QWERTY); } + return false; break; - case _QW: + case COLEMAK: if (record->event.pressed) { - persistant_default_layer_set(1UL<<_QW); + persistant_default_layer_set(1UL<<_COLEMAK); } + return false; break; - case _CM: + case DVORAK: if (record->event.pressed) { - persistant_default_layer_set(1UL<<_CM); + persistant_default_layer_set(1UL<<_DVORAK); } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; break; } - return MACRO_NONE; + return true; }; From 8813365ec5c091c0185563943bbf73ec53d846e0 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Thu, 6 Apr 2017 22:03:17 -0700 Subject: [PATCH 075/117] Added readme --- keyboards/atreus/keymaps/xyverz/readme.md | 89 +++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 keyboards/atreus/keymaps/xyverz/readme.md diff --git a/keyboards/atreus/keymaps/xyverz/readme.md b/keyboards/atreus/keymaps/xyverz/readme.md new file mode 100644 index 0000000000..29c0422bbb --- /dev/null +++ b/keyboards/atreus/keymaps/xyverz/readme.md @@ -0,0 +1,89 @@ +# Xyverz's Atreus Keymap + +## About this keymap: + +This is the second iteration of my Atreus keymap. The first one was as close to the planck as I could get at the +time, but still very much like the original Atreus keymap. I've managed to get things working better now and have +implemented (more like copied) the RAISE/LOWER/ADJUST layers. This is a work in progress, but I think I'm closer +to a final go with this. + +I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar to the default Planck layouts. + +## Still to do: + + * Tidy the keymap up so that it's readable. + * Learn how to make alias macros for mod_tap keys. + +### Layer 0: Dvorak layer + + ,----------------------------------. ,----------------------------------. + | ' | , | . | P | Y | | F | G | C | R | L | + |------+------+------+------+------| |------+------+------+------+------| + | A | O | E | U | I | | D | H | T | N | S | + |------+------+------+------+------|------.,------|------+------+------+------+------| + |Shft ;| Q | J | K | X | CTRL ||Alt / | B | M | W | V |Shft Z| + |------+------+------+------+------| ||Enter |------+------+------+------+------| + | Esc | Tab | GUI | LOWER| BkSp |------'`------| Spc | RAISE| - | / | \ | + `----------------------------------' `----------------------------------' + +### Layer 1: QWERTY layer + + ,----------------------------------. ,----------------------------------. + | Q | W | E | R | T | | Y | U | I | O | P | + |------+------+------+------+------| |------+------+------+------+------| + | A | S | D | F | G | | H | J | K | L | ; | + |------+------+------+------+------|------.,------|------+------+------+------+------| + |Shft Z| X | C | V | B | CTRL ||Alt / | N | M | , | . |Shft /| + |------+------+------+------+------| ||Enter |------+------+------+------+------| + | Esc | Tab | GUI | LOWER| BkSp |------'`------| Spc | RAISE| - | ' | \ | + `----------------------------------' `----------------------------------' + +### Keymap 2: Colemak layer + + ,----------------------------------. ,----------------------------------. + | Q | W | F | P | G | | J | L | U | Y | L | + |------+------+------+------+------| |------+------+------+------+------| + | A | R | S | T | D | | H | N | E | I | S | + |------+------+------+------+------|------.,------|------+------+------+------+------| + |Shft Z| X | C | V | B | CTRL ||Alt / | K | M | , | . |Shft /| + |------+------+------+------+------| ||Enter |------+------+------+------+------| + | Esc | Tab | GUI | LOWER| BkSp |------'`------| Spc | RAISE| - | ' | RGUI | + `----------------------------------' `----------------------------------' + +### layer 3 : LOWER layer + + ,----------------------------------. ,----------------------------------. + | ! | @ | # | $ | % | | ^ | & | * | ( | ) | + |------+------+------+------+------| |------+------+------+------+------| + | CAPS | | UP | | Home | | PgDn | | + | { | } | + |------+------+------+------+------|------.,------|------+------+------+------+------| + | | Left | Down | Right| End | || | PgUp | Mute | Vol- | Vol+ | | + |------+------+------+------+------| || |------+------+------+------+------| + | ~ | | | | Del |------'`------| Ins | | | | | + `----------------------------------' `----------------------------------' + + +### Keymap 4: RAISE layer + + ,----------------------------------. ,----------------------------------. + | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | + |------+------+------+------+------| |------+------+------+------+------| + | CAPS | | UP | | Home | | PgDn | | = | [ | ] | + |------+------+------+------+------|------.,------|------+------+------+------+------| + | | Left | Down | Right| End | || | PgUp | Prev | Play | Next | | + |------+------+------+------+------| || |------+------+------+------+------| + | ` | | | | Del |------'`------| Ins | | | | | + `----------------------------------' `----------------------------------' + +### Keymap 5: ADJUST layer + + ,----------------------------------. ,----------------------------------. + | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | + |------+------+------+------+------| |------+------+------+------+------| + | F11 | | | | | | | | | | F12 | + |------+------+------+------+------|------.,------|------+------+------+------+------| + | |QWERTY|COLEMK|DVORAK| | || | | | | | | + |------+------+------+------+------| || |------+------+------+------+------| + | | | | | |------'`------| | | | | RESET| + `----------------------------------' `----------------------------------' + From 3607522c12a11c4ff1b45ec8cb6495c96fdd6724 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Thu, 6 Apr 2017 22:26:13 -0700 Subject: [PATCH 076/117] More tweaks to keymap and readme. --- keyboards/atreus/keymaps/xyverz/keymap.c | 20 +++++++++++++------- keyboards/atreus/keymaps/xyverz/readme.md | 3 +-- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/keyboards/atreus/keymaps/xyverz/keymap.c b/keyboards/atreus/keymaps/xyverz/keymap.c index 4471b9caf3..3c61d66d01 100644 --- a/keyboards/atreus/keymaps/xyverz/keymap.c +++ b/keyboards/atreus/keymaps/xyverz/keymap.c @@ -28,6 +28,12 @@ enum planck_keycodes { BACKLIT }; +// Adding macros to make the keymaps below much easier to read. +#define SFTSCLN SFT_T(KC_SCLN) +#define SFTSLSH SFT_T(KC_SLSH) +#define SFTZED SFT_T(KC_Z) +#define ALTENT ALT_T(KC_ENT) + // Fillers to make layering more clear #define _______ KC_TRNS #define XXXXXXX KC_NO @@ -46,8 +52,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_DVORAK] = { {KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, XXXXXXX, KC_F, KC_G, KC_C, KC_R, KC_L }, {KC_A, KC_O, KC_E, KC_U, KC_I, XXXXXXX, KC_D, KC_H, KC_T, KC_N, KC_S }, - {SFT_T(KC_SCLN), KC_Q, KC_J, KC_K, KC_X, KC_LCTL, KC_B, KC_M, KC_W, KC_V, SFT_T(KC_Z)}, - {KC_ESC, KC_TAB, KC_LGUI, LOWER, KC_BSPC, ALT_T(KC_ENT), KC_SPC, RAISE, KC_MINS, KC_SLSH, KC_BSLS } + {SFTSCLN, KC_Q, KC_J, KC_K, KC_X, KC_LCTL, KC_B, KC_M, KC_W, KC_V, SFTZED }, + {KC_ESC, KC_TAB, KC_LGUI, LOWER, KC_BSPC, ALTENT, KC_SPC, RAISE, KC_MINS, KC_SLSH, KC_BSLS} }, /* QWERTY Layer @@ -63,8 +69,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_QWERTY] = { {KC_Q, KC_W, KC_E, KC_R, KC_T, XXXXXXX, KC_Y, KC_U, KC_I, KC_O, KC_P }, {KC_A, KC_S, KC_D, KC_F, KC_G, XXXXXXX, KC_H, KC_J, KC_K, KC_L, KC_SCLN}, - {SFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_LCTL, KC_N, KC_M, KC_COMM, KC_DOT, SFT_T(KC_SLSH)}, - {KC_ESC, KC_TAB, KC_LGUI, LOWER, KC_BSPC, ALT_T(KC_ENT), KC_SPC, RAISE, KC_MINS, KC_QUOT, KC_BSLS } + {SFTZED, KC_X, KC_C, KC_V, KC_B, KC_LCTL, KC_N, KC_M, KC_COMM, KC_DOT, SFTSLSH}, + {KC_ESC, KC_TAB, KC_LGUI, LOWER, KC_BSPC, ALTENT, KC_SPC, RAISE, KC_MINS, KC_QUOT, KC_BSLS} }, /* Colemak Layer @@ -75,13 +81,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { |------+------+------+------+------|------.,------|------+------+------+------+------| |SFT/ Z| X | C | V | B | CTRL ||Alt / | K | M | , | . |SFT/ /| |------+------+------+------+------| ||Enter |------+------+------+------+------| - | Esc | Tab | GUI | LOWER| BkSp |------'`------| Spc | RAISE| - | ' | RGUI | + | Esc | Tab | GUI | LOWER| BkSp |------'`------| Spc | RAISE| - | ' | \ | `----------------------------------' `----------------------------------'*/ [_COLEMAK] = { {KC_Q, KC_W, KC_F, KC_P, KC_G, XXXXXXX, KC_J, KC_L, KC_U, KC_Y, KC_SCLN}, {KC_A, KC_R, KC_S, KC_T, KC_D, XXXXXXX, KC_H, KC_N, KC_E, KC_I, KC_O }, - {SFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_LCTL, KC_K, KC_M, KC_COMM, KC_DOT, SFT_T(KC_SLSH)}, - {KC_ESC, KC_TAB, KC_LGUI, LOWER, KC_BSPC, ALT_T(KC_ENT), KC_SPC, RAISE, KC_MINS, KC_QUOT, KC_BSLS } + {SFTZED, KC_X, KC_C, KC_V, KC_B, KC_LCTL, KC_K, KC_M, KC_COMM, KC_DOT, SFTSLSH}, + {KC_ESC, KC_TAB, KC_LGUI, LOWER, KC_BSPC, ALTENT, KC_SPC, RAISE, KC_MINS, KC_QUOT, KC_BSLS} }, /* LOWER Layer diff --git a/keyboards/atreus/keymaps/xyverz/readme.md b/keyboards/atreus/keymaps/xyverz/readme.md index 29c0422bbb..5187e5d3e2 100644 --- a/keyboards/atreus/keymaps/xyverz/readme.md +++ b/keyboards/atreus/keymaps/xyverz/readme.md @@ -11,8 +11,7 @@ I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar t ## Still to do: - * Tidy the keymap up so that it's readable. - * Learn how to make alias macros for mod_tap keys. + * Enjoy this revision; figure out new things later. ### Layer 0: Dvorak layer From bcf70c0203e003d3f9c47d11bd2d57f7a3cd3bf8 Mon Sep 17 00:00:00 2001 From: Stick Date: Fri, 7 Apr 2017 16:04:43 -0500 Subject: [PATCH 077/117] ErgoDox Familiar layout v1 --- keyboards/ergodox/keymaps/familiar/README.md | 72 +- .../ergodox/keymaps/familiar/familiar.png | Bin 0 -> 149846 bytes .../ergodox/keymaps/familiar/img/HNTR.svg | 7253 ---------------- .../keymaps/familiar/img/familiar.json | 865 -- .../ergodox/keymaps/familiar/img/familiar.png | Bin 102059 -> 0 bytes .../ergodox/keymaps/familiar/img/familiar.svg | 7131 ---------------- .../keymaps/familiar/img/familiar_stick.svg | 7592 ----------------- .../ergodox/keymaps/familiar/img/hntr.json | 634 -- .../ergodox/keymaps/familiar/img/hntr.png | Bin 77473 -> 0 bytes 9 files changed, 69 insertions(+), 23478 deletions(-) create mode 100644 keyboards/ergodox/keymaps/familiar/familiar.png delete mode 100644 keyboards/ergodox/keymaps/familiar/img/HNTR.svg delete mode 100644 keyboards/ergodox/keymaps/familiar/img/familiar.json delete mode 100644 keyboards/ergodox/keymaps/familiar/img/familiar.png delete mode 100644 keyboards/ergodox/keymaps/familiar/img/familiar.svg delete mode 100644 keyboards/ergodox/keymaps/familiar/img/familiar_stick.svg delete mode 100644 keyboards/ergodox/keymaps/familiar/img/hntr.json delete mode 100644 keyboards/ergodox/keymaps/familiar/img/hntr.png diff --git a/keyboards/ergodox/keymaps/familiar/README.md b/keyboards/ergodox/keymaps/familiar/README.md index 0b24853415..e4336d9b55 100644 --- a/keyboards/ergodox/keymaps/familiar/README.md +++ b/keyboards/ergodox/keymaps/familiar/README.md @@ -1,3 +1,69 @@ -# Familiar Layout for ErgoDox # -An ErgoDox layout meant to be as easy to learn as possible for typists coming from a standard -QWERTY US-International layout. +# ErgoDox Familiar Layout +Familiar layout for those who regularly switch back and forth from ErgoDox to regular QWERTY. + +[![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](../../../../license_GPLv3.md../../../../license_GPLv3.md) [![standard-readme compliant](https://img.shields.io/badge/readme%20style-standard-brightgreen.svg)](https://github.com/RichardLitt/standard-readme) + +## Table of Contents + +- [Background](#background) +- [Install](#install) +- [Usage](#usage) + - [Layers](#layers) +- [Contribute](#contribute) + - [Issues](#issues) +- [License](#license) + +## Background + +This layout is built to be as familiar as possible for users coming directly from a default (QWERTY US) keyboard, while gaining as much advantage as possible from the ErgoDox and QMK featureset. I use an ErgoDoxEZ at home, but I don't have a regular office (CS grad student) so I regularly use either my laptop or a default-setup lab computer; I context switch daily so this layout is meant to reduce the mental overhead as much as possible. + +The default ErgoDoxEZ layout is probably more optimized as a solo daily driver - as are a lot of the others available keymaps. The focus of this layout is to get as much from the 'Dox as possible without overly disrupting long-established muscle memory. + +Key features of the familiar layout: +1. QWERTY default layout. +1. International symbols layer, mapped in the US-International layout default positions, through [UCIS](https://github.com/qmk/qmk_firmware/wiki/Unicode-and-additional-language-support#ucis_enable). +1. Numpad layer on right hand. +1. Thumb cluster holds spacebar, ALT, and access to secondary layers. +1. Function-layer arrow keys in both the first-person-shooter (actually ESDF instead of WASD) and vim (HJKL) locations. + +## Install + +If you are on Windows or Mac, choose the proper line in [`keymap.c`](keymap.c) for [unicode/international character support](https://github.com/qmk/qmk_firmware/wiki/Unicode-and-additional-language-support#ucis_enable) (starts at line 235). +```c +void matrix_init_user(void) { + set_unicode_input_mode(UC_LNX); // Linux + //set_unicode_input_mode(UC_OSX); // Mac OSX + //set_unicode_input_mode(UC_WIN); // Windows (with registry key, see wiki) + //set_unicode_input_mode(UC_WINC); // Windows (with WinCompose, see wiki) +}; +``` + +For instructions on building and installing this keymap, [go to the wiki](https://github.com/qmk/qmk_firmware/tree/master/keyboards/ergodox#build-dependencies). Below is the command for me; it may be different for you. +```sh +$ make ergodox-ez-familiar-teensy +``` + +## Usage + +[![Familiar Layout](familiar.png)](http://www.keyboard-layout-editor.com/#/gists/13508a9f99cff381d58b7be6f7dcc644) + +### Layers +1. Base Layer: QWERTY, with arrow keys at bottom right. +1. UCIS Layer: US-International symbols layer, plus —. Accessed by toggling the `INTL` layer using the UCIS key (bottom of left thumb cluster). +1. UCIS-Shifted Layer: Making shift work for UCIS characters. An ugly workaround. Any ideas? Accessed through holding shift while the UCIS layer is active (toggles the `INSF` layer). +1. Numpad Layer: Right hand number pad. Accessed by toggling the `NUMP` layer using the NPAD key (bottom of right thumb cluster). +1. Function Layer: F1-F12, arrows on ESDF and HJKL, media player controls. Accessed by holding either FN key (center key of each thumb cluster), which toggles the `ARRW` layer. I know, I need to work on my naming conventions. + +## Contribute + +[Contributor Covenant](http://contributor-covenant.org/) + +I'm terrible at this; I have no background in human-computer interaction, kinesiology, or keyboard-ology. Please send comments/issues/pull requests/angry tweets/etc. If you think there is a better way to take advantage of the ErgoDox/QMK comination without straying far from 84/101-key QWERTY, I want to know it. + +### Issues +1. The top two keys of the right thumb cluster are currently unused. I wanted them for screen brightness, but I haven't found a solution I like. +1. The `'`, `"`, `[`, and `]` keys are terrible to access; I want to put them somewhere else but I haven't figured out where. +1. The `INSF` layer is an ugly workaround. I should write a function for doing different things in the `INTL` layer depending on whether SHIFT is being held. Or something. Ideas? + +## License +QMK is licensed ([mostly](https://github.com/qmk/qmk_firmware/issues/1038)) under the [GPLv2](blob/master/license_GPLv2.md). Accordingly, to whatever extent applicable, this keymap is licensed under the [GPLv3](../../../../license_GPLv3.md). diff --git a/keyboards/ergodox/keymaps/familiar/familiar.png b/keyboards/ergodox/keymaps/familiar/familiar.png new file mode 100644 index 0000000000000000000000000000000000000000..f8b50e75ecef48cb155ddd1dbf1d608e01a7ea48 GIT binary patch literal 149846 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