Skip to content

Commit

Permalink
Tweak the Christmas animation effect to be less harsh on the eyes (qm…
Browse files Browse the repository at this point in the history
…k#7648)

* Tweak the Christmas animation effect to be less harsh on the eyes

* Further improve the tweaked Christmas animation code

- Use constants where it makes sense
- Instead of complicated math, use a static variable to keep track if it's animating from or to red
- Don't use pow (but a simple macro instead)
- Using floating point math is necessary for the fraction in the cubic bezier function to work

* Update docs for the tweaked Christmas animation effect

* Further improve memory usage

- Don't use floats, but 32 bit ints instead (where needed)
- Replace limits.h with constant

* Fix typo
  • Loading branch information
Maxr1998 authored and drashna committed Sep 30, 2020
1 parent f85b1ee commit 8190423
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 5 deletions.
31 changes: 27 additions & 4 deletions quantum/rgblight.c
Original file line number Diff line number Diff line change
Expand Up @@ -1165,16 +1165,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;
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;

anim->current_offset = (anim->current_offset + 1) % 2;
// 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);

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

Expand Down
2 changes: 1 addition & 1 deletion quantum/rgblight.h
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ enum RGBLIGHT_EFFECT_MODE {
# endif

# ifndef RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL
# define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 1000
# define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 40
# endif

# ifndef RGBLIGHT_EFFECT_CHRISTMAS_STEP
Expand Down

0 comments on commit 8190423

Please sign in to comment.