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

2019-12-30 19:27发布

本帖最后由 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);
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
25条回答
sunnydragon
1楼-- · 2020-01-02 12:45
li.wen 发表于 2015-12-17 15:29
终于等到了全面的数据格式。建议做成一个细粒度的库,这样链接的时候就会仅仅链接需要转换的数据了,最大缩 ...

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

对于类型的种类上及 API 是接口定义上有没有意见呢?
sunnydragon
2楼-- · 2020-01-02 13:51
ljt80158015 发表于 2015-12-17 19:44
这种格式存储参数,pc端将参数发送到下位机,用什么协议合适?

PC 机与单片机是什么接口连接的。
ljt80158015
3楼-- · 2020-01-02 17:14
sunnydragon 发表于 2015-12-18 09:39
PC 机与单片机是什么接口连接的。


串口rs232  rs485  或  网络

guolun
4楼-- · 2020-01-02 19:19
 精彩回答 2  元偷偷看……
wofei3344
5楼-- · 2020-01-02 19:22
支持!!已Star....
ljt80158015
6楼-- · 2020-01-02 20:43
这个需要内存动态分配,嵌入式系统中应用还是偏复杂。

一周热门 更多>