]> git.donarmstrong.com Git - qmk_firmware.git/blobdiff - users/drashna/rgb_stuff.c
[Keymap] Drashna's Feature madness (#6128)
[qmk_firmware.git] / users / drashna / rgb_stuff.c
index 7d364fa68688a224c0f3932389772bfbb062a49e..12851e2616c945f03b09b265fa1cb403e36522fb 100644 (file)
@@ -4,77 +4,75 @@
 
 #if defined(RGBLIGHT_ENABLE)
 extern rgblight_config_t rgblight_config;
-bool has_initialized;
+bool                     has_initialized;
 #endif
 
 #ifdef RGBLIGHT_ENABLE
-void rgblight_sethsv_default_helper(uint8_t index) {
-    rgblight_sethsv_at(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, index);
-}
-#endif // RGBLIGHT_ENABLE
+void rgblight_sethsv_default_helper(uint8_t index) { rgblight_sethsv_at(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, index); }
+#endif  // RGBLIGHT_ENABLE
 
 #ifdef INDICATOR_LIGHTS
 void set_rgb_indicators(uint8_t this_mod, uint8_t this_led, uint8_t this_osm) {
     if (userspace_config.rgb_layer_change && biton32(layer_state) == 0) {
-        if ( (this_mod | this_osm) & MOD_MASK_SHIFT || this_led & (1<<USB_LED_CAPS_LOCK) ) {
-        #ifdef SHFT_LED1
+        if ((this_mod | this_osm) & MOD_MASK_SHIFT || this_led & (1 << USB_LED_CAPS_LOCK)) {
+#    ifdef SHFT_LED1
             rgblight_sethsv_at(120, 255, 255, SHFT_LED1);
-        #endif // SHFT_LED1
-        #ifdef SHFT_LED2
+#    endif  // SHFT_LED1
+#    ifdef SHFT_LED2
             rgblight_sethsv_at(120, 255, 255, SHFT_LED2);
-        #endif // SHFT_LED2
+#    endif  // SHFT_LED2
         } else {
-        #ifdef SHFT_LED1
+#    ifdef SHFT_LED1
             rgblight_sethsv_default_helper(SHFT_LED1);
-        #endif // SHFT_LED1
-        #ifdef SHFT_LED2
+#    endif  // SHFT_LED1
+#    ifdef SHFT_LED2
             rgblight_sethsv_default_helper(SHFT_LED2);
-        #endif // SHFT_LED2
+#    endif  // SHFT_LED2
         }
-        if ( (this_mod | this_osm) & MOD_MASK_CTRL) {
-        #ifdef CTRL_LED1
+        if ((this_mod | this_osm) & MOD_MASK_CTRL) {
+#    ifdef CTRL_LED1
             rgblight_sethsv_at(0, 255, 255, CTRL_LED1);
-        #endif // CTRL_LED1
-        #ifdef CTRL_LED2
+#    endif  // CTRL_LED1
+#    ifdef CTRL_LED2
             rgblight_sethsv_at(0, 255, 255, CTRL_LED2);
-        #endif // CTRL_LED2
+#    endif  // CTRL_LED2
         } else {
-        #ifdef CTRL_LED1
+#    ifdef CTRL_LED1
             rgblight_sethsv_default_helper(CTRL_LED1);
-        #endif // CTRL_LED1
-        #ifdef CTRL_LED2
+#    endif  // CTRL_LED1
+#    ifdef CTRL_LED2
             rgblight_sethsv_default_helper(CTRL_LED2);
-        #endif // CTRL_LED2
+#    endif  // CTRL_LED2
         }
-        if ( (this_mod | this_osm) & MOD_MASK_GUI) {
-        #ifdef GUI_LED1
+        if ((this_mod | this_osm) & MOD_MASK_GUI) {
+#    ifdef GUI_LED1
             rgblight_sethsv_at(51, 255, 255, GUI_LED1);
-        #endif // GUI_LED1
-        #ifdef GUI_LED2
+#    endif  // GUI_LED1
+#    ifdef GUI_LED2
             rgblight_sethsv_at(51, 255, 255, GUI_LED2);
-        #endif // GUI_LED2
+#    endif  // GUI_LED2
         } else {
-        #ifdef GUI_LED1
+#    ifdef GUI_LED1
             rgblight_sethsv_default_helper(GUI_LED1);
-        #endif // GUI_LED1
-        #ifdef GUI_LED2
+#    endif  // GUI_LED1
+#    ifdef GUI_LED2
             rgblight_sethsv_default_helper(GUI_LED2);
-        #endif // GUI_LED2
+#    endif  // GUI_LED2
         }
-        if ( (this_mod | this_osm) & MOD_MASK_ALT) {
-        #ifdef ALT_LED1
+        if ((this_mod | this_osm) & MOD_MASK_ALT) {
+#    ifdef ALT_LED1
             rgblight_sethsv_at(240, 255, 255, ALT_LED1);
-        #endif // ALT_LED1
-        #ifdef GUI_LED2
+#    endif  // ALT_LED1
+#    ifdef GUI_LED2
             rgblight_sethsv_at(240, 255, 255, ALT_LED2);
-        #endif // GUI_LED2
+#    endif  // GUI_LED2
         } else {
-        #ifdef GUI_LED1
+#    ifdef GUI_LED1
             rgblight_sethsv_default_helper(ALT_LED1);
-        #endif // GUI_LED1
-        #ifdef GUI_LED2
+#    endif  // GUI_LED1
+#    ifdef GUI_LED2
             rgblight_sethsv_default_helper(ALT_LED2);
-        #endif // GUI_LED2
+#    endif  // GUI_LED2
         }
     }
 }
@@ -84,75 +82,73 @@ void matrix_scan_indicator(void) {
         set_rgb_indicators(get_mods(), host_keyboard_leds(), get_oneshot_mods());
     }
 }
-#endif //INDICATOR_LIGHTS
+#endif  // INDICATOR_LIGHTS
 
 #ifdef RGBLIGHT_TWINKLE
 static rgblight_fadeout lights[RGBLED_NUM];
 
-__attribute__ ((weak))
-bool rgblight_twinkle_is_led_used_keymap(uint8_t index) { return false; }
+__attribute__((weak)) bool rgblight_twinkle_is_led_used_keymap(uint8_t index) { return false; }
 
 bool rgblight_twinkle_is_led_used(uint8_t index) {
     switch (index) {
-#ifdef INDICATOR_LIGHTS
-#ifdef SHFT_LED1
+#    ifdef INDICATOR_LIGHTS
+#        ifdef SHFT_LED1
         case SHFT_LED1:
             return true;
-#endif //SHFT_LED1
-#ifdef SHFT_LED2
+#        endif  // SHFT_LED1
+#        ifdef SHFT_LED2
         case SHFT_LED2:
             return true;
-#endif //SHFT_LED2
-#ifdef CTRL_LED1
+#        endif  // SHFT_LED2
+#        ifdef CTRL_LED1
         case CTRL_LED1:
             return true;
-#endif //CTRL_LED1
-#ifdef CTRL_LED2
+#        endif  // CTRL_LED1
+#        ifdef CTRL_LED2
         case CTRL_LED2:
             return true;
-#endif //CTRL_LED2
-#ifdef GUI_LED1
+#        endif  // CTRL_LED2
+#        ifdef GUI_LED1
         case GUI_LED1:
             return true;
-#endif //GUI_LED1
-#ifdef GUI_LED2
+#        endif  // GUI_LED1
+#        ifdef GUI_LED2
         case GUI_LED2:
             return true;
-#endif //GUI_LED2
-#ifdef ALT_LED1
+#        endif  // GUI_LED2
+#        ifdef ALT_LED1
         case ALT_LED1:
             return true;
-#endif //ALT_LED1
-#ifdef ALT_LED2
+#        endif  // ALT_LED1
+#        ifdef ALT_LED2
         case ALT_LED2:
             return true;
-#endif //ALT_LED2
-#endif //INDICATOR_LIGHTS
+#        endif  // ALT_LED2
+#    endif      // INDICATOR_LIGHTS
         default:
             return rgblight_twinkle_is_led_used_keymap(index);
-  }
+    }
 }
 
-void scan_rgblight_fadeout(void) { // Don't effing change this function .... rgblight_sethsv is supppppper intensive
+void scan_rgblight_fadeout(void) {  // Don't effing change this function .... rgblight_sethsv is supppppper intensive
     bool litup = false;
-    for (uint8_t light_index = 0 ; light_index < RGBLED_NUM ; ++light_index ) {
+    for (uint8_t light_index = 0; light_index < RGBLED_NUM; ++light_index) {
         if (lights[light_index].enabled && timer_elapsed(lights[light_index].timer) > 10) {
-        rgblight_fadeout *light = &lights[light_index];
-        litup = true;
+            rgblight_fadeout *light = &lights[light_index];
+            litup                   = true;
 
-        if (light->life) {
-            light->life -= 1;
-            if (biton32(layer_state) == 0) {
-                sethsv(light->hue + rand() % 0xF, 255, light->life, (LED_TYPE *)&led[light_index]);
-            }
-            light->timer = timer_read();
-        }
-        else {
-            if (light->enabled && biton32(layer_state) == 0) {
-                rgblight_sethsv_default_helper(light_index);
+            if (light->life) {
+                light->life -= 1;
+                if (biton32(layer_state) == 0) {
+                    sethsv(light->hue + rand() % 0xF, 255, light->life, (LED_TYPE *)&led[light_index]);
+                }
+                light->timer = timer_read();
+            } else {
+                if (light->enabled && biton32(layer_state) == 0) {
+                    rgblight_sethsv_default_helper(light_index);
+                }
+                litup = light->enabled = false;
             }
-            litup = light->enabled = false;
-        }
         }
     }
     if (litup && biton32(layer_state) == 0) {
@@ -161,39 +157,37 @@ void scan_rgblight_fadeout(void) { // Don't effing change this function .... rgb
 }
 
 void start_rgb_light(void) {
-
     uint8_t indices[RGBLED_NUM];
-    uint8_t indices_count = 0;
-    uint8_t min_life = 0xFF;
+    uint8_t indices_count  = 0;
+    uint8_t min_life       = 0xFF;
     uint8_t min_life_index = -1;
-    for (uint8_t index = 0 ; index < RGBLED_NUM ; ++index ) {
-      if (rgblight_twinkle_is_led_used(index)) { continue; }
-      if (lights[index].enabled) {
-        if (min_life_index == -1 ||
-          lights[index].life < min_life)
-        {
-          min_life = lights[index].life;
-          min_life_index = index;
+    for (uint8_t index = 0; index < RGBLED_NUM; ++index) {
+        if (rgblight_twinkle_is_led_used(index)) {
+            continue;
+        }
+        if (lights[index].enabled) {
+            if (min_life_index == -1 || lights[index].life < min_life) {
+                min_life       = lights[index].life;
+                min_life_index = index;
+            }
+            continue;
         }
-        continue;
-      }
 
-      indices[indices_count] = index;
-      ++indices_count;
+        indices[indices_count] = index;
+        ++indices_count;
     }
 
     uint8_t light_index;
     if (!indices_count) {
         light_index = min_life_index;
-    }
-    else {
-      light_index = indices[rand() % indices_count];
+    } else {
+        light_index = indices[rand() % indices_count];
     }
 
     rgblight_fadeout *light = &lights[light_index];
-    light->enabled = true;
-    light->timer = timer_read();
-    light->life = 0xC0 + rand() % 0x40;
+    light->enabled          = true;
+    light->timer            = timer_read();
+    light->life             = 0xC0 + rand() % 0x40;
 
     light->hue = rgblight_config.hue + (rand() % 0xB4) - 0x54;
 
@@ -201,7 +195,6 @@ void start_rgb_light(void) {
 }
 #endif
 
-
 bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) {
     if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) {
         keycode = keycode & 0xFF;
@@ -214,9 +207,12 @@ bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) {
         case KC_KP_SLASH ... KC_KP_DOT:
         case KC_F13 ... KC_F24:
         case KC_AUDIO_MUTE ... KC_MEDIA_REWIND:
-            if (record->event.pressed) { start_rgb_light(); }
-            return true; break;
-#endif // RGBLIGHT_TWINKLE
+            if (record->event.pressed) {
+                start_rgb_light();
+            }
+            return true;
+            break;
+#endif                  // RGBLIGHT_TWINKLE
         case KC_RGB_T:  // This allows me to use underglow as layer indication, or as normal
 #if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
             if (record->event.pressed) {
@@ -224,41 +220,48 @@ bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) {
                 xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change);
                 eeconfig_update_user(userspace_config.raw);
                 if (userspace_config.rgb_layer_change) {
-                    layer_state_set(layer_state); // This is needed to immediately set the layer color (looks better)
+                    layer_state_set(layer_state);  // This is needed to immediately set the layer color (looks better)
                 }
             }
-#endif // RGBLIGHT_ENABLE
-            return false; break;
+#endif  // RGBLIGHT_ENABLE
+            return false;
+            break;
 #ifdef RGBLIGHT_ENABLE
-        case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // quantum_keycodes.h L400 for definitions
-            if (record->event.pressed) { //This disables layer indication, as it's assumed that if you're changing this ... you want that disabled
+        case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT:  // quantum_keycodes.h L400 for definitions
+            if (record->event.pressed) {              // This disables layer indication, as it's assumed that if you're changing this ... you want that disabled
                 if (userspace_config.rgb_layer_change) {
                     userspace_config.rgb_layer_change = false;
                     xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change);
                     eeconfig_update_user(userspace_config.raw);
                 }
             }
-            return true; break;
-#endif // RGBLIGHT_ENABLE
-  }
+            return true;
+            break;
+#endif  // RGBLIGHT_ENABLE
+    }
     return true;
 }
 
-
-
 void keyboard_post_init_rgb(void) {
 #if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_STARTUP_ANIMATION)
-    if (userspace_config.rgb_layer_change) { rgblight_enable_noeeprom(); }
+    bool is_enabled = rgblight_config.enable;
+    if (userspace_config.rgb_layer_change) {
+        rgblight_enable_noeeprom();
+    }
     if (rgblight_config.enable) {
         layer_state_set_user(layer_state);
         uint16_t old_hue = rgblight_config.hue;
         rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
         for (uint16_t i = 255; i > 0; i--) {
-            rgblight_sethsv_noeeprom( ( i + old_hue) % 255, 255, 255);
+            rgblight_sethsv_noeeprom((i + old_hue) % 255, 255, 255);
             matrix_scan();
             wait_ms(10);
         }
     }
+    if (!is_enabled) {
+        rgblight_disable_noeeprom();
+    }
+
 #endif
     layer_state_set_user(layer_state);
 }
@@ -266,15 +269,13 @@ void keyboard_post_init_rgb(void) {
 void matrix_scan_rgb(void) {
 #ifdef RGBLIGHT_TWINKLE
     scan_rgblight_fadeout();
-#endif // RGBLIGHT_ENABLE
+#endif  // RGBLIGHT_ENABLE
 
 #ifdef INDICATOR_LIGHTS
     matrix_scan_indicator();
 #endif
-
 }
 
-
 layer_state_t layer_state_set_rgb(layer_state_t state) {
 #ifdef RGBLIGHT_ENABLE
     if (userspace_config.rgb_layer_change) {
@@ -307,40 +308,73 @@ layer_state_t layer_state_set_rgb(layer_state_t state) {
                 rgblight_sethsv_noeeprom_red();
                 rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2);
                 break;
-            default: //  for any other layers, or the default layer
+            default:  //  for any other layers, or the default layer
                 switch (biton32(default_layer_state)) {
                     case _COLEMAK:
-                        rgblight_sethsv_noeeprom_magenta(); break;
+                        rgblight_sethsv_noeeprom_magenta();
+                        break;
                     case _DVORAK:
-                        rgblight_sethsv_noeeprom_springgreen(); break;
+                        rgblight_sethsv_noeeprom_springgreen();
+                        break;
                     case _WORKMAN:
-                        rgblight_sethsv_noeeprom_goldenrod(); break;
+                        rgblight_sethsv_noeeprom_goldenrod();
+                        break;
                     case _NORMAN:
-                        rgblight_sethsv_noeeprom_coral(); break;
+                        rgblight_sethsv_noeeprom_coral();
+                        break;
                     case _MALTRON:
-                        rgblight_sethsv_noeeprom_yellow(); break;
+                        rgblight_sethsv_noeeprom_yellow();
+                        break;
                     case _EUCALYN:
-                        rgblight_sethsv_noeeprom_pink(); break;
+                        rgblight_sethsv_noeeprom_pink();
+                        break;
                     case _CARPLAX:
-                        rgblight_sethsv_noeeprom_blue(); break;
+                        rgblight_sethsv_noeeprom_blue();
+                        break;
                     default:
-                        rgblight_sethsv_noeeprom_cyan(); break;
+                        rgblight_sethsv_noeeprom_cyan();
+                        break;
                 }
-                biton32(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
+                biton32(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
                 break;
         }
     }
-#endif // RGBLIGHT_ENABLE
+#endif  // RGBLIGHT_ENABLE
 
     return state;
 }
 
 #ifdef RGB_MATRIX_ENABLE
+#    include "lib/lib8tion/lib8tion.h"
 extern led_config_t g_led_config;
-void rgb_matrix_layer_helper (uint8_t red, uint8_t green, uint8_t blue, uint8_t led_type) {
-    for (int i = 0; i < DRIVER_LED_TOTAL; i++) {
-        if (HAS_FLAGS(g_led_config.flags[i], led_type)) {
-            rgb_matrix_set_color( i, red, green, blue );
+void rgb_matrix_layer_helper(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode, uint8_t speed, uint8_t led_type) {
+    HSV hsv = {hue, sat, val};
+    if (hsv.v > rgb_matrix_config.hsv.v) {
+        hsv.v = rgb_matrix_config.hsv.v;
+    }
+
+    switch (mode) {
+        case 1:  // breathing
+        {
+            uint16_t time = scale16by8(g_rgb_counters.tick, speed / 8);
+            hsv.v         = scale8(abs8(sin8(time) - 128) * 2, hsv.v);
+            RGB rgb       = hsv_to_rgb(hsv);
+            for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) {
+                if (HAS_FLAGS(g_led_config.flags[i], led_type)) {
+                    rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
+                }
+            }
+            break;
+        }
+        default:  // Solid Color
+        {
+            RGB rgb = hsv_to_rgb(hsv);
+            for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) {
+                if (HAS_FLAGS(g_led_config.flags[i], led_type)) {
+                    rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
+                }
+            }
+            break;
         }
     }
 }