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.

286 lines
13 KiB

  1. // Netable differences vs. the default firmware for the ErgoDox EZ:
  2. // 1. The Cmd key is now on the right side, making Cmd+Space easier.
  3. // 2. The media keys work on OSX (But not on Windows).
  4. #include QMK_KEYBOARD_H
  5. #include "action_layer.h"
  6. enum keyboard_layers {
  7. QWERTY = 0, // default layer
  8. NUMS, // numbers + symbols
  9. MOVE, // vim-like movement
  10. AFK,
  11. };
  12. enum custom_keycodes {
  13. BF_AFK = SAFE_RANGE,
  14. BF_WAKE,
  15. BF_NUMS,
  16. BF_MOVE,
  17. };
  18. // Dashes (macOS)
  19. #define KC_NDSH LALT(KC_MINS)
  20. #define KC_MDSH S(LALT(KC_MINS))
  21. #define VIM_B LALT(KC_LEFT)
  22. #define VIM_W LALT(KC_RIGHT)
  23. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  24. /* Keymap 0: Basic layer
  25. *
  26. * ,--------------------------------------------------. ,--------------------------------------------------.
  27. * | | | | | | | | | Power| | | | | | |
  28. * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
  29. * | Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | \ |
  30. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  31. * |Ctrl/Esc| A | S | D | F | G |------| |------| H | J | K | L | ; | ' |
  32. * |--------+------+------+------+------+------| ( | | ) |------+------+------+------+------+--------|
  33. * | LShift | Z | X | C | V | B | | | | N | M | , | . | / | RShift |
  34. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  35. * |Hyper | F19 |AltShf| | NUMS | | NUMS | |Ctrl/E| F19 | Meh |
  36. * `----------------------------------' `----------------------------------'
  37. * ,-------------. ,-------------.
  38. * | V- | V+ | | Next |Play/Pau|
  39. * ,------|------|------| |------+--------+------.
  40. * | | | Vx | | Prev | | |
  41. * | Space| LGUI |------| |------| Bsp | Enter|
  42. * | | | LAlt | | LAlt | | |
  43. * `--------------------' `----------------------'
  44. */
  45. // If it accepts an argument (i.e, is a function), it doesn't need KC_.
  46. // Otherwise, it needs KC_*
  47. [QWERTY] = LAYOUT_ergodox( // layer 0 : default
  48. // left hand
  49. KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
  50. KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC,
  51. CTL_T(KC_ESC),KC_A, KC_S, KC_D, KC_F, KC_G,
  52. KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, S(KC_9),
  53. ALL_T(KC_NO), KC_F19,KC_LALT,KC_NO, BF_NUMS,
  54. KC_VOLD,KC_VOLU,
  55. KC_MUTE,
  56. KC_SPC,KC_LGUI,KC_LALT,
  57. // right hand
  58. BF_AFK, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
  59. KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
  60. KC_H, KC_J, KC_K, KC_L, LT(MOVE, KC_SCLN),KC_QUOT,
  61. S(KC_0), KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT,
  62. BF_NUMS,KC_NO, CTL_T(KC_ESC),KC_F19, MEH_T(KC_NO),
  63. KC_MNXT,KC_MPLY,
  64. KC_MPRV,
  65. KC_LALT,KC_BSPC,KC_ENT
  66. ),
  67. /* Keymap: Number Layer
  68. *
  69. * ,--------------------------------------------------. ,--------------------------------------------------.
  70. * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | |
  71. * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
  72. * | -` | ` | | | | | | | | | | | - | = | |
  73. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  74. * | | 1 | 2 | 3 | 4 | 5 |------| |------| 6 | 7 | 8 | 9 | 0 | |
  75. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  76. * | | F11 | F12 | F13 | F14 | F15 | | | | F16 | F17 | F18 | F19 | F20 | |
  77. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  78. * | | | | | | | | | | | |
  79. * `----------------------------------' `----------------------------------'
  80. * ,-------------. ,-------------.
  81. * | | | | | |
  82. * ,------|------|------| |------+------+------.
  83. * | | | | | | | |
  84. * | | |------| |------| | |
  85. * | | | | | | | |
  86. * `--------------------' `--------------------'
  87. */
  88. [NUMS] = LAYOUT_ergodox(
  89. // left hand
  90. KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
  91. LGUI(KC_GRV),KC_GRV, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,
  92. KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5,
  93. KC_TRNS, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_TRNS,
  94. KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  95. KC_TRNS,KC_TRNS,
  96. KC_TRNS,
  97. KC_TRNS,KC_TRNS,KC_TRNS,
  98. // right hand
  99. KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS,
  100. KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_MINS, KC_EQL, KC_TRNS,
  101. KC_6 , KC_7, KC_8, KC_9, KC_0, KC_TRNS,
  102. KC_TRNS, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_TRNS,
  103. KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  104. KC_TRNS, KC_TRNS,
  105. KC_TRNS,
  106. KC_TRNS, KC_TRNS, KC_TRNS
  107. ),
  108. /* Keymap 2: Movement Layer
  109. *
  110. * ,--------------------------------------------------. ,--------------------------------------------------.
  111. * | | | | | | | | | | | | | | | |
  112. * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
  113. * | | |VIM W | | | | | | | | | | | | |
  114. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  115. * | | | HOME | PGUP | PGDW | END |------| |------| | | | | | |
  116. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  117. * | | | | | |VIM B | | | | | | | | | |
  118. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  119. * | | | | | | | | | | | |
  120. * `----------------------------------' `----------------------------------'
  121. * ,-------------. ,-------------.
  122. * | | | | | |
  123. * ,------|------|------| |------+------+------.
  124. * | | | | | | | |
  125. * | | |------| |------| | |
  126. * | | | | | | | |
  127. * `--------------------' `--------------------'
  128. */
  129. [MOVE] = LAYOUT_ergodox(
  130. // left hand
  131. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  132. KC_TRNS,KC_TRNS,VIM_W, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  133. KC_TRNS,KC_TRNS,KC_HOME,KC_PGUP,KC_PGDOWN,KC_END,
  134. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,VIM_B, KC_TRNS,
  135. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  136. KC_TRNS,KC_TRNS,
  137. KC_TRNS,
  138. KC_TRNS,KC_TRNS,KC_TRNS,
  139. // right hand
  140. KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,
  141. KC_TRNS,LGUI(KC_LEFT),LALT(KC_LEFT),LALT(KC_RIGHT),LGUI(KC_RIGHT),KC_TRNS,KC_TRNS,
  142. KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_TRNS,KC_TRNS,
  143. KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,
  144. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,
  145. KC_TRNS,KC_TRNS,
  146. KC_TRNS,
  147. KC_TRNS,KC_TRNS,KC_TRNS
  148. ),
  149. /* Keymap: AFK Layer
  150. * All keys wake
  151. */
  152. [AFK] = LAYOUT_ergodox(
  153. // left hand
  154. BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,
  155. BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,
  156. BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,
  157. BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,
  158. BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,
  159. BF_WAKE,BF_WAKE,
  160. BF_WAKE,
  161. BF_WAKE,BF_WAKE,BF_WAKE,
  162. // right hand
  163. KC_TRNS,BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,
  164. BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,
  165. BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,
  166. BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,
  167. BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,BF_WAKE,
  168. BF_WAKE,BF_WAKE,
  169. BF_WAKE,
  170. BF_WAKE,BF_WAKE,BF_WAKE
  171. ),
  172. };
  173. #ifdef RGBLIGHT_ENABLE
  174. /*
  175. * Led Configuration
  176. */
  177. extern rgblight_config_t rgblight_config;
  178. typedef struct {
  179. uint16_t hue :9;
  180. uint8_t sat :8;
  181. uint8_t val :8;
  182. uint8_t mode :6;
  183. } bf_rgb_data;
  184. bf_rgb_data bf_rgb_config[] = { // color mode
  185. [QWERTY] = { .hue = 274, .sat = 255, .val = 36, .mode = 3 }, // purple breathing
  186. [MOVE] = { .hue = 180, .sat = 255, .val = 75, .mode = 1 }, // teal solid
  187. [NUMS] = { .hue = 120, .sat = 255, .val = 75, .mode = 1 }, // green solid
  188. [AFK] = { .hue = 0, .sat = 255, .val = 150, .mode = 22 }, // red knight
  189. };
  190. static inline void bf_set_led(uint8_t layer) {
  191. bf_rgb_data cfg = bf_rgb_config[layer];
  192. if (rgblight_config.mode != cfg.mode) {
  193. rgblight_mode(cfg.mode);
  194. }
  195. rgblight_sethsv(cfg.hue, cfg.sat, cfg.val);
  196. }
  197. static inline void mod_layer_with_rgb(keyrecord_t *record, uint8_t layer) {
  198. if (record->event.pressed) {
  199. layer_on(layer);
  200. bf_set_led(layer);
  201. } else {
  202. layer_off(layer);
  203. uint8_t currentLayer = biton32(layer_state);
  204. bf_set_led(currentLayer);
  205. };
  206. };
  207. #endif
  208. /*
  209. * Custom keycodes
  210. */
  211. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  212. switch(keycode) {
  213. case BF_AFK:
  214. if (record->event.pressed) {
  215. layer_on(AFK);
  216. SEND_STRING(SS_DOWN(X_LCTRL)SS_DOWN(X_LSHIFT)SS_TAP(X_POWER)SS_UP(X_LSHIFT)SS_UP(X_LCTRL));
  217. }
  218. return false; break;
  219. case BF_WAKE:
  220. if (record->event.pressed) {
  221. layer_off(AFK);
  222. SEND_STRING(" ");
  223. }
  224. return false; break;
  225. #ifdef RGBLIGHT_ENABLE
  226. case BF_NUMS:
  227. mod_layer_with_rgb(record, NUMS);
  228. return false; break;
  229. case BF_MOVE:
  230. mod_layer_with_rgb(record, MOVE);
  231. return false; break;
  232. #endif
  233. }
  234. return true;
  235. };
  236. /*
  237. * Active Routines
  238. */
  239. void matrix_init_user(void) {
  240. #ifdef RGBLIGHT_ENABLE
  241. bf_set_led(QWERTY);
  242. #endif
  243. };
  244. // Runs constantly in the background, in a loop.
  245. void matrix_scan_user(void) {
  246. uint8_t layer = biton32(layer_state);
  247. ergodox_right_led_1_off();
  248. ergodox_right_led_2_off();
  249. ergodox_right_led_3_off();
  250. switch (layer) {
  251. case NUMS:
  252. ergodox_right_led_2_on();
  253. break;
  254. case MOVE:
  255. ergodox_right_led_3_on();
  256. break;
  257. case AFK:
  258. ergodox_right_led_1_on();
  259. break;
  260. }
  261. };