From eaa60c345f68f516f1776653581375ceffb0bf60 Mon Sep 17 00:00:00 2001 From: InfiniteYuan Date: Mon, 12 Dec 2022 17:26:07 +0800 Subject: [PATCH] bugfix: installed_closed_limit_lift is incorrect --- .../esp_matter/esp_matter_attribute_utils.cpp | 6 +- components/esp_matter/esp_matter_feature.cpp | 87 +++++++++---------- 2 files changed, 46 insertions(+), 47 deletions(-) diff --git a/components/esp_matter/esp_matter_attribute_utils.cpp b/components/esp_matter/esp_matter_attribute_utils.cpp index e51b31bcc..673faee26 100644 --- a/components/esp_matter/esp_matter_attribute_utils.cpp +++ b/components/esp_matter/esp_matter_attribute_utils.cpp @@ -1414,7 +1414,8 @@ static esp_err_t get_attr_val_from_data(esp_matter_attr_val_t *val, EmberAfAttri break; } - case ZCL_INT8U_ATTRIBUTE_TYPE: { + case ZCL_INT8U_ATTRIBUTE_TYPE: + case ZCL_PERCENT_ATTRIBUTE_TYPE: { using Traits = chip::app::NumericAttributeTraits; Traits::StorageType attribute_value; memcpy((uint8_t *)&attribute_value, value, sizeof(Traits::StorageType)); @@ -1446,7 +1447,8 @@ static esp_err_t get_attr_val_from_data(esp_matter_attr_val_t *val, EmberAfAttri break; } - case ZCL_INT16U_ATTRIBUTE_TYPE: { + case ZCL_INT16U_ATTRIBUTE_TYPE: + case ZCL_PERCENT100THS_ATTRIBUTE_TYPE: { using Traits = chip::app::NumericAttributeTraits; Traits::StorageType attribute_value; memcpy((uint8_t *)&attribute_value, value, sizeof(Traits::StorageType)); diff --git a/components/esp_matter/esp_matter_feature.cpp b/components/esp_matter/esp_matter_feature.cpp index 8c767b580..fc30d1568 100644 --- a/components/esp_matter/esp_matter_feature.cpp +++ b/components/esp_matter/esp_matter_feature.cpp @@ -392,18 +392,19 @@ esp_err_t add(cluster_t *cluster, config_t *config) return ESP_ERR_INVALID_ARG; } update_feature_map(cluster, get_id()); - uint32_t pa_lt_and_lift_feature_map = get_id() | feature::lift::get_id(); - if((get_feature_map_value(cluster) & pa_lt_and_lift_feature_map) == pa_lt_and_lift_feature_map) - { - attribute::create_current_position_lift_percentage(cluster, config->current_position_lift_percentage); - attribute::create_target_position_lift_percent_100ths(cluster, config->target_position_lift_percent_100ths); - attribute::create_current_position_lift_percent_100ths(cluster, config->current_position_lift_percent_100ths); - command::create_go_to_lift_percentage(cluster); - }else{ - ESP_LOGE(TAG, "Cluster shall support Lift feature"); - return ESP_ERR_NOT_SUPPORTED; + uint32_t pa_lt_and_lift_feature_map = get_id() | feature::lift::get_id(); + if((get_feature_map_value(cluster) & pa_lt_and_lift_feature_map) == pa_lt_and_lift_feature_map) { + attribute::create_current_position_lift_percentage(cluster, config->current_position_lift_percentage); + attribute::create_target_position_lift_percent_100ths(cluster, config->target_position_lift_percent_100ths); + attribute::create_current_position_lift_percent_100ths(cluster, config->current_position_lift_percent_100ths); + + command::create_go_to_lift_percentage(cluster); + } else { + ESP_LOGE(TAG, "Cluster shall support Lift feature"); + return ESP_ERR_NOT_SUPPORTED; } + return ESP_OK; } } /* position_aware_lift */ @@ -422,43 +423,39 @@ esp_err_t add(cluster_t *cluster, config_t *config) return ESP_ERR_INVALID_ARG; } update_feature_map(cluster, get_id()); + uint32_t abs_and_pa_lf_feature_map = get_id() | feature::position_aware_lift::get_id(); uint32_t abs_and_pa_tl_feature_map = get_id() | feature::position_aware_tilt::get_id(); uint32_t abs_and_lift_feature_map = get_id() | feature::lift::get_id(); uint32_t abs_and_tilt_feature_map = get_id() | feature::tilt::get_id(); - if((get_feature_map_value(cluster) & abs_and_pa_lf_feature_map) == abs_and_pa_lf_feature_map) - { - attribute::create_physical_closed_limit_lift(cluster, config->physical_closed_limit_lift); - attribute::create_current_position_lift(cluster, config->current_position_lift); - attribute::create_installed_open_limit_lift(cluster, config->installed_open_limit_lift); - attribute::create_installed_closed_limit_lift(cluster, config->installed_open_limit_lift); - - }else{ - ESP_LOGE(TAG, "Cluster shall support Position_Aware_Lift feature"); - return ESP_ERR_NOT_SUPPORTED; + if((get_feature_map_value(cluster) & abs_and_pa_lf_feature_map) == abs_and_pa_lf_feature_map) { + attribute::create_physical_closed_limit_lift(cluster, config->physical_closed_limit_lift); + attribute::create_current_position_lift(cluster, config->current_position_lift); + attribute::create_installed_open_limit_lift(cluster, config->installed_open_limit_lift); + attribute::create_installed_closed_limit_lift(cluster, config->installed_closed_limit_lift); + } else { + ESP_LOGE(TAG, "Cluster shall support Position_Aware_Lift feature"); + return ESP_ERR_NOT_SUPPORTED; } - if((get_feature_map_value(cluster) & abs_and_pa_tl_feature_map) == abs_and_pa_tl_feature_map) - { - attribute::create_physical_closed_limit_tilt(cluster, config->physical_closed_limit_tilt); - attribute::create_current_position_tilt(cluster, config->current_position_tilt); - attribute::create_installed_open_limit_tilt(cluster, config->installed_open_limit_tilt); - attribute::create_installed_closed_limit_tilt(cluster, config->installed_open_limit_tilt); - - }else{ - ESP_LOGE(TAG, "Cluster shall support Position_Aware_Tilt feature"); - return ESP_ERR_NOT_SUPPORTED; + if((get_feature_map_value(cluster) & abs_and_pa_tl_feature_map) == abs_and_pa_tl_feature_map) { + attribute::create_physical_closed_limit_tilt(cluster, config->physical_closed_limit_tilt); + attribute::create_current_position_tilt(cluster, config->current_position_tilt); + attribute::create_installed_open_limit_tilt(cluster, config->installed_open_limit_tilt); + attribute::create_installed_closed_limit_tilt(cluster, config->installed_closed_limit_lift); + } else { + ESP_LOGE(TAG, "Cluster shall support Position_Aware_Tilt feature"); + return ESP_ERR_NOT_SUPPORTED; } - if((get_feature_map_value(cluster) & abs_and_lift_feature_map) == abs_and_lift_feature_map) - { - command::create_go_to_lift_value(cluster); + if((get_feature_map_value(cluster) & abs_and_lift_feature_map) == abs_and_lift_feature_map) { + command::create_go_to_lift_value(cluster); } - if((get_feature_map_value(cluster) & abs_and_tilt_feature_map) == abs_and_tilt_feature_map) - { - command::create_go_to_tilt_value(cluster); + if((get_feature_map_value(cluster) & abs_and_tilt_feature_map) == abs_and_tilt_feature_map) { + command::create_go_to_tilt_value(cluster); } + return ESP_OK; } @@ -480,17 +477,17 @@ esp_err_t add(cluster_t *cluster, config_t *config) update_feature_map(cluster, get_id()); uint32_t pa_lt_and_tilt_feature_map = get_id() | feature::tilt::get_id(); - if((get_feature_map_value(cluster) & pa_lt_and_tilt_feature_map) == pa_lt_and_tilt_feature_map) - { - attribute::create_current_position_tilt_percentage(cluster, config->current_position_tilt_percentage); - attribute::create_target_position_tilt_percent_100ths(cluster, config->target_position_tilt_percent_100ths); - attribute::create_current_position_tilt_percent_100ths(cluster, config->current_position_tilt_percent_100ths); + if((get_feature_map_value(cluster) & pa_lt_and_tilt_feature_map) == pa_lt_and_tilt_feature_map) { + attribute::create_current_position_tilt_percentage(cluster, config->current_position_tilt_percentage); + attribute::create_target_position_tilt_percent_100ths(cluster, config->target_position_tilt_percent_100ths); + attribute::create_current_position_tilt_percent_100ths(cluster, config->current_position_tilt_percent_100ths); - command::create_go_to_tilt_percentage(cluster); - }else{ - ESP_LOGE(TAG, "Cluster shall support Tilt feature"); - return ESP_ERR_NOT_SUPPORTED; + command::create_go_to_tilt_percentage(cluster); + } else { + ESP_LOGE(TAG, "Cluster shall support Tilt feature"); + return ESP_ERR_NOT_SUPPORTED; } + return ESP_OK; }