keymap.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. /* Copyright 2019 Ethan Durrant (emdarcher)
  2. *
  3. * This program is free software: you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License as published by
  5. * the Free Software Foundation, either version 2 of the License, or
  6. * (at your option) any later version.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. // NAVI 10
  17. #include QMK_KEYBOARD_H
  18. #define INDICATOR_LED B5
  19. #define _ML1 2
  20. #define _FN2 3
  21. #define _PR3 4
  22. #define _GI4 4
  23. #define HS_RED 0,255
  24. #define HS_WHITE 0, 0
  25. #define HS_ORANGE 28, 255
  26. #define HS_GREEN 85, 255
  27. #define HS_TURQUOISE 123, 90
  28. #define HS_CYAN 128, 255
  29. #define HS_AZURE 132, 102
  30. #define HS_BLUE 170, 255
  31. #define HS_PURPLE 191, 255
  32. #define HS_MAGENTA 213, 255
  33. //create the tap type
  34. typedef struct {
  35. bool is_press_action;
  36. int state;
  37. } tap;
  38. //tap dance states
  39. enum {
  40. // uses https://beta.docs.qmk.fm/using-qmk/software-features/feature_tap_dance
  41. SINGLE_TAP = 1,
  42. SINGLE_HOLD = 2,
  43. DOUBLE_TAP = 3,
  44. TRIPLE_TAP = 4,
  45. };
  46. //tap dance keys
  47. enum {
  48. TAPPY_KEY = 0
  49. };
  50. enum custom_keycodes { // git macros
  51. M_G_HERE = SAFE_RANGE,
  52. M_G_PUSH,
  53. M_G_PULL,
  54. M_G_ADD,
  55. M_G_COMM
  56. };
  57. //function to handle all the tap dances
  58. int cur_dance(qk_tap_dance_state_t *state);
  59. //functions for each tap dance
  60. void tk_finished(qk_tap_dance_state_t *state, void *user_data);
  61. void tk_reset(qk_tap_dance_state_t *state, void *user_data);
  62. // define the macros in here
  63. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  64. switch (keycode) {
  65. // open git bash here
  66. case M_G_HERE:
  67. if (record->event.pressed) {
  68. SEND_STRING(SS_TAP(X_APP)"s");
  69. } else {
  70. // when keycode M_G_HERE is released
  71. }
  72. break;
  73. //git push
  74. case M_G_PUSH:
  75. if (record->event.pressed) {
  76. // when keycode M_G_PUSH is pressed
  77. SEND_STRING("git push"SS_TAP(X_ENTER));
  78. } else {
  79. // when keycode M_G_PUSH is released
  80. }
  81. break;
  82. // git pull
  83. case M_G_PULL:
  84. if (record->event.pressed) {
  85. SEND_STRING("git pull"SS_TAP(X_ENTER));
  86. }
  87. break;
  88. // git add
  89. case M_G_ADD:
  90. if (record->event.pressed) {
  91. SEND_STRING("git add ");
  92. }
  93. break;
  94. // git commit
  95. case M_G_COMM: // git commit
  96. if (record->event.pressed) {
  97. SEND_STRING("git commit -m ' ");
  98. }
  99. break;
  100. }
  101. return true;
  102. };
  103. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  104. // Base
  105. [0] = LAYOUT(
  106. TD(TAPPY_KEY),KC_HOME, KC_PGUP,
  107. KC_DEL, KC_END, KC_PGDN,
  108. KC_UP,
  109. KC_LEFT, KC_DOWN, KC_RIGHT),
  110. // media function layer, toggled on a single tap
  111. [_ML1] = LAYOUT(
  112. KC_TRNS, KC_BSPC, KC_VOLU,
  113. KC_MUTE, KC_ENTER, KC_VOLD,
  114. KC_SPC,
  115. KC_MRWD, KC_MPLY, KC_MFFD),
  116. // F keys, double tap to get here
  117. [_FN2] = LAYOUT(
  118. TO(0), KC_F3, KC_F5,
  119. KC_F2, KC_F4, KC_F6,
  120. KC_F7,
  121. KC_F9, KC_F8, KC_F10),
  122. // programming, triple tap to get here
  123. [_PR3] = LAYOUT(
  124. TO(0), A(KC_F7), S(KC_F10), //atmel, segger, pycharm
  125. KC_F2, KC_F4, S(KC_F9),
  126. KC_UP,
  127. KC_LEFT, KC_DOWN, KC_RIGHT),
  128. // git function layer, hold to get here
  129. [_GI4] = LAYOUT(
  130. KC_TRNS, M_G_PUSH, M_G_ADD,
  131. M_G_HERE, M_G_PULL, M_G_COMM,
  132. RGB_VAI,
  133. RGB_TOG, RGB_VAD, RGB_MOD),
  134. };
  135. //determine the current tap dance state
  136. int cur_dance (qk_tap_dance_state_t *state){
  137. if(state->count == 1)
  138. {
  139. //if a tap was registered
  140. if(!state->pressed)
  141. {
  142. //if not still pressed, then was a single tap
  143. return SINGLE_TAP;
  144. } else
  145. {
  146. //if still pressed/held down, then it's a single hold
  147. return SINGLE_HOLD;
  148. }
  149. }
  150. else if (state->count == 2)
  151. {
  152. return DOUBLE_TAP;
  153. }
  154. else if (state->count == 3)
  155. {
  156. return TRIPLE_TAP;
  157. }
  158. else
  159. {
  160. return 8;
  161. }
  162. }
  163. //initialize the tap structure for the tap key
  164. static tap tk_tap_state = {
  165. .is_press_action = true,
  166. .state = 0
  167. };
  168. //functions that control what our tap dance key does
  169. void tk_finished(qk_tap_dance_state_t *state, void *user_data){
  170. tk_tap_state.state = cur_dance(state);
  171. uint8_t val = rgblight_get_val();
  172. switch(tk_tap_state.state){
  173. case SINGLE_TAP:
  174. //send desired key when tapped:
  175. //setting to the media layer
  176. if(layer_state_is(_ML1)){
  177. //if already active, toggle it to off
  178. layer_off(_ML1);
  179. rgblight_sethsv(HS_PURPLE, val);
  180. } else {
  181. //turn on the media layer
  182. layer_on(_ML1);
  183. rgblight_sethsv_at(HS_RED, 0, 0);
  184. rgblight_sethsv_at(HS_GREEN, 0, 1);
  185. rgblight_sethsv_at(HS_BLUE, val, 2);
  186. }
  187. break;
  188. case DOUBLE_TAP:
  189. layer_on(_FN2);
  190. rgblight_sethsv_at(HS_RED, 0, 0);
  191. rgblight_sethsv_at(HS_GREEN, val, 1);
  192. rgblight_sethsv_at(HS_BLUE, 0, 2);
  193. break;
  194. case TRIPLE_TAP:
  195. layer_on(_PR3);
  196. rgblight_sethsv_at(HS_RED, 0, 0);
  197. rgblight_sethsv_at(HS_GREEN, val, 1);
  198. rgblight_sethsv_at(HS_BLUE, val, 2);
  199. break;
  200. case SINGLE_HOLD:
  201. //set to desired layer when held:
  202. //setting to the function layer
  203. layer_on(_GI4);
  204. rgblight_sethsv_at(HS_RED, val, 0);
  205. rgblight_sethsv_at(HS_GREEN, val, 1);
  206. rgblight_sethsv_at(HS_BLUE, val, 2);
  207. break;
  208. }
  209. }
  210. void tk_reset(qk_tap_dance_state_t *state, void *user_data){
  211. //if held and released, leave the layer
  212. if(tk_tap_state.state == SINGLE_HOLD){
  213. layer_off(_GI4);
  214. uint8_t val = rgblight_get_val();
  215. rgblight_sethsv(HS_PURPLE, val);
  216. }
  217. //reset the state
  218. tk_tap_state.state = 0;
  219. }
  220. //associate the tap dance key with its functionality
  221. qk_tap_dance_action_t tap_dance_actions[] = {
  222. [TAPPY_KEY] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, tk_finished, tk_reset, TAPPING_TERM)
  223. };