3777|4

67

帖子

3

TA的资源

一粒金砂(中级)

楼主
 

一起来拍砖 EasyFlash 类型转换插件的 API 方法 [复制链接]

本帖最后由 armink 于 2015-12-16 19:09 编辑

EasyFlash 马上1岁了,以前来EEWORLD次数少,最近也经常关注论坛,感觉坛子的气氛不错的,所以也多想跟大家一起分享、交流技术。也希望大家多多支持 EasyFlash ,一起来维护属于我们大家的开源软件。(不了解 EasyFlash 的坛友们可以点击这里查看其介绍)
原本 EasyFlash 环境变量功能只支持存储字符串类型,其他类型虽然也可以间接存储,但是需要字符串转换,操作起来也略显麻烦。所以我计划让 EasyFlash 支持更多常用类型环境变量。考虑到耦合度,灵活性,这个功能将会以插件形式提供出来。
现在最大的难点“结构体类型的转换”也已经被攻克,我把相应技术以库的形式也开源了出来,库名为 “struct2json”。
所以该插件剩下就是简单的体力活了,在具体实现之前,还是想跟大家能够一起确认下提供给大家使用的 API 方法,大家集思广益,一起设计一套人性化的 API 接口方法。下面是我的初步方案。

用户可调用 API
  1. void ef_types_init(S2jHook *hook);
  2. bool ef_get_bool(const char *key);
  3. char ef_get_char(const char *key);
  4. short ef_get_short(const char *key);
  5. int ef_get_int(const char *key);
  6. long ef_get_long(const char *key);
  7. float ef_get_float(const char *key);
  8. double ef_get_double(const char *key);
  9. void ef_get_bool_array(const char *key, bool *value);
  10. void ef_get_char_array(const char *key, char *value);
  11. void ef_get_short_array(const char *key, short *value);
  12. void ef_get_int_array(const char *key, int *value);
  13. void ef_get_long_array(const char *key, long *value);
  14. void ef_get_float_array(const char *key, float *value);
  15. void ef_get_double_array(const char *key, double *value);
  16. void ef_get_struct(const char *key, void *value, ef_types_set_cb get_cb);
  17. EfErrCode ef_set_char(const char *key, char value);
  18. EfErrCode ef_set_short(const char *key, short value);
  19. EfErrCode ef_set_int(const char *key, int value);
  20. EfErrCode ef_set_long(const char *key, long value);
  21. EfErrCode ef_set_float(const char *key, float value);
  22. EfErrCode ef_set_double(const char *key, double value);
  23. EfErrCode ef_set_bool_array(const char *key, bool value[], size_t len);
  24. EfErrCode ef_set_char_array(const char *key, char value[], size_t len);
  25. EfErrCode ef_set_short_array(const char *key, short value[], size_t len);
  26. EfErrCode ef_set_int_array(const char *key, int value[], size_t len);
  27. EfErrCode ef_set_long_array(const char *key, long value[], size_t len);
  28. EfErrCode ef_set_float_array(const char *key, float value[], size_t len);
  29. EfErrCode ef_set_double_array(const char *key, double value[], size_t len);
  30. EfErrCode ef_set_struct(const char *key, void* value, ef_types_set_cb set_cb);
复制代码

使用方法(这里的基本类型只用整形作为例子,其他类型类似)
  1. /* 1、获取基本类型环境变量 */
  2. int boot_count = ef_get_int("开机次数");
  3. /* 2、获取数组类型环境变量 */
  4. int temp_record[100];
  5. ef_get_int_array("温度记录", temp_record);
  6. /* 3、获取结构体类型环境变量 */
  7. typedef struct {
  8.     char name[16];
  9. } Hometown;
  10. typedef struct {
  11.     uint8_t id;
  12.     double weight;
  13.     uint8_t score[8];
  14.     char name[10];
  15.     Hometown hometown;
  16. } Student;
  17. Student student;
  18. /* 3.1、首先定义 JSON 转结构体的方法 */
  19. static void *stu_get_cb(cJSON* json_obj) {
  20.     /* 创建 Student 结构体对象(提示: s2j_ 开头的方法是 struct2json 库提供的) */
  21.     s2j_create_struct_obj(struct_student, Student);
  22.     /* 反序列化数据到 Student 结构体对象 */
  23.     s2j_struct_get_basic_element(struct_student, json_obj, int, id);
  24.     s2j_struct_get_array_element(struct_student, json_obj, int, score);
  25.     s2j_struct_get_basic_element(struct_student, json_obj, string, name);
  26.     s2j_struct_get_basic_element(struct_student, json_obj, double, weight);
  27.     /* 反序列化数据到 Student.Hometown 结构体对象 */
  28.     s2j_struct_get_struct_element(struct_hometown, struct_student, json_hometown, json_obj, Hometown, hometown);
  29.     s2j_struct_get_basic_element(struct_hometown, json_hometown, string, name);
  30.     return struct_student;
  31. }
  32. /* 3.2、再把上述方法作为入参传递给插件即可 */
  33. ef_get_struct("张三学生", &student, stu_get_cb);

  34. /* 1、设置基本类型环境变量 */
  35. ef_set_int("开机次数", 101);
  36. /* 2、设置数组类型环境变量 */
  37. int temp_record[5];
  38. ef_get_int_array("温度记录", temp_record, 5);
  39. /* 3、设置结构体类型环境变量 */
  40. Student student;
  41. /* 3.1、首先定义结构体转 JSON 的方法 */
  42. static cJSON *stu_set_cb(void* struct_obj) {
  43.     Student *struct_student = (Student *)struct_obj;
  44.     /* 创建 Student JSON 对象 */
  45.     s2j_create_json_obj(json_student);
  46.     /* 序列化数据到 Student JSON 对象 */
  47.     s2j_json_set_basic_element(json_student, struct_student, int, id);
  48.     s2j_json_set_basic_element(json_student, struct_student, double, weight);
  49.     s2j_json_set_array_element(json_student, struct_student, int, score, 8);
  50.     s2j_json_set_basic_element(json_student, struct_student, string, name);
  51.     /* 序列化数据到 Student.Hometown JSON 对象 */
  52.     s2j_json_set_struct_element(json_hometown, json_student, struct_hometown, struct_student, Hometown, hometown);
  53.     s2j_json_set_basic_element(json_hometown, struct_hometown, string, name);
  54.     return json_student;
  55. }
  56. /* 3.2、再把上述方法作为入参传递给插件即可 */
  57. ef_set_struct("张三学生", &student, stu_set_cb);
复制代码


此帖出自单片机论坛

最新回复

顶一下   详情 回复 发表于 2024-5-27 14:03
点赞 关注
 

回复
举报

67

帖子

3

TA的资源

一粒金砂(中级)

沙发
 
本帖最后由 armink 于 2015-12-17 09:33 编辑

EasyFlash 的介绍在这里:https://github.com/armink/EasyFlash
下载点击这里:https://github.com/armink/EasyFlash/archive/master.zip
或选择本坛下载: EasyFlash-V1.12.16.zip (4.27 MB, 下载次数: 6)
API说明文档:https://github.com/armink/EasyFlash/blob/master/docs/zh/api.md
移植文档:https://github.com/armink/EasyFlash/blob/master/docs/zh/port.md
各种Demo:https://github.com/armink/EasyFlash/tree/master/demo




此帖出自单片机论坛
 
 

回复

2万

帖子

74

TA的资源

管理员

板凳
 
欢迎以后常来。
此帖出自单片机论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

4
 
看看
此帖出自单片机论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

5
 

顶一下

此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表