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 }