Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

增加ef_iterator_env函数让外部调用,增加ef_env.h文件把定义单独放进来 #4

Open
slyant opened this issue Oct 23, 2019 · 3 comments

Comments

@slyant
Copy link

slyant commented Oct 23, 2019

void ef_iterator_env(void *arg1, void *arg2, bool (*callback)(env_meta_data_t env, void *arg1, void *arg2))
{
struct env_meta_data env;

if (!init_ok) {
    EF_INFO("ENV isn't initialize OK.\n");
    return;
}

/* lock the ENV cache */
ef_port_env_lock();

env_iterator(&env, arg1, arg2, callback);

/* unlock the ENV cache */
ef_port_env_unlock();

}

/**

  • Print ENV.
    */
    void ef_print_env(void)
    {
    size_t using_size = 0;

    ef_iterator_env(&using_size, NULL, print_env_cb);

    ef_print("\nmode: next generation\n");
    ef_print("size: %lu/%lu bytes.\n", using_size + (SECTOR_NUM - EF_GC_EMPTY_SEC_THRESHOLD) * SECTOR_HDR_DATA_SIZE,
    ENV_AREA_SIZE - SECTOR_SIZE * EF_GC_EMPTY_SEC_THRESHOLD);
    }

@armink
Copy link
Member

armink commented Oct 23, 2019

迭代器会在下一个版本放出来的哈

@zrw269113179
Copy link

等不住下一个版本了,自己写了个迭代器,测试通过,哈哈哈

struct env_iterator_obj
{
    struct sector_meta_data sector;
    struct env_meta_data env;
};
typedef struct env_iterator_obj *env_iterator_obj_t;


static struct env_iterator_obj obj;
/**
 * @brief 从头开始遍历
 *
 */
void env_iterator_to_first()
{
    obj.sector.addr = FAILED_ADDR;
    obj.env.addr.start = FAILED_ADDR;
}
/**
 * @brief 返回下一个环境变量
 *
 * @param env 环境变量存储地址
 * @return char 1:遍历完成,0:任然存在数据
 */
char env_iterator_next(char *key, void *value_buf, size_t *value_len)
{
    uint32_t sec_addr;
    ef_port_env_lock();
    if (obj.sector.addr == FAILED_ADDR)
    {
_reload:
        if ((sec_addr = get_next_sector_addr(&obj.sector)) == FAILED_ADDR)
        {
            ef_port_env_unlock();
            return 1;
        }
        if (read_sector_meta_data(sec_addr, &obj.sector, false) != EF_NO_ERR)
        {
            goto _reload;
        }
    }

    if (obj.sector.status.store == SECTOR_STORE_USING || 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)
        {
            read_env(&obj.env);
            /* iterator is interrupted when callback return true */
            if (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);

                ef_port_env_unlock();
                return 0;
            }
            else
            {
                goto _next;
            }

        }
        else
        {
            goto _reload;
        }

    }
    else
    {
        goto _reload;
    }


}

@armink
Copy link
Member

armink commented Oct 25, 2019

不错呀,可以提交 pr 上来哈

https://github.com/armink/EasyFlash

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants