From b5952ed4ac715480d16e14fb6373dd5e28e0344d Mon Sep 17 00:00:00 2001 From: yuanjm Date: Wed, 7 Jul 2021 11:59:27 +0800 Subject: [PATCH] esp_rmaker_param: Fix for a 4000 byte limitation on persistent param values Parameters with PROP_FLAG_PERSIST could not be stored to NVS if their size was greater 4000 bytes since they were getting stored as strings. Changed them to blobs, which allows much higher limit. This does not break any existing devices since the firmware code checks for blobs as well as strings for backward compatibility. --- .../esp_rainmaker/src/core/esp_rmaker_param.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/components/esp_rainmaker/src/core/esp_rmaker_param.c b/components/esp_rainmaker/src/core/esp_rmaker_param.c index 4d114b5..b2a569a 100644 --- a/components/esp_rainmaker/src/core/esp_rmaker_param.c +++ b/components/esp_rainmaker/src/core/esp_rmaker_param.c @@ -393,7 +393,18 @@ esp_err_t esp_rmaker_param_get_stored_value(_esp_rmaker_param_t *param, esp_rmak if ((param->val.type == RMAKER_VAL_TYPE_STRING) || (param->val.type == RMAKER_VAL_TYPE_OBJECT) || (param->val.type == RMAKER_VAL_TYPE_ARRAY)) { size_t len = 0; - if ((err = nvs_get_str(handle, param->name, NULL, &len)) == ESP_OK) { + if ((err = nvs_get_blob(handle, param->name, NULL, &len)) == ESP_OK) { + char *s_val = calloc(1, len + 1); + if (!s_val) { + err = ESP_ERR_NO_MEM; + } else { + nvs_get_blob(handle, param->name, s_val, &len); + s_val[len] = '\0'; + val->type = param->val.type; + val->val.s = s_val; + } + } else if ((err = nvs_get_str(handle, param->name, NULL, &len)) == ESP_OK) { + /* In order to be compatible with the previous nvs_set_str() */ char *s_val = calloc(1, len); if (!s_val) { err = ESP_ERR_NO_MEM; @@ -425,7 +436,7 @@ esp_err_t esp_rmaker_param_store_value(_esp_rmaker_param_t *param) (param->val.type == RMAKER_VAL_TYPE_ARRAY)) { /* Store only if value is not NULL */ if (param->val.val.s) { - err = nvs_set_str(handle, param->name, param->val.val.s); + err = nvs_set_blob(handle, param->name, param->val.val.s, strlen(param->val.val.s)); nvs_commit(handle); } else { err = ESP_OK;