keymap.c (16102B)
1 #include QMK_KEYBOARD_H 2 3 #ifdef PROTOCOL_LUFA 4 #include "lufa.h" 5 #include "split_util.h" 6 #endif 7 8 // Each layer gets a name for readability, which is then used in the keymap matrix below. 9 // The underscores don't mean anything - you can have a layer called STUFF or any other name. 10 // Layer names don't all need to be of the same length, obviously, and you can also skip them 11 // entirely and just use numbers. 12 enum layer_number { 13 _QWERTY = 0, 14 _COLEMAK, 15 _FN, 16 _ADJ 17 }; 18 19 // Keycode defines for layers 20 #define QWERTY DF(_QWERTY) 21 #define COLEMAK DF(_COLEMAK) 22 #define FN MO(_FN) 23 #define ADJ MO(_ADJ) 24 25 enum custom_keycodes { 26 RGBRST = SAFE_RANGE, 27 RGB_MENU 28 }; 29 30 #define FN_ESC LT(_FN, KC_ESC) 31 #define FN_CAPS LT(_FN, KC_CAPS) 32 33 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 34 /* Qwerty 35 * ,------------------------------------------------. ,------------------------------------------------. 36 * | GESC | 1 | 2 | 3 | 4 | 5 | - | | = | 6 | 7 | 8 | 9 | 0 | BkSp | 37 * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| 38 * | Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | \ | 39 * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| 40 * |FN(CAPS)| A | S | D | F | G | ( | | ) | H | J | K | L | ; | ' | 41 * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| 42 * |Shift | Z | X | C | V | B | { | | } | N | M | , | . | / |Enter | 43 * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| 44 * | Ctrl | Win | Alt | RGB | ADJ | Space| DEL | | Enter| Space| FN | Left | Down | Up |Right | 45 * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------' 46 * | Space| DEL | | Enter| Space| 47 * `-------------' `-------------' 48 */ 49 [_QWERTY] = LAYOUT( 50 QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, 51 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, 52 FN_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LPRN, KC_RPRN, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, 53 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LCBR, KC_RCBR, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, 54 KC_LCTL, KC_LGUI, KC_LALT, RM_TOGG, ADJ, KC_SPC, KC_DEL, KC_ENT, KC_SPC, FN, KC_LEFT, KC_DOWN, KC_UP,KC_RIGHT, 55 KC_SPC, KC_DEL, KC_ENT, KC_SPC 56 ), 57 58 /* Colemak 59 * ,------------------------------------------------. ,------------------------------------------------. 60 * | GESC | 1 | 2 | 3 | 4 | 5 | - | | = | 6 | 7 | 8 | 9 | 0 | BkSp | 61 * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| 62 * | Tab | Q | W | F | P | B | [ | | ] | J | L | U | Y | ; | \ | 63 * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| 64 * |FN(CAPS)| A | R | S | T | G | ( | | ) | K | N | E | I | O | ' | 65 * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| 66 * |Shift | Z | X | C | D | V | { | | } | M | H | , | . | / |Enter | 67 * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| 68 * | Ctrl | Win | Alt | RGB | ADJ | Space| DEL | | Enter| Space| FN | Left | Down | Up |Right | 69 * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------' 70 * | Space| DEL | | Enter| Space| 71 * `-------------' `-------------' 72 */ 73 [_COLEMAK] = LAYOUT( 74 QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, 75 KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_LBRC, KC_RBRC, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSLS, 76 FN_CAPS, KC_A, KC_R, KC_S, KC_T, KC_D, KC_LPRN, KC_RPRN, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, 77 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LCBR, KC_RCBR, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, 78 KC_LCTL, KC_LGUI, KC_LALT, RM_TOGG, ADJ, KC_SPC, KC_DEL, KC_ENT, KC_SPC, FN, KC_LEFT, KC_DOWN, KC_UP,KC_RIGHT, 79 KC_SPC, KC_DEL, KC_ENT, KC_SPC 80 ), 81 82 /* FN 83 * ,------------------------------------------------. ,------------------------------------------------. 84 * | F1 | F2 | F3 | F4 | F5 | F6 | | | | F7 | F8 | F9 | F10 | F11 | F12 | 85 * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| 86 * | | PGDN | UP | PGUP | | | | | | | PGDN | UP | PGUP | PRINT| HOME | 87 * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| 88 * | | LEFT | DOWN | RIGHT| | | | | | | LEFT | DOWN | RIGHT|INSERT| END | 89 * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| 90 * | | | | | | | | | | | | | | | | 91 * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| 92 * | | | |RGBMOD| | | | | | | PLAY | NEXT | MUTE | VOL- | VOL+ | 93 * `------+------+------+------+------+------+------| |------+------+------+------+------+------+------' 94 * | | | | | | 95 * `-------------' `-------------' 96 */ 97 [_FN] = LAYOUT( 98 KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, KC_PSCR, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, 99 _______, KC_PGDN, KC_UP, KC_PGUP, _______, _______, _______, KC_SCRL, _______, KC_PGDN, KC_UP, KC_PGUP, KC_PSCR, KC_HOME, 100 _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, KC_NUM, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_INS, KC_END, 101 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, 102 _______, _______, _______, RM_NEXT, _______, _______, _______, _______, _______, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, 103 _______, _______, _______, _______ 104 ), 105 106 /* ADJ 107 * ,------------------------------------------------. ,------------------------------------------------. 108 * | F1 | F2 | F3 | F4 | F5 | F6 | | | | F7 | F8 | F9 | F10 | F11 | F12 | 109 * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| 110 * | | SAD | VAI | SAI | QK_BOOT| | | | | | P7 | P8 | P9 | | | 111 * |------+------+------+------+------+------|------| |------|------+------+------+------+------+------| 112 * | | HUD | VAD | HUI |RGBRST| | | | | | P4 | P5 | P6 | | | 113 * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| 114 * | | SPD | | SPI | | | | | | | P1 | P2 | P3 | | | 115 * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| 116 * | | | |RGBMOD| | | | | | | P0 | PDOT | NLCK |QWERTY|COLEMK| 117 * `------+------+------+------+------+------+------| |------+------+------+------+------+------+------' 118 * | | | | | | 119 * `-------------' `-------------' 120 */ 121 122 [_ADJ] = LAYOUT( 123 KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, 124 _______, RM_SATD, RM_VALU, RM_SATU, QK_BOOT, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, _______, _______, 125 _______, RM_HUED, RM_VALD, RM_HUEU, RGBRST, _______, _______, _______, _______, KC_P4, KC_P5, KC_P6, _______, _______, 126 _______, RM_SPDD, _______, RM_SPDU, _______, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, _______, _______, 127 _______, _______, _______, RM_NEXT, _______, _______, _______, _______, _______, KC_P0, KC_PDOT, KC_NUM, QWERTY, COLEMAK, 128 _______, _______, _______, _______ 129 ) 130 }; 131 132 // For RGBRST Keycode 133 #if defined(RGB_MATRIX_ENABLE) 134 void rgb_matrix_increase_flags(void) 135 { 136 switch (rgb_matrix_get_flags()) { 137 case LED_FLAG_ALL: { 138 rgb_matrix_set_flags(LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER); 139 rgb_matrix_set_color_all(0, 0, 0); 140 } 141 break; 142 case LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER: { 143 rgb_matrix_set_flags(LED_FLAG_UNDERGLOW); 144 rgb_matrix_set_color_all(0, 0, 0); 145 } 146 break; 147 case LED_FLAG_UNDERGLOW: { 148 rgb_matrix_set_flags(LED_FLAG_NONE); 149 rgb_matrix_disable_noeeprom(); 150 } 151 break; 152 default: { 153 rgb_matrix_set_flags(LED_FLAG_ALL); 154 rgb_matrix_enable_noeeprom(); 155 } 156 break; 157 } 158 } 159 160 void rgb_matrix_decrease_flags(void) 161 { 162 switch (rgb_matrix_get_flags()) { 163 case LED_FLAG_ALL: { 164 rgb_matrix_set_flags(LED_FLAG_NONE); 165 rgb_matrix_disable_noeeprom(); 166 } 167 break; 168 case LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER: { 169 rgb_matrix_set_flags(LED_FLAG_ALL); 170 rgb_matrix_set_color_all(0, 0, 0); 171 } 172 break; 173 case LED_FLAG_UNDERGLOW: { 174 rgb_matrix_set_flags(LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER); 175 rgb_matrix_set_color_all(0, 0, 0); 176 } 177 break; 178 default: { 179 rgb_matrix_set_flags(LED_FLAG_UNDERGLOW); 180 rgb_matrix_enable_noeeprom(); 181 } 182 break; 183 } 184 } 185 #endif 186 187 #ifdef RGB_OLED_MENU 188 uint8_t rgb_encoder_state = 4; 189 190 typedef void (*rgb_matrix_f)(void); 191 192 const rgb_matrix_f rgb_matrix_functions[6][2] = { 193 { rgb_matrix_increase_hue, rgb_matrix_decrease_hue }, 194 { rgb_matrix_increase_sat, rgb_matrix_decrease_sat }, 195 { rgb_matrix_increase_val, rgb_matrix_decrease_val }, 196 { rgb_matrix_increase_speed, rgb_matrix_decrease_speed }, 197 { rgb_matrix_step, rgb_matrix_step_reverse }, 198 { rgb_matrix_increase_flags, rgb_matrix_decrease_flags } 199 }; 200 #endif 201 202 #ifdef ENCODER_ENABLE 203 204 static pin_t encoders_pad_a[] = ENCODER_A_PINS; 205 #define NUMBER_OF_ENCODERS ARRAY_SIZE(encoders_pad_a) 206 207 const uint16_t PROGMEM encoders[][NUMBER_OF_ENCODERS * 2][2] = { 208 [_QWERTY] = ENCODER_LAYOUT( 209 KC_VOLU, KC_VOLD, 210 KC_VOLU, KC_VOLD 211 ), 212 [_COLEMAK] = ENCODER_LAYOUT( 213 _______, _______, 214 _______, _______ 215 ), 216 [_FN] = ENCODER_LAYOUT( 217 _______, _______, 218 _______, _______ 219 ), 220 [_ADJ] = ENCODER_LAYOUT( 221 _______, _______, 222 _______, _______ 223 ) 224 }; 225 226 bool encoder_update_user(uint8_t index, bool clockwise) { 227 if (!is_keyboard_master()) 228 return true; 229 230 #ifdef RGB_OLED_MENU 231 if (index == RGB_OLED_MENU) { 232 (*rgb_matrix_functions[rgb_encoder_state][clockwise])(); 233 } else 234 #endif 235 { 236 uint8_t layer = get_highest_layer(layer_state); 237 uint16_t keycode = pgm_read_word(&encoders[layer][index][clockwise]); 238 while (keycode == KC_TRANSPARENT && layer > 0) 239 { 240 layer--; 241 if ((layer_state & (1 << layer)) != 0) 242 keycode = pgm_read_word(&encoders[layer][index][clockwise]); 243 } 244 if (keycode != KC_TRANSPARENT) 245 tap_code16(keycode); 246 } 247 return true; 248 } 249 #endif 250 251 bool process_record_user(uint16_t keycode, keyrecord_t *record) { 252 static uint16_t reset_timer; 253 switch (keycode) { 254 case RGBRST: 255 #if defined(RGBLIGHT_ENABLE) 256 if (record->event.pressed) { 257 eeconfig_update_rgblight_default(); 258 rgblight_enable(); 259 } 260 #elif defined(RGB_MATRIX_ENABLE) 261 if (record->event.pressed) { 262 eeconfig_update_rgb_matrix_default(); 263 } 264 #endif 265 return false; 266 case QK_BOOT: 267 if (record->event.pressed) { 268 reset_timer = timer_read(); 269 } else { 270 if (timer_elapsed(reset_timer) >= 500) { 271 reset_keyboard(); 272 } 273 } 274 return false; 275 #if defined(RGB_MATRIX_ENABLE) && defined(KEYBOARD_rgbkb_sol_rev2) 276 case QK_RGB_MATRIX_TOGGLE: 277 if (record->event.pressed) { 278 rgb_matrix_increase_flags(); 279 } 280 return false; 281 #endif 282 case RGB_MENU: 283 #ifdef RGB_OLED_MENU 284 if (record->event.pressed) { 285 if (get_mods() & MOD_MASK_SHIFT) { 286 rgb_encoder_state = (rgb_encoder_state - 1); 287 if (rgb_encoder_state > 5) { 288 rgb_encoder_state = 5; 289 } 290 } else { 291 rgb_encoder_state = (rgb_encoder_state + 1) % 6; 292 } 293 } 294 #endif 295 return false; 296 } 297 return true; 298 } 299 300 // OLED Driver Logic 301 #ifdef OLED_ENABLE 302 oled_rotation_t oled_init_user(oled_rotation_t rotation) { 303 if (is_keyboard_master()) 304 return OLED_ROTATION_270; 305 return OLED_ROTATION_180; 306 } 307 308 static void render_logo(void) { 309 static const char PROGMEM sol_logo[] = { 310 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94, 311 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4, 312 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0 313 }; 314 oled_write_P(sol_logo, false); 315 } 316 317 static void render_status(void) { 318 // Render to mode icon 319 static const char PROGMEM sol_icon[] = { 320 0x9b,0x9c,0x9d,0x9e,0x9f, 321 0xbb,0xbc,0xbd,0xbe,0xbf, 322 0xdb,0xdc,0xdd,0xde,0xdf,0 323 }; 324 oled_write_P(sol_icon, false); 325 326 // Define layers here 327 oled_write_P(PSTR("Layer"), false); 328 uint8_t layer = get_highest_layer(layer_state|default_layer_state); 329 switch (layer) { 330 case _QWERTY: 331 oled_write_P(PSTR("BASE "), false); 332 break; 333 case _COLEMAK: 334 oled_write_P(PSTR("CLMK "), false); 335 break; 336 case _FN: 337 oled_write_P(PSTR("FN "), false); 338 break; 339 case _ADJ: 340 oled_write_P(PSTR("ADJ "), false); 341 break; 342 default: 343 oled_write_P(PSTR("UNDEF"), false); 344 } 345 346 // Host Keyboard LED Status 347 led_t led_state = host_keyboard_led_state(); 348 oled_write_P(PSTR("-----"), false); 349 oled_write_P(led_state.num_lock ? PSTR("NUMLK") : PSTR(" "), false); 350 oled_write_P(led_state.caps_lock ? PSTR("CAPLK") : PSTR(" "), false); 351 oled_write_P(led_state.scroll_lock ? PSTR("SCRLK") : PSTR(" "), false); 352 353 #ifdef RGB_OLED_MENU 354 static char buffer[31] = { 0 }; 355 snprintf(buffer, sizeof(buffer), "h%3d s%3d v%3d s%3d m%3d e%3d ", rgb_matrix_config.hsv.h, rgb_matrix_config.hsv.s, rgb_matrix_config.hsv.v, rgb_matrix_config.speed, rgb_matrix_config.mode, rgb_matrix_get_flags()); 356 buffer[4 + rgb_encoder_state * 5] = '<'; 357 358 oled_write_P(PSTR("-----"), false); 359 oled_write(buffer, false); 360 #endif 361 } 362 363 bool oled_task_user(void) { 364 if (is_keyboard_master()) { 365 render_status(); 366 } else { 367 render_logo(); 368 oled_scroll_left(); 369 } 370 return false; 371 } 372 373 #endif