qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

keymap.c (14110B)


      1 /* Copyright 2020 Takeshi Nishio
      2  *
      3  * This program is free software: you can redistribute it and/or modify
      4  * it under the terms of the GNU General Public License as published by
      5  * the Free Software Foundation, either version 2 of the License, or
      6  * (at your option) any later version.
      7  *
      8  * This program is distributed in the hope that it will be useful,
      9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     11  * GNU General Public License for more details.
     12  *
     13  * You should have received a copy of the GNU General Public License
     14  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
     15  */
     16 #include QMK_KEYBOARD_H
     17 
     18 // Defines names for use in layer keycodes and the keymap
     19 enum layer_number {
     20     _MAC = 0,
     21     _WIN,
     22     _NUM,
     23     _LOWER,
     24     _RAISE,
     25     _NUM_RAISE,
     26     _ADJUST
     27 };
     28 
     29 // Tap Dance
     30 enum tap_dances{
     31     TD_LSFT_CAPS = 0,
     32     TD_ESC_NUM,
     33 };
     34 
     35 // Tap Dance state
     36 enum {
     37     SINGLE_TAP = 1,
     38     DOUBLE_TAP,
     39     TRIPLE_TAP,
     40     TAP_HOLD,
     41 };
     42 
     43 // Declare the functions to be used with your tap dance key(s)
     44 // Function associated with all tap dances
     45 uint8_t cur_dance(tap_dance_state_t *state);
     46 // Functions associated with individual tap dances
     47 void ql_finished(tap_dance_state_t *state, void *user_data);
     48 void ql_reset(tap_dance_state_t *state, void *user_data);
     49 
     50 // Tap Dance definitions
     51 tap_dance_action_t tap_dance_actions[] = {
     52     [TD_LSFT_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, KC_CAPS),
     53     [TD_ESC_NUM] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ql_finished, ql_reset),
     54 };
     55 
     56 uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
     57     switch (keycode) {
     58         case TD(TD_ESC_NUM):
     59             return 275;
     60         default:
     61             return TAPPING_TERM;
     62     }
     63 }
     64 
     65 // Key Macro
     66 #define ESC_NUM TD(TD_ESC_NUM)
     67 #define S_CAP   TD(TD_LSFT_CAPS)
     68 #define SP_RAI  LT(_RAISE, KC_SPC)
     69 #define SP_NRAI LT(_NUM_RAISE, KC_SPC)
     70 #define SP_SFT  MT(MOD_LSFT, KC_SPC)
     71 #define C_SLSH  RCTL_T(KC_SLSH)
     72 #define CT_E    LCTL(KC_E)
     73 #define CT_A    LCTL(KC_A)
     74 #define ALT_GRV LALT(KC_GRV)
     75 #define LOWER   MO(_LOWER)
     76 #define NUM     TG(_NUM)
     77 #define MAC     PDF(_MAC)
     78 #define WIN     PDF(_WIN)
     79 
     80 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     81     [_MAC] = LAYOUT_ansi(
     82         ESC_NUM,KC_1,   KC_2,   KC_3,   KC_4,   KC_5,   KC_6,   KC_7,   KC_8,   KC_9,   KC_0,   KC_MINS,KC_EQL, KC_BSLS,KC_GRV,
     83         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_LBRC,KC_RBRC,
     84         KC_LCTL,    KC_A,   KC_S,   KC_D,   KC_F,   KC_G,   KC_H,   KC_J,   KC_K,   KC_L,   KC_SCLN,KC_ENT,             KC_QUOT,
     85         S_CAP,          KC_Z,   KC_X,   KC_C,   KC_V,   KC_B,   KC_N,   KC_M,   KC_COMM,KC_DOT, C_SLSH, KC_RSFT,KC_UP,  LOWER,
     86         KC_MUTE,KC_LNG2,KC_LALT,KC_LGUI,       SP_SFT,         SP_RAI,         KC_RGUI,KC_RALT,KC_LNG1,KC_LEFT,KC_DOWN,KC_RGHT
     87     ),
     88     [_WIN] = LAYOUT_ansi(
     89         _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,
     90         _______,    _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,    _______,_______,
     91         _______,    _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,            _______,
     92         _______,        _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,
     93         _______,ALT_GRV,KC_LGUI,KC_LALT,        _______,        _______,        KC_RALT,KC_APP, ALT_GRV,_______,_______,_______
     94     ),
     95     [_NUM] = LAYOUT_ansi(
     96         _______,_______,_______,_______,_______,_______,_______,XXXXXXX,KC_PSLS,KC_PSLS,KC_PAST,_______,_______,_______,_______,
     97         _______,    _______,_______,_______,_______,_______,_______,KC_P7,  KC_P8,  KC_P9,  KC_PPLS,_______,    _______,_______,
     98         _______,    _______,_______,_______,_______,_______,_______,KC_P4,  KC_P5,  KC_P6,  XXXXXXX,_______,            _______,
     99         _______,        _______,_______,_______,_______,_______,_______,KC_P1,  KC_P2,  KC_P3,  KC_PENT,_______,_______,_______,
    100         _______,_______,_______,_______,        _______,        SP_NRAI,        KC_P0,  KC_PDOT,_______,_______,_______,_______
    101     ),
    102     [_LOWER] = LAYOUT_ansi(
    103         KC_PAUS,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_INS, KC_DEL,
    104         KC_PSCR,    _______,_______,_______,_______,_______,_______,_______,_______,_______,KC_HOME,KC_UP,      KC_END, KC_VOLU,
    105         _______,    _______,_______,_______,_______,_______,_______,_______,_______,KC_PGUP,KC_LEFT,KC_RGHT,            KC_VOLD,
    106         _______,        _______,_______,_______,_______,_______,_______,_______,_______,KC_PGDN,KC_DOWN,_______,KC_PGUP,_______,
    107         _______,_______,_______,_______,        _______,        _______,         _______,_______,_______,KC_HOME,KC_PGDN,KC_END
    108     ),
    109     [_RAISE] = LAYOUT_ansi(
    110         KC_PAUS,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_INS, KC_DEL,
    111         KC_PSCR,    _______,_______,CT_E,   _______,_______,_______,_______,_______,_______,KC_PGUP,KC_DEL,     _______,_______,
    112         _______,    CT_A,   _______,KC_DEL, KC_RGHT,KC_ESC, KC_LEFT,KC_DOWN,KC_UP,  KC_RGHT,KC_MINS,KC_INS,             _______,
    113         _______,        _______,_______,_______,_______,KC_LEFT,KC_PGDN,KC_ENT, _______,KC_MRWD,KC_MFFD,_______,KC_PGUP,_______,
    114         _______,_______,_______,_______,        _______,        _______,        _______,_______,_______,KC_HOME,KC_PGDN,KC_END
    115     ),
    116     [_NUM_RAISE] = LAYOUT_ansi(
    117         KC_ESC, KC_1,   KC_2,   KC_3,   KC_4,   KC_5,   KC_6,   KC_7,   KC_8,   KC_9,   KC_0,   KC_MINS,KC_EQL, KC_BSLS,KC_GRV,
    118         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_LBRC,KC_RBRC,
    119         KC_LCTL,    KC_A,   KC_S,   KC_D,   KC_F,   KC_G,   KC_H,   KC_J,   KC_K,   KC_L,   KC_SCLN, KC_ENT,            KC_QUOT,
    120         S_CAP,          KC_Z,   KC_X,   KC_C,   KC_V,   KC_B,   KC_N,   KC_M,   KC_COMM,KC_DOT, C_SLSH, KC_RSFT,KC_UP,  _______,
    121         _______,_______,_______,_______,        _______,        _______,        _______,_______,_______,_______,_______,_______
    122     ),
    123     [_ADJUST] = LAYOUT_ansi(
    124         _______,UG_HUEU,UG_SATU,UG_VALU,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,
    125         _______,    _______,WIN,    _______,QK_BOOT,_______,UG_HUEU,UG_SATU,UG_VALU,_______,UG_PREV,_______,   _______,_______,
    126         _______,    AU_TOGG,CK_TOGG,MU_TOGG,MU_NEXT,_______,UG_HUED,UG_SATD,UG_VALD,UG_TOGG,UG_NEXT,_______,            _______,
    127         _______,        CK_RST, CK_DOWN,CK_UP  ,_______,_______,NUM,     MAC,   _______,_______,_______,_______,_______,_______,
    128         _______,_______,_______,_______,        _______,        _______,        _______,_______,_______,_______,_______,_______
    129     )
    130 };
    131 
    132 //------------------------------------------------------------------------------
    133 // RGB Light settings
    134 #ifdef RGBLIGHT_LAYERS
    135 
    136 // Indicator LED settings
    137 #define JONES_LED_INDICATOR_INDEX 12        // where to start indicator
    138 #define JONES_LED_INDICATOR_COUNT 2         // how many leds for indicator
    139 #define JONES_LED_INDICATOR_CHANGE_COUNT 1  // how meny leds to change color for temporally layer
    140 #define JONES_LED_DIMMER_LEVEL 200          // brightness dimmer
    141 
    142 // for Default layer (= Base layer)
    143 const rgblight_segment_t PROGMEM my_mac_layer[] = RGBLIGHT_LAYER_SEGMENTS(
    144     {JONES_LED_INDICATOR_INDEX , JONES_LED_INDICATOR_COUNT, HSV_WHITE - JONES_LED_DIMMER_LEVEL}
    145 );
    146 const rgblight_segment_t PROGMEM my_win_layer[] = RGBLIGHT_LAYER_SEGMENTS(
    147     {JONES_LED_INDICATOR_INDEX , JONES_LED_INDICATOR_COUNT, HSV_BLUE - JONES_LED_DIMMER_LEVEL}
    148 );
    149 const rgblight_segment_t PROGMEM my_num_layer[] = RGBLIGHT_LAYER_SEGMENTS(
    150     {JONES_LED_INDICATOR_INDEX , JONES_LED_INDICATOR_COUNT, HSV_YELLOW - JONES_LED_DIMMER_LEVEL}
    151 );
    152 
    153 // for temporal layer
    154 const rgblight_segment_t PROGMEM my_caps_layer[] = RGBLIGHT_LAYER_SEGMENTS(
    155     {JONES_LED_INDICATOR_INDEX , JONES_LED_INDICATOR_CHANGE_COUNT, HSV_MAGENTA - JONES_LED_DIMMER_LEVEL}
    156 );
    157 
    158 const rgblight_segment_t PROGMEM my_lower_layer[] = RGBLIGHT_LAYER_SEGMENTS(
    159     {JONES_LED_INDICATOR_INDEX , JONES_LED_INDICATOR_CHANGE_COUNT, HSV_GREEN - JONES_LED_DIMMER_LEVEL}
    160 );
    161 
    162 const rgblight_segment_t PROGMEM my_raise_layer[] = RGBLIGHT_LAYER_SEGMENTS(
    163     {JONES_LED_INDICATOR_INDEX , JONES_LED_INDICATOR_CHANGE_COUNT, HSV_CYAN - JONES_LED_DIMMER_LEVEL}
    164 );
    165 
    166 const rgblight_segment_t PROGMEM my_num_raise_layer[] = RGBLIGHT_LAYER_SEGMENTS(
    167     {JONES_LED_INDICATOR_INDEX , JONES_LED_INDICATOR_CHANGE_COUNT, HSV_GOLD - JONES_LED_DIMMER_LEVEL}
    168 );
    169 
    170 const rgblight_segment_t PROGMEM my_adjust_layer[] = RGBLIGHT_LAYER_SEGMENTS(
    171     {JONES_LED_INDICATOR_INDEX , JONES_LED_INDICATOR_CHANGE_COUNT, HSV_RED - JONES_LED_DIMMER_LEVEL}
    172 );
    173 
    174 // Define the array of layers. Later layers take precedence
    175 const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(
    176     my_mac_layer,
    177     my_win_layer,
    178     my_num_layer,
    179     my_caps_layer,
    180     my_lower_layer,
    181     my_raise_layer,
    182     my_num_raise_layer,
    183     my_adjust_layer
    184 );
    185 
    186 void keyboard_post_init_user(void) {
    187     // Enable the LED layers
    188     rgblight_layers = my_rgb_layers;
    189 }
    190 
    191 // Enabling and disabling lighting layers
    192 layer_state_t layer_state_set_user(layer_state_t state) {
    193     state = update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
    194 
    195     rgblight_set_layer_state(2, layer_state_cmp(state, _NUM));
    196     rgblight_set_layer_state(4, layer_state_cmp(state, _LOWER));
    197     rgblight_set_layer_state(5, layer_state_cmp(state, _RAISE));
    198     rgblight_set_layer_state(6, layer_state_cmp(state, _NUM_RAISE));
    199     rgblight_set_layer_state(7, layer_state_cmp(state, _ADJUST));
    200 
    201     return state;
    202 }
    203 
    204 // Enabling and disabling lighting layers for default layer
    205 layer_state_t default_layer_state_set_user(layer_state_t state) {
    206     rgblight_set_layer_state(0, layer_state_cmp(state, _MAC));
    207     rgblight_set_layer_state(1, layer_state_cmp(state, _WIN));
    208     rgblight_set_layer_state(2, layer_state_cmp(state, _NUM));
    209 
    210     return state;
    211 }
    212 
    213 bool led_update_user(led_t led_state) {
    214     rgblight_set_layer_state(3, led_state.caps_lock);
    215     return true;
    216 }
    217 #endif
    218 
    219 
    220 //------------------------------------------------------------------------------
    221 // Rotary Encoder
    222 bool encoder_update_user(uint8_t index, bool clockwise) {
    223     if (index == 0) { /* First encoder, Right side */
    224         if (clockwise) {
    225             tap_code(KC_VOLD);
    226         } else {
    227             tap_code(KC_VOLU);
    228         }
    229     }
    230     if (index == 1) { /* Second encoder, Left side */
    231         switch(get_highest_layer(layer_state)) {
    232             case _LOWER:
    233                 if (clockwise) {
    234                     rgblight_decrease_hue();
    235                 } else {
    236                     rgblight_increase_hue();
    237                 }
    238                 break;
    239             case _RAISE:
    240                 if (clockwise) {
    241                     rgblight_decrease_val();
    242                 } else {
    243                     rgblight_increase_val();
    244                 }
    245                 break;
    246             case _ADJUST:
    247                 if (clockwise) {
    248                     rgblight_step_reverse();
    249                 } else {
    250                     rgblight_step();
    251                 }
    252                 break;
    253             default:
    254                 if (clockwise) {
    255                     tap_code(KC_VOLD);
    256                 } else {
    257                     tap_code(KC_VOLU);
    258                 }
    259                 break;
    260         }
    261     }
    262     return true;
    263 }
    264 
    265 
    266 //------------------------------------------------------------------------------
    267 // Tap Dance function
    268 
    269 
    270 typedef struct {
    271     bool is_press_action;
    272     uint8_t state;
    273 } tap;
    274 
    275 // Determine the current tap dance state
    276 uint8_t cur_dance(tap_dance_state_t *state) {
    277     if (state->count == 1) {
    278         if (!state->pressed) {
    279             return SINGLE_TAP;
    280         } else {
    281             return TAP_HOLD;
    282         }
    283     } else if (state->count == 2) {
    284         if (!state->pressed) {
    285             return DOUBLE_TAP;
    286         } else {
    287             return TAP_HOLD;
    288         }
    289     } else if (state->count == 3) {
    290         if (!state->pressed) {
    291             return TRIPLE_TAP;
    292         } else {
    293             return TAP_HOLD;
    294         }
    295     } else {
    296         return 8; // Magic number. At some point this method will expand to work for more presses
    297     }
    298 }
    299 
    300 // Initialize tap structure associated with example tap dance key
    301 static tap ql_tap_state = {
    302     .is_press_action = true,
    303     .state = 0
    304 };
    305 
    306 // Functions that control what our tap dance key does
    307 void ql_finished(tap_dance_state_t *state, void *user_data) {
    308     ql_tap_state.state = cur_dance(state);
    309     switch(TAP_DANCE_KEYCODE(state)) {
    310         case TD(TD_ESC_NUM): // ESC key action
    311             switch (ql_tap_state.state) {
    312                 case SINGLE_TAP:
    313                 case DOUBLE_TAP:
    314                     // ESC
    315                     tap_code(KC_ESC);
    316                     break;
    317                 case TAP_HOLD:
    318                     // temporal layer change
    319                     layer_on(_NUM);
    320                     break;
    321                 case TRIPLE_TAP:
    322                     // toggle layer
    323                     // Check to see if the layer is already set
    324                     if (layer_state_is(_NUM)) {
    325                         // If already set, then switch it off
    326                         layer_off(_NUM);
    327                     } else {
    328                         // If not already set, then switch the layer on
    329                         layer_on(_NUM);
    330                     }
    331                     break;
    332             }
    333             break;
    334     }
    335 }
    336 
    337 void ql_reset(tap_dance_state_t *state, void *user_data) {
    338     switch(TAP_DANCE_KEYCODE(state)) {
    339         case TD(TD_ESC_NUM):
    340             // If the key was held down and now is released then switch off the layer
    341             if (ql_tap_state.state == TAP_HOLD) {
    342                 layer_off(_NUM);
    343             }
    344             ql_tap_state.state = 0;
    345             break;
    346     }
    347 }