mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-30 21:02:32 +01:00 
			
		
		
		
	Merge remote-tracking branch 'origin/master' into develop
This commit is contained in:
		
						commit
						fd7ab5a22b
					
				| @ -15,13 +15,16 @@ | |||||||
|  */ |  */ | ||||||
| #include <math.h> | #include <math.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
|  | #include <stdlib.h> | ||||||
| #ifdef __AVR__ | #ifdef __AVR__ | ||||||
| #    include <avr/eeprom.h> | #    include <avr/eeprom.h> | ||||||
| #    include <avr/interrupt.h> | #    include <avr/interrupt.h> | ||||||
| #endif | #endif | ||||||
|  | #ifdef EEPROM_ENABLE | ||||||
|  | #    include "eeprom.h" | ||||||
|  | #endif | ||||||
| #ifdef STM32_EEPROM_ENABLE | #ifdef STM32_EEPROM_ENABLE | ||||||
| #    include <hal.h> | #    include <hal.h> | ||||||
| #    include "eeprom.h" |  | ||||||
| #    include "eeprom_stm32.h" | #    include "eeprom_stm32.h" | ||||||
| #endif | #endif | ||||||
| #include "wait.h" | #include "wait.h" | ||||||
| @ -38,17 +41,23 @@ | |||||||
| // MxSS custom
 | // MxSS custom
 | ||||||
| #include "mxss_frontled.h" | #include "mxss_frontled.h" | ||||||
| 
 | 
 | ||||||
|  | #ifndef MIN | ||||||
|  | #    define MIN(a, b) (((a) < (b)) ? (a) : (b)) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #ifdef RGBLIGHT_SPLIT | #ifdef RGBLIGHT_SPLIT | ||||||
| /* for split keyboard */ | /* for split keyboard */ | ||||||
| #    define RGBLIGHT_SPLIT_SET_CHANGE_MODE rgblight_status.change_flags |= RGBLIGHT_STATUS_CHANGE_MODE | #    define RGBLIGHT_SPLIT_SET_CHANGE_MODE rgblight_status.change_flags |= RGBLIGHT_STATUS_CHANGE_MODE | ||||||
| #    define RGBLIGHT_SPLIT_SET_CHANGE_HSVS rgblight_status.change_flags |= RGBLIGHT_STATUS_CHANGE_HSVS | #    define RGBLIGHT_SPLIT_SET_CHANGE_HSVS rgblight_status.change_flags |= RGBLIGHT_STATUS_CHANGE_HSVS | ||||||
| #    define RGBLIGHT_SPLIT_SET_CHANGE_MODEHSVS rgblight_status.change_flags |= (RGBLIGHT_STATUS_CHANGE_MODE | RGBLIGHT_STATUS_CHANGE_HSVS) | #    define RGBLIGHT_SPLIT_SET_CHANGE_MODEHSVS rgblight_status.change_flags |= (RGBLIGHT_STATUS_CHANGE_MODE | RGBLIGHT_STATUS_CHANGE_HSVS) | ||||||
|  | #    define RGBLIGHT_SPLIT_SET_CHANGE_LAYERS rgblight_status.change_flags |= RGBLIGHT_STATUS_CHANGE_LAYERS | ||||||
| #    define RGBLIGHT_SPLIT_SET_CHANGE_TIMER_ENABLE rgblight_status.change_flags |= RGBLIGHT_STATUS_CHANGE_TIMER | #    define RGBLIGHT_SPLIT_SET_CHANGE_TIMER_ENABLE rgblight_status.change_flags |= RGBLIGHT_STATUS_CHANGE_TIMER | ||||||
| #    define RGBLIGHT_SPLIT_ANIMATION_TICK rgblight_status.change_flags |= RGBLIGHT_STATUS_ANIMATION_TICK | #    define RGBLIGHT_SPLIT_ANIMATION_TICK rgblight_status.change_flags |= RGBLIGHT_STATUS_ANIMATION_TICK | ||||||
| #else | #else | ||||||
| #    define RGBLIGHT_SPLIT_SET_CHANGE_MODE | #    define RGBLIGHT_SPLIT_SET_CHANGE_MODE | ||||||
| #    define RGBLIGHT_SPLIT_SET_CHANGE_HSVS | #    define RGBLIGHT_SPLIT_SET_CHANGE_HSVS | ||||||
| #    define RGBLIGHT_SPLIT_SET_CHANGE_MODEHSVS | #    define RGBLIGHT_SPLIT_SET_CHANGE_MODEHSVS | ||||||
|  | #    define RGBLIGHT_SPLIT_SET_CHANGE_LAYERS | ||||||
| #    define RGBLIGHT_SPLIT_SET_CHANGE_TIMER_ENABLE | #    define RGBLIGHT_SPLIT_SET_CHANGE_TIMER_ENABLE | ||||||
| #    define RGBLIGHT_SPLIT_ANIMATION_TICK | #    define RGBLIGHT_SPLIT_ANIMATION_TICK | ||||||
| #endif | #endif | ||||||
| @ -97,11 +106,11 @@ LED_TYPE led[RGBLED_NUM]; | |||||||
| #    define LED_ARRAY led | #    define LED_ARRAY led | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| static uint8_t clipping_start_pos = 0; | #ifdef RGBLIGHT_LAYERS | ||||||
| static uint8_t clipping_num_leds  = RGBLED_NUM; | rgblight_segment_t const *const *rgblight_layers = NULL; | ||||||
| static uint8_t effect_start_pos   = 0; | #endif | ||||||
| static uint8_t effect_end_pos     = RGBLED_NUM; | 
 | ||||||
| static uint8_t effect_num_leds    = RGBLED_NUM; | rgblight_ranges_t rgblight_ranges = {0, RGBLED_NUM, 0, RGBLED_NUM, RGBLED_NUM}; | ||||||
| 
 | 
 | ||||||
| // MxSS custom
 | // MxSS custom
 | ||||||
