Skip to content

Commit 53da97b

Browse files
committed
Merge branch 'comformance_fixes' into 'main'
components/esp-matter: Fixed conformance according to IDM_10.2 test case results. See merge request app-frameworks/esp-matter!974
2 parents 5b0db48 + a55745c commit 53da97b

7 files changed

+351
-8
lines changed

components/esp_matter/esp_matter_cluster.cpp

+99-1
Original file line numberDiff line numberDiff line change
@@ -2023,6 +2023,25 @@ const function_generic_t function_list[] = {
20232023
};
20242024
const int function_flags = CLUSTER_FLAG_INIT_FUNCTION;
20252025

2026+
static bool check_feature_map(uint32_t features) {
2027+
if((features & feature::other::get_id()) == feature::other::get_id())
2028+
return true;
2029+
if((features & feature::passive_infrared::get_id()) == feature::passive_infrared::get_id())
2030+
return true;
2031+
if((features & feature::ultrasonic::get_id()) == feature::ultrasonic::get_id())
2032+
return true;
2033+
if((features & feature::physical_contact::get_id()) == feature::physical_contact::get_id())
2034+
return true;
2035+
if((features & feature::active_infrared::get_id()) == feature::active_infrared::get_id())
2036+
return true;
2037+
if((features & feature::radar::get_id()) == feature::radar::get_id())
2038+
return true;
2039+
if((features & feature::rf_sensing::get_id()) == feature::rf_sensing::get_id())
2040+
return true;
2041+
if((features & feature::vision::get_id()) == feature::vision::get_id())
2042+
return true;
2043+
return false;
2044+
}
20262045
cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags)
20272046
{
20282047
cluster_t *cluster = cluster::create(endpoint, OccupancySensing::Id, flags);
@@ -2051,6 +2070,34 @@ cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags)
20512070
create_default_binding_cluster(endpoint);
20522071
}
20532072

2073+
if(config != nullptr && check_feature_map(config->features)) {
2074+
if (config->features & feature::other::get_id()) {
2075+
feature::other::add(cluster);
2076+
}
2077+
if (config->features & feature::passive_infrared::get_id()) {
2078+
feature::passive_infrared::add(cluster);
2079+
}
2080+
if (config->features & feature::ultrasonic::get_id()) {
2081+
feature::ultrasonic::add(cluster);
2082+
}
2083+
if (config->features & feature::physical_contact::get_id()) {
2084+
feature::physical_contact::add(cluster);
2085+
}
2086+
if (config->features & feature::active_infrared::get_id()) {
2087+
feature::active_infrared::add(cluster);
2088+
}
2089+
if (config->features & feature::radar::get_id()) {
2090+
feature::radar::add(cluster);
2091+
}
2092+
if (config->features & feature::rf_sensing::get_id()) {
2093+
feature::rf_sensing::add(cluster);
2094+
}
2095+
if (config->features & feature::vision::get_id()) {
2096+
feature::vision::add(cluster);
2097+
}
2098+
} else {
2099+
ESP_LOGE(TAG, "Config is NULL or mandatory features are missing.");
2100+
}
20542101
return cluster;
20552102
}
20562103
} /* occupancy_sensing */
@@ -2326,6 +2373,20 @@ const function_generic_t function_list[] = {
23262373
const int function_flags =
23272374
CLUSTER_FLAG_INIT_FUNCTION | CLUSTER_FLAG_ATTRIBUTE_CHANGED_FUNCTION | CLUSTER_FLAG_PRE_ATTRIBUTE_CHANGED_FUNCTION;
23282375

2376+
static bool check_feature_map(uint32_t features) {
2377+
if ((features & feature::constant_pressure::get_id()) == feature::constant_pressure::get_id())
2378+
return true;
2379+
if ((features & feature::compensated_pressure::get_id()) == feature::compensated_pressure::get_id())
2380+
return true;
2381+
if ((features & feature::constant_flow::get_id()) == feature::constant_flow::get_id())
2382+
return true;
2383+
if ((features & feature::constant_speed::get_id()) == feature::constant_speed::get_id())
2384+
return true;
2385+
if ((features & feature::constant_temperature::get_id()) == feature::constant_temperature::get_id())
2386+
return true;
2387+
return false;
2388+
}
2389+
23292390
cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags)
23302391
{
23312392
cluster_t *cluster = cluster::create(endpoint, PumpConfigurationAndControl::Id, flags);
@@ -2357,6 +2418,31 @@ cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags)
23572418
create_default_binding_cluster(endpoint);
23582419
}
23592420

