keymap.c 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. #include QMK_KEYBOARD_H
  2. extern keymap_config_t keymap_config;
  3. #ifdef BACKLIGHT_ENABLE
  4. #include "backlight.h"
  5. #endif
  6. #ifdef AUDIO_ENABLE
  7. #include "audio.h"
  8. #endif
  9. void backlight_toggle(void){
  10. };
  11. enum roadkit_layers {
  12. _NUMPAD,
  13. _FPH,
  14. _FPHNOISY,
  15. _ADJUST,
  16. _DYN
  17. };
  18. enum roadkit_keycodes {
  19. NUMPAD = SAFE_RANGE,
  20. FPH_1,
  21. FPH_2,
  22. FPH_3,
  23. FPH_4,
  24. FPH_5,
  25. FPH_6,
  26. FPH_7,
  27. FPH_8,
  28. FPH_9,
  29. FN_0,
  30. BACKLIT,
  31. MACSLEEP,
  32. DYNAMIC_MACRO_RANGE,
  33. };
  34. #include "dynamic_macro.h"
  35. // Fillers to make keymaps cleaner looking
  36. #define _______ KC_TRNS
  37. #define XXXXXXX KC_NO
  38. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  39. [_NUMPAD] = LAYOUT_numpad_4x4( /* Numpad */
  40. KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_PLUS, \
  41. KC_KP_4, KC_KP_5, KC_KP_6, \
  42. KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_ENTER, \
  43. LT(_ADJUST, KC_KP_0), KC_KP_DOT \
  44. ),
  45. [_FPH] = LAYOUT_numpad_4x4( /* Quiet T9 */
  46. FPH_7, FPH_8, FPH_9, KC_KP_PLUS, \
  47. FPH_4, FPH_5, FPH_6, \
  48. FPH_1, FPH_2, FPH_3, SFT_T(KC_KP_ENTER), \
  49. LT(_ADJUST, KC_SPACE), KC_KP_DOT \
  50. ),
  51. [_FPHNOISY] = LAYOUT_numpad_4x4( /* Noisy T9 */
  52. FPH_7, FPH_8, FPH_9, KC_KP_PLUS, \
  53. FPH_4, FPH_5, FPH_6, \
  54. FPH_1, FPH_2, FPH_3, SFT_T(KC_KP_ENTER), \
  55. LT(_ADJUST, KC_SPACE), KC_KP_DOT \
  56. ),
  57. [_ADJUST] = LAYOUT_numpad_4x4( /* Adjustments */
  58. KC_NUMLOCK, TG(_FPHNOISY), TG(_FPH), TG(_NUMPAD), \
  59. KC_BSPC, BACKLIT, KC_DEL, \
  60. MACSLEEP, _______, _______, _______, \
  61. _______, MO(_DYN) \
  62. ),
  63. [_DYN] = LAYOUT_numpad_4x4( /* DYNAMIC MACRO */
  64. DYN_REC_START1, DYN_REC_START2, _______, DYN_REC_STOP, \
  65. _______, _______, _______, \
  66. DYN_MACRO_PLAY1, DYN_MACRO_PLAY2, _______, _______, \
  67. _______, _______ \
  68. ),
  69. };
  70. const uint16_t PROGMEM fn_actions[] = {
  71. };
  72. void persistant_default_layer_set(uint16_t default_layer) {
  73. eeconfig_update_default_layer(default_layer);
  74. default_layer_set(default_layer);
  75. }
  76. uint16_t fph_tap_qty = false;
  77. uint16_t fph_keycode = 0; // stores which spacebar was used, either raise or lower...
  78. uint16_t get_render_keycode(uint16_t keycode, uint16_t tap_qty){ // maybe replace shift with "mods"
  79. tap_qty--; // reduce by one to match array indexes.
  80. switch(keycode){
  81. case FPH_2:
  82. {uint16_t kc[] = {KC_A, KC_B, KC_C};
  83. if(tap_qty % 6 > 2)
  84. return LSFT(kc[tap_qty % 3]);
  85. return kc[tap_qty % 3];}
  86. break;
  87. case FPH_3:
  88. {uint16_t kc[] = {KC_D, KC_E, KC_F};
  89. if(tap_qty % 6 > 2)
  90. return LSFT(kc[tap_qty % 3]);
  91. return kc[tap_qty % 3];}
  92. break;
  93. case FPH_4:
  94. {uint16_t kc[] = {KC_G, KC_H, KC_I};
  95. if(tap_qty % 6 > 2)
  96. return LSFT(kc[tap_qty % 3]);
  97. return kc[tap_qty % 3];}
  98. break;
  99. case FPH_5:
  100. {uint16_t kc[] = {KC_J, KC_K, KC_L};
  101. if(tap_qty % 6 > 2)
  102. return LSFT(kc[tap_qty % 3]);
  103. return kc[tap_qty % 3];}
  104. break;
  105. case FPH_6:
  106. {uint16_t kc[] = {KC_M, KC_N, KC_O};
  107. if(tap_qty % 6 > 2)
  108. return LSFT(kc[tap_qty % 3]);
  109. return kc[tap_qty % 3];}
  110. break;
  111. case FPH_7:
  112. {uint16_t kc[] = {KC_P, KC_Q, KC_R, KC_S};
  113. if(tap_qty % 8 > 2)
  114. return LSFT(kc[tap_qty % 4]);
  115. return kc[tap_qty % 4];}
  116. break;
  117. case FPH_8:
  118. {uint16_t kc[] = {KC_T, KC_U, KC_V};
  119. if(tap_qty % 8 > 2)
  120. return LSFT(kc[tap_qty % 4]);
  121. return kc[tap_qty % 4];}
  122. break;
  123. case FPH_9:
  124. {uint16_t kc[] = {KC_W, KC_X, KC_Y, KC_Z};
  125. if(tap_qty % 8 > 2)
  126. return LSFT(kc[tap_qty % 4]);
  127. return kc[tap_qty % 4];}
  128. break;
  129. case FPH_1:
  130. {uint16_t kc[] = {KC_COMM, LSFT(KC_SLSH), KC_EXLM, KC_AT, KC_MINS, KC_UNDS, KC_PLUS, \
  131. KC_SCLN, LSFT(KC_SCLN), KC_QUOT, LSFT(KC_QUOT), KC_TILD, \
  132. KC_PIPE, KC_BSLS, KC_HASH, LSFT(KC_4), KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, \
  133. KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, LSFT(KC_COMM), LSFT(KC_DOT)};
  134. return kc[tap_qty % 26];}
  135. }
  136. return KC_NO;
  137. }
  138. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  139. if (!process_record_dynamic_macro(keycode, record)) {
  140. return false;
  141. }
  142. uint8_t layer;
  143. layer = biton32(layer_state);
  144. switch (keycode) {
  145. case FPH_1 ... FPH_9:
  146. if(layer == _FPHNOISY){
  147. if (record->event.pressed) {
  148. if(fph_keycode != keycode) { // key change
  149. fph_tap_qty = 0;
  150. fph_keycode = keycode;
  151. } else { // same key tapped again so erase and increment.
  152. register_code(KC_BSPC);
  153. unregister_code(KC_BSPC);
  154. fph_tap_qty++;
  155. }
  156. uint16_t render_keycode = get_render_keycode(keycode, fph_tap_qty);
  157. // find mods? Apply mods..
  158. register_code(render_keycode);
  159. unregister_code(render_keycode);
  160. } else {
  161. // do we need to do anything on key-release?
  162. }
  163. } else { // not noisy, be demure .
  164. if (record->event.pressed) {
  165. if(fph_keycode != keycode) { // key change, kill everything.
  166. uint16_t render_keycode = get_render_keycode(fph_keycode, fph_tap_qty);
  167. // find mods? Apply mods..
  168. register_code(render_keycode);
  169. unregister_code(render_keycode);
  170. fph_keycode = keycode;
  171. fph_tap_qty = 0;
  172. } else { // same key tapped again so increment counter silently
  173. fph_tap_qty++;
  174. }
  175. } else {
  176. // do we need to do anything on key-release?
  177. // maybe start a timer on this one?
  178. }
  179. }
  180. return false;
  181. break;
  182. case BACKLIT:
  183. if (record->event.pressed) {
  184. #ifdef BACKLIGHT_ENABLE
  185. backlight_step();
  186. #endif
  187. }
  188. return false;
  189. break;
  190. case MACSLEEP:
  191. if (record->event.pressed) {
  192. register_code(KC_RSFT);
  193. register_code(KC_RCTL);
  194. register_code(KC_POWER);
  195. unregister_code(KC_POWER);
  196. unregister_code(KC_RCTL);
  197. unregister_code(KC_RSFT);
  198. }
  199. return false;
  200. break;
  201. }
  202. return true;
  203. }