From 552399df4cef88463ea8ac40822d776d0fb90e18 Mon Sep 17 00:00:00 2001 From: Ian Sterling Date: Mon, 8 Aug 2016 18:34:08 -0700 Subject: [PATCH 01/20] Adding my own keymaps to the following keyboards: Planck, Preonic, Atreus, Ergodox --- keyboards/atreus/keymaps/xyverz/keymap.c | 89 ++++ keyboards/ergodox/keymaps/xyverz/dvorak.png | Bin 0 -> 87314 bytes keyboards/ergodox/keymaps/xyverz/keymap.c | 184 +++++++++ keyboards/ergodox/keymaps/xyverz/old_keymap.c | 311 ++++++++++++++ keyboards/ergodox/keymaps/xyverz/readme.md | 10 + keyboards/planck/keymaps/xyverz/README.md | 2 + keyboards/planck/keymaps/xyverz/keymap.c | 379 ++++++++++++++++++ keyboards/planck/keymaps/xyverz/makefile.mk | 2 + keyboards/preonic/keymaps/xyverz/README.md | 49 +++ keyboards/preonic/keymaps/xyverz/keymap.c | 342 ++++++++++++++++ keyboards/preonic/keymaps/xyverz/makefile.mk | 1 + 11 files changed, 1369 insertions(+) create mode 100644 keyboards/atreus/keymaps/xyverz/keymap.c create mode 100644 keyboards/ergodox/keymaps/xyverz/dvorak.png create mode 100644 keyboards/ergodox/keymaps/xyverz/keymap.c create mode 100644 keyboards/ergodox/keymaps/xyverz/old_keymap.c create mode 100644 keyboards/ergodox/keymaps/xyverz/readme.md create mode 100644 keyboards/planck/keymaps/xyverz/README.md create mode 100644 keyboards/planck/keymaps/xyverz/keymap.c create mode 100644 keyboards/planck/keymaps/xyverz/makefile.mk create mode 100644 keyboards/preonic/keymaps/xyverz/README.md create mode 100644 keyboards/preonic/keymaps/xyverz/keymap.c create mode 100644 keyboards/preonic/keymaps/xyverz/makefile.mk diff --git a/keyboards/atreus/keymaps/xyverz/keymap.c b/keyboards/atreus/keymaps/xyverz/keymap.c new file mode 100644 index 000000000..447fbcf10 --- /dev/null +++ b/keyboards/atreus/keymaps/xyverz/keymap.c @@ -0,0 +1,89 @@ +// This is the personal keymap of Ian Sterling (@xyverz). It is based on the keymap by +// Chris Gerber (@gerbercj), with the addition of persistent layers like the Planck and +// Preonic keyboards by Jack Humbert. + +#include "atreus.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 _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_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} + }, + [_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_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) }, + {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_CAPS, 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 */ + {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_F6, KC_F7, KC_F8, KC_F9, KC_F10 }, + {KC_TRNS, KC_TRNS, DVORAK, QWERTY, COLEMAK, KC_LCTL, KC_TRNS, KC_TRNS, KC_TRNS, KC_F11, KC_F12 }, + {KC_TRNS, KC_TRNS, KC_LGUI, KC_TRNS, KC_BSPC, KC_LALT, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS, RESET } + } +}; + +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/ergodox/keymaps/xyverz/dvorak.png b/keyboards/ergodox/keymaps/xyverz/dvorak.png new file mode 100644 index 0000000000000000000000000000000000000000..cb8316309592e3e8098b198b0db14916741a5d75 GIT binary patch literal 87314 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

@H>k@RvK-?1FwxvLtU}> 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

&*o!rsa0H*YyXk_nSzTx>y2Q5oQ-RE7mRnBzrV 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 literal 0 HcmV?d00001 diff --git a/keyboards/ergodox/keymaps/xyverz/keymap.c b/keyboards/ergodox/keymaps/xyverz/keymap.c new file mode 100644 index 000000000..dd39dbacb --- /dev/null +++ b/keyboards/ergodox/keymaps/xyverz/keymap.c @@ -0,0 +1,184 @@ +#include "ergodox.h" +#include "debug.h" +#include "action_layer.h" + +#define BASE 0 // default layer +#define SYMB 1 // symbols +#define MDIA 2 // media keys + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Basic layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | ] | 1 | 2 | 3 | 4 | 5 | ESC | | ESC | 6 | 7 | 8 | 9 | 0 | \ | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Del | ' | , | . | P | Y | L1 | | L1 | F | G | C | R | L | / | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | BkSp | A | O | E | U | I |------| |------| D | H | T | N |S / L2| - | + * |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------| + * | LShift |:/Ctrl| Q | J | K | X | | | | B | M | W | V |Z/Ctrl| RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | App | LGui | | Alt |Ctrl/Esc| + * ,------|------|------| |------+--------+------. + * | | | Home | | PgUp | | | + * | Space|Backsp|------| |------| Tab |Enter | + * | |ace | End | | PgDn | | | + * `--------------------' `----------------------' + */ +// 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_RBRC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC, + KC_DELT, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, TG(1), + KC_BSPC, KC_A, KC_O, KC_E, KC_U, KC_I, + KC_LSFT, CTL_T(KC_SCLN), KC_Q, KC_J, KC_K, KC_X, ALL_T(KC_NO), + LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT, + ALT_T(KC_APP), KC_LGUI, + KC_HOME, + KC_SPC,KC_BSPC,KC_END, + // right hand + KC_ESC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, + TG(1), KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSLS, + KC_D, KC_H, KC_T, KC_N, LT(MDIA, KC_S), KC_MINS, + MEH_T(KC_NO),KC_B, KC_M, KC_W, KC_V, CTL_T(KC_Z), KC_RSFT, + KC_UP, KC_DOWN,KC_SLSH,KC_EQL, KC_FN1, + KC_LALT, CTL_T(KC_ESC), + KC_PGUP, + KC_PGDN,KC_TAB, KC_ENT + ), +/* Keymap 1: Symbol Layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | . | 0 | = | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// SYMBOLS +[SYMB] = KEYMAP( + // left hand + KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS, + KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV, + KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,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_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12, + KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS, + KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS, + KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +/* Keymap 2: Media and mouse keys + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | MsUp | | | | | | | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | Prev | Next | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | |Brwser| + * | | |------| |------| |Back | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// MEDIA AND MOUSE +KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + 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_MPLY, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, + KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_WBAK +), +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols) +}; + +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; +}; + +// 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); + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + 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; + default: + // none + break; + } + +}; diff --git a/keyboards/ergodox/keymaps/xyverz/old_keymap.c b/keyboards/ergodox/keymaps/xyverz/old_keymap.c new file mode 100644 index 000000000..e082372f9 --- /dev/null +++ b/keyboards/ergodox/keymaps/xyverz/old_keymap.c @@ -0,0 +1,311 @@ +#include "ergodox.h" +#include "debug.h" +#include "action_layer.h" + +extern keymap_config_t keymap_config; + +#define _DVORAK 0 // default layer +#define _QWERTY 1 // symbols +#define _LOWER 2 +#define _RAISE 3 +#define _ADJUST 16 + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* + * Keymap 0: Dvorak + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | ] | 1 | 2 | 3 | 4 | 5 | Esc | | ESC | 6 | 7 | 8 | 9 | 0 | [ | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Tab | ' | , | . | Y | Y |(Null)| |(Null)| F | G | C | R | L | \ | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | CapsLk | A | O | E | U | I |------| |------| D | H | T | N | S | - | + * |--------+------+------+------+------+------| FN1 | | FN2 |------+------+------+------+------+--------| + * | LShift | Z | X | C | V | X | | | | B | M | W | V | Z | RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | LGUI | ` | INS | Left | Rght | | Up | Dn | / | = | RGUI | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | LCtr | LAlt | | Ralt | RCtr | + * ,------|------|------| |------+------+------. + * | | | Home | | PgUp | | | + * | BkSp | Del |------| |------| Enter| Space| + * | | | End | | PgDn | | | + * `--------------------' `--------------------' + * + * + ***************************************************************************************************** + * This Dvorak keyboard layout 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 cor- + * ner keys. I've decided to continue using this layout with my ErgoDox. + */ + + [_DVORAK] = ( + KC_RBRC, 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, LOWER, + KC_LGUI, KC_GRV, KC_INS, KC_LEFT, KC_RGHT, + KC_LCTL, KC_LALT, + KC_HOME, + KC_BSPC, KC_DEL, KC_END, + // right hand + KC_ESC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, + NO, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSLS, + KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, + RAISE, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, + KC_UP, KC_DOWN, KC_SLSH, KC_EQL, KC_RGUI, + KC_RALT, KC_RCTL, + KC_PGUP, + KC_PGDN, KC_ENT, KC_SPC +), + +/* Keymap 1: QWERTY + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | = | 1 | 2 | 3 | 4 | 5 | LEFT | | RIGHT| 6 | 7 | 8 | 9 | 0 | - | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Del | Q | W | E | R | T | L1 | | L1 | Y | U | I | O | P | \ | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | BkSp | A | S | D | F | G |------| |------| H | J | K | L |; / L2|' / Cmd | + * |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------| + * | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | App | LGui | | Alt |Ctrl/Esc| + * ,------|------|------| |------+--------+------. + * | | | Home | | PgUp | | | + * | Space|Backsp|------| |------| Tab |Enter | + * | |ace | End | | PgDn | | | + * `--------------------' `----------------------' + */ +[_QWERTY] = ( + KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, + KC_DELT, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_NO, + KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, LOWER, + LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT, + {ALT_T(KC_APP), KC_LGUI, + KC_HOME, + KC_SPC,KC_BSPC,KC_END, + // right hand + KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + KC_NO, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),GUI_T(KC_QUOT), + RAISE, KC_N, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSFT, + KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1, + KC_LALT, CTL_T(KC_ESC), + KC_PGUP, + KC_PGDN,KC_TAB, KC_ENT +), + + +/* Lower 2: Symbol Layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | . | 0 | = | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +[_LOWER] = ( + // left hand + KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS, + KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV, + KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,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_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12, + KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS, + KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS, + KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), + +/* Raise 3: Media and mouse keys + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | MsUp | | | | | | | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | Prev | Next | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | |Brwser| + * | | |------| |------| |Back | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// MEDIA AND MOUSE +[_RAISE] = ( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + 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_MPLY, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, + KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_WBAK +), + +/* Adjust 16: Lower + Raise + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | Reset| | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | |------| |------| |Dvorak|Qwerty| | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// MEDIA AND MOUSE +[_ADJUST] = ( + KC_TRNS, RESET, 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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + 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, QWERTY, DVORAK, 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 +), + +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols) +}; + +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 _DVORAK: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_DVORAK); + } + break; + case _QWERTY: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_QWERTY); + } + 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); + } + 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); + } + 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) { + + 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) { + // TODO: Make this relevant to the ErgoDox EZ. + case 1: + ergodox_right_led_1_on(); + break; + case 2: + ergodox_right_led_2_on(); + break; + default: + // none + break; + } + +}; diff --git a/keyboards/ergodox/keymaps/xyverz/readme.md b/keyboards/ergodox/keymaps/xyverz/readme.md new file mode 100644 index 000000000..8f6dba45e --- /dev/null +++ b/keyboards/ergodox/keymaps/xyverz/readme.md @@ -0,0 +1,10 @@ +# ErgoDox EZ Default Configuration + +## Changelog + +* Feb 2, 2016 (V1.1): + * Made the right-hand quote key double as Cmd/Win on hold. So you get ' when you tap it, " when you tap it with Shift, and Cmd or Win when you hold it. You can then use it as a modifier, or just press and hold it for a moment (and then let go) to send a single Cmd or Win keystroke (handy for opening the Start menu on Windows). + +This is what we ship with out of the factory. :) The image says it all: + +![Default](default_highres.png) diff --git a/keyboards/planck/keymaps/xyverz/README.md b/keyboards/planck/keymaps/xyverz/README.md new file mode 100644 index 000000000..b0054fc30 --- /dev/null +++ b/keyboards/planck/keymaps/xyverz/README.md @@ -0,0 +1,2 @@ +# Zrevyx's Planck Layout + diff --git a/keyboards/planck/keymaps/xyverz/keymap.c b/keyboards/planck/keymaps/xyverz/keymap.c new file mode 100644 index 000000000..9ac78ec15 --- /dev/null +++ b/keyboards/planck/keymaps/xyverz/keymap.c @@ -0,0 +1,379 @@ +// 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 "planck.h" +#include "action_layer.h" +#ifdef AUDIO_ENABLE + #include "audio.h" +#endif +#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 _MUSIC 5 +#define _PLOVER 6 +#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) +#define PLOVER M(12) +#define EXT_PLV M(13) + +// 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 | 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_ENT }, + {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_BSPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +/* 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 | 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_ENT }, + {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_BSPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +/* 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] = { + {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 } +}, + +/* 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] = { + {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, _______, _______}, + {M(M_BL), _______, 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] = { + {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, _______, _______}, + {M(M_BL), _______, KC_HOME, KC_END, _______, KC_DEL, 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, LOWER, XXXXXXX, XXXXXXX, RAISE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX} +}, + +/* Plover layer (http://opensteno.org) + * ,-----------------------------------------------------------------------------------. + * | # | # | # | # | # | # | # | # | # | # | # | # | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | S | T | P | H | * | * | F | P | L | T | D | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | S | K | W | R | * | * | R | B | G | S | Z | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Exit | | | A | O | | E | U | | | | + * `-----------------------------------------------------------------------------------' + */ + +[_PLOVER] = { + {KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1 }, + {XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC}, + {XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, + {EXT_PLV, XXXXXXX, XXXXXXX, KC_C, KC_V, XXXXXXX, XXXXXXX, KC_N, KC_M, XXXXXXX, XXXXXXX, XXXXXXX} +}, + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover| | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | |Voice-|Voice+|Mus on|Musoff| | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = { + {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, + {_______, _______, _______, AUD_ON, AUD_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______}, + {_______, VC_DE, VC_IN, MUS_ON, MUS_OFF, _______, _______, _______, _______, _______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} +} + + +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +#ifdef AUDIO_ENABLE +float tone_startup[][2] = { + {440.0*pow(2.0,(31)/12.0), 12}, + {440.0*pow(2.0,(28)/12.0), 8}, + {440.0*pow(2.0,(19)/12.0), 8}, + {440.0*pow(2.0,(24)/12.0), 8}, + {440.0*pow(2.0,(28)/12.0), 20} +}; + +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +float tone_plover[][2] = SONG(PLOVER_SOUND); +float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND); + +float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); +float goodbye[][2] = SONG(GOODBYE_SOUND); +#endif + + +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 _QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_qwerty, false, 0); + #endif + persistant_default_layer_set(1UL<<_QWERTY); + } + break; + case _COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_colemak, false, 0); + #endif + persistant_default_layer_set(1UL<<_COLEMAK); + } + break; + case _DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_dvorak, false, 0); + #endif + persistant_default_layer_set(1UL<<_DVORAK); + } + 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); + } + 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); + } + break; + case M_BL: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } 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(tone_startup, 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; + case 12: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_plover, false, 0); + #endif + layer_off(_RAISE); + layer_off(_LOWER); + layer_off(_ADJUST); + layer_off(_MUSIC); + stop_all_notes(); + layer_on(_PLOVER); + if (!eeconfig_is_enabled()) { + eeconfig_init(); + } + keymap_config.raw = eeconfig_read_keymap(); + keymap_config.nkro = 1; + eeconfig_update_keymap(keymap_config.raw); + } + break; + case 13: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_plover_gb, false, 0); + #endif + layer_off(_PLOVER); + } + break; + + } + return MACRO_NONE; +}; + +void matrix_init_user(void) { + #ifdef AUDIO_ENABLE + _delay_ms(20); // stops the tick + PLAY_NOTE_ARRAY(tone_startup, false, 0); + #endif +} + +#ifdef AUDIO_ENABLE +void play_goodbye_tone() +{ + PLAY_NOTE_ARRAY(goodbye, false, 0); + _delay_ms(150); +} + +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))); + } + } + +} +#endif diff --git a/keyboards/planck/keymaps/xyverz/makefile.mk b/keyboards/planck/keymaps/xyverz/makefile.mk new file mode 100644 index 000000000..99fbfbd0b --- /dev/null +++ b/keyboards/planck/keymaps/xyverz/makefile.mk @@ -0,0 +1,2 @@ +AUDIO_ENABLE = yes +NKRO_ENABLE = yes \ No newline at end of file diff --git a/keyboards/preonic/keymaps/xyverz/README.md b/keyboards/preonic/keymaps/xyverz/README.md new file mode 100644 index 000000000..9c23c5b9f --- /dev/null +++ b/keyboards/preonic/keymaps/xyverz/README.md @@ -0,0 +1,49 @@ +# The default Preonic layout - largely based on the Planck's + +## QWERTY Layer: + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | - | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / | Shift| + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | Alt | Left |Right |Lower | Space |Raise | Up | Down | GUI |Enter | + * `-----------------------------------------------------------------------------------' + */ + +## LOWER Layer: + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Caps | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | Mute | Vol- | Vol+ | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| | Home | End | | Ins | | PgUp | PgDN | |Enter | + * `-----------------------------------------------------------------------------------' + */ + +## RAISE Layer: + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Caps | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | Prev | Play | Next | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| | Home | End | | Ins | | PgUp | PgDN | |Enter | + * `-----------------------------------------------------------------------------------' + */ \ No newline at end of file diff --git a/keyboards/preonic/keymaps/xyverz/keymap.c b/keyboards/preonic/keymaps/xyverz/keymap.c new file mode 100644 index 000000000..adc7392e5 --- /dev/null +++ b/keyboards/preonic/keymaps/xyverz/keymap.c @@ -0,0 +1,342 @@ +#include "preonic.h" +#include "action_layer.h" +#include "eeconfig.h" +#ifdef AUDIO_ENABLE + #include "audio.h" +#endif + +// 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 _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) + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | - | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / | Shift| + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | Alt | Left |Right |Lower | Space |Raise | Up | Down | GUI |Enter | + * `-----------------------------------------------------------------------------------' + */ +[_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_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 } +}, + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | ` | 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 | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_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} +}, + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | 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 | Space |Raise | Up | Down | GUI |Enter | + * `-----------------------------------------------------------------------------------' + */ +[_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_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 } +}, + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Caps | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | Mute | Vol- | Vol+ | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| | Home | End | | Ins | | PgUp | PgDN | |Enter | + * `-----------------------------------------------------------------------------------' + */ +[_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_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, _______, _______} +}, + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Caps | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | Prev | Play | Next | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| | Home | End | | Ins | | PgUp | PgDN | |Enter | + * `-----------------------------------------------------------------------------------' + */ +[_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_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} +}, + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Audoff|Aud on|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | |Voice-|Voice+|Musoff|Mus on| | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_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, _______, _______, _______, _______, _______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} +} + + +}; + +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_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); +#endif + +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 _QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_qwerty, false, 0); + #endif + persistant_default_layer_set(1UL<<_QWERTY); + } + break; + case _COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_colemak, false, 0); + #endif + persistant_default_layer_set(1UL<<_COLEMAK); + } + break; + case _DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_dvorak, false, 0); + #endif + persistant_default_layer_set(1UL<<_DVORAK); + } + 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); + } + 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); + } + break; + case M_BL: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } 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 MACRO_NONE; +}; + + +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 + +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 play_goodbye_tone() +{ + PLAY_NOTE_ARRAY(goodbye, false, 0); + _delay_ms(150); +} + +#endif \ No newline at end of file diff --git a/keyboards/preonic/keymaps/xyverz/makefile.mk b/keyboards/preonic/keymaps/xyverz/makefile.mk new file mode 100644 index 000000000..628167ff6 --- /dev/null +++ b/keyboards/preonic/keymaps/xyverz/makefile.mk @@ -0,0 +1 @@ +AUDIO_ENABLE = yes \ No newline at end of file From de1db144d06b488937633110b0598a1cac68f4fc Mon Sep 17 00:00:00 2001 From: Xyverz Date: Mon, 8 Aug 2016 18:44:09 -0700 Subject: [PATCH 02/20] Delete dvorak.png Not reflective of my layout. --- keyboards/ergodox/keymaps/xyverz/dvorak.png | Bin 87314 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 keyboards/ergodox/keymaps/xyverz/dvorak.png diff --git a/keyboards/ergodox/keymaps/xyverz/dvorak.png b/keyboards/ergodox/keymaps/xyverz/dvorak.png deleted file mode 100644 index cb8316309592e3e8098b198b0db14916741a5d75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87314 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

