当前位置:   article > 正文

基于LVGL的自动贩卖机系统-GEC6818开发板_lvgl pos机

lvgl pos机

一、参考

        1、LVGL移植到ARM开发板(GEC6818开发板)_6818 lvgl-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/wwwqqq2014/article/details/136690316?spm=1001.2014.3001.5502        2、基于GEC6818开发板实现自动贩卖机(C语言 + lvgl库 + 系统编程 + 网络编程 + sqlite3数据库)_使用lvgl图形库开发一款基于linux操作系统的自动售卖机软件-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_74143852/article/details/133494058        3、LVGL不同版本的百问网

快捷选择版本:

注意!本系统使用的是LVGL8.2版本,不同版本的LVGL里的函数名可能相同,但传入的参数会不同,所以要看清楚自己用的是什么版本的LVGL,再去其对应的百问网查看控件如何使用,不然用错就会懵逼,很难搞哦。

二、框架

1.功能

客户端 
        1、商品浏览
        2、商品选择
        3、商品搜索
        4、商品购买(点击图片模拟支付)
服务端
        1、储存购买信息
        2、提醒补货
        3、添加新商品

2.网络编程

        1、商品信息文件由本地文件提供,生成商品信息文件后将其存入开发板中

        商品信息文件生成代码

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <sys/ioctl.h>
  5. #include <fcntl.h>
  6. #include <unistd.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. //货物信息结构体
  10. struct link_node
  11. {
  12. char jpgpath[128]; //存放图片路径名
  13. char cname[64]; //中文商品名
  14. char name[32]; //英文商品名
  15. float price; //商品价格
  16. int number; //商品数量
  17. };
  18. //结构体初始化
  19. struct link_node *request_link_node(void)
  20. {
  21. struct link_node *new_node;
  22. new_node = malloc(sizeof(struct link_node));//申请内存
  23. if(new_node == NULL) //判断链表节点是否申请成功
  24. {
  25. perror("申请节点失败\n");
  26. return NULL;
  27. }
  28. return new_node;
  29. }
  30. int main(void)
  31. {
  32. struct link_node *new_node;
  33. new_node = request_link_node();
  34. char buff[1024]={0};
  35. FILE *fp;
  36. fp = fopen("goods.txt", "w+");
  37. if(fp == NULL)
  38. {
  39. perror("open fail");
  40. return -1;
  41. }
  42. while(1)
  43. {
  44. printf("input jpgpath:\n");
  45. scanf("%s", new_node->jpgpath);
  46. printf("input cname:\n");
  47. scanf("%s", new_node->cname);
  48. printf("input name:\n");
  49. scanf("%s", new_node->name);
  50. printf("input price:\n");
  51. scanf("%f", &new_node->price);
  52. printf("input number:\n");
  53. scanf("%d", &new_node->number);
  54. fprintf(fp, "%s %s %s %f %d\n", new_node->jpgpath, new_node->cname, new_node->name, new_node->price, new_node->number);
  55. printf("determine?\n");
  56. scanf("%s", buff);
  57. if(strcmp(buff, "exit")==0)
  58. {
  59. break;
  60. }
  61. }
  62. fclose(fp);
  63. return 0;
  64. }


        2、虚拟机为服务器,6818开发板为客户端

        服务器代码

  1. //服务端
  2. #include <stdio.h>
  3. #include <time.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <stdlib.h>
  7. #include <pthread.h>
  8. #include <sys/time.h>
  9. #include <sys/types.h>
  10. #include <sys/socket.h>
  11. #include <netinet/in.h>
  12. #include <arpa/inet.h>
  13. struct all_info
  14. {
  15. char type; //消息类型
  16. char cname[64]; //商品中文名
  17. int number; //购买的商品数量
  18. float price; //总价格
  19. char payment[64]; //支付方式
  20. };
  21. struct link_node
  22. {
  23. char jpgpath[128]; //存放图片路径名
  24. char cname[64]; //中文商品名
  25. char name[32]; //英文商品名
  26. float price; //商品价格
  27. int number; //商品数量
  28. };
  29. void *send_data(void *arg)
  30. {
  31. int sockfd = *((int*)arg);
  32. int cmd, ret;
  33. char send_buff[1024]={0};
  34. struct link_node *new_node;
  35. new_node = malloc(sizeof(struct link_node));
  36. while(1)
  37. {
  38. printf("输入1进行添加新商品\n");
  39. scanf("%d", &cmd);
  40. memset(send_buff, 0, sizeof(send_buff));
  41. switch(cmd)
  42. {
  43. case 1:
  44. printf("input jpgpath:\n");
  45. scanf("%s", new_node->jpgpath);
  46. printf("input cname:\n");
  47. scanf("%s", new_node->cname);
  48. printf("input name:\n");
  49. scanf("%s", new_node->name);
  50. printf("input price:\n");
  51. scanf("%f", &new_node->price);
  52. printf("input number:\n");
  53. scanf("%d", &new_node->number);
  54. sprintf(send_buff, "%s %s %s %f %d\n", new_node->jpgpath, new_node->cname, new_node->name, new_node->price, new_node->number);
  55. ret = send(sockfd, send_buff, sizeof(send_buff), 0);
  56. break;
  57. default:
  58. break;
  59. }
  60. printf("\n");
  61. while (getchar() != '\n');
  62. }
  63. }
  64. int main(void)
  65. {
  66. time_t time;
  67. int sockfd;
  68. int ret;
  69. char recv_buff[256] = {0};
  70. //获取时间结构体
  71. struct timeval tv;
  72. struct tm* ptm;
  73. char time_string[40];
  74. //定义获取全部信息结构体
  75. struct all_info *goods_info;
  76. goods_info = malloc(sizeof(struct all_info));
  77. sockfd = socket(AF_INET, SOCK_STREAM, 0);
  78. if(sockfd == -1)
  79. {
  80. printf("sockfd fail\n");
  81. return -1;
  82. }
  83. //所以设置端口号可以复用,这两条语句放在 绑定bind 之前
  84. int optval = 1;
  85. setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,&optval, sizeof(optval));
  86. //服务端信息设置
  87. struct sockaddr_in serverAddr;//服务端
  88. serverAddr.sin_family = AF_INET;//地址族 IPV4协议
  89. serverAddr.sin_port = htons(50000);//主机端口号转成网络端口号
  90. serverAddr.sin_addr.s_addr = inet_addr("192.168.7.212");//主机ip转换为网络ip
  91. ret = bind(sockfd, (struct sockaddr *)&serverAddr, sizeof(struct sockaddr_in));//绑定自己的ip与端口
  92. if(ret == -1)
  93. {
  94. printf("bind fail\n");
  95. return -1;
  96. }
  97. ret = listen(sockfd, 5);//监听,设置最多连接的客户端总数
  98. if(ret == -1)
  99. {
  100. printf("listen fail\n");
  101. return -1;
  102. }
  103. //客户端信息设置
  104. struct sockaddr_in clientAddr;//客户端
  105. int len = sizeof(struct sockaddr_in);
  106. int newCentfd = accept(sockfd, (struct sockaddr *)&clientAddr, &len);//等待客户端连接
  107. if(newCentfd == -1)
  108. {
  109. printf("accept fail\n");
  110. return -1;
  111. }
  112. //设置线程
  113. pthread_t thread;
  114. //设置线程分离属性
  115. pthread_attr_t attr;
  116. pthread_attr_init(&attr);
  117. pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
  118. //创建线程,接受数据
  119. pthread_create(&thread, &attr, send_data, &newCentfd);
  120. //打印客户端ip与端口号
  121. printf("客户端ip:%s,端口号:%d\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));
  122. while(1)
  123. {
  124. //接收客户端的数据
  125. ret = recv(newCentfd, recv_buff, sizeof(recv_buff), 0);
  126. if(ret == -1)
  127. {
  128. printf("recv fail\n");
  129. return -1;
  130. }
  131. if(ret == 0)
  132. {
  133. printf("客户端已经断开\n");
  134. break;
  135. }
  136. //读取一个字节,实际读取的是消息类型
  137. strncpy(&goods_info->type, recv_buff, 1);
  138. //如何消息类型为1时,为购买信息,将购买信息存到文件中
  139. if(strcmp(&goods_info->type, "1") == 0)
  140. {
  141. //将接收的数据进行拆分
  142. sscanf(recv_buff, "%c %s %d %f %s", &goods_info->type, goods_info->cname, &goods_info->number, &goods_info->price, goods_info->payment);
  143. memset(recv_buff, 0, sizeof(recv_buff));
  144. sprintf(recv_buff, "购买%s,总数%d,总金额%.1f元,%s", goods_info->cname, goods_info->number, goods_info->price, goods_info->payment);
  145. //获取时间
  146. gettimeofday(&tv, NULL);
  147. ptm = localtime (&(tv.tv_sec));
  148. strftime (time_string, sizeof(time_string), "%Y-%m-%d", ptm);//输出格式为: 2003-03-03
  149. //将购买信息存到文件中
  150. FILE *fp;
  151. fp = fopen("payment.txt", "a");
  152. if(fp == NULL)
  153. {
  154. perror("open fail");
  155. return -1;
  156. }
  157. fprintf(fp, "%s %s\n", time_string, recv_buff);
  158. fclose(fp);
  159. memset(goods_info, 0, sizeof(struct all_info));
  160. memset(time_string, 0, sizeof(time_string));
  161. }
  162. //如何消息类型为2时,为商品缺货信息
  163. if(strcmp(&goods_info->type, "2") == 0)
  164. {
  165. sscanf(recv_buff, "%c %s", &goods_info->type, goods_info->cname);
  166. memset(recv_buff, 0, sizeof(recv_buff));
  167. sprintf(recv_buff, "%s已售完,请进行补货", goods_info->cname);
  168. printf("sell:%s\n", recv_buff);
  169. memset(goods_info, 0, sizeof(struct all_info));
  170. }
  171. usleep(100);
  172. memset(recv_buff, 0, sizeof(recv_buff));
  173. }
  174. close(newCentfd);
  175. close(sockfd);
  176. return 0;
  177. }

