rgb_stuff.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. // Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "drashna.h"
  4. #include "rgb_stuff.h"
  5. #include "eeprom.h"
  6. bool has_initialized;
  7. void rgblight_sethsv_default_helper(uint8_t index) {
  8. rgblight_sethsv_at(rgblight_get_hue(), rgblight_get_sat(), rgblight_get_val(), index);
  9. }
  10. void rgblight_set_hsv_and_mode(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode) {
  11. rgblight_sethsv_noeeprom(hue, sat, val);
  12. // wait_us(175); // Add a slight delay between color and mode to ensure it's processed correctly
  13. rgblight_mode_noeeprom(mode);
  14. }
  15. bool process_record_user_rgb_light(uint16_t keycode, keyrecord_t *record) {
  16. return true;
  17. }
  18. #if defined(RGBLIGHT_STARTUP_ANIMATION)
  19. static bool is_enabled;
  20. static bool is_rgblight_startup;
  21. static HSV old_hsv;
  22. static uint8_t old_mode;
  23. deferred_token rgb_startup_token;
  24. uint32_t rgb_startup_animation(uint32_t triger_time, void *cb_arg) {
  25. if (is_rgblight_startup && is_keyboard_master()) {
  26. static uint8_t counter = 0;
  27. counter++;
  28. rgblight_sethsv_noeeprom((counter + old_hsv.h) % 255, 255, 255);
  29. if (counter >= 255) {
  30. is_rgblight_startup = false;
  31. if (userspace_config.rgb_layer_change) {
  32. layer_state_set_rgb_light(layer_state);
  33. } else {
  34. rgblight_set_hsv_and_mode(old_hsv.h, old_hsv.s, old_hsv.v, old_mode);
  35. }
  36. if (!is_enabled) {
  37. rgblight_disable_noeeprom();
  38. }
  39. }
  40. }
  41. return is_rgblight_startup ? 10 : 0;
  42. }
  43. #endif
  44. void keyboard_post_init_rgb_light(void) {
  45. #if defined(RGBLIGHT_STARTUP_ANIMATION)
  46. is_enabled = rgblight_is_enabled();
  47. if (userspace_config.rgb_layer_change) {
  48. layer_state_set_rgb_light(layer_state);
  49. }
  50. old_hsv = rgblight_get_hsv();
  51. old_mode = rgblight_get_mode();
  52. rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
  53. is_rgblight_startup = true;
  54. rgb_startup_token = defer_exec(300, rgb_startup_animation, NULL);
  55. #endif
  56. if (userspace_config.rgb_layer_change) {
  57. layer_state_set_rgb_light(layer_state);
  58. }
  59. }
  60. layer_state_t layer_state_set_rgb_light(layer_state_t state) {
  61. #ifdef RGBLIGHT_ENABLE
  62. if (userspace_config.rgb_layer_change) {
  63. switch (get_highest_layer(state & ~((layer_state_t)1 << _MOUSE))) {
  64. case _MEDIA:
  65. rgblight_set_hsv_and_mode(HSV_CHARTREUSE, RGBLIGHT_MODE_KNIGHT + 1);
  66. break;
  67. case _GAMEPAD:
  68. rgblight_set_hsv_and_mode(HSV_ORANGE, RGBLIGHT_MODE_SNAKE + 2);
  69. break;
  70. case _DIABLO:
  71. case _DIABLOII:
  72. rgblight_set_hsv_and_mode(HSV_RED, RGBLIGHT_MODE_BREATHING + 3);
  73. break;
  74. case _RAISE:
  75. rgblight_set_hsv_and_mode(HSV_YELLOW, RGBLIGHT_MODE_BREATHING + 3);
  76. break;
  77. case _LOWER:
  78. rgblight_set_hsv_and_mode(HSV_GREEN, RGBLIGHT_MODE_BREATHING + 3);
  79. break;
  80. case _ADJUST:
  81. rgblight_set_hsv_and_mode(HSV_RED, RGBLIGHT_MODE_KNIGHT + 2);
  82. break;
  83. default:
  84. if (layer_state_cmp(state, _MOUSE)) {
  85. # if defined(RGBLIGHT_EFFECT_TWINKLE)
  86. rgblight_set_hsv_and_mode(HSV_CHARTREUSE, RGBLIGHT_MODE_TWINKLE + 5);
  87. # else
  88. rgblight_set_hsv_and_mode(HSV_CHARTREUSE, RGBLIGHT_MODE_BREATHING + 3);
  89. # endif
  90. } else {
  91. default_layer_state_set_rgb_light(default_layer_state);
  92. }
  93. }
  94. #endif // RGBLIGHT_ENABLE
  95. }
  96. return state;
  97. }
  98. layer_state_t default_layer_state_set_rgb_light(layer_state_t state) {
  99. switch (get_highest_layer(state)) {
  100. case _DEFAULT_LAYER_1:
  101. rgblight_set_hsv_and_mode(DEFAULT_LAYER_1_HSV, RGBLIGHT_MODE_STATIC_LIGHT);
  102. break;
  103. case _DEFAULT_LAYER_2:
  104. rgblight_set_hsv_and_mode(DEFAULT_LAYER_2_HSV, RGBLIGHT_MODE_STATIC_LIGHT);
  105. break;
  106. case _DEFAULT_LAYER_3:
  107. rgblight_set_hsv_and_mode(DEFAULT_LAYER_3_HSV, RGBLIGHT_MODE_STATIC_LIGHT);
  108. break;
  109. case _DEFAULT_LAYER_4:
  110. rgblight_set_hsv_and_mode(DEFAULT_LAYER_4_HSV, RGBLIGHT_MODE_STATIC_LIGHT);
  111. break;
  112. }
  113. return state;
  114. }