You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

367 lines
11 KiB

  1. #include QMK_KEYBOARD_H
  2. #include "led.h"
  3. #include <print.h>
  4. #ifdef RGBLIGHT_ENABLE
  5. #include "rgblight.h"
  6. #endif
  7. // Each layer gets a name for readability, which is then used in the keymap matrix below.
  8. enum cospad_layers {
  9. _QWERTY_LAYER,
  10. _QWERTZ_LAYER,
  11. _COLEMA_LAYER,
  12. _DVORAK_LAYER,
  13. _QWERTY_LOWER_LAYER,
  14. _QWERTZ_LOWER_LAYER,
  15. _COLEMA_LOWER_LAYER,
  16. _DVORAK_LOWER_LAYER,
  17. _RAISE_LAYER,
  18. _ALTER_LAYER,
  19. };
  20. // To switch the default layer used for the layout, there are special keycodes.
  21. // Which onces detected below serve to switch it.
  22. enum cospad_keycodes {
  23. QWERTY = SAFE_RANGE,
  24. QWERTZ,
  25. COLEMAK,
  26. DVORAK
  27. };
  28. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  29. /* Keymap _QWERTY_LAYER: Default layer
  30. * ,-----------------------.
  31. * | T | G | B | Alt |
  32. * |-----|-----|-----|-----|
  33. * | R | F | V | LOW |
  34. * |-----|-----|-----|-----|
  35. * | E | D | C | |
  36. * |-----|-----|-----| Spc |
  37. * | W | S | X | |
  38. * |-----|-----|-----|-----|
  39. * | Q | A | Z | RAI |
  40. * |-----|-----|-----|-----|
  41. * | Esc | Tab | Sft | Ctl |
  42. * `-----------------------'
  43. *
  44. * And it's LOWER layer
  45. * ,-----------------------.
  46. * | P | ; | / | Alt |
  47. * |-----|-----|-----|-----|
  48. * | O | L | . | LOW |
  49. * |-----|-----|-----|-----|
  50. * | I | K | , | |
  51. * |-----|-----|-----| Ent |
  52. * | U | J | M | |
  53. * |-----|-----|-----|-----|
  54. * | Y | H | N | RAI |
  55. * |-----|-----|-----|-----|
  56. * | Esc | Tab | Sft | Ctl |
  57. * `-----------------------'
  58. */
  59. [_QWERTY_LAYER] = LAYOUT_gamepad_6x4(
  60. KC_T, KC_G, KC_B, KC_LALT, \
  61. KC_R, KC_F, KC_V, MO(_QWERTY_LOWER_LAYER),\
  62. KC_E, KC_D, KC_C, \
  63. KC_W, KC_S, KC_X, KC_SPACE, \
  64. KC_Q, KC_A, KC_Z, MO(_RAISE_LAYER),\
  65. KC_GESC, KC_TAB, KC_LSFT, KC_LCTRL),
  66. [_QWERTY_LOWER_LAYER] = LAYOUT_gamepad_6x4(
  67. KC_P, KC_SCLN, KC_SLSH, KC_LALT, \
  68. KC_O, KC_L, KC_DOT, _______, \
  69. KC_I, KC_K, KC_COMM, \
  70. KC_U, KC_J, KC_M, KC_ENTER, \
  71. KC_Y, KC_H, KC_N, _______, \
  72. _______, _______, _______, _______),
  73. /* Keymap _QWERTZ_LAYER: Alternate default layer
  74. * ,-----------------------.
  75. * | T | G | B | Alt |
  76. * |-----|-----|-----|-----|
  77. * | R | F | V | LOW |
  78. * |-----|-----|-----|-----|
  79. * | E | D | C | |
  80. * |-----|-----|-----| Spc |
  81. * | W | S | X | |
  82. * |-----|-----|-----|-----|
  83. * | Q | A | Y | RAI |
  84. * |-----|-----|-----|-----|
  85. * | Esc | Tab | Sft | Ctl |
  86. * `-----------------------'
  87. *
  88. * And it's LOWER layer
  89. * ,-----------------------.
  90. * | P | ; | / | Alt |
  91. * |-----|-----|-----|-----|
  92. * | O | L | > | LOW |
  93. * |-----|-----|-----|-----|
  94. * | I | K | < | |
  95. * |-----|-----|-----| Ent |
  96. * | U | J | M | |
  97. * |-----|-----|-----|-----|
  98. * | Z | H | N | RAI |
  99. * |-----|-----|-----|-----|
  100. * | Esc | Tab | Sft | Ctl |
  101. * `-----------------------'
  102. */
  103. [_QWERTZ_LAYER] = LAYOUT_gamepad_6x4(
  104. KC_T, KC_G, KC_B, KC_LALT, \
  105. KC_R, KC_F, KC_V, MO(_QWERTZ_LOWER_LAYER),\
  106. KC_E, KC_D, KC_C, \
  107. KC_W, KC_S, KC_X, KC_SPACE, \
  108. KC_Q, KC_A, KC_Y, MO(_RAISE_LAYER),\
  109. KC_GESC, KC_TAB, KC_LSFT, KC_LCTRL),
  110. [_QWERTZ_LOWER_LAYER] = LAYOUT_gamepad_6x4(
  111. KC_P, KC_SCLN, KC_SLSH, KC_LALT, \
  112. KC_O, KC_L, KC_DOT, _______, \
  113. KC_I, KC_K, KC_COMM, \
  114. KC_U, KC_J, KC_M, KC_ENTER, \
  115. KC_Z, KC_H, KC_N, _______, \
  116. _______, _______, _______, _______),
  117. /* Keymap _COLEMA_LAYER: Alternate default layer
  118. * ,-----------------------.
  119. * | G | D | B | Alt |
  120. * |-----|-----|-----|-----|
  121. * | P | T | V | LOW |
  122. * |-----|-----|-----|-----|
  123. * | F | S | C | |
  124. * |-----|-----|-----| Spc |
  125. * | W | R | X | |
  126. * |-----|-----|-----|-----|
  127. * | Q | A | Z | RAI |
  128. * |-----|-----|-----|-----|
  129. * | Esc | Tab | Sft | Ctl |
  130. * `-----------------------'
  131. *
  132. * And it's LOWER layer
  133. * ,-----------------------.
  134. * | ; | O | / | Alt |
  135. * |-----|-----|-----|-----|
  136. * | Y | I | . | LOW |
  137. * |-----|-----|-----|-----|
  138. * | U | E | , | |
  139. * |-----|-----|-----| Ent |
  140. * | L | N | M | |
  141. * |-----|-----|-----|-----|
  142. * | J | H | K | RAI |
  143. * |-----|-----|-----|-----|
  144. * | Esc | Tab | Sft | Ctl |
  145. * `-----------------------'
  146. */
  147. [_COLEMA_LAYER] = LAYOUT_gamepad_6x4(
  148. KC_T, KC_D, KC_B, KC_LALT, \
  149. KC_R, KC_T, KC_V, MO(_COLEMA_LOWER_LAYER),\
  150. KC_E, KC_S, KC_C, \
  151. KC_W, KC_R, KC_X, KC_SPACE, \
  152. KC_Q, KC_A, KC_Z, MO(_RAISE_LAYER),\
  153. KC_GESC, KC_TAB, KC_LSFT, KC_LCTRL),
  154. [_COLEMA_LOWER_LAYER] = LAYOUT_gamepad_6x4(
  155. KC_SCLN, KC_O, KC_SLSH, _______, \
  156. KC_Y, KC_I, KC_DOT, _______, \
  157. KC_U, KC_E, KC_COMM, \
  158. KC_L, KC_N, KC_M, KC_ENTER, \
  159. KC_J, KC_H, KC_K, _______, \
  160. KC_F, KC_G, _______, _______),
  161. /* Keymap _DVORAK_LAYER: Alternate default layer
  162. * ,-----------------------.
  163. * | Y | I | X | Alt |
  164. * |-----|-----|-----|-----|
  165. * | P | U | K | LOW |
  166. * |-----|-----|-----|-----|
  167. * | . | E | J | |
  168. * |-----|-----|-----| Spc |
  169. * | , | O | Q | |
  170. * |-----|-----|-----|-----|
  171. * | ' | A | ; | RAI |
  172. * |-----|-----|-----|-----|
  173. * | Esc | Tab | Sft | Ctl |
  174. * `-----------------------'
  175. *
  176. * And it's LOWER layer
  177. * ,-----------------------.
  178. * | L | S | Z | Alt |
  179. * |-----|-----|-----|-----|
  180. * | R | N | V | LOW |
  181. * |-----|-----|-----|-----|
  182. * | C | T | W | |
  183. * |-----|-----|-----| Ent |
  184. * | G | H | M | |
  185. * |-----|-----|-----|-----|
  186. * | F | D | B | RAI |
  187. * |-----|-----|-----|-----|
  188. * | Esc | Tab | Sft | Ctl |
  189. * `-----------------------'
  190. */
  191. [_DVORAK_LAYER] = LAYOUT_gamepad_6x4(
  192. KC_Y, KC_I, KC_X, KC_LALT, \
  193. KC_P, KC_U, KC_K, MO(_DVORAK_LOWER_LAYER),\
  194. KC_DOT, KC_E, KC_J, \
  195. KC_COMM, KC_O, KC_A, KC_SPACE, \
  196. KC_QUOT, KC_A, KC_SCLN, MO(_RAISE_LAYER),\
  197. KC_GESC, KC_TAB, KC_LSFT, KC_LCTRL),
  198. [_DVORAK_LOWER_LAYER] = LAYOUT_gamepad_6x4(
  199. KC_L, KC_S, KC_Z, KC_LALT, \
  200. KC_R, KC_N, KC_V, _______, \
  201. KC_C, KC_T, KC_W, \
  202. KC_G, KC_H, KC_M, KC_ENTER,\
  203. KC_F, KC_D, KC_B, _______, \
  204. _______, _______, _______, _______),
  205. /* Keymap _RAISE_LAYER: Additional layer to access more
  206. * ,-----------------------.
  207. * | 5 | 0 | del | Alt |
  208. * |-----|-----|-----|-----|
  209. * | 4 | 9 | -> | LOW |
  210. * |-----|-----|-----|-----|
  211. * | 3 | 8 | <- | |
  212. * |-----|-----|-----| Spc |
  213. * | 2 | 7 | -> | |
  214. * |-----|-----|-----|-----|
  215. * | 1 | 6 | <- | RAI |
  216. * |-----|-----|-----|-----|
  217. * | Esc | Tab | Sft | Ctl |
  218. * `-----------------------'
  219. */
  220. [_RAISE_LAYER] = LAYOUT_gamepad_6x4(
  221. KC_5, KC_0, KC_BSPC, _______, \
  222. KC_4, KC_9, KC_RIGHT, _______, \
  223. KC_3, KC_8, KC_UP, \
  224. KC_2, KC_7, KC_DOWN, _______, \
  225. KC_1, KC_6, KC_LEFT, _______, \
  226. _______, _______, _______, _______),
  227. /* Keymap _ALTER_LAYER: Function layer used to control the Leds
  228. * and use media buttons
  229. * ,----------------------------------------.
  230. * | Val Dec | Bl Toggle | Qwertz | Super |
  231. * |---------|------------|---------|-------|
  232. * | Val Inc | Bl Off | Qwerty | |
  233. * |---------|------------|---------|-------|
  234. * | Sat Dec | Bl On | Colemak | |
  235. * |---------|------------|---------| |
  236. * | Sat Inc | RGB Toggle | Dvorak | |
  237. * |---------|------------|---------|-------|
  238. * | Hue Dec | RGB Next | Vol Dwn | |
  239. * |---------|------------|---------|-------|
  240. * | Hue Inc | RGB Prev | Vol Up | Reset |
  241. * `----------------------------------------'
  242. */
  243. [_ALTER_LAYER] = LAYOUT_gamepad_6x4(
  244. RGB_VAD, BL_TOGG, QWERTZ, KC_LGUI, \
  245. RGB_VAI, BL_OFF, QWERTY, _______, \
  246. RGB_SAD, BL_ON, COLEMAK, \
  247. RGB_SAI, RGB_TOG, DVORAK, _______, \
  248. RGB_HUD, RGB_MOD, KC_VOLD, _______, \
  249. RGB_HUI, RGB_RMOD, KC_VOLU, RESET),
  250. };
  251. // Makes sure to update the good tri-layer if a layer changes
  252. uint32_t layer_state_set_user(uint32_t state) {
  253. switch (biton32(default_layer_state)) {
  254. case _QWERTY_LAYER:
  255. state = update_tri_layer_state(state, _RAISE_LAYER, _QWERTY_LOWER_LAYER, _ALTER_LAYER);
  256. break;
  257. case _QWERTZ_LAYER:
  258. state = update_tri_layer_state(state, _RAISE_LAYER, _QWERTZ_LOWER_LAYER, _ALTER_LAYER);
  259. break;
  260. case _COLEMA_LAYER:
  261. state = update_tri_layer_state(state, _RAISE_LAYER, _COLEMA_LOWER_LAYER, _ALTER_LAYER);
  262. break;
  263. case _DVORAK_LAYER:
  264. state = update_tri_layer_state(state, _RAISE_LAYER, _DVORAK_LOWER_LAYER, _ALTER_LAYER);
  265. break;
  266. }
  267. return state;
  268. }
  269. // Makes the tri-layer
  270. uint32_t default_layer_state_set_kb(uint32_t state) {
  271. switch (biton32(state)) {
  272. case _QWERTY_LAYER:
  273. state = update_tri_layer_state(state, _RAISE_LAYER, _QWERTZ_LOWER_LAYER, _ALTER_LAYER);
  274. state = update_tri_layer_state(state, _RAISE_LAYER, _COLEMA_LOWER_LAYER, _ALTER_LAYER);
  275. state = update_tri_layer_state(state, _RAISE_LAYER, _DVORAK_LOWER_LAYER, _ALTER_LAYER);
  276. layer_move(_QWERTY_LAYER);
  277. break;
  278. case _QWERTZ_LAYER:
  279. state = update_tri_layer_state(state, _RAISE_LAYER, _QWERTY_LOWER_LAYER, _ALTER_LAYER);
  280. state = update_tri_layer_state(state, _RAISE_LAYER, _COLEMA_LOWER_LAYER, _ALTER_LAYER);
  281. state = update_tri_layer_state(state, _RAISE_LAYER, _DVORAK_LOWER_LAYER, _ALTER_LAYER);
  282. layer_move(_QWERTZ_LAYER);
  283. break;
  284. case _COLEMA_LAYER:
  285. state = update_tri_layer_state(state, _RAISE_LAYER, _QWERTY_LOWER_LAYER, _ALTER_LAYER);
  286. state = update_tri_layer_state(state, _RAISE_LAYER, _QWERTZ_LOWER_LAYER, _ALTER_LAYER);
  287. state = update_tri_layer_state(state, _RAISE_LAYER, _DVORAK_LOWER_LAYER, _ALTER_LAYER);
  288. layer_move(_COLEMA_LAYER);
  289. break;
  290. case _DVORAK_LAYER:
  291. state = update_tri_layer_state(state, _RAISE_LAYER, _QWERTY_LOWER_LAYER, _ALTER_LAYER);
  292. state = update_tri_layer_state(state, _RAISE_LAYER, _QWERTZ_LOWER_LAYER, _ALTER_LAYER);
  293. state = update_tri_layer_state(state, _RAISE_LAYER, _COLEMA_LOWER_LAYER, _ALTER_LAYER);
  294. layer_move(_DVORAK_LAYER);
  295. break;
  296. }
  297. return state;
  298. }
  299. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  300. switch (keycode) {
  301. case BL_TOGG:
  302. if (record->event.pressed) {
  303. cospad_bl_led_togg();
  304. }
  305. return false;
  306. case BL_ON:
  307. if (record->event.pressed) {
  308. cospad_bl_led_on();
  309. }
  310. return false;
  311. case BL_OFF:
  312. if (record->event.pressed) {
  313. cospad_bl_led_off();
  314. }
  315. return false;
  316. case QWERTY:
  317. if (record->event.pressed) {
  318. set_single_persistent_default_layer(_QWERTY_LAYER);
  319. print("switched to QWERTY layout\n");
  320. }
  321. return false;
  322. break;
  323. case QWERTZ:
  324. if (record->event.pressed) {
  325. set_single_persistent_default_layer(_QWERTZ_LAYER);
  326. }
  327. return false;
  328. break;
  329. case COLEMAK:
  330. if (record->event.pressed) {
  331. set_single_persistent_default_layer(_COLEMA_LAYER);
  332. }
  333. return false;
  334. break;
  335. case DVORAK:
  336. if (record->event.pressed) {
  337. set_single_persistent_default_layer(_DVORAK_LAYER);
  338. }
  339. return false;
  340. break;
  341. default:
  342. return true;
  343. }
  344. }