搜索
bottom↓
回复: 25
打印 上一主题 下一主题

一起来拍砖 EasyFlash 类型转换插件的 API 方法

[复制链接]

出0入198汤圆

跳转到指定楼层
1
发表于 2015-12-16 18:34:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 sunnydragon 于 2015-12-16 20:21 编辑

EasyFlash 马上1岁了,感谢坛友们的积极反馈与支持,使得 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);
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

2
发表于 2015-12-16 19:03:47 | 只看该作者
sofa.

出0入0汤圆

3
发表于 2015-12-16 19:19:48 | 只看该作者
日志功能很赞,方便查找bug,有时间学习一下。谢谢楼主,已start。

出0入0汤圆

4
发表于 2015-12-16 19:30:22 | 只看该作者
谢谢楼主的分享!!!

出0入0汤圆

5
发表于 2015-12-16 19:50:56 | 只看该作者
如今最难得的品质就是坚持,支持一下

出0入0汤圆

6
发表于 2015-12-16 20:05:43 | 只看该作者
很不错,学习了!!!!

出0入0汤圆

7
发表于 2015-12-16 20:07:14 来自手机 | 只看该作者
不错,学习了很多东西

出0入198汤圆

8
 楼主| 发表于 2015-12-16 20:23:34 | 只看该作者
meirenai 发表于 2015-12-16 19:19
日志功能很赞,方便查找bug,有时间学习一下。谢谢楼主,已start。

客气~日志功能设计的初衷就是为了方便调试,快速定位Bug。欢迎分享使用感受,有问题可以跟帖留言哈~

出0入198汤圆

9
 楼主| 发表于 2015-12-16 20:29:36 | 只看该作者
Vmao 发表于 2015-12-16 19:50
如今最难得的品质就是坚持,支持一下

过奖了,大家的支持是我坚持的动力。

我是一个完美主义者,所以产品上有任何不完善的地方,我都愿意去优化改进。

也希望我的坚持能让更多的人关注 EasyFlash ,能有更多的人一起加入到开源软件开发及维护的团队中来。

出20入0汤圆

10
发表于 2015-12-16 21:03:52 | 只看该作者
  跟着楼主学习,等能力足够的时候为开源贡献力量。

出0入0汤圆

11
发表于 2015-12-16 21:30:13 | 只看该作者
key=字符串 应该用哪个接口?

key=ip地址(192.168.0.1)  应该用哪个接口?

出0入0汤圆

12
发表于 2015-12-16 21:44:51 | 只看该作者
很不错的项目,下次再做项目尝试用一下,感谢楼主~

出0入198汤圆

13
 楼主| 发表于 2015-12-17 08:36:35 | 只看该作者
ljt80158015 发表于 2015-12-16 21:30
key=字符串 应该用哪个接口?

key=ip地址(192.168.0.1)  应该用哪个接口?

第一个,value 格式为字符串,那么就用默认的自带 ef_get_env 及 ef_set_env 就可以,可以不用这个插件的。

第二个,我不清楚你的IP地址格式,如果为字符串,跟上面那个方式一样就可以,如果为整形数组,那就用 ef_get_int_array 及 ef_set_int_array

出0入0汤圆

14
发表于 2015-12-17 09:20:45 | 只看该作者
做得很棒,代码风格也很好
其实已经实现了一个嵌入式Key-Value数据库引擎

出0入0汤圆

15
发表于 2015-12-17 10:50:19 | 只看该作者
感谢楼主分享。

出0入0汤圆

16
发表于 2015-12-17 11:20:36 | 只看该作者
真的不错,楼主无私分享,可以搞一个自主捐助。。。。。

出0入0汤圆

17
发表于 2015-12-17 15:29:54 | 只看该作者
终于等到了全面的数据格式。建议做成一个细粒度的库,这样链接的时候就会仅仅链接需要转换的数据了,最大缩小代码体积

出0入0汤圆

18
发表于 2015-12-17 19:44:12 来自手机 | 只看该作者
这种格式存储参数,pc端将参数发送到下位机,用什么协议合适?

出0入198汤圆

19
 楼主| 发表于 2015-12-18 08:23:43 | 只看该作者
散吧散吧 发表于 2015-12-17 11:20
真的不错,楼主无私分享,可以搞一个自主捐助。。。。。

多谢支持~~以后可以考虑下的。

出0入198汤圆

20
 楼主| 发表于 2015-12-18 08:28:50 | 只看该作者
li.wen 发表于 2015-12-17 15:29
终于等到了全面的数据格式。建议做成一个细粒度的库,这样链接的时候就会仅仅链接需要转换的数据了,最大缩 ...

恩,多谢提醒,这个我是有考虑的。我在开发时,也是资源占用也是比较敏感的。

对于类型的种类上及 API 是接口定义上有没有意见呢?

出0入198汤圆

21
 楼主| 发表于 2015-12-18 09:39:20 | 只看该作者
ljt80158015 发表于 2015-12-17 19:44
这种格式存储参数,pc端将参数发送到下位机,用什么协议合适?

PC 机与单片机是什么接口连接的。

出0入0汤圆

22
发表于 2015-12-18 20:54:10 | 只看该作者
sunnydragon 发表于 2015-12-18 09:39
PC 机与单片机是什么接口连接的。


串口rs232  rs485  或  网络

出425入0汤圆

23
发表于 2016-1-14 10:49:59 | 只看该作者
我在一个产品中原先使用STM32官方的一个库操作Flash,储存运行的数据。但有些莫名其妙的问题。后面有时间再研究。现在我采用你的EasyFlash,但在C++的环境中编译遇到问题。请看链接:http://www.amobbs.com/forum.php? ... p;page=1#pid8965833

出0入0汤圆

24
发表于 2016-5-11 14:01:09 | 只看该作者
支持!!已Star....

出0入0汤圆

25
发表于 2016-7-27 11:39:23 | 只看该作者
这个需要内存动态分配,嵌入式系统中应用还是偏复杂。

出0入0汤圆

26
发表于 2017-3-4 15:25:55 | 只看该作者
很是喜欢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-2 16:45

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表