keymap.c 6.1 KB

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