zach_common_functions.c 14 KB

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