mirror of
https://github.com/esphome/esphome.git
synced 2025-11-20 08:46:01 +00:00
Support HSV-based color support on tuya light (#2400)
* fix: stop tuya light state getting reset * fix typo * Support for HSV color in Tuya * Clamp formatting
This commit is contained in:
@@ -394,6 +394,69 @@ std::string hexencode(const uint8_t *data, uint32_t len) {
|
||||
return res;
|
||||
}
|
||||
|
||||
void rgb_to_hsv(float red, float green, float blue, int &hue, float &saturation, float &value) {
|
||||
float max_color_value = std::max(std::max(red, green), blue);
|
||||
float min_color_value = std::min(std::min(red, green), blue);
|
||||
float delta = max_color_value - min_color_value;
|
||||
|
||||
if (delta == 0)
|
||||
hue = 0;
|
||||
else if (max_color_value == red)
|
||||
hue = int(fmod(((60 * ((green - blue) / delta)) + 360), 360));
|
||||
else if (max_color_value == green)
|
||||
hue = int(fmod(((60 * ((blue - red) / delta)) + 120), 360));
|
||||
else if (max_color_value == blue)
|
||||
hue = int(fmod(((60 * ((red - green) / delta)) + 240), 360));
|
||||
|
||||
if (max_color_value == 0)
|
||||
saturation = 0;
|
||||
else
|
||||
saturation = delta / max_color_value;
|
||||
|
||||
value = max_color_value;
|
||||
}
|
||||
|
||||
void hsv_to_rgb(int hue, float saturation, float value, float &red, float &green, float &blue) {
|
||||
float chroma = value * saturation;
|
||||
float hue_prime = fmod(hue / 60.0, 6);
|
||||
float intermediate = chroma * (1 - fabs(fmod(hue_prime, 2) - 1));
|
||||
float delta = value - chroma;
|
||||
|
||||
if (0 <= hue_prime && hue_prime < 1) {
|
||||
red = chroma;
|
||||
green = intermediate;
|
||||
blue = 0;
|
||||
} else if (1 <= hue_prime && hue_prime < 2) {
|
||||
red = intermediate;
|
||||
green = chroma;
|
||||
blue = 0;
|
||||
} else if (2 <= hue_prime && hue_prime < 3) {
|
||||
red = 0;
|
||||
green = chroma;
|
||||
blue = intermediate;
|
||||
} else if (3 <= hue_prime && hue_prime < 4) {
|
||||
red = 0;
|
||||
green = intermediate;
|
||||
blue = chroma;
|
||||
} else if (4 <= hue_prime && hue_prime < 5) {
|
||||
red = intermediate;
|
||||
green = 0;
|
||||
blue = chroma;
|
||||
} else if (5 <= hue_prime && hue_prime < 6) {
|
||||
red = chroma;
|
||||
green = 0;
|
||||
blue = intermediate;
|
||||
} else {
|
||||
red = 0;
|
||||
green = 0;
|
||||
blue = 0;
|
||||
}
|
||||
|
||||
red += delta;
|
||||
green += delta;
|
||||
blue += delta;
|
||||
}
|
||||
|
||||
#ifdef USE_ESP8266
|
||||
IRAM_ATTR InterruptLock::InterruptLock() { xt_state_ = xt_rsil(15); }
|
||||
IRAM_ATTR InterruptLock::~InterruptLock() { xt_wsr_ps(xt_state_); }
|
||||
|
||||
Reference in New Issue
Block a user