From 4916723edc4435a8cff2c6f8e927a2e7e56881f1 Mon Sep 17 00:00:00 2001 From: liyashuai Date: Wed, 7 Dec 2022 13:41:08 +0800 Subject: [PATCH] update attribute value in color light for v1.0 certified --- components/esp_matter/esp_matter_feature.cpp | 30 ++++++++++++++++++++ examples/light/main/app_main.cpp | 1 + 2 files changed, 31 insertions(+) diff --git a/components/esp_matter/esp_matter_feature.cpp b/components/esp_matter/esp_matter_feature.cpp index 8c767b580..f420a91cd 100644 --- a/components/esp_matter/esp_matter_feature.cpp +++ b/components/esp_matter/esp_matter_feature.cpp @@ -177,6 +177,31 @@ esp_err_t add(cluster_t *cluster, config_t *config) namespace color_control { namespace feature { + +static esp_err_t update_color_capability(cluster_t *cluster, uint16_t value) +{ + if (!cluster) { + ESP_LOGE(TAG, "Cluster cannot be NULL"); + return ESP_ERR_INVALID_ARG; + } + + /* Get the attribute */ + attribute_t *attribute = esp_matter::attribute::get(cluster, ColorControl::Attributes::ColorCapabilities::Id); + + /* Print error log if it does not exist */ + if (!attribute) { + ESP_LOGE(TAG, "The color capability attribute is NULL"); + return ESP_FAIL; + } + + /* Update the value if the attribute already exists */ + esp_matter_attr_val_t val = esp_matter_invalid(NULL); + esp_matter::attribute::get_val(attribute, &val); + val.val.u16 |= value; + /* Here we can't call attribute::update() since the chip stack would not have started yet, since we are + still creating the data model. So, we are directly using attribute::set_val(). */ + return esp_matter::attribute::set_val(attribute, &val); +} namespace hue_saturation { uint32_t get_id() @@ -191,6 +216,7 @@ esp_err_t add(cluster_t *cluster, config_t *config) return ESP_ERR_INVALID_ARG; } update_feature_map(cluster, get_id()); + update_color_capability(cluster, get_id()); /* Attributes not managed internally */ attribute::create_current_hue(cluster, config->current_hue); @@ -225,6 +251,7 @@ esp_err_t add(cluster_t *cluster, config_t *config) return ESP_ERR_INVALID_ARG; } update_feature_map(cluster, get_id()); + update_color_capability(cluster, get_id()); /* Attributes not managed internally */ attribute::create_color_temperature_mireds(cluster, config->color_temperature_mireds); @@ -258,6 +285,7 @@ esp_err_t add(cluster_t *cluster, config_t *config) return ESP_ERR_INVALID_ARG; } update_feature_map(cluster, get_id()); + update_color_capability(cluster, get_id()); /* Attributes not managed internally */ attribute::create_current_x(cluster, config->current_x); @@ -288,6 +316,7 @@ esp_err_t add(cluster_t *cluster, config_t *config) return ESP_ERR_INVALID_ARG; } update_feature_map(cluster, get_id()); + update_color_capability(cluster, get_id()); /* Attributes not managed internally */ attribute::create_enhanced_current_hue(cluster, config->enhanced_current_hue); @@ -315,6 +344,7 @@ esp_err_t add(cluster_t *cluster, config_t *config) return ESP_ERR_INVALID_ARG; } update_feature_map(cluster, get_id()); + update_color_capability(cluster, get_id()); /* Attributes not managed internally */ attribute::create_color_loop_active(cluster, config->color_loop_active); diff --git a/examples/light/main/app_main.cpp b/examples/light/main/app_main.cpp index 2182092d7..5bd51758f 100644 --- a/examples/light/main/app_main.cpp +++ b/examples/light/main/app_main.cpp @@ -104,6 +104,7 @@ extern "C" void app_main() light_config.level_control.current_level = DEFAULT_BRIGHTNESS; light_config.level_control.lighting.start_up_current_level = DEFAULT_BRIGHTNESS; light_config.color_control.color_mode = EMBER_ZCL_COLOR_MODE_COLOR_TEMPERATURE; + light_config.color_control.enhanced_color_mode = EMBER_ZCL_COLOR_MODE_COLOR_TEMPERATURE; light_config.color_control.color_temperature.startup_color_temperature_mireds = nullptr; endpoint_t *endpoint = color_temperature_light::create(node, &light_config, ENDPOINT_FLAG_NONE, light_handle);