MAGIC functionality, AG swap in default layout
10 files changed, 226 insertions(+), 161 deletions(-) M keyboard/planck/keymaps/default/README.md M keyboard/preonic/Makefile M keyboard/preonic/keymaps/default/keymap.c M quantum/keymap_common.c M quantum/keymap_common.h M tmk_core/common.mk M tmk_core/common/keyboard.c M tmk_core/common/keymap.h A tmk_core/common/magic.c A tmk_core/common/magic.h
M keyboard/planck/keymaps/default/README.md => keyboard/planck/keymaps/default/README.md +0 -32
@@ 1,34 1,2 @@ # The Default Planck Layout 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}, {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(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} }, [_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}, {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(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} }, [_DV] = { /* 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}, {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH}, {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT }, {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} }, [_RS] = { /* 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_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS}, {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} }, [_LW] = { /* LOWER */ {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS}, {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} } }; \ No newline at end of file
M keyboard/preonic/Makefile => keyboard/preonic/Makefile +1 -1
@@ 130,7 130,7 @@ OPT_DEFS += -DBOOTLOADER_SIZE=4096 # change to "no" to disable the options, or define them in the makefile.mk in # the appropriate keymap folder that will get included automatically # BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = yes # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = yes # Console for debug(+400)
M keyboard/preonic/keymaps/default/keymap.c => keyboard/preonic/keymaps/default/keymap.c +10 -9
@@ 153,9 153,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------+------+------+------+------+------+------| * | | Reset| | | | | | | | | | Del | * |------+------+------+------+------+-------------+------+------+------+------+------| * | | | |Audoff|Aud on| | |Qwerty|Colemk|Dvorak| | | * | | | |Audoff|Aud on|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | * |------+------+------+------+------+------|------+------+------+------+------+------| * | | | | | | | | | | | | | * | | | |Musoff|Mus on| | | | | | | | * |------+------+------+------+------+------+------+------+------+------+------+------| * | | | | | | | | | | | | @@ * `-----------------------------------------------------------------------------------' 163,7 163,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_ADJUST] = { {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12}, {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, {_______, _______, _______, AUD_ON, AUD_OFF, _______, _______, QWERTY, COLEMAK, DVORAK, _______, _______}, {_______, _______, _______, AUD_ON, AUD_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______}, {_______, _______, _______, MUS_ON, MUS_OFF, _______, _______, _______, _______, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} @@ }, 231,6 231,10 @@ float tone_music[][2] = { }; #endif void persistant_default_layer_set(uint16_t default_layer) { eeconfig_write_default_layer(default_layer); default_layer_set(default_layer); } const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) @@ { 240,8 244,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) #ifdef AUDIO_ENABLE play_notes(&tone_qwerty, 4, false); #endif eeconfig_write_default_layer(1UL<<_QWERTY); default_layer_set(1UL<<_QWERTY); persistant_default_layer_set(1UL<<_QWERTY); } break; @@ case _COLEMAK: 249,8 252,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) #ifdef AUDIO_ENABLE play_notes(&tone_colemak, 6, false); #endif eeconfig_write_default_layer(1UL<<_COLEMAK); default_layer_set(1UL<<_COLEMAK); persistant_default_layer_set(1UL<<_COLEMAK); } break; @@ case _DVORAK: 258,8 260,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) #ifdef AUDIO_ENABLE play_notes(&tone_dvorak, 8, false); #endif eeconfig_write_default_layer(1UL<<_DVORAK); default_layer_set(1UL<<_DVORAK); persistant_default_layer_set(1UL<<_DVORAK); } break; case _LOWER:
M quantum/keymap_common.c => quantum/keymap_common.c +138 -112
@@ 27,6 27,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "keymap_midi.h" #include "bootloader.h" extern keymap_config_t keymap_config; #include <stdio.h> #include <inttypes.h> @@ #ifdef AUDIO_ENABLE 47,120 49,9 @@ action_t action_for_key(uint8_t layer, keypos_t key) // 16bit keycodes - important uint16_t keycode = keymap_key_to_keycode(layer, key); if (keycode >= 0x0100 && keycode < 0x2000) { // Has a modifier action_t action; // Split it up action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); // adds modifier to key return action; } else if (keycode >= 0x2000 && keycode < 0x3000) { // Is a shortcut for function layer, pull last 12bits // This means we have 4,096 FN macros at our disposal return keymap_func_to_action(keycode & 0xFFF); } else if (keycode >= 0x3000 && keycode < 0x4000) { // When the code starts with 3, it's an action macro. action_t action; action.code = ACTION_MACRO(keycode & 0xFF); return action; #ifdef BACKLIGHT_ENABLE } else if (keycode >= BL_0 && keycode <= BL_15) { action_t action; action.code = ACTION_BACKLIGHT_LEVEL(keycode & 0x000F); return action; } else if (keycode == BL_DEC) { action_t action; action.code = ACTION_BACKLIGHT_DECREASE(); return action; } else if (keycode == BL_INC) { action_t action; action.code = ACTION_BACKLIGHT_INCREASE(); return action; } else if (keycode == BL_TOGG) { action_t action; action.code = ACTION_BACKLIGHT_TOGGLE(); return action; } else if (keycode == BL_STEP) { action_t action; action.code = ACTION_BACKLIGHT_STEP(); return action; #endif } else if (keycode == RESET) { // RESET is 0x5000, which is why this is here action_t action; clear_keyboard(); #ifdef AUDIO_ENABLE play_notes(&goodbye, 3, false); #endif _delay_ms(250); #ifdef ATREUS_ASTAR *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific #endif bootloader_jump(); return action; } else if (keycode == DEBUG) { // DEBUG is 0x5001 // TODO: Does this actually work? action_t action; print("\nDEBUG: enabled.\n"); debug_enable = true; return action; } else if (keycode >= 0x5000 && keycode < 0x6000) { // Layer movement shortcuts // See .h to see constraints/usage int type = (keycode >> 0x8) & 0xF; if (type == 0x1) { // Layer set "GOTO" int when = (keycode >> 0x4) & 0x3; int layer = keycode & 0xF; action_t action; action.code = ACTION_LAYER_SET(layer, when); return action; } else if (type == 0x2) { // Momentary layer int layer = keycode & 0xFF; action_t action; action.code = ACTION_LAYER_MOMENTARY(layer); return action; } else if (type == 0x3) { // Set default layer int layer = keycode & 0xFF; action_t action; action.code = ACTION_DEFAULT_LAYER_SET(layer); return action; } else if (type == 0x4) { // Set default layer int layer = keycode & 0xFF; action_t action; action.code = ACTION_LAYER_TOGGLE(layer); return action; } #ifdef MIDI_ENABLE } else if (keycode >= 0x6000 && keycode < 0x7000) { action_t action; action.code = ACTION_FUNCTION_OPT(keycode & 0xFF, (keycode & 0x0F00) >> 8); return action; #endif } else if (keycode >= 0x7000 && keycode < 0x8000) { action_t action; action.code = ACTION_MODS_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF); return action; } else if (keycode >= 0x8000 && keycode < 0x9000) { action_t action; action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF); return action; #ifdef UNICODE_ENABLE } else if (keycode >= 0x8000000) { action_t action; uint16_t unicode = keycode & ~(0x8000); action.code = ACTION_FUNCTION_OPT(unicode & 0xFF, (unicode & 0xFF00) >> 8); return action; #endif } else { } switch (keycode) { case KC_FN0 ... KC_FN31: return keymap_fn_to_action(keycode); #ifdef BOOTMAGIC_ENABLE case KC_CAPSLOCK: case KC_LOCKING_CAPS: @@ if (keymap_config.swap_control_capslock || keymap_config.capslock_to_control) { 224,7 115,6 @@ action_t action_for_key(uint8_t layer, keypos_t key) return keycode_to_action(KC_BSLASH); } return keycode_to_action(KC_BSPACE); #endif default: return keycode_to_action(keycode); @@ } 265,6 155,142 @@ static action_t keycode_to_action(uint16_t keycode) case KC_TRNS: action.code = ACTION_TRANSPARENT; break; case 0x0100 ... 0x1FFF: ; // Has a modifier // Split it up action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); // adds modifier to key break; case 0x2000 ... 0x2FFF: // Is a shortcut for function layer, pull last 12bits // This means we have 4,096 FN macros at our disposal return keymap_func_to_action(keycode & 0xFFF); break; case 0x3000 ... 0x3FFF: ; // When the code starts with 3, it's an action macro. action.code = ACTION_MACRO(keycode & 0xFF); break; #ifdef BACKLIGHT_ENABLE case BL_0 ... BL_15: action.code = ACTION_BACKLIGHT_LEVEL(keycode & 0x000F); break; case BL_DEC: action.code = ACTION_BACKLIGHT_DECREASE(); break; case BL_INC: action.code = ACTION_BACKLIGHT_INCREASE(); break; case BL_TOGG: action.code = ACTION_BACKLIGHT_TOGGLE(); break; case BL_STEP: action.code = ACTION_BACKLIGHT_STEP(); break; #endif case RESET: ; // RESET is 0x5000, which is why this is here clear_keyboard(); #ifdef AUDIO_ENABLE play_notes(&goodbye, 3, false); #endif _delay_ms(250); #ifdef ATREUS_ASTAR *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific #endif bootloader_jump(); break; case DEBUG: ; // DEBUG is 0x5001 print("\nDEBUG: enabled.\n"); debug_enable = true; break; case 0x5002 ... 0x50FF: // MAGIC actions (BOOTMAGIC without the boot) if (!eeconfig_is_enabled()) { eeconfig_init(); } /* keymap config */ keymap_config.raw = eeconfig_read_keymap(); if (keycode == MAGIC_SWAP_CONTROL_CAPSLOCK) { keymap_config.swap_control_capslock = 1; } else if (keycode == MAGIC_CAPSLOCK_TO_CONTROL) { keymap_config.capslock_to_control = 1; } else if (keycode == MAGIC_SWAP_LALT_LGUI) { keymap_config.swap_lalt_lgui = 1; } else if (keycode == MAGIC_SWAP_RALT_RGUI) { keymap_config.swap_ralt_rgui = 1; } else if (keycode == MAGIC_NO_GUI) { keymap_config.no_gui = 1; } else if (keycode == MAGIC_SWAP_GRAVE_ESC) { keymap_config.swap_grave_esc = 1; } else if (keycode == MAGIC_SWAP_BACKSLASH_BACKSPACE) { keymap_config.swap_backslash_backspace = 1; } else if (keycode == MAGIC_HOST_NKRO) { keymap_config.nkro = 1; } else if (keycode == MAGIC_SWAP_ALT_GUI) { keymap_config.swap_lalt_lgui = 1; keymap_config.swap_ralt_rgui = 1; } /* UNs */ else if (keycode == MAGIC_UNSWAP_CONTROL_CAPSLOCK) { keymap_config.swap_control_capslock = 0; } else if (keycode == MAGIC_UNCAPSLOCK_TO_CONTROL) { keymap_config.capslock_to_control = 0; } else if (keycode == MAGIC_UNSWAP_LALT_LGUI) { keymap_config.swap_lalt_lgui = 0; } else if (keycode == MAGIC_UNSWAP_RALT_RGUI) { keymap_config.swap_ralt_rgui = 0; } else if (keycode == MAGIC_UNNO_GUI) { keymap_config.no_gui = 0; } else if (keycode == MAGIC_UNSWAP_GRAVE_ESC) { keymap_config.swap_grave_esc = 0; } else if (keycode == MAGIC_UNSWAP_BACKSLASH_BACKSPACE) { keymap_config.swap_backslash_backspace = 0; } else if (keycode == MAGIC_UNHOST_NKRO) { keymap_config.nkro = 0; } else if (keycode == MAGIC_UNSWAP_ALT_GUI) { keymap_config.swap_lalt_lgui = 0; keymap_config.swap_ralt_rgui = 0; } eeconfig_write_keymap(keymap_config.raw); break; case 0x5100 ... 0x5FFF: ; // Layer movement shortcuts // See .h to see constraints/usage int type = (keycode >> 0x8) & 0xF; if (type == 0x1) { // Layer set "GOTO" int when = (keycode >> 0x4) & 0x3; int layer = keycode & 0xF; action.code = ACTION_LAYER_SET(layer, when); } else if (type == 0x2) { // Momentary layer int layer = keycode & 0xFF; action.code = ACTION_LAYER_MOMENTARY(layer); } else if (type == 0x3) { // Set default layer int layer = keycode & 0xFF; action.code = ACTION_DEFAULT_LAYER_SET(layer); } else if (type == 0x4) { // Set default layer int layer = keycode & 0xFF; action.code = ACTION_LAYER_TOGGLE(layer); } break; #ifdef MIDI_ENABLE case 0x6000 ... 0x6FFF: action.code = ACTION_FUNCTION_OPT(keycode & 0xFF, (keycode & 0x0F00) >> 8); break; #endif case 0x7000 ... 0x7FFF: action.code = ACTION_MODS_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF); break; case 0x8000 ... 0x8FFF: action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF); break; #ifdef UNICODE_ENABLE case 0x8000000 ... 0x8FFFFFF: uint16_t unicode = keycode & ~(0x8000); action.code = ACTION_FUNCTION_OPT(unicode & 0xFF, (unicode & 0xFF00) >> 8); break; #endif default: action.code = ACTION_NO; break;
M quantum/keymap_common.h => quantum/keymap_common.h +25 -3
@@ 30,7 30,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. // #include "print.h" #include "debug.h" #ifdef BOOTMAGIC_ENABLE /* NOTE: Not portable. Bit field order depends on implementation */ typedef union { @@ uint16_t raw; 45,8 44,6 @@ typedef union { bool nkro:1; }; } keymap_config_t; keymap_config_t keymap_config; #endif @@ /* translates key to keycode */ 168,6 165,30 @@ extern const uint16_t fn_actions[]; #define RESET 0x5000 #define DEBUG 0x5001 // MAGIC keycodes #define MAGIC_SWAP_CONTROL_CAPSLOCK 0x5002 #define MAGIC_UNSWAP_CONTROL_CAPSLOCK 0x5003 #define MAGIC_CAPSLOCK_TO_CONTROL 0x5004 #define MAGIC_UNCAPSLOCK_TO_CONTROL 0x5005 #define MAGIC_SWAP_LALT_LGUI 0x5006 #define MAGIC_UNSWAP_LALT_LGUI 0x5007 #define MAGIC_SWAP_RALT_RGUI 0x5008 #define MAGIC_UNSWAP_RALT_RGUI 0x5009 #define MAGIC_NO_GUI 0x500a #define MAGIC_UNNO_GUI 0x500b #define MAGIC_SWAP_GRAVE_ESC 0x500c #define MAGIC_UNSWAP_GRAVE_ESC 0x500d #define MAGIC_SWAP_BACKSLASH_BACKSPACE 0x500e #define MAGIC_UNSWAP_BACKSLASH_BACKSPACE 0x500f #define MAGIC_HOST_NKRO 0x5010 #define MAGIC_UNHOST_NKRO 0x5011 #define MAGIC_SWAP_ALT_GUI 0x5012 #define MAGIC_UNSWAP_ALT_GUI 0x5013 #define AG_SWAP MAGIC_SWAP_ALT_GUI #define AG_NORM MAGIC_UNSWAP_ALT_GUI // GOTO layer - 16 layers max // when: @@ // ON_PRESS = 1 213,4 234,5 @@ void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3); #define IS_LAYER_ON(layer) ((layer_state) & (1UL<<(layer))) #define IS_LAYER_OFF(layer) ((!layer_state) & (1UL<<(layer))) #endif
M tmk_core/common.mk => tmk_core/common.mk +3 -0
@@ 21,6 21,9 @@ ifeq ($(strip $(BOOTMAGIC_ENABLE)), yes) SRC += $(COMMON_DIR)/bootmagic.c SRC += $(COMMON_DIR)/avr/eeconfig.c OPT_DEFS += -DBOOTMAGIC_ENABLE else SRC += $(COMMON_DIR)/magic.c SRC += $(COMMON_DIR)/avr/eeconfig.c endif ifeq ($(strip $(MOUSEKEY_ENABLE)), yes)
M tmk_core/common/keyboard.c => tmk_core/common/keyboard.c +7 -1
@@ 27,7 27,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "command.h" #include "util.h" #include "sendchar.h" #include "bootmagic.h" #ifdef BOOTMAGIC_ENABLE #include "bootmagic.h" #else #include "magic.h" #endif #include "eeconfig.h" #include "backlight.h" @@ #ifdef MOUSEKEY_ENABLE 86,6 90,8 @@ void keyboard_init(void) #ifdef BOOTMAGIC_ENABLE bootmagic(); #else magic(); #endif #ifdef BACKLIGHT_ENABLE
M tmk_core/common/keymap.h => tmk_core/common/keymap.h +0 -3
@@ 22,8 22,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include <stdbool.h> #include "action.h" #ifdef BOOTMAGIC_ENABLE /* NOTE: Not portable. Bit field order depends on implementation */ typedef union { @@ uint8_t raw; 39,7 37,6 @@ typedef union { }; } keymap_config_t; keymap_config_t keymap_config; #endif /* translates key to keycode */
A tmk_core/common/magic.c => tmk_core/common/magic.c +36 -0
@@ 0,0 1,36 @@ #include <stdint.h> #include <stdbool.h> #include <util/delay.h> #include "matrix.h" #include "bootloader.h" #include "debug.h" #include "keymap.h" #include "host.h" #include "action_layer.h" #include "eeconfig.h" #include "magic.h" keymap_config_t keymap_config; void magic(void) { /* check signature */ if (!eeconfig_is_enabled()) { eeconfig_init(); } /* debug enable */ debug_config.raw = eeconfig_read_debug(); /* keymap config */ keymap_config.raw = eeconfig_read_keymap(); #ifdef NKRO_ENABLE keyboard_nkro = keymap_config.nkro; #endif uint8_t default_layer = 0; default_layer = eeconfig_read_default_layer(); default_layer_set((uint32_t)default_layer); } \ No newline at end of file
A tmk_core/common/magic.h => tmk_core/common/magic.h +6 -0