drashna.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. #include "drashna.h"
  2. #include "quantum.h"
  3. #include "action.h"
  4. #include "version.h"
  5. // Add reconfigurable functions here, for keymap customization
  6. // This allows for a global, userspace functions, and continued
  7. // customization of the keymap. Use _keymap instead of _user
  8. // functions in the keymaps
  9. __attribute__ ((weak))
  10. void matrix_init_keymap(void) {}
  11. __attribute__ ((weak))
  12. void matrix_scan_keymap(void) {}
  13. __attribute__ ((weak))
  14. bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
  15. return true;
  16. }
  17. __attribute__ ((weak))
  18. uint32_t layer_state_set_keymap (uint32_t state) {
  19. return state;
  20. }
  21. bool is_overwatch = false;
  22. // Call user matrix init, set default RGB colors and then
  23. // call the keymap's init function
  24. void matrix_init_user(void) {
  25. #ifdef RGBLIGHT_ENABLE
  26. uint8_t default_layer = eeconfig_read_default_layer();
  27. rgblight_enable();
  28. if (true) {
  29. if (default_layer & (1UL << _COLEMAK)) {
  30. rgblight_set_magenta;
  31. }
  32. else if (default_layer & (1UL << _DVORAK)) {
  33. rgblight_set_green;
  34. }
  35. else if (default_layer & (1UL << _WORKMAN)) {
  36. rgblight_set_purple;
  37. }
  38. else {
  39. rgblight_set_teal;
  40. }
  41. }
  42. else
  43. {
  44. rgblight_set_red;
  45. rgblight_mode(5);
  46. }
  47. #endif
  48. matrix_init_keymap();
  49. }
  50. // No global matrix scan code, so just run keymap's matix
  51. // scan function
  52. void matrix_scan_user(void) {
  53. matrix_scan_keymap();
  54. }
  55. #ifdef AUDIO_ENABLE
  56. float tone_qwerty[][2] = SONG(QWERTY_SOUND);
  57. float tone_dvorak[][2] = SONG(DVORAK_SOUND);
  58. float tone_colemak[][2] = SONG(COLEMAK_SOUND);
  59. float tone_workman[][2] = SONG(PLOVER_SOUND);
  60. #endif
  61. void persistent_default_layer_set(uint16_t default_layer) {
  62. eeconfig_update_default_layer(default_layer);
  63. default_layer_set(default_layer);
  64. }
  65. // Defines actions tor my global custom keycodes. Defined in drashna.h file
  66. // Then runs the _keymap's recod handier if not processed here
  67. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  68. #ifdef CONSOLE_ENABLE
  69. xprintf("KL: row: %u, column: %u, pressed: %u\n", record->event.key.col, record->event.key.row, record->event.pressed);
  70. #endif
  71. switch (keycode) {
  72. case KC_QWERTY:
  73. if (record->event.pressed) {
  74. #ifdef AUDIO_ENABLE
  75. PLAY_SONG(tone_qwerty);
  76. #endif
  77. persistent_default_layer_set(1UL << _QWERTY);
  78. }
  79. return false;
  80. break;
  81. case KC_COLEMAK:
  82. if (record->event.pressed) {
  83. #ifdef AUDIO_ENABLE
  84. PLAY_SONG(tone_colemak);
  85. #endif
  86. persistent_default_layer_set(1UL << _COLEMAK);
  87. }
  88. return false;
  89. break;
  90. case KC_DVORAK:
  91. if (record->event.pressed) {
  92. #ifdef AUDIO_ENABLE
  93. PLAY_SONG(tone_dvorak);
  94. #endif
  95. persistent_default_layer_set(1UL << _DVORAK);
  96. }
  97. return false;
  98. break;
  99. case KC_WORKMAN:
  100. if (record->event.pressed) {
  101. #ifdef AUDIO_ENABLE
  102. PLAY_SONG(tone_workman);
  103. #endif
  104. persistent_default_layer_set(1UL << _WORKMAN);
  105. }
  106. return false;
  107. break;
  108. case LOWER:
  109. if (record->event.pressed) {
  110. layer_on(_LOWER);
  111. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  112. }
  113. else {
  114. layer_off(_LOWER);
  115. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  116. }
  117. return false;
  118. break;
  119. case RAISE:
  120. if (record->event.pressed) {
  121. layer_on(_RAISE);
  122. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  123. }
  124. else {
  125. layer_off(_RAISE);
  126. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  127. }
  128. return false;
  129. break;
  130. case ADJUST:
  131. if (record->event.pressed) {
  132. layer_on(_ADJUST);
  133. }
  134. else {
  135. layer_off(_ADJUST);
  136. }
  137. return false;
  138. break;
  139. #if !(defined(KEYBOARD_orthodox_rev1) || defined(KEYBOARD_ergodox_ez))
  140. case KC_OVERWATCH:
  141. if (record->event.pressed) {
  142. is_overwatch = !is_overwatch;
  143. }
  144. #ifdef RGBLIGHT_ENABLE
  145. is_overwatch ? rgblight_mode(17) : rgblight_mode(18);
  146. #endif
  147. return false;
  148. break;
  149. case KC_SALT:
  150. if (!record->event.pressed) {
  151. register_code(is_overwatch ? KC_BSPC : KC_ENTER);
  152. unregister_code(is_overwatch ? KC_BSPC : KC_ENTER);
  153. _delay_ms(50);
  154. SEND_STRING("Salt, salt, salt...");
  155. register_code(KC_ENTER);
  156. unregister_code(KC_ENTER);
  157. }
  158. return false;
  159. break;
  160. case KC_MORESALT:
  161. if (!record->event.pressed) {
  162. register_code(is_overwatch ? KC_BSPC : KC_ENTER);
  163. unregister_code(is_overwatch ? KC_BSPC : KC_ENTER);
  164. _delay_ms(50);
  165. SEND_STRING("Please sir, can I have some more salt?!");
  166. register_code(KC_ENTER);
  167. unregister_code(KC_ENTER);
  168. }
  169. return false;
  170. break;
  171. case KC_SALTHARD:
  172. if (!record->event.pressed) {
  173. register_code(is_overwatch ? KC_BSPC : KC_ENTER);
  174. unregister_code(is_overwatch ? KC_BSPC : KC_ENTER);
  175. _delay_ms(50);
  176. SEND_STRING("Your salt only makes me harder, and even more aggressive!");
  177. register_code(KC_ENTER);
  178. unregister_code(KC_ENTER);
  179. }
  180. return false;
  181. break;
  182. case KC_GOODGAME:
  183. if (!record->event.pressed) {
  184. register_code(is_overwatch ? KC_BSPC : KC_ENTER);
  185. unregister_code(is_overwatch ? KC_BSPC : KC_ENTER);
  186. _delay_ms(50);
  187. SEND_STRING("Good game, everyone!");
  188. register_code(KC_ENTER);
  189. unregister_code(KC_ENTER);
  190. }
  191. return false;
  192. break;
  193. case KC_GLHF:
  194. if (!record->event.pressed) {
  195. register_code(is_overwatch ? KC_BSPC : KC_ENTER);
  196. unregister_code(is_overwatch ? KC_BSPC : KC_ENTER);
  197. _delay_ms(50);
  198. SEND_STRING("Good luck, have fun!!!");
  199. register_code(KC_ENTER);
  200. unregister_code(KC_ENTER);
  201. }
  202. return false;
  203. break;
  204. case KC_SYMM:
  205. if (!record->event.pressed) {
  206. register_code(is_overwatch ? KC_BSPC : KC_ENTER);
  207. unregister_code(is_overwatch ? KC_BSPC : KC_ENTER);
  208. _delay_ms(50);
  209. SEND_STRING("Left click to win!");
  210. register_code(KC_ENTER);
  211. unregister_code(KC_ENTER);
  212. }
  213. return false;
  214. break;
  215. case KC_JUSTGAME:
  216. if (!record->event.pressed) {
  217. register_code(is_overwatch ? KC_BSPC : KC_ENTER);
  218. unregister_code(is_overwatch ? KC_BSPC : KC_ENTER);
  219. _delay_ms(50);
  220. SEND_STRING("It may be a game, but if you don't want to actually try, please go play AI, so that people that actually want to take the game seriously and \"get good\" have a place to do so without trolls like you throwing games.");
  221. register_code(KC_ENTER);
  222. unregister_code(KC_ENTER);
  223. }
  224. return false;
  225. break;
  226. case KC_TORB:
  227. if (!record->event.pressed) {
  228. register_code(is_overwatch ? KC_BSPC : KC_ENTER);
  229. unregister_code(is_overwatch ? KC_BSPC : KC_ENTER);
  230. _delay_ms(50);
  231. SEND_STRING("That was positively riveting!");
  232. register_code(KC_ENTER);
  233. unregister_code(KC_ENTER);
  234. }
  235. return false;
  236. break;
  237. case KC_AIM:
  238. if (!record->event.pressed) {
  239. register_code(is_overwatch ? KC_BSPC : KC_ENTER);
  240. unregister_code(is_overwatch ? KC_BSPC : KC_ENTER);
  241. _delay_ms(50);
  242. SEND_STRING("That aim is absolutely amazing. It's almost like you're a machine!" SS_TAP(X_ENTER));
  243. _delay_ms(50);
  244. SEND_STRING("Wait! That aim is TOO good! You're clearly using an aim hack! CHEATER!" SS_TAP(X_ENTER));
  245. }
  246. return false;
  247. break;
  248. #endif
  249. case KC_MAKE:
  250. if (!record->event.pressed) {
  251. SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP);
  252. #ifndef CATERINA_BOOTLOADER
  253. SEND_STRING(":teensy ");
  254. #else
  255. SEND_STRING(" ");
  256. #endif
  257. #ifdef RGBLIGHT_ENABLE
  258. SEND_STRING("RGBLIGHT_ENABLE=yes ");
  259. #else
  260. SEND_STRING("RGBLIGHT_ENABLE=no ");
  261. #endif
  262. #ifdef AUDIO_ENABLE
  263. SEND_STRING("AUDIO_ENABLE=yes ");
  264. #else
  265. SEND_STRING("AUDIO_ENABLE=no ");
  266. #endif
  267. #ifdef FAUXCLICKY_ENABLE
  268. SEND_STRING("FAUXCLICKY_ENABLE=yes ");
  269. #else
  270. SEND_STRING("FAUXCLICKY_ENABLE=no ");
  271. #endif
  272. SEND_STRING(SS_TAP(X_ENTER));
  273. }
  274. return false;
  275. break;
  276. case KC_RESET:
  277. if (!record->event.pressed) {
  278. #ifdef RGBLIGHT_ENABLE
  279. rgblight_enable();
  280. rgblight_mode(1);
  281. rgblight_setrgb(0xff, 0x00, 0x00);
  282. #endif
  283. reset_keyboard();
  284. }
  285. return false;
  286. break;
  287. case EPRM:
  288. if (record->event.pressed) {
  289. eeconfig_init();
  290. }
  291. return false;
  292. break;
  293. case VRSN:
  294. if (record->event.pressed) {
  295. SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
  296. }
  297. return false;
  298. break;
  299. }
  300. return process_record_keymap(keycode, record);
  301. }
  302. // Runs state check and changes underglow color and animation
  303. // on layer change, no matter where the change was initiated
  304. // Then runs keymap's layer change check
  305. uint32_t layer_state_set_user (uint32_t state) {
  306. #ifdef RGBLIGHT_ENABLE
  307. uint8_t default_layer = eeconfig_read_default_layer();
  308. switch (biton32(state)) {
  309. case _NAV:
  310. rgblight_set_blue;
  311. rgblight_mode(1);
  312. break;
  313. case _SYMB:
  314. rgblight_set_blue;
  315. rgblight_mode(2);
  316. break;
  317. case _MOUS:
  318. rgblight_set_yellow;
  319. rgblight_mode(1);
  320. break;
  321. case _MACROS:
  322. rgblight_set_orange;
  323. is_overwatch ? rgblight_mode(17) : rgblight_mode(18);
  324. break;
  325. case _MEDIA:
  326. rgblight_set_green;
  327. rgblight_mode(22);
  328. break;
  329. case _OVERWATCH:
  330. rgblight_set_orange;
  331. rgblight_mode(17);
  332. break;
  333. case _DIABLO:
  334. rgblight_set_red;
  335. rgblight_mode(5);
  336. break;
  337. case _RAISE:
  338. rgblight_set_yellow;
  339. rgblight_mode(5);
  340. break;
  341. case _LOWER:
  342. rgblight_set_orange;
  343. rgblight_mode(5);
  344. break;
  345. case _ADJUST:
  346. rgblight_set_red;
  347. rgblight_mode(23);
  348. break;
  349. case _COVECUBE:
  350. rgblight_set_green;
  351. rgblight_mode(2);
  352. default:
  353. if (default_layer & (1UL << _COLEMAK)) {
  354. rgblight_set_magenta;
  355. }
  356. else if (default_layer & (1UL << _DVORAK)) {
  357. rgblight_set_green;
  358. }
  359. else if (default_layer & (1UL << _WORKMAN)) {
  360. rgblight_set_purple;
  361. }
  362. else {
  363. rgblight_set_teal;
  364. }
  365. rgblight_mode(1);
  366. break;
  367. }
  368. #endif
  369. return layer_state_set_keymap (state);
  370. }