Merge branch 'bugfix/light' into 'main'

[examples/light] Add the missing xy feature of the color control cluster.

See merge request app-frameworks/esp-matter!1165
This commit is contained in:
Hrishikesh Dhayagude
2025-06-10 17:54:47 +08:00
9 changed files with 121 additions and 1 deletions
+5
View File
@@ -106,3 +106,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
@@ -34,6 +34,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);
}
+8
View File
@@ -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);
}