You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

144 lines
5.5 KiB

  1. #include "curry.h"
  2. #include "rgb_matrix_user.h"
  3. #include "lib/lib8tion/lib8tion.h"
  4. static uint32_t hypno_timer;
  5. extern led_config_t g_led_config;
  6. #define RGB_MATRIX_REST_MODE RGB_MATRIX_CYCLE_OUT_IN_DUAL
  7. void suspend_power_down_keymap(void) { rgb_matrix_set_suspend_state(true); }
  8. void suspend_wakeup_init_keymap(void) { rgb_matrix_set_suspend_state(false); }
  9. void check_default_layer(uint8_t mode, uint8_t type) {
  10. switch (get_highest_layer(default_layer_state)) {
  11. case _QWERTY:
  12. rgb_matrix_layer_helper(HSV_CYAN, mode, rgb_matrix_config.speed, type);
  13. break;
  14. case _COLEMAK:
  15. rgb_matrix_layer_helper(HSV_MAGENTA, mode, rgb_matrix_config.speed, type);
  16. break;
  17. case _DVORAK:
  18. rgb_matrix_layer_helper(HSV_SPRINGGREEN, mode, rgb_matrix_config.speed, type);
  19. break;
  20. case _WORKMAN:
  21. rgb_matrix_layer_helper(HSV_GOLDENROD, mode, rgb_matrix_config.speed, type);
  22. break;
  23. }
  24. }
  25. void rgb_matrix_indicators_user(void) {
  26. if (userspace_config.rgb_layer_change && !g_suspend_state && rgb_matrix_config.enable) {
  27. switch (get_highest_layer(layer_state)) {
  28. case _RAISE:
  29. rgb_matrix_layer_helper(HSV_YELLOW, 0, rgb_matrix_config.speed, LED_FLAG_UNDERGLOW);
  30. break;
  31. case _LOWER:
  32. rgb_matrix_layer_helper(HSV_GREEN, 0, rgb_matrix_config.speed, LED_FLAG_UNDERGLOW);
  33. break;
  34. case _ADJUST:
  35. rgb_matrix_layer_helper(HSV_RED, 0, rgb_matrix_config.speed, LED_FLAG_UNDERGLOW);
  36. break;
  37. default: {
  38. check_default_layer(IS_LAYER_ON(_MODS), LED_FLAG_UNDERGLOW);
  39. break;
  40. }
  41. }
  42. check_default_layer(0, LED_FLAG_MODIFIER);
  43. }
  44. }
  45. bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) {
  46. uint16_t temp_keycode = keycode;
  47. // Filter out the actual keycode from MT and LT keys.
  48. if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) {
  49. temp_keycode &= 0xFF;
  50. }
  51. hypno_timer = timer_read32();
  52. if (userspace_config.rgb_matrix_idle_anim && rgb_matrix_get_mode() == RGB_MATRIX_REST_MODE) {
  53. rgb_matrix_mode_noeeprom(RGB_MATRIX_TYPING_HEATMAP);
  54. }
  55. switch (temp_keycode) {
  56. case KC_RGB_T: // This allows me to use underglow as layer indication, or as normal
  57. if (record->event.pressed) {
  58. userspace_config.rgb_layer_change ^= 1;
  59. dprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change);
  60. eeconfig_update_user(userspace_config.raw);
  61. if (userspace_config.rgb_layer_change) {
  62. layer_state_set(layer_state); // This is needed to immediately set the layer color (looks better)
  63. }
  64. }
  65. break;
  66. case RGB_IDL: // This allows me to use underglow as layer indication, or as normal
  67. if (record->event.pressed) {
  68. userspace_config.rgb_matrix_idle_anim ^= 1;
  69. dprintf("RGB Matrix Idle Animation [EEPROM]: %u\n", userspace_config.rgb_matrix_idle_anim);
  70. eeconfig_update_user(userspace_config.raw);
  71. if (userspace_config.rgb_matrix_idle_anim) {
  72. rgb_matrix_mode_noeeprom(RGB_MATRIX_TYPING_HEATMAP);
  73. }
  74. }
  75. break;
  76. case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // quantum_keycodes.h L400 for definitions
  77. if (record->event.pressed) {
  78. bool is_eeprom_updated = false;
  79. if (userspace_config.rgb_matrix_idle_anim) {
  80. userspace_config.rgb_matrix_idle_anim = false;
  81. dprintf("RGB Matrix Idle Animation [EEPROM]: %u\n", userspace_config.rgb_matrix_idle_anim);
  82. is_eeprom_updated = true;
  83. }
  84. if (is_eeprom_updated) {
  85. eeconfig_update_user(userspace_config.raw);
  86. }
  87. }
  88. break;
  89. }
  90. return true;
  91. }
  92. void keyboard_post_init_rgb(void) {
  93. if (userspace_config.rgb_matrix_idle_anim) {
  94. rgb_matrix_mode_noeeprom(RGB_MATRIX_REST_MODE);
  95. }
  96. }
  97. void matrix_scan_rgb(void) {
  98. if (userspace_config.rgb_matrix_idle_anim && rgb_matrix_get_mode() == RGB_MATRIX_TYPING_HEATMAP && timer_elapsed32(hypno_timer) > 15000) {
  99. rgb_matrix_mode_noeeprom(RGB_MATRIX_REST_MODE);
  100. }
  101. }
  102. void rgb_matrix_layer_helper(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode, uint8_t speed, uint8_t led_type) {
  103. HSV hsv = {hue, sat, val};
  104. if (hsv.v > rgb_matrix_config.hsv.v) {
  105. hsv.v = rgb_matrix_config.hsv.v;
  106. }
  107. switch (mode) {
  108. case 1: // breathing
  109. {
  110. uint16_t time = scale16by8(g_rgb_counters.tick, speed / 8);
  111. hsv.v = scale8(abs8(sin8(time) - 128) * 2, hsv.v);
  112. RGB rgb = hsv_to_rgb(hsv);
  113. for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) {
  114. if (HAS_FLAGS(g_led_config.flags[i], led_type)) {
  115. rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
  116. }
  117. }
  118. break;
  119. }
  120. default: // Solid Color
  121. {
  122. RGB rgb = hsv_to_rgb(hsv);
  123. for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) {
  124. if (HAS_FLAGS(g_led_config.flags[i], led_type)) {
  125. rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
  126. }
  127. }
  128. break;
  129. }
  130. }
  131. }