2
0

keymap.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  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. void persistant_default_layer_set(uint16_t default_layer) {
  71. eeconfig_update_default_layer(default_layer);
  72. default_layer_set(default_layer);
  73. }
  74. uint16_t fph_tap_qty = false;
  75. uint16_t fph_keycode = 0; // stores which spacebar was used, either raise or lower...
  76. uint16_t get_render_keycode(uint16_t keycode, uint16_t tap_qty){ // maybe replace shift with "mods"
  77. tap_qty--; // reduce by one to match array indexes.
  78. switch(keycode){
  79. case FPH_2:
  80. {uint16_t kc[] = {KC_A, KC_B, KC_C};
  81. if(tap_qty % 6 > 2)
  82. return LSFT(kc[tap_qty % 3]);
  83. return kc[tap_qty % 3];}
  84. break;
  85. case FPH_3:
  86. {uint16_t kc[] = {KC_D, KC_E, KC_F};
  87. if(tap_qty % 6 > 2)
  88. return LSFT(kc[tap_qty % 3]);
  89. return kc[tap_qty % 3];}
  90. break;
  91. case FPH_4:
  92. {uint16_t kc[] = {KC_G, KC_H, KC_I};
  93. if(tap_qty % 6 > 2)
  94. return LSFT(kc[tap_qty % 3]);
  95. return kc[tap_qty % 3];}
  96. break;
  97. case FPH_5:
  98. {uint16_t kc[] = {KC_J, KC_K, KC_L};
  99. if(tap_qty % 6 > 2)
  100. return LSFT(kc[tap_qty % 3]);
  101. return kc[tap_qty % 3];}
  102. break;
  103. case FPH_6:
  104. {uint16_t kc[] = {KC_M, KC_N, KC_O};
  105. if(tap_qty % 6 > 2)
  106. return LSFT(kc[tap_qty % 3]);
  107. return kc[tap_qty % 3];}
  108. break;
  109. case FPH_7:
  110. {uint16_t kc[] = {KC_P, KC_Q, KC_R, KC_S};
  111. if(tap_qty % 8 > 2)
  112. return LSFT(kc[tap_qty % 4]);
  113. return kc[tap_qty % 4];}
  114. break;
  115. case FPH_8:
  116. {uint16_t kc[] = {KC_T, KC_U, KC_V};
  117. if(tap_qty % 8 > 2)
  118. return LSFT(kc[tap_qty % 4]);
  119. return kc[tap_qty % 4];}
  120. break;
  121. case FPH_9:
  122. {uint16_t kc[] = {KC_W, KC_X, KC_Y, KC_Z};
  123. if(tap_qty % 8 > 2)
  124. return LSFT(kc[tap_qty % 4]);
  125. return kc[tap_qty % 4];}
  126. break;
  127. case FPH_1:
  128. {uint16_t kc[] = {KC_COMM, LSFT(KC_SLSH), KC_EXLM, KC_AT, KC_MINS, KC_UNDS, KC_PLUS, \
  129. KC_SCLN, LSFT(KC_SCLN), KC_QUOT, LSFT(KC_QUOT), KC_TILD, \
  130. KC_PIPE, KC_BSLS, KC_HASH, LSFT(KC_4), KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, \
  131. KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, LSFT(KC_COMM), LSFT(KC_DOT)};
  132. return kc[tap_qty % 26];}
  133. }
  134. return KC_NO;
  135. }
  136. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  137. if (!process_record_dynamic_macro(keycode, record)) {
  138. return false;
  139. }
  140. uint8_t layer;
  141. layer = biton32(layer_state);
  142. switch (keycode) {
  143. case FPH_1 ... FPH_9:
  144. if(layer == _FPHNOISY){
  145. if (record->event.pressed) {
  146. if(fph_keycode != keycode) { // key change
  147. fph_tap_qty = 0;
  148. fph_keycode = keycode;
  149. } else { // same key tapped again so erase and increment.
  150. register_code(KC_BSPC);
  151. unregister_code(KC_BSPC);
  152. fph_tap_qty++;
  153. }
  154. uint16_t render_keycode = get_render_keycode(keycode, fph_tap_qty);
  155. // find mods? Apply mods..
  156. register_code(render_keycode);
  157. unregister_code(render_keycode);
  158. } else {
  159. // do we need to do anything on key-release?
  160. }
  161. } else { // not noisy, be demure .
  162. if (record->event.pressed) {
  163. if(fph_keycode != keycode) { // key change, kill everything.
  164. uint16_t render_keycode = get_render_keycode(fph_keycode, fph_tap_qty);
  165. // find mods? Apply mods..
  166. register_code(render_keycode);
  167. unregister_code(render_keycode);
  168. fph_keycode = keycode;
  169. fph_tap_qty = 0;
  170. } else { // same key tapped again so increment counter silently
  171. fph_tap_qty++;
  172. }
  173. } else {
  174. // do we need to do anything on key-release?
  175. // maybe start a timer on this one?
  176. }
  177. }
  178. return false;
  179. break;
  180. case BACKLIT:
  181. if (record->event.pressed) {
  182. #ifdef BACKLIGHT_ENABLE
  183. backlight_step();
  184. #endif
  185. }
  186. return false;
  187. break;
  188. case MACSLEEP:
  189. if (record->event.pressed) {
  190. register_code(KC_RSFT);
  191. register_code(KC_RCTL);
  192. register_code(KC_POWER);
  193. unregister_code(KC_POWER);
  194. unregister_code(KC_RCTL);
  195. unregister_code(KC_RSFT);
  196. }
  197. return false;
  198. break;
  199. }
  200. return true;
  201. }