diff --git a/easyflash/inc/easyflash.h b/easyflash/inc/easyflash.h index b8d0932..d88aab5 100644 --- a/easyflash/inc/easyflash.h +++ b/easyflash/inc/easyflash.h @@ -112,8 +112,12 @@ EfErrCode ef_env_set_default(void); size_t ef_get_env_write_bytes(void); EfErrCode ef_set_and_save_env(const char *key, const char *value); EfErrCode ef_del_and_save_env(const char *key); -void env_iterator_to_first(); -char env_iterator_next(char *key, void *value_buf, size_t *value_len); +/* iterator*/ +void ef_env_iterator_to_first(void); +char *ef_env_iterator_now_name(void); +size_t ef_env_iterator_now_value_len(void); +size_t ef_env_iterator_now_value(void *value_buf, size_t buf_len); +char ef_env_iterator_next(void); #endif #ifdef EF_USING_IAP diff --git a/easyflash/src/ef_env.c b/easyflash/src/ef_env.c index dd3ab00..680ea88 100644 --- a/easyflash/src/ef_env.c +++ b/easyflash/src/ef_env.c @@ -1166,17 +1166,56 @@ __retry: return empty_env; } -static struct env_iterator_obj obj; +static struct env_iterator_obj _g_env_iter_obj; /** * @brief Traversing from scratch * */ -void env_iterator_to_first() +void ef_env_iterator_to_first() { - obj.sector.addr = FAILED_ADDR; - obj.env.addr.start = FAILED_ADDR; + _g_env_iter_obj.sector.addr = FAILED_ADDR; + _g_env_iter_obj.env.addr.start = FAILED_ADDR; +} +/** + * @brief get the name of env now + * + * @return char* name + */ +char *ef_env_iterator_now_name() +{ + return _g_env_iter_obj.env.name; +} +/** + * @brief get the size of value + * + * @return size_t the size of value + */ +size_t ef_env_iterator_now_value_len() +{ + return _g_env_iter_obj.env.value_len; +} +/** + * @brief get value of env now + * + * @param value_buf ENV blob buffer + * @param buf_len value_buf length + * @return size_t 0:Read the complete;nonzero:unread length + */ +size_t f_env_iterator_now_value(void *value_buf, size_t buf_len) +{ + if(buf_len < _g_env_iter_obj.env.value_len) + { + ef_port_read(_g_env_iter_obj.env.addr.value, (uint32_t *) value_buf, buf_len); + return _g_env_iter_obj.env.value_len - buf_len; + } + else + { + ef_port_read(_g_env_iter_obj.env.addr.value, (uint32_t *) value_buf, _g_env_iter_obj.env.value_len); + return 0; + } + + } - /** * @brief Get next blob ENV * @@ -1185,40 +1224,34 @@ void env_iterator_to_first() * @param value_len ENV blob buffer length * @return char 1:Traversal complete 0:Traversal not complete */ -char env_iterator_next(char *key, void *value_buf, size_t *value_len) +char ef_env_iterator_next() { uint32_t sec_addr; ef_port_env_lock(); - if (obj.sector.addr == FAILED_ADDR) + if (_g_env_iter_obj.sector.addr == FAILED_ADDR) { _reload: - if ((sec_addr = get_next_sector_addr(&obj.sector)) == FAILED_ADDR) + if ((sec_addr = get_next_sector_addr(&_g_env_iter_obj.sector)) == FAILED_ADDR) { ef_port_env_unlock(); return 1; } - if (read_sector_meta_data(sec_addr, &obj.sector, false) != EF_NO_ERR) + if (read_sector_meta_data(sec_addr, &_g_env_iter_obj.sector, false) != EF_NO_ERR) { goto _reload; } } - - if (obj.sector.status.store == SECTOR_STORE_USING || obj.sector.status.store == SECTOR_STORE_FULL) + if (_g_env_iter_obj.sector.status.store == SECTOR_STORE_USING || _g_env_iter_obj.sector.status.store == SECTOR_STORE_FULL) { /* search all ENV */ _next: - if ((obj.env.addr.start = get_next_env_addr(&obj.sector, &obj.env)) != FAILED_ADDR) + if ((_g_env_iter_obj.env.addr.start = get_next_env_addr(&_g_env_iter_obj.sector, &_g_env_iter_obj.env)) != FAILED_ADDR) { - read_env(&obj.env); + read_env(&_g_env_iter_obj.env); /* iterator is interrupted when callback return true */ - if (obj.env.status == ENV_WRITE) + if (_g_env_iter_obj.env.status == ENV_WRITE) { - //key = obj.env.name; - memcpy(key, obj.env.name, obj.env.name_len); - key[obj.env.name_len] = 0; - *value_len = obj.env.value_len; - ef_port_read(obj.env.addr.value, (uint32_t *) value_buf, *value_len); - + _g_env_iter_obj.env.name[_g_env_iter_obj.env.name_len] = 0; ef_port_env_unlock(); return 0; } @@ -1226,13 +1259,11 @@ _next: { goto _next; } - } else { goto _reload; } - } else {