From ad49db8cd2557b6c54531059d4d162623520bd17 Mon Sep 17 00:00:00 2001 From: skullydazed Date: Tue, 17 Oct 2017 16:47:49 -0700 Subject: [PATCH] Address #1689 by using a formula to define the breathing curve (#1692) * Address #1689 by using a formula to define the breathing curve and exposing defines to control the shape of the curve. * Tweak the behavior of breathing for clueboard --- docs/feature_rgblight.md | 6 ++++-- keyboards/clueboard_66/rev2/config.h | 2 ++ keyboards/clueboard_66/rev3/config.h | 2 ++ quantum/rgblight.c | 7 ++++++- quantum/rgblight.h | 8 ++++++++ 5 files changed, 22 insertions(+), 3 deletions(-) diff --git a/docs/feature_rgblight.md b/docs/feature_rgblight.md index 4ee32f3ec2..c65a499fbe 100644 --- a/docs/feature_rgblight.md +++ b/docs/feature_rgblight.md @@ -49,8 +49,10 @@ If you have `#define RGBLIGHT_ANIMATIONS` in your `config.h` you will have a num | Option | Default Value | Description | |--------|---------------|-------------| | `RGBLIGHT_ANIMATIONS` | | `#define` this to enable animation modes. | -| `RGBLIGHT_EFFECT_SNAKE_LENGTH` | 4 | The number of LEDs to light up for the "snake" mode. | -| `RGBLIGHT_EFFECT_KNIGHT_LENGTH` | 3 | The number of LEDs to light up for the "knight" mode. | +| `RGBLIGHT_EFFECT_BREATHE_CENTER | 1.85 | Used to calculate the curve for the breathing animation. Valid values 1.0-2.7. | +| `RGBLIGHT_EFFECT_BREATHE_MAX | 255 | The maximum brightness for the breathing mode. Valid values 1-255. | +| `RGBLIGHT_EFFECT_SNAKE_LENGTH` | 4 | The number of LEDs to light up for the "snake" animation. | +| `RGBLIGHT_EFFECT_KNIGHT_LENGTH` | 3 | The number of LEDs to light up for the "knight" animation. | | `RGBLIGHT_EFFECT_KNIGHT_OFFSET` | 0 | Start the knight animation this many LEDs from the start of the strip. | | `RGBLIGHT_EFFECT_KNIGHT_LED_NUM` | RGBLED_NUM | The number of LEDs to have the "knight" animation travel. | | `RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL` | 1000 | How long to wait between light changes for the "christmas" animation. Specified in ms. | diff --git a/keyboards/clueboard_66/rev2/config.h b/keyboards/clueboard_66/rev2/config.h index 3c22c5b4a6..3c96f79870 100644 --- a/keyboards/clueboard_66/rev2/config.h +++ b/keyboards/clueboard_66/rev2/config.h @@ -36,6 +36,8 @@ #define RGBLIGHT_VAL_STEP 17 #define RGBLIGHT_ANIMATIONS +#define RGBLIGHT_EFFECT_BREATHE_CENTER 1 +#define RGBLIGHT_EFFECT_BREATHE_MAX 200 #define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 666*2 #define RGBLIGHT_EFFECT_CHRISTMAS_STEP 1 #define RGBLIGHT_EFFECT_KNIGHT_LENGTH 3 // How many LEDs wide to light up diff --git a/keyboards/clueboard_66/rev3/config.h b/keyboards/clueboard_66/rev3/config.h index 5e645c78f0..513dc11696 100644 --- a/keyboards/clueboard_66/rev3/config.h +++ b/keyboards/clueboard_66/rev3/config.h @@ -36,6 +36,8 @@ #define RGBLIGHT_VAL_STEP 17 #define RGBLIGHT_ANIMATIONS +#define RGBLIGHT_EFFECT_BREATHE_CENTER 1 +#define RGBLIGHT_EFFECT_BREATHE_MAX 200 #define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 666*2 #define RGBLIGHT_EFFECT_CHRISTMAS_STEP 1 #define RGBLIGHT_EFFECT_KNIGHT_LENGTH 3 // How many LEDs wide to light up diff --git a/quantum/rgblight.c b/quantum/rgblight.c index 0f02b9a64c..78072a61de 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 @@ -465,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) { diff --git a/quantum/rgblight.h b/quantum/rgblight.h index c1b3378b33..fb79ce6ded 100644 --- a/quantum/rgblight.h +++ b/quantum/rgblight.h @@ -22,6 +22,14 @@ #define RGBLIGHT_MODES 1 #endif +#ifndef RGBLIGHT_EFFECT_BREATHE_CENTER +#define RGBLIGHT_EFFECT_BREATHE_CENTER 1.85 // 1-2.7 +#endif + +#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