mirror of
https://github.com/espressif/esp-matter.git
synced 2026-04-27 19:13:13 +00:00
[led_driver] Add XY color control support and update app_driver of light example to handle CurrentX and CurrentY attributes
This commit is contained in:
@@ -105,3 +105,8 @@ esp_err_t led_driver_set_temperature(led_driver_handle_t handle, uint32_t temper
|
||||
{
|
||||
return ESP_ERR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
esp_err_t led_driver_set_xy(led_driver_handle_t handle, uint16_t x, uint16_t y)
|
||||
{
|
||||
return ESP_ERR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
@@ -64,3 +64,11 @@ esp_err_t led_driver_set_temperature(led_driver_handle_t handle, uint32_t temper
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t led_driver_set_xy(led_driver_handle_t handle, uint16_t x, uint16_t y)
|
||||
{
|
||||
ESP_LOGI(TAG, "Setting XY to: x=%d, y=%d", x, y);
|
||||
/* Set the XY color coordinates here */
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
@@ -29,10 +29,17 @@ typedef struct {
|
||||
uint8_t blue;
|
||||
} RGB_color_t;
|
||||
|
||||
typedef struct {
|
||||
uint16_t x;
|
||||
uint16_t y;
|
||||
} XY_color_t;
|
||||
|
||||
void temp_to_hs(uint32_t temperature, HS_color_t *HS);
|
||||
|
||||
void hsv_to_rgb(HS_color_t HS, uint8_t brightness, RGB_color_t *RGB);
|
||||
|
||||
void xy_to_rgb(XY_color_t XY, uint8_t brightness, RGB_color_t *RGB);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -33,6 +33,7 @@ esp_err_t led_driver_set_brightness(led_driver_handle_t handle, uint8_t brightne
|
||||
esp_err_t led_driver_set_hue(led_driver_handle_t handle, uint16_t hue);
|
||||
esp_err_t led_driver_set_saturation(led_driver_handle_t handle, uint8_t saturation);
|
||||
esp_err_t led_driver_set_temperature(led_driver_handle_t handle, uint32_t temperature);
|
||||
esp_err_t led_driver_set_xy(led_driver_handle_t handle, uint16_t x, uint16_t y);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
// limitations under the License
|
||||
|
||||
#include <color_format.h>
|
||||
#include <math.h>
|
||||
|
||||
void hsv_to_rgb(HS_color_t HS, uint8_t brightness, RGB_color_t *RGB)
|
||||
{
|
||||
@@ -99,3 +100,61 @@ void temp_to_hs(uint32_t temperature, HS_color_t *HS)
|
||||
HS->hue = temp_table[(temperature - 600) / 100].hue;
|
||||
HS->saturation = temp_table[(temperature - 600) / 100].saturation;
|
||||
}
|
||||
|
||||
void xy_to_rgb(XY_color_t XY, uint8_t brightness, RGB_color_t *RGB)
|
||||
{
|
||||
// Convert Matter xy coordinates (0-65536) to CIE xy coordinates (0.0-1.0)
|
||||
float x = (float)XY.x / 65536.0f;
|
||||
float y = (float)XY.y / 65536.0f;
|
||||
float z = 1.0f - x - y;
|
||||
|
||||
// Convert brightness (0-255) to Y value (0.0-1.0)
|
||||
float Y = (float)brightness / 255.0f;
|
||||
|
||||
// Convert from xy to XYZ
|
||||
float X, Z;
|
||||
if (y > 0.0f) {
|
||||
X = (Y / y) * x;
|
||||
Z = (Y / y) * z;
|
||||
} else {
|
||||
X = 0.0f;
|
||||
Z = 0.0f;
|
||||
}
|
||||
|
||||
// Convert XYZ to RGB using D65 white point matrix
|
||||
float r = X * 3.240479f - Y * 1.537150f - Z * 0.498535f;
|
||||
float g = -X * 0.969256f + Y * 1.875992f + Z * 0.041556f;
|
||||
float b = X * 0.055648f - Y * 0.204043f + Z * 1.057311f;
|
||||
|
||||
// Apply reverse gamma correction
|
||||
if (r <= 0.0031308f) {
|
||||
r = 12.92f * r;
|
||||
} else {
|
||||
r = (1.0f + 0.055f) * powf(r, (1.0f / 2.4f)) - 0.055f;
|
||||
}
|
||||
|
||||
if (g <= 0.0031308f) {
|
||||
g = 12.92f * g;
|
||||
} else {
|
||||
g = (1.0f + 0.055f) * powf(g, (1.0f / 2.4f)) - 0.055f;
|
||||
}
|
||||
|
||||
if (b <= 0.0031308f) {
|
||||
b = 12.92f * b;
|
||||
} else {
|
||||
b = (1.0f + 0.055f) * powf(b, (1.0f / 2.4f)) - 0.055f;
|
||||
}
|
||||
|
||||
// Clamp values to [0, 1] range
|
||||
if (r < 0.0f) r = 0.0f;
|
||||
if (r > 1.0f) r = 1.0f;
|
||||
if (g < 0.0f) g = 0.0f;
|
||||
if (g > 1.0f) g = 1.0f;
|
||||
if (b < 0.0f) b = 0.0f;
|
||||
if (b > 1.0f) b = 1.0f;
|
||||
|
||||
// Convert to 0-255 range
|
||||
RGB->red = (uint8_t)(r * 255.0f);
|
||||
RGB->green = (uint8_t)(g * 255.0f);
|
||||
RGB->blue = (uint8_t)(b * 255.0f);
|
||||
}
|
||||
|
||||
@@ -196,3 +196,11 @@ esp_err_t led_driver_set_temperature(led_driver_handle_t handle, uint32_t temper
|
||||
hsv_to_rgb(current_HS, brightness, &mRGB);
|
||||
return led_driver_set_RGB(handle);
|
||||
}
|
||||
|
||||
esp_err_t led_driver_set_xy(led_driver_handle_t handle, uint16_t x, uint16_t y)
|
||||
{
|
||||
uint8_t brightness = current_power ? current_brightness : 0;
|
||||
XY_color_t xy_color = {x, y};
|
||||
xy_to_rgb(xy_color, brightness, &mRGB);
|
||||
return led_driver_set_RGB(handle);
|
||||
}
|
||||
|
||||
@@ -114,3 +114,11 @@ esp_err_t led_driver_set_temperature(led_driver_handle_t handle, uint32_t temper
|
||||
hsv_to_rgb(current_HS, brightness, &mRGB);
|
||||
return led_driver_set_RGB(handle);
|
||||
}
|
||||
|
||||
esp_err_t led_driver_set_xy(led_driver_handle_t handle, uint16_t x, uint16_t y)
|
||||
{
|
||||
uint8_t brightness = current_power ? current_brightness : 0;
|
||||
XY_color_t xy_color = {x, y};
|
||||
xy_to_rgb(xy_color, brightness, &mRGB);
|
||||
return led_driver_set_RGB(handle);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user