1
0
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:
irtimaled
2021-09-28 13:19:17 -07:00
committed by GitHub
parent af04f565cf
commit c39ac9edfe
5 changed files with 107 additions and 7 deletions

View File

@@ -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_); }