aboutsummaryrefslogtreecommitdiffstats
path: root/quantum/rgblight.c
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/rgblight.c')
-rw-r--r--quantum/rgblight.c58
1 files changed, 45 insertions, 13 deletions
diff --git a/quantum/rgblight.c b/quantum/rgblight.c
index d33484ccf..76bb6eb8c 100644
--- a/quantum/rgblight.c
+++ b/quantum/rgblight.c
@@ -132,11 +132,11 @@ void sethsv_raw(uint8_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1) {
void sethsv(uint8_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1) { sethsv_raw(hue, sat, val > RGBLIGHT_LIMIT_VAL ? RGBLIGHT_LIMIT_VAL : val, led1); }
void setrgb(uint8_t r, uint8_t g, uint8_t b, LED_TYPE *led1) {
- (*led1).r = r;
- (*led1).g = g;
- (*led1).b = b;
+ led1->r = r;
+ led1->g = g;
+ led1->b = b;
#ifdef RGBW
- (*led1).w = 0;
+ led1->w = 0;
#endif
}
@@ -406,17 +406,26 @@ void rgblight_decrease_val_helper(bool write_to_eeprom) {
}
void rgblight_decrease_val_noeeprom(void) { rgblight_decrease_val_helper(false); }
void rgblight_decrease_val(void) { rgblight_decrease_val_helper(true); }
-void rgblight_increase_speed(void) {
+
+void rgblight_increase_speed_helper(bool write_to_eeprom) {
if (rgblight_config.speed < 3) rgblight_config.speed++;
// RGBLIGHT_SPLIT_SET_CHANGE_HSVS; // NEED?
- eeconfig_update_rgblight(rgblight_config.raw); // EECONFIG needs to be increased to support this
+ if (write_to_eeprom) {
+ eeconfig_update_rgblight(rgblight_config.raw); // EECONFIG needs to be increased to support this
+ }
}
+void rgblight_increase_speed(void) { rgblight_increase_speed_helper(true); }
+void rgblight_increase_speed_noeeprom(void) { rgblight_increase_speed_helper(false); }
-void rgblight_decrease_speed(void) {
+void rgblight_decrease_speed_helper(bool write_to_eeprom) {
if (rgblight_config.speed > 0) rgblight_config.speed--;
// RGBLIGHT_SPLIT_SET_CHANGE_HSVS; // NEED??
- eeconfig_update_rgblight(rgblight_config.raw); // EECONFIG needs to be increased to support this
+ if (write_to_eeprom) {
+ eeconfig_update_rgblight(rgblight_config.raw); // EECONFIG needs to be increased to support this
+ }
}
+void rgblight_decrease_speed(void) { rgblight_decrease_speed_helper(true); }
+void rgblight_decrease_speed_noeeprom(void) { rgblight_decrease_speed_helper(false); }
void rgblight_sethsv_noeeprom_old(uint8_t hue, uint8_t sat, uint8_t val) {
if (rgblight_config.enable) {
@@ -1152,16 +1161,39 @@ void rgblight_effect_knight(animation_status_t *anim) {
#endif
#ifdef RGBLIGHT_EFFECT_CHRISTMAS
+# define CUBED(x) ((x) * (x) * (x))
+
+/**
+ * Christmas lights effect, with a smooth animation between red & green.
+ */
void rgblight_effect_christmas(animation_status_t *anim) {
- uint8_t hue;
- uint8_t i;
+ static int8_t increment = 1;
+ const uint8_t max_pos = 32;
+ const uint8_t hue_green = 85;
+
+ uint32_t xa;
+ uint8_t hue, val;
+ uint8_t i;
+
+ // The effect works by animating anim->pos from 0 to 32 and back to 0.
+ // The pos is used in a cubic bezier formula to ease-in-out between red and green, leaving the interpolated colors visible as short as possible.
+ xa = CUBED((uint32_t)anim->pos);
+ hue = ((uint32_t)hue_green) * xa / (xa + CUBED((uint32_t)(max_pos - anim->pos)));
+ // Additionally, these interpolated colors get shown with a slightly darker value, to make them less prominent than the main colors.
+ val = 255 - (3 * (hue < hue_green / 2 ? hue : hue_green - hue) / 2);
- anim->current_offset = (anim->current_offset + 1) % 2;
for (i = 0; i < rgblight_ranges.effect_num_leds; i++) {
- hue = 0 + ((i / RGBLIGHT_EFFECT_CHRISTMAS_STEP + anim->current_offset) % 2) * 85;
- sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i + rgblight_ranges.effect_start_pos]);
+ uint8_t local_hue = (i / RGBLIGHT_EFFECT_CHRISTMAS_STEP) % 2 ? hue : hue_green - hue;
+ sethsv(local_hue, rgblight_config.sat, val, (LED_TYPE *)&led[i + rgblight_ranges.effect_start_pos]);
}
rgblight_set();
+
+ if (anim->pos == 0) {
+ increment = 1;
+ } else if (anim->pos == max_pos) {
+ increment = -1;
+ }
+ anim->pos += increment;
}
#endif