mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-31 05:12:33 +01:00 
			
		
		
		
	Tweak the Christmas animation effect to be less harsh on the eyes (#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
This commit is contained in:
		
							parent
							
								
									d4be07dad3
								
							
						
					
					
						commit
						4b74f985ec
					
				| @ -126,19 +126,19 @@ Use these defines to add or remove animations from the firmware. When you are ru | |||||||
| 
 | 
 | ||||||
| The following options are used to tweak the various animations: | The following options are used to tweak the various animations: | ||||||
| 
 | 
 | ||||||
| |Define                              |Default      |Description                                                                          | | |Define                              |Default      |Description                                                                                    | | ||||||
| |------------------------------------|-------------|-------------------------------------------------------------------------------------| | |------------------------------------|-------------|-----------------------------------------------------------------------------------------------| | ||||||
| |`RGBLIGHT_EFFECT_BREATHE_CENTER`    |*Not defined*|If defined, used to calculate the curve for the breathing animation. Valid values are 1.0 to 2.7 | | |`RGBLIGHT_EFFECT_BREATHE_CENTER`    |*Not defined*|If defined, used to calculate the curve for the breathing animation. Valid values are 1.0 to 2.7 | | ||||||
| |`RGBLIGHT_EFFECT_BREATHE_MAX`       |`255`        |The maximum brightness for the breathing mode. Valid values are 1 to 255             | | |`RGBLIGHT_EFFECT_BREATHE_MAX`       |`255`        |The maximum brightness for the breathing mode. Valid values are 1 to 255                       | | ||||||
| |`RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL`|`1000`       |How long to wait between light changes for the "Christmas" animation, in milliseconds| | |`RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL`|`40`         |How long (in milliseconds) to wait between animation steps for the "Christmas" animation       | | ||||||
| |`RGBLIGHT_EFFECT_CHRISTMAS_STEP`    |`2`          |The number of LEDs to group the red/green colors by for the "Christmas" animation    | | |`RGBLIGHT_EFFECT_CHRISTMAS_STEP`    |`2`          |The number of LEDs to group the red/green colors by for the "Christmas" animation              | | ||||||
| |`RGBLIGHT_EFFECT_KNIGHT_LED_NUM`    |`RGBLED_NUM` |The number of LEDs to have the "Knight" animation travel                             | | |`RGBLIGHT_EFFECT_KNIGHT_LED_NUM`    |`RGBLED_NUM` |The number of LEDs to have the "Knight" animation travel                                       | | ||||||
| |`RGBLIGHT_EFFECT_KNIGHT_LENGTH`     |`3`          |The number of LEDs to light up for the "Knight" animation                            | | |`RGBLIGHT_EFFECT_KNIGHT_LENGTH`     |`3`          |The number of LEDs to light up for the "Knight" animation                                      | | ||||||
| |`RGBLIGHT_EFFECT_KNIGHT_OFFSET`     |`0`          |The number of LEDs to start the "Knight" animation from the start of the strip by    | | |`RGBLIGHT_EFFECT_KNIGHT_OFFSET`     |`0`          |The number of LEDs to start the "Knight" animation from the start of the strip by              | | ||||||
| |`RGBLIGHT_RAINBOW_SWIRL_RANGE`      |`255`        |Range adjustment for the rainbow swirl effect to get different swirls                | | |`RGBLIGHT_RAINBOW_SWIRL_RANGE`      |`255`        |Range adjustment for the rainbow swirl effect to get different swirls                          | | ||||||
| |`RGBLIGHT_EFFECT_SNAKE_LENGTH`      |`4`          |The number of LEDs to light up for the "Snake" animation                             | | |`RGBLIGHT_EFFECT_SNAKE_LENGTH`      |`4`          |The number of LEDs to light up for the "Snake" animation                                       | | ||||||
| |`RGBLIGHT_EFFECT_TWINKLE_LIFE`      |`75`         |Adjusts how quickly each LED brightens and dims when twinkling (in animation steps)  | | |`RGBLIGHT_EFFECT_TWINKLE_LIFE`      |`75`         |Adjusts how quickly each LED brightens and dims when twinkling (in animation steps)            | | ||||||
| |`RGBLIGHT_EFFECT_TWINKLE_PROBABILITY`|`1/127`     |Adjusts how likely each LED is to twinkle (on each animation step)                   | | |`RGBLIGHT_EFFECT_TWINKLE_PROBABILITY`|`1/127`     |Adjusts how likely each LED is to twinkle (on each animation step)                             | | ||||||
| 
 | 
 | ||||||
| ### Example Usage to Reduce Memory Footprint | ### Example Usage to Reduce Memory Footprint | ||||||
|   1. Remove `RGBLIGHT_ANIMATIONS` from `config.h`. |   1. Remove `RGBLIGHT_ANIMATIONS` from `config.h`. | ||||||
|  | |||||||
| @ -1163,16 +1163,39 @@ void rgblight_effect_knight(animation_status_t *anim) { | |||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #ifdef RGBLIGHT_EFFECT_CHRISTMAS | #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) { | 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; |     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++) { |     for (i = 0; i < rgblight_ranges.effect_num_leds; i++) { | ||||||
|         hue = 0 + ((i / RGBLIGHT_EFFECT_CHRISTMAS_STEP + anim->current_offset) % 2) * 85; |         uint8_t local_hue = (i / RGBLIGHT_EFFECT_CHRISTMAS_STEP) % 2 ? hue : hue_green - hue; | ||||||
|         sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i + rgblight_ranges.effect_start_pos]); |         sethsv(local_hue, rgblight_config.sat, val, (LED_TYPE *)&led[i + rgblight_ranges.effect_start_pos]); | ||||||
|     } |     } | ||||||
|     rgblight_set(); |     rgblight_set(); | ||||||
|  | 
 | ||||||
|  |     if (anim->pos == 0) { | ||||||
|  |         increment = 1; | ||||||
|  |     } else if (anim->pos == max_pos) { | ||||||
|  |         increment = -1; | ||||||
|  |     } | ||||||
|  |     anim->pos += increment; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -142,7 +142,7 @@ enum RGBLIGHT_EFFECT_MODE { | |||||||
| #    endif | #    endif | ||||||
| 
 | 
 | ||||||
| #    ifndef RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL | #    ifndef RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL | ||||||
| #        define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 1000 | #        define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 40 | ||||||
| #    endif | #    endif | ||||||
| 
 | 
 | ||||||
| #    ifndef RGBLIGHT_EFFECT_CHRISTMAS_STEP | #    ifndef RGBLIGHT_EFFECT_CHRISTMAS_STEP | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Max Rumpf
						Max Rumpf