2421+
if(config != nullptr && check_feature_map(config->features)) {
2422+
if (config->features & feature::constant_pressure::get_id()) {
2423+
feature::constant_pressure::add(cluster, &config->constant_pressure);
2424+
}
2425+
if (config->features & feature::compensated_pressure::get_id()) {
2426+
feature::compensated_pressure::add(cluster, &config->compensated_pressure);
2427+
}
2428+
if (config->features & feature::constant_flow::get_id()) {
2429+
feature::constant_flow::add(cluster, &config->constant_flow);
2430+
}
2431+
if (config->features & feature::constant_speed::get_id()) {
2432+
feature::constant_speed::add(cluster, &config->constant_speed);
2433+
}
2434+
if (config->features & feature::constant_temperature::get_id()) {
2435+
feature::constant_temperature::add(cluster, &config->constant_temperature);
2436+
}
2437+
if (config->features & feature::automatic::get_id()) {
2438+
feature::automatic::add(cluster);
2439+
}
2440+
if (config->features & feature::local_operation::get_id()) {
2441+
feature::local_operation::add(cluster);
2442+
}
2443+
} else {
2444+
ESP_LOGE(TAG, "Config is NULL or mandatory features are missing.");
2445+
}
23602446
return cluster;
23612447
}
23622448
} /* pump_configuration_and_control */
@@ -2563,6 +2649,7 @@ cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags)
25632649

25642650
/* Commands */
25652651
mode_base::command::create_change_to_mode(cluster);
2652+
mode_base::command::create_change_to_mode_response(cluster);
25662653

25672654
return cluster;
25682655
}
@@ -2600,6 +2687,7 @@ cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags)
26002687

26012688
/* Commands */
26022689
mode_base::command::create_change_to_mode(cluster);
2690+
mode_base::command::create_change_to_mode_response(cluster);
26032691

26042692
return cluster;
26052693
}
@@ -2636,6 +2724,7 @@ cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags)
26362724

26372725
/* Commands */
26382726
mode_base::command::create_change_to_mode(cluster);
2727+
mode_base::command::create_change_to_mode_response(cluster);
26392728

26402729
return cluster;
26412730
}
@@ -2728,6 +2817,12 @@ cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags)
27282817
/* Attributes managed internally */
27292818
global::attribute::create_feature_map(cluster, 0);
27302819

2820+
operational_state::attribute::create_phase_list(cluster, NULL, 0, 0);
2821+
operational_state::attribute::create_current_phase(cluster, 0);
2822+
operational_state::attribute::create_operational_state_list(cluster, NULL, 0, 0);
2823+
operational_state::attribute::create_operational_state(cluster, 0);
2824+
operational_state::attribute::create_operational_error(cluster, 0);
2825+
27312826
/* Attributes not managed internally */
27322827
global::attribute::create_cluster_revision(cluster, cluster_revision);
27332828
}
@@ -2949,6 +3044,7 @@ cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags)
29493044

29503045
/* Commands */
29513046
mode_base::command::create_change_to_mode(cluster);
3047+
mode_base::command::create_change_to_mode_response(cluster);
29523048

29533049
return cluster;
29543050
}
@@ -3152,6 +3248,7 @@ cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags)
31523248
}
31533249

31543250
/* Commands */
3251+
mode_base::command::create_change_to_mode_response(cluster);
31553252
mode_base::command::create_change_to_mode(cluster);
31563253

31573254
return cluster;
@@ -3365,7 +3462,7 @@ cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags, uint32_
33653462
global::attribute::create_cluster_revision(cluster, cluster_revision);
33663463
attribute::create_heater_types(cluster, config->heater_types);
33673464
attribute::create_heat_demand(cluster, config->heat_demand);
3368-
attribute::create_tank_volume(cluster, config->tank_volume);
3465+
attribute::create_boost_state(cluster, config->boost_state);
33693466
}
33703467

