From a19f555c90438ae73b39f74909be03f4382a16ec Mon Sep 17 00:00:00 2001 From: WanqQixiang Date: Mon, 4 Jul 2022 17:27:04 +0800 Subject: [PATCH] Features: Add optional features APIs for LevelControl cluster. Bugfix: Add NULLABLE flag for start_up_on_off attribute. --- .../esp_matter/esp_matter_attribute.cpp | 45 ++++++++++++++++++- components/esp_matter/esp_matter_attribute.h | 7 +++ components/esp_matter/esp_matter_command.cpp | 17 +++++++ components/esp_matter/esp_matter_command.h | 1 + components/esp_matter/esp_matter_feature.cpp | 27 +++++++++++ components/esp_matter/esp_matter_feature.h | 13 ++++++ 6 files changed, 109 insertions(+), 1 deletion(-) diff --git a/components/esp_matter/esp_matter_attribute.cpp b/components/esp_matter/esp_matter_attribute.cpp index ff3c2aa9c..5847c2f7c 100644 --- a/components/esp_matter/esp_matter_attribute.cpp +++ b/components/esp_matter/esp_matter_attribute.cpp @@ -683,7 +683,8 @@ attribute_t *create_off_wait_time(cluster_t *cluster, uint16_t value) attribute_t *create_start_up_on_off(cluster_t *cluster, uint8_t value) { return esp_matter::attribute::create(cluster, OnOff::Attributes::StartUpOnOff::Id, - ATTRIBUTE_FLAG_WRITABLE | ATTRIBUTE_FLAG_NONVOLATILE, esp_matter_enum8(value)); + ATTRIBUTE_FLAG_WRITABLE | ATTRIBUTE_FLAG_NONVOLATILE | ATTRIBUTE_FLAG_NULLABLE, + esp_matter_enum8(value)); } } /* attribute */ @@ -734,6 +735,48 @@ attribute_t *create_max_level(cluster_t *cluster, uint8_t value) esp_matter_uint8(value)); } +attribute_t *create_current_frequency(cluster_t *cluster, uint16_t value) +{ + return esp_matter::attribute::create(cluster, LevelControl::Attributes::CurrentFrequency::Id, ATTRIBUTE_FLAG_NONE, + esp_matter_uint16(value)); +} + +attribute_t *create_min_frequency(cluster_t *cluster, uint16_t value) +{ + return esp_matter::attribute::create(cluster, LevelControl::Attributes::MinFrequency::Id, ATTRIBUTE_FLAG_NONE, + esp_matter_uint16(value)); +} + +attribute_t *create_max_frequency(cluster_t *cluster, uint16_t value) +{ + return esp_matter::attribute::create(cluster, LevelControl::Attributes::MaxFrequency::Id, ATTRIBUTE_FLAG_NONE, + esp_matter_uint16(value)); +} + +attribute_t *create_on_off_transition_time(cluster_t *cluster, uint16_t value) +{ + return esp_matter::attribute::create(cluster, LevelControl::Attributes::OnOffTransitionTime::Id, + ATTRIBUTE_FLAG_WRITABLE, esp_matter_uint16(value)); +} + +attribute_t *create_on_transition_time(cluster_t* cluster, uint16_t value) +{ + return esp_matter::attribute::create(cluster, LevelControl::Attributes::OnTransitionTime::Id, + ATTRIBUTE_FLAG_WRITABLE | ATTRIBUTE_FLAG_NULLABLE, esp_matter_uint16(value)); +} + +attribute_t *create_off_transition_time(cluster_t* cluster, uint16_t value) +{ + return esp_matter::attribute::create(cluster, LevelControl::Attributes::OffTransitionTime::Id, + ATTRIBUTE_FLAG_WRITABLE | ATTRIBUTE_FLAG_NULLABLE, esp_matter_uint16(value)); +} + +attribute_t *create_default_move_rate(cluster_t* cluster, uint8_t value) +{ + return esp_matter::attribute::create(cluster, LevelControl::Attributes::DefaultMoveRate::Id, + ATTRIBUTE_FLAG_WRITABLE, esp_matter_uint8(value)); +} + attribute_t *create_start_up_current_level(cluster_t *cluster, uint8_t value) { return esp_matter::attribute::create(cluster, LevelControl::Attributes::StartUpCurrentLevel::Id, diff --git a/components/esp_matter/esp_matter_attribute.h b/components/esp_matter/esp_matter_attribute.h index 8f0e7c11a..c4170c38f 100644 --- a/components/esp_matter/esp_matter_attribute.h +++ b/components/esp_matter/esp_matter_attribute.h @@ -216,6 +216,13 @@ attribute_t *create_options(cluster_t *cluster, uint8_t value, uint8_t min, uint attribute_t *create_remaining_time(cluster_t *cluster, uint16_t value); attribute_t *create_min_level(cluster_t *cluster, uint8_t value); attribute_t *create_max_level(cluster_t *cluster, uint8_t value); +attribute_t *create_current_frequency(cluster_t *cluster, uint16_t value); +attribute_t *create_min_frequency(cluster_t *cluster, uint16_t value); +attribute_t *create_max_frequency(cluster_t *cluster, uint16_t value); +attribute_t *create_on_off_transition_time(cluster_t *cluster, uint16_t value); +attribute_t *create_on_transition_time(cluster_t* cluster, uint16_t value); +attribute_t *create_off_transition_time(cluster_t* cluster, uint16_t value); +attribute_t *create_default_move_rate(cluster_t* cluster, uint8_t value); attribute_t *create_start_up_current_level(cluster_t *cluster, uint8_t value); } /* attribute */ } /* level_control */ diff --git a/components/esp_matter/esp_matter_command.cpp b/components/esp_matter/esp_matter_command.cpp index 8ec9702b6..35333e5cf 100644 --- a/components/esp_matter/esp_matter_command.cpp +++ b/components/esp_matter/esp_matter_command.cpp @@ -730,6 +730,17 @@ static esp_err_t esp_matter_command_callback_stop_with_on_off(const ConcreteComm return ESP_OK; } +static esp_err_t esp_matter_command_callback_move_to_closest_frequency(const ConcreteCommandPath &command_path, + TLVReader &tlv_data, void *opaque_ptr) +{ + chip::app::Clusters::LevelControl::Commands::MoveToClosestFrequency::DecodableType command_data; + CHIP_ERROR error = Decode(tlv_data, command_data); + if (error == CHIP_NO_ERROR) { + emberAfLevelControlClusterMoveToClosestFrequencyCallback((CommandHandler *)opaque_ptr, command_path, command_data); + } + return ESP_OK; +} + static esp_err_t esp_matter_command_callback_move_to_hue(const ConcreteCommandPath &command_path, TLVReader &tlv_data, void *opaque_ptr) { @@ -1581,6 +1592,12 @@ command_t *create_stop_with_on_off(cluster_t *cluster) esp_matter_command_callback_stop_with_on_off); } +command_t *create_move_to_closest_frequency(cluster_t *cluster) +{ + return esp_matter::command::create(cluster, LevelControl::Commands::MoveToClosestFrequency::Id, COMMAND_FLAG_ACCEPTED, + esp_matter_command_callback_move_to_closest_frequency); +} + } /* command */ } /* level_control */ diff --git a/components/esp_matter/esp_matter_command.h b/components/esp_matter/esp_matter_command.h index 6bbc5fb31..aaf9e9366 100644 --- a/components/esp_matter/esp_matter_command.h +++ b/components/esp_matter/esp_matter_command.h @@ -175,6 +175,7 @@ command_t *create_move_to_level_with_on_off(cluster_t *cluster); command_t *create_move_with_on_off(cluster_t *cluster); command_t *create_step_with_on_off(cluster_t *cluster); command_t *create_stop_with_on_off(cluster_t *cluster); +command_t *create_move_to_closest_frequency(cluster_t *cluster); } /* command */ } /* level_control */ diff --git a/components/esp_matter/esp_matter_feature.cpp b/components/esp_matter/esp_matter_feature.cpp index 18c1c88ac..768f312e5 100644 --- a/components/esp_matter/esp_matter_feature.cpp +++ b/components/esp_matter/esp_matter_feature.cpp @@ -136,6 +136,33 @@ esp_err_t add(cluster_t *cluster, config_t *config) } } /* lighting */ + +namespace frequency { + +uint32_t get_id() +{ + return (uint32_t)LevelControl::LevelControlFeature::kFrequency; +} + +esp_err_t add(cluster_t *cluster, config_t *config) +{ + if (!cluster) { + ESP_LOGE(TAG, "Cluster cannot be NULL"); + return ESP_ERR_INVALID_ARG; + } + update_feature_map(cluster, get_id()); + + /* Attributes not managed internally */ + attribute::create_current_frequency(cluster, config->current_frequency); + attribute::create_min_frequency(cluster, config->min_frequency); + attribute::create_max_frequency(cluster, config->max_frequency); + + /* Commands */ + command::create_move_to_closest_frequency(cluster); + + return ESP_OK; +} +} /* frequency */ } /* feature */ } /* level_control */ diff --git a/components/esp_matter/esp_matter_feature.h b/components/esp_matter/esp_matter_feature.h index f68626034..cf3659820 100644 --- a/components/esp_matter/esp_matter_feature.h +++ b/components/esp_matter/esp_matter_feature.h @@ -73,6 +73,19 @@ uint32_t get_id(); esp_err_t add(cluster_t *cluster, config_t *config); } /* lighting */ + +namespace frequency { + +typedef struct config { + uint16_t current_frequency; + uint16_t min_frequency; + uint16_t max_frequency; + config() : current_frequency(0), min_frequency(0), max_frequency(0) {} +} config_t; + +uint32_t get_id(); +esp_err_t add(cluster_t *cluster, config_t *config); +} /* frequency */ } /* feature */ } /* level_control */