quantum.c 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130
  1. /* Copyright 2016-2017 Jack Humbert
  2. *
  3. * This program is free software: you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License as published by
  5. * the Free Software Foundation, either version 2 of the License, or
  6. * (at your option) any later version.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #include "quantum.h"
  17. #if !defined(RGBLIGHT_ENABLE) && !defined(RGB_MATRIX_ENABLE)
  18. # include "rgb.h"
  19. #endif
  20. #ifdef PROTOCOL_LUFA
  21. # include "outputselect.h"
  22. #endif
  23. #ifdef BACKLIGHT_ENABLE
  24. # include "backlight.h"
  25. extern backlight_config_t backlight_config;
  26. #endif
  27. #ifdef FAUXCLICKY_ENABLE
  28. # include "fauxclicky.h"
  29. #endif
  30. #ifdef API_ENABLE
  31. # include "api.h"
  32. #endif
  33. #ifdef MIDI_ENABLE
  34. # include "process_midi.h"
  35. #endif
  36. #ifdef VELOCIKEY_ENABLE
  37. # include "velocikey.h"
  38. #endif
  39. #ifdef HAPTIC_ENABLE
  40. # include "haptic.h"
  41. #endif
  42. #ifdef ENCODER_ENABLE
  43. # include "encoder.h"
  44. #endif
  45. #ifdef AUDIO_ENABLE
  46. # ifndef GOODBYE_SONG
  47. # define GOODBYE_SONG SONG(GOODBYE_SOUND)
  48. # endif
  49. # ifndef AG_NORM_SONG
  50. # define AG_NORM_SONG SONG(AG_NORM_SOUND)
  51. # endif
  52. # ifndef AG_SWAP_SONG
  53. # define AG_SWAP_SONG SONG(AG_SWAP_SOUND)
  54. # endif
  55. # ifndef CG_NORM_SONG
  56. # define CG_NORM_SONG SONG(AG_NORM_SOUND)
  57. # endif
  58. # ifndef CG_SWAP_SONG
  59. # define CG_SWAP_SONG SONG(AG_SWAP_SOUND)
  60. # endif
  61. float goodbye_song[][2] = GOODBYE_SONG;
  62. float ag_norm_song[][2] = AG_NORM_SONG;
  63. float ag_swap_song[][2] = AG_SWAP_SONG;
  64. float cg_norm_song[][2] = CG_NORM_SONG;
  65. float cg_swap_song[][2] = CG_SWAP_SONG;
  66. # ifdef DEFAULT_LAYER_SONGS
  67. float default_layer_songs[][16][2] = DEFAULT_LAYER_SONGS;
  68. # endif
  69. #endif
  70. static void do_code16(uint16_t code, void (*f)(uint8_t)) {
  71. switch (code) {
  72. case QK_MODS ... QK_MODS_MAX:
  73. break;
  74. default:
  75. return;
  76. }
  77. uint8_t mods_to_send = 0;
  78. if (code & QK_RMODS_MIN) { // Right mod flag is set
  79. if (code & QK_LCTL) mods_to_send |= MOD_BIT(KC_RCTL);
  80. if (code & QK_LSFT) mods_to_send |= MOD_BIT(KC_RSFT);
  81. if (code & QK_LALT) mods_to_send |= MOD_BIT(KC_RALT);
  82. if (code & QK_LGUI) mods_to_send |= MOD_BIT(KC_RGUI);
  83. } else {
  84. if (code & QK_LCTL) mods_to_send |= MOD_BIT(KC_LCTL);
  85. if (code & QK_LSFT) mods_to_send |= MOD_BIT(KC_LSFT);
  86. if (code & QK_LALT) mods_to_send |= MOD_BIT(KC_LALT);
  87. if (code & QK_LGUI) mods_to_send |= MOD_BIT(KC_LGUI);
  88. }
  89. f(mods_to_send);
  90. }
  91. void register_code16(uint16_t code) {
  92. if (IS_MOD(code) || code == KC_NO) {
  93. do_code16(code, register_mods);
  94. } else {
  95. do_code16(code, register_weak_mods);
  96. }
  97. register_code(code);
  98. }
  99. void unregister_code16(uint16_t code) {
  100. unregister_code(code);
  101. if (IS_MOD(code) || code == KC_NO) {
  102. do_code16(code, unregister_mods);
  103. } else {
  104. do_code16(code, unregister_weak_mods);
  105. }
  106. }
  107. void tap_code16(uint16_t code) {
  108. register_code16(code);
  109. #if TAP_CODE_DELAY > 0
  110. wait_ms(TAP_CODE_DELAY);
  111. #endif
  112. unregister_code16(code);
  113. }
  114. __attribute__((weak)) bool process_action_kb(keyrecord_t *record) { return true; }
  115. __attribute__((weak)) bool process_record_kb(uint16_t keycode, keyrecord_t *record) { return process_record_user(keycode, record); }
  116. __attribute__((weak)) bool process_record_user(uint16_t keycode, keyrecord_t *record) { return true; }
  117. void reset_keyboard(void) {
  118. clear_keyboard();
  119. #if defined(MIDI_ENABLE) && defined(MIDI_BASIC)
  120. process_midi_all_notes_off();
  121. #endif
  122. #ifdef AUDIO_ENABLE
  123. # ifndef NO_MUSIC_MODE
  124. music_all_notes_off();
  125. # endif
  126. uint16_t timer_start = timer_read();
  127. PLAY_SONG(goodbye_song);
  128. shutdown_user();
  129. while (timer_elapsed(timer_start) < 250) wait_ms(1);
  130. stop_all_notes();
  131. #else
  132. shutdown_user();
  133. wait_ms(250);
  134. #endif
  135. #ifdef HAPTIC_ENABLE
  136. haptic_shutdown();
  137. #endif
  138. // this is also done later in bootloader.c - not sure if it's neccesary here
  139. #ifdef BOOTLOADER_CATERINA
  140. *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific
  141. #endif
  142. bootloader_jump();
  143. }
  144. /* true if the last press of GRAVE_ESC was shifted (i.e. GUI or SHIFT were pressed), false otherwise.
  145. * Used to ensure that the correct keycode is released if the key is released.
  146. */
  147. static bool grave_esc_was_shifted = false;
  148. /* Convert record into usable keycode via the contained event. */
  149. uint16_t get_record_keycode(keyrecord_t *record) { return get_event_keycode(record->event); }
  150. /* Convert event into usable keycode. Checks the layer cache to ensure that it
  151. * retains the correct keycode after a layer change, if the key is still pressed.
  152. */
  153. uint16_t get_event_keycode(keyevent_t event) {
  154. #if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE)
  155. /* TODO: Use store_or_get_action() or a similar function. */
  156. if (!disable_action_cache) {
  157. uint8_t layer;
  158. if (event.pressed) {
  159. layer = layer_switch_get_layer(event.key);
  160. update_source_layers_cache(event.key, layer);
  161. } else {
  162. layer = read_source_layers_cache(event.key);
  163. }
  164. return keymap_key_to_keycode(layer, event.key);
  165. } else
  166. #endif
  167. return keymap_key_to_keycode(layer_switch_get_layer(event.key), event.key);
  168. }
  169. /* Main keycode processing function. Hands off handling to other functions,
  170. * then processes internal Quantum keycodes, then processes ACTIONs.
  171. */
  172. bool process_record_quantum(keyrecord_t *record) {
  173. uint16_t keycode = get_record_keycode(record);
  174. // This is how you use actions here
  175. // if (keycode == KC_LEAD) {
  176. // action_t action;
  177. // action.code = ACTION_DEFAULT_LAYER_SET(0);
  178. // process_action(record, action);
  179. // return false;
  180. // }
  181. #ifdef VELOCIKEY_ENABLE
  182. if (velocikey_enabled() && record->event.pressed) {
  183. velocikey_accelerate();
  184. }
  185. #endif
  186. #ifdef TAP_DANCE_ENABLE
  187. preprocess_tap_dance(keycode, record);
  188. #endif
  189. if (!(
  190. #if defined(KEY_LOCK_ENABLE)
  191. // Must run first to be able to mask key_up events.
  192. process_key_lock(&keycode, record) &&
  193. #endif
  194. #if defined(DYNAMIC_MACRO_ENABLE) && !defined(DYNAMIC_MACRO_USER_CALL)
  195. // Must run asap to ensure all keypresses are recorded.
  196. process_dynamic_macro(keycode, record) &&
  197. #endif
  198. #if defined(AUDIO_ENABLE) && defined(AUDIO_CLICKY)
  199. process_clicky(keycode, record) &&
  200. #endif // AUDIO_CLICKY
  201. #ifdef HAPTIC_ENABLE
  202. process_haptic(keycode, record) &&
  203. #endif // HAPTIC_ENABLE
  204. #if defined(RGB_MATRIX_ENABLE)
  205. process_rgb_matrix(keycode, record) &&
  206. #endif
  207. process_record_kb(keycode, record) &&
  208. #if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED)
  209. process_midi(keycode, record) &&
  210. #endif
  211. #ifdef AUDIO_ENABLE
  212. process_audio(keycode, record) &&
  213. #endif
  214. #ifdef STENO_ENABLE
  215. process_steno(keycode, record) &&
  216. #endif
  217. #if (defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC))) && !defined(NO_MUSIC_MODE)
  218. process_music(keycode, record) &&
  219. #endif
  220. #ifdef TAP_DANCE_ENABLE
  221. process_tap_dance(keycode, record) &&
  222. #endif
  223. #if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)
  224. process_unicode_common(keycode, record) &&
  225. #endif
  226. #ifdef LEADER_ENABLE
  227. process_leader(keycode, record) &&
  228. #endif
  229. #ifdef COMBO_ENABLE
  230. process_combo(keycode, record) &&
  231. #endif
  232. #ifdef PRINTING_ENABLE
  233. process_printer(keycode, record) &&
  234. #endif
  235. #ifdef AUTO_SHIFT_ENABLE
  236. process_auto_shift(keycode, record) &&
  237. #endif
  238. #ifdef TERMINAL_ENABLE
  239. process_terminal(keycode, record) &&
  240. #endif
  241. #ifdef SPACE_CADET_ENABLE
  242. process_space_cadet(keycode, record) &&
  243. #endif
  244. true)) {
  245. return false;
  246. }
  247. // Shift / paren setup
  248. switch (keycode) {
  249. case RESET:
  250. if (record->event.pressed) {
  251. reset_keyboard();
  252. }
  253. return false;
  254. case DEBUG:
  255. if (record->event.pressed) {
  256. debug_enable ^= 1;
  257. if (debug_enable) {
  258. print("DEBUG: enabled.\n");
  259. } else {
  260. print("DEBUG: disabled.\n");
  261. }
  262. }
  263. return false;
  264. case EEPROM_RESET:
  265. if (record->event.pressed) {
  266. eeconfig_init();
  267. }
  268. return false;
  269. #ifdef FAUXCLICKY_ENABLE
  270. case FC_TOG:
  271. if (record->event.pressed) {
  272. FAUXCLICKY_TOGGLE;
  273. }
  274. return false;
  275. case FC_ON:
  276. if (record->event.pressed) {
  277. FAUXCLICKY_ON;
  278. }
  279. return false;
  280. case FC_OFF:
  281. if (record->event.pressed) {
  282. FAUXCLICKY_OFF;
  283. }
  284. return false;
  285. #endif
  286. #if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
  287. case RGB_TOG:
  288. // Split keyboards need to trigger on key-up for edge-case issue
  289. # ifndef SPLIT_KEYBOARD
  290. if (record->event.pressed) {
  291. # else
  292. if (!record->event.pressed) {
  293. # endif
  294. rgblight_toggle();
  295. }
  296. return false;
  297. case RGB_MODE_FORWARD:
  298. if (record->event.pressed) {
  299. uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT));
  300. if (shifted) {
  301. rgblight_step_reverse();
  302. } else {
  303. rgblight_step();
  304. }
  305. }
  306. return false;
  307. case RGB_MODE_REVERSE:
  308. if (record->event.pressed) {
  309. uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT));
  310. if (shifted) {
  311. rgblight_step();
  312. } else {
  313. rgblight_step_reverse();
  314. }
  315. }
  316. return false;
  317. case RGB_HUI:
  318. // Split keyboards need to trigger on key-up for edge-case issue
  319. # ifndef SPLIT_KEYBOARD
  320. if (record->event.pressed) {
  321. # else
  322. if (!record->event.pressed) {
  323. # endif
  324. rgblight_increase_hue();
  325. }
  326. return false;
  327. case RGB_HUD:
  328. // Split keyboards need to trigger on key-up for edge-case issue
  329. # ifndef SPLIT_KEYBOARD
  330. if (record->event.pressed) {
  331. # else
  332. if (!record->event.pressed) {
  333. # endif
  334. rgblight_decrease_hue();
  335. }
  336. return false;
  337. case RGB_SAI:
  338. // Split keyboards need to trigger on key-up for edge-case issue
  339. # ifndef SPLIT_KEYBOARD
  340. if (record->event.pressed) {
  341. # else
  342. if (!record->event.pressed) {
  343. # endif
  344. rgblight_increase_sat();
  345. }
  346. return false;
  347. case RGB_SAD:
  348. // Split keyboards need to trigger on key-up for edge-case issue
  349. # ifndef SPLIT_KEYBOARD
  350. if (record->event.pressed) {
  351. # else
  352. if (!record->event.pressed) {
  353. # endif
  354. rgblight_decrease_sat();
  355. }
  356. return false;
  357. case RGB_VAI:
  358. // Split keyboards need to trigger on key-up for edge-case issue
  359. # ifndef SPLIT_KEYBOARD
  360. if (record->event.pressed) {
  361. # else
  362. if (!record->event.pressed) {
  363. # endif
  364. rgblight_increase_val();
  365. }
  366. return false;
  367. case RGB_VAD:
  368. // Split keyboards need to trigger on key-up for edge-case issue
  369. # ifndef SPLIT_KEYBOARD
  370. if (record->event.pressed) {
  371. # else
  372. if (!record->event.pressed) {
  373. # endif
  374. rgblight_decrease_val();
  375. }
  376. return false;
  377. case RGB_SPI:
  378. if (record->event.pressed) {
  379. rgblight_increase_speed();
  380. }
  381. return false;
  382. case RGB_SPD:
  383. if (record->event.pressed) {
  384. rgblight_decrease_speed();
  385. }
  386. return false;
  387. case RGB_MODE_PLAIN:
  388. if (record->event.pressed) {
  389. rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT);
  390. }
  391. return false;
  392. case RGB_MODE_BREATHE:
  393. # ifdef RGBLIGHT_EFFECT_BREATHING
  394. if (record->event.pressed) {
  395. if ((RGBLIGHT_MODE_BREATHING <= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_BREATHING_end)) {
  396. rgblight_step();
  397. } else {
  398. rgblight_mode(RGBLIGHT_MODE_BREATHING);
  399. }
  400. }
  401. # endif
  402. return false;
  403. case RGB_MODE_RAINBOW:
  404. # ifdef RGBLIGHT_EFFECT_RAINBOW_MOOD
  405. if (record->event.pressed) {
  406. if ((RGBLIGHT_MODE_RAINBOW_MOOD <= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_RAINBOW_MOOD_end)) {
  407. rgblight_step();
  408. } else {
  409. rgblight_mode(RGBLIGHT_MODE_RAINBOW_MOOD);
  410. }
  411. }
  412. # endif
  413. return false;
  414. case RGB_MODE_SWIRL:
  415. # ifdef RGBLIGHT_EFFECT_RAINBOW_SWIRL
  416. if (record->event.pressed) {
  417. if ((RGBLIGHT_MODE_RAINBOW_SWIRL <= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_RAINBOW_SWIRL_end)) {
  418. rgblight_step();
  419. } else {
  420. rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL);
  421. }
  422. }
  423. # endif
  424. return false;
  425. case RGB_MODE_SNAKE:
  426. # ifdef RGBLIGHT_EFFECT_SNAKE
  427. if (record->event.pressed) {
  428. if ((RGBLIGHT_MODE_SNAKE <= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_SNAKE_end)) {
  429. rgblight_step();
  430. } else {
  431. rgblight_mode(RGBLIGHT_MODE_SNAKE);
  432. }
  433. }
  434. # endif
  435. return false;
  436. case RGB_MODE_KNIGHT:
  437. # ifdef RGBLIGHT_EFFECT_KNIGHT
  438. if (record->event.pressed) {
  439. if ((RGBLIGHT_MODE_KNIGHT <= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_KNIGHT_end)) {
  440. rgblight_step();
  441. } else {
  442. rgblight_mode(RGBLIGHT_MODE_KNIGHT);
  443. }
  444. }
  445. # endif
  446. return false;
  447. case RGB_MODE_XMAS:
  448. # ifdef RGBLIGHT_EFFECT_CHRISTMAS
  449. if (record->event.pressed) {
  450. rgblight_mode(RGBLIGHT_MODE_CHRISTMAS);
  451. }
  452. # endif
  453. return false;
  454. case RGB_MODE_GRADIENT:
  455. # ifdef RGBLIGHT_EFFECT_STATIC_GRADIENT
  456. if (record->event.pressed) {
  457. if ((RGBLIGHT_MODE_STATIC_GRADIENT <= rgblight_get_mode()) && (rgblight_get_mode() < RGBLIGHT_MODE_STATIC_GRADIENT_end)) {
  458. rgblight_step();
  459. } else {
  460. rgblight_mode(RGBLIGHT_MODE_STATIC_GRADIENT);
  461. }
  462. }
  463. # endif
  464. return false;
  465. case RGB_MODE_RGBTEST:
  466. # ifdef RGBLIGHT_EFFECT_RGB_TEST
  467. if (record->event.pressed) {
  468. rgblight_mode(RGBLIGHT_MODE_RGB_TEST);
  469. }
  470. # endif
  471. return false;
  472. #endif // defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
  473. #ifdef VELOCIKEY_ENABLE
  474. case VLK_TOG:
  475. if (record->event.pressed) {
  476. velocikey_toggle();
  477. }
  478. return false;
  479. #endif
  480. #ifdef PROTOCOL_LUFA
  481. case OUT_AUTO:
  482. if (record->event.pressed) {
  483. set_output(OUTPUT_AUTO);
  484. }
  485. return false;
  486. case OUT_USB:
  487. if (record->event.pressed) {
  488. set_output(OUTPUT_USB);
  489. }
  490. return false;
  491. # ifdef BLUETOOTH_ENABLE
  492. case OUT_BT:
  493. if (record->event.pressed) {
  494. set_output(OUTPUT_BLUETOOTH);
  495. }
  496. return false;
  497. # endif
  498. #endif
  499. case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_TOGGLE_ALT_GUI:
  500. case MAGIC_SWAP_LCTL_LGUI ... MAGIC_EE_HANDS_RIGHT:
  501. if (record->event.pressed) {
  502. // MAGIC actions (BOOTMAGIC without the boot)
  503. if (!eeconfig_is_enabled()) {
  504. eeconfig_init();
  505. }
  506. /* keymap config */
  507. keymap_config.raw = eeconfig_read_keymap();
  508. switch (keycode) {
  509. case MAGIC_SWAP_CONTROL_CAPSLOCK:
  510. keymap_config.swap_control_capslock = true;
  511. break;
  512. case MAGIC_CAPSLOCK_TO_CONTROL:
  513. keymap_config.capslock_to_control = true;
  514. break;
  515. case MAGIC_SWAP_LALT_LGUI:
  516. keymap_config.swap_lalt_lgui = true;
  517. break;
  518. case MAGIC_SWAP_RALT_RGUI:
  519. keymap_config.swap_ralt_rgui = true;
  520. break;
  521. case MAGIC_SWAP_LCTL_LGUI:
  522. keymap_config.swap_lctl_lgui = true;
  523. break;
  524. case MAGIC_SWAP_RCTL_RGUI:
  525. keymap_config.swap_rctl_rgui = true;
  526. break;
  527. case MAGIC_NO_GUI:
  528. keymap_config.no_gui = true;
  529. break;
  530. case MAGIC_SWAP_GRAVE_ESC:
  531. keymap_config.swap_grave_esc = true;
  532. break;
  533. case MAGIC_SWAP_BACKSLASH_BACKSPACE:
  534. keymap_config.swap_backslash_backspace = true;
  535. break;
  536. case MAGIC_HOST_NKRO:
  537. clear_keyboard(); // clear first buffer to prevent stuck keys
  538. keymap_config.nkro = true;
  539. break;
  540. case MAGIC_SWAP_ALT_GUI:
  541. keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = true;
  542. #ifdef AUDIO_ENABLE
  543. PLAY_SONG(ag_swap_song);
  544. #endif
  545. break;
  546. case MAGIC_SWAP_CTL_GUI:
  547. keymap_config.swap_lctl_lgui = keymap_config.swap_rctl_rgui = true;
  548. #ifdef AUDIO_ENABLE
  549. PLAY_SONG(cg_swap_song);
  550. #endif
  551. break;
  552. case MAGIC_UNSWAP_CONTROL_CAPSLOCK:
  553. keymap_config.swap_control_capslock = false;
  554. break;
  555. case MAGIC_UNCAPSLOCK_TO_CONTROL:
  556. keymap_config.capslock_to_control = false;
  557. break;
  558. case MAGIC_UNSWAP_LALT_LGUI:
  559. keymap_config.swap_lalt_lgui = false;
  560. break;
  561. case MAGIC_UNSWAP_RALT_RGUI:
  562. keymap_config.swap_ralt_rgui = false;
  563. break;
  564. case MAGIC_UNSWAP_LCTL_LGUI:
  565. keymap_config.swap_lctl_lgui = false;
  566. break;
  567. case MAGIC_UNSWAP_RCTL_RGUI:
  568. keymap_config.swap_rctl_rgui = false;
  569. break;
  570. case MAGIC_UNNO_GUI:
  571. keymap_config.no_gui = false;
  572. break;
  573. case MAGIC_UNSWAP_GRAVE_ESC:
  574. keymap_config.swap_grave_esc = false;
  575. break;
  576. case MAGIC_UNSWAP_BACKSLASH_BACKSPACE:
  577. keymap_config.swap_backslash_backspace = false;
  578. break;
  579. case MAGIC_UNHOST_NKRO:
  580. clear_keyboard(); // clear first buffer to prevent stuck keys
  581. keymap_config.nkro = false;
  582. break;
  583. case MAGIC_UNSWAP_ALT_GUI:
  584. keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = false;
  585. #ifdef AUDIO_ENABLE
  586. PLAY_SONG(ag_norm_song);
  587. #endif
  588. break;
  589. case MAGIC_UNSWAP_CTL_GUI:
  590. keymap_config.swap_lctl_lgui = keymap_config.swap_rctl_rgui = false;
  591. #ifdef AUDIO_ENABLE
  592. PLAY_SONG(cg_norm_song);
  593. #endif
  594. break;
  595. case MAGIC_TOGGLE_ALT_GUI:
  596. keymap_config.swap_lalt_lgui = !keymap_config.swap_lalt_lgui;
  597. keymap_config.swap_ralt_rgui = keymap_config.swap_lalt_lgui;
  598. #ifdef AUDIO_ENABLE
  599. if (keymap_config.swap_ralt_rgui) {
  600. PLAY_SONG(ag_swap_song);
  601. } else {
  602. PLAY_SONG(ag_norm_song);
  603. }
  604. #endif
  605. break;
  606. case MAGIC_TOGGLE_CTL_GUI:
  607. keymap_config.swap_lctl_lgui = !keymap_config.swap_lctl_lgui;
  608. keymap_config.swap_rctl_rgui = keymap_config.swap_lctl_lgui;
  609. #ifdef AUDIO_ENABLE
  610. if (keymap_config.swap_rctl_rgui) {
  611. PLAY_SONG(cg_swap_song);
  612. } else {
  613. PLAY_SONG(cg_norm_song);
  614. }
  615. #endif
  616. break;
  617. case MAGIC_TOGGLE_NKRO:
  618. clear_keyboard(); // clear first buffer to prevent stuck keys
  619. keymap_config.nkro = !keymap_config.nkro;
  620. break;
  621. case MAGIC_EE_HANDS_LEFT:
  622. eeconfig_update_handedness(true);
  623. break;
  624. case MAGIC_EE_HANDS_RIGHT:
  625. eeconfig_update_handedness(false);
  626. break;
  627. default:
  628. break;
  629. }
  630. eeconfig_update_keymap(keymap_config.raw);
  631. clear_keyboard(); // clear to prevent stuck keys
  632. return false;
  633. }
  634. break;
  635. case GRAVE_ESC: {
  636. uint8_t shifted = get_mods() & ((MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT) | MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI)));
  637. #ifdef GRAVE_ESC_ALT_OVERRIDE
  638. // if ALT is pressed, ESC is always sent
  639. // this is handy for the cmd+opt+esc shortcut on macOS, among other things.
  640. if (get_mods() & (MOD_BIT(KC_LALT) | MOD_BIT(KC_RALT))) {
  641. shifted = 0;
  642. }
  643. #endif
  644. #ifdef GRAVE_ESC_CTRL_OVERRIDE
  645. // if CTRL is pressed, ESC is always sent
  646. // this is handy for the ctrl+shift+esc shortcut on windows, among other things.
  647. if (get_mods() & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL))) {
  648. shifted = 0;
  649. }
  650. #endif
  651. #ifdef GRAVE_ESC_GUI_OVERRIDE
  652. // if GUI is pressed, ESC is always sent
  653. if (get_mods() & (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI))) {
  654. shifted = 0;
  655. }
  656. #endif
  657. #ifdef GRAVE_ESC_SHIFT_OVERRIDE
  658. // if SHIFT is pressed, ESC is always sent
  659. if (get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
  660. shifted = 0;
  661. }
  662. #endif
  663. if (record->event.pressed) {
  664. grave_esc_was_shifted = shifted;
  665. add_key(shifted ? KC_GRAVE : KC_ESCAPE);
  666. } else {
  667. del_key(grave_esc_was_shifted ? KC_GRAVE : KC_ESCAPE);
  668. }
  669. send_keyboard_report();
  670. return false;
  671. }
  672. #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_BREATHING)
  673. case BL_BRTG: {
  674. if (record->event.pressed) {
  675. backlight_toggle_breathing();
  676. }
  677. return false;
  678. }
  679. #endif
  680. }
  681. return process_action_kb(record);
  682. }
  683. __attribute__((weak)) const bool ascii_to_shift_lut[128] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  684. 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0};
  685. __attribute__((weak)) const bool ascii_to_altgr_lut[128] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  686. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  687. __attribute__((weak)) const uint8_t ascii_to_keycode_lut[128] PROGMEM = {// NUL SOH STX ETX EOT ENQ ACK BEL
  688. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  689. // BS TAB LF VT FF CR SO SI
  690. KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  691. // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
  692. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  693. // CAN EM SUB ESC FS GS RS US
  694. XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  695. // ! " # $ % & '
  696. KC_SPC, KC_1, KC_QUOT, KC_3, KC_4, KC_5, KC_7, KC_QUOT,
  697. // ( ) * + , - . /
  698. KC_9, KC_0, KC_8, KC_EQL, KC_COMM, KC_MINS, KC_DOT, KC_SLSH,
  699. // 0 1 2 3 4 5 6 7
  700. KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
  701. // 8 9 : ; < = > ?
  702. KC_8, KC_9, KC_SCLN, KC_SCLN, KC_COMM, KC_EQL, KC_DOT, KC_SLSH,
  703. // @ A B C D E F G
  704. KC_2, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
  705. // H I J K L M N O
  706. KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
  707. // P Q R S T U V W
  708. KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
  709. // X Y Z [ \ ] ^ _
  710. KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_6, KC_MINS,
  711. // ` a b c d e f g
  712. KC_GRV, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G,
  713. // h i j k l m n o
  714. KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O,
  715. // p q r s t u v w
  716. KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W,
  717. // x y z { | } ~ DEL
  718. KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL};
  719. void send_string(const char *str) { send_string_with_delay(str, 0); }
  720. void send_string_P(const char *str) { send_string_with_delay_P(str, 0); }
  721. void send_string_with_delay(const char *str, uint8_t interval) {
  722. while (1) {
  723. char ascii_code = *str;
  724. if (!ascii_code) break;
  725. if (ascii_code == SS_TAP_CODE) {
  726. // tap
  727. uint8_t keycode = *(++str);
  728. register_code(keycode);
  729. unregister_code(keycode);
  730. } else if (ascii_code == SS_DOWN_CODE) {
  731. // down
  732. uint8_t keycode = *(++str);
  733. register_code(keycode);
  734. } else if (ascii_code == SS_UP_CODE) {
  735. // up
  736. uint8_t keycode = *(++str);
  737. unregister_code(keycode);
  738. } else {
  739. send_char(ascii_code);
  740. }
  741. ++str;
  742. // interval
  743. {
  744. uint8_t ms = interval;
  745. while (ms--) wait_ms(1);
  746. }
  747. }
  748. }
  749. void send_string_with_delay_P(const char *str, uint8_t interval) {
  750. while (1) {
  751. char ascii_code = pgm_read_byte(str);
  752. if (!ascii_code) break;
  753. if (ascii_code == SS_TAP_CODE) {
  754. // tap
  755. uint8_t keycode = pgm_read_byte(++str);
  756. register_code(keycode);
  757. unregister_code(keycode);
  758. } else if (ascii_code == SS_DOWN_CODE) {
  759. // down
  760. uint8_t keycode = pgm_read_byte(++str);
  761. register_code(keycode);
  762. } else if (ascii_code == SS_UP_CODE) {
  763. // up
  764. uint8_t keycode = pgm_read_byte(++str);
  765. unregister_code(keycode);
  766. } else {
  767. send_char(ascii_code);
  768. }
  769. ++str;
  770. // interval
  771. {
  772. uint8_t ms = interval;
  773. while (ms--) wait_ms(1);
  774. }
  775. }
  776. }
  777. void send_char(char ascii_code) {
  778. uint8_t keycode = pgm_read_byte(&ascii_to_keycode_lut[(uint8_t)ascii_code]);
  779. bool is_shifted = pgm_read_byte(&ascii_to_shift_lut[(uint8_t)ascii_code]);
  780. bool is_altgred = pgm_read_byte(&ascii_to_altgr_lut[(uint8_t)ascii_code]);
  781. if (is_shifted) {
  782. register_code(KC_LSFT);
  783. }
  784. if (is_altgred) {
  785. register_code(KC_RALT);
  786. }
  787. tap_code(keycode);
  788. if (is_altgred) {
  789. unregister_code(KC_RALT);
  790. }
  791. if (is_shifted) {
  792. unregister_code(KC_LSFT);
  793. }
  794. }
  795. void set_single_persistent_default_layer(uint8_t default_layer) {
  796. #if defined(AUDIO_ENABLE) && defined(DEFAULT_LAYER_SONGS)
  797. PLAY_SONG(default_layer_songs[default_layer]);
  798. #endif
  799. eeconfig_update_default_layer(1U << default_layer);
  800. default_layer_set(1U << default_layer);
  801. }
  802. layer_state_t update_tri_layer_state(layer_state_t state, uint8_t layer1, uint8_t layer2, uint8_t layer3) {
  803. layer_state_t mask12 = (1UL << layer1) | (1UL << layer2);
  804. layer_state_t mask3 = 1UL << layer3;
  805. return (state & mask12) == mask12 ? (state | mask3) : (state & ~mask3);
  806. }
  807. void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) { layer_state_set(update_tri_layer_state(layer_state, layer1, layer2, layer3)); }
  808. void tap_random_base64(void) {
  809. #if defined(__AVR_ATmega32U4__)
  810. uint8_t key = (TCNT0 + TCNT1 + TCNT3 + TCNT4) % 64;
  811. #else
  812. uint8_t key = rand() % 64;
  813. #endif
  814. switch (key) {
  815. case 0 ... 25:
  816. register_code(KC_LSFT);
  817. register_code(key + KC_A);
  818. unregister_code(key + KC_A);
  819. unregister_code(KC_LSFT);
  820. break;
  821. case 26 ... 51:
  822. register_code(key - 26 + KC_A);
  823. unregister_code(key - 26 + KC_A);
  824. break;
  825. case 52:
  826. register_code(KC_0);
  827. unregister_code(KC_0);
  828. break;
  829. case 53 ... 61:
  830. register_code(key - 53 + KC_1);
  831. unregister_code(key - 53 + KC_1);
  832. break;
  833. case 62:
  834. register_code(KC_LSFT);
  835. register_code(KC_EQL);
  836. unregister_code(KC_EQL);
  837. unregister_code(KC_LSFT);
  838. break;
  839. case 63:
  840. register_code(KC_SLSH);
  841. unregister_code(KC_SLSH);
  842. break;
  843. }
  844. }
  845. __attribute__((weak)) void bootmagic_lite(void) {
  846. // The lite version of TMK's bootmagic based on Wilba.
  847. // 100% less potential for accidentally making the
  848. // keyboard do stupid things.
  849. // We need multiple scans because debouncing can't be turned off.
  850. matrix_scan();
  851. #if defined(DEBOUNCING_DELAY) && DEBOUNCING_DELAY > 0
  852. wait_ms(DEBOUNCING_DELAY * 2);
  853. #elif defined(DEBOUNCE) && DEBOUNCE > 0
  854. wait_ms(DEBOUNCE * 2);
  855. #else
  856. wait_ms(30);
  857. #endif
  858. matrix_scan();
  859. // If the Esc and space bar are held down on power up,
  860. // reset the EEPROM valid state and jump to bootloader.
  861. // Assumes Esc is at [0,0].
  862. // This isn't very generalized, but we need something that doesn't
  863. // rely on user's keymaps in firmware or EEPROM.
  864. if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) {
  865. eeconfig_disable();
  866. // Jump to bootloader.
  867. bootloader_jump();
  868. }
  869. }
  870. void matrix_init_quantum() {
  871. #ifdef BOOTMAGIC_LITE
  872. bootmagic_lite();
  873. #endif
  874. if (!eeconfig_is_enabled()) {
  875. eeconfig_init();
  876. }
  877. #ifdef BACKLIGHT_ENABLE
  878. # ifdef LED_MATRIX_ENABLE
  879. led_matrix_init();
  880. # else
  881. backlight_init_ports();
  882. # endif
  883. #endif
  884. #ifdef AUDIO_ENABLE
  885. audio_init();
  886. #endif
  887. #ifdef RGB_MATRIX_ENABLE
  888. rgb_matrix_init();
  889. #endif
  890. #ifdef ENCODER_ENABLE
  891. encoder_init();
  892. #endif
  893. #if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)
  894. unicode_input_mode_init();
  895. #endif
  896. #ifdef HAPTIC_ENABLE
  897. haptic_init();
  898. #endif
  899. #ifdef OUTPUT_AUTO_ENABLE
  900. set_output(OUTPUT_AUTO);
  901. #endif
  902. #ifdef DIP_SWITCH_ENABLE
  903. dip_switch_init();
  904. #endif
  905. matrix_init_kb();
  906. }
  907. void matrix_scan_quantum() {
  908. #if defined(AUDIO_ENABLE) && !defined(NO_MUSIC_MODE)
  909. matrix_scan_music();
  910. #endif
  911. #ifdef TAP_DANCE_ENABLE
  912. matrix_scan_tap_dance();
  913. #endif
  914. #ifdef COMBO_ENABLE
  915. matrix_scan_combo();
  916. #endif
  917. #if defined(BACKLIGHT_ENABLE)
  918. # if defined(LED_MATRIX_ENABLE)
  919. led_matrix_task();
  920. # elif defined(BACKLIGHT_PIN) || defined(BACKLIGHT_PINS)
  921. backlight_task();
  922. # endif
  923. #endif
  924. #ifdef RGB_MATRIX_ENABLE
  925. rgb_matrix_task();
  926. #endif
  927. #ifdef ENCODER_ENABLE
  928. encoder_read();
  929. #endif
  930. #ifdef HAPTIC_ENABLE
  931. haptic_task();
  932. #endif
  933. #ifdef DIP_SWITCH_ENABLE
  934. dip_switch_read(false);
  935. #endif
  936. matrix_scan_kb();
  937. }
  938. #ifdef HD44780_ENABLED
  939. # include "hd44780.h"
  940. #endif
  941. // Functions for spitting out values
  942. //
  943. void send_dword(uint32_t number) { // this might not actually work
  944. uint16_t word = (number >> 16);
  945. send_word(word);
  946. send_word(number & 0xFFFFUL);
  947. }
  948. void send_word(uint16_t number) {
  949. uint8_t byte = number >> 8;
  950. send_byte(byte);
  951. send_byte(number & 0xFF);
  952. }
  953. void send_byte(uint8_t number) {
  954. uint8_t nibble = number >> 4;
  955. send_nibble(nibble);
  956. send_nibble(number & 0xF);
  957. }
  958. void send_nibble(uint8_t number) {
  959. switch (number) {
  960. case 0:
  961. register_code(KC_0);
  962. unregister_code(KC_0);
  963. break;
  964. case 1 ... 9:
  965. register_code(KC_1 + (number - 1));
  966. unregister_code(KC_1 + (number - 1));
  967. break;
  968. case 0xA ... 0xF:
  969. register_code(KC_A + (number - 0xA));
  970. unregister_code(KC_A + (number - 0xA));
  971. break;
  972. }
  973. }
  974. __attribute__((weak)) uint16_t hex_to_keycode(uint8_t hex) {
  975. hex = hex & 0xF;
  976. if (hex == 0x0) {
  977. return KC_0;
  978. } else if (hex < 0xA) {
  979. return KC_1 + (hex - 0x1);
  980. } else {
  981. return KC_A + (hex - 0xA);
  982. }
  983. }
  984. void api_send_unicode(uint32_t unicode) {
  985. #ifdef API_ENABLE
  986. uint8_t chunk[4];
  987. dword_to_bytes(unicode, chunk);
  988. MT_SEND_DATA(DT_UNICODE, chunk, 5);
  989. #endif
  990. }
  991. /** \brief Lock LED set callback - keymap/user level
  992. *
  993. * \deprecated Use led_update_user() instead.
  994. */
  995. __attribute__((weak)) void led_set_user(uint8_t usb_led) {}
  996. /** \brief Lock LED set callback - keyboard level
  997. *
  998. * \deprecated Use led_update_kb() instead.
  999. */
  1000. __attribute__((weak)) void led_set_kb(uint8_t usb_led) { led_set_user(usb_led); }
  1001. /** \brief Lock LED update callback - keymap/user level
  1002. *
  1003. * \return True if led_update_kb() should run its own code, false otherwise.
  1004. */
  1005. __attribute__((weak)) bool led_update_user(led_t led_state) { return true; }
  1006. /** \brief Lock LED update callback - keyboard level
  1007. *
  1008. * \return Ignored for now.
  1009. */
  1010. __attribute__((weak)) bool led_update_kb(led_t led_state) { return led_update_user(led_state); }
  1011. __attribute__((weak)) void led_init_ports(void) {}
  1012. __attribute__((weak)) void led_set(uint8_t usb_led) {
  1013. #if defined(BACKLIGHT_CAPS_LOCK) && defined(BACKLIGHT_ENABLE)
  1014. // Use backlight as Caps Lock indicator
  1015. uint8_t bl_toggle_lvl = 0;
  1016. if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK) && !backlight_config.enable) {
  1017. // Turning Caps Lock ON and backlight is disabled in config
  1018. // Toggling backlight to the brightest level
  1019. bl_toggle_lvl = BACKLIGHT_LEVELS;
  1020. } else if (IS_LED_OFF(usb_led, USB_LED_CAPS_LOCK) && backlight_config.enable) {
  1021. // Turning Caps Lock OFF and backlight is enabled in config
  1022. // Toggling backlight and restoring config level
  1023. bl_toggle_lvl = backlight_config.level;
  1024. }
  1025. // Set level without modify backlight_config to keep ability to restore state
  1026. backlight_set(bl_toggle_lvl);
  1027. #endif
  1028. led_set_kb(usb_led);
  1029. led_update_kb((led_t)usb_led);
  1030. }
  1031. //------------------------------------------------------------------------------
  1032. // Override these functions in your keymap file to play different tunes on
  1033. // different events such as startup and bootloader jump
  1034. __attribute__((weak)) void startup_user() {}
  1035. __attribute__((weak)) void shutdown_user() {}
  1036. //------------------------------------------------------------------------------