本帖最后由 sunnydragon 于 2015-12-16 20:21 编辑
EasyFlash 马上1岁了,感谢坛友们的积极反馈与支持,使得 EasyFlash 能够拥有现在这么多实用的功能。
前些日子业余时间太少,一直忙于工作,原计划做的“让 EasyFlash
支持更多类型”的功能一直拖到现在。
这个功能我计划是以插件的形式提供出来,降低耦合,提高灵活性。现在最大的难点“
结构体类型的转换”也已经被攻克,并把相应技术以库的形式开源了出来,库名为 “
struct2json”。
所以现在该插件剩下就是简单的体力活了,在具体实现之前,还是想跟大家能够一起确认下提供给大家使用的 API 方法,大家集思广益,一起设计一套人性化的 API 接口方法。下面是我的初步方案。
用户可调用 API
- void ef_types_init(S2jHook *hook);
- bool ef_get_bool(const char *key);
- char ef_get_char(const char *key);
- short ef_get_short(const char *key);
- int ef_get_int(const char *key);
- long ef_get_long(const char *key);
- float ef_get_float(const char *key);
- double ef_get_double(const char *key);
- void ef_get_bool_array(const char *key, bool *value);
- void ef_get_char_array(const char *key, char *value);
- void ef_get_short_array(const char *key, short *value);
- void ef_get_int_array(const char *key, int *value);
- void ef_get_long_array(const char *key, long *value);
- void ef_get_float_array(const char *key, float *value);
- void ef_get_double_array(const char *key, double *value);
- void ef_get_struct(const char *key, void *value, ef_types_set_cb get_cb);
- EfErrCode ef_set_char(const char *key, char value);
- EfErrCode ef_set_short(const char *key, short value);
- EfErrCode ef_set_int(const char *key, int value);
- EfErrCode ef_set_long(const char *key, long value);
- EfErrCode ef_set_float(const char *key, float value);
- EfErrCode ef_set_double(const char *key, double value);
- EfErrCode ef_set_bool_array(const char *key, bool value[], size_t len);
- EfErrCode ef_set_char_array(const char *key, char value[], size_t len);
- EfErrCode ef_set_short_array(const char *key, short value[], size_t len);
- EfErrCode ef_set_int_array(const char *key, int value[], size_t len);
- EfErrCode ef_set_long_array(const char *key, long value[], size_t len);
- EfErrCode ef_set_float_array(const char *key, float value[], size_t len);
- EfErrCode ef_set_double_array(const char *key, double value[], size_t len);
- EfErrCode ef_set_struct(const char *key, void* value, ef_types_set_cb set_cb);
复制代码
使用方法(这里的基本类型只用整形作为例子,其他类型类似)
- /* 1、获取基本类型环境变量 */
- int boot_count = ef_get_int("开机次数");
- /* 2、获取数组类型环境变量 */
- int temp_record[100];
- ef_get_int_array("温度记录", temp_record);
- /* 3、获取结构体类型环境变量 */
- typedef struct {
- char name[16];
- } Hometown;
- typedef struct {
- uint8_t id;
- double weight;
- uint8_t score[8];
- char name[10];
- Hometown hometown;
- } Student;
- Student student;
- /* 3.1、首先定义 JSON 转结构体的方法 */
- static void *stu_get_cb(cJSON* json_obj) {
- /* 创建 Student 结构体对象(提示: s2j_ 开头的方法是 struct2json 库提供的) */
- s2j_create_struct_obj(struct_student, Student);
- /* 反序列化数据到 Student 结构体对象 */
- s2j_struct_get_basic_element(struct_student, json_obj, int, id);
- s2j_struct_get_array_element(struct_student, json_obj, int, score);
- s2j_struct_get_basic_element(struct_student, json_obj, string, name);
- s2j_struct_get_basic_element(struct_student, json_obj, double, weight);
- /* 反序列化数据到 Student.Hometown 结构体对象 */
- s2j_struct_get_struct_element(struct_hometown, struct_student, json_hometown, json_obj, Hometown, hometown);
- s2j_struct_get_basic_element(struct_hometown, json_hometown, string, name);
- return struct_student;
- }
- /* 3.2、再把上述方法作为入参传递给插件即可 */
- ef_get_struct("张三学生", &student, stu_get_cb);
- /* 1、设置基本类型环境变量 */
- ef_set_int("开机次数", 101);
- /* 2、设置数组类型环境变量 */
- int temp_record[5];
- ef_get_int_array("温度记录", temp_record, 5);
- /* 3、设置结构体类型环境变量 */
- Student student;
- /* 3.1、首先定义结构体转 JSON 的方法 */
- static cJSON *stu_set_cb(void* struct_obj) {
- Student *struct_student = (Student *)struct_obj;
- /* 创建 Student JSON 对象 */
- s2j_create_json_obj(json_student);
- /* 序列化数据到 Student JSON 对象 */
- s2j_json_set_basic_element(json_student, struct_student, int, id);
- s2j_json_set_basic_element(json_student, struct_student, double, weight);
- s2j_json_set_array_element(json_student, struct_student, int, score, 8);
- s2j_json_set_basic_element(json_student, struct_student, string, name);
- /* 序列化数据到 Student.Hometown JSON 对象 */
- s2j_json_set_struct_element(json_hometown, json_student, struct_hometown, struct_student, Hometown, hometown);
- s2j_json_set_basic_element(json_hometown, struct_hometown, string, name);
- return json_student;
- }
- /* 3.2、再把上述方法作为入参传递给插件即可 */
- ef_set_struct("张三学生", &student, stu_set_cb);
复制代码
其实已经实现了一个嵌入式Key-Value数据库引擎
多谢支持~~以后可以考虑下的。
一周热门 更多>