mirror of
https://github.com/espressif/esp-matter.git
synced 2026-04-27 19:13:13 +00:00
Merge branch 'nvs_primitive_apis' into 'main'
core: Use NVS APIs to get/set attributes with primitive datatype See merge request app-frameworks/esp-matter!347
This commit is contained in:
@@ -1,3 +1,13 @@
|
||||
# 14-April-2023
|
||||
|
||||
#### *Changed how attribute data is stored in NVS*
|
||||
By default primitive data types are stored as blob and that consumes more space in NVS.
|
||||
Added a configuration option (`CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE`) which uses
|
||||
the primitive data type specific NVS APIs to store the attribute. This saves space in NVS partition.
|
||||
|
||||
Newer developements shall enable option `ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE` to save on NVS space.
|
||||
All the examples have this option enabled.
|
||||
|
||||
# 7-April-2023
|
||||
|
||||
- `tools/mfg_tool/mfg_tool.py` now uses `connectedhomeip/connectedhomeip/src/setup_payload/python/generate_setup_payload.py` instead of previously used compiled `chip-tool` binary executable which additionally depends on `python-stdnum` module.
|
||||
|
||||
@@ -99,4 +99,16 @@ menu "ESP Matter"
|
||||
|
||||
endchoice #ESP_MATTER_MEM_ALLOC_MODE
|
||||
|
||||
config ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE
|
||||
bool "Use compact attribute storage"
|
||||
default n
|
||||
help
|
||||
Attributes can be stored as primitive data type or blob in NVS.
|
||||
This option lets you select which one to use.
|
||||
|
||||
If enabled, attributes are stored as primitive data types in NVS.
|
||||
If disabled, then attributes are stored as blob which consumes more space in NVS.
|
||||
|
||||
This option is kept disabled by default to maintain the backward compatibility.
|
||||
|
||||
endmenu
|
||||
|
||||
@@ -1054,6 +1054,7 @@ attribute_t *create(cluster_t *cluster, uint32_t attribute_id, uint8_t flags, es
|
||||
|
||||
if (attribute->flags & ATTRIBUTE_FLAG_NONVOLATILE) {
|
||||
esp_matter_attr_val_t val_nvs = esp_matter_invalid(NULL);
|
||||
val_nvs.type = val.type;
|
||||
esp_err_t err = get_val_from_nvs((attribute_t *)attribute, &val_nvs);
|
||||
if (err == ESP_OK) {
|
||||
set_val((attribute_t *)attribute, &val_nvs);
|
||||
@@ -1326,7 +1327,108 @@ esp_err_t store_val_in_nvs(attribute_t *attribute)
|
||||
err = ESP_OK;
|
||||
}
|
||||
} else {
|
||||
// Handling how to store attributes in NVS based on config option.
|
||||
#if CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE
|
||||
// This switch case handles primitive data types
|
||||
switch (current_attribute->val.type)
|
||||
{
|
||||
case ESP_MATTER_VAL_TYPE_BOOLEAN:
|
||||
{
|
||||
err = nvs_set_u8(handle, attribute_key, current_attribute->val.val.b != 0);
|
||||
break;
|
||||
}
|
||||
|
||||
case ESP_MATTER_VAL_TYPE_INTEGER:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_INTEGER:
|
||||
{
|
||||
err = nvs_set_i32(handle, attribute_key, current_attribute->val.val.i);
|
||||
break;
|
||||
}
|
||||
|
||||
// no nvs api to store float, storing as blob
|
||||
case ESP_MATTER_VAL_TYPE_FLOAT:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_FLOAT:
|
||||
{
|
||||
err = nvs_set_blob(handle, attribute_key, ¤t_attribute->val.val.f, sizeof(current_attribute->val.val.f));
|
||||
break;
|
||||
}
|
||||
|
||||
case ESP_MATTER_VAL_TYPE_INT8:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_INT8:
|
||||
{
|
||||
err = nvs_set_i8(handle, attribute_key, current_attribute->val.val.i8);
|
||||
break;
|
||||
}
|
||||
|
||||
case ESP_MATTER_VAL_TYPE_UINT8:
|
||||
case ESP_MATTER_VAL_TYPE_ENUM8:
|
||||
case ESP_MATTER_VAL_TYPE_BITMAP8:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_UINT8:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_ENUM8:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_BITMAP8:
|
||||
{
|
||||
err = nvs_set_u8(handle, attribute_key, current_attribute->val.val.u8);
|
||||
break;
|
||||
}
|
||||
|
||||
case ESP_MATTER_VAL_TYPE_INT16:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_INT16:
|
||||
{
|
||||
err = nvs_set_i16(handle, attribute_key, current_attribute->val.val.i16);
|
||||
break;
|
||||
}
|
||||
|
||||
case ESP_MATTER_VAL_TYPE_UINT16:
|
||||
case ESP_MATTER_VAL_TYPE_BITMAP16:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_UINT16:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_BITMAP16:
|
||||
{
|
||||
err = nvs_set_u16(handle, attribute_key, current_attribute->val.val.u16);
|
||||
break;
|
||||
}
|
||||
|
||||
case ESP_MATTER_VAL_TYPE_INT32:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_INT32:
|
||||
{
|
||||
err = nvs_set_i32(handle, attribute_key, current_attribute->val.val.i32);
|
||||
break;
|
||||
}
|
||||
|
||||
case ESP_MATTER_VAL_TYPE_UINT32:
|
||||
case ESP_MATTER_VAL_TYPE_BITMAP32:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_UINT32:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_BITMAP32:
|
||||
{
|
||||
err = nvs_set_u32(handle, attribute_key, current_attribute->val.val.u32);
|
||||
break;
|
||||
}
|
||||
|
||||
case ESP_MATTER_VAL_TYPE_INT64:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_INT64:
|
||||
{
|
||||
err = nvs_set_i64(handle, attribute_key, current_attribute->val.val.i64);
|
||||
break;
|
||||
}
|
||||
|
||||
case ESP_MATTER_VAL_TYPE_UINT64:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_UINT64:
|
||||
{
|
||||
err = nvs_set_u64(handle, attribute_key, current_attribute->val.val.u64);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
// handle the case where the type is not recognized
|
||||
err = ESP_ERR_INVALID_ARG;
|
||||
ESP_LOGE(TAG, "Invalid attribute type: %u", current_attribute->val.type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#else
|
||||
err = nvs_set_blob(handle, attribute_key, ¤t_attribute->val, sizeof(esp_matter_attr_val_t));
|
||||
#endif // CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE
|
||||
|
||||
nvs_commit(handle);
|
||||
}
|
||||
nvs_close(handle);
|
||||
@@ -1375,8 +1477,113 @@ esp_err_t get_val_from_nvs(attribute_t *attribute, esp_matter_attr_val_t *val)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Handling how to get attributes in NVS based on config option.
|
||||
#if CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE
|
||||
// This switch case handles primitive data types
|
||||
switch (current_attribute->val.type)
|
||||
{
|
||||
case ESP_MATTER_VAL_TYPE_BOOLEAN:
|
||||
{
|
||||
uint8_t b_val;
|
||||
if ((err = nvs_get_u8(handle, attribute_key, &b_val)) == ESP_OK)
|
||||
{
|
||||
val->val.b = (b_val != 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case ESP_MATTER_VAL_TYPE_INTEGER:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_INTEGER:
|
||||
{
|
||||
err = nvs_get_i32(handle, attribute_key, reinterpret_cast<int32_t *>(&val->val.i));
|
||||
break;
|
||||
}
|
||||
|
||||
// no nvs api to read float, since it is stored as blob, reading as blob
|
||||
case ESP_MATTER_VAL_TYPE_FLOAT:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_FLOAT:
|
||||
{
|
||||
size_t length = sizeof(val->val.f);
|
||||
err = nvs_get_blob(handle, attribute_key, &val->val.f, &length);
|
||||
break;
|
||||
}
|
||||
|
||||
case ESP_MATTER_VAL_TYPE_INT8:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_INT8:
|
||||
{
|
||||
err = nvs_get_i8(handle, attribute_key, &val->val.i8);
|
||||
break;
|
||||
}
|
||||
|
||||
case ESP_MATTER_VAL_TYPE_UINT8:
|
||||
case ESP_MATTER_VAL_TYPE_ENUM8:
|
||||
case ESP_MATTER_VAL_TYPE_BITMAP8:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_UINT8:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_ENUM8:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_BITMAP8:
|
||||
{
|
||||
err = nvs_get_u8(handle, attribute_key, &val->val.u8);
|
||||
break;
|
||||
}
|
||||
|
||||
case ESP_MATTER_VAL_TYPE_INT16:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_INT16:
|
||||
{
|
||||
err = nvs_get_i16(handle, attribute_key, &val->val.i16);
|
||||
break;
|
||||
}
|
||||
|
||||
case ESP_MATTER_VAL_TYPE_UINT16:
|
||||
case ESP_MATTER_VAL_TYPE_BITMAP16:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_UINT16:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_BITMAP16:
|
||||
{
|
||||
err = nvs_get_u16(handle, attribute_key, &val->val.u16);
|
||||
break;
|
||||
}
|
||||
|
||||
case ESP_MATTER_VAL_TYPE_INT32:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_INT32:
|
||||
{
|
||||
err = nvs_get_i32(handle, attribute_key, &val->val.i32);
|
||||
break;
|
||||
}
|
||||
|
||||
case ESP_MATTER_VAL_TYPE_UINT32:
|
||||
case ESP_MATTER_VAL_TYPE_BITMAP32:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_UINT32:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_BITMAP32:
|
||||
{
|
||||
err = nvs_get_u32(handle, attribute_key, &val->val.u32);
|
||||
break;
|
||||
}
|
||||
|
||||
case ESP_MATTER_VAL_TYPE_INT64:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_INT64:
|
||||
{
|
||||
err = nvs_get_i64(handle, attribute_key, &val->val.i64);
|
||||
break;
|
||||
}
|
||||
|
||||
case ESP_MATTER_VAL_TYPE_UINT64:
|
||||
case ESP_MATTER_VAL_TYPE_NULLABLE_UINT64:
|
||||
{
|
||||
err = nvs_get_u64(handle, attribute_key, &val->val.u64);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
// handle the case where the type is not recognized
|
||||
err = ESP_ERR_INVALID_ARG;
|
||||
ESP_LOGE(TAG, "Invalid attribute type: %u", current_attribute->val.type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#else
|
||||
size_t len = sizeof(esp_matter_attr_val_t);
|
||||
err = nvs_get_blob(handle, attribute_key, val, &len);
|
||||
#endif // CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE
|
||||
}
|
||||
nvs_close(handle);
|
||||
return err;
|
||||
|
||||
@@ -53,3 +53,6 @@ CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n
|
||||
|
||||
# Disable DS Peripheral
|
||||
CONFIG_ESP_SECURE_CERT_DS_PERIPHERAL=n
|
||||
|
||||
# Use compact attribute storage mode
|
||||
CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE=y
|
||||
|
||||
@@ -39,3 +39,6 @@ CONFIG_NUM_UDP_ENDPOINTS=16
|
||||
# Enable Controller and commissioner
|
||||
CONFIG_ESP_MATTER_CONTROLLER_ENABLE=y
|
||||
CONFIG_ESP_MATTER_COMMISSIONER_ENABLE=y
|
||||
|
||||
# Use compact attribute storage mode
|
||||
CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE=y
|
||||
|
||||
@@ -40,3 +40,6 @@ CONFIG_ESP_SECURE_CERT_DS_PERIPHERAL=n
|
||||
# Enable for fixed-label
|
||||
CONFIG_ENABLE_ESP32_FACTORY_DATA_PROVIDER=y
|
||||
CONFIG_ENABLE_ESP32_DEVICE_INFO_PROVIDER=y
|
||||
|
||||
# Use compact attribute storage mode
|
||||
CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE=y
|
||||
|
||||
@@ -37,3 +37,6 @@ CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n
|
||||
|
||||
# Disable DS Peripheral
|
||||
CONFIG_ESP_SECURE_CERT_DS_PERIPHERAL=n
|
||||
|
||||
# Use compact attribute storage mode
|
||||
CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE=y
|
||||
|
||||
@@ -37,3 +37,6 @@ CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n
|
||||
|
||||
# Disable DS Peripheral
|
||||
CONFIG_ESP_SECURE_CERT_DS_PERIPHERAL=n
|
||||
|
||||
# Use compact attribute storage mode
|
||||
CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE=y
|
||||
|
||||
@@ -40,3 +40,6 @@ CONFIG_ZB_RADIO_MACSPLIT_UART=y
|
||||
|
||||
# Disable DS Peripheral
|
||||
CONFIG_ESP_SECURE_CERT_DS_PERIPHERAL=n
|
||||
|
||||
# Use compact attribute storage mode
|
||||
CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE=y
|
||||
|
||||
Reference in New Issue
Block a user