summaryrefslogtreecommitdiffstats
path: root/quantum/rgblight.c
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/rgblight.c')
-rw-r--r--quantum/rgblight.c51
1 files changed, 47 insertions, 4 deletions
diff --git a/quantum/rgblight.c b/quantum/rgblight.c
index 6e335a4831..eff70aae1d 100644
--- a/quantum/rgblight.c
+++ b/quantum/rgblight.c
@@ -1,3 +1,18 @@
+/* Copyright 2016-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/>.
+ */
#include <avr/eeprom.h>
#include <avr/interrupt.h>
#include <util/delay.h>
@@ -66,6 +81,8 @@ __attribute__ ((weak))
const uint8_t RGBLED_SNAKE_INTERVALS[] PROGMEM = {100, 50, 20};
__attribute__ ((weak))
const uint8_t RGBLED_KNIGHT_INTERVALS[] PROGMEM = {100, 50, 20};
+__attribute__ ((weak))
+const uint16_t RGBLED_GRADIENT_RANGES[] PROGMEM = {360, 240, 180, 120, 90};
rgblight_config_t rgblight_config;
rgblight_config_t inmem_config;
@@ -219,6 +236,14 @@ void rgblight_step(void) {
}
rgblight_mode(mode);
}
+void rgblight_step_reverse(void) {
+ uint8_t mode = 0;
+ mode = rgblight_config.mode - 1;
+ if (mode < 1) {
+ mode = RGBLIGHT_MODES;
+ }
+ rgblight_mode(mode);
+}
void rgblight_mode(uint8_t mode) {
if (!rgblight_config.enable) {
@@ -237,7 +262,7 @@ void rgblight_mode(uint8_t mode) {
#ifdef RGBLIGHT_ANIMATIONS
rgblight_timer_disable();
#endif
- } else if (rgblight_config.mode >= 2 && rgblight_config.mode <= 23) {
+ } else if (rgblight_config.mode >= 2 && rgblight_config.mode <= 24) {
// MODE 2-5, breathing
// MODE 6-8, rainbow mood
// MODE 9-14, rainbow swirl
@@ -247,6 +272,12 @@ void rgblight_mode(uint8_t mode) {
#ifdef RGBLIGHT_ANIMATIONS
rgblight_timer_enable();
#endif
+ } else if (rgblight_config.mode >= 25 && rgblight_config.mode <= 34) {
+ // MODE 25-34, static gradient
+
+ #ifdef RGBLIGHT_ANIMATIONS
+ rgblight_timer_disable();
+ #endif
}
rgblight_sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val);
}
@@ -350,6 +381,17 @@ void rgblight_sethsv(uint16_t hue, uint8_t sat, uint8_t val) {
} else if (rgblight_config.mode >= 6 && rgblight_config.mode <= 14) {
// rainbow mood and rainbow swirl, ignore the change of hue
hue = rgblight_config.hue;
+ } else if (rgblight_config.mode >= 25 && rgblight_config.mode <= 34) {
+ // static gradient
+ uint16_t _hue;
+ int8_t direction = ((rgblight_config.mode - 25) % 2) ? -1 : 1;
+ uint16_t range = pgm_read_word(&RGBLED_GRADIENT_RANGES[(rgblight_config.mode - 25) / 2]);
+ for (uint8_t i = 0; i < RGBLED_NUM; i++) {
+ _hue = (range / RGBLED_NUM * i * direction + hue + 360) % 360;
+ dprintf("rgblight rainbow set hsv: %u,%u,%d,%u\n", i, _hue, direction, range);
+ sethsv(_hue, sat, val, (LED_TYPE *)&led[i]);
+ }
+ rgblight_set();
}
}
rgblight_config.hue = hue;
@@ -370,6 +412,7 @@ void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b) {
rgblight_set();
}
+__attribute__ ((weak))
void rgblight_set(void) {
if (rgblight_config.enable) {
#ifdef RGBW
@@ -449,7 +492,7 @@ void rgblight_task(void) {
} else if (rgblight_config.mode >= 21 && rgblight_config.mode <= 23) {
// mode = 21 to 23, knight mode
rgblight_effect_knight(rgblight_config.mode - 21);
- } else {
+ } else if (rgblight_config.mode == 24) {
// mode = 24, christmas mode
rgblight_effect_christmas();
}
@@ -603,13 +646,13 @@ void rgblight_effect_christmas(void) {
static uint16_t last_timer = 0;
uint16_t hue;
uint8_t i;
- if (timer_elapsed(last_timer) < 1000) {
+ if (timer_elapsed(last_timer) < RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL) {
return;
}
last_timer = timer_read();
current_offset = (current_offset + 1) % 2;
for (i = 0; i < RGBLED_NUM; i++) {
- hue = 0 + ((RGBLED_NUM * (i + current_offset)) % 2) * 80;
+ hue = 0 + ((i/RGBLIGHT_EFFECT_CHRISTMAS_STEP + current_offset) % 2) * 120;
sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i]);
}
rgblight_set();