33713468
if (features & feature::energy_management::get_id()) {
@@ -3416,6 +3513,7 @@ cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags)
34163513

34173514
/* Commands */
34183515
mode_base::command::create_change_to_mode(cluster);
3516+
mode_base::command::create_change_to_mode_response(cluster);
34193517

34203518
return cluster;
34213519
}

components/esp_matter/esp_matter_cluster.h

+13-5
Original file line numberDiff line numberDiff line change
@@ -592,8 +592,9 @@ typedef struct config {
592592
uint8_t occupancy;
593593
uint8_t occupancy_sensor_type;
594594
uint8_t occupancy_sensor_type_bitmap;
595+
uint32_t features;
595596
config() : occupancy(0), occupancy_sensor_type(0),
596-
occupancy_sensor_type_bitmap(0) {}
597+
occupancy_sensor_type_bitmap(0), features(0) {}
597598
} config_t;
598599

599600
cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags);
@@ -685,12 +686,18 @@ typedef struct config {
685686
nullable<int16_t> capacity;
686687
// Pump Settings Attributes
687688
uint8_t operation_mode;
689+
feature::constant_pressure::config_t constant_pressure;
690+
feature::compensated_pressure::config_t compensated_pressure;
691+
feature::constant_flow::config_t constant_flow;
692+
feature::constant_speed::config_t constant_speed;
693+
feature::constant_temperature::config_t constant_temperature;
694+
uint32_t features;
688695
config(
689696
nullable<int16_t> max_pressure = nullable<int16_t>(),
690697
nullable<uint16_t> max_speed = nullable<uint16_t>(),
691698
nullable<uint16_t> max_flow = nullable<uint16_t>()
692699
) : max_pressure(max_pressure), max_speed(max_speed), max_flow(max_flow),
693-
effective_operation_mode(0), effective_control_mode(0), capacity(), operation_mode(0) {}
700+
effective_operation_mode(0), effective_control_mode(0), capacity(), operation_mode(0), features(0) {}
694701
} config_t;
695702

696703
cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags);
@@ -714,7 +721,8 @@ typedef struct config {
714721
feature::temperature_number::config_t temperature_number;
715722
feature::temperature_level::config_t temperature_level;
716723
feature::temperature_step::config_t temperature_step;
717-
// Empty config for API consistency
724+
uint32_t features;
725+
config() : features(0) {}
718726
} config_t;
719727

720728
cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags, uint32_t features);
@@ -915,11 +923,11 @@ namespace water_heater_management {
915923
typedef struct config {
916924
uint8_t heater_types;
917925
uint8_t heat_demand;
918-
uint8_t tank_volume;
926+
uint8_t boost_state;
919927
void *delegate;
920928
feature::energy_management::config_t energy_management;
921929
feature::tank_percent::config_t tank_percent;
922-
config() : heater_types(0), heat_demand(0), tank_volume(0), delegate(nullptr) {}
930+
config() : heater_types(0), heat_demand(0), boost_state(0), delegate(nullptr) {}
923931
} config_t;
924932

925933
cluster_t *create(endpoint_t *endpoint, config_t *config, uint8_t flags, uint32_t features);

components/esp_matter/esp_matter_command.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ command_t *create_reset_condition(cluster_t *cluster);
395395
namespace mode_base {
396396
namespace command {
397397
command_t *create_change_to_mode(cluster_t *cluster);
398-
command_t *create_change_to_mode_response(cluster_t *cluster, uint16_t command_id);
398+
command_t *create_change_to_mode_response(cluster_t *cluster);
399399
} /* command */
400400
} /* mode_base */
401401

components/esp_matter/esp_matter_endpoint.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1414,7 +1414,7 @@ esp_err_t add(endpoint_t *endpoint, config_t *config)
14141414
return err;
14151415
}
14161416

1417-
temperature_control::create(endpoint, &(config->temperature_control), CLUSTER_FLAG_SERVER, ESP_MATTER_NONE_FEATURE_ID);
1417+
temperature_control::create(endpoint, &(config->temperature_control), CLUSTER_FLAG_SERVER, temperature_control::feature::temperature_number::get_id());
14181418

14191419
return ESP_OK;
14201420
}

0 commit comments

Comments
 (0)