三、主代码

  1. #include <stdio.h>
  2. #include "lvgl/lvgl.h"
  3. #include "lvgl/demos/lv_demos.h"
  4. #include "lv_drivers/display/fbdev.h"
  5. #include "lv_drivers/indev/evdev.h"
  6. #include <unistd.h>
  7. #include <pthread.h>
  8. #include <time.h>
  9. #include <sys/time.h>
  10. #include <sys/types.h>
  11. #include <sys/stat.h>
  12. #include <sys/ioctl.h>
  13. #include <fcntl.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16. #include <sys/socket.h>
  17. #include <arpa/inet.h>
  18. //#include "lv_gui_password_keyboard.h"
  19. #define DISP_BUF_SIZE (480 * 800)
  20. #define LOGIN_USER1 "mocly" //用户名
  21. #define LOGIN_USER2 "MOCLY"
  22. #define LOGIN_PASSWORD "123" //密码
  23. struct sockaddr_in serverAddr;//服务器
  24. struct sockaddr_in clientAddr;//客户端
  25. int sockfd;
  26. char *wepay = "使用微信付款";
  27. char *apay = "使用支付宝付款";
  28. static const char * btns[] ={"关闭", ""}; //消息框关闭的按钮
  29. lv_obj_t * usern;//用户名框
  30. lv_obj_t * passw;//密码框
  31. lv_obj_t * search;//搜索框
  32. lv_obj_t * change_price_textarea;
  33. //char *path[]={"S:/mdata/project/picture/fenda.jpg","S:/mdata/project/picture/xuebi.jpg","S:/mdata/project/picture/kele.jpg","S:/mdata/project/picture/shupian.jpg","S:/mdata/project/picture/mozhua.jpg","S:/mdata/project/picture/chapai.jpg","S:/mdata/project/picture/maidong.jpg"};
  34. struct link_node *head;
  35. void lvgl_tab(lv_event_t * e);
  36. static void lvgl_tab_event(lv_event_t * e);
  37. static void ta_event_cb(lv_event_t * e);
  38. static void Root_login(lv_event_t * e);
  39. void decide_buy(lv_event_t * e);
  40. void goods_info(void);
  41. void root_goods(lv_event_t * e);
  42. static void login_btn_event_cb( lv_event_t * e);
  43. void goods_add(lv_event_t * e);
  44. void goods_redu(lv_event_t * e);
  45. void goods_Choose(lv_event_t * e);
  46. void Advertisement(void);
  47. void manage_goods(lv_event_t *e);
  48. void manage_add(lv_event_t *e);
  49. void manage_redu(lv_event_t *e);
  50. void wechat_success(lv_event_t * e);
  51. void alipay_success(lv_event_t * e);
  52. void search_box(void);
  53. void search_goods(lv_event_t * e);
  54. void goods_search_Choose(struct link_node *node);
  55. void chack_search(lv_event_t * e);
  56. void enter_change(lv_event_t * e);
  57. void change_price(lv_event_t * e);
  58. void update_goods(lv_event_t * e);
  59. void delete_goods(lv_event_t * e);
  60. void *recv_data(void *arg);
  61. //节点结构体
  62. struct link_node
  63. {
  64. char jpgpath[128]; //存放图片路径名
  65. char cname[64]; //中文商品名
  66. char name[32]; //英文商品名
  67. float price; //商品价格
  68. int number; //商品数量
  69. struct link_node *next; //用来存放下一个节点
  70. struct link_node *prve; //用来存放上一个节点
  71. };
  72. //大结构体存放一个商品信息的节点与购买的数量
  73. struct buy_info
  74. {
  75. struct link_node *node;//商品节点
  76. int sum_goods; //总购买数量
  77. };
  78. //申请一个新的节点
  79. struct link_node *request_link_node(void)
  80. {
  81. struct link_node *new_node;
  82. new_node = malloc(sizeof(struct link_node));//申请内存
  83. if(new_node == NULL) //判断链表节点是否申请成功
  84. {
  85. perror("申请节点失败\n");
  86. return NULL;
  87. }
  88. new_node->next = new_node;
  89. new_node->prve = new_node;
  90. return new_node;
  91. }
  92. //插入到指定节点的前面
  93. void insert_node_to_list_tail(struct link_node *head, struct link_node *node)
  94. {
  95. node->prve = head->prve;
  96. node->next = head;
  97. head->prve->next = node;
  98. head->prve = node;
  99. }
  100. //删除节点
  101. int remove_link_node(struct link_node *head_node, struct link_node *del_node)
  102. {
  103. struct link_node *pos, *npos;
  104. for(pos=head_node, npos=pos->next; npos != head_node; pos=npos, npos=npos->next)
  105. {
  106. if(strcmp(npos->name, del_node->name)==0)
  107. {
  108. pos->next = npos->next;
  109. npos->next->prve = pos;
  110. npos->next = npos;
  111. npos->prve = npos;
  112. break;
  113. }
  114. }
  115. free(npos);
  116. return 0;
  117. }
  118. //商品链表信息存储初始化
  119. void goods_info(void)
  120. {
  121. int c;
  122. struct link_node *new_node;
  123. new_node = request_link_node();
  124. FILE *fp;
  125. fp = fopen("goods.txt", "r");
  126. if(fp == NULL)
  127. {
  128. perror("open fail");
  129. return;
  130. }
  131. while(1)
  132. {
  133. new_node = request_link_node();
  134. if(c == EOF && feof(fp))
  135. {
  136. break;
  137. }
  138. fscanf(fp, "%s %s %s %f %d", new_node->jpgpath, new_node->cname, new_node->name, &new_node->price, &new_node->number);
  139. c = fgetc(fp);
  140. if(c == EOF && feof(fp))
  141. {
  142. break;
  143. }
  144. insert_node_to_list_tail(head, new_node);
  145. }
  146. fclose(fp);
  147. }
  148. /*管理员登录有关函数*/
  149. //键盘回调函数
  150. static void ta_event_cb(lv_event_t * e)
  151. {
  152. lv_event_code_t code = lv_event_get_code(e);
  153. lv_obj_t * ta = lv_event_get_target(e);
  154. lv_obj_t * kb = lv_event_get_user_data(e);
  155. if(code == LV_EVENT_FOCUSED) {
  156. lv_keyboard_set_textarea(kb, ta);
  157. lv_obj_clear_flag(kb, LV_OBJ_FLAG_HIDDEN);
  158. }
  159. if(code == LV_EVENT_DEFOCUSED) {
  160. lv_keyboard_set_textarea(kb, NULL);
  161. lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);
  162. }
  163. }
  164. //删除商品
  165. void delete_goods(lv_event_t * e)
  166. {
  167. /*创建一个字体*/
  168. static lv_ft_info_t info;//定义一个记录freetype字体信息的结构体
  169. /*记录字体文件路径(开发板) 字号大小-单位借用 字体风格*/
  170. info.name = "/font/simkai.ttf";//字体文件名---华文楷体--文件已经放在开发板中
  171. info.weight = 16;//字号
  172. info.style = FT_FONT_STYLE_NORMAL;//字体风格
  173. info.mem = NULL;//指向字体数据的指针 一般要显示字体时,就会从上面字体文件中获取对应数据 freetype转换为位图数据 ,而mem指针指向这块数据
  174. //初始化
  175. if(!lv_ft_font_init(&info)){
  176. LV_LOG_ERROR("creat.");
  177. }
  178. /*将上面字体添加到下面的lvgl样式对象中*/
  179. static lv_style_t style1;
  180. lv_style_init(&style1);
  181. lv_color_t c = lv_color_hex(0xFF000000);//定义颜色值 黑色
  182. lv_style_set_text_font(&style1, info.font);//设置该样式制定的字体--上面的
  183. lv_style_set_text_align(&style1, LV_TEXT_ALIGN_CENTER);//设置该样式的文本对齐
  184. lv_style_set_text_color(&style1,c);//设置该样式文本颜色
  185. struct link_node *del_node, *p;
  186. del_node = e->user_data;
  187. remove_link_node(head, del_node);
  188. FILE *fp;
  189. fp = fopen("goods.txt", "w+");
  190. if(fp == NULL)
  191. {
  192. perror("open fail");
  193. return;
  194. }
  195. p = head->next;
  196. for(p; p != head; p = p->next)
  197. {
  198. fprintf(fp, "%s %s %s %f %d\n", p->jpgpath, p->cname, p->name, p->price, p->number);
  199. }
  200. fclose(fp);
  201. //删除成功消息框
  202. lv_obj_t * deletebox = lv_msgbox_create(lv_scr_act(), "下架", "下架成功", btns, false);
  203. lv_obj_add_style(deletebox, &style1, 0);
  204. lv_obj_add_event_cb(deletebox, root_goods, LV_EVENT_VALUE_CHANGED, NULL);
  205. lv_obj_center(deletebox);
  206. }
  207. //更新商品信息,将信息存入文件
  208. void update_goods(lv_event_t * e)
  209. {
  210. /*创建一个字体*/
  211. static lv_ft_info_t info;//定义一个记录freetype字体信息的结构体
  212. /*记录字体文件路径(开发板) 字号大小-单位借用 字体风格*/
  213. info.name = "/font/simkai.ttf";//字体文件名---华文楷体--文件已经放在开发板中
  214. info.weight = 16;//字号
  215. info.style = FT_FONT_STYLE_NORMAL;//字体风格
  216. info.mem = NULL;//指向字体数据的指针 一般要显示字体时,就会从上面字体文件中获取对应数据 freetype转换为位图数据 ,而mem指针指向这块数据
  217. //初始化
  218. if(!lv_ft_font_init(&info)){
  219. LV_LOG_ERROR("creat.");
  220. }
  221. /*将上面字体添加到下面的lvgl样式对象中*/
  222. static lv_style_t style1;
  223. lv_style_init(&style1);
  224. lv_color_t c = lv_color_hex(0xFF000000);//定义颜色值 黑色
  225. lv_style_set_text_font(&style1, info.font);//设置该样式制定的字体--上面的
  226. lv_style_set_text_align(&style1, LV_TEXT_ALIGN_CENTER);//设置该样式的文本对齐
  227. lv_style_set_text_color(&style1,c);//设置该样式文本颜色
  228. FILE *fp;
  229. fp = fopen("goods.txt", "w+");
  230. if(fp == NULL)
  231. {
  232. perror("open fail");
  233. return;
  234. }
  235. struct link_node *p;
  236. p = head->next;
  237. //遍历链表,将数据存入文件
  238. for(p; p != head; p = p->next)
  239. {
  240. fprintf(fp, "%s %s %s %f %d\n", p->jpgpath, p->cname, p->name, p->price, p->number);
  241. }
  242. printf("update success\n");
  243. fclose(fp);
  244. //消息弹窗
  245. lv_obj_t * updatebox2 = lv_msgbox_create(lv_scr_act(), "更新商品", "更新商品信息成功", btns, false);
  246. lv_obj_add_style(updatebox2, &style1, 0);
  247. lv_obj_add_event_cb(updatebox2, root_goods, LV_EVENT_VALUE_CHANGED, NULL);
  248. lv_obj_center(updatebox2);
  249. }
  250. //确认修改价格
  251. void enter_change(lv_event_t * e)
  252. {
  253. /*创建一个字体*/
  254. static lv_ft_info_t info;//定义一个记录freetype字体信息的结构体
  255. /*记录字体文件路径(开发板) 字号大小-单位借用 字体风格*/
  256. info.name = "/font/simkai.ttf";//字体文件名---华文楷体--文件已经放在开发板中
  257. info.weight = 16;//字号
  258. info.style = FT_FONT_STYLE_NORMAL;//字体风格
  259. info.mem = NULL;//指向字体数据的指针 一般要显示字体时,就会从上面字体文件中获取对应数据 freetype转换为位图数据 ,而mem指针指向这块数据
  260. //初始化
  261. if(!lv_ft_font_init(&info)){
  262. LV_LOG_ERROR("creat.");
  263. }
  264. /*将上面字体添加到下面的lvgl样式对象中*/
  265. static lv_style_t style1;
  266. lv_style_init(&style1);
  267. lv_color_t c = lv_color_hex(0xFF000000);//定义颜色值 黑色
  268. lv_style_set_text_font(&style1, info.font);//设置该样式制定的字体--上面的
  269. lv_style_set_text_align(&style1, LV_TEXT_ALIGN_CENTER);//设置该样式的文本对齐
  270. lv_style_set_text_color(&style1,c);//设置该样式文本颜色
  271. struct link_node *p;
  272. p = e->user_data;
  273. float new;
  274. char *pEnd;
  275. const char * new_price = lv_textarea_get_text(change_price_textarea);//获取价格
  276. new = strtod(new_price, pEnd);
  277. p->price = new;
  278. lv_obj_t * changebox1 = lv_msgbox_create(lv_scr_act(), "更改价格", "更改商品价格成功", btns, false);
  279. lv_obj_add_style(changebox1, &style1, 0);
  280. lv_obj_add_event_cb(changebox1, root_goods, LV_EVENT_VALUE_CHANGED, NULL);
  281. lv_obj_center(changebox1);
  282. }
  283. //修改商品价格
  284. void change_price(lv_event_t * e)
  285. {
  286. struct link_node *p;
  287. p = e->user_data;
  288. lv_obj_clean(lv_scr_act()); // 清理屏幕
  289. lv_obj_t * srg = lv_obj_create(lv_scr_act());
  290. lv_obj_set_style_bg_color(srg, lv_color_hex(0xFFFFFF), 0);//白色
  291. lv_obj_set_size(srg, 800, 480);
  292. lv_obj_set_pos(srg, 0, 0);
  293. //键盘
  294. lv_obj_t * changekb = lv_keyboard_create(lv_scr_act());
  295. lv_keyboard_set_mode(changekb, LV_KEYBOARD_MODE_NUMBER);//设为数字模式
  296. //创建修改文本框
  297. change_price_textarea = lv_textarea_create(lv_scr_act());
  298. lv_obj_align(change_price_textarea, LV_ALIGN_CENTER, 0, -90);
  299. lv_obj_add_event_cb(change_price_textarea, ta_event_cb, LV_EVENT_ALL, changekb);
  300. lv_textarea_set_placeholder_text(change_price_textarea, "price");
  301. lv_textarea_set_one_line(change_price_textarea, true);//设置单行模式
  302. lv_obj_set_size(change_price_textarea, 200, 50);
  303. //确认按钮
  304. lv_obj_t * change_price_btn = lv_btn_create(lv_scr_act());
  305. lv_obj_set_size(change_price_btn, 80, 80);
  306. lv_obj_align(change_price_btn, LV_ALIGN_CENTER, 150, -90);
  307. lv_obj_t * change_price_label = lv_label_create(change_price_btn);
  308. lv_label_set_text(change_price_label, "enter");
  309. lv_obj_align(change_price_label, LV_ALIGN_CENTER, 0, 0);
  310. //返回按钮
  311. lv_obj_t * btn_back = lv_btn_create(lv_scr_act());//返回
  312. lv_obj_set_size(btn_back, 60, 50);
  313. lv_obj_align(btn_back, LV_ALIGN_TOP_LEFT, 0, 0);
  314. lv_obj_t * back_label = lv_label_create(btn_back);
  315. lv_obj_align(back_label, LV_ALIGN_CENTER, 0, 0);
  316. lv_label_set_text(back_label, "back");
  317. //回调函数
  318. lv_obj_add_event_cb(btn_back, manage_goods, LV_EVENT_SHORT_CLICKED, p);//返回
  319. lv_obj_add_event_cb(change_price_btn, enter_change, LV_EVENT_SHORT_CLICKED, p);//确认购买
  320. }
  321. //管理员加商品
  322. void manage_add(lv_event_t *e)
  323. {
  324. struct link_node *p;
  325. p = e->user_data;
  326. p->number++;
  327. /*创建一个字体*/
  328. static lv_ft_info_t info;//定义一个记录freetype字体信息的结构体
  329. /*记录字体文件路径(开发板) 字号大小-单位借用 字体风格*/
  330. info.name = "/font/simkai.ttf";//字体文件名---华文楷体--文件已经放在开发板中
  331. info.weight = 16;//字号
  332. info.style = FT_FONT_STYLE_NORMAL;//字体风格
  333. info.mem = NULL;//指向字体数据的指针 一般要显示字体时,就会从上面字体文件中获取对应数据 freetype转换为位图数据 ,而mem指针指向这块数据
  334. //初始化
  335. if(!lv_ft_font_init(&info)){
  336. LV_LOG_ERROR("creat.");
  337. }
  338. /*将上面字体添加到下面的lvgl样式对象中*/
  339. static lv_style_t style1;
  340. lv_style_init(&style1);
  341. lv_color_t c = lv_color_hex(0xFF000000);//定义颜色值 黑色
  342. lv_style_set_text_font(&style1, info.font);//设置该样式制定的字体--上面的
  343. lv_style_set_text_align(&style1, LV_TEXT_ALIGN_CENTER);//设置该样式的文本对齐
  344. lv_style_set_text_color(&style1,c);//设置该样式文本颜色
  345. lv_obj_clean(lv_scr_act()); // 清理屏幕
  346. /*选项卡列表*/
  347. lv_obj_t * tabview;
  348. tabview = lv_tabview_create(lv_scr_act(), LV_DIR_TOP, 0);//创建选项卡并规定标签方向(为顶部)
  349. lv_obj_set_size(tabview, 800, 480); // 设置选项卡列表的大小
  350. lv_obj_set_pos(tabview, 0, 0);
  351. lv_obj_set_style_bg_color(tabview, lv_color_hex(0xFFFFFF), 0); //背景颜色
  352. //加一个选项卡标签Tab1,不显示
  353. lv_obj_t * tab1 = lv_tabview_add_tab(tabview, "Welcome!");
  354. //定义一个部件,在部件里显示图片,按钮等
  355. lv_obj_t * temp = lv_obj_create(tab1);
  356. lv_obj_set_size(temp, 350, 350);
  357. lv_obj_set_style_bg_color(temp, lv_color_hex(0xFFAC2B), 0);
  358. lv_obj_align(temp, LV_ALIGN_CENTER, 0, 0);
  359. //修改商品价格按钮
  360. lv_obj_t * change_price_btn = lv_btn_create(tab1);
  361. lv_obj_set_size(change_price_btn, 100, 80);
  362. lv_obj_align(change_price_btn, LV_ALIGN_RIGHT_MID, -100, 0);
  363. lv_obj_t * change_price_label = lv_label_create(change_price_btn);
  364. lv_obj_add_style(change_price_label, &style1, 0);
  365. lv_label_set_text(change_price_label, "修改价格");
  366. lv_obj_align(change_price_label, LV_ALIGN_CENTER, 0, 0);
  367. lv_obj_add_event_cb(change_price_btn, change_price, LV_EVENT_SHORT_CLICKED, p);
  368. //删除商品按钮
  369. lv_obj_t * delete_btn = lv_btn_create(tab1);
  370. lv_obj_set_size(delete_btn, 100, 80);
  371. lv_obj_align(delete_btn, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
  372. lv_obj_t * delete_label = lv_label_create(delete_btn);
  373. lv_obj_add_style(delete_label, &style1, 0);
  374. lv_label_set_text(delete_label, "删除商品");
  375. lv_obj_align(delete_label, LV_ALIGN_CENTER, 0, 0);
  376. lv_obj_add_event_cb(delete_btn, delete_goods, LV_EVENT_SHORT_CLICKED, p);
  377. lv_obj_t * add_num = lv_btn_create(temp);//加按钮
  378. lv_obj_t * sub_num = lv_btn_create(temp);//减按钮
  379. lv_obj_t * btn_back = lv_btn_create(temp);//返回
  380. lv_obj_t * img_picture = lv_img_create(temp);//商品图片
  381. lv_obj_t * label_price = lv_label_create(temp); //商品价格
  382. lv_obj_t * label_name = lv_label_create(temp); //商品名
  383. lv_obj_t * label_Margin = lv_label_create(temp); //余量
  384. lv_img_set_src(img_picture, p->jpgpath); // 商品图片
  385. lv_obj_set_size(img_picture, 100, 128); // 设置图片大小
  386. lv_obj_align(img_picture, LV_ALIGN_TOP_MID, 0, 0);
  387. char buf[128] = {"\0"};
  388. sprintf(buf, "%d", p->number); // 商品余量
  389. lv_label_set_text(label_Margin, buf);
  390. lv_obj_align(label_Margin, LV_ALIGN_CENTER, 0, 70);
  391. // 显示标签--商品信息
  392. lv_obj_add_style(label_name, &style1, 0);
  393. lv_label_set_text(label_name, p->cname); // 商品名
  394. lv_obj_align(label_name, LV_ALIGN_CENTER, 0, 30);
  395. sprintf(buf, "¥%.1f", p->price); // 商品价格
  396. lv_label_set_text(label_price, buf);
  397. lv_obj_align(label_price, LV_ALIGN_CENTER, 0, 50);
  398. //加按钮
  399. lv_obj_set_size(add_num, 50, 50);
  400. lv_obj_align(add_num, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
  401. lv_obj_t * add_label = lv_label_create(add_num);//按钮标签
  402. lv_label_set_text(add_label, LV_SYMBOL_PLUS);
  403. lv_obj_align(add_label, LV_ALIGN_CENTER, 0, 0);
  404. //减按钮
  405. lv_obj_set_size(sub_num, 50, 50);
  406. lv_obj_align(sub_num, LV_ALIGN_BOTTOM_LEFT, 0, 0);
  407. lv_obj_t * sub_label = lv_label_create(sub_num);//按钮标签
  408. lv_label_set_text(sub_label, LV_SYMBOL_MINUS);
  409. lv_obj_align(sub_label, LV_ALIGN_CENTER, 0, 0);
  410. //返回按钮
  411. lv_obj_set_size(btn_back, 60, 50);
  412. lv_obj_align(btn_back, LV_ALIGN_TOP_LEFT, 0, 0);
  413. lv_obj_t * back_label = lv_label_create(btn_back);
  414. lv_obj_align(back_label, LV_ALIGN_CENTER, 0, 0);
  415. lv_label_set_text(back_label, "back");
  416. lv_obj_add_event_cb(add_num, manage_add, LV_EVENT_SHORT_CLICKED, p);//加商品
  417. lv_obj_add_event_cb(sub_num, manage_redu, LV_EVENT_SHORT_CLICKED, p);//减商品
  418. lv_obj_add_event_cb(btn_back, root_goods, LV_EVENT_SHORT_CLICKED, NULL);//返回
  419. lv_obj_clear_flag(temp, LV_OBJ_FLAG_SCROLLABLE);
  420. }
  421. //管理员减商品
  422. void manage_redu(lv_event_t *e)
  423. {
  424. struct link_node *p;
  425. p = e->user_data;
  426. if(p->number == 0)
  427. {
  428. return;
  429. }
  430. p->number--;
  431. /*创建一个字体*/
  432. static lv_ft_info_t info;//定义一个记录freetype字体信息的结构体
  433. /*记录字体文件路径(开发板) 字号大小-单位借用 字体风格*/
  434. info.name = "/font/simkai.ttf";//字体文件名---华文楷体--文件已经放在开发板中
  435. info.weight = 16;//字号
  436. info.style = FT_FONT_STYLE_NORMAL;//字体风格
  437. info.mem = NULL;//指向字体数据的指针 一般要显示字体时,就会从上面字体文件中获取对应数据 freetype转换为位图数据 ,而mem指针指向这块数据
  438. //初始化
  439. if(!lv_ft_font_init(&info)){
  440. LV_LOG_ERROR("creat.");
  441. }
  442. /*将上面字体添加到下面的lvgl样式对象中*/
  443. static lv_style_t style1;
  444. lv_style_init(&style1);
  445. lv_color_t c = lv_color_hex(0xFF000000);//定义颜色值 黑色
  446. lv_style_set_text_font(&style1, info.font);//设置该样式制定的字体--上面的
  447. lv_style_set_text_align(&style1, LV_TEXT_ALIGN_CENTER);//设置该样式的文本对齐
  448. lv_style_set_text_color(&style1,c);//设置该样式文本颜色
  449. lv_obj_clean(lv_scr_act()); // 清理屏幕
  450. /*选项卡列表*/
  451. lv_obj_t * tabview;
  452. tabview = lv_tabview_create(lv_scr_act(), LV_DIR_TOP, 0);
  453. lv_obj_set_size(tabview, 800, 480); // 设置选项卡列表的大小
  454. lv_obj_set_pos(tabview, 0, 0);
  455. lv_obj_set_style_bg_color(tabview, lv_color_hex(0xFFFFFF), 0); // 颜色
  456. //加一个标签选项卡Tab1,不显示
  457. lv_obj_t * tab1 = lv_tabview_add_tab(tabview, "Welcome!");
  458. lv_obj_t * temp = lv_obj_create(tab1);
  459. lv_obj_set_size(temp, 350, 350);
  460. lv_obj_set_style_bg_color(temp, lv_color_hex(0xFFAC2B), 0);
  461. lv_obj_align(temp, LV_ALIGN_CENTER, 0, 0);
  462. //修改商品价格按钮
  463. lv_obj_t * change_price_btn = lv_btn_create(tab1);
  464. lv_obj_set_size(change_price_btn, 100, 80);
  465. lv_obj_align(change_price_btn, LV_ALIGN_RIGHT_MID, -100, 0);
  466. lv_obj_t * change_price_label = lv_label_create(change_price_btn);
  467. lv_obj_add_style(change_price_label, &style1, 0);
  468. lv_label_set_text(change_price_label, "修改价格");
  469. lv_obj_align(change_price_label, LV_ALIGN_CENTER, 0, 0);
  470. lv_obj_add_event_cb(change_price_btn, change_price, LV_EVENT_SHORT_CLICKED, p);
  471. //删除商品按钮
  472. lv_obj_t * delete_btn = lv_btn_create(tab1);
  473. lv_obj_set_size(delete_btn, 100, 80);
  474. lv_obj_align(delete_btn, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
  475. lv_obj_t * delete_label = lv_label_create(delete_btn);
  476. lv_obj_add_style(delete_label, &style1, 0);
  477. lv_label_set_text(delete_label, "删除商品");
  478. lv_obj_align(delete_label, LV_ALIGN_CENTER, 0, 0);
  479. lv_obj_add_event_cb(delete_btn, delete_goods, LV_EVENT_SHORT_CLICKED, p);
  480. lv_obj_t * add_num = lv_btn_create(temp);//加按钮
  481. lv_obj_t * sub_num = lv_btn_create(temp);//减按钮
  482. lv_obj_t * btn_back = lv_btn_create(temp);//返回
  483. lv_obj_t * img_picture = lv_img_create(temp);//商品图片
  484. lv_obj_t * label_price = lv_label_create(temp); //商品价格
  485. lv_obj_t * label_name = lv_label_create(temp); //商品名
  486. lv_obj_t * label_Margin = lv_label_create(temp); //余量
  487. lv_img_set_src(img_picture, p->jpgpath); // 商品图片
  488. lv_obj_set_size(img_picture, 100, 128); // 设置图片大小
  489. lv_obj_align(img_picture, LV_ALIGN_TOP_MID, 0, 0);
  490. char buf[128] = {"\0"};
  491. sprintf(buf, "%d", p->number); // 商品余量
  492. lv_label_set_text(label_Margin, buf);
  493. lv_obj_align(label_Margin, LV_ALIGN_CENTER, 0, 70);
  494. // 显示标签--商品信息
  495. lv_obj_add_style(label_name, &style1, 0);
  496. lv_label_set_text(label_name, p->cname); // 商品名
  497. lv_obj_align(label_name, LV_ALIGN_CENTER, 0, 30);
  498. sprintf(buf, "¥%.1f", p->price); // 商品价格
  499. lv_label_set_text(label_price, buf);
  500. lv_obj_align(label_price, LV_ALIGN_CENTER, 0, 50);
  501. //加按钮
  502. lv_obj_set_size(add_num, 50, 50);
  503. lv_obj_align(add_num, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
  504. lv_obj_t * add_label = lv_label_create(add_num);
  505. lv_label_set_text(add_label, LV_SYMBOL_PLUS);
  506. lv_obj_align(add_label, LV_ALIGN_CENTER, 0, 0);
  507. //减按钮
  508. lv_obj_set_size(sub_num, 50, 50);
  509. lv_obj_align(sub_num, LV_ALIGN_BOTTOM_LEFT, 0, 0);
  510. lv_obj_t * sub_label = lv_label_create(sub_num);
  511. lv_label_set_text(sub_label, LV_SYMBOL_MINUS);
  512. lv_obj_align(sub_label, LV_ALIGN_CENTER, 0, 0);
  513. //返回按钮
  514. lv_obj_set_size(btn_back, 60, 50);
  515. lv_obj_align(btn_back, LV_ALIGN_TOP_LEFT, 0, 0);
  516. lv_obj_t * back_label = lv_label_create(btn_back);
  517. lv_obj_align(back_label, LV_ALIGN_CENTER, 0, 0);
  518. lv_label_set_text(back_label, "back");
  519. lv_obj_add_event_cb(add_num, manage_add, LV_EVENT_SHORT_CLICKED, p);//加商品
  520. lv_obj_add_event_cb(sub_num, manage_redu, LV_EVENT_SHORT_CLICKED, p);//减商品
  521. lv_obj_add_event_cb(btn_back, root_goods, LV_EVENT_SHORT_CLICKED, NULL);//减商品
  522. lv_obj_clear_flag(temp, LV_OBJ_FLAG_SCROLLABLE);
  523. }
  524. //管理员商品加减页面
  525. void manage_goods(lv_event_t *e)
  526. {
  527. /*创建一个字体*/
  528. static lv_ft_info_t info;//定义一个记录freetype字体信息的结构体
  529. /*记录字体文件路径(开发板) 字号大小-单位借用 字体风格*/
  530. info.name = "/font/simkai.ttf";//字体文件名---华文楷体--文件已经放在开发板中
  531. info.weight = 16;//字号
  532. info.style = FT_FONT_STYLE_NORMAL;//字体风格
  533. info.mem = NULL;//指向字体数据的指针 一般要显示字体时,就会从上面字体文件中获取对应数据 freetype转换为位图数据 ,而mem指针指向这块数据
  534. //初始化
  535. if(!lv_ft_font_init(&info)){
  536. LV_LOG_ERROR("creat.");
  537. }
  538. /*将上面字体添加到下面的lvgl样式对象中*/
  539. static lv_style_t style1;
  540. lv_style_init(&style1);
  541. lv_color_t c = lv_color_hex(0xFF000000);//定义颜色值 黑色
  542. lv_style_set_text_font(&style1, info.font);//设置该样式制定的字体--上面的
  543. lv_style_set_text_align(&style1, LV_TEXT_ALIGN_CENTER);//设置该样式的文本对齐
  544. lv_style_set_text_color(&style1,c);//设置该样式文本颜色
  545. struct link_node *p;
  546. p = e->user_data;
  547. lv_obj_clean(lv_scr_act()); // 清理屏幕
  548. /*选项卡列表*/
  549. lv_obj_t * tabview;
  550. tabview = lv_tabview_create(lv_scr_act(), LV_DIR_TOP, 0);
  551. lv_obj_set_size(tabview, 800, 480); // 设置选项卡列表的大小
  552. lv_obj_set_pos(tabview, 0, 0);
  553. lv_obj_set_style_bg_color(tabview, lv_color_hex(0xFFFFFF), 0); // 颜色
  554. //加一个标签选项卡Tab1,不显示
  555. lv_obj_t * tab1 = lv_tabview_add_tab(tabview, "Welcome!");
  556. //lv_obj_set_flex_flow(tab1, LV_FLEX_FLOW_ROW_WRAP); // 布局
  557. lv_obj_t * temp = lv_obj_create(tab1);
  558. lv_obj_set_size(temp, 350, 350);
  559. lv_obj_set_style_bg_color(temp, lv_color_hex(0xFFAC2B), 0);
  560. lv_obj_align(temp, LV_ALIGN_CENTER, 0, 0);
  561. //修改商品价格按钮
  562. lv_obj_t * change_price_btn = lv_btn_create(tab1);
  563. lv_obj_set_size(change_price_btn, 100, 80);
  564. lv_obj_align(change_price_btn, LV_ALIGN_RIGHT_MID, -100, 0);
  565. lv_obj_t * change_price_label = lv_label_create(change_price_btn);
  566. lv_obj_add_style(change_price_label, &style1, 0);
  567. lv_label_set_text(change_price_label, "修改价格");
  568. lv_obj_align(change_price_label, LV_ALIGN_CENTER, 0, 0);
  569. lv_obj_add_event_cb(change_price_btn, change_price, LV_EVENT_SHORT_CLICKED, p);
  570. //删除商品按钮
  571. lv_obj_t * delete_btn = lv_btn_create(tab1);
  572. lv_obj_set_size(delete_btn, 100, 80);
  573. lv_obj_align(delete_btn, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
  574. lv_obj_t * delete_label = lv_label_create(delete_btn);
  575. lv_obj_add_style(delete_label, &style1, 0);
  576. lv_label_set_text(delete_label, "删除商品");
  577. lv_obj_align(delete_label, LV_ALIGN_CENTER, 0, 0);
  578. lv_obj_add_event_cb(delete_btn, delete_goods, LV_EVENT_SHORT_CLICKED, p);
  579. lv_obj_t * add_num = lv_btn_create(temp);//加按钮
  580. lv_obj_t * sub_num = lv_btn_create(temp);//减按钮
  581. lv_obj_t * btn_back = lv_btn_create(temp);//返回
  582. lv_obj_t * img_picture = lv_img_create(temp);//商品图片
  583. lv_obj_t * label_price = lv_label_create(temp); //商品价格
  584. lv_obj_t * label_name = lv_label_create(temp); //商品名
  585. lv_obj_t * label_Margin = lv_label_create(temp); //余量
  586. lv_img_set_src(img_picture, p->jpgpath); // 商品图片
  587. lv_obj_set_size(img_picture, 100, 128); // 设置图片大小
  588. lv_obj_align(img_picture, LV_ALIGN_TOP_MID, 0, 0);
  589. char buf[128] = {"\0"};
  590. sprintf(buf, "%d", p->number); // 商品余量
  591. lv_label_set_text(label_Margin, buf);
  592. lv_obj_align(label_Margin, LV_ALIGN_CENTER, 0, 70);
  593. // 显示标签--商品信息
  594. lv_obj_add_style(label_name, &style1, 0);
  595. lv_label_set_text(label_name, p->cname); // 商品名
  596. lv_obj_align(label_name, LV_ALIGN_CENTER, 0, 30);
  597. sprintf(buf, "¥%.1f", p->price); // 商品价格
  598. lv_label_set_text(label_price, buf);
  599. lv_obj_align(label_price, LV_ALIGN_CENTER, 0, 50);
  600. //加按钮
  601. lv_obj_set_size(add_num, 50, 50);
  602. lv_obj_align(add_num, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
  603. lv_obj_t * add_label = lv_label_create(add_num);
  604. lv_label_set_text(add_label, LV_SYMBOL_PLUS);
  605. lv_obj_align(add_label, LV_ALIGN_CENTER, 0, 0);
  606. //减按钮
  607. lv_obj_set_size(sub_num, 50, 50);
  608. lv_obj_align(sub_num, LV_ALIGN_BOTTOM_LEFT, 0, 0);
  609. lv_obj_t * sub_label = lv_label_create(sub_num);
  610. lv_label_set_text(sub_label, LV_SYMBOL_MINUS);
  611. lv_obj_align(sub_label, LV_ALIGN_CENTER, 0, 0);
  612. //返回按钮
  613. lv_obj_set_size(btn_back, 60, 50);
  614. lv_obj_align(btn_back, LV_ALIGN_TOP_LEFT, 0, 0);
  615. lv_obj_t * back_label = lv_label_create(btn_back);
  616. lv_obj_align(back_label, LV_ALIGN_CENTER, 0, 0);
  617. lv_label_set_text(back_label, "back");
  618. lv_obj_add_event_cb(add_num, manage_add, LV_EVENT_SHORT_CLICKED, p);//加商品
  619. lv_obj_add_event_cb(sub_num, manage_redu, LV_EVENT_SHORT_CLICKED, p);//减商品
  620. lv_obj_add_event_cb(btn_back, root_goods, LV_EVENT_SHORT_CLICKED, NULL);//返回
  621. lv_obj_clear_flag(temp, LV_OBJ_FLAG_SCROLLABLE);
  622. }
  623. //管理员商品管理页面
  624. void root_goods(lv_event_t * e)
  625. {
  626. /*创建一个字体*/
  627. static lv_ft_info_t info;//定义一个记录freetype字体信息的结构体
  628. /*记录字体文件路径(开发板) 字号大小-单位借用 字体风格*/
  629. info.name = "/font/simkai.ttf";//字体文件名---华文楷体--文件已经放在开发板中
  630. info.weight = 16;//字号
  631. info.style = FT_FONT_STYLE_NORMAL;//字体风格
  632. info.mem = NULL;//指向字体数据的指针 一般要显示字体时,就会从上面字体文件中获取对应数据 freetype转换为位图数据 ,而mem指针指向这块数据
  633. //初始化
  634. if(!lv_ft_font_init(&info)){
  635. LV_LOG_ERROR("creat.");
  636. }
  637. /*将上面字体添加到下面的lvgl样式对象中*/
  638. static lv_style_t style1;
  639. lv_style_init(&style1);
  640. lv_color_t c = lv_color_hex(0xFF000000);//定义颜色值 黑色
  641. lv_style_set_text_font(&style1, info.font);//设置该样式制定的字体--上面的
  642. lv_style_set_text_align(&style1, LV_TEXT_ALIGN_CENTER);//设置该样式的文本对齐
  643. lv_style_set_text_color(&style1,c);//设置该样式文本颜色
  644. lv_obj_clean(lv_scr_act()); // 清理屏幕
  645. //设置返回按钮
  646. lv_obj_t * back_btn = lv_btn_create(lv_scr_act());
  647. lv_obj_set_size(back_btn, 50, 50);
  648. lv_obj_set_pos(back_btn, 750, 0);
  649. lv_obj_t * btn_label = lv_label_create(back_btn);
  650. lv_label_set_text(btn_label, "back");
  651. lv_obj_align(btn_label, LV_ALIGN_CENTER, 0, 0);
  652. lv_obj_add_event_cb(back_btn, lvgl_tab, LV_EVENT_SHORT_CLICKED, NULL);//返会管理页面
  653. //更新商品信息按钮
  654. lv_obj_t * update_btn = lv_btn_create(lv_scr_act());
  655. lv_obj_set_size(update_btn, 50, 50);
  656. lv_obj_set_pos(update_btn, 750, 215);
  657. lv_obj_t * update_label = lv_label_create(update_btn);
  658. lv_label_set_text(update_label, "update");
  659. lv_obj_align(update_label, LV_ALIGN_CENTER, 0, 0);
  660. lv_obj_add_event_cb(update_btn, update_goods, LV_EVENT_SHORT_CLICKED, NULL);//商品信息更新到文件
  661. /*选项卡列表*/
  662. lv_obj_t * tabview;
  663. tabview = lv_tabview_create(lv_scr_act(), LV_DIR_LEFT, 0);
  664. lv_obj_set_size(tabview, 750, 480); // 设置选项卡列表的大小
  665. lv_obj_set_pos(tabview, 0, 0);
  666. lv_obj_set_style_bg_color(tabview, lv_color_hex(0xFF7F27), 0); // 颜色
  667. //选项卡Tab1
  668. lv_obj_t * tab1 = lv_tabview_add_tab(tabview, "Welcome!");
  669. lv_obj_set_flex_flow(tab1, LV_FLEX_FLOW_ROW_WRAP); //弹性布局,自动帮你布局
  670. struct link_node *p = head->next;
  671. while(1)
  672. {
  673. //先进行一次判断,没有商品就退出
  674. if(p == head)
  675. {
  676. printf("manage info complete\n");
  677. break;
  678. }
  679. lv_obj_t * temp = lv_obj_create(tab1);
  680. lv_obj_set_size(temp, 160, 260); // 设置商品对象的大小
  681. lv_obj_t * label_name = lv_label_create(temp); // 创建标签对象--商品名
  682. lv_obj_t * label_price = lv_label_create(temp); // 创建标签对象--商品价格
  683. lv_obj_t * label_Margin = lv_label_create(temp); // 创建标签对象--商品余量
  684. lv_obj_t * img_picture = lv_img_create(temp); // 创建标签对象--商品照片
  685. // 显示标签--商品信息
  686. lv_obj_add_style(label_name, &style1, 0);
  687. lv_label_set_text(label_name, p->cname); // 商品名
  688. lv_obj_align(label_name, LV_ALIGN_CENTER, 0, 30);
  689. char buf[128] = {"\0"};
  690. sprintf(buf, "%d", p->number); // 商品余量
  691. lv_label_set_text(label_Margin, buf);
  692. lv_obj_align(label_Margin, LV_ALIGN_CENTER, 0, 70);
  693. sprintf(buf, "¥%.1f", p->price); // 商品价格
  694. lv_label_set_text(label_price, buf);
  695. lv_obj_align(label_price, LV_ALIGN_CENTER, 0, 50);
  696. lv_img_set_src(img_picture, p->jpgpath); // 商品图片
  697. lv_obj_set_size(img_picture, 100, 128); // 设置图片大小
  698. lv_obj_set_pos(img_picture, 10, 0);
  699. lv_obj_add_flag(img_picture, LV_OBJ_FLAG_CLICKABLE); // 使图片可点击
  700. lv_obj_add_event_cb(img_picture, manage_goods, LV_EVENT_SHORT_CLICKED, p);
  701. p = p->next;
  702. if(p == head)
  703. {
  704. printf("manage info complete\n");
  705. break;
  706. }
  707. }
  708. lv_obj_clear_flag(lv_tabview_get_content(tabview), LV_OBJ_FLAG_SCROLLABLE);
  709. }
  710. //管理员登录按钮回调函数
  711. static void login_btn_event_cb( lv_event_t * e)
  712. {
  713. /*创建一个字体*/
  714. static lv_ft_info_t info;//定义一个记录freetype字体信息的结构体
  715. /*记录字体文件路径(开发板) 字号大小-单位借用 字体风格*/
  716. info.name = "/font/simkai.ttf";//字体文件名---华文楷体--文件已经放在开发板中
  717. info.weight = 16;//字号
  718. info.style = FT_FONT_STYLE_NORMAL;//字体风格
  719. info.mem = NULL;//指向字体数据的指针 一般要显示字体时,就会从上面字体文件中获取对应数据 freetype转换为位图数据 ,而mem指针指向这块数据
  720. //初始化
  721. if(!lv_ft_font_init(&info)){
  722. LV_LOG_ERROR("creat.");
  723. }
  724. /*将上面字体添加到下面的lvgl样式对象中*/
  725. static lv_style_t style1;
  726. lv_style_init(&style1);
  727. lv_color_t c = lv_color_hex(0xFF000000);//定义颜色值 黑色
  728. lv_style_set_text_font(&style1, info.font);//设置该样式制定的字体--上面的
  729. lv_style_set_text_align(&style1, LV_TEXT_ALIGN_CENTER);//设置该样式的文本对齐
  730. lv_style_set_text_color(&style1,c);//设置该样式文本颜色
  731. const char * username = lv_textarea_get_text(usern);//获取输入的电话号码 lv_textarea_get_text(textarea)
  732. const char * password = lv_textarea_get_text(passw);//获取输入的密码
  733. if((strcmp(username,LOGIN_USER1)==0 || strcmp(username,LOGIN_USER2)==0) && (strcmp(password,LOGIN_PASSWORD)==0))
  734. {
  735. //验证成功
  736. //显示登录成功
  737. //弹窗:登录成功,删除所有控件
  738. lv_obj_t * mbox1 = lv_msgbox_create(lv_scr_act(), "登录", "登录成功", btns, false);
  739. lv_obj_add_style(mbox1, &style1, 0);
  740. lv_obj_add_event_cb(mbox1, root_goods, LV_EVENT_VALUE_CHANGED, NULL);
  741. lv_obj_center(mbox1);
  742. }
  743. else
  744. {
  745. //验证失败,弹出提示
  746. //显示登录失败
  747. lv_obj_t * mbox2 = lv_msgbox_create(lv_scr_act(), "失败", "登录失败\n错误的用户名或密码", btns, false);
  748. lv_obj_add_style(mbox2, &style1, 0);
  749. lv_obj_add_event_cb(mbox2, Root_login, LV_EVENT_VALUE_CHANGED, NULL);
  750. lv_obj_center(mbox2);
  751. }
  752. }
  753. //管理员界面
  754. static void Root_login(lv_event_t * e)
  755. {
  756. static lv_ft_info_t info;//定义一个记录freetype字体信息的结构体
  757. /*记录字体文件路径(开发板) 字号大小-单位借用 字体风格*/
  758. info.name = "/font/simkai.ttf";//字体文件名---华文楷体--文件已经放在开发板中
  759. info.weight = 16;//字号
  760. info.style = FT_FONT_STYLE_NORMAL;//字体风格
  761. info.mem = NULL;//指向字体数据的指针 一般要显示字体时,就会从上面字体文件中获取对应数据 freetype转换为位图数据 ,而mem指针指向这块数据
  762. //初始化
  763. if(!lv_ft_font_init(&info)){
  764. LV_LOG_ERROR("creat.");
  765. }
  766. /*将上面字体添加到下面的lvgl样式对象中*/
  767. static lv_style_t style1;
  768. lv_style_init(&style1);
  769. lv_color_t c = lv_color_hex(0xFF000000);//定义颜色值 黑色
  770. lv_style_set_text_font(&style1, info.font);//设置该样式制定的字体--上面的
  771. lv_style_set_text_align(&style1, LV_TEXT_ALIGN_CENTER);//设置该样式的文本对齐
  772. lv_style_set_text_color(&style1,c);//设置该样式文本颜色
  773. //字体样式2
  774. static lv_ft_info_t info1;//定义一个记录freetype字体信息的结构体
  775. /*记录字体文件路径(开发板) 字号大小-单位借用 字体风格*/
  776. info1.name = "/font/simkai.ttf";//字体文件名---华文楷体--文件已经放在开发板中
  777. info1.weight = 24;//字号
  778. info1.style = FT_FONT_STYLE_NORMAL;//字体风格
  779. info1.mem = NULL;//指向字体数据的指针 一般要显示字体时,就会从上面字体文件中获取对应数据 freetype转换为位图数据 ,而mem指针指向这块数据
  780. //初始化
  781. if(!lv_ft_font_init(&info1)){
  782. LV_LOG_ERROR("creat.");
  783. }
  784. static lv_style_t style2;
  785. lv_style_init(&style2);
  786. lv_color_t c1 = lv_color_hex(0xFF000000);//定义颜色值 黑色
  787. lv_style_set_text_font(&style2, info1.font);//设置该样式制定的字体--上面的
  788. lv_style_set_text_align(&style2, LV_TEXT_ALIGN_CENTER);//设置该样式的文本对齐
  789. lv_style_set_text_color(&style2,c1);//设置该样式文本颜色
  790. lv_obj_clean(lv_scr_act()); // 清理屏幕
  791. lv_obj_t * img = lv_img_create(lv_scr_act());
  792. lv_obj_set_size(img, 800, 480); // 设置大小
  793. lv_obj_set_pos(img, 0, 0); // 位置
  794. lv_img_set_src(img, "S:/mdata/project/aa.jpg");//显示图片
  795. //返回按钮
  796. lv_obj_t *btn;
  797. btn = lv_btn_create(lv_scr_act());
  798. //同时设置部件的大小
  799. lv_obj_set_size(btn, 150, 70);
  800. //同时设置部件的起点坐标
  801. lv_obj_set_pos(btn, 0, 0);
  802. //设置背景的颜色
  803. lv_obj_set_style_bg_color(btn, lv_color_hex(0xFF6464),LV_STATE_DEFAULT); /* 设置部件的样式 */
  804. lv_obj_t *label1;
  805. label1 = lv_label_create(btn);
  806. lv_label_set_text(label1,"back");
  807. lv_obj_set_align(label1, LV_ALIGN_CENTER);//居中
  808. lv_obj_add_event_cb(btn, lvgl_tab, LV_EVENT_PRESSED, NULL);
  809. //键盘
  810. lv_obj_t * kb = lv_keyboard_create(lv_scr_act());
  811. //用户名文本框
  812. usern = lv_textarea_create(lv_scr_act());
  813. lv_obj_align(usern, LV_ALIGN_CENTER, 100, -90);
  814. lv_obj_add_event_cb(usern, ta_event_cb, LV_EVENT_ALL, kb);
  815. lv_textarea_set_placeholder_text(usern, "USERNAME");
  816. lv_textarea_set_one_line(usern, true);//设置单行模式
  817. lv_obj_set_size(usern, 200, 50);
  818. //用户名文本框标签
  819. lv_obj_t * nlabel = lv_label_create(lv_scr_act());//lv_scr_act()
  820. lv_obj_align(nlabel, LV_ALIGN_CENTER, -60, -80);
  821. lv_obj_add_style(nlabel, &style2, 0);
  822. lv_label_set_text(nlabel, "用户名:");
  823. lv_obj_set_size(nlabel, 90, 50);//设置大小
  824. //密码文本框
  825. passw = lv_textarea_create(lv_scr_act());
  826. lv_obj_align(passw, LV_ALIGN_CENTER, 100, -30);
  827. lv_obj_add_event_cb(passw, ta_event_cb, LV_EVENT_ALL, kb);
  828. lv_textarea_set_placeholder_text(passw, "PASSWORD");
  829. lv_textarea_set_one_line(passw, true);//设置单行模式
  830. lv_textarea_set_password_mode(passw, true);//启用密码模式,输入内容会显示*或者·
  831. lv_obj_set_size(passw, 200, 50);
  832. //密码文本框标签
  833. lv_obj_t * plabel = lv_label_create(lv_scr_act());//lv_scr_act()
  834. lv_obj_align(plabel, LV_ALIGN_CENTER, -50, -20);
  835. lv_obj_add_style(plabel, &style2, 0);
  836. lv_label_set_text(plabel, "密码:");
  837. lv_obj_set_size(plabel, 80, 50);//设置大小
  838. //登录按键
  839. lv_obj_t *login_btn = lv_btn_create(lv_scr_act());
  840. lv_obj_align(login_btn, LV_ALIGN_CENTER, 0, 50);
  841. lv_obj_set_size(login_btn, 120, 50);
  842. lv_obj_set_style_bg_color(login_btn, lv_color_hex(0xFFFFFF), 0);
  843. lv_obj_t * label_login = lv_label_create(login_btn);
  844. lv_obj_add_style(label_login, &style1, 0);
  845. lv_label_set_text(label_login, "登录");
  846. lv_obj_align(label_login, LV_ALIGN_CENTER, 0, 0);
  847. lv_obj_add_event_cb(login_btn, login_btn_event_cb, LV_EVENT_PRESSED, NULL);//登录回调函数
  848. lv_obj_set_parent(kb, lv_scr_act());//将键盘置于屏幕的最上层(覆盖按钮)
  849. lv_keyboard_set_textarea(kb, usern);
  850. }
  851. /*****************/
  852. /**商品购买有关函数**/
  853. //商品增加
  854. void goods_add(lv_event_t * e)
  855. {
  856. float r;
  857. char buff[64]={"\0"};
  858. struct buy_info *bnode;
  859. bnode = e->user_data;
  860. if(bnode->sum_goods == bnode->node->number)
  861. {
  862. return;
  863. }
  864. bnode->sum_goods++;
  865. static lv_ft_info_t info;//定义一个记录freetype字体信息的结构体
  866. /*记录字体文件路径(开发板) 字号大小-单位借用 字体风格*/
  867. info.name = "/font/simkai.ttf";//字体文件名---华文楷体--文件已经放在开发板中
  868. info.weight = 16;//字号
  869. info.style = FT_FONT_STYLE_NORMAL;//字体风格
  870. info.mem = NULL;//指向字体数据的指针 一般要显示字体时,就会从上面字体文件中获取对应数据 freetype转换为位图数据 ,而mem指针指向这块数据
  871. //初始化
  872. if(!lv_ft_font_init(&info)){
  873. LV_LOG_ERROR("creat.");
  874. }
  875. /*将上面字体添加到下面的lvgl样式对象中*/
  876. static lv_style_t style1;
  877. lv_style_init(&style1);
  878. lv_color_t c = lv_color_hex(0xFF000000);//定义颜色值 黑色
  879. lv_style_set_text_font(&style1, info.font);//设置该样式制定的字体--上面的
  880. lv_style_set_text_align(&style1, LV_TEXT_ALIGN_CENTER);//设置该样式的文本对齐
  881. lv_style_set_text_color(&style1,c);//设置该样式文本颜色
  882. //选择商品界面(标签页)
  883. lv_obj_t *C_choose = lv_obj_create(lv_scr_act());
  884. lv_obj_set_size(C_choose, 160, 260);//设置大小
  885. lv_obj_set_pos(C_choose, 640, 50);//设置位置
  886. lv_obj_t * img_picture = lv_img_create(C_choose);
  887. lv_img_set_src(img_picture, bnode->node->jpgpath); // 商品图片
  888. lv_obj_set_size(img_picture, 100, 128); // 设置图片大小
  889. lv_obj_align(img_picture, LV_ALIGN_TOP_MID, 0, 0);
  890. lv_obj_t * label_name = lv_label_create(C_choose);
  891. lv_obj_add_style(label_name, &style1, 0);
  892. lv_label_set_text(label_name, bnode->node->cname); // 商品名
  893. lv_obj_align(label_name, LV_ALIGN_CENTER, 0, 30);
  894. //显示购买数量
  895. lv_obj_t * num1 = lv_label_create(C_choose);
  896. lv_obj_add_style(num1, &style1, 0);
  897. sprintf(buff, "数量:%d", bnode->sum_goods);
  898. lv_label_set_text(num1, buff);
  899. lv_obj_set_size(num1, 60, 40); //设置大小
  900. lv_obj_align(num1, LV_ALIGN_BOTTOM_LEFT, -20, 35); //设置位置
  901. //购买数量的总价格
  902. r = bnode->node->price * bnode->sum_goods;
  903. memset(buff, 0, sizeof(buff));
  904. lv_obj_t * num2 = lv_label_create(C_choose);
  905. sprintf(buff, "¥%.1f", r);
  906. lv_label_set_text(num2, buff);
  907. lv_obj_set_size(num2, 50, 40);
  908. lv_obj_align(num2, LV_ALIGN_BOTTOM_RIGHT, 5, 35);
  909. //添加添加按钮
  910. lv_obj_t *add = lv_obj_create(lv_scr_act());
  911. lv_obj_set_size(add, 50, 50);
  912. lv_obj_set_pos(add, 750, 310);
  913. lv_obj_t * add_picture = lv_img_create(lv_scr_act());//添加图片
  914. lv_obj_set_pos(add_picture, 750, 310);
  915. lv_img_set_src(add_picture, "S:/mdata/project/add.jpg");
  916. //添加减少按钮
  917. lv_obj_t *down = lv_obj_create(lv_scr_act());
  918. lv_obj_set_size(down, 50, 50);
  919. lv_obj_set_pos(down, 640, 310);
  920. lv_obj_t * down_picture = lv_img_create(lv_scr_act());//添加图片
  921. lv_obj_set_pos(down_picture, 640, 310);
  922. lv_img_set_src(down_picture, "S:/mdata/project/down.jpg");
  923. //添加确认按钮
  924. lv_obj_t * btn1 = lv_obj_create(lv_scr_act());
  925. lv_obj_set_size(btn1, 85, 65);
  926. lv_obj_align(btn1, LV_ALIGN_BOTTOM_LEFT, 715, 0);
  927. lv_obj_set_style_bg_color(btn1, lv_color_hex(0x4BFF6C), 0);
  928. lv_obj_t * label_en = lv_label_create(btn1);
  929. lv_obj_add_style(label_en, &style1, 0);
  930. lv_label_set_text(label_en, "确认");
  931. lv_obj_center(label_en);
  932. lv_obj_add_event_cb(add, goods_add, LV_EVENT_SHORT_CLICKED, bnode);//商品增加
  933. lv_obj_add_event_cb(down, goods_redu, LV_EVENT_SHORT_CLICKED, bnode);//商品减少
  934. lv_obj_add_event_cb(btn1, decide_buy, LV_EVENT_SHORT_CLICKED, bnode);//确认购买
  935. lv_obj_clear_flag(C_choose, LV_OBJ_FLAG_SCROLLABLE);
  936. }
  937. //商品减少
  938. void goods_redu(lv_event_t * e)
  939. {
  940. float r;
  941. char buff[64]={"\0"};
  942. struct buy_info *bnode;
  943. bnode = e->user_data;
  944. if(bnode->sum_goods == 1)
  945. {
  946. return;
  947. }
  948. bnode->sum_goods--;
  949. static lv_ft_info_t info;//定义一个记录freetype字体信息的结构体
  950. /*记录字体文件路径(开发板) 字号大小-单位借用 字体风格*/
  951. info.name = "/font/simkai.ttf";//字体文件名---华文楷体--文件已经放在开发板中
  952. info.weight = 16;//字号
  953. info.style = FT_FONT_STYLE_NORMAL;//字体风格
  954. info.mem = NULL;//指向字体数据的指针 一般要显示字体时,就会从上面字体文件中获取对应数据 freetype转换为位图数据 ,而mem指针指向这块数据
  955. //初始化
  956. if(!lv_ft_font_init(&info)){
  957. LV_LOG_ERROR("creat.");
  958. }
  959. /*将上面字体添加到下面的lvgl样式对象中*/
  960. static lv_style_t style1;
  961. lv_style_init(&style1);
  962. lv_color_t c = lv_color_hex(0xFF000000);//定义颜色值 黑色
  963. lv_style_set_text_font(&style1, info.font);//设置该样式制定的字体--上面的
  964. lv_style_set_text_align(&style1, LV_TEXT_ALIGN_CENTER);//设置该样式的文本对齐
  965. lv_style_set_text_color(&style1,c);//设置该样式文本颜色
  966. //选择商品界面(标签页)
  967. lv_obj_t *C_choose = lv_obj_create(lv_scr_act());
  968. lv_obj_set_size(C_choose, 160, 260);//设置大小
  969. lv_obj_set_pos(C_choose, 640, 50);//设置位置
  970. lv_obj_t * img_picture = lv_img_create(C_choose);
  971. lv_img_set_src(img_picture, bnode->node->jpgpath); // 商品图片
  972. lv_obj_set_size(img_picture, 100, 128); // 设置图片大小
  973. lv_obj_align(img_picture, LV_ALIGN_TOP_MID, 0, 0);
  974. lv_obj_t * label_name = lv_label_create(C_choose);
  975. lv_obj_add_style(label_name, &style1, 0);
  976. lv_label_set_text(label_name, bnode->node->cname); // 商品名
  977. lv_obj_align(label_name, LV_ALIGN_CENTER, 0, 30);
  978. //显示购买数量
  979. lv_obj_t * num1 = lv_label_create(C_choose);
  980. lv_obj_add_style(num1, &style1, 0);
  981. sprintf(buff, "数量:%d", bnode->sum_goods);
  982. lv_label_set_text(num1, buff);
  983. lv_obj_set_size(num1, 60, 40); //设置大小
  984. lv_obj_align(num1, LV_ALIGN_BOTTOM_LEFT, -20, 35); //设置位置
  985. //购买数量的总价格
  986. r = bnode->node->price * bnode->sum_goods;
  987. memset(buff, 0, sizeof(buff));
  988. lv_obj_t * num2 = lv_label_create(C_choose);
  989. sprintf(buff, "¥%.1f", r);
  990. lv_label_set_text(num2, buff);
  991. lv_obj_set_size(num2, 50, 40);
  992. lv_obj_align(num2, LV_ALIGN_BOTTOM_RIGHT, 5, 35);
  993. //添加添加按钮
  994. lv_obj_t *add = lv_obj_create(lv_scr_act());
  995. lv_obj_set_size(add, 50, 50);
  996. lv_obj_set_pos(add, 750, 310);
  997. lv_obj_t * add_picture = lv_img_create(lv_scr_act());//添加图片
  998. lv_obj_set_pos(add_picture, 750, 310);
  999. lv_img_set_src(add_picture, "S:/mdata/project/add.jpg");
  1000. //添加减少按钮
  1001. lv_obj_t *down = lv_obj_create(lv_scr_act());
  1002. lv_obj_set_size(down, 50, 50);
  1003. lv_obj_set_pos(down, 640, 310);
  1004. lv_obj_t * down_picture = lv_img_create(lv_scr_act());//添加图片
  1005. lv_obj_set_pos(down_picture, 640, 310);
  1006. lv_img_set_src(down_picture, "S:/mdata/project/down.jpg");
  1007. //添加确认按钮
  1008. lv_obj_t * btn1 = lv_obj_create(lv_scr_act());
  1009. lv_obj_set_size(btn1, 85, 65);
  1010. lv_obj_align(btn1, LV_ALIGN_BOTTOM_LEFT, 715, 0);
  1011. lv_obj_set_style_bg_color(btn1, lv_color_hex(0x4BFF6C), 0);
  1012. lv_obj_t * label_en = lv_label_create(btn1);
  1013. lv_obj_add_style(label_en, &style1, 0);
  1014. lv_label_set_text(label_en, "确认");
  1015. lv_obj_center(label_en);
  1016. lv_obj_add_event_cb(add, goods_add, LV_EVENT_SHORT_CLICKED, bnode);//商品增加
  1017. lv_obj_add_event_cb(down, goods_redu, LV_EVENT_SHORT_CLICKED, bnode);//商品增加
  1018. lv_obj_add_event_cb(btn1, decide_buy, LV_EVENT_SHORT_CLICKED, bnode);//确认购买
  1019. lv_obj_clear_flag(C_choose, LV_OBJ_FLAG_SCROLLABLE);
  1020. }
  1021. //确认购买
  1022. void decide_buy(lv_event_t * e)
  1023. {
  1024. //创建个字体
  1025. static lv_ft_info_t info2;//定义一个记录freetype字体信息的结构体
  1026. /*记录字体文件路径(开发板) 字号大小-单位借用 字体风格*/
  1027. info2.name = "/font/simkai.ttf";//字体文件名---华文楷体--文件已经放在开发板中
  1028. info2.weight = 36;//字号
  1029. info2.style = FT_FONT_STYLE_NORMAL;//字体风格
  1030. info2.mem = NULL;//指向字体数据的指针 一般要显示字体时,就会从上面字体文件中获取对应数据 freetype转换为位图数据 ,而mem指针指向这块数据
  1031. //初始化
  1032. if(!lv_ft_font_init(&info2)){
  1033. LV_LOG_ERROR("creat.");
  1034. }
  1035. /*将上面字体添加到下面的lvgl样式对象中*/
  1036. static lv_style_t style2;
  1037. lv_style_init(&style2);
  1038. lv_color_t c = lv_color_hex(0xFF000000);
  1039. lv_style_set_text_font(&style2, info2.font);//设置该样式制定的字体--上面的
  1040. lv_style_set_text_align(&style2, LV_TEXT_ALIGN_CENTER);//设置该样式的文本对齐
  1041. lv_style_set_text_color(&style2,c);//设置该样式文本颜色
  1042. struct buy_info *bnode;
  1043. bnode = e->user_data;
  1044. //选项卡
  1045. lv_obj_t * tabview = lv_tabview_create(lv_scr_act(), LV_DIR_TOP, 0);
  1046. lv_obj_set_size(tabview, 800, 480);
  1047. lv_obj_set_pos(tabview, 0, 0);
  1048. lv_obj_set_style_bg_color(tabview, lv_color_hex(0xFFF0D3), 0);
  1049. lv_obj_t * tab1 = lv_tabview_add_tab(tabview, "Welcome!");
  1050. //文本
  1051. lv_obj_t * label = lv_label_create(tab1);
  1052. lv_obj_set_size(label, 400, 80);
  1053. lv_obj_add_style(label, &style2, 0);
  1054. lv_label_set_text(label, "请选择付款方式");
  1055. lv_obj_align(label, LV_ALIGN_TOP_MID, 0, 0);
  1056. //微信支付
  1057. lv_obj_t *wechat = lv_img_create(tab1);
  1058. lv_img_set_src(wechat, "S:/mdata/project/pay/wechat.jpg");
  1059. lv_obj_set_size(wechat, 250, 340); // 设置图片大小
  1060. lv_obj_align(wechat, LV_ALIGN_CENTER, -130, 10);
  1061. lv_obj_add_flag(wechat, LV_OBJ_FLAG_CLICKABLE); // 使图片可点击
  1062. //lv_obj_set_pos(wechat, 10, 0);
  1063. //支付宝支付
  1064. lv_obj_t *alipay = lv_img_create(tab1);
  1065. lv_img_set_src(alipay, "S:/mdata/project/pay/alipay.jpg");
  1066. lv_obj_set_size(alipay, 250, 340); // 设置图片大小
  1067. lv_obj_align(alipay, LV_ALIGN_CENTER, 130, 10);
  1068. lv_obj_add_flag(alipay, LV_OBJ_FLAG_CLICKABLE); // 使图片可点击
  1069. //返回
  1070. lv_obj_t * btn_back = lv_btn_create(lv_scr_act());
  1071. lv_obj_set_size(btn_back, 60, 50);
  1072. lv_obj_align(btn_back, LV_ALIGN_BOTTOM_LEFT, 0, 0);
  1073. lv_obj_t * back_label = lv_label_create(btn_back);
  1074. lv_obj_align(back_label, LV_ALIGN_CENTER, 0, 0);
  1075. lv_label_set_text(back_label, "back");
  1076. lv_obj_add_event_cb(btn_back, lvgl_tab, LV_EVENT_PRESSED, NULL);//不买回到选择商品页
  1077. lv_obj_add_event_cb(wechat, wechat_success, LV_EVENT_SHORT_CLICKED, bnode);//微信支付
  1078. lv_obj_add_event_cb(alipay, alipay_success, LV_EVENT_SHORT_CLICKED, bnode);//支付宝支付
  1079. lv_obj_clear_flag(lv_tabview_get_content(tabview), LV_OBJ_FLAG_SCROLLABLE);
  1080. }
  1081. //微信支付成功
  1082. void wechat_success(lv_event_t * e)
  1083. {
  1084. /*创建一个字体*/
  1085. static lv_ft_info_t info;//定义一个记录freetype字体信息的结构体
  1086. /*记录字体文件路径(开发板) 字号大小-单位借用 字体风格*/
  1087. info.name = "/font/simkai.ttf";//字体文件名---华文楷体--文件已经放在开发板中
  1088. info.weight = 16;//字号
  1089. info.style = FT_FONT_STYLE_NORMAL;//字体风格
  1090. info.mem = NULL;//指向字体数据的指针 一般要显示字体时,就会从上面字体文件中获取对应数据 freetype转换为位图数据 ,而mem指针指向这块数据
  1091. //初始化
  1092. if(!lv_ft_font_init(&info)){
  1093. LV_LOG_ERROR("creat.");
  1094. }
  1095. /*将上面字体添加到下面的lvgl样式对象中*/
  1096. static lv_style_t style1;
  1097. lv_style_init(&style1);
  1098. lv_color_t c = lv_color_hex(0xFF000000);//定义颜色值 黑色
  1099. lv_style_set_text_font(&style1, info.font);//设置该样式制定的字体--上面的
  1100. lv_style_set_text_align(&style1, LV_TEXT_ALIGN_CENTER);//设置该样式的文本对齐
  1101. lv_style_set_text_color(&style1,c);//设置该样式文本颜色
  1102. float money;
  1103. char send_buff[256] = {0};
  1104. struct buy_info *bnode;
  1105. bnode = e->user_data;
  1106. bnode->node->number = bnode->node->number - bnode->sum_goods;
  1107. money = bnode->node->price * bnode->sum_goods;
  1108. sprintf(send_buff, "%d %s %d %.1f %s", 1, bnode->node->cname, bnode->sum_goods, money, wepay);
  1109. send(sockfd, send_buff, strlen(send_buff), 0);
  1110. lv_obj_t * mbox1 = lv_msgbox_create(lv_scr_act(), "支付", "支付成功", btns, false);
  1111. lv_obj_add_style(mbox1, &style1, 0);
  1112. lv_obj_add_event_cb(mbox1, lvgl_tab, LV_EVENT_VALUE_CHANGED, NULL);
  1113. lv_obj_center(mbox1);
  1114. }
  1115. //支付宝支付成功
  1116. void alipay_success(lv_event_t * e)
  1117. {
  1118. /*创建一个字体*/
  1119. static lv_ft_info_t info;//定义一个记录freetype字体信息的结构体
  1120. /*记录字体文件路径(开发板) 字号大小-单位借用 字体风格*/
  1121. info.name = "/font/simkai.ttf";//字体文件名---华文楷体--文件已经放在开发板中
  1122. info.weight = 16;//字号
  1123. info.style = FT_FONT_STYLE_NORMAL;//字体风格
  1124. info.mem = NULL;//指向字体数据的指针 一般要显示字体时,就会从上面字体文件中获取对应数据 freetype转换为位图数据 ,而mem指针指向这块数据
  1125. //初始化
  1126. if(!lv_ft_font_init(&info)){
  1127. LV_LOG_ERROR("creat.");
  1128. }
  1129. /*将上面字体添加到下面的lvgl样式对象中*/
  1130. static lv_style_t style1;
  1131. lv_style_init(&style1);
  1132. lv_color_t c = lv_color_hex(0xFF000000);//定义颜色值 黑色
  1133. lv_style_set_text_font(&style1, info.font);//设置该样式制定的字体--上面的
  1134. lv_style_set_text_align(&style1, LV_TEXT_ALIGN_CENTER);//设置该样式的文本对齐
  1135. lv_style_set_text_color(&style1,c);//设置该样式文本颜色
  1136. float money;
  1137. char send_buff[256] = {0};
  1138. struct buy_info *bnode;
  1139. bnode = e->user_data;
  1140. bnode->node->number = bnode->node->number - bnode->sum_goods;
  1141. money = bnode->node->price * bnode->sum_goods;
  1142. sprintf(send_buff, "%d %s %d %.1f %s", 1, bnode->node->cname, bnode->sum_goods, money, apay);
  1143. send(sockfd, send_buff, strlen(send_buff), 0);
  1144. lv_obj_t * mbox1 = lv_msgbox_create(lv_scr_act(), "支付", "支付成功", btns, false);
  1145. lv_obj_add_style(mbox1, &style1, 0);
  1146. lv_obj_add_event_cb(mbox1, lvgl_tab, LV_EVENT_VALUE_CHANGED, NULL);
  1147. lv_obj_center(mbox1);
  1148. }
  1149. //商品选择
  1150. void goods_Choose(lv_event_t * e)
  1151. {
  1152. char buff[64]={"\0"};
  1153. struct buy_info *bnode;
  1154. bnode = malloc(sizeof(struct buy_info));//申请大结构体空间
  1155. bnode->node = e->user_data;
  1156. bnode->sum_goods = 1;
  1157. static lv_ft_info_t info;//定义一个记录freetype字体信息的结构体
  1158. /*记录字体文件路径(开发板) 字号大小-单位借用 字体风格*/
  1159. info.name = "/font/simkai.ttf";//字体文件名---华文楷体--文件已经放在开发板中
  1160. info.weight = 16;//字号
  1161. info.style = FT_FONT_STYLE_NORMAL;//字体风格
  1162. info.mem = NULL;//指向字体数据的指针 一般要显示字体时,就会从上面字体文件中获取对应数据 freetype转换为位图数据 ,而mem指针指向这块数据
  1163. //初始化
  1164. if(!lv_ft_font_init(&info)){
  1165. LV_LOG_ERROR("creat.");
  1166. }
  1167. /*将上面字体添加到下面的lvgl样式对象中*/
  1168. static lv_style_t style1;
  1169. lv_style_init(&style1);
  1170. lv_color_t c = lv_color_hex(0xFF000000);//定义颜色值 黑色
  1171. lv_style_set_text_font(&style1, info.font);//设置该样式制定的字体--上面的
  1172. lv_style_set_text_align(&style1, LV_TEXT_ALIGN_CENTER);//设置该样式的文本对齐
  1173. lv_style_set_text_color(&style1,c);//设置该样式文本颜色
  1174. //选择商品界面(标签页)
  1175. lv_obj_t *C_choose = lv_obj_create(lv_scr_act());
  1176. lv_obj_set_size(C_choose, 160, 260);//设置大小
  1177. lv_obj_set_pos(C_choose, 640, 50);//设置位置
  1178. lv_obj_t * img_picture = lv_img_create(C_choose);
  1179. lv_img_set_src(img_picture, bnode->node->jpgpath); // 商品图片
  1180. lv_obj_set_size(img_picture, 100, 128); // 设置图片大小
  1181. lv_obj_align(img_picture, LV_ALIGN_TOP_MID, 0, 0);
  1182. lv_obj_t * label_name = lv_label_create(C_choose);
  1183. lv_obj_add_style(label_name, &style1, 0);
  1184. lv_label_set_text(label_name, bnode->node->cname); // 商品名
  1185. lv_obj_align(label_name, LV_ALIGN_CENTER, 0, 30);
  1186. //显示购买数量
  1187. lv_obj_t * num1 = lv_label_create(C_choose);
  1188. lv_obj_add_style(num1, &style1, 0);
  1189. sprintf(buff, "数量:%d", bnode->sum_goods);
  1190. lv_label_set_text(num1, buff);
  1191. lv_obj_set_size(num1, 60, 40); //设置大小
  1192. lv_obj_align(num1, LV_ALIGN_BOTTOM_LEFT, -20, 35); //设置位置
  1193. //购买数量的总价格
  1194. memset(buff, 0, sizeof(buff));
  1195. lv_obj_t * num2 = lv_label_create(C_choose);
  1196. sprintf(buff, "¥%.1f", bnode->node->price);
  1197. lv_label_set_text(num2, buff);
  1198. lv_obj_set_size(num2, 50, 40);
  1199. lv_obj_align(num2, LV_ALIGN_BOTTOM_RIGHT, 5, 35);
  1200. //添加添加按钮
  1201. lv_obj_t *add = lv_obj_create(lv_scr_act());
  1202. lv_obj_set_size(add, 50, 50);
  1203. lv_obj_set_pos(add, 750, 310);
  1204. lv_obj_t * add_picture = lv_img_create(lv_scr_act());
  1205. lv_obj_set_pos(add_picture, 750, 310);
  1206. lv_img_set_src(add_picture, "S:/mdata/project/add.jpg");
  1207. //添加减少按钮
  1208. lv_obj_t *down = lv_obj_create(lv_scr_act());
  1209. lv_obj_set_size(down, 50, 50);
  1210. lv_obj_set_pos(down, 640, 310);
  1211. lv_obj_t * down_picture = lv_img_create(lv_scr_act());
  1212. lv_obj_set_pos(down_picture, 640, 310);
  1213. lv_img_set_src(down_picture, "S:/mdata/project/down.jpg");
  1214. //添加确认按钮
  1215. lv_obj_t * btn1 = lv_obj_create(lv_scr_act());
  1216. lv_obj_set_size(btn1, 85, 65);
  1217. lv_obj_align(btn1, LV_ALIGN_BOTTOM_LEFT, 715, 0);
  1218. lv_obj_set_style_bg_color(btn1, lv_color_hex(0x4BFF6C), 0);
  1219. lv_obj_t * label_en = lv_label_create(btn1);
  1220. lv_obj_add_style(label_en, &style1, 0);
  1221. lv_label_set_text(label_en, "确认");
  1222. lv_obj_center(label_en);
  1223. lv_obj_add_event_cb(add, goods_add, LV_EVENT_SHORT_CLICKED, bnode);//商品增加
  1224. lv_obj_add_event_cb(btn1, decide_buy, LV_EVENT_SHORT_CLICKED, bnode);//确认购买
  1225. lv_obj_clear_flag(C_choose, LV_OBJ_FLAG_SCROLLABLE);
  1226. //lv_style_set_pattern_image(&style, LV_STATE_DEFAULT, LV_SYMBOL_BLUETOOTH);
  1227. }
  1228. //商品选择
  1229. void goods_search_Choose(struct link_node *node)
  1230. {
  1231. char buff[64]={"\0"};
  1232. struct buy_info *bnode;
  1233. bnode = malloc(sizeof(struct buy_info));//申请大结构体空间
  1234. bnode->node = node;
  1235. bnode->sum_goods = 1;
  1236. static lv_ft_info_t info;//定义一个记录freetype字体信息的结构体
  1237. /*记录字体文件路径(开发板) 字号大小-单位借用 字体风格*/
  1238. info.name = "/font/simkai.ttf";//字体文件名---华文楷体--文件已经放在开发板中
  1239. info.weight = 16;//字号
  1240. info.style = FT_FONT_STYLE_NORMAL;//字体风格
  1241. info.mem = NULL;//指向字体数据的指针 一般要显示字体时,就会从上面字体文件中获取对应数据 freetype转换为位图数据 ,而mem指针指向这块数据
  1242. //初始化
  1243. if(!lv_ft_font_init(&info)){
  1244. LV_LOG_ERROR("creat.");
  1245. }
  1246. /*将上面字体添加到下面的lvgl样式对象中*/
  1247. static lv_style_t style1;
  1248. lv_style_init(&style1);
  1249. lv_color_t c = lv_color_hex(0xFF000000);//定义颜色值 黑色
  1250. lv_style_set_text_font(&style1, info.font);//设置该样式制定的字体--上面的
  1251. lv_style_set_text_align(&style1, LV_TEXT_ALIGN_CENTER);//设置该样式的文本对齐
  1252. lv_style_set_text_color(&style1,c);//设置该样式文本颜色
  1253. //选择商品界面(标签页)
  1254. lv_obj_t *C_choose = lv_obj_create(lv_scr_act());
  1255. lv_obj_set_size(C_choose, 160, 260);//设置大小
  1256. lv_obj_set_pos(C_choose, 640, 50);//设置位置
  1257. lv_obj_t * img_picture = lv_img_create(C_choose);
  1258. lv_img_set_src(img_picture, bnode->node->jpgpath); // 商品图片
  1259. lv_obj_set_size(img_picture, 100, 128); // 设置图片大小
  1260. lv_obj_align(img_picture, LV_ALIGN_TOP_MID, 0, 0);
  1261. lv_obj_t * label_name = lv_label_create(C_choose);
  1262. lv_obj_add_style(label_name, &style1, 0);
  1263. lv_label_set_text(label_name, bnode->node->cname); // 商品名
  1264. lv_obj_align(label_name, LV_ALIGN_CENTER, 0, 30);
  1265. //显示购买数量
  1266. lv_obj_t * num1 = lv_label_create(C_choose);
  1267. lv_obj_add_style(num1, &style1, 0);
  1268. sprintf(buff, "数量:%d", bnode->sum_goods);
  1269. lv_label_set_text(num1, buff);
  1270. lv_obj_set_size(num1, 60, 40); //设置大小
  1271. lv_obj_align(num1, LV_ALIGN_BOTTOM_LEFT, -20, 35); //设置位置
  1272. //购买数量的总价格
  1273. memset(buff, 0, sizeof(buff));
  1274. lv_obj_t * num2 = lv_label_create(C_choose);
  1275. sprintf(buff, "¥%.1f", bnode->node->price);
  1276. lv_label_set_text(num2, buff);
  1277. lv_obj_set_size(num2, 50, 40);
  1278. lv_obj_align(num2, LV_ALIGN_BOTTOM_RIGHT, 5, 35);
  1279. //添加添加按钮
  1280. lv_obj_t *add = lv_obj_create(lv_scr_act());
  1281. lv_obj_set_size(add, 50, 50);
  1282. lv_obj_set_pos(add, 750, 310);
  1283. lv_obj_t * add_picture = lv_img_create(lv_scr_act());
  1284. lv_obj_set_pos(add_picture, 750, 310);
  1285. lv_img_set_src(add_picture, "S:/mdata/project/add.jpg");
  1286. //添加减少按钮
  1287. lv_obj_t *down = lv_obj_create(lv_scr_act());
  1288. lv_obj_set_size(down, 50, 50);
  1289. lv_obj_set_pos(down, 640, 310);
  1290. lv_obj_t * down_picture = lv_img_create(lv_scr_act());
  1291. lv_obj_set_pos(down_picture, 640, 310);
  1292. lv_img_set_src(down_picture, "S:/mdata/project/down.jpg");
  1293. //添加确认按钮
  1294. lv_obj_t * btn1 = lv_obj_create(lv_scr_act());
  1295. lv_obj_set_size(btn1, 85, 65);
  1296. lv_obj_align(btn1, LV_ALIGN_BOTTOM_LEFT, 715, 0);
  1297. lv_obj_set_style_bg_color(btn1, lv_color_hex(0x4BFF6C), 0);
  1298. lv_obj_t * label_en = lv_label_create(btn1);
  1299. lv_obj_add_style(label_en, &style1, 0);
  1300. lv_label_set_text(label_en, "确认");
  1301. lv_obj_center(label_en);
  1302. lv_obj_add_event_cb(add, goods_add, LV_EVENT_SHORT_CLICKED, bnode);//商品增加
  1303. lv_obj_add_event_cb(btn1, decide_buy, LV_EVENT_SHORT_CLICKED, bnode);//确认购买
  1304. lv_obj_clear_flag(C_choose, LV_OBJ_FLAG_SCROLLABLE);
  1305. //lv_style_set_pattern_image(&style, LV_STATE_DEFAULT, LV_SYMBOL_BLUETOOTH);
  1306. }
  1307. //搜索框加键盘
  1308. void search_box(void)
  1309. {
  1310. //文本框
  1311. search = lv_textarea_create(lv_scr_act());
  1312. lv_obj_add_event_cb(search, chack_search, LV_EVENT_SHORT_CLICKED, NULL);
  1313. lv_textarea_set_placeholder_text(search, "SEARCH");
  1314. lv_textarea_set_one_line(search, true);//设置单行模式
  1315. lv_obj_set_size(search, 110, 50);
  1316. lv_obj_set_pos(search, 640, 0);
  1317. //搜索按钮
  1318. lv_obj_t * search_btn = lv_btn_create(lv_scr_act());
  1319. lv_obj_set_size(search_btn, 50, 50);
  1320. lv_obj_set_pos(search_btn, 750, 0);
  1321. lv_obj_t * search_label = lv_label_create(search_btn);
  1322. lv_label_set_text(search_label, LV_SYMBOL_FILE);
  1323. lv_obj_align(search_label, LV_ALIGN_CENTER, 0, 0);
  1324. lv_obj_add_event_cb(search_btn, search_goods, LV_EVENT_PRESSED, NULL);
  1325. }
  1326. //点击搜索框
  1327. void chack_search(lv_event_t * e)
  1328. {
  1329. lv_obj_t * kb = lv_keyboard_create(lv_scr_act());//键盘
  1330. lv_obj_set_parent(kb, lv_scr_act());//将键盘置于屏幕的最上层(覆盖按钮)
  1331. lv_obj_set_size(kb, 640, 200);
  1332. lv_obj_align(kb, LV_ALIGN_BOTTOM_LEFT, 0, 0);
  1333. //文本框
  1334. search = lv_textarea_create(lv_scr_act());
  1335. lv_obj_add_event_cb(search, ta_event_cb, LV_EVENT_ALL, kb);
  1336. lv_textarea_set_placeholder_text(search, "SEARCH");
  1337. lv_textarea_set_one_line(search, true);//设置单行模式
  1338. lv_obj_set_size(search, 110, 50);
  1339. lv_obj_set_pos(search, 640, 0);
  1340. }
  1341. //搜索
  1342. void search_goods(lv_event_t * e)
  1343. {
  1344. const char * search_area = lv_textarea_get_text(search);//获取输入商品信息
  1345. struct link_node *p;
  1346. p = head->next;
  1347. for(p; p->next != head; p=p->next)
  1348. {
  1349. if(strcmp(search_area, p->name)==0)
  1350. {
  1351. printf("find\n");
  1352. goods_search_Choose(p);
  1353. break;
  1354. }
  1355. }
  1356. }
  1357. //选项卡
  1358. void lvgl_tab(lv_event_t * e)
  1359. {
  1360. //字体格式1
  1361. /*创建一个字体*/
  1362. static lv_ft_info_t info;//定义一个记录freetype字体信息的结构体
  1363. /*记录字体文件路径(开发板) 字号大小-单位借用 字体风格*/
  1364. info.name = "/font/simkai.ttf";//字体文件名---华文楷体--文件已经放在开发板中
  1365. info.weight = 16;//字号
  1366. info.style = FT_FONT_STYLE_NORMAL;//字体风格
  1367. info.mem = NULL;//指向字体数据的指针 一般要显示字体时,就会从上面字体文件中获取对应数据 freetype转换为位图数据 ,而mem指针指向这块数据
  1368. //初始化
  1369. if(!lv_ft_font_init(&info)){
  1370. LV_LOG_ERROR("creat.");
  1371. }
  1372. /*将上面字体添加到下面的lvgl样式对象中*/
  1373. static lv_style_t style1;
  1374. lv_style_init(&style1);
  1375. lv_color_t c = lv_color_hex(0xFF000000);//定义颜色值 黑色
  1376. lv_style_set_text_font(&style1, info.font);//设置该样式制定的字体--上面的
  1377. lv_style_set_text_align(&style1, LV_TEXT_ALIGN_CENTER);//设置该样式的文本对齐
  1378. lv_style_set_text_color(&style1,c);//设置该样式文本颜色
  1379. /*字体格式2*/
  1380. //创建第二个个字体
  1381. static lv_ft_info_t info2;//定义一个记录freetype字体信息的结构体
  1382. /*记录字体文件路径(开发板) 字号大小-单位借用 字体风格*/
  1383. info2.name = "/font/simkai.ttf";//字体文件名---华文楷体--文件已经放在开发板中
  1384. info2.weight = 26;//字号
  1385. info2.style = FT_FONT_STYLE_NORMAL;//字体风格
  1386. info2.mem = NULL;//指向字体数据的指针 一般要显示字体时,就会从上面字体文件中获取对应数据 freetype转换为位图数据 ,而mem指针指向这块数据
  1387. //初始化
  1388. if(!lv_ft_font_init(&info2)){
  1389. LV_LOG_ERROR("creat.");
  1390. }
  1391. /*将上面字体添加到下面的lvgl样式对象中*/
  1392. static lv_style_t style2;
  1393. lv_style_init(&style2);
  1394. lv_style_set_text_font(&style2, info2.font);//设置该样式制定的字体--上面的
  1395. lv_style_set_text_align(&style2, LV_TEXT_ALIGN_CENTER);//设置该样式的文本对齐
  1396. lv_style_set_text_color(&style2,c);//设置该样式文本颜色
  1397. lv_obj_clean(lv_scr_act()); // 清理屏幕
  1398. //选择商品界面
  1399. lv_obj_t *C_choose = lv_obj_create(lv_scr_act());
  1400. lv_obj_set_size(C_choose, 160, 260);
  1401. lv_obj_set_pos(C_choose, 640, 50);
  1402. //初始提示语
  1403. lv_obj_t * label_wel = lv_label_create(C_choose);
  1404. lv_obj_align(label_wel, LV_ALIGN_CENTER, 0, 20);
  1405. lv_obj_add_style(label_wel, &style2, 0);
  1406. lv_label_set_text(label_wel, "欢迎!");
  1407. lv_obj_set_width(label_wel, 100);
  1408. lv_obj_set_height(label_wel, 80);
  1409. // 确定按钮
  1410. lv_obj_t * btn1 = lv_obj_create(lv_scr_act());
  1411. lv_obj_set_size(btn1, 85, 65);
  1412. lv_obj_align(btn1, LV_ALIGN_BOTTOM_LEFT, 715, 0);
  1413. lv_obj_t * label_en = lv_label_create(btn1);
  1414. lv_obj_add_style(label_en, &style1, 0);
  1415. lv_label_set_text(label_en, "确认");
  1416. lv_obj_center(label_en);
  1417. /*选项卡列表*/
  1418. lv_obj_t * tabview;
  1419. tabview = lv_tabview_create(lv_scr_act(), LV_DIR_LEFT, 0);//为0表示选项卡不显示
  1420. lv_obj_set_size(tabview, 570, 480); // 设置选项卡列表的大小
  1421. lv_obj_set_pos(tabview, 70, 0);
  1422. lv_obj_set_style_bg_color(tabview, lv_palette_lighten(LV_PALETTE_LIGHT_BLUE, 2), 0); // 颜色
  1423. lv_obj_t * tab_btns = lv_tabview_get_tab_btns(tabview);
  1424. lv_obj_set_style_bg_color(tab_btns, lv_palette_darken(LV_PALETTE_BLUE, 3), 0);
  1425. lv_obj_set_style_text_color(tab_btns, lv_palette_lighten(LV_PALETTE_BLUE, 6), 0);
  1426. lv_obj_set_style_border_side(tab_btns, LV_BORDER_SIDE_RIGHT, LV_PART_ITEMS | LV_STATE_CHECKED);
  1427. //管理员功能
  1428. lv_obj_t * btn2 = lv_btn_create(lv_scr_act());
  1429. lv_obj_set_size(btn2, 70, 480);
  1430. lv_obj_set_pos(btn2, 0, 0);
  1431. lv_obj_t * label_en2 = lv_label_create(btn2);
  1432. lv_label_set_text(label_en2, "Root");
  1433. lv_obj_center(label_en2);
  1434. lv_obj_add_event_cb(btn2, Root_login, LV_EVENT_LONG_PRESSED, NULL); // 点击广告调出主界面
  1435. //选项卡Tab1
  1436. lv_obj_t * tab1 = lv_tabview_add_tab(tabview, "Welcome!");
  1437. lv_obj_set_flex_flow(tab1, LV_FLEX_FLOW_ROW_WRAP); // 布局
  1438. struct link_node *p = head->next;
  1439. char send_buff[256]={0};
  1440. while(1)
  1441. {
  1442. if(p == head)
  1443. {
  1444. printf("info complete\n");
  1445. break;
  1446. }
  1447. lv_obj_t * temp = lv_obj_create(tab1);
  1448. lv_obj_set_size(temp, 160, 260); // 设置商品对象的大小
  1449. lv_obj_t * label_name = lv_label_create(temp); // 创建标签对象--商品名
  1450. lv_obj_t * label_price = lv_label_create(temp); // 创建标签对象--商品价格
  1451. lv_obj_t * label_Margin = lv_label_create(temp); // 创建标签对象--商品余量
  1452. lv_obj_t * img_picture = lv_img_create(temp); // 创建标签对象--商品照片
  1453. if(p->number > 0) // 商品余量大于0,可以购买
  1454. {
  1455. lv_obj_t * C_add = lv_obj_create(temp); // 购买
  1456. lv_obj_align(C_add, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
  1457. lv_obj_set_size(C_add, 35, 35);
  1458. lv_obj_add_event_cb(C_add, goods_Choose, LV_EVENT_SHORT_CLICKED, p); // 调用选择商品函数
  1459. lv_obj_t * img_picture1 = lv_img_create(temp); // 图片
  1460. lv_obj_align(img_picture1, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
  1461. lv_img_set_src(img_picture1, "S:/mdata/project/buy.jpg");
  1462. }
  1463. if(p->number == 0) // 少于0则不能购买,显示为NULL
  1464. {
  1465. sprintf(send_buff, "%d %s", 2, p->cname);
  1466. send(sockfd, send_buff, strlen(send_buff), 0);
  1467. lv_obj_t * label_null = lv_label_create(temp);
  1468. lv_label_set_text(label_null, "NULL!");
  1469. lv_obj_align(label_null, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
  1470. memset(send_buff, 0, sizeof(send_buff));
  1471. }
  1472. // 显示标签--商品信息
  1473. lv_obj_add_style(label_name, &style1, 0);
  1474. lv_label_set_text(label_name, p->cname); // 商品名
  1475. lv_obj_align(label_name, LV_ALIGN_CENTER, 0, 30);
  1476. char buf[128] = {"\0"};
  1477. sprintf(buf, "¥%.1f", p->price); //转为字符串
  1478. lv_label_set_text(label_price, buf);// 商品价格
  1479. lv_obj_align(label_price, LV_ALIGN_BOTTOM_LEFT, 20, 0);
  1480. sprintf(buf, "%d", p->number); // 商品余量
  1481. lv_label_set_text(label_Margin, buf);
  1482. lv_obj_align(label_Margin, LV_ALIGN_CENTER, 0, 50);
  1483. lv_img_set_src(img_picture, p->jpgpath); // 商品图片
  1484. lv_obj_set_size(img_picture, 100, 128); // 设置图片大小
  1485. lv_obj_set_pos(img_picture, 10, 0);
  1486. p = p->next;
  1487. if(p == head)
  1488. {
  1489. printf("info complete\n");
  1490. break;
  1491. }
  1492. }
  1493. search_box();//搜索框加键盘
  1494. lv_obj_clear_flag(lv_tabview_get_content(tabview), LV_OBJ_FLAG_SCROLLABLE);
  1495. }
  1496. //开屏广告
  1497. void Advertisement(void)
  1498. {
  1499. /*创建一个字体*/
  1500. static lv_ft_info_t info;//定义一个记录freetype字体信息的结构体
  1501. /*记录字体文件路径(开发板) 字号大小-单位借用 字体风格*/
  1502. info.name = "/font/simkai.ttf";//字体文件名---华文楷体--文件已经放在开发板中
  1503. info.weight = 36;//字号
  1504. info.style = FT_FONT_STYLE_NORMAL;//字体风格
  1505. info.mem = NULL;//指向字体数据的指针 一般要显示字体时,就会从上面字体文件中获取对应数据 freetype转换为位图数据 ,而mem指针指向这块数据
  1506. //初始化
  1507. if(!lv_ft_font_init(&info)){
  1508. LV_LOG_ERROR("creat.");
  1509. }
  1510. /*将上面字体添加到下面的lvgl样式对象中*/
  1511. static lv_style_t style1;
  1512. lv_style_init(&style1);
  1513. lv_color_t c = lv_color_hex(0xFF000000);//定义颜色值 黑色
  1514. lv_style_set_text_font(&style1, info.font);//设置该样式制定的字体--上面的
  1515. lv_style_set_text_align(&style1, LV_TEXT_ALIGN_CENTER);//设置该样式的文本对齐
  1516. lv_style_set_text_color(&style1,c);//设置该样式文本颜色
  1517. lv_obj_clean(lv_scr_act()); // 清理屏幕
  1518. lv_obj_t * img_advertisement = lv_img_create(lv_scr_act());
  1519. lv_obj_set_size(img_advertisement, 800, 480); // 设置大小
  1520. lv_obj_set_pos(img_advertisement, 0, 0); // 位置
  1521. lv_img_set_src(img_advertisement, "S:/mdata/project/gg.jpg");
  1522. lv_obj_add_flag(img_advertisement, LV_OBJ_FLAG_CLICKABLE); // 使图片可点击
  1523. // 滚动文字
  1524. lv_obj_t * label1 = lv_label_create(lv_scr_act());
  1525. lv_obj_add_style(label1, &style1, 0);
  1526. lv_label_set_long_mode(label1, LV_LABEL_LONG_SCROLL_CIRCULAR); // 滚动文字
  1527. lv_obj_set_width(label1, 400);
  1528. lv_obj_set_height(label1, 80);
  1529. lv_label_set_text(label1, "长按屏幕开始购买!长按屏幕开始购买!长按屏幕开始购买!"); // 文本
  1530. lv_obj_set_style_text_color(label1, lv_color_hex(0xFFFF00), 0); // 字体颜色
  1531. lv_obj_align(label1, LV_ALIGN_BOTTOM_MID, 0, 0); //位置;参考对象,对齐方式,x轴偏移量,y轴偏移量
  1532. lv_obj_add_event_cb(img_advertisement, lvgl_tab, LV_EVENT_LONG_PRESSED, NULL); // 点击广告调出主界
  1533. }
  1534. //客户端接受数据
  1535. void *recv_data(void *arg)
  1536. {
  1537. int newcentfd = *((int*)arg);
  1538. char recv_buff[1024]={0};
  1539. int ret;
  1540. struct link_node *new_node;
  1541. while(1)
  1542. {
  1543. //接收新商品信息
  1544. ret = recv(newcentfd, recv_buff, sizeof(recv_buff), 0);
  1545. if(ret == 0)
  1546. {
  1547. perror("recv id error!");
  1548. return NULL;
  1549. }
  1550. new_node = request_link_node();
  1551. printf("recv:%s\n", recv_buff);
  1552. //按格式拆分到节点中
  1553. sscanf(recv_buff, "%s %s %s %f %d\n", new_node->jpgpath, new_node->cname, new_node->name, &new_node->price, &new_node->number);
  1554. insert_node_to_list_tail(head, new_node);
  1555. FILE *fp;
  1556. fp = fopen("goods.txt", "a");
  1557. if(fp == NULL)
  1558. {
  1559. perror("open fail");
  1560. return NULL;
  1561. }
  1562. fprintf(fp, "%s %s %s %f %d\n", new_node->jpgpath, new_node->cname, new_node->name, new_node->price, new_node->number);
  1563. fclose(fp);
  1564. }
  1565. }
  1566. //主函数
  1567. int main(void)
  1568. {
  1569. lv_init(); //LVGL程序的初始化
  1570. head = request_link_node();//头节点初始化
  1571. goods_info();
  1572. //第一个部分:对液晶屏进行初始化和注册
  1573. fbdev_init(); //液晶屏的初始化,就是用open打开液晶屏的驱动,然后ioctl获取了液晶屏的参数信息,mmap映射得到了首地址
  1574. /*A small buffer for LittlevGL to draw the screen's content*/
  1575. static lv_color_t buf[DISP_BUF_SIZE]; //定义数组存放要显示的内容 屏幕缓冲区
  1576. static lv_disp_draw_buf_t disp_buf;
  1577. lv_disp_draw_buf_init(&disp_buf, buf, NULL, DISP_BUF_SIZE); //把你刚才定义的那个buf注册到disp_buf里面
  1578. static lv_disp_drv_t disp_drv; //是个结构体
  1579. lv_disp_drv_init(&disp_drv); //初始化液晶屏的驱动,注册相关的信息
  1580. disp_drv.draw_buf = &disp_buf; //把液晶屏的缓冲区保存
  1581. disp_drv.flush_cb = fbdev_flush; //函数指针,fbdev_flush函数是LVGL画点函数
  1582. disp_drv.hor_res = 800; //分辨率
  1583. disp_drv.ver_res = 480;
  1584. lv_disp_drv_register(&disp_drv); //把液晶屏注册到LVGL中
  1585. //第二个部分:对触摸屏进行初始化和注册
  1586. evdev_init(); //open打开触摸屏
  1587. static lv_indev_drv_t indev_drv_1; //结构体变量
  1588. lv_indev_drv_init(&indev_drv_1); //初始化刚才的结构体变量
  1589. indev_drv_1.type = LV_INDEV_TYPE_POINTER; //触摸类型
  1590. indev_drv_1.read_cb = evdev_read; //函数指针,读取保存触摸屏坐标
  1591. lv_indev_t *mouse_indev = lv_indev_drv_register(&indev_drv_1); //把触摸屏注册到LVGL
  1592. //主代码
  1593. int ret;
  1594. //建立套接字
  1595. sockfd = socket(AF_INET, SOCK_STREAM, 0);
  1596. if(sockfd == -1)
  1597. {
  1598. printf("socket failure\n");
  1599. return -1;
  1600. }
  1601. clientAddr.sin_family = AF_INET; //协议 -- IPV4
  1602. clientAddr.sin_port = htons (40000) ; // 绑定端口号
  1603. clientAddr.sin_addr.s_addr = inet_addr("192.168.7.211");//绑定开发板的IP地址
  1604. /*ret = bind(sockfd, (struct sockaddr *)&clientAddr, sizeof(struct sockaddr_in));
  1605. if(ret == -1)
  1606. {
  1607. printf("bind fail\n");
  1608. return -1;
  1609. }*/
  1610. //绑定服务端的IP 宏定义
  1611. serverAddr.sin_family = AF_INET; //协议 -- IPV4
  1612. serverAddr.sin_port = htons (50000) ; // 绑定端口号
  1613. serverAddr.sin_addr.s_addr = inet_addr("192.168.7.212");//绑定Ubuntu的IP地址
  1614. //不连上不往下执行程序
  1615. while(1)
  1616. {
  1617. //连接服务端
  1618. ret = connect(sockfd, (struct sockaddr *)&serverAddr, sizeof(struct sockaddr_in));
  1619. if(ret != -1)
  1620. {
  1621. printf("connect success\n");
  1622. break;;
  1623. }
  1624. }
  1625. //设置线程
  1626. pthread_t thread;
  1627. //设置线程分离属性
  1628. pthread_attr_t attr;
  1629. pthread_attr_init(&attr);
  1630. pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
  1631. //创建线程,接收数据
  1632. pthread_create(&thread, &attr, recv_data, &sockfd);
  1633. Advertisement();//开屏广告
  1634. unsigned int time_count = 0;//计算屏幕空闲时间
  1635. while(1) {
  1636. lv_timer_handler(); //采用轮询的方式,进行各种事件的响应
  1637. usleep(5000); //5ms
  1638. /*屏幕无操作返回广告页面*/
  1639. //printf("lv_timer_get_idle() = %d\n", lv_timer_get_idle());
  1640. //屏幕空闲等于100时,开始计数
  1641. if(lv_timer_get_idle() >= 100)
  1642. {
  1643. time_count++;
  1644. //printf("time_count = %d\n", time_count);
  1645. }
  1646. //不等于100时计数清零
  1647. else
  1648. {
  1649. time_count = 0;
  1650. }
  1651. if(time_count >= 3000)//计数达到3000,大约20秒
  1652. {
  1653. Advertisement();//跳转广告页面
  1654. }
  1655. }
  1656. return 0;
  1657. }
  1658. /*Set in lv_conf.h as `LV_TICK_CUSTOM_SYS_TIME_EXPR`*/
  1659. uint32_t custom_tick_get(void)
  1660. {
  1661. static uint64_t start_ms = 0;
  1662. if(start_ms == 0) {
  1663. struct timeval tv_start;
  1664. gettimeofday(&tv_start, NULL);
  1665. start_ms = (tv_start.tv_sec * 1000000 + tv_start.tv_usec) / 1000;
  1666. }
  1667. struct timeval tv_now;
  1668. gettimeofday(&tv_now, NULL);
  1669. uint64_t now_ms;
  1670. now_ms = (tv_now.tv_sec * 1000000 + tv_now.tv_usec) / 1000;
  1671. uint32_t time_ms = now_ms - start_ms;
  1672. return time_ms;
  1673. }

注意事项:

运行商品信息生成代码,将商品信息文件发送到开发板,将所用图片放进开发板中,自己将主函数中的路径和名字进行修改,改成自己的。

代码中有用到中文字体,详细看这里有道云笔记 (youdao.com)

支付图片需要自己制作两张,不提供。(图片大小可根据部件代码参数进行制作)

因为本人是个大懒b,代码没有一点优化,大家将就着看吧。

代码文件和工程所用到的文件都在里(大概)

【免费】基于LVGL的自动贩卖机系统-GEC6818开发板资源-CSDN文库

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/835590
推荐阅读
相关标签
  

闽ICP备14008679号