Skip to content

Commit 434aa0b

Browse files
committed
Merge branch 'pr_863' into 'main'
[GH_PR] support r/w floating(single) value type (CON-1077) See merge request app-frameworks/esp-matter!674
2 parents dda2d77 + f913c85 commit 434aa0b

7 files changed

+741
-628
lines changed

components/esp_matter/esp_matter_attribute.cpp

+219-219
Large diffs are not rendered by default.

components/esp_matter/esp_matter_attribute.h

+60-60
Original file line numberDiff line numberDiff line change
@@ -479,14 +479,14 @@ attribute_t *create_replacement_product_list(cluster_t *cluster, uint8_t *value,
479479

480480
namespace carbon_monoxide_concentration_measurement {
481481
namespace attribute {
482-
attribute_t *create_measured_value(cluster_t *cluster, nullable<uint16_t> value);
483-
attribute_t *create_min_measured_value(cluster_t *cluster, nullable<uint16_t> value);
484-
attribute_t *create_max_measured_value(cluster_t *cluster, nullable<uint16_t> value);
485-
attribute_t *create_peak_measured_value(cluster_t *cluster, nullable<uint16_t> value);
482+
attribute_t *create_measured_value(cluster_t *cluster, nullable<float> value);
483+
attribute_t *create_min_measured_value(cluster_t *cluster, nullable<float> value);
484+
attribute_t *create_max_measured_value(cluster_t *cluster, nullable<float> value);
485+
attribute_t *create_peak_measured_value(cluster_t *cluster, nullable<float> value);
486486
attribute_t *create_peak_measured_value_window(cluster_t *cluster, uint32_t value);
487-
attribute_t *create_average_measured_value(cluster_t *cluster, nullable<uint16_t> value);
487+
attribute_t *create_average_measured_value(cluster_t *cluster, nullable<float> value);
488488
attribute_t *create_average_measured_value_window(cluster_t *cluster, uint32_t value);
489-
attribute_t *create_uncertainty(cluster_t *cluster, uint16_t value);
489+
attribute_t *create_uncertainty(cluster_t *cluster, float value);
490490
attribute_t *create_measurement_unit(cluster_t *cluster, uint8_t value);
491491
attribute_t *create_measurement_medium(cluster_t *cluster, uint8_t value);
492492
attribute_t *create_level_value(cluster_t *cluster, uint8_t value);
@@ -495,14 +495,14 @@ attribute_t *create_level_value(cluster_t *cluster, uint8_t value);
495495

496496
namespace carbon_dioxide_concentration_measurement {
497497
namespace attribute {
498-
attribute_t *create_measured_value(cluster_t *cluster, nullable<uint16_t> value);
499-
attribute_t *create_min_measured_value(cluster_t *cluster, nullable<uint16_t> value);
500-
attribute_t *create_max_measured_value(cluster_t *cluster, nullable<uint16_t> value);
501-
attribute_t *create_peak_measured_value(cluster_t *cluster, nullable<uint16_t> value);
498+
attribute_t *create_measured_value(cluster_t *cluster, nullable<float> value);
499+
attribute_t *create_min_measured_value(cluster_t *cluster, nullable<float> value);
500+
attribute_t *create_max_measured_value(cluster_t *cluster, nullable<float> value);
501+
attribute_t *create_peak_measured_value(cluster_t *cluster, nullable<float> value);
502502
attribute_t *create_peak_measured_value_window(cluster_t *cluster, uint32_t value);
503-
attribute_t *create_average_measured_value(cluster_t *cluster, nullable<uint16_t> value);
503+
attribute_t *create_average_measured_value(cluster_t *cluster, nullable<float> value);
504504
attribute_t *create_average_measured_value_window(cluster_t *cluster, uint32_t value);
505-
attribute_t *create_uncertainty(cluster_t *cluster, uint16_t value);
505+
attribute_t *create_uncertainty(cluster_t *cluster, float value);
506506
attribute_t *create_measurement_unit(cluster_t *cluster, uint8_t value);
507507
attribute_t *create_measurement_medium(cluster_t *cluster, uint8_t value);
508508
attribute_t *create_level_value(cluster_t *cluster, uint8_t value);
@@ -511,14 +511,14 @@ attribute_t *create_level_value(cluster_t *cluster, uint8_t value);
511511

512512
namespace nitrogen_dioxide_concentration_measurement {
513513
namespace attribute {
514-
attribute_t *create_measured_value(cluster_t *cluster, nullable<uint16_t> value);
515-
attribute_t *create_min_measured_value(cluster_t *cluster, nullable<uint16_t> value);
516-
attribute_t *create_max_measured_value(cluster_t *cluster, nullable<uint16_t> value);
517-
attribute_t *create_peak_measured_value(cluster_t *cluster, nullable<uint16_t> value);
514+
attribute_t *create_measured_value(cluster_t *cluster, nullable<float> value);
515+
attribute_t *create_min_measured_value(cluster_t *cluster, nullable<float> value);
516+
attribute_t *create_max_measured_value(cluster_t *cluster, nullable<float> value);
517+
attribute_t *create_peak_measured_value(cluster_t *cluster, nullable<float> value);
518518
attribute_t *create_peak_measured_value_window(cluster_t *cluster, uint32_t value);
519-
attribute_t *create_average_measured_value(cluster_t *cluster, nullable<uint16_t> value);
519+
attribute_t *create_average_measured_value(cluster_t *cluster, nullable<float> value);
520520
attribute_t *create_average_measured_value_window(cluster_t *cluster, uint32_t value);
521-
attribute_t *create_uncertainty(cluster_t *cluster, uint16_t value);
521+
attribute_t *create_uncertainty(cluster_t *cluster, float value);
522522
attribute_t *create_measurement_unit(cluster_t *cluster, uint8_t value);
523523
attribute_t *create_measurement_medium(cluster_t *cluster, uint8_t value);
524524
attribute_t *create_level_value(cluster_t *cluster, uint8_t value);
@@ -527,14 +527,14 @@ attribute_t *create_level_value(cluster_t *cluster, uint8_t value);
527527

528528
namespace ozone_concentration_measurement {
529529
namespace attribute {
530-
attribute_t *create_measured_value(cluster_t *cluster, nullable<uint16_t> value);
531-
attribute_t *create_min_measured_value(cluster_t *cluster, nullable<uint16_t> value);
532-
attribute_t *create_max_measured_value(cluster_t *cluster, nullable<uint16_t> value);
533-
attribute_t *create_peak_measured_value(cluster_t *cluster, nullable<uint16_t> value);
530+
attribute_t *create_measured_value(cluster_t *cluster, nullable<float> value);
531+
attribute_t *create_min_measured_value(cluster_t *cluster, nullable<float> value);
532+
attribute_t *create_max_measured_value(cluster_t *cluster, nullable<float> value);
533+
attribute_t *create_peak_measured_value(cluster_t *cluster, nullable<float> value);
534534
attribute_t *create_peak_measured_value_window(cluster_t *cluster, uint32_t value);
535-
attribute_t *create_average_measured_value(cluster_t *cluster, nullable<uint16_t> value);
535+
attribute_t *create_average_measured_value(cluster_t *cluster, nullable<float> value);
536536
attribute_t *create_average_measured_value_window(cluster_t *cluster, uint32_t value);
537-
attribute_t *create_uncertainty(cluster_t *cluster, uint16_t value);
537+
attribute_t *create_uncertainty(cluster_t *cluster, float value);
538538
attribute_t *create_measurement_unit(cluster_t *cluster, uint8_t value);
539539
attribute_t *create_measurement_medium(cluster_t *cluster, uint8_t value);
540540
attribute_t *create_level_value(cluster_t *cluster, uint8_t value);
@@ -543,14 +543,14 @@ attribute_t *create_level_value(cluster_t *cluster, uint8_t value);
543543

544544
namespace formaldehyde_concentration_measurement {
545545
namespace attribute {
546-
attribute_t *create_measured_value(cluster_t *cluster, nullable<uint16_t> value);
547-
attribute_t *create_min_measured_value(cluster_t *cluster, nullable<uint16_t> value);
548-
attribute_t *create_max_measured_value(cluster_t *cluster, nullable<uint16_t> value);
549-
attribute_t *create_peak_measured_value(cluster_t *cluster, nullable<uint16_t> value);
546+
attribute_t *create_measured_value(cluster_t *cluster, nullable<float> value);
547+
attribute_t *create_min_measured_value(cluster_t *cluster, nullable<float> value);
548+
attribute_t *create_max_measured_value(cluster_t *cluster, nullable<float> value);
549+
attribute_t *create_peak_measured_value(cluster_t *cluster, nullable<float> value);
550550
attribute_t *create_peak_measured_value_window(cluster_t *cluster, uint32_t value);
551-
attribute_t *create_average_measured_value(cluster_t *cluster, nullable<uint16_t> value);
551+
attribute_t *create_average_measured_value(cluster_t *cluster, nullable<float> value);
552552
attribute_t *create_average_measured_value_window(cluster_t *cluster, uint32_t value);
553-
attribute_t *create_uncertainty(cluster_t *cluster, uint16_t value);
553+
attribute_t *create_uncertainty(cluster_t *cluster, float value);
554554
attribute_t *create_measurement_unit(cluster_t *cluster, uint8_t value);
555555
attribute_t *create_measurement_medium(cluster_t *cluster, uint8_t value);
556556
attribute_t *create_level_value(cluster_t *cluster, uint8_t value);
@@ -559,14 +559,14 @@ attribute_t *create_level_value(cluster_t *cluster, uint8_t value);
559559

560560
namespace pm1_concentration_measurement {
561561
namespace attribute {
562-
attribute_t *create_measured_value(cluster_t *cluster, nullable<uint16_t> value);
563-
attribute_t *create_min_measured_value(cluster_t *cluster, nullable<uint16_t> value);
564-
attribute_t *create_max_measured_value(cluster_t *cluster, nullable<uint16_t> value);
565-
attribute_t *create_peak_measured_value(cluster_t *cluster, nullable<uint16_t> value);
562+
attribute_t *create_measured_value(cluster_t *cluster, nullable<float> value);
563+
attribute_t *create_min_measured_value(cluster_t *cluster, nullable<float> value);
564+
attribute_t *create_max_measured_value(cluster_t *cluster, nullable<float> value);
565+
attribute_t *create_peak_measured_value(cluster_t *cluster, nullable<float> value);
566566
attribute_t *create_peak_measured_value_window(cluster_t *cluster, uint32_t value);
567-
attribute_t *create_average_measured_value(cluster_t *cluster, nullable<uint16_t> value);
567+
attribute_t *create_average_measured_value(cluster_t *cluster, nullable<float> value);
568568
attribute_t *create_average_measured_value_window(cluster_t *cluster, uint32_t value);
569-
attribute_t *create_uncertainty(cluster_t *cluster, uint16_t value);
569+
attribute_t *create_uncertainty(cluster_t *cluster, float value);
570570
attribute_t *create_measurement_unit(cluster_t *cluster, uint8_t value);
571571
attribute_t *create_measurement_medium(cluster_t *cluster, uint8_t value);
572572
attribute_t *create_level_value(cluster_t *cluster, uint8_t value);
@@ -575,14 +575,14 @@ attribute_t *create_level_value(cluster_t *cluster, uint8_t value);
575575

576576
namespace pm25_concentration_measurement {
577577
namespace attribute {
578-
attribute_t *create_measured_value(cluster_t *cluster, nullable<uint16_t> value);
579-
attribute_t *create_min_measured_value(cluster_t *cluster, nullable<uint16_t> value);
580-
attribute_t *create_max_measured_value(cluster_t *cluster, nullable<uint16_t> value);
581-
attribute_t *create_peak_measured_value(cluster_t *cluster, nullable<uint16_t> value);
578+
attribute_t *create_measured_value(cluster_t *cluster, nullable<float> value);
579+
attribute_t *create_min_measured_value(cluster_t *cluster, nullable<float> value);
580+
attribute_t *create_max_measured_value(cluster_t *cluster, nullable<float> value);
581+
attribute_t *create_peak_measured_value(cluster_t *cluster, nullable<float> value);
582582
attribute_t *create_peak_measured_value_window(cluster_t *cluster, uint32_t value);
583-
attribute_t *create_average_measured_value(cluster_t *cluster, nullable<uint16_t> value);
583+
attribute_t *create_average_measured_value(cluster_t *cluster, nullable<float> value);
584584
attribute_t *create_average_measured_value_window(cluster_t *cluster, uint32_t value);
585-
attribute_t *create_uncertainty(cluster_t *cluster, uint16_t value);
585+
attribute_t *create_uncertainty(cluster_t *cluster, float value);
586586
attribute_t *create_measurement_unit(cluster_t *cluster, uint8_t value);
587587
attribute_t *create_measurement_medium(cluster_t *cluster, uint8_t value);
588588
attribute_t *create_level_value(cluster_t *cluster, uint8_t value);
@@ -591,14 +591,14 @@ attribute_t *create_level_value(cluster_t *cluster, uint8_t value);
591591

592592
namespace pm10_concentration_measurement {
593593
namespace attribute {
594-
attribute_t *create_measured_value(cluster_t *cluster, nullable<uint16_t> value);
595-
attribute_t *create_min_measured_value(cluster_t *cluster, nullable<uint16_t> value);
596-
attribute_t *create_max_measured_value(cluster_t *cluster, nullable<uint16_t> value);
597-
attribute_t *create_peak_measured_value(cluster_t *cluster, nullable<uint16_t> value);
594+
attribute_t *create_measured_value(cluster_t *cluster, nullable<float> value);
595+
attribute_t *create_min_measured_value(cluster_t *cluster, nullable<float> value);
596+
attribute_t *create_max_measured_value(cluster_t *cluster, nullable<float> value);
597+
attribute_t *create_peak_measured_value(cluster_t *cluster, nullable<float> value);
598598
attribute_t *create_peak_measured_value_window(cluster_t *cluster, uint32_t value);
599-
attribute_t *create_average_measured_value(cluster_t *cluster, nullable<uint16_t> value);
599+
attribute_t *create_average_measured_value(cluster_t *cluster, nullable<float> value);
600600
attribute_t *create_average_measured_value_window(cluster_t *cluster, uint32_t value);
601-
attribute_t *create_uncertainty(cluster_t *cluster, uint16_t value);
601+
attribute_t *create_uncertainty(cluster_t *cluster, float value);
602602
attribute_t *create_measurement_unit(cluster_t *cluster, uint8_t value);
603603
attribute_t *create_measurement_medium(cluster_t *cluster, uint8_t value);
604604
attribute_t *create_level_value(cluster_t *cluster, uint8_t value);
@@ -607,14 +607,14 @@ attribute_t *create_level_value(cluster_t *cluster, uint8_t value);
607607

608608
namespace radon_concentration_measurement {
609609
namespace attribute {
610-
attribute_t *create_measured_value(cluster_t *cluster, nullable<uint16_t> value);
611-
attribute_t *create_min_measured_value(cluster_t *cluster, nullable<uint16_t> value);
612-
attribute_t *create_max_measured_value(cluster_t *cluster, nullable<uint16_t> value);
613-
attribute_t *create_peak_measured_value(cluster_t *cluster, nullable<uint16_t> value);
610+
attribute_t *create_measured_value(cluster_t *cluster, nullable<float> value);
611+
attribute_t *create_min_measured_value(cluster_t *cluster, nullable<float> value);
612+
attribute_t *create_max_measured_value(cluster_t *cluster, nullable<float> value);
613+
attribute_t *create_peak_measured_value(cluster_t *cluster, nullable<float> value);
614614
attribute_t *create_peak_measured_value_window(cluster_t *cluster, uint32_t value);
615-
attribute_t *create_average_measured_value(cluster_t *cluster, nullable<uint16_t> value);
615+
attribute_t *create_average_measured_value(cluster_t *cluster, nullable<float> value);
616616
attribute_t *create_average_measured_value_window(cluster_t *cluster, uint32_t value);
617-
attribute_t *create_uncertainty(cluster_t *cluster, uint16_t value);
617+
attribute_t *create_uncertainty(cluster_t *cluster, float value);
618618
attribute_t *create_measurement_unit(cluster_t *cluster, uint8_t value);
619619
attribute_t *create_measurement_medium(cluster_t *cluster, uint8_t value);
620620
attribute_t *create_level_value(cluster_t *cluster, uint8_t value);
@@ -623,14 +623,14 @@ attribute_t *create_level_value(cluster_t *cluster, uint8_t value);
623623

624624
namespace total_volatile_organic_compounds_concentration_measurement {
625625
namespace attribute {
626-
attribute_t *create_measured_value(cluster_t *cluster, nullable<uint16_t> value);
627-
attribute_t *create_min_measured_value(cluster_t *cluster, nullable<uint16_t> value);
628-
attribute_t *create_max_measured_value(cluster_t *cluster, nullable<uint16_t> value);
629-
attribute_t *create_peak_measured_value(cluster_t *cluster, nullable<uint16_t> value);
626+
attribute_t *create_measured_value(cluster_t *cluster, nullable<float> value);
627+
attribute_t *create_min_measured_value(cluster_t *cluster, nullable<float> value);
628+
attribute_t *create_max_measured_value(cluster_t *cluster, nullable<float> value);
629+
attribute_t *create_peak_measured_value(cluster_t *cluster, nullable<float> value);
630630
attribute_t *create_peak_measured_value_window(cluster_t *cluster, uint32_t value);
631-
attribute_t *create_average_measured_value(cluster_t *cluster, nullable<uint16_t> value);
631+
attribute_t *create_average_measured_value(cluster_t *cluster, nullable<float> value);
632632
attribute_t *create_average_measured_value_window(cluster_t *cluster, uint32_t value);
633-
attribute_t *create_uncertainty(cluster_t *cluster, uint16_t value);
633+
attribute_t *create_uncertainty(cluster_t *cluster, float value);
634634
attribute_t *create_measurement_unit(cluster_t *cluster, uint8_t value);
635635
attribute_t *create_measurement_medium(cluster_t *cluster, uint8_t value);
636636
attribute_t *create_level_value(cluster_t *cluster, uint8_t value);

components/esp_matter/esp_matter_attribute_utils.cpp

+42
Original file line numberDiff line numberDiff line change
@@ -709,6 +709,18 @@ static esp_err_t console_set_handler(int argc, char **argv)
709709
uint16_t value = atoi(argv[3]);
710710
val = esp_matter_enum16(value);
711711
}
712+
} else if (type == ESP_MATTER_VAL_TYPE_FLOAT) {
713+
if (matter_attribute->IsNullable()) {
714+
if (strncmp(argv[3], "null", sizeof("null")) == 0) {
715+
val = esp_matter_nullable_float(nullable<float>());
716+
} else {
717+
float value = (float)atof(argv[3]);
718+
val = esp_matter_nullable_float(value);
719+
}
720+
} else {
721+
float value = (float)atof(argv[3]);
722+
val = esp_matter_float(value);
723+
}
712724
} else {
713725
ESP_LOGE(TAG, "Type not handled: %d", type);
714726
return ESP_ERR_INVALID_ARG;
@@ -935,6 +947,20 @@ static esp_err_t console_get_handler(int argc, char **argv)
935947
} else {
936948
val = esp_matter_enum16(Traits::StorageToWorking(value));
937949
}
950+
} else if (type == ESP_MATTER_VAL_TYPE_FLOAT) {
951+
using Traits = chip::app::NumericAttributeTraits<float>;
952+
Traits::StorageType value;
953+
uint8_t *read_able = Traits::ToAttributeStoreRepresentation(value);
954+
get_val_raw(endpoint_id, cluster_id, attribute_id, read_able, sizeof(value));
955+
if (matter_attribute->IsNullable()) {
956+
if (Traits::IsNullValue(value)) {
957+
val = esp_matter_nullable_float(nullable<float>());
958+
} else {
959+
val = esp_matter_nullable_float(Traits::StorageToWorking(value));
960+
}
961+
} else {
962+
val = esp_matter_float(Traits::StorageToWorking(value));
963+
}
938964
} else {
939965
ESP_LOGE(TAG, "Type not handled: %d", type);
940966
return ESP_ERR_INVALID_ARG;
@@ -1828,6 +1854,22 @@ static esp_err_t get_attr_val_from_data(esp_matter_attr_val_t *val, EmberAfAttri
18281854
break;
18291855
}
18301856

1857+
case ZCL_SINGLE_ATTRIBUTE_TYPE: {
1858+
using Traits = chip::app::NumericAttributeTraits<float>;
1859+
Traits::StorageType attribute_value;
1860+
memcpy((float *)&attribute_value, value, sizeof(Traits::StorageType));
1861+
if (attribute_metadata->IsNullable()) {
1862+
if (Traits::IsNullValue(attribute_value)) {
1863+
*val = esp_matter_nullable_float(nullable<float>());
1864+
} else {
1865+
*val = esp_matter_nullable_float(attribute_value);
1866+
}
1867+
} else {
1868+
*val = esp_matter_float(attribute_value);
1869+
}
1870+
break;
1871+
}
1872+
18311873
default:
18321874
*val = esp_matter_invalid(NULL);
18331875
break;

0 commit comments

Comments
 (0)