keymap.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. /* Copyright 2019 Leo Batyuk
  2. * Copyright 2020 Drashna Jaelre <@drashna>
  3. * Copyright 2020 @ben_roe (keycapsss.com)
  4. *
  5. * This program is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation, either version 2 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. #include QMK_KEYBOARD_H
  19. enum layers {
  20. _QWERTY,
  21. _LOWER,
  22. _RAISE,
  23. _ADJUST,
  24. };
  25. #define RAISE MO(_RAISE)
  26. #define LOWER MO(_LOWER)
  27. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  28. /* QWERTY
  29. * ,--------------------------------------------. ,----------------------------------------------.
  30. * | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` |
  31. * |---------+------+------+------+------+------| |------+------+------+------+------+-----------|
  32. * | Tab | Q | W | E | R | T | | Y | U | I | O | P | - |
  33. * |---------+------+------+------+------+------| |------+------+------+------+------+-----------|
  34. * | LShift | A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' |
  35. * |---------+------+------+------+------+------| [ | | ] |------+------+------+------+------+-----------|
  36. * | LCTRL | Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift/Enter|
  37. * `-------------------------------------------| / \ \-----------------------------------------------'
  38. * | LCTRL| LGUI | LALT |LOWER| Space / \Enter \ |RAISE |BackSP| RGUI | RALT |
  39. * `----------------------------------' '------------------------------------'
  40. */
  41. [_QWERTY] = LAYOUT(
  42. KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV,
  43. KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS,
  44. KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
  45. KC_LCTRL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LBRC, KC_RBRC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, RSFT_T(KC_ENT),
  46. KC_LCTL, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_ENT, RAISE, KC_BSPC, KC_RGUI, KC_RALT
  47. ),
  48. /* LOWER
  49. * ,-------------------------------------------. ,-----------------------------------------.
  50. * | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
  51. * |--------+------+------+------+------+------| |------+------+------+------+------+------|
  52. * | | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | F12 |
  53. * |--------+------+------+------+------+------| |------+------+------+------+------+------|
  54. * | ` | ! | @ | # | $ | % |-------. ,-------| ^ | & | * | ( | ) | ~ |
  55. * |--------+------+------+------+------+------| | | |------+------+------+------+------+------|
  56. * | | | | | | |-------| |-------| | _ | + | { | } | \ |
  57. * `-------------------------------------------| / \ \-----------------------------------------------'
  58. * | LCTRL| LGUI | LALT |LOWER| Space / \Enter \ |RAISE |BackSP| RGUI | RALT |
  59. * `----------------------------------' '------------------------------------'
  60. */
  61. [_LOWER] = LAYOUT(
  62. _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
  63. _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_F12,
  64. KC_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_TILD,
  65. _______, _______, _______, _______, _______, _______, _______, _______, XXXXXXX, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_BSLS,
  66. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  67. ),
  68. /* RAISE
  69. * ,-----------------------------------------. ,-----------------------------------------.
  70. * | | | | | | | | | | | | | |
  71. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  72. * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | |
  73. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  74. * | F1 | F2 | F3 | F4 | F5 | F6 |-------. ,-------| | Left | Down | Up |Right | |
  75. * |------+------+------+------+------+------| [ | | ] |------+------+------+------+------+------|
  76. * | F7 | F8 | F9 | F10 | F11 | F12 |-------| |-------| + | - | = | [ | ] | \ |
  77. * `-----------------------------------------/ / \ \-----------------------------------------'
  78. * | LCTRL| LGUI | LALT |LOWER| Space / \Enter \ |RAISE |BackSP| RGUI | RALT |
  79. * `----------------------------------' '------------------------------------'
  80. */
  81. [_RAISE] = LAYOUT(
  82. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  83. KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______,
  84. KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX,
  85. KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, KC_PLUS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
  86. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  87. ),
  88. /* ADJUST (Press LOWER and RAISE together)
  89. * ,-----------------------------------------. ,-----------------------------------------.
  90. * |RESET | | | | | | | | | | | | |
  91. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  92. * |RGB ON| HUE+ | SAT+ | VAL+ | | | | PREV | PLAY | NEXT | | | |
  93. * |------+------+------+------+------+------| |------+------+------+------+------+------|
  94. * | MODE | HUE- | SAT- | VAL- | | |-------. ,-------| VOL+ | MUTE | VOL- | | | |
  95. * |------+------+------+------+------+------| | | |------+------+------+------+------+------|
  96. * | | | | | | |-------| |-------| | | | | | |
  97. * `-----------------------------------------/ / \ \-----------------------------------------'
  98. * |LCTRL| LGUI | LALT |LOWER| Space / \Enter \ |RAISE |BackSP| RGUI | RALT |
  99. * `----------------------------------' '------------------------------------'
  100. */
  101. [_ADJUST] = LAYOUT(
  102. RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  103. RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX, XXXXXXX,
  104. RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, KC_VOLU, KC_MUTE, KC_VOLD, XXXXXXX, XXXXXXX, XXXXXXX,
  105. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  106. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  107. )
  108. };
  109. layer_state_t layer_state_set_user(layer_state_t state) {
  110. state = update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST);
  111. return state;
  112. }
  113. #ifdef OLED_DRIVER_ENABLE
  114. oled_rotation_t oled_init_user(oled_rotation_t rotation) {
  115. if (is_keyboard_master()) {
  116. return OLED_ROTATION_270;
  117. } else {
  118. return OLED_ROTATION_270;
  119. }
  120. }
  121. void render_space(void) {
  122. oled_write_P(PSTR(" "), false);
  123. }
  124. void render_mod_status_gui_alt(uint8_t modifiers) {
  125. static const char PROGMEM gui_off_1[] = {0x85, 0x86, 0};
  126. static const char PROGMEM gui_off_2[] = {0xa5, 0xa6, 0};
  127. static const char PROGMEM gui_on_1[] = {0x8d, 0x8e, 0};
  128. static const char PROGMEM gui_on_2[] = {0xad, 0xae, 0};
  129. static const char PROGMEM alt_off_1[] = {0x87, 0x88, 0};
  130. static const char PROGMEM alt_off_2[] = {0xa7, 0xa8, 0};
  131. static const char PROGMEM alt_on_1[] = {0x8f, 0x90, 0};
  132. static const char PROGMEM alt_on_2[] = {0xaf, 0xb0, 0};
  133. // fillers between the modifier icons bleed into the icon frames
  134. static const char PROGMEM off_off_1[] = {0xc5, 0};
  135. static const char PROGMEM off_off_2[] = {0xc6, 0};
  136. static const char PROGMEM on_off_1[] = {0xc7, 0};
  137. static const char PROGMEM on_off_2[] = {0xc8, 0};
  138. static const char PROGMEM off_on_1[] = {0xc9, 0};
  139. static const char PROGMEM off_on_2[] = {0xca, 0};
  140. static const char PROGMEM on_on_1[] = {0xcb, 0};
  141. static const char PROGMEM on_on_2[] = {0xcc, 0};
  142. if(modifiers & MOD_MASK_GUI) {
  143. oled_write_P(gui_on_1, false);
  144. } else {
  145. oled_write_P(gui_off_1, false);
  146. }
  147. if ((modifiers & MOD_MASK_GUI) && (modifiers & MOD_MASK_ALT)) {
  148. oled_write_P(on_on_1, false);
  149. } else if(modifiers & MOD_MASK_GUI) {
  150. oled_write_P(on_off_1, false);
  151. } else if(modifiers & MOD_MASK_ALT) {
  152. oled_write_P(off_on_1, false);
  153. } else {
  154. oled_write_P(off_off_1, false);
  155. }
  156. if(modifiers & MOD_MASK_ALT) {
  157. oled_write_P(alt_on_1, false);
  158. } else {
  159. oled_write_P(alt_off_1, false);
  160. }
  161. if(modifiers & MOD_MASK_GUI) {
  162. oled_write_P(gui_on_2, false);
  163. } else {
  164. oled_write_P(gui_off_2, false);
  165. }
  166. if (modifiers & MOD_MASK_GUI & MOD_MASK_ALT) {
  167. oled_write_P(on_on_2, false);
  168. } else if(modifiers & MOD_MASK_GUI) {
  169. oled_write_P(on_off_2, false);
  170. } else if(modifiers & MOD_MASK_ALT) {
  171. oled_write_P(off_on_2, false);
  172. } else {
  173. oled_write_P(off_off_2, false);
  174. }
  175. if(modifiers & MOD_MASK_ALT) {
  176. oled_write_P(alt_on_2, false);
  177. } else {
  178. oled_write_P(alt_off_2, false);
  179. }
  180. }
  181. void render_mod_status_ctrl_shift(uint8_t modifiers) {
  182. static const char PROGMEM ctrl_off_1[] = {0x89, 0x8a, 0};
  183. static const char PROGMEM ctrl_off_2[] = {0xa9, 0xaa, 0};
  184. static const char PROGMEM ctrl_on_1[] = {0x91, 0x92, 0};
  185. static const char PROGMEM ctrl_on_2[] = {0xb1, 0xb2, 0};
  186. static const char PROGMEM shift_off_1[] = {0x8b, 0x8c, 0};
  187. static const char PROGMEM shift_off_2[] = {0xab, 0xac, 0};
  188. static const char PROGMEM shift_on_1[] = {0xcd, 0xce, 0};
  189. static const char PROGMEM shift_on_2[] = {0xcf, 0xd0, 0};
  190. // fillers between the modifier icons bleed into the icon frames
  191. static const char PROGMEM off_off_1[] = {0xc5, 0};
  192. static const char PROGMEM off_off_2[] = {0xc6, 0};
  193. static const char PROGMEM on_off_1[] = {0xc7, 0};
  194. static const char PROGMEM on_off_2[] = {0xc8, 0};
  195. static const char PROGMEM off_on_1[] = {0xc9, 0};
  196. static const char PROGMEM off_on_2[] = {0xca, 0};
  197. static const char PROGMEM on_on_1[] = {0xcb, 0};
  198. static const char PROGMEM on_on_2[] = {0xcc, 0};
  199. if(modifiers & MOD_MASK_CTRL) {
  200. oled_write_P(ctrl_on_1, false);
  201. } else {
  202. oled_write_P(ctrl_off_1, false);
  203. }
  204. if ((modifiers & MOD_MASK_CTRL) && (modifiers & MOD_MASK_SHIFT)) {
  205. oled_write_P(on_on_1, false);
  206. } else if(modifiers & MOD_MASK_CTRL) {
  207. oled_write_P(on_off_1, false);
  208. } else if(modifiers & MOD_MASK_SHIFT) {
  209. oled_write_P(off_on_1, false);
  210. } else {
  211. oled_write_P(off_off_1, false);
  212. }
  213. if(modifiers & MOD_MASK_SHIFT) {
  214. oled_write_P(shift_on_1, false);
  215. } else {
  216. oled_write_P(shift_off_1, false);
  217. }
  218. if(modifiers & MOD_MASK_CTRL) {
  219. oled_write_P(ctrl_on_2, false);
  220. } else {
  221. oled_write_P(ctrl_off_2, false);
  222. }
  223. if (modifiers & MOD_MASK_CTRL & MOD_MASK_SHIFT) {
  224. oled_write_P(on_on_2, false);
  225. } else if(modifiers & MOD_MASK_CTRL) {
  226. oled_write_P(on_off_2, false);
  227. } else if(modifiers & MOD_MASK_SHIFT) {
  228. oled_write_P(off_on_2, false);
  229. } else {
  230. oled_write_P(off_off_2, false);
  231. }
  232. if(modifiers & MOD_MASK_SHIFT) {
  233. oled_write_P(shift_on_2, false);
  234. } else {
  235. oled_write_P(shift_off_2, false);
  236. }
  237. }
  238. void render_logo(void) {
  239. static const char PROGMEM corne_logo[] = {
  240. 0xA0, 0xA1, 0xA2, 0xA3, 0xA4,
  241. 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0};
  242. oled_write_P(corne_logo, false);
  243. // oled_write_P(PSTR("Kimiko"), false);
  244. }
  245. void render_layer_state(void) {
  246. static const char PROGMEM default_layer[] = {
  247. 0x20, 0x94, 0x95, 0x96, 0x20,
  248. 0x20, 0xb4, 0xb5, 0xb6, 0x20,
  249. 0x20, 0xd4, 0xd5, 0xd6, 0x20, 0};
  250. static const char PROGMEM raise_layer[] = {
  251. 0x20, 0x97, 0x98, 0x99, 0x20,
  252. 0x20, 0xb7, 0xb8, 0xb9, 0x20,
  253. 0x20, 0xd7, 0xd8, 0xd9, 0x20, 0};
  254. static const char PROGMEM lower_layer[] = {
  255. 0x20, 0x9a, 0x9b, 0x9c, 0x20,
  256. 0x20, 0xba, 0xbb, 0xbc, 0x20,
  257. 0x20, 0xda, 0xdb, 0xdc, 0x20, 0};
  258. static const char PROGMEM adjust_layer[] = {
  259. 0x20, 0x9d, 0x9e, 0x9f, 0x20,
  260. 0x20, 0xbd, 0xbe, 0xbf, 0x20,
  261. 0x20, 0xdd, 0xde, 0xdf, 0x20, 0};
  262. if(layer_state_is(_ADJUST)) {
  263. oled_write_P(adjust_layer, false);
  264. } else if(layer_state_is(_LOWER)) {
  265. oled_write_P(lower_layer, false);
  266. } else if(layer_state_is(_RAISE)) {
  267. oled_write_P(raise_layer, false);
  268. } else {
  269. oled_write_P(default_layer, false);
  270. }
  271. }
  272. void render_status_main(void) {
  273. render_space();
  274. render_space();
  275. render_logo();
  276. render_space();
  277. render_layer_state();
  278. render_space();
  279. render_mod_status_gui_alt(get_mods()|get_oneshot_mods());
  280. render_mod_status_ctrl_shift(get_mods()|get_oneshot_mods());
  281. }
  282. void render_status_secondary(void) {
  283. render_space();
  284. render_space();
  285. render_logo();
  286. render_space();
  287. }
  288. void oled_task_user(void) {
  289. if (is_keyboard_master()) {
  290. render_status_main(); // Renders the current keyboard state (layer, lock, caps, scroll, etc)
  291. } else {
  292. render_status_secondary();
  293. }
  294. }
  295. #endif
  296. #ifdef ENCODER_ENABLE
  297. bool encoder_update_user(uint8_t index, bool clockwise) {
  298. // Encoder on master side
  299. if (index == 0) {
  300. switch (get_highest_layer(layer_state)) {
  301. // If the Default (QWERTY) layer is active
  302. case _QWERTY:
  303. // Arrow Up/Down
  304. if (clockwise) {
  305. tap_code(KC_DOWN);
  306. } else {
  307. tap_code(KC_UP);
  308. }
  309. break;
  310. // If the RAISE layer is active
  311. case _RAISE:
  312. // Switch browser tabs
  313. if (clockwise) {
  314. tap_code16(LCTL(KC_TAB));
  315. } else {
  316. tap_code16(RCS(KC_TAB));
  317. }
  318. break;
  319. // If the ADJUST layer is active
  320. case _ADJUST:
  321. // RGB brightness up/down
  322. if (clockwise) {
  323. rgblight_decrease_val(); // tap_code(RGB_VAD);
  324. } else {
  325. rgblight_increase_val(); // tap_code(RGB_VAI);
  326. }
  327. break;
  328. }
  329. }
  330. // Encoder on slave side
  331. else if (index == 1) {
  332. switch (get_highest_layer(layer_state)) {
  333. // If the Default (QWERTY) layer is active
  334. case _QWERTY:
  335. // Scroll by Word
  336. if (clockwise) {
  337. tap_code16(LCTL(KC_RGHT));
  338. } else {
  339. tap_code16(LCTL(KC_LEFT));
  340. }
  341. break;
  342. // If the LOWER layer is active
  343. case _LOWER:
  344. // Volume up/down
  345. if (clockwise) {
  346. tap_code(KC_VOLU);
  347. } else {
  348. tap_code(KC_VOLD);
  349. }
  350. break;
  351. // If the ADJUST layer is active
  352. case _ADJUST:
  353. // RGB hue up/down
  354. if (clockwise) {
  355. // tap_code(RGB_HUI);
  356. rgblight_increase_hue();
  357. } else {
  358. // tap_code(RGB_HUD);
  359. rgblight_decrease_hue();
  360. }
  361. break;
  362. }
  363. }
  364. return true;
  365. }
  366. #endif // ENCODER_ENABLE