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.

156 lines
5.4 KiB

  1. #include "rgblight_user.h"
  2. extern rgblight_config_t rgblight_config;
  3. bool has_initialized;
  4. uint8_t base_hue; // Hue value of base state
  5. uint8_t base_sat; // Saturation value of base state
  6. uint8_t base_val; // Brightness value of base state
  7. uint8_t base_mod; // Animation mode of the base state
  8. void rgblight_savebase(void) { // Save the current settings to ram
  9. base_hue = rgblight_config.hue;
  10. base_sat = rgblight_config.sat;
  11. base_val = rgblight_config.val;
  12. base_mod = rgblight_config.mode;
  13. }
  14. void rgblight_loadbase(void) { // Load settings from ram to eeprom
  15. rgblight_mode( base_mod );
  16. rgblight_sethsv_eeprom_helper(base_hue, base_sat, base_val, true);
  17. }
  18. bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) {
  19. if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) {
  20. keycode = keycode & 0xFF;
  21. }
  22. switch (keycode) {
  23. case KC_RGB_T: // Switch between underglow layer indication and normal qmk behaviour
  24. #if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
  25. if (record->event.pressed) {
  26. userspace_config.rgb_layer_change ^= 1;
  27. xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change);
  28. eeconfig_update_user(userspace_config.raw);
  29. if (userspace_config.rgb_layer_change) {
  30. layer_state_set(layer_state); // Immediately set the layer color (looks better)
  31. }
  32. }
  33. #endif // RGBLIGHT_ENABLE
  34. return false;
  35. break;
  36. #ifdef RGBLIGHT_ENABLE
  37. case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // quantum_keycodes.h L400 for definitions
  38. if (record->event.pressed) { // This disables layer indication, as it's assumed that if you're changing this ... you want that disabled
  39. if (userspace_config.rgb_layer_change) {
  40. userspace_config.rgb_layer_change = false;
  41. xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change);
  42. eeconfig_update_user(userspace_config.raw);
  43. }
  44. }
  45. return true;
  46. break;
  47. #endif // RGBLIGHT_ENABLE
  48. }
  49. return true;
  50. }
  51. void keyboard_post_init_rgb(void) {
  52. # if defined(RGBLIGHT_ENABLE) || defined(RGBLIGHT_STARTUP_ANIMATION)
  53. bool is_enabled = rgblight_config.enable;
  54. if (userspace_config.rgb_layer_change) {
  55. rgblight_enable_noeeprom();
  56. }
  57. if (rgblight_config.enable) {
  58. layer_state_set_user(layer_state);
  59. uint16_t old_hue = rgblight_config.hue;
  60. rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
  61. for (uint16_t i = 255; i > 0; i--) {
  62. rgblight_sethsv_noeeprom((i + old_hue) % 255, 255, 255);
  63. wait_ms(5);
  64. }
  65. }
  66. if (!is_enabled) {
  67. rgblight_disable_noeeprom();
  68. }
  69. # endif // !RGBLIGHT_ENABLE || RGBLIGHT_STARTUP_ANIMATION
  70. layer_state_set_user(layer_state);
  71. }
  72. void matrix_scan_rgb(void) {
  73. # ifdef INDICATOR_LIGHTS
  74. matrix_scan_indicator();
  75. # endif
  76. }
  77. layer_state_t layer_state_set_rgb(layer_state_t state) {
  78. # ifdef RGBLIGHT_ENABLE
  79. if (userspace_config.rgb_layer_change) {
  80. switch (get_highest_layer(state)) { // _RAISE, _LOWER and _ADJUST use a custom color and the breathing effect
  81. case _RAISE:
  82. rgblight_sethsv_noeeprom(HSV_GREEN);
  83. rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3);
  84. break;
  85. case _LOWER:
  86. rgblight_sethsv_noeeprom(HSV_RED);
  87. rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3);
  88. break;
  89. case _ADJUST:
  90. rgblight_sethsv_noeeprom(HSV_WHITE);
  91. rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 2);
  92. break;
  93. default: // Use a solid color for normal layers
  94. switch (get_highest_layer(default_layer_state)) {
  95. case _QWERTY:
  96. rgblight_sethsv_noeeprom(HSV_MAGENTA);
  97. break;
  98. case _COLEMAK:
  99. rgblight_sethsv_noeeprom(HSV_GREEN);
  100. break;
  101. case _DVORAK:
  102. rgblight_sethsv_noeeprom(HSV_BLUE);
  103. break;
  104. case _WORKMAN:
  105. rgblight_sethsv_noeeprom(HSV_GOLDENROD);
  106. break;
  107. case _PLOVER:
  108. rgblight_sethsv_noeeprom(HSV_PINK);
  109. break;
  110. default:
  111. rgblight_sethsv_noeeprom(HSV_WHITE);
  112. break;
  113. }
  114. get_highest_layer(state) == _MODS ? rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING) : rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); // if _MODS layer is on, then breath to denote it
  115. break;
  116. }
  117. }
  118. # endif // !RGBLIGHT_ENABLE
  119. return state;
  120. }
  121. #ifdef INDICATOR_LIGHTS
  122. void matrix_scan_indicator(void) {
  123. if (has_initialized) {
  124. set_rgb_indicators(get_mods(), host_keyboard_leds(), get_oneshot_mods());
  125. }
  126. }
  127. #endif // !INDICATOR_LIGHTS
  128. void rgblight_fade_helper(bool direction){
  129. // true: increase val = fade in
  130. // false: decrease val = fade out
  131. for (uint8_t index = 0; index < RGBLIGHT_VAL_STEP ; index++) {
  132. direction ? rgblight_increase_val() : rgblight_decrease_val();
  133. wait_ms(5);
  134. }
  135. }
  136. void fadeflash_leds(uint8_t hue, uint8_t sat, uint8_t val){
  137. // indicate success / fail of a leader sequence
  138. // fade out, set new hue and saturation, fade in, fade out, set old color, fade in
  139. // this is used in leader_user.c
  140. // TODO: come up with a better name maybe
  141. rgblight_fade_helper(false);
  142. rgblight_sethsv_noeeprom(hue, sat, 0);
  143. rgblight_fade_helper(true);
  144. rgblight_fade_helper(false);
  145. rgblight_sethsv_noeeprom(base_hue, base_sat, 0);
  146. rgblight_fade_helper(true);
  147. }