| extern uint8_t fled_mode; | extern uint8_t fled_mode; | ||||||
| @ -116,18 +125,20 @@ void copyrgb(LED_TYPE *src, LED_TYPE *dst) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void rgblight_set_clipping_range(uint8_t start_pos, uint8_t num_leds) { | void rgblight_set_clipping_range(uint8_t start_pos, uint8_t num_leds) { | ||||||
|     clipping_start_pos = start_pos; |     rgblight_ranges.clipping_start_pos = start_pos; | ||||||
|     clipping_num_leds  = num_leds; |     rgblight_ranges.clipping_num_leds  = num_leds; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void rgblight_set_effect_range(uint8_t start_pos, uint8_t num_leds) { | void rgblight_set_effect_range(uint8_t start_pos, uint8_t num_leds) { | ||||||
|     if (start_pos >= RGBLED_NUM) return; |     if (start_pos >= RGBLED_NUM) return; | ||||||
|     if (start_pos + num_leds > RGBLED_NUM) return; |     if (start_pos + num_leds > RGBLED_NUM) return; | ||||||
|     effect_start_pos = start_pos; |     rgblight_ranges.effect_start_pos = start_pos; | ||||||
|     effect_end_pos   = start_pos + num_leds; |     rgblight_ranges.effect_end_pos   = start_pos + num_leds; | ||||||
|     effect_num_leds  = num_leds; |     rgblight_ranges.effect_num_leds  = num_leds; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | __attribute__((weak)) RGB rgblight_hsv_to_rgb(HSV hsv) { return hsv_to_rgb(hsv); } | ||||||
|  | 
 | ||||||
| void sethsv_raw(uint8_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1) { | void sethsv_raw(uint8_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1) { | ||||||
|     HSV hsv = {hue, sat, val}; |     HSV hsv = {hue, sat, val}; | ||||||
|     // MxSS custom
 |     // MxSS custom
 | ||||||
| @ -138,7 +149,8 @@ void sethsv_raw(uint8_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1) { | |||||||
|     } else if (led1 == &led[RGBLIGHT_FLED2]) { |     } else if (led1 == &led[RGBLIGHT_FLED2]) { | ||||||
|         fled_hs[1].hue = hue; |         fled_hs[1].hue = hue; | ||||||
|         fled_hs[1].sat = sat; |         fled_hs[1].sat = sat; | ||||||
|     }  RGB rgb = hsv_to_rgb(hsv); |     } | ||||||
|  |     RGB rgb = rgblight_hsv_to_rgb(hsv); | ||||||
|     setrgb(rgb.r, rgb.g, rgb.b, led1); |     setrgb(rgb.r, rgb.g, rgb.b, led1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -168,7 +180,7 @@ void rgblight_check_config(void) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| uint32_t eeconfig_read_rgblight(void) { | uint32_t eeconfig_read_rgblight(void) { | ||||||
| #if defined(__AVR__) || defined(STM32_EEPROM_ENABLE) || defined(PROTOCOL_ARM_ATSAM) || defined(EEPROM_SIZE) | #ifdef EEPROM_ENABLE | ||||||
|     return eeprom_read_dword(EECONFIG_RGBLIGHT); |     return eeprom_read_dword(EECONFIG_RGBLIGHT); | ||||||
| #else | #else | ||||||
|     return 0; |     return 0; | ||||||
| @ -176,15 +188,13 @@ uint32_t eeconfig_read_rgblight(void) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void eeconfig_update_rgblight(uint32_t val) { | void eeconfig_update_rgblight(uint32_t val) { | ||||||
| #if defined(__AVR__) || defined(STM32_EEPROM_ENABLE) || defined(PROTOCOL_ARM_ATSAM) || defined(EEPROM_SIZE) | #ifdef EEPROM_ENABLE | ||||||
|     rgblight_check_config(); |     rgblight_check_config(); | ||||||
|     eeprom_update_dword(EECONFIG_RGBLIGHT, val); |     eeprom_update_dword(EECONFIG_RGBLIGHT, val); | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void eeconfig_update_rgblight_current(void) { | void eeconfig_update_rgblight_current(void) { eeconfig_update_rgblight(rgblight_config.raw); } | ||||||
|     eeconfig_update_rgblight(rgblight_config.raw); |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| void eeconfig_update_rgblight_default(void) { | void eeconfig_update_rgblight_default(void) { | ||||||
|     rgblight_config.enable = 1; |     rgblight_config.enable = 1; | ||||||
| @ -233,9 +243,7 @@ void rgblight_init(void) { | |||||||
| 
 | 
 | ||||||
|     eeconfig_debug_rgblight();  // display current eeprom values
 |     eeconfig_debug_rgblight();  // display current eeprom values
 | ||||||
| 
 | 
 | ||||||
| #ifdef RGBLIGHT_USE_TIMER |  | ||||||
|     rgblight_timer_init();  // setup the timer
 |     rgblight_timer_init();  // setup the timer
 | ||||||
| #endif |  | ||||||
| 
 | 
 | ||||||
|     if (rgblight_config.enable) { |     if (rgblight_config.enable) { | ||||||
|         rgblight_mode_noeeprom(rgblight_config.mode); |         rgblight_mode_noeeprom(rgblight_config.mode); | ||||||
| @ -252,9 +260,7 @@ void rgblight_update_dword(uint32_t dword) { | |||||||
|     if (rgblight_config.enable) |     if (rgblight_config.enable) | ||||||
|         rgblight_mode_noeeprom(rgblight_config.mode); |         rgblight_mode_noeeprom(rgblight_config.mode); | ||||||
|     else { |     else { | ||||||
| #ifdef RGBLIGHT_USE_TIMER |  | ||||||
|         rgblight_timer_disable(); |         rgblight_timer_disable(); | ||||||
| #endif |  | ||||||
|         rgblight_set(); |         rgblight_set(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -322,13 +328,9 @@ void rgblight_mode_eeprom_helper(uint8_t mode, bool write_to_eeprom) { | |||||||
|         dprintf("rgblight mode [NOEEPROM]: %u\n", rgblight_config.mode); |         dprintf("rgblight mode [NOEEPROM]: %u\n", rgblight_config.mode); | ||||||
|     } |     } | ||||||
|     if (is_static_effect(rgblight_config.mode)) { |     if (is_static_effect(rgblight_config.mode)) { | ||||||
| #ifdef RGBLIGHT_USE_TIMER |  | ||||||
|         rgblight_timer_disable(); |         rgblight_timer_disable(); | ||||||
| #endif |  | ||||||
|     } else { |     } else { | ||||||
| #ifdef RGBLIGHT_USE_TIMER |  | ||||||
|         rgblight_timer_enable(); |         rgblight_timer_enable(); | ||||||
| #endif |  | ||||||
|     } |     } | ||||||
| #ifdef RGBLIGHT_USE_TIMER | #ifdef RGBLIGHT_USE_TIMER | ||||||
|     animation_status.restart = true; |     animation_status.restart = true; | ||||||
| @ -376,9 +378,7 @@ void rgblight_disable(void) { | |||||||
|     rgblight_config.enable = 0; |     rgblight_config.enable = 0; | ||||||
|     eeconfig_update_rgblight(rgblight_config.raw); |     eeconfig_update_rgblight(rgblight_config.raw); | ||||||
|     dprintf("rgblight disable [EEPROM]: rgblight_config.enable = %u\n", rgblight_config.enable); |     dprintf("rgblight disable [EEPROM]: rgblight_config.enable = %u\n", rgblight_config.enable); | ||||||
| #ifdef RGBLIGHT_USE_TIMER |  | ||||||
|     rgblight_timer_disable(); |     rgblight_timer_disable(); | ||||||
| #endif |  | ||||||
|     RGBLIGHT_SPLIT_SET_CHANGE_MODE; |     RGBLIGHT_SPLIT_SET_CHANGE_MODE; | ||||||
|     wait_ms(50); |     wait_ms(50); | ||||||
|     rgblight_set(); |     rgblight_set(); | ||||||
| @ -387,14 +387,14 @@ void rgblight_disable(void) { | |||||||
| void rgblight_disable_noeeprom(void) { | void rgblight_disable_noeeprom(void) { | ||||||
|     rgblight_config.enable = 0; |     rgblight_config.enable = 0; | ||||||
|     dprintf("rgblight disable [NOEEPROM]: rgblight_config.enable = %u\n", rgblight_config.enable); |     dprintf("rgblight disable [NOEEPROM]: rgblight_config.enable = %u\n", rgblight_config.enable); | ||||||
| #ifdef RGBLIGHT_USE_TIMER |  | ||||||
|     rgblight_timer_disable(); |     rgblight_timer_disable(); | ||||||
| #endif |  | ||||||
|     RGBLIGHT_SPLIT_SET_CHANGE_MODE; |     RGBLIGHT_SPLIT_SET_CHANGE_MODE; | ||||||
|     wait_ms(50); |     wait_ms(50); | ||||||
|     rgblight_set(); |     rgblight_set(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | bool rgblight_is_enabled(void) { return rgblight_config.enable; } | ||||||
|  | 
 | ||||||
| void rgblight_increase_hue_helper(bool write_to_eeprom) { | void rgblight_increase_hue_helper(bool write_to_eeprom) { | ||||||
|     uint8_t hue = rgblight_config.hue + RGBLIGHT_HUE_STEP; |     uint8_t hue = rgblight_config.hue + RGBLIGHT_HUE_STEP; | ||||||
|     rgblight_sethsv_eeprom_helper(hue, rgblight_config.sat, rgblight_config.val, write_to_eeprom); |     rgblight_sethsv_eeprom_helper(hue, rgblight_config.sat, rgblight_config.val, write_to_eeprom); | ||||||
| @ -431,17 +431,25 @@ void rgblight_decrease_val_helper(bool write_to_eeprom) { | |||||||
| } | } | ||||||
| void rgblight_decrease_val_noeeprom(void) { rgblight_decrease_val_helper(false); } | void rgblight_decrease_val_noeeprom(void) { rgblight_decrease_val_helper(false); } | ||||||
| void rgblight_decrease_val(void) { rgblight_decrease_val_helper(true); } | 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++; |     if (rgblight_config.speed < 3) rgblight_config.speed++; | ||||||
|     // RGBLIGHT_SPLIT_SET_CHANGE_HSVS; // NEED?
 |     // RGBLIGHT_SPLIT_SET_CHANGE_HSVS; // NEED?
 | ||||||
|  |     if (write_to_eeprom) { | ||||||
|         eeconfig_update_rgblight(rgblight_config.raw);  // EECONFIG needs to be increased to support this
 |         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_decrease_speed(void) { | void rgblight_increase_speed_noeeprom(void) { rgblight_increase_speed_helper(false); } | ||||||
|  | void rgblight_decrease_speed_helper(bool write_to_eeprom) { | ||||||
|     if (rgblight_config.speed > 0) rgblight_config.speed--; |     if (rgblight_config.speed > 0) rgblight_config.speed--; | ||||||
|     // RGBLIGHT_SPLIT_SET_CHANGE_HSVS; // NEED??
 |     // RGBLIGHT_SPLIT_SET_CHANGE_HSVS; // NEED??
 | ||||||
|  |     if (write_to_eeprom) { | ||||||
|         eeconfig_update_rgblight(rgblight_config.raw);  // EECONFIG needs to be increased to support this
 |         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) { | void rgblight_sethsv_noeeprom_old(uint8_t hue, uint8_t sat, uint8_t val) { | ||||||
|     if (rgblight_config.enable) { |     if (rgblight_config.enable) { | ||||||
| @ -502,15 +510,15 @@ void rgblight_sethsv_eeprom_helper(uint8_t hue, uint8_t sat, uint8_t val, bool w | |||||||
| #    else | #    else | ||||||
|                 uint8_t range = RGBLED_GRADIENT_RANGES[delta / 2]; |                 uint8_t range = RGBLED_GRADIENT_RANGES[delta / 2]; | ||||||
| #    endif | #    endif | ||||||
|                 for (uint8_t i = 0; i < effect_num_leds; i++) { |                 for (uint8_t i = 0; i < rgblight_ranges.effect_num_leds; i++) { | ||||||
|                     uint8_t _hue = ((uint16_t)i * (uint16_t)range) / effect_num_leds; |                     uint8_t _hue = ((uint16_t)i * (uint16_t)range) / rgblight_ranges.effect_num_leds; | ||||||
|                     if (direction) { |                     if (direction) { | ||||||
|                         _hue = hue + _hue; |                         _hue = hue + _hue; | ||||||
|                     } else { |                     } else { | ||||||
|                         _hue = hue - _hue; |                         _hue = hue - _hue; | ||||||
|                     } |                     } | ||||||
|                     dprintf("rgblight rainbow set hsv: %d,%d,%d,%u\n", i, _hue, direction, range); |                     dprintf("rgblight rainbow set hsv: %d,%d,%d,%u\n", i, _hue, direction, range); | ||||||
|                     sethsv(_hue, sat, val, (LED_TYPE *)&led[i + effect_start_pos]); |                     sethsv(_hue, sat, val, (LED_TYPE *)&led[i + rgblight_ranges.effect_start_pos]); | ||||||
|                 } |                 } | ||||||
|                 rgblight_set(); |                 rgblight_set(); | ||||||
|             } |             } | ||||||
| @ -559,12 +567,14 @@ uint8_t rgblight_get_sat(void) { return rgblight_config.sat; } | |||||||
| 
 | 
 | ||||||
| uint8_t rgblight_get_val(void) { return rgblight_config.val; } | uint8_t rgblight_get_val(void) { return rgblight_config.val; } | ||||||
| 
 | 
 | ||||||
|  | HSV rgblight_get_hsv(void) { return (HSV){rgblight_config.hue, rgblight_config.sat, rgblight_config.val}; } | ||||||
|  | 
 | ||||||
| void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b) { | void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b) { | ||||||
|     if (!rgblight_config.enable) { |     if (!rgblight_config.enable) { | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     for (uint8_t i = effect_start_pos; i < effect_end_pos; i++) { |     for (uint8_t i = rgblight_ranges.effect_start_pos; i < rgblight_ranges.effect_end_pos; i++) { | ||||||
|         led[i].r = r; |         led[i].r = r; | ||||||
|         led[i].g = g; |         led[i].g = g; | ||||||
|         led[i].b = b; |         led[i].b = b; | ||||||
| @ -599,7 +609,7 @@ void rgblight_sethsv_at(uint8_t hue, uint8_t sat, uint8_t val, uint8_t index) { | |||||||
|     rgblight_setrgb_at(tmp_led.r, tmp_led.g, tmp_led.b, index); |     rgblight_setrgb_at(tmp_led.r, tmp_led.g, tmp_led.b, index); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #if defined(RGBLIGHT_EFFECT_BREATHING) || defined(RGBLIGHT_EFFECT_RAINBOW_MOOD) || defined(RGBLIGHT_EFFECT_RAINBOW_SWIRL) || defined(RGBLIGHT_EFFECT_SNAKE) || defined(RGBLIGHT_EFFECT_KNIGHT) | #if defined(RGBLIGHT_EFFECT_BREATHING) || defined(RGBLIGHT_EFFECT_RAINBOW_MOOD) || defined(RGBLIGHT_EFFECT_RAINBOW_SWIRL) || defined(RGBLIGHT_EFFECT_SNAKE) || defined(RGBLIGHT_EFFECT_KNIGHT) || defined(RGBLIGHT_EFFECT_TWINKLE) | ||||||
| 
 | 
 | ||||||
| static uint8_t get_interval_time(const uint8_t *default_interval_address, uint8_t velocikey_min, uint8_t velocikey_max) { | static uint8_t get_interval_time(const uint8_t *default_interval_address, uint8_t velocikey_min, uint8_t velocikey_max) { | ||||||
|     return |     return | ||||||
| @ -648,13 +658,97 @@ void rgblight_sethsv_master(uint8_t hue, uint8_t sat, uint8_t val) { rgblight_se | |||||||
| void rgblight_sethsv_slave(uint8_t hue, uint8_t sat, uint8_t val) { rgblight_sethsv_range(hue, sat, val, (uint8_t)RGBLED_NUM / 2, (uint8_t)RGBLED_NUM); } | void rgblight_sethsv_slave(uint8_t hue, uint8_t sat, uint8_t val) { rgblight_sethsv_range(hue, sat, val, (uint8_t)RGBLED_NUM / 2, (uint8_t)RGBLED_NUM); } | ||||||
| #endif  // ifndef RGBLIGHT_SPLIT
 | #endif  // ifndef RGBLIGHT_SPLIT
 | ||||||
| 
 | 
 | ||||||
|  | #ifdef RGBLIGHT_LAYERS | ||||||
|  | void rgblight_set_layer_state(uint8_t layer, bool enabled) { | ||||||
|  |     rgblight_layer_mask_t mask = 1 << layer; | ||||||
|  |     if (enabled) { | ||||||
|  |         rgblight_status.enabled_layer_mask |= mask; | ||||||
|  |     } else { | ||||||
|  |         rgblight_status.enabled_layer_mask &= ~mask; | ||||||
|  |     } | ||||||
|  |     RGBLIGHT_SPLIT_SET_CHANGE_LAYERS; | ||||||
|  |     // Static modes don't have a ticker running to update the LEDs
 | ||||||
|  |     if (rgblight_status.timer_enabled == false) { | ||||||
|  |         rgblight_mode_noeeprom(rgblight_config.mode); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | #    ifdef RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF | ||||||
|  |     // If not enabled, then nothing else will actually set the LEDs...
 | ||||||
|  |     if (!rgblight_config.enable) { | ||||||
|  |         rgblight_set(); | ||||||
|  |     } | ||||||
|  | #    endif | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool rgblight_get_layer_state(uint8_t layer) { | ||||||
|  |     rgblight_layer_mask_t mask = 1 << layer; | ||||||
|  |     return (rgblight_status.enabled_layer_mask & mask) != 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Write any enabled LED layers into the buffer
 | ||||||
|  | static void rgblight_layers_write(void) { | ||||||
|  |     uint8_t i = 0; | ||||||
|  |     // For each layer
 | ||||||
|  |     for (const rgblight_segment_t *const *layer_ptr = rgblight_layers; i < RGBLIGHT_MAX_LAYERS; layer_ptr++, i++) { | ||||||
|  |         if (!rgblight_get_layer_state(i)) { | ||||||
|  |             continue;  // Layer is disabled
 | ||||||
|  |         } | ||||||
|  |         const rgblight_segment_t *segment_ptr = pgm_read_ptr(layer_ptr); | ||||||
|  |         if (segment_ptr == NULL) { | ||||||
|  |             break;  // No more layers
 | ||||||
|  |         } | ||||||
|  |         // For each segment
 | ||||||
|  |         while (1) { | ||||||
|  |             rgblight_segment_t segment; | ||||||
|  |             memcpy_P(&segment, segment_ptr, sizeof(rgblight_segment_t)); | ||||||
|  |             if (segment.index == RGBLIGHT_END_SEGMENT_INDEX) { | ||||||
|  |                 break;  // No more segments
 | ||||||
|  |             } | ||||||
|  |             // Write segment.count LEDs
 | ||||||
|  |             LED_TYPE *const limit = &led[MIN(segment.index + segment.count, RGBLED_NUM)]; | ||||||
|  |             for (LED_TYPE *led_ptr = &led[segment.index]; led_ptr < limit; led_ptr++) { | ||||||
|  |                 sethsv(segment.hue, segment.sat, segment.val, led_ptr); | ||||||
|  |             } | ||||||
|  |             segment_ptr++; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #    ifdef RGBLIGHT_LAYER_BLINK | ||||||
|  | rgblight_layer_mask_t _blinked_layer_mask = 0; | ||||||
|  | uint16_t              _blink_duration     = 0; | ||||||
|  | static uint16_t       _blink_timer; | ||||||
|  | 
 | ||||||
|  | void rgblight_blink_layer(uint8_t layer, uint16_t duration_ms) { | ||||||
|  |     rgblight_set_layer_state(layer, true); | ||||||
|  |     _blinked_layer_mask |= 1 << layer; | ||||||
|  |     _blink_timer    = timer_read(); | ||||||
|  |     _blink_duration = duration_ms; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void rgblight_unblink_layers(void) { | ||||||
|  |     if (_blinked_layer_mask != 0 && timer_elapsed(_blink_timer) > _blink_duration) { | ||||||
|  |         for (uint8_t layer = 0; layer < RGBLIGHT_MAX_LAYERS; layer++) { | ||||||
|  |             if ((_blinked_layer_mask & 1 << layer) != 0) { | ||||||
|  |                 rgblight_set_layer_state(layer, false); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         _blinked_layer_mask = 0; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | #    endif | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | __attribute__((weak)) void rgblight_call_driver(LED_TYPE *start_led, uint8_t num_leds) { ws2812_setleds(start_led, num_leds); } | ||||||
|  | 
 | ||||||
| #ifndef RGBLIGHT_CUSTOM_DRIVER | #ifndef RGBLIGHT_CUSTOM_DRIVER | ||||||
| void rgblight_set(void) { | void rgblight_set(void) { | ||||||
|     LED_TYPE *start_led; |     LED_TYPE *start_led; | ||||||
|     uint16_t  num_leds = clipping_num_leds; |     uint8_t   num_leds = rgblight_ranges.clipping_num_leds; | ||||||
| 
 | 
 | ||||||
|     if (!rgblight_config.enable) { |     if (!rgblight_config.enable) { | ||||||
|         for (uint8_t i = effect_start_pos; i < effect_end_pos; i++) { |         for (uint8_t i = rgblight_ranges.effect_start_pos; i < rgblight_ranges.effect_end_pos; i++) { | ||||||
|             if (i == RGBLIGHT_FLED1 && i == RGBLIGHT_FLED2) |             if (i == RGBLIGHT_FLED1 && i == RGBLIGHT_FLED2) | ||||||
|                 continue; |                 continue; | ||||||
| 
 | 
 | ||||||
| @ -667,21 +761,31 @@ void rgblight_set(void) { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | #    ifdef RGBLIGHT_LAYERS | ||||||
|  |     if (rgblight_layers != NULL | ||||||
|  | #        ifndef RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF | ||||||
|  |         && rgblight_config.enable | ||||||
|  | #        endif | ||||||
|  |     ) { | ||||||
|  |         rgblight_layers_write(); | ||||||
|  |     } | ||||||
|  | #    endif | ||||||
|  | 
 | ||||||
| #    ifdef RGBLIGHT_LED_MAP | #    ifdef RGBLIGHT_LED_MAP | ||||||
|     LED_TYPE led0[RGBLED_NUM]; |     LED_TYPE led0[RGBLED_NUM]; | ||||||
|     for (uint8_t i = 0; i < RGBLED_NUM; i++) { |     for (uint8_t i = 0; i < RGBLED_NUM; i++) { | ||||||
|         led0[i] = led[pgm_read_byte(&led_map[i])]; |         led0[i] = led[pgm_read_byte(&led_map[i])]; | ||||||
|     } |     } | ||||||
|     start_led = led0 + clipping_start_pos; |     start_led = led0 + rgblight_ranges.clipping_start_pos; | ||||||
| #    else | #    else | ||||||
|     start_led = led + clipping_start_pos; |     start_led = led + rgblight_ranges.clipping_start_pos; | ||||||
| #    endif | #    endif | ||||||
| 
 | 
 | ||||||
| #ifdef RGBW | #    ifdef RGBW | ||||||
|     for (uint8_t i = 0; i < num_leds; i++) { |     for (uint8_t i = 0; i < num_leds; i++) { | ||||||
|         convert_rgb_to_rgbw(&start_led[i]); |         convert_rgb_to_rgbw(&start_led[i]); | ||||||
|     } |     } | ||||||
| #endif | #    endif | ||||||
|     // MxSS custom
 |     // MxSS custom
 | ||||||
|     switch (fled_mode) { |     switch (fled_mode) { | ||||||
|         case FLED_OFF: |         case FLED_OFF: | ||||||
| @ -709,12 +813,11 @@ void rgblight_set(void) { | |||||||
|             else |             else | ||||||
|                 sethsv(fled_hs[1].hue, fled_hs[1].sat, fled_val, &led[RGBLIGHT_FLED2]); |                 sethsv(fled_hs[1].hue, fled_hs[1].sat, fled_val, &led[RGBLIGHT_FLED2]); | ||||||
|             break; |             break; | ||||||
| 
 |  | ||||||
|         default: |         default: | ||||||
|             break; |             break; | ||||||
|    } |    } | ||||||
| 
 | 
 | ||||||
|    ws2812_setleds(start_led, num_leds); |     rgblight_call_driver(start_led, num_leds); | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| @ -731,6 +834,11 @@ void rgblight_get_syncinfo(rgblight_syncinfo_t *syncinfo) { | |||||||
| 
 | 
 | ||||||
| /* for split keyboard slave side */ | /* for split keyboard slave side */ | ||||||
| void rgblight_update_sync(rgblight_syncinfo_t *syncinfo, bool write_to_eeprom) { | void rgblight_update_sync(rgblight_syncinfo_t *syncinfo, bool write_to_eeprom) { | ||||||
|  | #    ifdef RGBLIGHT_LAYERS | ||||||
|  |     if (syncinfo->status.change_flags & RGBLIGHT_STATUS_CHANGE_LAYERS) { | ||||||
|  |         rgblight_status.enabled_layer_mask = syncinfo->status.enabled_layer_mask; | ||||||
|  |     } | ||||||
|  | #    endif | ||||||
|     if (syncinfo->status.change_flags & RGBLIGHT_STATUS_CHANGE_MODE) { |     if (syncinfo->status.change_flags & RGBLIGHT_STATUS_CHANGE_MODE) { | ||||||
|         if (syncinfo->config.enable) { |         if (syncinfo->config.enable) { | ||||||
|             rgblight_config.enable = 1;  // == rgblight_enable_noeeprom();
 |             rgblight_config.enable = 1;  // == rgblight_enable_noeeprom();
 | ||||||
| @ -892,6 +1000,12 @@ void rgblight_task(void) { | |||||||
|             interval_time = 500; |             interval_time = 500; | ||||||
|             effect_func   = (effect_func_t)rgblight_effect_alternating; |             effect_func   = (effect_func_t)rgblight_effect_alternating; | ||||||
|         } |         } | ||||||
|  | #    endif | ||||||
|  | #    ifdef RGBLIGHT_EFFECT_TWINKLE | ||||||
|  |         else if (rgblight_status.base_mode == RGBLIGHT_MODE_TWINKLE) { | ||||||
|  |             interval_time = get_interval_time(&RGBLED_TWINKLE_INTERVALS[delta % 3], 5, 50); | ||||||
|  |             effect_func   = (effect_func_t)rgblight_effect_twinkle; | ||||||
|  |         } | ||||||
| #    endif | #    endif | ||||||
|         if (animation_status.restart) { |         if (animation_status.restart) { | ||||||
|             animation_status.restart    = false; |             animation_status.restart    = false; | ||||||
| @ -922,6 +1036,10 @@ void rgblight_task(void) { | |||||||
| #    endif | #    endif | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  | #    ifdef RGBLIGHT_LAYER_BLINK | ||||||
|  |     rgblight_unblink_layers(); | ||||||
|  | #    endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #endif /* RGBLIGHT_USE_TIMER */ | #endif /* RGBLIGHT_USE_TIMER */ | ||||||
| @ -972,9 +1090,9 @@ void rgblight_effect_rainbow_swirl(animation_status_t *anim) { | |||||||
|     uint8_t hue; |     uint8_t hue; | ||||||
|     uint8_t i; |     uint8_t i; | ||||||
| 
 | 
 | ||||||
|     for (i = 0; i < effect_num_leds; i++) { |     for (i = 0; i < rgblight_ranges.effect_num_leds; i++) { | ||||||
|         hue = (RGBLIGHT_RAINBOW_SWIRL_RANGE / effect_num_leds * i + anim->current_hue); |         hue = (RGBLIGHT_RAINBOW_SWIRL_RANGE / rgblight_ranges.effect_num_leds * i + anim->current_hue); | ||||||
|         sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i + effect_start_pos]); |         sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i + rgblight_ranges.effect_start_pos]); | ||||||
|     } |     } | ||||||
|     rgblight_set(); |     rgblight_set(); | ||||||
| 
 | 
 | ||||||
| @ -1002,7 +1120,7 @@ void rgblight_effect_snake(animation_status_t *anim) { | |||||||
| #    if defined(RGBLIGHT_SPLIT) && !defined(RGBLIGHT_SPLIT_NO_ANIMATION_SYNC) | #    if defined(RGBLIGHT_SPLIT) && !defined(RGBLIGHT_SPLIT_NO_ANIMATION_SYNC) | ||||||
|     if (anim->pos == 0) {  // restart signal
 |     if (anim->pos == 0) {  // restart signal
 | ||||||
|         if (increment == 1) { |         if (increment == 1) { | ||||||
|             pos = effect_num_leds - 1; |             pos = rgblight_ranges.effect_num_leds - 1; | ||||||
|         } else { |         } else { | ||||||
|             pos = 0; |             pos = 0; | ||||||
|         } |         } | ||||||
| @ -1014,8 +1132,8 @@ void rgblight_effect_snake(animation_status_t *anim) { | |||||||
|     fled_hs[0].hue = fled_hs[1].hue = 0; |     fled_hs[0].hue = fled_hs[1].hue = 0; | ||||||
|     fled_hs[0].sat = fled_hs[1].sat = 0; |     fled_hs[0].sat = fled_hs[1].sat = 0; | ||||||
| 
 | 
 | ||||||
|     for (i = 0; i < effect_num_leds; i++) { |     for (i = 0; i < rgblight_ranges.effect_num_leds; i++) { | ||||||
|         LED_TYPE *ledp = led + i + effect_start_pos; |         LED_TYPE *ledp = led + i + rgblight_ranges.effect_start_pos; | ||||||
|         ledp->r        = 0; |         ledp->r        = 0; | ||||||
|         ledp->g        = 0; |         ledp->g        = 0; | ||||||
|         ledp->b        = 0; |         ledp->b        = 0; | ||||||
| @ -1028,7 +1146,7 @@ void rgblight_effect_snake(animation_status_t *anim) { | |||||||
|                 k = k % RGBLED_NUM; |                 k = k % RGBLED_NUM; | ||||||
|             } |             } | ||||||
|             if (k < 0) { |             if (k < 0) { | ||||||
|                 k = k + effect_num_leds; |                 k = k + rgblight_ranges.effect_num_leds; | ||||||
|             } |             } | ||||||
|             if (i == k) { |             if (i == k) { | ||||||
|                 sethsv(rgblight_config.hue, rgblight_config.sat, (uint8_t)(rgblight_config.val * (RGBLIGHT_EFFECT_SNAKE_LENGTH - j) / RGBLIGHT_EFFECT_SNAKE_LENGTH), ledp); |                 sethsv(rgblight_config.hue, rgblight_config.sat, (uint8_t)(rgblight_config.val * (RGBLIGHT_EFFECT_SNAKE_LENGTH - j) / RGBLIGHT_EFFECT_SNAKE_LENGTH), ledp); | ||||||
| @ -1038,7 +1156,7 @@ void rgblight_effect_snake(animation_status_t *anim) { | |||||||
|     rgblight_set(); |     rgblight_set(); | ||||||
|     if (increment == 1) { |     if (increment == 1) { | ||||||
|         if (pos - 1 < 0) { |         if (pos - 1 < 0) { | ||||||
|             pos = effect_num_leds - 1; |             pos = rgblight_ranges.effect_num_leds - 1; | ||||||
| #    if defined(RGBLIGHT_SPLIT) && !defined(RGBLIGHT_SPLIT_NO_ANIMATION_SYNC) | #    if defined(RGBLIGHT_SPLIT) && !defined(RGBLIGHT_SPLIT_NO_ANIMATION_SYNC) | ||||||
|             anim->pos = 0; |             anim->pos = 0; | ||||||
| #    endif | #    endif | ||||||
| @ -1049,7 +1167,7 @@ void rgblight_effect_snake(animation_status_t *anim) { | |||||||
| #    endif | #    endif | ||||||
|         } |         } | ||||||
|     } else { |     } else { | ||||||
|         pos = (pos + 1) % effect_num_leds; |         pos = (pos + 1) % rgblight_ranges.effect_num_leds; | ||||||
| #    if defined(RGBLIGHT_SPLIT) && !defined(RGBLIGHT_SPLIT_NO_ANIMATION_SYNC) | #    if defined(RGBLIGHT_SPLIT) && !defined(RGBLIGHT_SPLIT_NO_ANIMATION_SYNC) | ||||||
|         anim->pos = pos; |         anim->pos = pos; | ||||||
| #    endif | #    endif | ||||||
| @ -1075,7 +1193,7 @@ void rgblight_effect_knight(animation_status_t *anim) { | |||||||
|     } |     } | ||||||
| #    endif | #    endif | ||||||
|     // Set all the LEDs to 0
 |     // Set all the LEDs to 0
 | ||||||
|     for (i = effect_start_pos; i < effect_end_pos; i++) { |     for (i = rgblight_ranges.effect_start_pos; i < rgblight_ranges.effect_end_pos; i++) { | ||||||
|         led[i].r = 0; |         led[i].r = 0; | ||||||
|         led[i].g = 0; |         led[i].g = 0; | ||||||
|         led[i].b = 0; |         led[i].b = 0; | ||||||
| @ -1085,7 +1203,7 @@ void rgblight_effect_knight(animation_status_t *anim) { | |||||||
|     } |     } | ||||||
|     // Determine which LEDs should be lit up
 |     // Determine which LEDs should be lit up
 | ||||||
|     for (i = 0; i < RGBLIGHT_EFFECT_KNIGHT_LED_NUM; i++) { |     for (i = 0; i < RGBLIGHT_EFFECT_KNIGHT_LED_NUM; i++) { | ||||||
|         cur = (i + RGBLIGHT_EFFECT_KNIGHT_OFFSET) % effect_num_leds + effect_start_pos; |         cur = (i + RGBLIGHT_EFFECT_KNIGHT_OFFSET) % rgblight_ranges.effect_num_leds + rgblight_ranges.effect_start_pos; | ||||||
| 
 | 
 | ||||||
|         if (i >= low_bound && i <= high_bound) { |         if (i >= low_bound && i <= high_bound) { | ||||||
|             sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[cur]); |             sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[cur]); | ||||||
| @ -1124,16 +1242,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.
 | ||||||
|     for (i = 0; i < effect_num_leds; i++) { |     // 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.
 | ||||||
|         hue = 0 + ((i / RGBLIGHT_EFFECT_CHRISTMAS_STEP + anim->current_offset) % 2) * 85; |     xa  = CUBED((uint32_t)anim->pos); | ||||||
|         sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i + effect_start_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++) { | ||||||
|  |         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(); |     rgblight_set(); | ||||||
|  | 
 | ||||||
|  |     if (anim->pos == 0) { | ||||||
|  |         increment = 1; | ||||||
|  |     } else if (anim->pos == max_pos) { | ||||||
|  |         increment = -1; | ||||||
|  |     } | ||||||
|  |     anim->pos += increment; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| @ -1183,11 +1324,11 @@ void rgblight_effect_rgbtest(animation_status_t *anim) { | |||||||
| 
 | 
 | ||||||
| #ifdef RGBLIGHT_EFFECT_ALTERNATING | #ifdef RGBLIGHT_EFFECT_ALTERNATING | ||||||
| void rgblight_effect_alternating(animation_status_t *anim) { | void rgblight_effect_alternating(animation_status_t *anim) { | ||||||
|     for (int i = 0; i < effect_num_leds; i++) { |     for (int i = 0; i < rgblight_ranges.effect_num_leds; i++) { | ||||||
|         LED_TYPE *ledp = led + i + effect_start_pos; |         LED_TYPE *ledp = led + i + rgblight_ranges.effect_start_pos; | ||||||
|         if (i < effect_num_leds / 2 && anim->pos) { |         if (i < rgblight_ranges.effect_num_leds / 2 && anim->pos) { | ||||||
|             sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, ledp); |             sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, ledp); | ||||||
|         } else if (i >= effect_num_leds / 2 && !anim->pos) { |         } else if (i >= rgblight_ranges.effect_num_leds / 2 && !anim->pos) { | ||||||
|             sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, ledp); |             sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, ledp); | ||||||
|         } else { |         } else { | ||||||
|             sethsv(rgblight_config.hue, rgblight_config.sat, 0, ledp); |             sethsv(rgblight_config.hue, rgblight_config.sat, 0, ledp); | ||||||
| @ -1197,3 +1338,58 @@ void rgblight_effect_alternating(animation_status_t *anim) { | |||||||
|     anim->pos = (anim->pos + 1) % 2; |     anim->pos = (anim->pos + 1) % 2; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef RGBLIGHT_EFFECT_TWINKLE | ||||||
|  | __attribute__((weak)) const uint8_t RGBLED_TWINKLE_INTERVALS[] PROGMEM = {50, 25, 10}; | ||||||
|  | 
 | ||||||
|  | typedef struct PACKED { | ||||||
|  |     HSV     hsv; | ||||||
|  |     uint8_t life; | ||||||
|  |     bool    up; | ||||||
|  | } TwinkleState; | ||||||
|  | 
 | ||||||
|  | static TwinkleState led_twinkle_state[RGBLED_NUM]; | ||||||
|  | 
 | ||||||
|  | void rgblight_effect_twinkle(animation_status_t *anim) { | ||||||
|  |     bool random_color = anim->delta / 3; | ||||||
|  |     bool restart      = anim->pos == 0; | ||||||
|  |     anim->pos         = 1; | ||||||
|  | 
 | ||||||
|  |     for (uint8_t i = 0; i < rgblight_ranges.effect_num_leds; i++) { | ||||||
|  |         TwinkleState *t = &(led_twinkle_state[i]); | ||||||
|  |         HSV *         c = &(t->hsv); | ||||||
|  |         if (restart) { | ||||||
|  |             // Restart
 | ||||||
|  |             t->life  = 0; | ||||||
|  |             t->hsv.v = 0; | ||||||
|  |         } else if (t->life) { | ||||||
|  |             // This LED is already on, either brightening or dimming
 | ||||||
|  |             t->life--; | ||||||
|  |             uint8_t on = t->up ? RGBLIGHT_EFFECT_TWINKLE_LIFE - t->life : t->life; | ||||||
|  |             c->v       = (uint16_t)rgblight_config.val * on / RGBLIGHT_EFFECT_TWINKLE_LIFE; | ||||||
|  |             if (t->life == 0 && t->up) { | ||||||
|  |                 t->up   = false; | ||||||
|  |                 t->life = RGBLIGHT_EFFECT_TWINKLE_LIFE; | ||||||
|  |             } | ||||||
|  |             if (!random_color) { | ||||||
|  |                 c->h = rgblight_config.hue; | ||||||
|  |                 c->s = rgblight_config.sat; | ||||||
|  |             } | ||||||
|  |         } else if (rand() < RAND_MAX * RGBLIGHT_EFFECT_TWINKLE_PROBABILITY) { | ||||||
|  |             // This LED is off, but was randomly selected to start brightening
 | ||||||
|  |             c->h    = random_color ? rand() % 0xFF : rgblight_config.hue; | ||||||
|  |             c->s    = random_color ? (rand() % (rgblight_config.sat / 2)) + (rgblight_config.sat / 2) : rgblight_config.sat; | ||||||
|  |             c->v    = 0; | ||||||
|  |             t->life = RGBLIGHT_EFFECT_TWINKLE_LIFE; | ||||||
|  |             t->up   = true; | ||||||
|  |         } else { | ||||||
|  |             // This LED is off, and was NOT selected to start brightening
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         LED_TYPE *ledp = led + i + rgblight_ranges.effect_start_pos; | ||||||
|  |         sethsv(c->h, c->s, c->v, ledp); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     rgblight_set(); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | |||||||
| @ -1,358 +0,0 @@ | |||||||
| /* Copyright 2017 Yang Liu
 |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 2 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 |  | ||||||
|  */ |  | ||||||
| #ifndef RGBLIGHT_H |  | ||||||
| #define RGBLIGHT_H |  | ||||||
| 
 |  | ||||||
| /***** rgblight_mode(mode)/rgblight_mode_noeeprom(mode) ****
 |  | ||||||
| 
 |  | ||||||
|  old mode number (before 0.6.117) to new mode name table |  | ||||||
| 
 |  | ||||||
| |-----------------|-----------------------------------| |  | ||||||
| | old mode number | new mode name                     | |  | ||||||
| |-----------------|-----------------------------------| |  | ||||||
| |        1        | RGBLIGHT_MODE_STATIC_LIGHT        | |  | ||||||
| |        2        | RGBLIGHT_MODE_BREATHING           | |  | ||||||
| |        3        | RGBLIGHT_MODE_BREATHING + 1       | |  | ||||||
| |        4        | RGBLIGHT_MODE_BREATHING + 2       | |  | ||||||
| |        5        | RGBLIGHT_MODE_BREATHING + 3       | |  | ||||||
| |        6        | RGBLIGHT_MODE_RAINBOW_MOOD        | |  | ||||||
| |        7        | RGBLIGHT_MODE_RAINBOW_MOOD + 1    | |  | ||||||
| |        8        | RGBLIGHT_MODE_RAINBOW_MOOD + 2    | |  | ||||||
| |        9        | RGBLIGHT_MODE_RAINBOW_SWIRL       | |  | ||||||
| |       10        | RGBLIGHT_MODE_RAINBOW_SWIRL + 1   | |  | ||||||
| |       11        | RGBLIGHT_MODE_RAINBOW_SWIRL + 2   | |  | ||||||
| |       12        | RGBLIGHT_MODE_RAINBOW_SWIRL + 3   | |  | ||||||
| |       13        | RGBLIGHT_MODE_RAINBOW_SWIRL + 4   | |  | ||||||
| |       14        | RGBLIGHT_MODE_RAINBOW_SWIRL + 5   | |  | ||||||
| |       15        | RGBLIGHT_MODE_SNAKE               | |  | ||||||
| |       16        | RGBLIGHT_MODE_SNAKE + 1           | |  | ||||||
| |       17        | RGBLIGHT_MODE_SNAKE + 2           | |  | ||||||
| |       18        | RGBLIGHT_MODE_SNAKE + 3           | |  | ||||||
| |       19        | RGBLIGHT_MODE_SNAKE + 4           | |  | ||||||
| |       20        | RGBLIGHT_MODE_SNAKE + 5           | |  | ||||||
| |       21        | RGBLIGHT_MODE_KNIGHT              | |  | ||||||
| |       22        | RGBLIGHT_MODE_KNIGHT + 1          | |  | ||||||
| |       23        | RGBLIGHT_MODE_KNIGHT + 2          | |  | ||||||
| |       24        | RGBLIGHT_MODE_CHRISTMAS           | |  | ||||||
| |       25        | RGBLIGHT_MODE_STATIC_GRADIENT     | |  | ||||||
| |       26        | RGBLIGHT_MODE_STATIC_GRADIENT + 1 | |  | ||||||
| |       27        | RGBLIGHT_MODE_STATIC_GRADIENT + 2 | |  | ||||||
| |       28        | RGBLIGHT_MODE_STATIC_GRADIENT + 3 | |  | ||||||
| |       29        | RGBLIGHT_MODE_STATIC_GRADIENT + 4 | |  | ||||||
| |       30        | RGBLIGHT_MODE_STATIC_GRADIENT + 5 | |  | ||||||
| |       31        | RGBLIGHT_MODE_STATIC_GRADIENT + 6 | |  | ||||||
| |       32        | RGBLIGHT_MODE_STATIC_GRADIENT + 7 | |  | ||||||
| |       33        | RGBLIGHT_MODE_STATIC_GRADIENT + 8 | |  | ||||||
| |       34        | RGBLIGHT_MODE_STATIC_GRADIENT + 9 | |  | ||||||
| |       35        | RGBLIGHT_MODE_RGB_TEST            | |  | ||||||
| |       36        | RGBLIGHT_MODE_ALTERNATING         | |  | ||||||
| |-----------------|-----------------------------------| |  | ||||||
|  *****/ |  | ||||||
| 
 |  | ||||||
| #ifdef RGBLIGHT_ANIMATIONS |  | ||||||
| // for backward compatibility
 |  | ||||||
| #    define RGBLIGHT_EFFECT_BREATHING |  | ||||||
| #    define RGBLIGHT_EFFECT_RAINBOW_MOOD |  | ||||||
| #    define RGBLIGHT_EFFECT_RAINBOW_SWIRL |  | ||||||
| #    define RGBLIGHT_EFFECT_SNAKE |  | ||||||
| #    define RGBLIGHT_EFFECT_KNIGHT |  | ||||||
| #    define RGBLIGHT_EFFECT_CHRISTMAS |  | ||||||
| #    define RGBLIGHT_EFFECT_STATIC_GRADIENT |  | ||||||
| #    define RGBLIGHT_EFFECT_RGB_TEST |  | ||||||
| #    define RGBLIGHT_EFFECT_ALTERNATING |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| #ifdef RGBLIGHT_STATIC_PATTERNS |  | ||||||
| #    define RGBLIGHT_EFFECT_STATIC_GRADIENT |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| // clang-format off
 |  | ||||||
| 
 |  | ||||||
| // check dynamic animation effects chose ?
 |  | ||||||
| #if  defined(RGBLIGHT_EFFECT_BREATHING)     \ |  | ||||||
|   || defined(RGBLIGHT_EFFECT_RAINBOW_MOOD)  \ |  | ||||||
|   || defined(RGBLIGHT_EFFECT_RAINBOW_SWIRL) \ |  | ||||||
|   || defined(RGBLIGHT_EFFECT_SNAKE)         \ |  | ||||||
|   || defined(RGBLIGHT_EFFECT_KNIGHT)        \ |  | ||||||
|   || defined(RGBLIGHT_EFFECT_CHRISTMAS)     \ |  | ||||||
|   || defined(RGBLIGHT_EFFECT_RGB_TEST)      \ |  | ||||||
|   || defined(RGBLIGHT_EFFECT_ALTERNATING) |  | ||||||
| #    define RGBLIGHT_USE_TIMER |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| // clang-format on
 |  | ||||||
| 
 |  | ||||||
| #define _RGBM_SINGLE_STATIC(sym) RGBLIGHT_MODE_##sym, |  | ||||||
| #define _RGBM_SINGLE_DYNAMIC(sym) RGBLIGHT_MODE_##sym, |  | ||||||
| #define _RGBM_MULTI_STATIC(sym) RGBLIGHT_MODE_##sym, |  | ||||||
| #define _RGBM_MULTI_DYNAMIC(sym) RGBLIGHT_MODE_##sym, |  | ||||||
| #define _RGBM_TMP_STATIC(sym, msym) RGBLIGHT_MODE_##sym, |  | ||||||
| #define _RGBM_TMP_DYNAMIC(sym, msym) RGBLIGHT_MODE_##sym, |  | ||||||
| enum RGBLIGHT_EFFECT_MODE { |  | ||||||
|     RGBLIGHT_MODE_zero = 0, |  | ||||||
| #include "rgblight_modes.h" |  | ||||||
|     RGBLIGHT_MODE_last |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| #ifndef RGBLIGHT_H_DUMMY_DEFINE |  | ||||||
| 
 |  | ||||||
| #    define RGBLIGHT_MODES (RGBLIGHT_MODE_last - 1) |  | ||||||
| 
 |  | ||||||
| // sample: #define RGBLIGHT_EFFECT_BREATHE_CENTER   1.85
 |  | ||||||
| 
 |  | ||||||
| #    ifndef RGBLIGHT_EFFECT_BREATHE_MAX |  | ||||||
| #        define RGBLIGHT_EFFECT_BREATHE_MAX 255  // 0-255
 |  | ||||||
| #    endif |  | ||||||
| 
 |  | ||||||
| #    ifndef RGBLIGHT_EFFECT_SNAKE_LENGTH |  | ||||||
| #        define RGBLIGHT_EFFECT_SNAKE_LENGTH 4 |  | ||||||
| #    endif |  | ||||||
| 
 |  | ||||||
| #    ifndef RGBLIGHT_EFFECT_KNIGHT_LENGTH |  | ||||||
| #        define RGBLIGHT_EFFECT_KNIGHT_LENGTH 3 |  | ||||||
| #    endif |  | ||||||
| 
 |  | ||||||
| #    ifndef RGBLIGHT_EFFECT_KNIGHT_OFFSET |  | ||||||
| #        define RGBLIGHT_EFFECT_KNIGHT_OFFSET 0 |  | ||||||
| #    endif |  | ||||||
| 
 |  | ||||||
| #    ifndef RGBLIGHT_EFFECT_KNIGHT_LED_NUM |  | ||||||
| #        define RGBLIGHT_EFFECT_KNIGHT_LED_NUM (effect_num_leds) |  | ||||||
| #    endif |  | ||||||
| 
 |  | ||||||
| #    ifndef RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL |  | ||||||
| #        define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 1000 |  | ||||||
| #    endif |  | ||||||
| 
 |  | ||||||
| #    ifndef RGBLIGHT_EFFECT_CHRISTMAS_STEP |  | ||||||
| #        define RGBLIGHT_EFFECT_CHRISTMAS_STEP 2 |  | ||||||
| #    endif |  | ||||||
| 
 |  | ||||||
| #    ifndef RGBLIGHT_HUE_STEP |  | ||||||
| #        define RGBLIGHT_HUE_STEP 8 |  | ||||||
| #    endif |  | ||||||
| #    ifndef RGBLIGHT_SAT_STEP |  | ||||||
| #        define RGBLIGHT_SAT_STEP 17 |  | ||||||
| #    endif |  | ||||||
| #    ifndef RGBLIGHT_VAL_STEP |  | ||||||
| #        define RGBLIGHT_VAL_STEP 17 |  | ||||||
| #    endif |  | ||||||
| #    ifndef RGBLIGHT_LIMIT_VAL |  | ||||||
| #        define RGBLIGHT_LIMIT_VAL 255 |  | ||||||
| #    endif |  | ||||||
| 
 |  | ||||||
| #    define RGBLED_TIMER_TOP F_CPU / (256 * 64) |  | ||||||
| // #define RGBLED_TIMER_TOP 0xFF10
 |  | ||||||
| 
 |  | ||||||
| #    include <stdint.h> |  | ||||||
| #    include <stdbool.h> |  | ||||||
| #    include "eeconfig.h" |  | ||||||
| #    ifndef RGBLIGHT_CUSTOM_DRIVER |  | ||||||
| #        include "ws2812.h" |  | ||||||
| #    endif |  | ||||||
| #    include "color.h" |  | ||||||
| #    include "rgblight_list.h" |  | ||||||
| 
 |  | ||||||
| #    if defined(__AVR__) |  | ||||||
| #        include <avr/pgmspace.h> |  | ||||||
| #    endif |  | ||||||
| 
 |  | ||||||
| extern LED_TYPE led[RGBLED_NUM]; |  | ||||||
| 
 |  | ||||||
| extern const uint8_t  RGBLED_BREATHING_INTERVALS[4] PROGMEM; |  | ||||||
| extern const uint8_t  RGBLED_RAINBOW_MOOD_INTERVALS[3] PROGMEM; |  | ||||||
| extern const uint8_t  RGBLED_RAINBOW_SWIRL_INTERVALS[3] PROGMEM; |  | ||||||
| extern const uint8_t  RGBLED_SNAKE_INTERVALS[3] PROGMEM; |  | ||||||
| extern const uint8_t  RGBLED_KNIGHT_INTERVALS[3] PROGMEM; |  | ||||||
| extern const uint16_t RGBLED_RGBTEST_INTERVALS[1] PROGMEM; |  | ||||||
| extern bool           is_rgblight_initialized; |  | ||||||
| 
 |  | ||||||
| // Should stay in sycn with rgb matrix config as we reuse eeprom storage for both (for now)
 |  | ||||||
| typedef union { |  | ||||||
|     uint32_t raw; |  | ||||||
|     struct { |  | ||||||
|         bool    enable : 1; |  | ||||||
|         uint8_t mode : 7; |  | ||||||
|         uint8_t hue : 8; |  | ||||||
|         uint8_t sat : 8; |  | ||||||
|         uint8_t val : 8; |  | ||||||
|         uint8_t speed : 8;  // EECONFIG needs to be increased to support this
 |  | ||||||
|     }; |  | ||||||
| } rgblight_config_t; |  | ||||||
| 
 |  | ||||||
| typedef struct _rgblight_status_t { |  | ||||||
|     uint8_t base_mode; |  | ||||||
|     bool    timer_enabled; |  | ||||||
| #    ifdef RGBLIGHT_SPLIT |  | ||||||
|     uint8_t change_flags; |  | ||||||
| #    endif |  | ||||||
| } rgblight_status_t; |  | ||||||
| 
 |  | ||||||
| /* === Utility Functions ===*/ |  | ||||||
| void sethsv(uint8_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1); |  | ||||||
| void sethsv_raw(uint8_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1);  // without RGBLIGHT_LIMIT_VAL check
 |  | ||||||
| void setrgb(uint8_t r, uint8_t g, uint8_t b, LED_TYPE *led1); |  | ||||||
| 
 |  | ||||||
| /* === Low level Functions === */ |  | ||||||
| void rgblight_set(void); |  | ||||||
| void rgblight_set_clipping_range(uint8_t start_pos, uint8_t num_leds); |  | ||||||
| 
 |  | ||||||
| /* === Effects and Animations Functions === */ |  | ||||||
| /*   effect range setting */ |  | ||||||
| void rgblight_set_effect_range(uint8_t start_pos, uint8_t num_leds); |  | ||||||
| 
 |  | ||||||
| /*   direct operation */ |  | ||||||
| void rgblight_setrgb_at(uint8_t r, uint8_t g, uint8_t b, uint8_t index); |  | ||||||
| void rgblight_sethsv_at(uint8_t hue, uint8_t sat, uint8_t val, uint8_t index); |  | ||||||
| void rgblight_setrgb_range(uint8_t r, uint8_t g, uint8_t b, uint8_t start, uint8_t end); |  | ||||||
| void rgblight_sethsv_range(uint8_t hue, uint8_t sat, uint8_t val, uint8_t start, uint8_t end); |  | ||||||
| void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b); |  | ||||||
| 
 |  | ||||||
| #    ifndef RGBLIGHT_SPLIT |  | ||||||
| void rgblight_setrgb_master(uint8_t r, uint8_t g, uint8_t b); |  | ||||||
| void rgblight_setrgb_slave(uint8_t r, uint8_t g, uint8_t b); |  | ||||||
| void rgblight_sethsv_master(uint8_t hue, uint8_t sat, uint8_t val); |  | ||||||
| void rgblight_sethsv_slave(uint8_t hue, uint8_t sat, uint8_t val); |  | ||||||
| #    endif |  | ||||||
| 
 |  | ||||||
| /*   effect mode change */ |  | ||||||
| void rgblight_mode(uint8_t mode); |  | ||||||
| void rgblight_mode_noeeprom(uint8_t mode); |  | ||||||
| void rgblight_increase(void); |  | ||||||
| void rgblight_decrease(void); |  | ||||||
| void rgblight_step(void); |  | ||||||
| void rgblight_step_noeeprom(void); |  | ||||||
| void rgblight_step_reverse(void); |  | ||||||
| void rgblight_step_reverse_noeeprom(void); |  | ||||||
| 
 |  | ||||||
| /*   effects mode disable/enable */ |  | ||||||
| void rgblight_toggle(void); |  | ||||||
| void rgblight_toggle_noeeprom(void); |  | ||||||
| void rgblight_enable(void); |  | ||||||
| void rgblight_enable_noeeprom(void); |  | ||||||
| void rgblight_disable(void); |  | ||||||
| void rgblight_disable_noeeprom(void); |  | ||||||
| 
 |  | ||||||
| /*   hue, sat, val change */ |  | ||||||
| void rgblight_increase_hue(void); |  | ||||||
| void rgblight_increase_hue_noeeprom(void); |  | ||||||
| void rgblight_decrease_hue(void); |  | ||||||
| void rgblight_decrease_hue_noeeprom(void); |  | ||||||
| void rgblight_increase_sat(void); |  | ||||||
| void rgblight_increase_sat_noeeprom(void); |  | ||||||
| void rgblight_decrease_sat(void); |  | ||||||
| void rgblight_decrease_sat_noeeprom(void); |  | ||||||
| void rgblight_increase_val(void); |  | ||||||
| void rgblight_increase_val_noeeprom(void); |  | ||||||
| void rgblight_decrease_val(void); |  | ||||||
| void rgblight_decrease_val_noeeprom(void); |  | ||||||
| void rgblight_increase_speed(void); |  | ||||||
| void rgblight_decrease_speed(void); |  | ||||||
| void rgblight_sethsv(uint8_t hue, uint8_t sat, uint8_t val); |  | ||||||
| void rgblight_sethsv_noeeprom(uint8_t hue, uint8_t sat, uint8_t val); |  | ||||||
| 
 |  | ||||||
| /*   effect speed */ |  | ||||||
| uint8_t rgblight_get_speed(void); |  | ||||||
| void rgblight_set_speed(uint8_t speed); |  | ||||||
| void rgblight_set_speed_noeeprom(uint8_t speed); |  | ||||||
| 
 |  | ||||||
| /*       query */ |  | ||||||
| uint8_t rgblight_get_mode(void); |  | ||||||
| uint8_t rgblight_get_hue(void); |  | ||||||
| uint8_t rgblight_get_sat(void); |  | ||||||
| uint8_t rgblight_get_val(void); |  | ||||||
| 
 |  | ||||||
| /* === qmk_firmware (core)internal Functions === */ |  | ||||||
| void     rgblight_init(void); |  | ||||||
| uint32_t rgblight_read_dword(void); |  | ||||||
| void     rgblight_update_dword(uint32_t dword); |  | ||||||
| uint32_t eeconfig_read_rgblight(void); |  | ||||||
| void     eeconfig_update_rgblight(uint32_t val); |  | ||||||
| void     eeconfig_update_rgblight_current(void); |  | ||||||
| void     eeconfig_update_rgblight_default(void); |  | ||||||
| void     eeconfig_debug_rgblight(void); |  | ||||||
| 
 |  | ||||||
| void rgb_matrix_increase(void); |  | ||||||
| void rgb_matrix_decrease(void); |  | ||||||
| 
 |  | ||||||
| void rgblight_sethsv_eeprom_helper(uint8_t hue, uint8_t sat, uint8_t val, bool write_to_eeprom); |  | ||||||
| void rgblight_mode_eeprom_helper(uint8_t mode, bool write_to_eeprom); |  | ||||||
| 
 |  | ||||||
| #    define EZ_RGB(val) rgblight_show_solid_color((val >> 16) & 0xFF, (val >> 8) & 0xFF, val & 0xFF) |  | ||||||
| void rgblight_show_solid_color(uint8_t r, uint8_t g, uint8_t b); |  | ||||||
| 
 |  | ||||||
| #    ifdef RGBLIGHT_USE_TIMER |  | ||||||
| void rgblight_task(void); |  | ||||||
| void rgblight_timer_init(void); |  | ||||||
| void rgblight_timer_enable(void); |  | ||||||
| void rgblight_timer_disable(void); |  | ||||||
| void rgblight_timer_toggle(void); |  | ||||||
| #    else |  | ||||||
| #        define rgblight_task() |  | ||||||
| #        define rgblight_timer_init() |  | ||||||
| #        define rgblight_timer_enable() |  | ||||||
| #        define rgblight_timer_disable() |  | ||||||
| #        define rgblight_timer_toggle() |  | ||||||
| #    endif |  | ||||||
| 
 |  | ||||||
| #    ifdef RGBLIGHT_SPLIT |  | ||||||
| #        define RGBLIGHT_STATUS_CHANGE_MODE (1 << 0) |  | ||||||
| #        define RGBLIGHT_STATUS_CHANGE_HSVS (1 << 1) |  | ||||||
| #        define RGBLIGHT_STATUS_CHANGE_TIMER (1 << 2) |  | ||||||
| #        define RGBLIGHT_STATUS_ANIMATION_TICK (1 << 3) |  | ||||||
| 
 |  | ||||||
| typedef struct _rgblight_syncinfo_t { |  | ||||||
|     rgblight_config_t config; |  | ||||||
|     rgblight_status_t status; |  | ||||||
| } rgblight_syncinfo_t; |  | ||||||
| 
 |  | ||||||
| /* for split keyboard master side */ |  | ||||||
| uint8_t rgblight_get_change_flags(void); |  | ||||||
| void    rgblight_clear_change_flags(void); |  | ||||||
| void    rgblight_get_syncinfo(rgblight_syncinfo_t *syncinfo); |  | ||||||
| /* for split keyboard slave side */ |  | ||||||
| void rgblight_update_sync(rgblight_syncinfo_t *syncinfo, bool write_to_eeprom); |  | ||||||
| #    endif |  | ||||||
| 
 |  | ||||||
| #    ifdef RGBLIGHT_USE_TIMER |  | ||||||
| 
 |  | ||||||
| typedef struct _animation_status_t { |  | ||||||
|     uint16_t last_timer; |  | ||||||
|     uint8_t  delta; /* mode - base_mode */ |  | ||||||
|     bool     restart; |  | ||||||
|     union { |  | ||||||
|         uint16_t pos16; |  | ||||||
|         uint8_t  pos; |  | ||||||
|         int8_t   current_hue; |  | ||||||
|         uint16_t current_offset; |  | ||||||
|     }; |  | ||||||
| } animation_status_t; |  | ||||||
| 
 |  | ||||||
| extern animation_status_t animation_status; |  | ||||||
| 
 |  | ||||||
| void rgblight_effect_breathing(animation_status_t *anim); |  | ||||||
| void rgblight_effect_rainbow_mood(animation_status_t *anim); |  | ||||||
| void rgblight_effect_rainbow_swirl(animation_status_t *anim); |  | ||||||
| void rgblight_effect_snake(animation_status_t *anim); |  | ||||||
| void rgblight_effect_knight(animation_status_t *anim); |  | ||||||
| void rgblight_effect_christmas(animation_status_t *anim); |  | ||||||
| void rgblight_effect_rgbtest(animation_status_t *anim); |  | ||||||
| void rgblight_effect_alternating(animation_status_t *anim); |  | ||||||
| 
 |  | ||||||
| #    endif |  | ||||||
| 
 |  | ||||||
| #endif  // #ifndef RGBLIGHT_H_DUMMY_DEFINE
 |  | ||||||
| #endif  // RGBLIGHT_H
 |  | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 QMK Bot
						QMK Bot