spidey3.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. #include QMK_KEYBOARD_H
  2. #include "spidey3.h"
  3. #include "version.h"
  4. #include <stdlib.h>
  5. static bool rand_seeded = false;
  6. uint16_t spi_replace_mode = SPI_NORMAL;
  7. bool spi_gflock = false;
  8. #if defined(CONSOLE_ENABLE) && !defined(NO_DEBUG)
  9. static uint32_t matrix_scan_count = 0;
  10. static bool reported_version = false;
  11. # if defined(SPI_DEBUG_SCAN_RATE)
  12. static uint32_t matrix_timer = 0;
  13. static uint32_t last_matrix_scan_count = 0;
  14. # endif
  15. void matrix_scan_user(void) {
  16. # if defined(SPI_DEBUG_SCAN_RATE)
  17. matrix_scan_count++;
  18. if (debug_enable) {
  19. uint32_t timer_now = timer_read32();
  20. if (matrix_timer == 0) {
  21. matrix_timer = timer_now;
  22. last_matrix_scan_count = matrix_scan_count;
  23. matrix_scan_count = 0;
  24. } else if (TIMER_DIFF_32(timer_now, matrix_timer) > SPI_SCAN_RATE_INTERVAL * 1000) {
  25. matrix_timer = timer_now;
  26. last_matrix_scan_count = matrix_scan_count;
  27. matrix_scan_count = 0;
  28. if (!reported_version) {
  29. uprintln(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE);
  30. reported_version = true;
  31. }
  32. uprintf("scan rate: %lu/s\n", last_matrix_scan_count / SPI_SCAN_RATE_INTERVAL);
  33. }
  34. }
  35. # else
  36. if (!reported_version) {
  37. matrix_scan_count++;
  38. if (matrix_scan_count > 300) {
  39. uprintln(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE);
  40. reported_version = true;
  41. }
  42. }
  43. # endif
  44. }
  45. #endif
  46. bool process_record_glyph_replacement(uint16_t keycode, keyrecord_t *record, uint32_t baseAlphaLower, uint32_t baseAlphaUpper, uint32_t zeroGlyph, uint32_t baseNumberOne, uint32_t spaceGlyph) {
  47. uint8_t temp_mod = get_mods();
  48. #ifndef NO_ACTION_ONESHOT
  49. uint8_t temp_osm = get_oneshot_mods();
  50. #else
  51. uint8_t temp_osm = 0;
  52. #endif
  53. if ((((temp_mod | temp_osm) & (MOD_MASK_CTRL | MOD_MASK_ALT | MOD_MASK_GUI))) == 0) {
  54. switch (keycode) {
  55. case KC_A ... KC_Z:
  56. if (record->event.pressed) {
  57. clear_mods();
  58. #ifndef NO_ACTION_ONESHOT
  59. clear_oneshot_mods();
  60. #endif
  61. unicode_input_start();
  62. uint32_t base = ((temp_mod | temp_osm) & MOD_MASK_SHIFT) ? baseAlphaUpper : baseAlphaLower;
  63. register_hex32(base + (keycode - KC_A));
  64. unicode_input_finish();
  65. set_mods(temp_mod);
  66. }
  67. return false;
  68. case KC_0:
  69. if ((temp_mod | temp_osm) & MOD_MASK_SHIFT) { // skip shifted numbers, so that we can still use symbols etc.
  70. return true;
  71. }
  72. if (record->event.pressed) {
  73. unicode_input_start();
  74. register_hex32(zeroGlyph);
  75. unicode_input_finish();
  76. }
  77. return false;
  78. case KC_1 ... KC_9:
  79. if ((temp_mod | temp_osm) & MOD_MASK_SHIFT) { // skip shifted numbers, so that we can still use symbols etc.
  80. return true;
  81. }
  82. if (record->event.pressed) {
  83. unicode_input_start();
  84. register_hex32(baseNumberOne + (keycode - KC_1));
  85. unicode_input_finish();
  86. }
  87. return false;
  88. case KC_SPACE:
  89. if (record->event.pressed) {
  90. unicode_input_start();
  91. register_hex32(spaceGlyph); // em space
  92. unicode_input_finish();
  93. }
  94. return false;
  95. }
  96. }
  97. return true;
  98. }
  99. bool process_gflock(uint16_t keycode, keyrecord_t *record) {
  100. if (!spi_gflock) {
  101. return true;
  102. }
  103. if (record->event.pressed) {
  104. register_code16(G(keycode));
  105. } else {
  106. unregister_code16(G(keycode));
  107. }
  108. return false;
  109. }
  110. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  111. if (!rand_seeded) {
  112. srand(record->event.time % keycode);
  113. rand_seeded = true;
  114. }
  115. if (record->event.pressed) {
  116. switch (keycode) {
  117. #ifndef NO_DEBUG
  118. // Re-implement this here, but fix the persistence!
  119. case DEBUG:
  120. if (!debug_enable) {
  121. debug_enable = 1;
  122. # if defined(SPI_DEBUG_SCAN_RATE)
  123. matrix_timer = 0;
  124. reported_version = false;
  125. # endif
  126. } else if (!debug_keyboard) {
  127. debug_keyboard = 1;
  128. } else if (!debug_matrix) {
  129. debug_matrix = 1;
  130. } else {
  131. debug_enable = 0;
  132. debug_keyboard = 0;
  133. debug_matrix = 0;
  134. }
  135. uprintf("DEBUG: enable=%u, keyboard=%u, matrix=%u\n", debug_enable, debug_keyboard, debug_matrix);
  136. eeconfig_update_debug(debug_config.raw);
  137. return false;
  138. #endif
  139. // clang-format off
  140. case CH_CPNL: host_consumer_send(AL_CONTROL_PANEL); return false;
  141. case CH_ASST: host_consumer_send(AL_ASSISTANT); return false;
  142. case CH_SUSP: tap_code16(LGUI(LSFT(KC_L))); return true;
  143. // clang-format on
  144. case SPI_LNX:
  145. dprint("SPI_LNX\n");
  146. set_single_persistent_default_layer(_BASE);
  147. layer_off(_OSX);
  148. #if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE)
  149. set_unicode_input_mode(UC_LNX);
  150. #endif
  151. break;
  152. case SPI_OSX:
  153. dprint("SPI_OSX\n");
  154. set_single_persistent_default_layer(_OSX);
  155. #if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE)
  156. set_unicode_input_mode(UC_OSX);
  157. #endif
  158. break;
  159. case SPI_WIN:
  160. dprint("SPI_WIN\n");
  161. set_single_persistent_default_layer(_BASE);
  162. layer_off(_OSX);
  163. #if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE)
  164. set_unicode_input_mode(UC_WINC);
  165. #endif
  166. break;
  167. case SPI_NORMAL ... SPI_FRAKTR:
  168. spi_replace_mode = (spi_replace_mode == keycode) ? SPI_NORMAL : keycode;
  169. dprintf("spi_replace_mode = %u\n", spi_replace_mode);
  170. break;
  171. case SPI_GFLOCK:
  172. spi_gflock = !spi_gflock;
  173. dprintf("spi_gflock = %u\n", spi_gflock);
  174. break;
  175. case KC_PSCR: {
  176. uint8_t mods = get_mods();
  177. #ifndef NO_ACTION_ONESHOT
  178. uint8_t osm = get_oneshot_mods();
  179. #else
  180. uint8_t osm = 0;
  181. #endif
  182. switch (get_unicode_input_mode()) {
  183. case UC_MAC:
  184. if ((mods | osm) & MOD_MASK_ALT) {
  185. // Window screenshot
  186. clear_mods();
  187. #ifndef NO_ACTION_ONESHOT
  188. clear_oneshot_mods();
  189. #endif
  190. tap_code16(LSFT(LGUI(KC_4)));
  191. wait_ms(100);
  192. tap_code(KC_SPC);
  193. set_mods(mods);
  194. return false;
  195. } else if ((mods | osm) & MOD_MASK_SHIFT) {
  196. // Partial screenshot
  197. tap_code16(LSFT(LGUI(KC_4)));
  198. return false;
  199. } else {
  200. // Full screenshot
  201. tap_code16(LSFT(LGUI(KC_3)));
  202. return false;
  203. }
  204. break;
  205. case UC_WIN:
  206. case UC_WINC:
  207. if ((mods | osm) & MOD_MASK_ALT) {
  208. // Window screenshot
  209. // Alt+PrintScreen should work as is
  210. } else if ((mods | osm) & MOD_MASK_SHIFT) {
  211. // Partial screenshot
  212. tap_code16(LGUI(LSFT(KC_S)));
  213. return false;
  214. } else {
  215. // Full screenshot
  216. // PrintScreen should work as is
  217. }
  218. break;
  219. default:
  220. // Note: These are specific to ChromeOS
  221. if ((mods | osm) & MOD_MASK_ALT) {
  222. // Window screenshot
  223. tap_code16(LCTL(LALT(KC_F5)));
  224. return false;
  225. } else if ((mods | osm) & MOD_MASK_SHIFT) {
  226. // Partial screenshot
  227. tap_code16(LCTL(LSFT(KC_F5)));
  228. return false;
  229. } else {
  230. // Full screenshot
  231. // PrintScreen should work as is
  232. }
  233. break;
  234. }
  235. break;
  236. }
  237. }
  238. } else {
  239. switch (keycode) {
  240. case CH_CPNL:
  241. case CH_ASST:
  242. host_consumer_send(0);
  243. return false;
  244. }
  245. }
  246. switch (keycode) {
  247. case KC_A ... KC_0:
  248. case KC_SPACE:
  249. switch (spi_replace_mode) {
  250. case SPI_WIDE:
  251. return process_record_glyph_replacement(keycode, record, 0xFF41, 0xFF21, 0xFF10, 0xFF11, 0x2003);
  252. case SPI_SCRIPT:
  253. return process_record_glyph_replacement(keycode, record, 0x1D4EA, 0x1D4D0, 0x1D7CE, 0x1D7CF, 0x2002);
  254. case SPI_BLOCKS:
  255. return process_record_glyph_replacement(keycode, record, 0x1F170, 0x1F170, '0', '1', 0x2002);
  256. case SPI_CIRCLE:
  257. return process_record_glyph_replacement(keycode, record, 0x1F150, 0x1F150, '0', '1', 0x2002);
  258. case SPI_SQUARE:
  259. return process_record_glyph_replacement(keycode, record, 0x1F130, 0x1F130, '0', '1', 0x2002);
  260. case SPI_PARENS:
  261. return process_record_glyph_replacement(keycode, record, 0x1F110, 0x1F110, '0', '1', 0x2002);
  262. case SPI_FRAKTR:
  263. return process_record_glyph_replacement(keycode, record, 0x1D586, 0x1D56C, '0', '1', 0x2002);
  264. }
  265. break;
  266. case KC_F1 ... KC_F12:
  267. return process_gflock(keycode, record);
  268. }
  269. #ifdef RGBLIGHT_ENABLE
  270. bool res = process_record_user_rgb(keycode, record);
  271. if (!res) return false;
  272. #endif
  273. return true;
  274. }
  275. void post_process_record_user(uint16_t keycode, keyrecord_t *record) {
  276. #ifdef RGBLIGHT_ENABLE
  277. post_process_record_user_rgb(keycode, record);
  278. #endif
  279. return;
  280. }
  281. layer_state_t default_layer_state_set_user(layer_state_t state) {
  282. #ifdef RGBLIGHT_ENABLE
  283. return default_layer_state_set_user_rgb(state);
  284. #else
  285. return state;
  286. #endif
  287. }
  288. layer_state_t layer_state_set_user(layer_state_t state) {
  289. #ifdef RGBLIGHT_ENABLE
  290. return layer_state_set_user_rgb(state);
  291. #else
  292. return state;
  293. #endif
  294. }
  295. bool led_update_user(led_t led_state) {
  296. #ifdef RGBLIGHT_ENABLE
  297. return led_update_user_rgb(led_state);
  298. #else
  299. return true;
  300. #endif
  301. }