zach_common_functions.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. #pragma once
  2. #include "eeconfig.h"
  3. #include "action_layer.h"
  4. #include "keymap_colemak.h"
  5. extern keymap_config_t keymap_config;
  6. // Fillers to make layering more clear
  7. #define _______ KC_TRNS
  8. #define XXXXXXX KC_NO
  9. #define C(n) RCTL(n)
  10. #define CADKEY RCTL(RALT(KC_DEL))
  11. void tap(uint16_t keycode){
  12. register_code(keycode);
  13. unregister_code(keycode);
  14. };
  15. void persistent_default_layer_set(uint16_t default_layer){
  16. eeconfig_update_default_layer(default_layer);
  17. default_layer_set(default_layer);
  18. };
  19. // Automatic number generation of important keywords
  20. enum my_keycodes{
  21. // Layer numbers
  22. _COLEMAK = 0,
  23. _SWCOLE,
  24. _RAISE,
  25. _LOWER,
  26. _ADJUST,
  27. _UNICODES,
  28. // These use process_record_user()
  29. COLEMAK = SAFE_RANGE,
  30. SWCOLE,
  31. LOWER,
  32. RAISE,
  33. SHFT_CAP,
  34. CTRLB,
  35. CPYPST,
  36. FACE,
  37. UNIWIN,
  38. UNILIN,
  39. DISFACE,
  40. TFLIP,
  41. TPUT,
  42. SHRUG,
  43. RANDIG,
  44. // Tap_Dance nums
  45. RAI = 0,
  46. LOW,
  47. SUP
  48. };
  49. #ifdef AUDIO_ENABLE
  50. #include "audio.h"
  51. float tone_startup[][2] = SONG(STARTUP_SOUND);
  52. float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
  53. float tone_colemak[][2] = SONG(COLEMAK_SOUND);
  54. float tone_swcole[][2] = SONG(QWERTY_SOUND);
  55. float tone_capslock_on[][2] = SONG(CAPS_LOCK_ON_SOUND);
  56. float tone_capslock_off[][2] = SONG(CAPS_LOCK_OFF_SOUND);
  57. float tone_ctrl_mod[][2] = SONG(COIN_SOUND);
  58. float tone_copy[][2] = SONG(SCROLL_LOCK_ON_SOUND);
  59. float tone_paste[][2] = SONG(SCROLL_LOCK_OFF_SOUND);
  60. float uniwin[][2] = SONG(UNICODE_WINDOWS);
  61. float unilin[][2] = SONG(UNICODE_LINUX);
  62. #endif
  63. #ifdef TAP_DANCE_ENABLE
  64. #define TAPPING_TERM 200
  65. void dance_raise_press(qk_tap_dance_state_t *state, void *user_data){// Called on each tap
  66. switch(state->count){ // Only turn the layer on once
  67. case 1:
  68. layer_off(_UNICODES);
  69. layer_on(_RAISE);
  70. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  71. break;
  72. }
  73. };
  74. void dance_raise_lift(qk_tap_dance_state_t *state, void *user_data){ // Called on release
  75. switch(state->count){
  76. case 1: // Normal action. Turn off layers
  77. layer_off(_RAISE);
  78. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  79. layer_off(_UNICODES);
  80. break;
  81. }
  82. };
  83. /////////////////////////////////////////////////////////////////////
  84. void dance_lower_press(qk_tap_dance_state_t *state, void *user_data){// Called on tap
  85. switch(state->count){
  86. case 1: // Turn on lower
  87. layer_off(_UNICODES);
  88. layer_on(_LOWER);
  89. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  90. break;
  91. }
  92. };
  93. void dance_lower_lift(qk_tap_dance_state_t *state, void *user_data){ // Called on release
  94. switch(state->count){
  95. case 1: // Normal action. Turn off layers
  96. layer_off(_LOWER);
  97. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  98. layer_off(_UNICODES);
  99. break;
  100. case 2: // Turn on _UNICODES layer
  101. layer_off(_LOWER);
  102. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  103. layer_on(_UNICODES);
  104. #ifdef AUDIO_ENABLE
  105. PLAY_SONG(tone_ctrl_mod);
  106. #endif
  107. break;
  108. }
  109. };
  110. /////////////////////////////////////////////////////////////////////
  111. void dance_super_press(qk_tap_dance_state_t *state, void *user_data){ // Called on down
  112. if(state->count == 1){
  113. register_code(KC_LGUI);
  114. }
  115. }
  116. void dance_super_done(qk_tap_dance_state_t *state, void *user_data){ // Called on timeout
  117. switch(state->count){
  118. case 2:
  119. register_code(KC_LGUI);
  120. tap(KC_L);
  121. unregister_code(KC_LGUI);
  122. break;
  123. }
  124. }
  125. void dance_super_lift(qk_tap_dance_state_t *state, void *user_data){ // Called on up
  126. unregister_code(KC_LGUI);
  127. }
  128. qk_tap_dance_action_t tap_dance_actions[] = {
  129. [RAI] = ACTION_TAP_DANCE_FN_ADVANCED(dance_raise_press, NULL, dance_raise_lift),
  130. [LOW] = ACTION_TAP_DANCE_FN_ADVANCED(dance_lower_press, NULL, dance_lower_lift),
  131. [SUP] = ACTION_TAP_DANCE_FN_ADVANCED(dance_super_press, dance_super_done, dance_super_lift)
  132. };
  133. #endif
  134. //#ifdef UNICODE_ENABLE
  135. // Unicode shortcuts
  136. #define IBANG X(0x203D)
  137. #define RAROW X(0x2192)
  138. #define LAROW X(0x2190)
  139. #define DEGREE X(0x00B0)
  140. #define OMEGA X(0x03A9)
  141. #define WOMEGA X(0x03C9)
  142. #define MICRO X(0x00B5)
  143. #define PLUMIN X(0x00B1)
  144. #define SUPA2 X(0x00B2)
  145. #define ROMAN1 X(0x2160)
  146. #define ROMAN2 X(0x2161)
  147. #define ROMAN3 X(0x2162)
  148. #define ROMAN4 X(0x2163)
  149. #define ROMAN5 X(0x2164)
  150. #define ROMAN6 X(0x2165)
  151. #define ROMAN7 X(0x2166)
  152. #define roman1 X(0x2170)
  153. #define roman2 X(0x2171)
  154. #define roman3 X(0x2172)
  155. #define roman4 X(0x2173)
  156. #define roman5 X(0x2174)
  157. #define roman6 X(0x2175)
  158. #define roman7 X(0x2176)
  159. #ifdef UNICODEMAP_ENABLE // For Unicode characters larger than 0x8000. Send with X(<unicode>)
  160. enum Ext_Unicode{
  161. PENGUIN = 0,
  162. BOAR,
  163. MONKEY,
  164. DRAGON,
  165. CHICK,
  166. TUMBLER
  167. };
  168. const uint32_t PROGMEM unicode_map[] = {
  169. [PENGUIN] = 0x1F427,
  170. [BOAR] = 0x1F417,
  171. [MONKEY] = 0x1F412,
  172. [DRAGON] = 0x1F409,
  173. [CHICK] = 0x1F425,
  174. [TUMBLER] = 0x1F943
  175. };
  176. #define PENGY X(PENGUIN)
  177. #define BOARY X(BOAR)
  178. #define MNKY X(MONKEY)
  179. #define DRGN X(DRAGON)
  180. #define DUCK X(CHICK)
  181. #define TMBL X(TUMBLER)
  182. #endif
  183. //#endif
  184. static uint16_t key_timer;
  185. static uint8_t caps_status = 0;
  186. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  187. switch (keycode) {
  188. case COLEMAK:
  189. if(record->event.pressed){
  190. persistent_default_layer_set(1UL<<_COLEMAK);
  191. #ifdef AUDIO_ENABLE
  192. PLAY_SONG(tone_colemak);
  193. #endif
  194. }
  195. return false;
  196. break;
  197. case SWCOLE:
  198. if(record->event.pressed){
  199. persistent_default_layer_set(1UL<<_SWCOLE);
  200. #ifdef AUDIO_ENABLE
  201. PLAY_SONG(tone_swcole);
  202. #endif
  203. }
  204. return false;
  205. break;
  206. case RAISE:
  207. if(record->event.pressed){
  208. layer_on(_RAISE);
  209. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  210. } else {
  211. layer_off(_RAISE);
  212. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  213. }
  214. return false;
  215. break;
  216. case LOWER:
  217. if(record->event.pressed){
  218. layer_on(_LOWER);
  219. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  220. } else {
  221. layer_off(_LOWER);
  222. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  223. }
  224. return false;
  225. break;
  226. case SHFT_CAP:
  227. if(record->event.pressed){
  228. key_timer = timer_read(); // if the key is being pressed, we start the timer.
  229. register_code(KC_LSHIFT);
  230. } else { // this means the key was just released (tap or "held down")
  231. if(timer_elapsed(key_timer) < 152){ // Time in ms, the threshold we pick for counting something as a tap.
  232. tap(KC_CAPS);
  233. if(caps_status == 0){
  234. caps_status = 1;
  235. #ifdef AUDIO_ENABLE
  236. PLAY_SONG(tone_capslock_on);
  237. #endif
  238. } else {
  239. caps_status = 0;
  240. #ifdef AUDIO_ENABLE
  241. PLAY_SONG(tone_capslock_off);
  242. #endif
  243. }
  244. }
  245. unregister_code(KC_LSHIFT);
  246. }
  247. return false;
  248. break;
  249. case CTRLB: // Control-B on tap (bold)
  250. if(record->event.pressed){
  251. key_timer = timer_read(); // if the key is being pressed, we start the timer.
  252. register_code(KC_LCTL);
  253. } else { // this means the key was just released (tap or "held down")
  254. if (timer_elapsed(key_timer) < 152) { // Time in ms, the threshold we pick for counting something as a tap.
  255. tap(KC_B);
  256. #ifdef AUDIO_ENABLE
  257. PLAY_SONG(tone_ctrl_mod);
  258. #endif
  259. #ifdef BACKLIGHT_BREATHING
  260. breathing_period_set(2);
  261. breathing_pulse();
  262. #endif
  263. }
  264. unregister_code(KC_LCTL);
  265. }
  266. return false;
  267. break;
  268. case CPYPST: // One key copy/paste
  269. if(record->event.pressed){
  270. key_timer = timer_read();
  271. } else {
  272. if (timer_elapsed(key_timer) > 152) { // Hold, copy
  273. register_code(KC_LCTL);
  274. tap(KC_C);
  275. unregister_code(KC_LCTL);
  276. #ifdef AUDIO_ENABLE
  277. PLAY_SONG(tone_copy);
  278. #endif
  279. } else { // Tap, paste
  280. register_code(KC_LCTL);
  281. tap(KC_V);
  282. unregister_code(KC_LCTL);
  283. #ifdef AUDIO_ENABLE
  284. PLAY_SONG(tone_paste);
  285. #endif
  286. }
  287. }
  288. return false;
  289. break;
  290. #ifdef UNICODE_ENABLE
  291. case UNIWIN:
  292. if(record->event.pressed){
  293. set_unicode_input_mode(UC_WIN);
  294. #ifdef AUDIO_ENABLE
  295. PLAY_SONG(uniwin);
  296. #endif
  297. }
  298. return false;
  299. break;
  300. case UNILIN:
  301. if(record->event.pressed){
  302. set_unicode_input_mode(UC_LNX);
  303. #ifdef AUDIO_ENABLE
  304. PLAY_SONG(unilin);
  305. #endif
  306. }
  307. return false;
  308. break;
  309. case DISFACE: // ಠ_ಠ
  310. if(record->event.pressed){
  311. process_unicode((0x0CA0|QK_UNICODE), record); // Eye
  312. register_code(KC_RSFT);
  313. tap(KC_MINS);
  314. unregister_code(KC_RSFT);
  315. process_unicode((0x0CA0|QK_UNICODE), record); // Eye
  316. }
  317. return false;
  318. break;
  319. case TFLIP: // (╯°□°)╯ ︵ ┻━┻
  320. if(record->event.pressed){
  321. register_code(KC_RSFT);
  322. tap(KC_9);
  323. unregister_code(KC_RSFT);
  324. process_unicode((0x256F|QK_UNICODE), record); // Arm
  325. process_unicode((0x00B0|QK_UNICODE), record); // Eye
  326. process_unicode((0x25A1|QK_UNICODE), record); // Mouth
  327. process_unicode((0x00B0|QK_UNICODE), record); // Eye
  328. register_code(KC_RSFT);
  329. tap(KC_0);
  330. unregister_code(KC_RSFT);
  331. process_unicode((0x256F|QK_UNICODE), record); // Arm
  332. tap(KC_SPC);
  333. process_unicode((0x0361|QK_UNICODE), record); // Flippy
  334. tap(KC_SPC);
  335. process_unicode((0x253B|QK_UNICODE), record); // Table
  336. process_unicode((0x2501|QK_UNICODE), record); // Table
  337. process_unicode((0x253B|QK_UNICODE), record); // Table
  338. }
  339. return false;
  340. break;
  341. case TPUT: // ┬──┬ ノ( ゜-゜ノ)
  342. if(record->event.pressed){
  343. process_unicode((0x252C|QK_UNICODE), record); // Table
  344. process_unicode((0x2500|QK_UNICODE), record); // Table
  345. process_unicode((0x2500|QK_UNICODE), record); // Table
  346. process_unicode((0x252C|QK_UNICODE), record); // Table
  347. tap(KC_SPC);
  348. process_unicode((0x30CE|QK_UNICODE), record); // Arm
  349. register_code(KC_RSFT);
  350. tap(KC_9);
  351. unregister_code(KC_RSFT);
  352. tap(KC_SPC);
  353. process_unicode((0x309C|QK_UNICODE), record); // Eye
  354. tap(KC_MINS);
  355. process_unicode((0x309C|QK_UNICODE), record); // Eye
  356. process_unicode((0x30CE|QK_UNICODE), record); // Arm
  357. register_code(KC_RSFT);
  358. tap(KC_0);
  359. unregister_code(KC_RSFT);
  360. }
  361. return false;
  362. break;
  363. case SHRUG: // ¯\_(ツ)_/¯
  364. if(record->event.pressed){
  365. process_unicode((0x00AF|QK_UNICODE), record); // Hand
  366. tap(KC_BSLS); // Arm
  367. register_code(KC_RSFT);
  368. tap(KC_UNDS); // Arm
  369. tap(KC_LPRN); // Head
  370. unregister_code(KC_RSFT);
  371. process_unicode((0x30C4|QK_UNICODE), record); // Face
  372. register_code(KC_RSFT);
  373. tap(KC_RPRN); // Head
  374. tap(KC_UNDS); // Arm
  375. unregister_code(KC_RSFT);
  376. tap(KC_SLSH); // Arm
  377. process_unicode((0x00AF|QK_UNICODE), record); // Hand
  378. }
  379. return false;
  380. break;
  381. #endif
  382. case FACE: // (o_O)
  383. if(record->event.pressed){
  384. register_code(KC_RSFT);
  385. tap(KC_LPRN);
  386. unregister_code(KC_RSFT);
  387. tap(KC_O);
  388. register_code(KC_RSFT);
  389. tap(KC_UNDS);
  390. tap(KC_O);
  391. tap(KC_RPRN);
  392. unregister_code(KC_RSFT);
  393. }
  394. return false;
  395. break;
  396. case RANDIG:
  397. if (record->event.pressed) {
  398. tap_random_base64();
  399. }
  400. return false;
  401. break;
  402. }
  403. return true;
  404. };
  405. void matrix_init_user(void){ // Run once at startup
  406. #ifdef AUDIO_ENABLE
  407. _delay_ms(50); // gets rid of tick
  408. PLAY_SONG(tone_startup);
  409. #endif
  410. }
  411. #ifdef AUDIO_ENABLE
  412. void play_goodbye_tone(void){
  413. PLAY_SONG(tone_goodbye);
  414. _delay_ms(150);
  415. }
  416. void shutdown_user(){
  417. PLAY_SONG(tone_goodbye);
  418. _delay_ms(150);
  419. stop_all_notes();
  420. }
  421. void music_on_user(void){ // Run when the music layer is turned on
  422. PLAY_SONG(tone_startup);
  423. }
  424. void music_off_user(void){ // Run when music is turned off
  425. PLAY_SONG(tone_goodbye);
  426. }
  427. #endif