@H>k@RvK-?1FwxvLtU}> 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

&*o!rsa0H*YyXk_nSzTx>y2Q5oQ-RE7mRnBzrV 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 From bf93fa510bcc5cec84bcd9d81cb8fae6beb1ebb4 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Mon, 8 Aug 2016 18:46:34 -0700 Subject: [PATCH 03/20] Delete readme.md file cleanup, removing file that doesn't apply to my layout. --- keyboards/ergodox/keymaps/xyverz/readme.md | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 keyboards/ergodox/keymaps/xyverz/readme.md diff --git a/keyboards/ergodox/keymaps/xyverz/readme.md b/keyboards/ergodox/keymaps/xyverz/readme.md deleted file mode 100644 index 8f6dba45e..000000000 --- a/keyboards/ergodox/keymaps/xyverz/readme.md +++ /dev/null @@ -1,10 +0,0 @@ -# ErgoDox EZ Default Configuration - -## Changelog - -* Feb 2, 2016 (V1.1): - * Made the right-hand quote key double as Cmd/Win on hold. So you get ' when you tap it, " when you tap it with Shift, and Cmd or Win when you hold it. You can then use it as a modifier, or just press and hold it for a moment (and then let go) to send a single Cmd or Win keystroke (handy for opening the Start menu on Windows). - -This is what we ship with out of the factory. :) The image says it all: - -![Default](default_highres.png) From c060afe68eb729fd3afcfdb3f16e28730ab868b3 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Mon, 8 Aug 2016 18:47:13 -0700 Subject: [PATCH 04/20] Delete old_keymap.c file cleanup --- keyboards/ergodox/keymaps/xyverz/old_keymap.c | 311 ------------------ 1 file changed, 311 deletions(-) delete mode 100644 keyboards/ergodox/keymaps/xyverz/old_keymap.c diff --git a/keyboards/ergodox/keymaps/xyverz/old_keymap.c b/keyboards/ergodox/keymaps/xyverz/old_keymap.c deleted file mode 100644 index e082372f9..000000000 --- a/keyboards/ergodox/keymaps/xyverz/old_keymap.c +++ /dev/null @@ -1,311 +0,0 @@ -#include "ergodox.h" -#include "debug.h" -#include "action_layer.h" - -extern keymap_config_t keymap_config; - -#define _DVORAK 0 // default layer -#define _QWERTY 1 // symbols -#define _LOWER 2 -#define _RAISE 3 -#define _ADJUST 16 - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - -/* - * Keymap 0: Dvorak - * - * ,--------------------------------------------------. ,--------------------------------------------------. - * | ] | 1 | 2 | 3 | 4 | 5 | Esc | | ESC | 6 | 7 | 8 | 9 | 0 | [ | - * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | Tab | ' | , | . | Y | Y |(Null)| |(Null)| F | G | C | R | L | \ | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | CapsLk | A | O | E | U | I |------| |------| D | H | T | N | S | - | - * |--------+------+------+------+------+------| FN1 | | FN2 |------+------+------+------+------+--------| - * | LShift | Z | X | C | V | X | | | | B | M | W | V | Z | RShift | - * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | LGUI | ` | INS | Left | Rght | | Up | Dn | / | = | RGUI | - * `----------------------------------' `----------------------------------' - * ,-------------. ,-------------. - * | LCtr | LAlt | | Ralt | RCtr | - * ,------|------|------| |------+------+------. - * | | | Home | | PgUp | | | - * | BkSp | Del |------| |------| Enter| Space| - * | | | End | | PgDn | | | - * `--------------------' `--------------------' - * - * - ***************************************************************************************************** - * This Dvorak keyboard layout 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 cor- - * ner keys. I've decided to continue using this layout with my ErgoDox. - */ - - [_DVORAK] = ( - KC_RBRC, 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, LOWER, - KC_LGUI, KC_GRV, KC_INS, KC_LEFT, KC_RGHT, - KC_LCTL, KC_LALT, - KC_HOME, - KC_BSPC, KC_DEL, KC_END, - // right hand - KC_ESC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, - NO, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSLS, - KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, - RAISE, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, - KC_UP, KC_DOWN, KC_SLSH, KC_EQL, KC_RGUI, - KC_RALT, KC_RCTL, - KC_PGUP, - KC_PGDN, KC_ENT, KC_SPC -), - -/* Keymap 1: QWERTY - * - * ,--------------------------------------------------. ,--------------------------------------------------. - * | = | 1 | 2 | 3 | 4 | 5 | LEFT | | RIGHT| 6 | 7 | 8 | 9 | 0 | - | - * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | Del | Q | W | E | R | T | L1 | | L1 | Y | U | I | O | P | \ | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | BkSp | A | S | D | F | G |------| |------| H | J | K | L |; / L2|' / Cmd | - * |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------| - * | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RShift | - * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 | - * `----------------------------------' `----------------------------------' - * ,-------------. ,-------------. - * | App | LGui | | Alt |Ctrl/Esc| - * ,------|------|------| |------+--------+------. - * | | | Home | | PgUp | | | - * | Space|Backsp|------| |------| Tab |Enter | - * | |ace | End | | PgDn | | | - * `--------------------' `----------------------' - */ -[_QWERTY] = ( - KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, - KC_DELT, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_NO, - KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, - KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, LOWER, - LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT, - {ALT_T(KC_APP), KC_LGUI, - KC_HOME, - KC_SPC,KC_BSPC,KC_END, - // right hand - KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, - KC_NO, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, - KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),GUI_T(KC_QUOT), - RAISE, KC_N, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSFT, - KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1, - KC_LALT, CTL_T(KC_ESC), - KC_PGUP, - KC_PGDN,KC_TAB, KC_ENT -), - - -/* Lower 2: Symbol Layer - * - * ,--------------------------------------------------. ,--------------------------------------------------. - * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | - * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | | - * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | | | | | . | 0 | = | | - * `----------------------------------' `----------------------------------' - * ,-------------. ,-------------. - * | | | | | | - * ,------|------|------| |------+------+------. - * | | | | | | | | - * | | |------| |------| | | - * | | | | | | | | - * `--------------------' `--------------------' - */ -[_LOWER] = ( - // left hand - KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, - KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS, - KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV, - KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,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_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, - KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12, - KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS, - KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS, - KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS -), - -/* Raise 3: Media and mouse keys - * - * ,--------------------------------------------------. ,--------------------------------------------------. - * | | | | | | | | | | | | | | | | - * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | | | MsUp | | | | | | | | | | | | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | | | | | | | Prev | Next | | | - * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | | - * `----------------------------------' `----------------------------------' - * ,-------------. ,-------------. - * | | | | | | - * ,------|------|------| |------+------+------. - * | | | | | | |Brwser| - * | | |------| |------| |Back | - * | | | | | | | | - * `--------------------' `--------------------' - */ -// MEDIA AND MOUSE -[_RAISE] = ( - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, - // right hand - 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_MPLY, - KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, - KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_WBAK -), - -/* Adjust 16: Lower + Raise - * - * ,--------------------------------------------------. ,--------------------------------------------------. - * | | Reset| | | | | | | | | | | | | | - * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | | | | | | | | | | | | | | | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | |------| |------| |Dvorak|Qwerty| | | | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | | | | | | | | | | | - * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | | | | | | | | | - * `----------------------------------' `----------------------------------' - * ,-------------. ,-------------. - * | | | | | | - * ,------|------|------| |------+------+------. - * | | | | | | | | - * | | |------| |------| | | - * | | | | | | | | - * `--------------------' `--------------------' - */ -// MEDIA AND MOUSE -[_ADJUST] = ( - KC_TRNS, RESET, 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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, - // right hand - 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, QWERTY, DVORAK, 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 -), - -}; - -const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols) -}; - -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 _DVORAK: - if (record->event.pressed) { - persistant_default_layer_set(1UL<<_DVORAK); - } - break; - case _QWERTY: - if (record->event.pressed) { - persistant_default_layer_set(1UL<<_QWERTY); - } - 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); - } - 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); - } - 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) { - - 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) { - // TODO: Make this relevant to the ErgoDox EZ. - case 1: - ergodox_right_led_1_on(); - break; - case 2: - ergodox_right_led_2_on(); - break; - default: - // none - break; - } - -}; From 14938367626f0cddba4bc35abe62a9bcc02bee10 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Mon, 8 Aug 2016 18:48:36 -0700 Subject: [PATCH 05/20] Delete README.md file clean up. --- keyboards/preonic/keymaps/xyverz/README.md | 49 ---------------------- 1 file changed, 49 deletions(-) delete mode 100644 keyboards/preonic/keymaps/xyverz/README.md diff --git a/keyboards/preonic/keymaps/xyverz/README.md b/keyboards/preonic/keymaps/xyverz/README.md deleted file mode 100644 index 9c23c5b9f..000000000 --- a/keyboards/preonic/keymaps/xyverz/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# The default Preonic layout - largely based on the Planck's - -## QWERTY Layer: - -/* Qwerty - * ,-----------------------------------------------------------------------------------. - * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Tab | Q | W | E | R | T | Y | U | I | O | P | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | - | A | S | D | F | G | H | J | K | L | ; | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / | Shift| - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Ctrl | Alt | Left |Right |Lower | Space |Raise | Up | Down | GUI |Enter | - * `-----------------------------------------------------------------------------------' - */ - -## LOWER Layer: - -/* Lower - * ,-----------------------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Caps | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 | | Mute | Vol- | Vol+ | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Brite| | Home | End | | Ins | | PgUp | PgDN | |Enter | - * `-----------------------------------------------------------------------------------' - */ - -## RAISE Layer: - -/* Raise - * ,-----------------------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Caps | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 | | Prev | Play | Next | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Brite| | Home | End | | Ins | | PgUp | PgDN | |Enter | - * `-----------------------------------------------------------------------------------' - */ \ No newline at end of file From 4e030313f7f55be7573eaab0b91e45290dc2d0b3 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Mon, 8 Aug 2016 18:51:34 -0700 Subject: [PATCH 06/20] Delete README.md file cleanup --- keyboards/planck/keymaps/xyverz/README.md | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 keyboards/planck/keymaps/xyverz/README.md diff --git a/keyboards/planck/keymaps/xyverz/README.md b/keyboards/planck/keymaps/xyverz/README.md deleted file mode 100644 index b0054fc30..000000000 --- a/keyboards/planck/keymaps/xyverz/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Zrevyx's Planck Layout - From c062b6a13d7974144b5ab02896d2213051fd91ad Mon Sep 17 00:00:00 2001 From: Xyverz Date: Mon, 8 Aug 2016 18:52:48 -0700 Subject: [PATCH 07/20] Delete keymap.c file cleanup --- keyboards/ergodox/keymaps/xyverz/keymap.c | 184 ---------------------- 1 file changed, 184 deletions(-) delete mode 100644 keyboards/ergodox/keymaps/xyverz/keymap.c diff --git a/keyboards/ergodox/keymaps/xyverz/keymap.c b/keyboards/ergodox/keymaps/xyverz/keymap.c deleted file mode 100644 index dd39dbacb..000000000 --- a/keyboards/ergodox/keymaps/xyverz/keymap.c +++ /dev/null @@ -1,184 +0,0 @@ -#include "ergodox.h" -#include "debug.h" -#include "action_layer.h" - -#define BASE 0 // default layer -#define SYMB 1 // symbols -#define MDIA 2 // media keys - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* Keymap 0: Basic layer - * - * ,--------------------------------------------------. ,--------------------------------------------------. - * | ] | 1 | 2 | 3 | 4 | 5 | ESC | | ESC | 6 | 7 | 8 | 9 | 0 | \ | - * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | Del | ' | , | . | P | Y | L1 | | L1 | F | G | C | R | L | / | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | BkSp | A | O | E | U | I |------| |------| D | H | T | N |S / L2| - | - * |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------| - * | LShift |:/Ctrl| Q | J | K | X | | | | B | M | W | V |Z/Ctrl| RShift | - * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 | - * `----------------------------------' `----------------------------------' - * ,-------------. ,-------------. - * | App | LGui | | Alt |Ctrl/Esc| - * ,------|------|------| |------+--------+------. - * | | | Home | | PgUp | | | - * | Space|Backsp|------| |------| Tab |Enter | - * | |ace | End | | PgDn | | | - * `--------------------' `----------------------' - */ -// 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_RBRC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC, - KC_DELT, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, TG(1), - KC_BSPC, KC_A, KC_O, KC_E, KC_U, KC_I, - KC_LSFT, CTL_T(KC_SCLN), KC_Q, KC_J, KC_K, KC_X, ALL_T(KC_NO), - LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT, - ALT_T(KC_APP), KC_LGUI, - KC_HOME, - KC_SPC,KC_BSPC,KC_END, - // right hand - KC_ESC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, - TG(1), KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSLS, - KC_D, KC_H, KC_T, KC_N, LT(MDIA, KC_S), KC_MINS, - MEH_T(KC_NO),KC_B, KC_M, KC_W, KC_V, CTL_T(KC_Z), KC_RSFT, - KC_UP, KC_DOWN,KC_SLSH,KC_EQL, KC_FN1, - KC_LALT, CTL_T(KC_ESC), - KC_PGUP, - KC_PGDN,KC_TAB, KC_ENT - ), -/* Keymap 1: Symbol Layer - * - * ,--------------------------------------------------. ,--------------------------------------------------. - * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | - * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | | - * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | | | | | . | 0 | = | | - * `----------------------------------' `----------------------------------' - * ,-------------. ,-------------. - * | | | | | | - * ,------|------|------| |------+------+------. - * | | | | | | | | - * | | |------| |------| | | - * | | | | | | | | - * `--------------------' `--------------------' - */ -// SYMBOLS -[SYMB] = KEYMAP( - // left hand - KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, - KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS, - KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV, - KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,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_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, - KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12, - KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS, - KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS, - KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS -), -/* Keymap 2: Media and mouse keys - * - * ,--------------------------------------------------. ,--------------------------------------------------. - * | | | | | | | | | | | | | | | | - * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | | | MsUp | | | | | | | | | | | | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | | | | | | | Prev | Next | | | - * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | | - * `----------------------------------' `----------------------------------' - * ,-------------. ,-------------. - * | | | | | | - * ,------|------|------| |------+------+------. - * | | | | | | |Brwser| - * | | |------| |------| |Back | - * | | | | | | | | - * `--------------------' `--------------------' - */ -// MEDIA AND MOUSE -KEYMAP( - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, - // right hand - 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_MPLY, - KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, - KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_WBAK -), -}; - -const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols) -}; - -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; -}; - -// 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); - - ergodox_board_led_off(); - ergodox_right_led_1_off(); - 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; - default: - // none - break; - } - -}; From 39dd3d674cfb7299ce377f70a678d3613f826e0a Mon Sep 17 00:00:00 2001 From: Ian Sterling Date: Mon, 8 Aug 2016 19:35:13 -0700 Subject: [PATCH 08/20] Changed behavior of _DVORAK layout's KC_RSFT to SFT_T(KC_ENT) for flexibility's sake. Updated the rest of the keymap to reflect the current (as of 19:37 on 08 Aug 2018) default layout and default makefile. --- keyboards/planck/keymaps/xyverz/README.md | 2 - keyboards/planck/keymaps/xyverz/keymap.c | 339 ++++++++------------ keyboards/planck/keymaps/xyverz/makefile.mk | 27 +- 3 files changed, 162 insertions(+), 206 deletions(-) delete mode 100644 keyboards/planck/keymaps/xyverz/README.md diff --git a/keyboards/planck/keymaps/xyverz/README.md b/keyboards/planck/keymaps/xyverz/README.md deleted file mode 100644 index b0054fc30..000000000 --- a/keyboards/planck/keymaps/xyverz/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Zrevyx's Planck Layout - diff --git a/keyboards/planck/keymaps/xyverz/keymap.c b/keyboards/planck/keymaps/xyverz/keymap.c index 9ac78ec15..90529428d 100644 --- a/keyboards/planck/keymaps/xyverz/keymap.c +++ b/keyboards/planck/keymaps/xyverz/keymap.c @@ -19,25 +19,19 @@ extern keymap_config_t keymap_config; #define _DVORAK 2 #define _LOWER 3 #define _RAISE 4 -#define _MUSIC 5 -#define _PLOVER 6 +#define _PLOVER 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) -#define PLOVER M(12) -#define EXT_PLV M(13) +enum planck_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + PLOVER, + LOWER, + RAISE, + BACKLIT, + EXT_PLV +}; // Fillers to make layering more clear #define _______ KC_TRNS @@ -60,7 +54,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_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 }, - {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_BSPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} + {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} }, /* Colemak @@ -78,7 +72,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {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 }, - {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_BSPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} + {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} }, /* Dvorak @@ -95,7 +89,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, KC_RSFT}, + {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_LCTL, KC_LALT, KC_LEFT, KC_RGHT, LOWER, KC_BSPC, KC_SPC, RAISE, KC_UP, KC_DOWN, KC_RGUI, KC_ENT } }, @@ -114,7 +108,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_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_DEL, KC_INS, _______, KC_PGUP, KC_PGDN, _______, _______} + {BACKLIT, _______, KC_HOME, KC_END, _______, KC_DEL, KC_INS, _______, KC_PGUP, KC_PGDN, _______, _______} }, /* Raise @@ -132,17 +126,7 @@ 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_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_DEL, 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, LOWER, XXXXXXX, XXXXXXX, RAISE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX} + {BACKLIT, _______, KC_HOME, KC_END, _______, KC_DEL, KC_INS, _______, KC_PGUP, KC_PGDN, _______, _______} }, /* Plover layer (http://opensteno.org) @@ -151,7 +135,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+-------------+------+------+------+------+------| * | | S | T | P | H | * | * | F | P | L | T | D | * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | S | K | W | R | * | * | R | B | G | S | Z | + * |TogOut| S | K | W | R | * | * | R | B | G | S | Z | * |------+------+------+------+------+------+------+------+------+------+------+------| * | Exit | | | A | O | | E | U | | | | * `-----------------------------------------------------------------------------------' @@ -170,42 +154,32 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+-------------+------+------+------+------+------| * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover| | * |------+------+------+------+------+------|------+------+------+------+------+------| - * | |Voice-|Voice+|Mus on|Musoff| | | | | | | | + * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | * |------+------+------+------+------+------+------+------+------+------+------+------| * | | | | | | | | | | | | * `-----------------------------------------------------------------------------------' */ [_ADJUST] = { {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, - {_______, _______, _______, AUD_ON, AUD_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______}, - {_______, VC_DE, VC_IN, MUS_ON, MUS_OFF, _______, _______, _______, _______, _______, _______, _______}, + {_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______}, + {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} } -}; - -const uint16_t PROGMEM fn_actions[] = { - }; #ifdef AUDIO_ENABLE -float tone_startup[][2] = { - {440.0*pow(2.0,(31)/12.0), 12}, - {440.0*pow(2.0,(28)/12.0), 8}, - {440.0*pow(2.0,(19)/12.0), 8}, - {440.0*pow(2.0,(24)/12.0), 8}, - {440.0*pow(2.0,(28)/12.0), 20} -}; +float tone_startup[][2] = SONG(STARTUP_SOUND); float tone_qwerty[][2] = SONG(QWERTY_SOUND); float tone_dvorak[][2] = SONG(DVORAK_SOUND); float tone_colemak[][2] = SONG(COLEMAK_SOUND); float tone_plover[][2] = SONG(PLOVER_SOUND); float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND); +float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); -float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); -float goodbye[][2] = SONG(GOODBYE_SOUND); +float tone_goodbye[][2] = SONG(GOODBYE_SOUND); #endif @@ -214,166 +188,127 @@ 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: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_qwerty, false, 0); - #endif - persistant_default_layer_set(1UL<<_QWERTY); - } - break; - case _COLEMAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_colemak, false, 0); - #endif - persistant_default_layer_set(1UL<<_COLEMAK); - } - break; - case _DVORAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_dvorak, false, 0); - #endif - persistant_default_layer_set(1UL<<_DVORAK); - } - 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); - } - 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); - } - break; - case M_BL: - if (record->event.pressed) { - register_code(KC_RSFT); - #ifdef BACKLIGHT_ENABLE - backlight_step(); - #endif - } 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(tone_startup, 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; - case 12: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_plover, false, 0); - #endif - layer_off(_RAISE); - layer_off(_LOWER); - layer_off(_ADJUST); - layer_off(_MUSIC); - stop_all_notes(); - layer_on(_PLOVER); - if (!eeconfig_is_enabled()) { - eeconfig_init(); - } - keymap_config.raw = eeconfig_read_keymap(); - keymap_config.nkro = 1; - eeconfig_update_keymap(keymap_config.raw); - } - break; - case 13: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_plover_gb, false, 0); - #endif - layer_off(_PLOVER); - } - break; - +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 MACRO_NONE; -}; + return false; + break; + 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: + 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: + 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; + case BACKLIT: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } else { + unregister_code(KC_RSFT); + } + return false; + break; + case PLOVER: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + stop_all_notes(); + PLAY_NOTE_ARRAY(tone_plover, false, 0); + #endif + layer_off(_RAISE); + layer_off(_LOWER); + layer_off(_ADJUST); + layer_on(_PLOVER); + if (!eeconfig_is_enabled()) { + eeconfig_init(); + } + keymap_config.raw = eeconfig_read_keymap(); + keymap_config.nkro = 1; + eeconfig_update_keymap(keymap_config.raw); + } + return false; + break; + case EXT_PLV: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_plover_gb, false, 0); + #endif + layer_off(_PLOVER); + } + return false; + break; + } + return true; +} void matrix_init_user(void) { - #ifdef AUDIO_ENABLE - _delay_ms(20); // stops the tick - PLAY_NOTE_ARRAY(tone_startup, false, 0); - #endif + #ifdef AUDIO_ENABLE + startup_user(); + #endif } #ifdef AUDIO_ENABLE -void play_goodbye_tone() + +void startup_user() { - PLAY_NOTE_ARRAY(goodbye, false, 0); - _delay_ms(150); + _delay_ms(20); // gets rid of tick + PLAY_NOTE_ARRAY(tone_startup, false, 0); } -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 shutdown_user() +{ + PLAY_NOTE_ARRAY(tone_goodbye, false, 0); + _delay_ms(150); + stop_all_notes(); } -#endif + +void music_on_user(void) +{ + music_scale_user(); +} + +void music_scale_user(void) +{ + PLAY_NOTE_ARRAY(music_scale, false, 0); +} + +#endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/xyverz/makefile.mk b/keyboards/planck/keymaps/xyverz/makefile.mk index 99fbfbd0b..0f4953888 100644 --- a/keyboards/planck/keymaps/xyverz/makefile.mk +++ b/keyboards/planck/keymaps/xyverz/makefile.mk @@ -1,2 +1,25 @@ -AUDIO_ENABLE = yes -NKRO_ENABLE = yes \ No newline at end of file + + +# 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 6f700f1eb0c76aa19187efd83ab2b49a0db7f71f Mon Sep 17 00:00:00 2001 From: Ian Sterling Date: Tue, 9 Aug 2016 23:49:27 -0700 Subject: [PATCH 09/20] Adding my own layouts for the Phantom and Ergodox. My Ergodox layout adds persistent layers based on the Planck and Preonic setup. The layout arrays are pulled directly from the ergodox/ez/ez.h keymap definition starting at line 81. --- keyboards/ergodox/keymaps/xyverz/keymap.c | 311 ++++++++++++++++++++++ keyboards/phantom/keymaps/xyverz/keymap.c | 67 +++++ 2 files changed, 378 insertions(+) create mode 100644 keyboards/ergodox/keymaps/xyverz/keymap.c create mode 100644 keyboards/phantom/keymaps/xyverz/keymap.c diff --git a/keyboards/ergodox/keymaps/xyverz/keymap.c b/keyboards/ergodox/keymaps/xyverz/keymap.c new file mode 100644 index 000000000..c5ce99dd2 --- /dev/null +++ b/keyboards/ergodox/keymaps/xyverz/keymap.c @@ -0,0 +1,311 @@ +/* + * 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 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. + * + * I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar to the default Planck + * layouts. + * + * For a better explanation of the layout matrices shown below, take a look at ../../ez/ez.h where the + * keymap is defined, beginning on line 81. + * + */ + +#include "ergodox.h" +#include "debug.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 _MD 3 // Media Layer +#define _KP 4 // Keypad Layer + +// Macro name shortcuts +#define DVORAK M(_DV) +#define QWERTY M(_QW) +#define COLEMAK M(_CM) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Dvorak layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | ] | 1 | 2 | 3 | 4 | 5 | ESC | | ESC | 6 | 7 | 8 | 9 | 0 | [ | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Tab | ' | , | . | Y | Y | | | | F | G | C | R | L | \ | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | CapsLk | A | O | E | U | I |------| |------| D | H | T | N | S | - | + * |--------+------+------+------+------+------| _MD | | _KP |------+------+------+------+------+--------| + * | LShift | Z | X | C | V | X | | | | B | M | W | V | Z | RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | LGUI | ` | INS | Left | Rght | | Up | Dn | / | = | RGUI | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | LCtr | LAlt | | Ralt | RCtr | + * ,------|------|------| |------+------+------. + * | | | Home | | PgUp | | | + * | BkSp | Del |------| |------| Enter| Space| + * | | | End | | PgDn | | | + * `--------------------' `--------------------' + * + */ +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* +[_DV] = { // layer 0 : Dvorak + // left hand + {KC_RBRC, KC_TAB, KC_CAPS, KC_LSFT, KC_LGUI, KC_NO }, + {KC_1, KC_QUOT, KC_A, KC_SCLN, KC_GRV, KC_END }, + {KC_2, KC_COMM, KC_O, KC_Q, KC_INS, KC_DEL }, + {KC_3, KC_DOT, KC_E, KC_J, KC_LEFT, KC_BSPC}, + {KC_4, KC_P, KC_U, KC_K, KC_RGHT, KC_HOME}, + {KC_5, KC_Y, KC_I, KC_X, KC_NO, KC_LCTL}, + {KC_ESC, KC_NO, KC_NO, MO(_MD), KC_NO, KC_LALT}, + + // right hand + {KC_ESC, KC_NO, KC_NO, MO(_KP), KC_NO, KC_RALT}, + {KC_6, KC_F, KC_D, KC_B, KC_NO, KC_RCTL}, + {KC_7, KC_G, KC_H, KC_M, KC_UP, KC_PGUP}, + {KC_8, KC_C, KC_T, KC_W, KC_DOWN, KC_SPC }, + {KC_9, KC_R, KC_N, KC_V, KC_SLSH, KC_ENT }, + {KC_0, KC_L, KC_S, KC_Z, KC_EQL, KC_PGDN}, + {KC_LBRC, KC_BSLS, KC_MINS, KC_RSFT, KC_RGUI, KC_NO } +}, + +/* Keymap 1: QWERTY layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | = | 1 | 2 | 3 | 4 | 5 | ESC | | ESC | 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 | ; | ' | + * |--------+------+------+------+------+------| _MD | | _KP |------+------+------+------+------+--------| + * | LShift | Z | X | C | V | B | | | | N | M | , | . | / | RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | LGUI | ` | INS | Left | Rght | | Up | Dn | [ | ] | RGUI | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | LCtr | LAlt | | Ralt | RCtr | + * ,------|------|------| |------+------+------. + * | | | Home | | PgUp | | | + * | BkSp | Del |------| |------| Enter| Space| + * | | | End | | PgDn | | | + * `--------------------' `--------------------' + */ +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* +[_QW] = { // layer 1 : QWERTY + // left hand + {KC_EQL, KC_TAB, KC_CAPS, KC_LSFT, KC_LGUI, KC_NO }, + {KC_1, KC_Q, KC_A, KC_Z, KC_GRV, KC_END }, + {KC_2, KC_W, KC_S, KC_X, KC_INS, KC_DEL }, + {KC_3, KC_E, KC_D, KC_C, KC_LEFT, KC_BSPC}, + {KC_4, KC_R, KC_F, KC_V, KC_RGHT, KC_HOME}, + {KC_5, KC_T, KC_G, KC_B, KC_NO, KC_LCTL}, + {KC_ESC, KC_NO, KC_NO, MO(_MD), KC_NO, KC_LALT}, + + // right hand + {KC_ESC, KC_NO, KC_NO, MO(_KP), KC_NO, KC_RALT}, + {KC_6, KC_Y, KC_H, KC_N, KC_NO, KC_RCTL}, + {KC_7, KC_U, KC_J, KC_M, KC_UP, KC_PGUP}, + {KC_8, KC_I, KC_K, KC_COMM, KC_DOWN, KC_SPC }, + {KC_9, KC_O, KC_L, KC_DOT, KC_LBRC, KC_ENT }, + {KC_0, KC_P, KC_SCLN, KC_SLSH, KC_RBRC, KC_PGDN}, + {KC_MINS, KC_BSLS, KC_QUOT, KC_RSFT, KC_RGUI, KC_NO } + }, + +/* Keymap 2: Colemak layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | = | 1 | 2 | 3 | 4 | 5 | ESC | | ESC | 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 | ' | + * |--------+------+------+------+------+------| _MD | | _KP |------+------+------+------+------+--------| + * | LShift | Z | X | C | V | B | | | | K | M | , | . | / | RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | LGUI | ` | INS | Left | Rght | | Up | Dn | [ | ] | RGUI | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | LCtr | LAlt | | Ralt | RCtr | + * ,------|------|------| |------+------+------. + * | | | Home | | PgUp | | | + * | BkSp | Del |------| |------| Enter| Space| + * | | | End | | PgDn | | | + * `--------------------' `--------------------' + */ +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* +[_CM] = { // layer 2 : Colemak + // left hand + {KC_EQL, KC_TAB, KC_BSPC, KC_LSFT, KC_LGUI, KC_NO }, + {KC_1, KC_Q, KC_A, KC_Z, KC_GRV, KC_END }, + {KC_2, KC_W, KC_R, KC_X, KC_INS, KC_DEL }, + {KC_3, KC_F, KC_S, KC_C, KC_LEFT, KC_BSPC}, + {KC_4, KC_P, KC_T, KC_V, KC_RGHT, KC_HOME}, + {KC_5, KC_G, KC_D, KC_B, KC_NO, KC_LCTL}, + {KC_ESC, KC_NO, KC_NO, MO(_MD), KC_NO, KC_LALT}, + + // right hand + {KC_ESC, KC_NO, KC_NO, MO(_KP), KC_NO, KC_RALT}, + {KC_6, KC_J, KC_H, KC_K, KC_NO, KC_RCTL}, + {KC_7, KC_L, KC_N, KC_M, KC_UP, KC_PGUP}, + {KC_8, KC_U, KC_E, KC_COMM, KC_DOWN, KC_SPC }, + {KC_9, KC_Y, KC_I, KC_DOT, KC_LBRC, KC_ENT }, + {KC_0, KC_SCLN, KC_O, KC_SLSH, KC_RBRC, KC_PGDN}, + {KC_MINS, KC_BSLS, KC_QUOT, KC_RSFT, KC_RGUI, KC_NO } + }, + +/* Keymap 3: Symbol Layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | TEENSY | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | PrSc | ScLk | Paus | | FN4 | | FN5 | | Mute | Vol- | Vol+ | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | |------| |------| Stop | Prev | Play | Next | Sel | | + * |--------+------+------+------+------+------| FN4 | | FN5 |------+------+------+------+------+--------| + * | | |Dvorak|Qwerty|Colemk| | | | | | | | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// Media Layer +[_MD] = { // layer 3 : Media layer + // left hand + {RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO }, + {KC_F1, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}, + {KC_F2, KC_PSCR, KC_TRNS, DVORAK, KC_TRNS, KC_TRNS}, + {KC_F3, KC_SLCK, KC_TRNS, QWERTY, KC_TRNS, KC_TRNS}, + {KC_F4, KC_PAUS, KC_TRNS, COLEMAK, KC_TRNS, KC_TRNS}, + {KC_F5, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS}, + {KC_F11, KC_NO, KC_NO, KC_TRNS, KC_NO, KC_TRNS}, + + // right hand + {KC_F12, KC_NO, KC_NO, KC_TRNS, KC_NO, KC_TRNS}, + {KC_F6, KC_TRNS, KC_MSTP, KC_TRNS, KC_NO, KC_TRNS}, + {KC_F7, KC_MUTE, KC_MPRV, KC_TRNS, KC_TRNS, KC_TRNS}, + {KC_F8, KC_VOLD, KC_MPLY, KC_TRNS, KC_TRNS, KC_TRNS}, + {KC_F9, KC_VOLU, KC_MNXT, KC_TRNS, KC_TRNS, KC_TRNS}, + {KC_F10, KC_TRNS, KC_MSEL, KC_TRNS, KC_TRNS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO } + }, + +/* Keymap 4: Keypad layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | Power | | | | | | | | | | NmLk | KP / | KP * | KP - | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Sleep | | | | | | FN5 | | FN4 | | KP 7 | KP 8 | KP 9 | KP + | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | Wake | | | | | |------| |------| | KP 4 | KP 5 | KP 6 | KP + | | + * |--------+------+------+------+------+------| FN5 | | FN4 |------+------+------+------+------+--------| + * | | | | | | | | | | | KP 1 | KP 2 | KP 3 |KP Ent| | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | KP 0 | | KP . |KP Ent| | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// Keypad Layer +[_KP] = { // layer 4 : Keypad layer + // left hand + {KC_PWR, KC_SLEP, KC_WAKE, KC_TRNS, KC_TRNS, KC_NO }, + {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_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS}, + {KC_TRNS, KC_NO, KC_NO, KC_TRNS, KC_NO, KC_TRNS}, + + // right hand + {KC_TRNS, KC_NO, KC_NO, KC_TRNS, KC_NO, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS}, + {KC_NLCK, KC_P7, KC_P4, KC_P1, KC_P0, KC_TRNS}, + {KC_PSLS, KC_P8, KC_P5, KC_P2, KC_NO, KC_TRNS}, + {KC_PAST, KC_P9, KC_P6, KC_P3, KC_PDOT, KC_TRNS}, + {KC_PMNS, KC_PPLS, KC_PPLS, KC_PENT, KC_PENT, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO } + }, + +}; + +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) { + + 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) { + // TODO: Make this relevant to the ErgoDox EZ. + case 1: + ergodox_right_led_1_on(); + break; + case 2: + ergodox_right_led_2_on(); + break; + default: + // none + break; + } + +}; diff --git a/keyboards/phantom/keymaps/xyverz/keymap.c b/keyboards/phantom/keymaps/xyverz/keymap.c new file mode 100644 index 000000000..5948e4ca5 --- /dev/null +++ b/keyboards/phantom/keymaps/xyverz/keymap.c @@ -0,0 +1,67 @@ +#include "phantom.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 _BL 0 +#define _FL 1 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: (Base Layer) Default Layer + * ,-----------------------------------------------------------------------------. + * |Esc |f1| f2| f3| f4| | f5| f6| f7| f8| | f9|f10|f11|f12| |Prnt|ScLk|Paus| + * |-----------------------------------------------------------| |--------------| + * | ~ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0| - | = |Backsp | | Ins|Home|PgUp| + * |-----------------------------------------------------------| |--------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| | Del| End|PgDn| + * |-----------------------------------------------------------| `--------------' + * |CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return | + * |-----------------------------------------------------------| ,----. + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | | Up | + * |-----------------------------------------------------------| ,-------------. + * |Ctrl|Gui |Alt | Space |ALT |GUI |_FL |CTRL | |Lft| Dn |Rig | + * `-----------------------------------------------------------' `-------------' + */ +[_BL] = KEYMAP( + KC_ESC, 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_PSCR, KC_SLCK, KC_PAUS, \ + KC_GRV, 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_INS, KC_HOME, 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_DELETE, KC_END, KC_PGDN, \ + 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_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_UP, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT), + + /* Keymap _FL: Function Layer + * ,-----------------------------------------------------------------------------. + * |RESET| | | | | | | | | | | | | | | | | | | + * |-----------------------------------------------------------| |--------------| + * | | | | | | | | | | | | | | | | | | | + * |-----------------------------------------------------------| |--------------| + * | | | | | | | | | | | | | | | | | | | + * |-----------------------------------------------------------| `--------------' + * | | | | | | | | | | | | | | + * |-----------------------------------------------------------| ,----. + * | | F1| F2| F3| F4| F5|F6 |F7 |F8 | | | | | | + * |-----------------------------------------------------------| ,-------------. + * | | | | | | | | | | | | | + * `-----------------------------------------------------------' `-------------' + */ +[_FL] = 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,KC_TRNS,KC_SLEP, \ + RESET, 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_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_MSTP,KC_MPLY,KC_MPRV,KC_MNXT,KC_MSEL, 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_CALC,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_CAPS, KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS) +}; + +enum function_id { + SHIFT_ESC, +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { +} From 0d6035524173219ced32abbfa2e78171edab17ff Mon Sep 17 00:00:00 2001 From: Ian Sterling Date: Tue, 9 Aug 2016 23:56:21 -0700 Subject: [PATCH 10/20] Added braces using LSFT(KC_LBRC) and LSFT(KC_RBRC) since the normal RBCR and LBCR didn't work for me. --- keyboards/atreus/keymaps/xyverz/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/atreus/keymaps/xyverz/keymap.c b/keyboards/atreus/keymaps/xyverz/keymap.c index 447fbcf10..f4d4a9cf0 100644 --- a/keyboards/atreus/keymaps/xyverz/keymap.c +++ b/keyboards/atreus/keymaps/xyverz/keymap.c @@ -53,7 +53,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {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_F6, KC_F7, KC_F8, KC_F9, KC_F10 }, {KC_TRNS, KC_TRNS, DVORAK, QWERTY, COLEMAK, KC_LCTL, KC_TRNS, KC_TRNS, KC_TRNS, KC_F11, KC_F12 }, - {KC_TRNS, KC_TRNS, KC_LGUI, KC_TRNS, KC_BSPC, KC_LALT, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS, RESET } + {KC_TRNS, KC_TRNS, KC_LGUI, KC_TRNS, KC_BSPC, KC_LALT, KC_SPC, KC_TRNS, LSFT(KC_LBRC), LSFT(KC_RBRC), RESET } } }; From d1f418d85ddb3bc9594ab71267af92ef1a5b7b0c Mon Sep 17 00:00:00 2001 From: Xyverz Date: Thu, 11 Aug 2016 09:46:05 -0700 Subject: [PATCH 11/20] Update Makefile Corrected spelling of "ATREUS" in all locations. (ATRUES -> ATREUS) --- keyboards/atreus/Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/atreus/Makefile b/keyboards/atreus/Makefile index 95ee1d4d7..5894d231f 100644 --- a/keyboards/atreus/Makefile +++ b/keyboards/atreus/Makefile @@ -2,11 +2,11 @@ ifdef TEENSY2 OPT_DEFS += -DATREUS_TEENSY2 - ATRUES_UPLOAD_COMMAND = teensy_loader_cli -w -mmcu=$(MCU) $(TARGET).hex + ATREUS_UPLOAD_COMMAND = teensy_loader_cli -w -mmcu=$(MCU) $(TARGET).hex else OPT_DEFS += -DATREUS_ASTAR OPT_DEFS += -DCATERINA_BOOTLOADER - ATRUES_UPLOAD_COMMAND = while [ ! -r $(USB) ]; do sleep 1; done; \ + ATREUS_UPLOAD_COMMAND = while [ ! -r $(USB) ]; do sleep 1; done; \ avrdude -p $(MCU) -c avr109 -U flash:w:$(TARGET).hex -P $(USB) endif @@ -84,5 +84,5 @@ endif USB ?= /dev/cu.usbmodem1411 upload: build - $(ATRUES_UPLOAD_COMMAND) - \ No newline at end of file + $(ATREUS_UPLOAD_COMMAND) + From eeade4af84af073479f38de32d97e99203b29350 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Thu, 11 Aug 2016 09:48:23 -0700 Subject: [PATCH 12/20] Update keymap.c Changed right-hand F-key layout in order to add KC_PLUS to _L2. --- keyboards/atreus/keymaps/xyverz/keymap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/atreus/keymaps/xyverz/keymap.c b/keyboards/atreus/keymaps/xyverz/keymap.c index f4d4a9cf0..0238fdbd3 100644 --- a/keyboards/atreus/keymaps/xyverz/keymap.c +++ b/keyboards/atreus/keymaps/xyverz/keymap.c @@ -51,8 +51,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }, [_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_F6, KC_F7, KC_F8, KC_F9, KC_F10 }, - {KC_TRNS, KC_TRNS, DVORAK, QWERTY, COLEMAK, KC_LCTL, KC_TRNS, KC_TRNS, KC_TRNS, KC_F11, KC_F12 }, + {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_NO, KC_TRNS, KC_F6, KC_F7, KC_F8, KC_PLUS}, + {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 71e1bb2e1cf5fd87cb9cc6f81b830763b38665d4 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Thu, 11 Aug 2016 11:04:57 -0700 Subject: [PATCH 13/20] Delete keymap.c Not ready to submit this one just yet. --- keyboards/phantom/keymaps/xyverz/keymap.c | 67 ----------------------- 1 file changed, 67 deletions(-) delete mode 100644 keyboards/phantom/keymaps/xyverz/keymap.c diff --git a/keyboards/phantom/keymaps/xyverz/keymap.c b/keyboards/phantom/keymaps/xyverz/keymap.c deleted file mode 100644 index 5948e4ca5..000000000 --- a/keyboards/phantom/keymaps/xyverz/keymap.c +++ /dev/null @@ -1,67 +0,0 @@ -#include "phantom.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 _BL 0 -#define _FL 1 - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* Keymap _BL: (Base Layer) Default Layer - * ,-----------------------------------------------------------------------------. - * |Esc |f1| f2| f3| f4| | f5| f6| f7| f8| | f9|f10|f11|f12| |Prnt|ScLk|Paus| - * |-----------------------------------------------------------| |--------------| - * | ~ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0| - | = |Backsp | | Ins|Home|PgUp| - * |-----------------------------------------------------------| |--------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| | Del| End|PgDn| - * |-----------------------------------------------------------| `--------------' - * |CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return | - * |-----------------------------------------------------------| ,----. - * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | | Up | - * |-----------------------------------------------------------| ,-------------. - * |Ctrl|Gui |Alt | Space |ALT |GUI |_FL |CTRL | |Lft| Dn |Rig | - * `-----------------------------------------------------------' `-------------' - */ -[_BL] = KEYMAP( - KC_ESC, 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_PSCR, KC_SLCK, KC_PAUS, \ - KC_GRV, 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_INS, KC_HOME, 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_DELETE, KC_END, KC_PGDN, \ - 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_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_UP, \ - KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT), - - /* Keymap _FL: Function Layer - * ,-----------------------------------------------------------------------------. - * |RESET| | | | | | | | | | | | | | | | | | | - * |-----------------------------------------------------------| |--------------| - * | | | | | | | | | | | | | | | | | | | - * |-----------------------------------------------------------| |--------------| - * | | | | | | | | | | | | | | | | | | | - * |-----------------------------------------------------------| `--------------' - * | | | | | | | | | | | | | | - * |-----------------------------------------------------------| ,----. - * | | F1| F2| F3| F4| F5|F6 |F7 |F8 | | | | | | - * |-----------------------------------------------------------| ,-------------. - * | | | | | | | | | | | | | - * `-----------------------------------------------------------' `-------------' - */ -[_FL] = 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,KC_TRNS,KC_SLEP, \ - RESET, 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_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_MSTP,KC_MPLY,KC_MPRV,KC_MNXT,KC_MSEL, 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_CALC,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_CAPS, KC_TRNS, \ - KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS) -}; - -enum function_id { - SHIFT_ESC, -}; - -const uint16_t PROGMEM fn_actions[] = { - -}; - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { -} From 458607ee5eafe1cc095b258cac014c334d8e7b72 Mon Sep 17 00:00:00 2001 From: Ian Sterling Date: Fri, 12 Aug 2016 22:26:30 -0700 Subject: [PATCH 14/20] Corrections to the Atreus Makefile and updates to my keymap --- keyboards/atreus/keymaps/xyverz/keymap.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/keyboards/atreus/keymaps/xyverz/keymap.c b/keyboards/atreus/keymaps/xyverz/keymap.c index 0238fdbd3..02a661c8e 100644 --- a/keyboards/atreus/keymaps/xyverz/keymap.c +++ b/keyboards/atreus/keymaps/xyverz/keymap.c @@ -46,14 +46,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_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_CAPS, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, KC_LCTL, KC_PGDN, KC_MPRV, KC_MPLY, KC_MNXT, 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 } }, [_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_TRNS, KC_TRNS, DVORAK, QWERTY, COLEMAK, KC_LCTL, KC_TRNS, KC_F9, KC_F10, KC_F11, KC_F12 }, +<<<<<<< HEAD {KC_TRNS, KC_TRNS, KC_LGUI, KC_TRNS, KC_BSPC, KC_LALT, KC_SPC, KC_TRNS, LSFT(KC_LBRC), LSFT(KC_RBRC), RESET } +======= + {KC_TRNS, KC_TRNS, KC_LGUI, KC_TRNS, KC_BSPC, KC_LALT, KC_SPC, KC_TRNS, LSFT(KC_LBRC), LSFT(KC_RBRC), RESET} +>>>>>>> e1abe4c... Corrections to the Atreus Makefile and updates to my keymap } }; From 3bae791372e2090b30647d431c70c233caaef26f Mon Sep 17 00:00:00 2001 From: Xyverz Date: Fri, 12 Aug 2016 22:30:01 -0700 Subject: [PATCH 15/20] Update keymap.c --- keyboards/atreus/keymaps/xyverz/keymap.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/keyboards/atreus/keymaps/xyverz/keymap.c b/keyboards/atreus/keymaps/xyverz/keymap.c index 02a661c8e..b418cc9b5 100644 --- a/keyboards/atreus/keymaps/xyverz/keymap.c +++ b/keyboards/atreus/keymaps/xyverz/keymap.c @@ -53,11 +53,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {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_TRNS, KC_TRNS, DVORAK, QWERTY, COLEMAK, KC_LCTL, KC_TRNS, KC_F9, KC_F10, KC_F11, KC_F12 }, -<<<<<<< HEAD - {KC_TRNS, KC_TRNS, KC_LGUI, KC_TRNS, KC_BSPC, KC_LALT, KC_SPC, KC_TRNS, LSFT(KC_LBRC), LSFT(KC_RBRC), RESET } -======= {KC_TRNS, KC_TRNS, KC_LGUI, KC_TRNS, KC_BSPC, KC_LALT, KC_SPC, KC_TRNS, LSFT(KC_LBRC), LSFT(KC_RBRC), RESET} ->>>>>>> e1abe4c... Corrections to the Atreus Makefile and updates to my keymap } }; From c07fe96581f02d0ea14c50cda7565aa52406c122 Mon Sep 17 00:00:00 2001 From: Ian Sterling Date: Fri, 12 Aug 2016 23:45:40 -0700 Subject: [PATCH 16/20] Adding the MiniVan44 aka TheVan 44 by u/evangs to the repo. Initial Commit. --- keyboards/minivan44/Makefile | 75 ++++++++ keyboards/minivan44/config.h | 162 ++++++++++++++++++ keyboards/minivan44/keymaps/default/Makefile | 21 +++ keyboards/minivan44/keymaps/default/config.h | 8 + keyboards/minivan44/keymaps/default/keymap.c | 97 +++++++++++ keyboards/minivan44/keymaps/default/readme.md | 1 + keyboards/minivan44/keymaps/xyverz/Makefile | 21 +++ keyboards/minivan44/keymaps/xyverz/config.h | 8 + keyboards/minivan44/keymaps/xyverz/keymap.c | 92 ++++++++++ keyboards/minivan44/keymaps/xyverz/readme.md | 1 + keyboards/minivan44/minivan44.c | 28 +++ keyboards/minivan44/minivan44.h | 22 +++ keyboards/minivan44/readme.md | 28 +++ 13 files changed, 564 insertions(+) create mode 100644 keyboards/minivan44/Makefile create mode 100644 keyboards/minivan44/config.h create mode 100644 keyboards/minivan44/keymaps/default/Makefile create mode 100644 keyboards/minivan44/keymaps/default/config.h create mode 100644 keyboards/minivan44/keymaps/default/keymap.c create mode 100644 keyboards/minivan44/keymaps/default/readme.md create mode 100644 keyboards/minivan44/keymaps/xyverz/Makefile create mode 100644 keyboards/minivan44/keymaps/xyverz/config.h create mode 100644 keyboards/minivan44/keymaps/xyverz/keymap.c create mode 100644 keyboards/minivan44/keymaps/xyverz/readme.md create mode 100644 keyboards/minivan44/minivan44.c create mode 100644 keyboards/minivan44/minivan44.h create mode 100644 keyboards/minivan44/readme.md diff --git a/keyboards/minivan44/Makefile b/keyboards/minivan44/Makefile new file mode 100644 index 000000000..45ca12780 --- /dev/null +++ b/keyboards/minivan44/Makefile @@ -0,0 +1,75 @@ + + +# 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 ?= 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 ?= yes # 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 + +ifndef QUANTUM_DIR + include ../../Makefile +endif + + diff --git a/keyboards/minivan44/config.h b/keyboards/minivan44/config.h new file mode 100644 index 000000000..0ae93c095 --- /dev/null +++ b/keyboards/minivan44/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 0xFEAE +#define PRODUCT_ID 0x8844 +#define DEVICE_VER 0x0002 +#define MANUFACTURER Evan Sailer +#define PRODUCT TheVan 44 +#define DESCRIPTION keyboard firmware for TV44 + +/* key matrix size */ +#define MATRIX_ROWS 4 +#define MATRIX_COLS 12 + +/* + * 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 { D7, B5, F7, D4 } +#define MATRIX_COL_PINS { D2, D3, D5, D6, B4, B6, F6, F5, F4, F1, F0, B3 } +#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/minivan44/keymaps/default/Makefile b/keyboards/minivan44/keymaps/default/Makefile new file mode 100644 index 000000000..f4671a9d1 --- /dev/null +++ b/keyboards/minivan44/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/minivan44/keymaps/default/config.h b/keyboards/minivan44/keymaps/default/config.h new file mode 100644 index 000000000..df06a2620 --- /dev/null +++ b/keyboards/minivan44/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/minivan44/keymaps/default/keymap.c b/keyboards/minivan44/keymaps/default/keymap.c new file mode 100644 index 000000000..d559a4b1c --- /dev/null +++ b/keyboards/minivan44/keymaps/default/keymap.c @@ -0,0 +1,97 @@ +#include "minivan44.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 _QW 0 +#define _DV 1 +#define _CM 2 +#define _L1 3 +#define _L2 4 +#define _L3 5 + +// 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] = { /* 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, MO(_L1) }, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_F, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MO(_L2) }, + {KC_LCTL, MO(_L2), KC_LGUI, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, KC_RALT, KC_ESC, XXXXXXX, TG(_L3) } + }, + [_DV] = { /* Dvorak */ + {KC_TAB, KC_COMM, KC_DOT, KC_SLSH, KC_Q, KC_Q, KC_Q, KC_Q, KC_Q, KC_Q, KC_Q, KC_BSPC }, + {MO(_L1), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, MO(_L1) }, + {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, MO(_L2) }, + {KC_LCTL, MO(_L2), KC_LGUI, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, KC_RALT, KC_ESC, XXXXXXX, TG(_L3) } + }, + [_CM] = { /* 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, MO(_L1) }, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, MO(_L2) }, + {KC_LCTL, MO(_L2), KC_LGUI, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, KC_RALT, KC_ESC, XXXXXXX, TG(_L3) } + }, + [_L1] = { /* LAYER 1 */ + {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_ESC, _______, KC_PSCR, _______, _______, _______, KC_MSTP, KC_MPLY, KC_MPRV, KC_MNXT, KC_RSFT }, + {_______, KC_LGUI, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, XXXXXXX, _______ } + }, + [_L2] = { /* LAYER 2 */ + {_______, QWERTY, DVORAK, COLEMAK, _______, _______, _______, KC_7, KC_8, KC_9, KC_0, _______ }, + {KC_ESC, KC_PIPE, KC_DQUO, KC_UNDS, KC_PLUS, LSFT(KC_LBRC), LSFT(KC_RBRC), KC_4, KC_5, KC_6, KC_VOLU, KC_ENT }, + {_______, _______, _______, _______, _______, _______, KC_0, KC_1, KC_2, KC_3, KC_VOLD, _______ }, + {_______, _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, XXXXXXX, _______ } + }, + [_L3] = { /* LAYER 3 */ + {_______, _______, _______, _______, _______, _______, _______, KC_F1, KC_F2, KC_F3, KC_F4, _______ }, + {KC_ESC, _______, _______, _______, _______, _______, _______, KC_F5, KC_F6, KC_F7, KC_F8, _______ }, + {KC_LSFT, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_F9, KC_F10, KC_F11, KC_F12, _______ }, + {_______, KC_LSFT, KC_B, KC_SPC, XXXXXXX, XXXXXXX, XXXXXXX, KC_C, _______, _______, XXXXXXX, _______ } + } +}; + +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/minivan44/keymaps/default/readme.md b/keyboards/minivan44/keymaps/default/readme.md new file mode 100644 index 000000000..189a9c0ff --- /dev/null +++ b/keyboards/minivan44/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for minivan44 \ No newline at end of file diff --git a/keyboards/minivan44/keymaps/xyverz/Makefile b/keyboards/minivan44/keymaps/xyverz/Makefile new file mode 100644 index 000000000..f4671a9d1 --- /dev/null +++ b/keyboards/minivan44/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 = 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/minivan44/keymaps/xyverz/config.h b/keyboards/minivan44/keymaps/xyverz/config.h new file mode 100644 index 000000000..df06a2620 --- /dev/null +++ b/keyboards/minivan44/keymaps/xyverz/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/minivan44/keymaps/xyverz/keymap.c b/keyboards/minivan44/keymaps/xyverz/keymap.c new file mode 100644 index 000000000..f995da0e7 --- /dev/null +++ b/keyboards/minivan44/keymaps/xyverz/keymap.c @@ -0,0 +1,92 @@ +#include "minivan44.h" +#include "action_layer.h" +#include "eeconfig.h" + +extern keymap_config_t keymap_config; + +#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) + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + + +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_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) } + }, + + [_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 }, + {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) } + }, + + [_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 }, + {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) } + }, + + [_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_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_LGUI, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, KC_SLSH, _______, _______ } + }, + + [_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, _______, _______, _______, _______, _______ } + } + +}; + +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/minivan44/keymaps/xyverz/readme.md b/keyboards/minivan44/keymaps/xyverz/readme.md new file mode 100644 index 000000000..189a9c0ff --- /dev/null +++ b/keyboards/minivan44/keymaps/xyverz/readme.md @@ -0,0 +1 @@ +# The default keymap for minivan44 \ No newline at end of file diff --git a/keyboards/minivan44/minivan44.c b/keyboards/minivan44/minivan44.c new file mode 100644 index 000000000..be8214fd5 --- /dev/null +++ b/keyboards/minivan44/minivan44.c @@ -0,0 +1,28 @@ +#include "minivan44.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/minivan44/minivan44.h b/keyboards/minivan44/minivan44.h new file mode 100644 index 000000000..c6119c2e1 --- /dev/null +++ b/keyboards/minivan44/minivan44.h @@ -0,0 +1,22 @@ +#ifndef MINIVAN44_H +#define MINIVAN44_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, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \ + K30, K31, K32, K33, K37, K38, K39, K3B \ +) \ +{ \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B }, \ + { K30, K31, K32, K33, KC_NO, KC_NO, KC_NO, K37, K38, K39, K3A, K3B } \ + +#endif diff --git a/keyboards/minivan44/readme.md b/keyboards/minivan44/readme.md new file mode 100644 index 000000000..59b62b0e6 --- /dev/null +++ b/keyboards/minivan44/readme.md @@ -0,0 +1,28 @@ +minivan44 keyboard firmware +====================== + +## Quantum MK Firmware + +For the full Quantum feature list, see [the parent readme.md](/doc/readme.md). + +## Building + +Download or clone the whole firmware and navigate to the keyboards/minivan44 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`. + +### 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 `keymap` option like: + +``` +$ make keymap=[default|jack|] +``` + +Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/` \ No newline at end of file From 2d0f585e426084b13fecc642cdda77506e2bfbf9 Mon Sep 17 00:00:00 2001 From: Ian Sterling Date: Sat, 13 Aug 2016 10:36:08 -0700 Subject: [PATCH 17/20] Renamed minivan44 to tv44 in all occurrences per wishes of Jack and Evan. --- keyboards/tv44/Makefile | 75 +++++++++++ keyboards/tv44/config.h | 162 +++++++++++++++++++++++ keyboards/tv44/keymaps/default/Makefile | 21 +++ keyboards/tv44/keymaps/default/config.h | 8 ++ keyboards/tv44/keymaps/default/keymap.c | 97 ++++++++++++++ keyboards/tv44/keymaps/default/readme.md | 1 + keyboards/tv44/keymaps/xyverz/Makefile | 21 +++ keyboards/tv44/keymaps/xyverz/config.h | 8 ++ keyboards/tv44/keymaps/xyverz/keymap.c | 92 +++++++++++++ keyboards/tv44/keymaps/xyverz/readme.md | 1 + keyboards/tv44/readme.md | 28 ++++ keyboards/tv44/tv44.c | 28 ++++ keyboards/tv44/tv44.h | 22 +++ 13 files changed, 564 insertions(+) create mode 100644 keyboards/tv44/Makefile create mode 100644 keyboards/tv44/config.h create mode 100644 keyboards/tv44/keymaps/default/Makefile create mode 100644 keyboards/tv44/keymaps/default/config.h create mode 100644 keyboards/tv44/keymaps/default/keymap.c create mode 100644 keyboards/tv44/keymaps/default/readme.md create mode 100644 keyboards/tv44/keymaps/xyverz/Makefile create mode 100644 keyboards/tv44/keymaps/xyverz/config.h create mode 100644 keyboards/tv44/keymaps/xyverz/keymap.c create mode 100644 keyboards/tv44/keymaps/xyverz/readme.md create mode 100644 keyboards/tv44/readme.md create mode 100644 keyboards/tv44/tv44.c create mode 100644 keyboards/tv44/tv44.h diff --git a/keyboards/tv44/Makefile b/keyboards/tv44/Makefile new file mode 100644 index 000000000..45ca12780 --- /dev/null +++ b/keyboards/tv44/Makefile @@ -0,0 +1,75 @@ + + +# 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 ?= 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 ?= yes # 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 + +ifndef QUANTUM_DIR + include ../../Makefile +endif + + diff --git a/keyboards/tv44/config.h b/keyboards/tv44/config.h new file mode 100644 index 000000000..0ae93c095 --- /dev/null +++ b/keyboards/tv44/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 0xFEAE +#define PRODUCT_ID 0x8844 +#define DEVICE_VER 0x0002 +#define MANUFACTURER Evan Sailer +#define PRODUCT TheVan 44 +#define DESCRIPTION keyboard firmware for TV44 + +/* key matrix size */ +#define MATRIX_ROWS 4 +#define MATRIX_COLS 12 + +/* + * 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 { D7, B5, F7, D4 } +#define MATRIX_COL_PINS { D2, D3, D5, D6, B4, B6, F6, F5, F4, F1, F0, B3 } +#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/tv44/keymaps/default/Makefile b/keyboards/tv44/keymaps/default/Makefile new file mode 100644 index 000000000..f4671a9d1 --- /dev/null +++ b/keyboards/tv44/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/tv44/keymaps/default/config.h b/keyboards/tv44/keymaps/default/config.h new file mode 100644 index 000000000..df06a2620 --- /dev/null +++ b/keyboards/tv44/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/tv44/keymaps/default/keymap.c b/keyboards/tv44/keymaps/default/keymap.c new file mode 100644 index 000000000..6a4fef3da --- /dev/null +++ b/keyboards/tv44/keymaps/default/keymap.c @@ -0,0 +1,97 @@ +#include "tv44.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 _QW 0 +#define _DV 1 +#define _CM 2 +#define _L1 3 +#define _L2 4 +#define _L3 5 + +// 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] = { /* 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, MO(_L1) }, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_F, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MO(_L2) }, + {KC_LCTL, MO(_L2), KC_LGUI, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, KC_RALT, KC_ESC, XXXXXXX, TG(_L3) } + }, + [_DV] = { /* Dvorak */ + {KC_TAB, KC_COMM, KC_DOT, KC_SLSH, KC_Q, KC_Q, KC_Q, KC_Q, KC_Q, KC_Q, KC_Q, KC_BSPC }, + {MO(_L1), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, MO(_L1) }, + {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, MO(_L2) }, + {KC_LCTL, MO(_L2), KC_LGUI, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, KC_RALT, KC_ESC, XXXXXXX, TG(_L3) } + }, + [_CM] = { /* 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, MO(_L1) }, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, MO(_L2) }, + {KC_LCTL, MO(_L2), KC_LGUI, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, KC_RALT, KC_ESC, XXXXXXX, TG(_L3) } + }, + [_L1] = { /* LAYER 1 */ + {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_ESC, _______, KC_PSCR, _______, _______, _______, KC_MSTP, KC_MPLY, KC_MPRV, KC_MNXT, KC_RSFT }, + {_______, KC_LGUI, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, XXXXXXX, _______ } + }, + [_L2] = { /* LAYER 2 */ + {_______, QWERTY, DVORAK, COLEMAK, _______, _______, _______, KC_7, KC_8, KC_9, KC_0, _______ }, + {KC_ESC, KC_PIPE, KC_DQUO, KC_UNDS, KC_PLUS, LSFT(KC_LBRC), LSFT(KC_RBRC), KC_4, KC_5, KC_6, KC_VOLU, KC_ENT }, + {_______, _______, _______, _______, _______, _______, KC_0, KC_1, KC_2, KC_3, KC_VOLD, _______ }, + {_______, _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, XXXXXXX, _______ } + }, + [_L3] = { /* LAYER 3 */ + {_______, _______, _______, _______, _______, _______, _______, KC_F1, KC_F2, KC_F3, KC_F4, _______ }, + {KC_ESC, _______, _______, _______, _______, _______, _______, KC_F5, KC_F6, KC_F7, KC_F8, _______ }, + {KC_LSFT, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_F9, KC_F10, KC_F11, KC_F12, _______ }, + {_______, KC_LSFT, KC_B, KC_SPC, XXXXXXX, XXXXXXX, XXXXXXX, KC_C, _______, _______, XXXXXXX, _______ } + } +}; + +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/tv44/keymaps/default/readme.md b/keyboards/tv44/keymaps/default/readme.md new file mode 100644 index 000000000..ac84c08cf --- /dev/null +++ b/keyboards/tv44/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for tv44 \ No newline at end of file diff --git a/keyboards/tv44/keymaps/xyverz/Makefile b/keyboards/tv44/keymaps/xyverz/Makefile new file mode 100644 index 000000000..f4671a9d1 --- /dev/null +++ b/keyboards/tv44/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 = 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/tv44/keymaps/xyverz/config.h b/keyboards/tv44/keymaps/xyverz/config.h new file mode 100644 index 000000000..df06a2620 --- /dev/null +++ b/keyboards/tv44/keymaps/xyverz/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/tv44/keymaps/xyverz/keymap.c b/keyboards/tv44/keymaps/xyverz/keymap.c new file mode 100644 index 000000000..8cbcf8d35 --- /dev/null +++ b/keyboards/tv44/keymaps/xyverz/keymap.c @@ -0,0 +1,92 @@ +#include "tv44.h" +#include "action_layer.h" +#include "eeconfig.h" + +extern keymap_config_t keymap_config; + +#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) + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + + +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_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) } + }, + + [_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 }, + {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) } + }, + + [_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 }, + {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) } + }, + + [_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_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, _______, _______ } + }, + + [_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, _______, _______, _______, _______, _______ } + } + +}; + +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/tv44/keymaps/xyverz/readme.md b/keyboards/tv44/keymaps/xyverz/readme.md new file mode 100644 index 000000000..ac84c08cf --- /dev/null +++ b/keyboards/tv44/keymaps/xyverz/readme.md @@ -0,0 +1 @@ +# The default keymap for tv44 \ No newline at end of file diff --git a/keyboards/tv44/readme.md b/keyboards/tv44/readme.md new file mode 100644 index 000000000..e3b557fe2 --- /dev/null +++ b/keyboards/tv44/readme.md @@ -0,0 +1,28 @@ +tv44 keyboard firmware +====================== + +## Quantum MK Firmware + +For the full Quantum feature list, see [the parent readme.md](/doc/readme.md). + +## Building + +Download or clone the whole firmware and navigate to the keyboards/tv44 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`. + +### 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 `keymap` option like: + +``` +$ make keymap=[default|jack|] +``` + +Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/` \ No newline at end of file diff --git a/keyboards/tv44/tv44.c b/keyboards/tv44/tv44.c new file mode 100644 index 000000000..6dc0efd28 --- /dev/null +++ b/keyboards/tv44/tv44.c @@ -0,0 +1,28 @@ +#include "tv44.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/tv44/tv44.h b/keyboards/tv44/tv44.h new file mode 100644 index 000000000..4c30174ac --- /dev/null +++ b/keyboards/tv44/tv44.h @@ -0,0 +1,22 @@ +#ifndef TV44_H +#define TV44_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, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \ + K30, K31, K32, K33, K37, K38, K39, K3B \ +) \ +{ \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B }, \ + { K30, K31, K32, K33, KC_NO, KC_NO, KC_NO, K37, K38, K39, K3A, K3B } \ + +#endif From e87506767cec6410d1a93c15d68452815c9c3553 Mon Sep 17 00:00:00 2001 From: Ian Sterling Date: Sat, 13 Aug 2016 10:44:42 -0700 Subject: [PATCH 18/20] Removal of old minivan44 folder. --- keyboards/minivan44/Makefile | 75 -------- keyboards/minivan44/config.h | 162 ------------------ keyboards/minivan44/keymaps/default/Makefile | 21 --- keyboards/minivan44/keymaps/default/config.h | 8 - keyboards/minivan44/keymaps/default/keymap.c | 97 ----------- keyboards/minivan44/keymaps/default/readme.md | 1 - keyboards/minivan44/keymaps/xyverz/Makefile | 21 --- keyboards/minivan44/keymaps/xyverz/config.h | 8 - keyboards/minivan44/keymaps/xyverz/keymap.c | 92 ---------- keyboards/minivan44/keymaps/xyverz/readme.md | 1 - keyboards/minivan44/minivan44.c | 28 --- keyboards/minivan44/minivan44.h | 22 --- keyboards/minivan44/readme.md | 28 --- 13 files changed, 564 deletions(-) delete mode 100644 keyboards/minivan44/Makefile delete mode 100644 keyboards/minivan44/config.h delete mode 100644 keyboards/minivan44/keymaps/default/Makefile delete mode 100644 keyboards/minivan44/keymaps/default/config.h delete mode 100644 keyboards/minivan44/keymaps/default/keymap.c delete mode 100644 keyboards/minivan44/keymaps/default/readme.md delete mode 100644 keyboards/minivan44/keymaps/xyverz/Makefile delete mode 100644 keyboards/minivan44/keymaps/xyverz/config.h delete mode 100644 keyboards/minivan44/keymaps/xyverz/keymap.c delete mode 100644 keyboards/minivan44/keymaps/xyverz/readme.md delete mode 100644 keyboards/minivan44/minivan44.c delete mode 100644 keyboards/minivan44/minivan44.h delete mode 100644 keyboards/minivan44/readme.md diff --git a/keyboards/minivan44/Makefile b/keyboards/minivan44/Makefile deleted file mode 100644 index 45ca12780..000000000 --- a/keyboards/minivan44/Makefile +++ /dev/null @@ -1,75 +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=4096 - - -# 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 ?= yes # 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 - -ifndef QUANTUM_DIR - include ../../Makefile -endif - - diff --git a/keyboards/minivan44/config.h b/keyboards/minivan44/config.h deleted file mode 100644 index 0ae93c095..000000000 --- a/keyboards/minivan44/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 0xFEAE -#define PRODUCT_ID 0x8844 -#define DEVICE_VER 0x0002 -#define MANUFACTURER Evan Sailer -#define PRODUCT TheVan 44 -#define DESCRIPTION keyboard firmware for TV44 - -/* key matrix size */ -#define MATRIX_ROWS 4 -#define MATRIX_COLS 12 - -/* - * 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 { D7, B5, F7, D4 } -#define MATRIX_COL_PINS { D2, D3, D5, D6, B4, B6, F6, F5, F4, F1, F0, B3 } -#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/minivan44/keymaps/default/Makefile b/keyboards/minivan44/keymaps/default/Makefile deleted file mode 100644 index f4671a9d1..000000000 --- a/keyboards/minivan44/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/minivan44/keymaps/default/config.h b/keyboards/minivan44/keymaps/default/config.h deleted file mode 100644 index df06a2620..000000000 --- a/keyboards/minivan44/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/minivan44/keymaps/default/keymap.c b/keyboards/minivan44/keymaps/default/keymap.c deleted file mode 100644 index d559a4b1c..000000000 --- a/keyboards/minivan44/keymaps/default/keymap.c +++ /dev/null @@ -1,97 +0,0 @@ -#include "minivan44.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 _QW 0 -#define _DV 1 -#define _CM 2 -#define _L1 3 -#define _L2 4 -#define _L3 5 - -// 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] = { /* 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, MO(_L1) }, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_F, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MO(_L2) }, - {KC_LCTL, MO(_L2), KC_LGUI, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, KC_RALT, KC_ESC, XXXXXXX, TG(_L3) } - }, - [_DV] = { /* Dvorak */ - {KC_TAB, KC_COMM, KC_DOT, KC_SLSH, KC_Q, KC_Q, KC_Q, KC_Q, KC_Q, KC_Q, KC_Q, KC_BSPC }, - {MO(_L1), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, MO(_L1) }, - {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, MO(_L2) }, - {KC_LCTL, MO(_L2), KC_LGUI, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, KC_RALT, KC_ESC, XXXXXXX, TG(_L3) } - }, - [_CM] = { /* 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, MO(_L1) }, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, MO(_L2) }, - {KC_LCTL, MO(_L2), KC_LGUI, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, KC_RALT, KC_ESC, XXXXXXX, TG(_L3) } - }, - [_L1] = { /* LAYER 1 */ - {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_ESC, _______, KC_PSCR, _______, _______, _______, KC_MSTP, KC_MPLY, KC_MPRV, KC_MNXT, KC_RSFT }, - {_______, KC_LGUI, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, XXXXXXX, _______ } - }, - [_L2] = { /* LAYER 2 */ - {_______, QWERTY, DVORAK, COLEMAK, _______, _______, _______, KC_7, KC_8, KC_9, KC_0, _______ }, - {KC_ESC, KC_PIPE, KC_DQUO, KC_UNDS, KC_PLUS, LSFT(KC_LBRC), LSFT(KC_RBRC), KC_4, KC_5, KC_6, KC_VOLU, KC_ENT }, - {_______, _______, _______, _______, _______, _______, KC_0, KC_1, KC_2, KC_3, KC_VOLD, _______ }, - {_______, _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, XXXXXXX, _______ } - }, - [_L3] = { /* LAYER 3 */ - {_______, _______, _______, _______, _______, _______, _______, KC_F1, KC_F2, KC_F3, KC_F4, _______ }, - {KC_ESC, _______, _______, _______, _______, _______, _______, KC_F5, KC_F6, KC_F7, KC_F8, _______ }, - {KC_LSFT, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_F9, KC_F10, KC_F11, KC_F12, _______ }, - {_______, KC_LSFT, KC_B, KC_SPC, XXXXXXX, XXXXXXX, XXXXXXX, KC_C, _______, _______, XXXXXXX, _______ } - } -}; - -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/minivan44/keymaps/default/readme.md b/keyboards/minivan44/keymaps/default/readme.md deleted file mode 100644 index 189a9c0ff..000000000 --- a/keyboards/minivan44/keymaps/default/readme.md +++ /dev/null @@ -1 +0,0 @@ -# The default keymap for minivan44 \ No newline at end of file diff --git a/keyboards/minivan44/keymaps/xyverz/Makefile b/keyboards/minivan44/keymaps/xyverz/Makefile deleted file mode 100644 index f4671a9d1..000000000 --- a/keyboards/minivan44/keymaps/xyverz/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/minivan44/keymaps/xyverz/config.h b/keyboards/minivan44/keymaps/xyverz/config.h deleted file mode 100644 index df06a2620..000000000 --- a/keyboards/minivan44/keymaps/xyverz/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/minivan44/keymaps/xyverz/keymap.c b/keyboards/minivan44/keymaps/xyverz/keymap.c deleted file mode 100644 index f995da0e7..000000000 --- a/keyboards/minivan44/keymaps/xyverz/keymap.c +++ /dev/null @@ -1,92 +0,0 @@ -#include "minivan44.h" -#include "action_layer.h" -#include "eeconfig.h" - -extern keymap_config_t keymap_config; - -#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) - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - - -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_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) } - }, - - [_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 }, - {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) } - }, - - [_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 }, - {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) } - }, - - [_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_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_LGUI, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, KC_SLSH, _______, _______ } - }, - - [_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, _______, _______, _______, _______, _______ } - } - -}; - -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/minivan44/keymaps/xyverz/readme.md b/keyboards/minivan44/keymaps/xyverz/readme.md deleted file mode 100644 index 189a9c0ff..000000000 --- a/keyboards/minivan44/keymaps/xyverz/readme.md +++ /dev/null @@ -1 +0,0 @@ -# The default keymap for minivan44 \ No newline at end of file diff --git a/keyboards/minivan44/minivan44.c b/keyboards/minivan44/minivan44.c deleted file mode 100644 index be8214fd5..000000000 --- a/keyboards/minivan44/minivan44.c +++ /dev/null @@ -1,28 +0,0 @@ -#include "minivan44.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/minivan44/minivan44.h b/keyboards/minivan44/minivan44.h deleted file mode 100644 index c6119c2e1..000000000 --- a/keyboards/minivan44/minivan44.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef MINIVAN44_H -#define MINIVAN44_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, \ - K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \ - K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \ - K30, K31, K32, K33, K37, K38, K39, K3B \ -) \ -{ \ - { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B }, \ - { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B }, \ - { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B }, \ - { K30, K31, K32, K33, KC_NO, KC_NO, KC_NO, K37, K38, K39, K3A, K3B } \ - -#endif diff --git a/keyboards/minivan44/readme.md b/keyboards/minivan44/readme.md deleted file mode 100644 index 59b62b0e6..000000000 --- a/keyboards/minivan44/readme.md +++ /dev/null @@ -1,28 +0,0 @@ -minivan44 keyboard firmware -====================== - -## Quantum MK Firmware - -For the full Quantum feature list, see [the parent readme.md](/doc/readme.md). - -## Building - -Download or clone the whole firmware and navigate to the keyboards/minivan44 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`. - -### 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 `keymap` option like: - -``` -$ make keymap=[default|jack|] -``` - -Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/` \ No newline at end of file From 97fca1efff37f749fae8d53bb5ee4da9f8a898c5 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Sat, 13 Aug 2016 20:14:27 -0700 Subject: [PATCH 19/20] Fixing a mixup. Tidying up the keymap. --- keyboards/atreus/keymaps/xyverz/keymap.c | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/keyboards/atreus/keymaps/xyverz/keymap.c b/keyboards/atreus/keymaps/xyverz/keymap.c index 1ce92b4f2..b418cc9b5 100644 --- a/keyboards/atreus/keymaps/xyverz/keymap.c +++ b/keyboards/atreus/keymaps/xyverz/keymap.c @@ -46,24 +46,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_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 }, -<<<<<<< HEAD {KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, KC_LCTL, KC_PGDN, KC_MPRV, KC_MPLY, KC_MNXT, KC_BSLS}, -======= - {KC_CAPS, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, KC_LCTL, KC_PGDN, KC_MPRV, KC_MPLY, KC_MNXT, KC_BSLS}, ->>>>>>> upstream/master {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}, -<<<<<<< HEAD {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_NO, KC_TRNS, KC_F6, KC_F7, KC_F8, KC_PLUS}, {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} -======= - {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_NO, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10 }, - {KC_TRNS, KC_TRNS, DVORAK, QWERTY, COLEMAK, KC_LCTL, KC_TRNS, KC_TRNS, KC_TRNS, KC_F11, KC_F12 }, - {KC_TRNS, KC_TRNS, KC_LGUI, KC_TRNS, KC_BSPC, KC_LALT, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS, RESET } ->>>>>>> upstream/master } }; From 049343e523857eef6fe03bfd5ec73d830639e0b6 Mon Sep 17 00:00:00 2001 From: Xyverz Date: Sun, 14 Aug 2016 00:33:11 -0700 Subject: [PATCH 20/20] Added my own layout to the Phantom. --- keyboards/phantom/keymaps/xyverz/keymap.c | 104 ++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 keyboards/phantom/keymaps/xyverz/keymap.c diff --git a/keyboards/phantom/keymaps/xyverz/keymap.c b/keyboards/phantom/keymaps/xyverz/keymap.c new file mode 100644 index 000000000..aa6af18b1 --- /dev/null +++ b/keyboards/phantom/keymaps/xyverz/keymap.c @@ -0,0 +1,104 @@ +#include "phantom.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_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_PSCR, KC_SLCK, KC_PAUS}, + {KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, XXXXXXX, KC_BSPC, KC_INS, KC_HOME, 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_DEL, KC_END, 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, XXXXXXX, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX}, + {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, XXXXXXX, KC_UP, XXXXXXX}, + {KC_LCTL, KC_LGUI, KC_LALT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, XXXXXXX, XXXXXXX, KC_RALT, KC_RGUI, MO(_FL), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT} + }, + +[_DV] = { /* Layer 1: Dvorak */ + {KC_ESC, 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_PSCR, KC_SLCK, KC_PAUS}, + {KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, XXXXXXX, KC_BSPC, KC_INS, KC_HOME, 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_DEL, KC_END, KC_PGDN}, + {KC_CAPS, 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, XXXXXXX, XXXXXXX, XXXXXXX}, + {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, XXXXXXX, KC_UP, XXXXXXX}, + {KC_LCTL, KC_LGUI, KC_LALT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, XXXXXXX, XXXXXXX, KC_RALT, KC_RGUI, MO(_FL), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT} + }, + +[_CM] = { /* Layer 2: Colemak */ + {KC_ESC, 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_PSCR, KC_SLCK, KC_PAUS}, + {KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, XXXXXXX, KC_BSPC, KC_INS, KC_HOME, KC_PGUP}, + {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, KC_DEL, KC_END, KC_PGDN}, + {KC_BSPC, 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, XXXXXXX, XXXXXXX, XXXXXXX}, + {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, XXXXXXX, KC_UP, XXXXXXX}, + {KC_LCTL, KC_LGUI, KC_LALT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, XXXXXXX, XXXXXXX, KC_RALT, KC_RGUI, MO(_FL), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT} + }, + +[_FL] = { /* Layer 3: Functions */ + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, XXXXXXX, RESET, KC_MPRV, KC_MPLY, KC_MNXT}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX}, + {_______, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, XXXXXXX, _______, XXXXXXX, _______, XXXXXXX}, + {QWERTY, DVORAK, COLEMAK, _______, 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; +};