更改迭代器使用方法

调用ef_env_iterator_to_first()将迭代器指向最开始
调用ef_env_iterator_next()将迭代器指向下一个变量
调用ef_env_iterator_now_name()获取迭代器当前指向的变量的名字
调用ef_env_iterator_now_value_len()获取迭代器当前指向的变量的数据长度
调用ef_env_iterator_now_value()获取迭代器当前指向的变量的数据
注意调用ef_env_iterator_to_first()之后要再调用ef_env_iterator_next()才能获取第一个元素
pull/78/head
brand 6 years ago
parent 4e82e94d5b
commit c401ae1139

@ -112,8 +112,12 @@ EfErrCode ef_env_set_default(void);
size_t ef_get_env_write_bytes(void); size_t ef_get_env_write_bytes(void);
EfErrCode ef_set_and_save_env(const char *key, const char *value); EfErrCode ef_set_and_save_env(const char *key, const char *value);
EfErrCode ef_del_and_save_env(const char *key); EfErrCode ef_del_and_save_env(const char *key);
void env_iterator_to_first(); /* iterator*/
char env_iterator_next(char *key, void *value_buf, size_t *value_len); 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 #endif
#ifdef EF_USING_IAP #ifdef EF_USING_IAP

@ -1166,17 +1166,56 @@ __retry:
return empty_env; return empty_env;
} }
static struct env_iterator_obj obj; static struct env_iterator_obj _g_env_iter_obj;
/** /**
* @brief Traversing from scratch * @brief Traversing from scratch
* *
*/ */
void env_iterator_to_first() void ef_env_iterator_to_first()
{ {
obj.sector.addr = FAILED_ADDR; _g_env_iter_obj.sector.addr = FAILED_ADDR;
obj.env.addr.start = 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 * @brief Get next blob ENV
* *
@ -1185,40 +1224,34 @@ void env_iterator_to_first()
* @param value_len ENV blob buffer length * @param value_len ENV blob buffer length
* @return char 1:Traversal complete 0:Traversal not complete * @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; uint32_t sec_addr;
ef_port_env_lock(); ef_port_env_lock();
if (obj.sector.addr == FAILED_ADDR) if (_g_env_iter_obj.sector.addr == FAILED_ADDR)
{ {
_reload: _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(); ef_port_env_unlock();
return 1; 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; goto _reload;
} }
} }
if (_g_env_iter_obj.sector.status.store == SECTOR_STORE_USING || _g_env_iter_obj.sector.status.store == SECTOR_STORE_FULL)
if (obj.sector.status.store == SECTOR_STORE_USING || obj.sector.status.store == SECTOR_STORE_FULL)
{ {
/* search all ENV */ /* search all ENV */
_next: _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 */ /* 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; _g_env_iter_obj.env.name[_g_env_iter_obj.env.name_len] = 0;
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);
ef_port_env_unlock(); ef_port_env_unlock();
return 0; return 0;
} }
@ -1226,13 +1259,11 @@ _next:
{ {
goto _next; goto _next;
} }
} }
else else
{ {
goto _reload; goto _reload;
} }
} }
else else
{ {

Loading…
Cancel
Save