keymap.c 6.1 KB

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