|
|
@ -69,15 +69,12 @@ const uint8_t RGBLED_KNIGHT_INTERVALS[] PROGMEM = {100, 50, 20}; |
|
|
|
|
|
|
|
rgblight_config_t rgblight_config; |
|
|
|
rgblight_config_t inmem_config; |
|
|
|
#ifdef RGBW |
|
|
|
struct cRGBW led[RGBLED_NUM]; |
|
|
|
#else |
|
|
|
struct cRGB led[RGBLED_NUM]; |
|
|
|
#endif |
|
|
|
uint8_t rgblight_inited = 0; |
|
|
|
|
|
|
|
LED_TYPE led[RGBLED_NUM]; |
|
|
|
uint8_t rgblight_inited = 0; |
|
|
|
bool rgblight_timer_enabled = false; |
|
|
|
|
|
|
|
void sethsv(uint16_t hue, uint8_t sat, uint8_t val, struct cRGB *led1) { |
|
|
|
void sethsv(uint16_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1) { |
|
|
|
uint8_t r = 0, g = 0, b = 0, base, color; |
|
|
|
|
|
|
|
if (sat == 0) { // Acromatic color (gray). Hue doesn't mind. |
|
|
@ -128,7 +125,7 @@ void sethsv(uint16_t hue, uint8_t sat, uint8_t val, struct cRGB *led1) { |
|
|
|
setrgb(r, g, b, led1); |
|
|
|
} |
|
|
|
|
|
|
|
void setrgb(uint8_t r, uint8_t g, uint8_t b, struct cRGB *led1) { |
|
|
|
void setrgb(uint8_t r, uint8_t g, uint8_t b, LED_TYPE *led1) { |
|
|
|
(*led1).r = r; |
|
|
|
(*led1).g = g; |
|
|
|
(*led1).b = b; |
|
|
@ -145,9 +142,9 @@ void eeconfig_update_rgblight_default(void) { |
|
|
|
dprintf("eeconfig_update_rgblight_default\n"); |
|
|
|
rgblight_config.enable = 1; |
|
|
|
rgblight_config.mode = 1; |
|
|
|
rgblight_config.hue = 200; |
|
|
|
rgblight_config.sat = 204; |
|
|
|
rgblight_config.val = 204; |
|
|
|
rgblight_config.hue = 0; |
|
|
|
rgblight_config.sat = 255; |
|
|
|
rgblight_config.val = 255; |
|
|
|
eeconfig_update_rgblight(rgblight_config.raw); |
|
|
|
} |
|
|
|
void eeconfig_debug_rgblight(void) { |
|
|
@ -311,7 +308,7 @@ void rgblight_decrease_val(void) { |
|
|
|
void rgblight_sethsv_noeeprom(uint16_t hue, uint8_t sat, uint8_t val) { |
|
|
|
inmem_config.raw = rgblight_config.raw; |
|
|
|
if (rgblight_config.enable) { |
|
|
|
struct cRGB tmp_led; |
|
|
|
LED_TYPE tmp_led; |
|
|
|
sethsv(hue, sat, val, &tmp_led); |
|
|
|
inmem_config.hue = hue; |
|
|
|
inmem_config.sat = sat; |
|
|
@ -378,51 +375,55 @@ void rgblight_set(void) { |
|
|
|
|
|
|
|
// Animation timer -- AVR Timer3 |
|
|
|
void rgblight_timer_init(void) { |
|
|
|
static uint8_t rgblight_timer_is_init = 0; |
|
|
|
if (rgblight_timer_is_init) { |
|
|
|
return; |
|
|
|
} |
|
|
|
rgblight_timer_is_init = 1; |
|
|
|
/* Timer 3 setup */ |
|
|
|
TCCR3B = _BV(WGM32) //CTC mode OCR3A as TOP |
|
|
|
| _BV(CS30); //Clock selelct: clk/1 |
|
|
|
/* Set TOP value */ |
|
|
|
uint8_t sreg = SREG; |
|
|
|
cli(); |
|
|
|
OCR3AH = (RGBLED_TIMER_TOP >> 8) & 0xff; |
|
|
|
OCR3AL = RGBLED_TIMER_TOP & 0xff; |
|
|
|
SREG = sreg; |
|
|
|
// static uint8_t rgblight_timer_is_init = 0; |
|
|
|
// if (rgblight_timer_is_init) { |
|
|
|
// return; |
|
|
|
// } |
|
|
|
// rgblight_timer_is_init = 1; |
|
|
|
// /* Timer 3 setup */ |
|
|
|
// TCCR3B = _BV(WGM32) // CTC mode OCR3A as TOP |
|
|
|
// | _BV(CS30); // Clock selelct: clk/1 |
|
|
|
// /* Set TOP value */ |
|
|
|
// uint8_t sreg = SREG; |
|
|
|
// cli(); |
|
|
|
// OCR3AH = (RGBLED_TIMER_TOP >> 8) & 0xff; |
|
|
|
// OCR3AL = RGBLED_TIMER_TOP & 0xff; |
|
|
|
// SREG = sreg; |
|
|
|
|
|
|
|
rgblight_timer_enabled = true; |
|
|
|
} |
|
|
|
void rgblight_timer_enable(void) { |
|
|
|
TIMSK3 |= _BV(OCIE3A); |
|
|
|
rgblight_timer_enabled = true; |
|
|
|
dprintf("TIMER3 enabled.\n"); |
|
|
|
} |
|
|
|
void rgblight_timer_disable(void) { |
|
|
|
TIMSK3 &= ~_BV(OCIE3A); |
|
|
|
rgblight_timer_enabled = false; |
|
|
|
dprintf("TIMER3 disabled.\n"); |
|
|
|
} |
|
|
|
void rgblight_timer_toggle(void) { |
|
|
|
TIMSK3 ^= _BV(OCIE3A); |
|
|
|
rgblight_timer_enabled ^= rgblight_timer_enabled; |
|
|
|
dprintf("TIMER3 toggled.\n"); |
|
|
|
} |
|
|
|
|
|
|
|
ISR(TIMER3_COMPA_vect) { |
|
|
|
// mode = 1, static light, do nothing here |
|
|
|
if (rgblight_config.mode >= 2 && rgblight_config.mode <= 5) { |
|
|
|
// mode = 2 to 5, breathing mode |
|
|
|
rgblight_effect_breathing(rgblight_config.mode - 2); |
|
|
|
} else if (rgblight_config.mode >= 6 && rgblight_config.mode <= 8) { |
|
|
|
// mode = 6 to 8, rainbow mood mod |
|
|
|
rgblight_effect_rainbow_mood(rgblight_config.mode - 6); |
|
|
|
} else if (rgblight_config.mode >= 9 && rgblight_config.mode <= 14) { |
|
|
|
// mode = 9 to 14, rainbow swirl mode |
|
|
|
rgblight_effect_rainbow_swirl(rgblight_config.mode - 9); |
|
|
|
} else if (rgblight_config.mode >= 15 && rgblight_config.mode <= 20) { |
|
|
|
// mode = 15 to 20, snake mode |
|
|
|
rgblight_effect_snake(rgblight_config.mode - 15); |
|
|
|
} else if (rgblight_config.mode >= 21 && rgblight_config.mode <= 23) { |
|
|
|
// mode = 21 to 23, knight mode |
|
|
|
rgblight_effect_knight(rgblight_config.mode - 21); |
|
|
|
void rgblight_task(void) { |
|
|
|
if (rgblight_timer_enabled) { |
|
|
|
// mode = 1, static light, do nothing here |
|
|
|
if (rgblight_config.mode >= 2 && rgblight_config.mode <= 5) { |
|
|
|
// mode = 2 to 5, breathing mode |
|
|
|
rgblight_effect_breathing(rgblight_config.mode - 2); |
|
|
|
} else if (rgblight_config.mode >= 6 && rgblight_config.mode <= 8) { |
|
|
|
// mode = 6 to 8, rainbow mood mod |
|
|
|
rgblight_effect_rainbow_mood(rgblight_config.mode - 6); |
|
|
|
} else if (rgblight_config.mode >= 9 && rgblight_config.mode <= 14) { |
|
|
|
// mode = 9 to 14, rainbow swirl mode |
|
|
|
rgblight_effect_rainbow_swirl(rgblight_config.mode - 9); |
|
|
|
} else if (rgblight_config.mode >= 15 && rgblight_config.mode <= 20) { |
|
|
|
// mode = 15 to 20, snake mode |
|
|
|
rgblight_effect_snake(rgblight_config.mode - 15); |
|
|
|
} else if (rgblight_config.mode >= 21 && rgblight_config.mode <= 23) { |
|
|
|
// mode = 21 to 23, knight mode |
|
|
|
rgblight_effect_knight(rgblight_config.mode - 21); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -461,7 +462,7 @@ void rgblight_effect_rainbow_swirl(uint8_t interval) { |
|
|
|
last_timer = timer_read(); |
|
|
|
for (i = 0; i < RGBLED_NUM; i++) { |
|
|
|
hue = (360 / RGBLED_NUM * i + current_hue) % 360; |
|
|
|
sethsv(hue, rgblight_config.sat, rgblight_config.val, &led[i]); |
|
|
|
sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i]); |
|
|
|
} |
|
|
|
rgblight_set(); |
|
|
|
|
|
|
@ -498,7 +499,7 @@ void rgblight_effect_snake(uint8_t interval) { |
|
|
|
k = k + RGBLED_NUM; |
|
|
|
} |
|
|
|
if (i == k) { |
|
|
|
sethsv(rgblight_config.hue, rgblight_config.sat, (uint8_t)(rgblight_config.val*(RGBLIGHT_EFFECT_SNAKE_LENGTH-j)/RGBLIGHT_EFFECT_SNAKE_LENGTH), &led[i]); |
|
|
|
sethsv(rgblight_config.hue, rgblight_config.sat, (uint8_t)(rgblight_config.val*(RGBLIGHT_EFFECT_SNAKE_LENGTH-j)/RGBLIGHT_EFFECT_SNAKE_LENGTH), (LED_TYPE *)&led[i]); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -518,7 +519,7 @@ void rgblight_effect_knight(uint8_t interval) { |
|
|
|
static uint16_t last_timer = 0; |
|
|
|
uint8_t i, j, cur; |
|
|
|
int8_t k; |
|
|
|
struct cRGB preled[RGBLED_NUM]; |
|
|
|
LED_TYPE preled[RGBLED_NUM]; |
|
|
|
static int8_t increment = -1; |
|
|
|
if (timer_elapsed(last_timer) < pgm_read_byte(&RGBLED_KNIGHT_INTERVALS[interval])) { |
|
|
|
return; |
|
|
@ -537,7 +538,7 @@ void rgblight_effect_knight(uint8_t interval) { |
|
|
|
k = RGBLED_NUM - 1; |
|
|
|
} |
|
|
|
if (i == k) { |
|
|
|
sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, &preled[i]); |
|
|
|
sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&preled[i]); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|