keymap.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. /* Copyright 2015-2017 Jack Humbert
  2. * Portions Copyright 2020 Joel Elkins
  3. *
  4. * This program is free software: you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation, either version 2 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. */
  17. #include "jdelkins.h"
  18. #include "muse.h"
  19. #ifdef LAYOUT
  20. #undef LAYOUT
  21. #endif
  22. #define LAYOUT LAYOUT_planck_2x2u
  23. uint16_t bspc_timer;
  24. enum {
  25. MY_BSPC = USER_SAFE_RANGE,
  26. BACKLIT,
  27. };
  28. // recycle unused layers defined in my userspace
  29. #define _RAISE _FUNC
  30. #define _LOWER _SECRETS
  31. #define KP MO(_KP)
  32. #define LOWER MO(_LOWER)
  33. #define RAISE MO(_RAISE)
  34. int ctl_state = 0;
  35. void ctl_finished(qk_tap_dance_state_t *state, void *user_data) {
  36. ctl_state = cur_dance(state);
  37. switch (ctl_state) {
  38. case SINGLE_TAP: qk_leader_start(); break;
  39. case SINGLE_HOLD: register_code(KC_LCTL); break;
  40. case DOUBLE_TAP: tap_code(KC_RCTL); break;
  41. case DOUBLE_HOLD: register_code(KC_RCTL); break;
  42. case TRIPLE_TAP: tap_code(KC_RCTL); tap_code(KC_RCTL); break;
  43. case TRIPLE_HOLD: tap_code(KC_RCTL); register_code(KC_RCTL); break;
  44. }
  45. }
  46. void ctl_reset(qk_tap_dance_state_t *state, void *user_data) {
  47. switch (ctl_state) {
  48. case SINGLE_HOLD: unregister_code(KC_LCTL); break;
  49. case DOUBLE_HOLD:
  50. case TRIPLE_HOLD: unregister_code(KC_RCTL); break;
  51. }
  52. ctl_state = 0;
  53. }
  54. void g_finished(qk_tap_dance_state_t *state, void *user_data) {
  55. switch (cur_dance(state)) {
  56. case SINGLE_TAP:
  57. tap_code16(C(KC_END));
  58. break;
  59. case DOUBLE_TAP:
  60. tap_code16(C(KC_HOME));
  61. break;
  62. }
  63. }
  64. int kp_state = 0;
  65. void kp_finished(qk_tap_dance_state_t *state, void *user_data) {
  66. kp_state = hold_cur_dance(state);
  67. switch (kp_state) {
  68. case SINGLE_HOLD: layer_on(_KP); break;
  69. case DOUBLE_HOLD: layer_on(_RPT); break;
  70. }
  71. }
  72. void kp_reset(qk_tap_dance_state_t *state, void *user_data) {
  73. switch (kp_state) {
  74. case SINGLE_HOLD: layer_off(_KP); break;
  75. case DOUBLE_HOLD: layer_off(_RPT); break;
  76. }
  77. kp_state = 0;
  78. }
  79. enum {
  80. TD_LDCTL,
  81. TD_G,
  82. TD_KP
  83. };
  84. qk_tap_dance_action_t tap_dance_actions[] = {
  85. [TD_LDCTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ctl_finished, ctl_reset),
  86. [TD_G] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, g_finished, NULL),
  87. [TD_KP] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, kp_finished, kp_reset),
  88. };
  89. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  90. /* Qwerty
  91. * ,-----------------------------------------------------------------------------------.
  92. * | Tab | Q | W | E | R | T | Y | U | I | O | P | ` |
  93. * |------+------+------+------+------+------+------+------+------+------+------+------|
  94. * | Ctrl | A | S | D | F | G | H | J | K | L | ; | " |
  95. * |------+------+------+------+------+------+------+------+------+------+------+------|
  96. * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
  97. * |------+------+------+------+------+------+------+------+------+------+------+------|
  98. * | Ctrl | Gui | Alt |Keypad| Bksp | Space | Left | Down | Up |Right |
  99. * `-----------------------------------------------------------------------------------'
  100. */
  101. [_QWERTY] = LAYOUT(
  102. KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_GRV,
  103. KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
  104. KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT,
  105. TD(TD_LDCTL), MO(_ADJUST), MY_GUI, MY_ALT, MY_BSPC, MY_SPC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
  106. ),
  107. [_GAME] = LAYOUT(
  108. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  109. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  110. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  111. _______, KC_NO, KC_LALT, RAISE, KC_SPC, KC_SPC, _______, _______, _______, _______
  112. ),
  113. [_RAISE] = LAYOUT(
  114. KC_ESC, _______, FW_WRD, KB_EOL, _______, _______, KB_COPY, KC_PGUP, _______, KC_LPRN, KC_RPRN, KC_MINS,
  115. _______, KB_BOL, _______, KC_PGDN, _______, TD(TD_G), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, KC_BSLS,
  116. _______, _______, KC_DEL, _______, KB_PASTE, BK_WRD, _______, _______, _______, _______, _______, KC_CALC,
  117. _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END
  118. ),
  119. /* Same as _QWERTY but disable autoshift */
  120. [_RPT] = LAYOUT(
  121. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  122. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  123. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  124. _______, _______, _______, _______, KC_BSPC, KC_SPC, _______, _______, _______, _______
  125. ),
  126. [_KP] = LAYOUT(
  127. KC_NUMLOCK, KC_F9, KC_F10, KC_F11, KC_F12, KC_F13, KC_F14, KC_7, KC_8, KC_9, KC_MINS, KC_EQL,
  128. _______, KC_F5, KC_F6, KC_F7, KC_F8, XXXXXXX, XXXXXXX, KC_4, KC_5, KC_6, KC_ASTR, _______,
  129. _______, KC_F1, KC_F2, KC_F3, KC_F4, XXXXXXX, XXXXXXX, KC_1, KC_2, KC_3, KC_SLSH, _______,
  130. _______, _______, _______, _______, _______, _______, KC_0, KC_DOT, KC_PLUS, KC_END
  131. ),
  132. [_LOWER] = LAYOUT(
  133. KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LBRC, KC_RBRC, KC_EQL,
  134. _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LCBR, KC_RCBR, KC_PIPE,
  135. _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_END, KC_MPLY,
  136. _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT
  137. ),
  138. [_ADJUST] = LAYOUT(
  139. _______, RESET, DEBUG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL,
  140. _______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, _______, _______, _______, _______, _______,
  141. _______, RGB_TOG, KB_MAKE, KB_FLSH, KB_VRSN, KB_BOOT, _______, TG_SYS, _______, _______, _______, _______,
  142. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  143. )
  144. /* [_ADJUST] = LAYOUT( */
  145. /* _______, RESET, DEBUG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL , */
  146. /* _______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______, */
  147. /* _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, TERM_ON, TERM_OFF, _______, _______, _______, */
  148. /* _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ */
  149. /* ) */
  150. };
  151. #ifdef AUDIO_ENABLE
  152. float plover_song[][2] = SONG(PLOVER_SOUND);
  153. float plover_gb_song[][2] = SONG(PLOVER_GOODBYE_SOUND);
  154. #endif
  155. layer_state_t layer_state_set_keymap(layer_state_t state) {
  156. if (layer_state_cmp(state, _GAME) || layer_state_cmp(state, _RPT))
  157. autoshift_disable();
  158. else
  159. autoshift_enable();
  160. return update_tri_layer_state(state, _KP, _RAISE, _LOWER);
  161. }
  162. bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
  163. bool rc = true;
  164. static bool bspc_del = false;
  165. static bool bspc_initiated_func = false;
  166. switch (keycode) {
  167. case MY_BSPC:
  168. if (record->event.pressed) {
  169. if (IS_LAYER_ON(_KP)) {
  170. // special case: if _KP was turned on by another key,
  171. // treat this as KC_DEL and don't do anything else
  172. bspc_del = true;
  173. register_code(KC_DEL);
  174. return false;
  175. } else {
  176. bspc_timer = timer_read();
  177. bspc_initiated_func = true;
  178. layer_on(_KP);
  179. }
  180. } else {
  181. if (bspc_del) {
  182. // special case: if _KP was turned on by another key,
  183. // treat this as KC_DEL and don't do anything else
  184. unregister_code(KC_DEL);
  185. bspc_del = false;
  186. return false;
  187. }
  188. if (bspc_initiated_func) {
  189. layer_off(_KP);
  190. bspc_initiated_func = false;
  191. }
  192. if (bspc_timer > 0) {
  193. // here the key was pressed and released before the timer
  194. // expired, so treat as a backspace tap and pretend we
  195. // never activated _KP
  196. bspc_timer = 0;
  197. tap_code(KC_BSPC);
  198. } else {
  199. // the timer went off, so KC_BSPC was registered in
  200. // matrix_scan_keymap. unregister it now
  201. unregister_code(KC_BSPC);
  202. }
  203. }
  204. return false; // special case, return now without resetting timer
  205. // other paths should set rc and break
  206. break;
  207. case BACKLIT:
  208. if (record->event.pressed) {
  209. register_code(KC_RSFT);
  210. #ifdef BACKLIGHT_ENABLE
  211. backlight_step();
  212. #endif
  213. } else {
  214. unregister_code(KC_RSFT);
  215. }
  216. rc = false;
  217. break;
  218. }
  219. bspc_timer = 0;
  220. return rc;
  221. }
  222. bool muse_mode = false;
  223. uint8_t last_muse_note = 0;
  224. uint16_t muse_counter = 0;
  225. uint8_t muse_offset = 70;
  226. uint16_t muse_tempo = 50;
  227. void encoder_update(bool clockwise) {
  228. if (muse_mode) {
  229. if (IS_LAYER_ON(_RAISE)) {
  230. if (clockwise) {
  231. muse_offset++;
  232. } else {
  233. muse_offset--;
  234. }
  235. } else {
  236. if (clockwise) {
  237. muse_tempo+=1;
  238. } else {
  239. muse_tempo-=1;
  240. }
  241. }
  242. } else {
  243. if (clockwise) {
  244. #ifdef MOUSEKEY_ENABLE
  245. tap_code(KC_MS_WH_DOWN);
  246. #else
  247. tap_code(KC_PGDN);
  248. #endif
  249. } else {
  250. #ifdef MOUSEKEY_ENABLE
  251. tap_code(KC_MS_WH_UP);
  252. #else
  253. tap_code(KC_PGUP);
  254. #endif
  255. }
  256. }
  257. }
  258. void dip_switch_update_user(uint8_t index, bool active) {
  259. switch (index) {
  260. case 0: {
  261. #ifdef AUDIO_ENABLE
  262. static bool play_sound = false;
  263. #endif
  264. if (active) {
  265. #ifdef AUDIO_ENABLE
  266. if (play_sound) { PLAY_SONG(plover_song); }
  267. #endif
  268. layer_on(_ADJUST);
  269. } else {
  270. #ifdef AUDIO_ENABLE
  271. if (play_sound) { PLAY_SONG(plover_gb_song); }
  272. #endif
  273. layer_off(_ADJUST);
  274. }
  275. #ifdef AUDIO_ENABLE
  276. play_sound = true;
  277. #endif
  278. break;
  279. }
  280. case 1:
  281. if (active) {
  282. muse_mode = true;
  283. } else {
  284. muse_mode = false;
  285. }
  286. }
  287. }
  288. void keyboard_post_init_keymap(void) {
  289. bspc_timer = 0;
  290. }
  291. LEADER_EXTERNS();
  292. void matrix_scan_keymap(void) {
  293. #ifdef AUDIO_ENABLE
  294. if (muse_mode) {
  295. if (muse_counter == 0) {
  296. uint8_t muse_note = muse_offset + SCALE[muse_clock_pulse()];
  297. if (muse_note != last_muse_note) {
  298. stop_note(compute_freq_for_midi_note(last_muse_note));
  299. play_note(compute_freq_for_midi_note(muse_note), 0xF);
  300. last_muse_note = muse_note;
  301. }
  302. }
  303. muse_counter = (muse_counter + 1) % muse_tempo;
  304. } else {
  305. if (muse_counter) {
  306. stop_all_notes();
  307. muse_counter = 0;
  308. }
  309. }
  310. #endif
  311. // if MY_BSPC is held down too long, pretend like it wasn't and start
  312. // pressing backspace
  313. if (bspc_timer > 0 && timer_elapsed(bspc_timer) > LEADER_TIMEOUT) {
  314. layer_off(_KP);
  315. bspc_timer = 0;
  316. register_code(KC_BSPC);
  317. }
  318. LEADER_DICTIONARY() {
  319. leading = false;
  320. leader_end();
  321. SEQ_ONE_KEY(KC_K) {
  322. layer_invert(_KP);
  323. }
  324. SEQ_ONE_KEY(KC_G) {
  325. layer_invert(_GAME);
  326. }
  327. SEQ_ONE_KEY(KC_KP_5) {
  328. layer_invert(_KP);
  329. }
  330. SEQ_ONE_KEY(KC_5) {
  331. layer_invert(_KP);
  332. }
  333. SEQ_TWO_KEYS(KC_SCLN, KC_1) {
  334. send_secret_string(0);
  335. }
  336. SEQ_TWO_KEYS(KC_SCLN, KC_2) {
  337. send_secret_string(1);
  338. }
  339. SEQ_TWO_KEYS(KC_SCLN, KC_3) {
  340. send_secret_string(2);
  341. }
  342. SEQ_TWO_KEYS(KC_SCLN, KC_4) {
  343. send_secret_string(3);
  344. }
  345. SEQ_TWO_KEYS(KC_SCLN, KC_5) {
  346. send_secret_string(4);
  347. }
  348. SEQ_TWO_KEYS(KC_SCLN, KC_6) {
  349. send_secret_string(5);
  350. }
  351. SEQ_TWO_KEYS(KC_SCLN, KC_M) {
  352. send_secret_string(0);
  353. }
  354. SEQ_TWO_KEYS(KC_SCLN, KC_COMM) {
  355. send_secret_string(1);
  356. }
  357. SEQ_TWO_KEYS(KC_SCLN, KC_DOT) {
  358. send_secret_string(2);
  359. }
  360. SEQ_TWO_KEYS(KC_SCLN, KC_J) {
  361. send_secret_string(3);
  362. }
  363. SEQ_TWO_KEYS(KC_SCLN, KC_K) {
  364. send_secret_string(4);
  365. }
  366. SEQ_TWO_KEYS(KC_SCLN, KC_L) {
  367. send_secret_string(5);
  368. }
  369. SEQ_ONE_KEY(KC_C) {
  370. tap_code16(C(KC_C));
  371. }
  372. }
  373. }
  374. bool music_mask_user(uint16_t keycode) {
  375. switch (keycode) {
  376. case RAISE:
  377. case LOWER:
  378. return false;
  379. default:
  380. return true;
  381. }
  382. }