From 16546ee06fa71bd9b9e9d3fda7c8816675e12185 Mon Sep 17 00:00:00 2001 From: "Colin T.A. Gray" Date: Tue, 5 Dec 2017 11:56:15 -0700 Subject: [PATCH] Add 'rgblight_disable' and 'rgblight_setrgb_at/rgblight_sethsv_at' Refactors rgblight_toggle to use rgblight_enable or rgblight_disable Use 'rgblight_setrgb_at/rgblight_sethsv_at' to control an individual LED --- docs/feature_rgblight.md | 14 ++++++++++++ quantum/rgblight.c | 46 ++++++++++++++++++++++++++++++---------- quantum/rgblight.h | 3 +++ 3 files changed, 52 insertions(+), 11 deletions(-) diff --git a/docs/feature_rgblight.md b/docs/feature_rgblight.md index 9d8f537d..bd9cb352 100644 --- a/docs/feature_rgblight.md +++ b/docs/feature_rgblight.md @@ -80,6 +80,20 @@ const uint8_t RGBLED_KNIGHT_INTERVALS[] PROGMEM = {127, 63, 31}; const uint16_t RGBLED_GRADIENT_RANGES[] PROGMEM = {360, 240, 180, 120, 90}; ``` +### LED control + +Look in `rgblights.h` for all available functions, but if you want to control all or some LEDs your goto functions are: + +```c +rgblight_disable(); // turn all lights off +rgblight_enable(); // turn lights on, based on their previous state (stored in EEPROM) + +rgblight_setrgb(r, g, b); // where r/g/b is a number from 0..255. Turns all the LEDs to this color +rgblight_sethsv(h, s, v); // HSV color control +rgblight_setrgb_at(r,g,b, LED); // control a single LED. 0 <= LED < RGBLED_NUM +rgblight_sethsv_at(h,s,v, LED); // control a single LED. 0 <= LED < RGBLED_NUM +``` + ## RGB Lighting Keycodes These control the RGB Lighting functionality. diff --git a/quantum/rgblight.c b/quantum/rgblight.c index 78072a61..63eda47c 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -245,17 +245,12 @@ void rgblight_mode(uint8_t mode) { } void rgblight_toggle(void) { - rgblight_config.enable ^= 1; - eeconfig_update_rgblight(rgblight_config.raw); - xprintf("rgblight toggle: rgblight_config.enable = %u\n", rgblight_config.enable); + xprintf("rgblight toggle: rgblight_config.enable = %u\n", !rgblight_config.enable); if (rgblight_config.enable) { - rgblight_mode(rgblight_config.mode); - } else { - #ifdef RGBLIGHT_ANIMATIONS - rgblight_timer_disable(); - #endif - _delay_ms(50); - rgblight_set(); + rgblight_disable(); + } + else { + rgblight_enable(); } } @@ -266,6 +261,17 @@ void rgblight_enable(void) { rgblight_mode(rgblight_config.mode); } +void rgblight_disable(void) { + rgblight_config.enable = 0; + eeconfig_update_rgblight(rgblight_config.raw); + xprintf("rgblight disable: rgblight_config.enable = %u\n", rgblight_config.enable); + #ifdef RGBLIGHT_ANIMATIONS + rgblight_timer_disable(); + #endif + _delay_ms(50); + rgblight_set(); +} + void rgblight_increase_hue(void) { uint16_t hue; @@ -365,7 +371,8 @@ void rgblight_sethsv(uint16_t hue, uint8_t sat, uint8_t val) { } void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b) { - // dprintf("rgblight set rgb: %u,%u,%u\n", r,g,b); + if (!rgblight_config.enable) { return; } + for (uint8_t i = 0; i < RGBLED_NUM; i++) { led[i].r = r; led[i].g = g; @@ -374,6 +381,23 @@ void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b) { rgblight_set(); } +void rgblight_setrgb_at(uint8_t r, uint8_t g, uint8_t b, uint8_t index) { + if (!rgblight_config.enable || index >= RGBLED_NUM) { return; } + + led[index].r = r; + led[index].g = g; + led[index].b = b; + rgblight_set(); +} + +void rgblight_sethsv_at(uint16_t hue, uint8_t sat, uint8_t val, uint8_t index) { + if (!rgblight_config.enable) { return; } + + LED_TYPE tmp_led; + sethsv(hue, sat, val, &tmp_led); + rgblight_setrgb_at(tmp_led.r, tmp_led.g, tmp_led.b, index); +} + #ifndef RGBLIGHT_CUSTOM_DRIVER void rgblight_set(void) { if (rgblight_config.enable) { diff --git a/quantum/rgblight.h b/quantum/rgblight.h index fb79ce6d..6d362e1d 100644 --- a/quantum/rgblight.h +++ b/quantum/rgblight.h @@ -99,6 +99,7 @@ void rgblight_increase(void); void rgblight_decrease(void); void rgblight_toggle(void); void rgblight_enable(void); +void rgblight_disable(void); void rgblight_step(void); void rgblight_step_reverse(void); uint32_t rgblight_get_mode(void); @@ -113,6 +114,8 @@ void rgblight_increase_val(void); void rgblight_decrease_val(void); void rgblight_sethsv(uint16_t hue, uint8_t sat, uint8_t val); void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b); +void rgblight_setrgb_at(uint8_t r, uint8_t g, uint8_t b, uint8_t index); +void rgblight_sethsv_at(uint16_t hue, uint8_t sat, uint8_t val, uint8_t index); uint32_t eeconfig_read_rgblight(void); void eeconfig_update_rgblight(uint32_t val);