X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=quantum%2Frgblight.c;h=78072a61dedc593dbf3cdbe8c1b30653ec07f342;hb=ad49db8cd2557b6c54531059d4d162623520bd17;hp=1b50764503583df70bd6576c65b2c66515ab96e4;hpb=4edfa97e031c3c1884d54d6f0310c99a9d6abd82;p=qmk_firmware.git diff --git a/quantum/rgblight.c b/quantum/rgblight.c index 1b5076450..78072a61d 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -13,6 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +#include #include #include #include @@ -22,7 +23,6 @@ #include "debug.h" #include "led_tables.h" - __attribute__ ((weak)) const uint8_t RGBLED_BREATHING_INTERVALS[] PROGMEM = {30, 20, 10, 5}; __attribute__ ((weak)) @@ -32,7 +32,7 @@ const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[] PROGMEM = {100, 50, 20}; __attribute__ ((weak)) const uint8_t RGBLED_SNAKE_INTERVALS[] PROGMEM = {100, 50, 20}; __attribute__ ((weak)) -const uint8_t RGBLED_KNIGHT_INTERVALS[] PROGMEM = {100, 50, 20}; +const uint8_t RGBLED_KNIGHT_INTERVALS[] PROGMEM = {127, 63, 31}; __attribute__ ((weak)) const uint16_t RGBLED_GRADIENT_RANGES[] PROGMEM = {360, 240, 180, 120, 90}; @@ -197,6 +197,14 @@ void rgblight_step_reverse(void) { rgblight_mode(mode); } +uint32_t rgblight_get_mode(void) { + if (!rgblight_config.enable) { + return false; + } + + return rgblight_config.mode; +} + void rgblight_mode(uint8_t mode) { if (!rgblight_config.enable) { return; @@ -220,6 +228,8 @@ void rgblight_mode(uint8_t mode) { // MODE 9-14, rainbow swirl // MODE 15-20, snake // MODE 21-23, knight + // MODE 24, xmas + // MODE 25-34, static rainbow #ifdef RGBLIGHT_ANIMATIONS rgblight_timer_enable(); @@ -364,7 +374,7 @@ void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b) { rgblight_set(); } -__attribute__ ((weak)) +#ifndef RGBLIGHT_CUSTOM_DRIVER void rgblight_set(void) { if (rgblight_config.enable) { #ifdef RGBW @@ -385,6 +395,7 @@ void rgblight_set(void) { #endif } } +#endif #ifdef RGBLIGHT_ANIMATIONS @@ -455,13 +466,17 @@ void rgblight_task(void) { void rgblight_effect_breathing(uint8_t interval) { static uint8_t pos = 0; static uint16_t last_timer = 0; + float val; if (timer_elapsed(last_timer) < pgm_read_byte(&RGBLED_BREATHING_INTERVALS[interval])) { return; } last_timer = timer_read(); - rgblight_sethsv_noeeprom(rgblight_config.hue, rgblight_config.sat, pgm_read_byte(&LED_BREATHING_TABLE[pos])); + + // http://sean.voisen.org/blog/2011/10/breathing-led-with-arduino/ + val = (exp(sin((pos/255.0)*M_PI)) - RGBLIGHT_EFFECT_BREATHE_CENTER/M_E)*(RGBLIGHT_EFFECT_BREATHE_MAX/(M_E-1/M_E)); + rgblight_sethsv_noeeprom(rgblight_config.hue, rgblight_config.sat, val); pos = (pos + 1) % 256; } void rgblight_effect_rainbow_mood(uint8_t interval) { @@ -480,7 +495,7 @@ void rgblight_effect_rainbow_swirl(uint8_t interval) { static uint16_t last_timer = 0; uint16_t hue; uint8_t i; - if (timer_elapsed(last_timer) < pgm_read_byte(&RGBLED_RAINBOW_MOOD_INTERVALS[interval / 2])) { + if (timer_elapsed(last_timer) < pgm_read_byte(&RGBLED_RAINBOW_SWIRL_INTERVALS[interval / 2])) { return; } last_timer = timer_read(); @@ -550,7 +565,14 @@ void rgblight_effect_knight(uint8_t interval) { static int8_t increment = 1; uint8_t i, cur; + // Set all the LEDs to 0 for (i = 0; i < RGBLED_NUM; i++) { + led[i].r = 0; + led[i].g = 0; + led[i].b = 0; + } + // Determine which LEDs should be lit up + for (i = 0; i < RGBLIGHT_EFFECT_KNIGHT_LED_NUM; i++) { cur = (i + RGBLIGHT_EFFECT_KNIGHT_OFFSET) % RGBLED_NUM; if (i >= low_bound && i <= high_bound) { @@ -563,10 +585,12 @@ void rgblight_effect_knight(uint8_t interval) { } rgblight_set(); + // Move from low_bound to high_bound changing the direction we increment each + // time a boundary is hit. low_bound += increment; high_bound += increment; - if (high_bound <= 0 || low_bound >= RGBLED_NUM - 1) { + if (high_bound <= 0 || low_bound >= RGBLIGHT_EFFECT_KNIGHT_LED_NUM - 1) { increment = -increment; } }