keymap.c 14 KB

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