From b77ff4edf40fbdc4b49d9b3835a54c7884ea20ac Mon Sep 17 00:00:00 2001 From: Luis Moreno Date: Fri, 30 Sep 2022 07:55:46 +0200 Subject: [PATCH] AceVice One's keymap for Kyria keyboard (#18393) --- .../splitkb/kyria/keymaps/lms_ace01/config.h | 55 ++ .../splitkb/kyria/keymaps/lms_ace01/keymap.c | 852 ++++++++++++++++++ .../splitkb/kyria/keymaps/lms_ace01/readme.md | 92 ++ .../splitkb/kyria/keymaps/lms_ace01/rules.mk | 9 + 4 files changed, 1008 insertions(+) create mode 100644 keyboards/splitkb/kyria/keymaps/lms_ace01/config.h create mode 100644 keyboards/splitkb/kyria/keymaps/lms_ace01/keymap.c create mode 100644 keyboards/splitkb/kyria/keymaps/lms_ace01/readme.md create mode 100644 keyboards/splitkb/kyria/keymaps/lms_ace01/rules.mk diff --git a/keyboards/splitkb/kyria/keymaps/lms_ace01/config.h b/keyboards/splitkb/kyria/keymaps/lms_ace01/config.h new file mode 100644 index 0000000000..a64a49b87d --- /dev/null +++ b/keyboards/splitkb/kyria/keymaps/lms_ace01/config.h @@ -0,0 +1,55 @@ +/* Copyright 2021 Luis Moreno + * + * 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 . + */ +#pragma once + +// Set handedness by EEPROM +#define EE_HANDS + +// Tapping / One Shot settings +#define TAPPING_TOGGLE 2 +#define TAPPING_TERM 175 + +#define ONESHOT_TAP_TOGGLE 2 +#define ONESHOT_TIMEOUT 2250 + +// OLED settings -if applicable- +#ifdef OLED_DRIVER_ENABLE + #define OLED_DISPLAY_128X64 +#endif + +// Encoder settings -if applicable- +#ifdef ENCODER_ENABLE + #define ENCODER_RESOLUTION 4 +#endif + +// RGB settings -if applicable- +#ifdef RGBLIGHT_ENABLE + #undef RGBLIGHT_ANIMATIONS + + #define RGBLIGHT_EFFECT_BREATHING + + #define RGBLIGHT_HUE_STEP 2 + #define RGBLIGHT_SAT_STEP 2 + #define RGBLIGHT_VAL_STEP 2 + #define RGBLIGHT_LIMIT_VAL 230 + + #define RGBLIGHT_SLEEP + #define RGBLIGHT_SPLIT + + #define RGBLIGHT_DEFAULT_MODE RGBLIGHT_MODE_BREATHING + 2 + #define RGBLIGHT_DEFAULT_HUE 201 + #define RGBLIGHT_DEFAULT_SAT 255 +#endif diff --git a/keyboards/splitkb/kyria/keymaps/lms_ace01/keymap.c b/keyboards/splitkb/kyria/keymaps/lms_ace01/keymap.c new file mode 100644 index 0000000000..20d4c809b6 --- /dev/null +++ b/keyboards/splitkb/kyria/keymaps/lms_ace01/keymap.c @@ -0,0 +1,852 @@ +/* Copyright 2021 Luis Moreno + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include QMK_KEYBOARD_H +#include "keymap_spanish.h" + +// Insert key state definition (Insert/Overwrite Mode) +static bool ins_state = true; + +// Git Commands +static const char *sendstring_commands[] = { + // Config + "config //global", + + // Create + "init", + "clone", + + // Local changes + "status", + "diff", + "add", + "rm", + "mv", + "commit", + "stash", + "reset", + "revert", + + // Branches and Tags + "branch /b @", + "switch", + "checkout", + "tag", + + // Update & Publish + "remote", + "fetch", + "pull", + "push", + + // Merge & Rebase + "merge", + "rebase", + + // Commit history + "logg" +}; + +// Layers definition +enum layers { + _QWERTY_ES, + _COLEMAK_ES, + _SYMBOL, + _FN_NUMPAD, + _NAVIGATION, + _GIT_CMDS, + _SETTINGS +}; + +// Encoder Modes definition +#ifdef ENCODER_ENABLE +#define ENC_ALT_MAX_TIME 1250 + +typedef enum { + ENC_MODE_CHAR_LINE, + ENC_MODE_WORD_PAGE, + ENC_MODE_TABBING, + ENC_MODE_VOLUME, + ENC_MODE_LAST +} encoder_mode_t; + +static encoder_mode_t enc_mode; + +void encoder_cycle_mode(bool up); +#endif + +// Tap Dance declarations/definitions +#ifdef TAP_DANCE_ENABLE +#define ACTION_TAP_DANCE_FN_ADVANCED_USER(user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_dance_reset, user_user_data) \ + { .fn = {user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_dance_reset}, .user_data = (void *)user_user_data, } + +#define MAX_MOD 3 // Max number of modifiers: 0-Base, 1-Shift, 2-Ctrl + +typedef enum { + TD_NONE, + TD_UNKNOWN, + TD_SINGLE_TAP, + TD_SINGLE_HOLD, + TD_DOUBLE_TAP +} td_state_t; + +typedef struct { + bool is_press_action; + td_state_t state; +} td_tap_t; + +typedef struct { + uint16_t keycode; // Keycode: + // - Tap if keycode != KC_NO + uint8_t layer[MAX_MOD]; // Layer with modifiers (0-Base, 1-Shift, 2-Ctrl): + // - Tap if keycode == KC_NO + // - Single Hold: Activate while holding + // - Double Tap: (Un)lock Layer +} td_user_data_t; + +enum td_actions { + TAB, + ESC, + SPC, + ENT, + LWR, + RAI +}; + +static td_tap_t td_tap_state = { + .is_press_action = true, + .state = TD_NONE +}; + +td_state_t td_current (qk_tap_dance_state_t *state); +void td_kc_ly_finished(qk_tap_dance_state_t *state, void *user_data); +void td_kc_ly_reset (qk_tap_dance_state_t *state, void *user_data); + +qk_tap_dance_action_t tap_dance_actions[] = { + [TAB] = ACTION_TAP_DANCE_DOUBLE(KC_TAB, KC_CAPS), + [ESC] = ACTION_TAP_DANCE_FN_ADVANCED_USER(NULL, td_kc_ly_finished, td_kc_ly_reset, \ + &((td_user_data_t) { KC_ESC, { _NAVIGATION, _QWERTY_ES, _QWERTY_ES }})), + [SPC] = ACTION_TAP_DANCE_FN_ADVANCED_USER(NULL, td_kc_ly_finished, td_kc_ly_reset, \ + &((td_user_data_t) { KC_SPC, { _SYMBOL , _QWERTY_ES, _QWERTY_ES }})), + [ENT] = ACTION_TAP_DANCE_FN_ADVANCED_USER(NULL, td_kc_ly_finished, td_kc_ly_reset, \ + &((td_user_data_t) { KC_ENT, { _SYMBOL , _QWERTY_ES, _QWERTY_ES }})), + [LWR] = ACTION_TAP_DANCE_FN_ADVANCED_USER(NULL, td_kc_ly_finished, td_kc_ly_reset, \ + &((td_user_data_t) { KC_NO, { _NAVIGATION, _GIT_CMDS , _QWERTY_ES }})), + [RAI] = ACTION_TAP_DANCE_FN_ADVANCED_USER(NULL, td_kc_ly_finished, td_kc_ly_reset, \ + &((td_user_data_t) { KC_NO, { _FN_NUMPAD , _GIT_CMDS , _QWERTY_ES }})) +}; +#endif + +// Keycode definitions +enum custom_keycodes { + CK_QUOT = SAFE_RANGE, // Single/Double quote + CK_BSDI, // Backspace/Delete/Insert + CK_ENCM, // Encoder Mode (-) + CK_ENCP, // Encoder Mode (+) + CK_LYDF, // Activate Default Layer + G_CONF, // Git Commands + G_INIT, + G_CLONE, + G_STAT, + G_DIFF, + G_ADD, + G_RM, + G_MV, + G_COMM, + G_STASH, + G_RESET, + G_REVER, + G_BRANC, + G_SWTCH, + G_CHECK, + G_TAG, + G_REMOT, + G_FETCH, + G_PULL, + G_PUSH, + G_MERGE, + G_REBAS, + G_LOG +}; + +#define LY_QWES DF(_QWERTY_ES) +#define LY_CLES DF(_COLEMAK_ES) + +#ifdef TAP_DANCE_ENABLE + #define TD_TBCP TD(TAB) + #define TD_ESSY TD(ESC) + #define TD_SPSY TD(SPC) + #define TD_ENSY TD(ENT) + #define TD_LOWR TD(LWR) + #define TD_RAIS TD(RAI) +#else + #define TD_TBCP MT(MOD_LSFT, KC_TAB) + #define TD_ESSY LT(_SYMBOL , KC_ESC) + #define TD_SPSY KC_SPC + #define TD_ENSY KC_ENT + #define TD_LOWR TT(_NAVIGATION) + #define TD_RAIS TT(_SYMBOL) +#endif + +#define MO_LSFT OSM(MOD_LSFT) +#define MO_LCTL OSM(MOD_LCTL) +#define MO_LALT OSM(MOD_LALT) + +#define MT_RGUI MT(MOD_RGUI, KC_LEFT) +#define MT_RALT MT(MOD_RALT, KC_DOWN) +#define MT_RCTL MT(MOD_RCTL, KC_UP) +#define MT_RSFT MT(MOD_RSFT, KC_RGHT) + +// Keymap definitions +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +// clang-format off +/* + * Basic characters (QWERTY ES) + * + * ,-------------------------------------------. ,-------------------------------------------. + * |Esc/LNav| Q | W | E | R | T | | Y | U | I | O | P |BS/Dl/In| + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * |Tab/Caps| A | S | D | F | G | | H | J | K | L | Ñ | ´ ¨ | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * |EncMode-| Z | X | C | V | B | LGit | | | | LGit | N | M | , ; | . : | - _ |EncMode+| + * `-------------------------------------------| LNav | Space| | Enter|LFnNum|-------------------------------------------' + * +--------------------+------+ / | | / +------+--------------------+ + * | Shift| Ctrl | Alt | GUI | LSym | | LSym | GUI | AltGr| Ctrl | Shift| + * | | | | | | | | <- | v | ^ | -> | + * `----------------------------------' `----------------------------------' + */ + [_QWERTY_ES] = LAYOUT( + TD_ESSY, ES_Q, ES_W, ES_E, ES_R, ES_T, ES_Y, ES_U, ES_I, ES_O, ES_P, CK_BSDI, + TD_TBCP, ES_A, ES_S, ES_D, ES_F, ES_G, ES_H, ES_J, ES_K, ES_L, ES_NTIL, ES_ACUT, + CK_ENCM, ES_Z, ES_X, ES_C, ES_V, ES_B, TD_LOWR, XXXXXXX, XXXXXXX, TD_RAIS, ES_N, ES_M, ES_COMM, ES_DOT, ES_MINS, CK_ENCP, + MO_LSFT, MO_LCTL, MO_LALT, KC_LGUI, TD_SPSY, TD_ENSY, MT_RGUI, MT_RALT, MT_RCTL, MT_RSFT + ), +/* + * Basic characters (COLEMAK ES) + * + * ,-------------------------------------------. ,-------------------------------------------. + * |Esc/LNav| Q | W | F | P | G | | J | L | U | Y | Ñ |BS/Dl/In| + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * |Tab/Caps| A | R | S | T | D | | H | N | E | I | O | ´ ¨ | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * |EncMode-| Z | X | C | V | B | LGit | | | | LGit | K | M | , ; | . : | - _ |EncMode+| + * `-------------------------------------------| LNav | Space| | Enter|LFnNum|-------------------------------------------' + * +--------------------+------+ / | | / +------+--------------------+ + * | Shift| Ctrl | Alt | GUI | LSym | | LSym | GUI | AltGr| Ctrl | Shift| + * | | | | | | | | <- | v | ^ | -> | + * `----------------------------------' `----------------------------------' + */ + [_COLEMAK_ES] = LAYOUT( + TD_ESSY, ES_Q, ES_W, ES_F, ES_P, ES_G, ES_J, ES_L, ES_U, ES_Y, ES_NTIL, CK_BSDI, + TD_TBCP, ES_A, ES_R, ES_S, ES_T, ES_D, ES_H, ES_N, ES_E, ES_I, ES_O, ES_ACUT, + CK_ENCM, ES_Z, ES_X, ES_C, ES_V, ES_B, TD_LOWR, XXXXXXX, XXXXXXX, TD_RAIS, ES_K, ES_M, ES_COMM, ES_DOT, ES_MINS, CK_ENCP, + MO_LSFT, MO_LCTL, MO_LALT, KC_LGUI, TD_SPSY, TD_ENSY, MT_RGUI, MT_RALT, MT_RCTL, MT_RSFT + ), +/* + * Symbols + * + * ,-------------------------------------------. ,-------------------------------------------. + * | | 1 ! | 2 " | 3 · | 4 $ | 5 % | | 6 & | 7 / | 8 ( | 9 ) | 0 = | | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | | ¡ ¿ | ' " | º ª | \ | | ¡ | | ~ $ | + * | - _ | / | ' ? | ` ^ | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | | @ ⅛ | { | ( | [ ° | < > | | | | | | > | ] ¯ | ) | } ˘ | # £ | | + * `----------------------+------+------+------+------+ | | +------+------+------+------+----------------------' + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_SYMBOL] = LAYOUT( + _______, ES_1, ES_2, ES_3, ES_4, ES_5, ES_6, ES_7, ES_8, ES_9, ES_0, _______, + _______, ES_IEXL, CK_QUOT, ES_MORD, ES_BSLS, ES_PIPE, ES_TILD, ES_PLUS, ES_MINS, ES_SLSH, ES_QUOT, ES_GRV, + _______, ES_AT, ES_LCBR, ES_LPRN, ES_LBRC, ES_LABK, _______, XXXXXXX, XXXXXXX, _______, ES_RABK, ES_RBRC, ES_RPRN, ES_RCBR, ES_HASH, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), +/* + * Function keys, NumPad keys + * + * ,-------------------------------------------. ,-------------------------------------------. + * | | F1 | F2 | F3 | F4 | | | , ; | 7 / | 8 ( | 9 ) | * | | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | | F5 | F6 | F7 | F8 | | | . : | 4 $ | 5 % | 6 & | - _ | + * | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | | F9 | F10 | F11 | F12 | | | | | | | 0 = | 1 ! | 2 " | 3 · | / | | + * `----------------------+------+------+------+------+ | | +------+------+------+------+----------------------' + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_FN_NUMPAD] = LAYOUT( + _______, KC_F1, KC_F2, KC_F3, KC_F4, XXXXXXX, ES_COMM, ES_7, ES_8, ES_9, ES_ASTR, _______, + _______, KC_F5, KC_F6, KC_F7, KC_F8, XXXXXXX, ES_DOT, ES_4, ES_5, ES_6, ES_MINS, ES_PLUS, + _______, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, _______, XXXXXXX, XXXXXXX, _______, ES_0, ES_1, ES_2, ES_3, ES_SLSH, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), +/* + * Navigation (Mouse deactivated for space saving) + * + * ,-------------------------------------------. ,-------------------------------------------. + * | | | MBt1 | MUp | MBt2 | | | PgUp | Home | Up | End | PgUp | | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | | Menu | MLeft| MDown|MRight| | | PgDn | Left | Down | Right| PgDn | | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | | | | | | | | | | | | |PrtScr|ScrLck| Pause| | | + * `----------------------+------+------+------+------+ | | +------+------+------+------+----------------------' + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_NAVIGATION] = LAYOUT( + _______, XXXXXXX, KC_BTN1, KC_MS_U, KC_BTN2, XXXXXXX, KC_PGUP, KC_HOME, KC_UP, KC_END, KC_PGUP, _______, + _______, KC_APP, KC_MS_L, KC_MS_D, KC_MS_R, XXXXXXX, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______, + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, KC_PSCR, KC_SLCK, KC_PAUS, XXXXXXX, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), +/* + * Git Commands + * + * ,-------------------------------------------. ,-------------------------------------------. + * | |Config| | | Init | | | | Clone| | | | | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | | Diff | Add | Rm | Mv | | |Remote| Fetch| Pull | Push | Merge| Rebase | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | |Commit| Stash| Reset|Revert|Status| | | | | | Log |Branch|Switch|ChkOut| Tag | | + * `----------------------+------+------+------+------+ | | +------+------+------+------+----------------------' + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_GIT_CMDS] = LAYOUT( + _______, G_CONF, XXXXXXX, XXXXXXX, G_INIT, XXXXXXX, XXXXXXX, G_CLONE, XXXXXXX, XXXXXXX, XXXXXXX, _______, + _______, G_DIFF, G_ADD, G_RM, G_MV, XXXXXXX, G_REMOT, G_FETCH, G_PULL, G_PUSH, G_MERGE, G_REBAS, + _______, G_COMM, G_STASH, G_RESET, G_REVER, G_STAT, _______, XXXXXXX, XXXXXXX, _______, G_LOG, G_BRANC, G_SWTCH, G_CHECK, G_TAG, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), +/* + * Settings (Default Layer, RGB, Media) + * + * ,-------------------------------------------. ,-------------------------------------------. + * | |QWE_ES|CLM_ES| | | | | | | Vol+ | | | | + * |--------+------+------+------+------+------| |------+------+------+------+------+--------| + * | | TOG | HUE+ | SAT+ | VAL+ | MOD | | Mute | Prev | Play | Next | | | + * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| + * | LDef | | HUE- | SAT- | VAL- | RMOD | | | | | | | | Vol- | | | LDef | + * `----------------------+------+------+------+------+ | | +------+------+------+------+----------------------' + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + */ + [_SETTINGS] = LAYOUT( + _______, LY_QWES, LY_CLES, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLU, XXXXXXX, XXXXXXX, _______, + _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, RGB_MOD, KC_MUTE, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX, + CK_LYDF, XXXXXXX, RGB_HUD, RGB_SAD, RGB_VAD, RGB_RMOD,_______, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, KC_VOLD, XXXXXXX, XXXXXXX, CK_LYDF, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), +// /* +// * Layer template +// * +// * ,-------------------------------------------. ,-------------------------------------------. +// * | | | | | | | | | | | | | | +// * |--------+------+------+------+------+------| |------+------+------+------+------+--------| +// * | | | | | | | | | | | | | | +// * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------| +// * | | | | | | | | | | | | | | | | | | +// * `----------------------+------+------+------+------+ | | +------+------+------+------+----------------------' +// * | | | | | | | | | | | | +// * | | | | | | | | | | | | +// * `----------------------------------' `----------------------------------' +// */ +// [_LAYERINDEX] = LAYOUT( +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, +// _______, _______, _______, _______, _______, _______, _______, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, +// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +// ), +}; +// clang-format on + +/* + * INITIALIZING FUNCTIONS + */ +void matrix_init_user(void) { +#ifdef ENCODER_ENABLE + enc_mode = ENC_MODE_CHAR_LINE; +#endif +} + +/* + * LAYER FUNCTIONS + */ +layer_state_t layer_state_set_user(layer_state_t state) { + // Activate Settings layer when both Symbol and Navigation layers are on + return update_tri_layer_state(state, _SYMBOL, _NAVIGATION, _SETTINGS); +} + +/* + * MACRO FUNCTIONS + */ +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + // Get current modifier status (Normal and One Shot) + uint8_t mod_state = get_mods(); + uint8_t osm_state = get_oneshot_mods(); + + // Process keycode + switch (keycode) { + case CK_QUOT: // Single/Double Quote + if (record->event.pressed) { + if ((mod_state | osm_state) & MOD_MASK_SHIFT) { + register_code(ES_2); // Shift(2) -> " + } else { + register_code(ES_QUOT); // Single Quote -> ' + } + } else { + if ((mod_state | osm_state) & MOD_MASK_SHIFT) { + unregister_code(ES_2); // Shift(2) -> " + } else { + unregister_code(ES_QUOT); // Single Quote -> ' + } + } + + return false; + break; + case CK_BSDI: { // Backspace/Delete/Insert + static bool delkey_registered = false; + + if (record->event.pressed) { + // Ctrl -> Insert/Overwrite Mode + // Shift -> Delete + // Normal -> Backspace + if ((mod_state | osm_state) & MOD_MASK_CTRL) { + del_mods(MOD_MASK_CTRL); + del_oneshot_mods(MOD_MASK_CTRL); + + tap_code(KC_INS); + + set_mods(mod_state); + set_oneshot_mods(osm_state); + + ins_state = !ins_state; + } else if ((mod_state | osm_state) & MOD_MASK_SHIFT) { + delkey_registered = true; + + del_mods(MOD_MASK_SHIFT); + del_oneshot_mods(MOD_MASK_SHIFT); + + register_code(KC_DEL); + + set_mods(mod_state); + set_oneshot_mods(osm_state); + } else { + register_code(KC_BSPC); + } + } else { + // Unregister keycode sent after the release of CK_BSDI + if (delkey_registered) { + unregister_code(KC_DEL); + delkey_registered = false; + } else { + unregister_code(KC_BSPC); + } + } + + return false; + } + break; + case CK_LYDF: // De-activate all layers and activate Default layer + layer_move(get_highest_layer(default_layer_state)); + + return false; + break; + case G_CONF ... G_LOG: + if (record->event.pressed) { + del_mods(MOD_MASK_SHIFT); + del_oneshot_mods(MOD_MASK_SHIFT); + + SEND_STRING("git "); + send_string(sendstring_commands[keycode - G_CONF]); + + set_mods(mod_state); + set_oneshot_mods(osm_state); + } + + break; +#ifdef ENCODER_ENABLE + case CK_ENCM: // Encoder Mode (-) + if (record->event.pressed) { + encoder_cycle_mode(false); + } + + break; + case CK_ENCP: // Encoder Mode (+) + if (record->event.pressed) { + encoder_cycle_mode(true); + } + + break; +#endif + } + + return true; +}; + +/* + * TAP DANCE FUNCTIONS + */ +#ifdef TAP_DANCE_ENABLE +td_state_t td_current(qk_tap_dance_state_t *state) { + switch (state->count) { + case 1: + return ((!state->pressed) ? TD_SINGLE_TAP : TD_SINGLE_HOLD); + case 2: + return TD_DOUBLE_TAP; + default: + return TD_UNKNOWN; + } +} + +void td_kc_ly_finished(qk_tap_dance_state_t *state, void *user_data) { + td_tap_state.state = td_current(state); + uint16_t keycode = ((td_user_data_t *)user_data)->keycode; + uint8_t *layer_arr = ((td_user_data_t *)user_data)->layer; + uint8_t layer_sel = *(layer_arr + 0); + + // Get current modifier status (Normal and One Shot) and select layer + uint8_t mod_state = get_mods(); + uint8_t osm_state = get_oneshot_mods(); + + if ((mod_state | osm_state) & MOD_MASK_SHIFT) { + if (*(layer_arr + 1) > _QWERTY_ES) { + layer_sel = *(layer_arr + 1); + } + } + + if ((mod_state | osm_state) & MOD_MASK_CTRL) { + if (*(layer_arr + 2) > _QWERTY_ES) { + layer_sel = *(layer_arr + 2); + } + } + + switch (td_tap_state.state) { + case TD_NONE: + case TD_UNKNOWN: + break; + case TD_SINGLE_TAP: + // Send keycode if available + // Otherwise, Lock Layer (Base/Shift/Ctrl) and Unlock rest of selectable layers + if (keycode != KC_NO) { + tap_code(keycode); + } else { + uint8_t layer_aux; + + for (layer_aux = _GIT_CMDS; layer_aux >= _SYMBOL; layer_aux--) { + if ((layer_aux == layer_sel) && (!layer_state_is(layer_aux))) { + layer_on(layer_aux); + } else { + layer_off(layer_aux); + } + } + } + + break; + case TD_SINGLE_HOLD: + // Lock Layer (Base/Shift/Ctrl) while Single Hold on the way + layer_on(layer_sel); + break; + case TD_DOUBLE_TAP: + // (Un)lock Layer (Base/Shift/Ctrl) + if (layer_state_is(layer_sel)) { + layer_off(layer_sel); + } else { + layer_on(layer_sel); + } + + break; + } +} + +void td_kc_ly_reset(qk_tap_dance_state_t *state, void *user_data) { + uint8_t *layer_arr = ((td_user_data_t *)user_data)->layer; + + if (td_tap_state.state == TD_SINGLE_HOLD) { + // Unlock any Layer (Base/Shift/Ctrl) when Single Hold finalizes + uint8_t i; + uint8_t layer_aux; + + for (i = 0; i < MAX_MOD; i++) { + layer_aux = *(layer_arr + i); + + if ((layer_aux > _QWERTY_ES)) { + layer_off(layer_aux); + } + } + } + + td_tap_state.state = TD_NONE; +} +#endif + +/* + * OLED FUNCTIONS + */ +#ifdef OLED_DRIVER_ENABLE +static void render_kyria_logo(void) { + static const char PROGMEM kyria_logo[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xe0, 0xf0, 0x78, 0x38, 0x1c, 0x1e, 0x0e, + 0x8e, 0x86, 0x86, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x86, + 0x86, 0x8e, 0x0e, 0x1e, 0x1c, 0x38, 0x78, 0xf0, 0xe0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0xf0, 0xfc, 0x3e, 0x0f, 0x07, 0x83, 0xe1, 0xf0, 0xf8, 0xbc, 0x9e, 0x8f, 0x87, + 0x87, 0x83, 0x81, 0x81, 0xe0, 0x78, 0x1f, 0x07, 0xff, 0xff, 0x07, 0x1f, 0x78, 0xe0, 0x81, 0x81, + 0x83, 0x87, 0x87, 0x8f, 0x9e, 0xbc, 0xf8, 0xf0, 0xe1, 0x83, 0x07, 0x0f, 0x3e, 0xfc, 0xf0, 0xe0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xfc, 0xff, 0x03, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x07, 0x07, 0x3f, 0x73, 0xc7, 0x8f, 0x8d, + 0x89, 0x99, 0x99, 0xb1, 0xf7, 0xee, 0xf8, 0xf0, 0xff, 0xff, 0xf0, 0xf8, 0xee, 0xf7, 0xb1, 0x99, + 0x99, 0x89, 0x8d, 0x8f, 0xc7, 0x73, 0x3f, 0x07, 0x07, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x03, 0xff, + 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0xe0, 0xfc, 0xce, 0xe3, 0xf1, 0xb1, + 0x91, 0x99, 0x99, 0x8d, 0xef, 0x77, 0x1f, 0x0f, 0xff, 0xff, 0x0f, 0x1f, 0x77, 0xef, 0x8d, 0x99, + 0x99, 0x91, 0xb1, 0xf1, 0xe3, 0xce, 0xfc, 0xe0, 0xe0, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xc0, 0xff, + 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x0f, 0x3f, 0x7c, 0xf0, 0xe0, 0xc1, 0x87, 0x0f, 0x1f, 0x3d, 0x79, 0xf1, 0xe1, + 0xe1, 0xc1, 0x81, 0x81, 0x07, 0x1e, 0xf8, 0xe0, 0xff, 0xff, 0xe0, 0xf8, 0x1e, 0x07, 0x81, 0x81, + 0xc1, 0xe1, 0xe1, 0xf1, 0x79, 0x3d, 0x1f, 0x0f, 0x87, 0xc1, 0xe0, 0xf0, 0x7c, 0x3f, 0x0f, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x07, 0x0f, 0x1e, 0x1c, 0x38, 0x78, 0x70, + 0x71, 0x61, 0x61, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x61, + 0x61, 0x71, 0x70, 0x78, 0x38, 0x1c, 0x1e, 0x0f, 0x07, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xfe, 0xfe, 0xfe, 0xc6, 0xe0, 0xf0, 0x70, 0x30, 0x10, 0x00, 0x70, + 0xf0, 0xf0, 0x80, 0x00, 0xc0, 0xf0, 0xf0, 0x70, 0x10, 0xc0, 0xf0, 0xf0, 0xf0, 0x70, 0x30, 0x30, + 0x30, 0xc0, 0xf6, 0xf6, 0xf6, 0x06, 0x00, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xf0, 0xf0, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x1f, 0x1f, 0x1f, 0x03, 0x0f, 0x1f, 0x1e, 0x18, 0x10, 0x00, 0xc0, 0xc0, + 0xe7, 0xff, 0x7f, 0x3f, 0x0f, 0x03, 0x01, 0x00, 0x18, 0x1f, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x1f, 0x1f, 0x1f, 0x00, 0x0e, 0x1f, 0x1f, 0x1f, 0x19, 0x0d, 0x1f, 0x1f, 0x1f, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + + oled_write_raw_P(kyria_logo, sizeof(kyria_logo)); +} + +static void render_qmk_logo(void) { + static const char PROGMEM qmk_logo[] = { + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, + 0 + }; + + oled_write_P(qmk_logo, false); +} + +static void render_status(void) { + // Get current modifier status (Normal and One Shot) + uint8_t mod_state = get_mods(); + uint8_t osm_state = get_oneshot_mods(); + uint8_t osl_state = get_oneshot_locked_mods(); + bool caps_lock = host_keyboard_led_state().caps_lock; + + // QMK Logo + render_qmk_logo(); + +#ifdef ENCODER_ENABLE + // Host Keyboard Encoder Mode + switch (enc_mode) { + case ENC_MODE_CHAR_LINE: + oled_write_P(PSTR("ENC \020 CHAR/LINE\n"), false); + break; + case ENC_MODE_WORD_PAGE: + oled_write_P(PSTR("ENC \020 WORD/PAGE\n"), false); + break; + case ENC_MODE_TABBING: + oled_write_P(PSTR("ENC \020 TABBING\n"), false); + break; + case ENC_MODE_VOLUME: + case ENC_MODE_LAST: + oled_write_P(PSTR("ENC \020 VOLUME\n"), false); + break; + } +#else + oled_write_P(PSTR("\n"), false); +#endif + + // Host Keyboard Layer Status + oled_write_P(PSTR("\n"), false); + + switch (get_highest_layer(layer_state)) { + case _QWERTY_ES: + oled_write_P(PSTR("L00 \020 QWERTY (ES)\n"), false); + break; + case _COLEMAK_ES: + oled_write_P(PSTR("L00 \020 COLEMAK (ES)\n"), false); + break; + case _SYMBOL: + oled_write_P(PSTR("L01 \020 SYMBOLS\n"), false); + break; + case _FN_NUMPAD: + oled_write_P(PSTR("L02 \020 FN / NUMPAD\n"), false); + break; + case _NAVIGATION: + oled_write_P(PSTR("L03 \020 NAVIGATION\n"), false); + break; + case _GIT_CMDS: + oled_write_P(PSTR("L04 \020 GIT COMMANDS\n"), false); + break; + case _SETTINGS: + oled_write_P(PSTR("L05 \020 SETTINGS\n"), false); + break; + } + + // Host Keyboard Locked Modifiers Status + oled_write_P((osl_state & MOD_MASK_SHIFT) ? PSTR("LCK ") : PSTR(" ") , false); + oled_write_P((osl_state & MOD_MASK_CTRL) ? PSTR("LCK ") : PSTR(" ") , false); + oled_write_P((osl_state & MOD_MASK_ALT) ? PSTR("LCK ") : PSTR(" ") , false); + oled_write_P( PSTR(" ") , false); + oled_write_P((caps_lock) ? PSTR(" CAPS") : PSTR(" "), false); + + // Host Keyboard Modifiers Status + oled_write_P(((mod_state | osm_state) & MOD_MASK_SHIFT) ? PSTR("SHF ") : PSTR(" ") , false); + oled_write_P(((mod_state | osm_state) & MOD_MASK_CTRL) ? PSTR("CTR ") : PSTR(" ") , false); + oled_write_P(((mod_state | osm_state) & MOD_MASK_ALT) ? PSTR("ALT ") : PSTR(" ") , false); + oled_write_P(((mod_state | osm_state) & MOD_MASK_GUI) ? PSTR("GUI ") : PSTR(" ") , false); + oled_write_P((ins_state) ? PSTR(" INS") : PSTR(" OWR"), false); +} + +static void render_settings(void) { +#ifdef RGBLIGHT_ENABLE + char rgb_str[4]; + + oled_write_P(PSTR("\n\n"), false); + + oled_write_P(PSTR("\020H: "), false); + itoa(rgblight_get_hue(), rgb_str, 10); + oled_write_ln(rgb_str, false); + + oled_write_P(PSTR("\020S: "), false); + itoa(rgblight_get_sat(), rgb_str, 10); + oled_write_ln(rgb_str, false); + + oled_write_P(PSTR("\020V: "), false); + itoa(rgblight_get_val(), rgb_str, 10); + oled_write_ln(rgb_str, false); +#else + oled_write_P(PSTR("\n\n\n\n\n"), false); +#endif + + switch (get_highest_layer(default_layer_state)) { + case _QWERTY_ES: + oled_write_ln_P(PSTR(" \020QWERTY (ES)") , false); + break; + case _COLEMAK_ES: + oled_write_P (PSTR(" \020COLEMAK (ES)"), false); + break; + } + +#ifdef RGBLIGHT_ENABLE + oled_write_ln_P(PSTR(" RGB DEFAULT"), false); + oled_write_ln_P(PSTR("SETTINGS LAYER "), false); +#else + oled_write_ln_P(PSTR(" DEFAULT"), false); + oled_write_ln_P(PSTR(" LAYER "), false); +#endif +} + +oled_rotation_t oled_init_user(oled_rotation_t rotation) { + return OLED_ROTATION_180; +} + +void oled_task_user(void) { + if (is_keyboard_master()) { // Main screen: Renders keyboard state (layer, modifiers) / RGB settings + if (get_highest_layer(layer_state) != _SETTINGS) { + render_status(); + } else { + render_settings(); + } + } else { // Auxiliar screen: Renders Kyria logo with scroll + render_kyria_logo(); + oled_scroll_right(); + } +} +#endif + +/* + * ENCODER FUNCTIONS + */ +#ifdef ENCODER_ENABLE +void encoder_cycle_mode(bool up) { + if (enc_mode == 0 && !up) { + enc_mode = ENC_MODE_LAST - 1; + } else { + enc_mode = (enc_mode + (up ? +1 : -1)) % ENC_MODE_LAST; + } +} + +bool encoder_update_user(uint8_t index, bool clockwise) { + // Select encoder mode + switch (enc_mode) { + case ENC_MODE_CHAR_LINE: + // Left Encoder: Character Left/Right. Right Encoder: Line Up/Down. + tap_code(!clockwise ? (index == 0 ? KC_LEFT : KC_UP): (index == 0 ? KC_RGHT : KC_DOWN)); + break; + case ENC_MODE_WORD_PAGE: + // Left Encoder: Word Left/Right. Right Encoder: Page Up/Down. + tap_code16(!clockwise ? (index == 0 ? C(KC_LEFT) : KC_PGUP): (index == 0 ? C(KC_RGHT) : KC_PGDN)); + break; + case ENC_MODE_TABBING: + // Left Encoder: Navigation Tabbing. Right Encoder: Editor Tabbing. + tap_code16(!clockwise ? (index == 0 ? S(C(KC_TAB)) : C(KC_PGUP)): (index == 0 ? C(KC_TAB) : C(KC_PGDN))); + break; + case ENC_MODE_VOLUME: + case ENC_MODE_LAST: + // Volume control + tap_code(clockwise ? KC_VOLU : KC_VOLD); + break; + } + + return true; +} +#endif diff --git a/keyboards/splitkb/kyria/keymaps/lms_ace01/readme.md b/keyboards/splitkb/kyria/keymaps/lms_ace01/readme.md new file mode 100644 index 0000000000..aae1260ffb --- /dev/null +++ b/keyboards/splitkb/kyria/keymaps/lms_ace01/readme.md @@ -0,0 +1,92 @@ +# AceVice One's Keymap for [Kyria](https://github.com/splitkb/kyria) + +## Introduction + +This is my first personal keymap for Kyria with a little bunch of *steroids*. + +The hardware build implements 2 rotatory encoders and 2 OLED displays. + +## Features + +These are some of the generic features built in: + +- Two alternative default character distributions (**QWERTY**, **COLEMAK**) with *Spanish* layout. +- Layer selection on some keys (**Esc**, **Lower**, **Space**, **Enter**, **Raise**). +- Multiple selectable layers: + - **Symbols**: Numbers on top row, common programming symbols (curly, square and angle brackets, parentheses, at and hash) on bottom row with symmetric distribution (open on left, close on right). + - **Function**/**Numpad**: Function keys on left side, Number Pad on right side. + - **Navigation**: Mouse keys on left side, Navigation keys on right side. + - **Git commands**: The most common and useful Git commands at your fingertips. + - **Settings**: Select default distribution, Media keys, RGB settings. +- Symmetric design -left/right side- for modifiers (**Shift**, **Ctrl**, **Alt** and **GUI**). +- **Arrows**/**Modifiers** on same keys (right side). +- **Tab**/**Caps Lock** key. +- **Backspace**/**Delete** with **Insert**/**Overwrite** selectable mode on same key. +- **Single/Double Quote** (`' "`) on same key as English layouts. +- Handedness set by EEPROM. +- Mouse Keys has been disabled by default for space saving (Pro Micro controller limit). + +Some of the more specific features are described below: + +### Tap Dance + +- Use of `ACTION_TAP_DANCE_DOUBLE()` for **Tab**/**Caps Lock** key. +- Implementation of new `ACTION_TAP_DANCE_FN_ADVANCED_USER()` function: + - Any user data can be sent to personalized functions. + - Generalized design makes action reuse easy. + - User can tap a keycode and/or layer selection (single tap, single hold, double tap) depending on modifiers (**None**, **Shift**, **Ctrl**). + +### OLEDs + +Master-side OLED displays dynamic data: + +- Current layer. +- Modifiers state (lock mode included). +- Caps Lock state. +- Insert/Overwrite state. + +Slave-side OLED displays horizontal scrolling Kyria logo. + +### Rotary Encoders + +Encoders click buttons for mode changing. Supported modes are: + +- Character Left / Right, Line Up / Down. +- Word Left / Right, Page Up / Down. +- Tabbing Left / Right (Navigator, Editor). +- Volume Up / Down. + +## TODO list + +- [x] Show modifiers in OLED when triggered as One Shot keys +- [x] Manage Backspace key with dual funcion (Delete when shifted) +- [x] OLED modifier status bar one line down +- [x] Show INS/OWR Mode in right OLED +- [x] Show RGB Led Settings on OLED when Settings layer on +- [x] Show Locked Modifiers (Shift, Control, Alt, GUI) +- [x] Arrow keys on right modifier keys +- [x] Improve Esc/Layer Symbol: Tap -> Keycode, Hold -> Momentary Layer, Double Tap -> Toggler Layer +- [x] Check transparent keys on all layers (avoid collateral effects) +- [x] Add "Print Screen" / "Scroll Lock" / "Pause Break" keys on Navigation layer +- [x] Add Basic characters layers: COLEMAK (ES) +- [x] Create custom keycode with quotes (single/double) for ES layout +- [x] Add Tap-Dance actions for keycodes (Tab, Space, Enter) and layer selection +- [x] Add Git commands to some layer +- [x] Disable Mouse Keys (saving space) +- [x] Settings Layer not accesible +- [x] Layer buttons with double/triple function (Normal/Shift/Control mode) +- [x] Tab/Caps Lock on same key (single/double tap) +- [x] Backspace/Delete/Insert on same key (Normal/Shift/Ctrl) +- [x] Separate default layer from RGB settings rendering for conditional compiling +- [x] Encoders: Improve with more functionality (modes) +- [ ] Encoders: Add mode for navigation through windows (applications) +- [ ] Show more info about RGB Led Settings (On/Off, Animation, ...) +- [ ] Activate "Nums Lock" when Fn/NumPad layer locked +- [ ] Show status indicator when locked layer +- [ ] Set RGB Led Color by selected Layer (activable) +- [ ] Add more uses for left OLED +- [ ] Something strange returning from One Shot hold + +## Acknowledgements + +Thanks to the entire QMK community for your invaluable help. diff --git a/keyboards/splitkb/kyria/keymaps/lms_ace01/rules.mk b/keyboards/splitkb/kyria/keymaps/lms_ace01/rules.mk new file mode 100644 index 0000000000..329b41e4e5 --- /dev/null +++ b/keyboards/splitkb/kyria/keymaps/lms_ace01/rules.mk @@ -0,0 +1,9 @@ +BOOTLOADER = caterina # Pro Micro bootloader + +TAP_DANCE_ENABLE = yes # Enable Tap Dance + +OLED_DRIVER_ENABLE = yes # Enables the use of OLED displays +ENCODER_ENABLE = yes # Enables the use of one or more encoders +RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow + +MOUSEKEY_ENABLE = no # Disable mouse (saving space)