基于GEC6818开辟板实现自动贩卖机(C语言 + lvgl库 + 体系编程 + 网络编程 ...

打印 上一主题 下一主题

主题 661|帖子 661|积分 1983

演示
  
一、功能:

    面向用户:
        1、商品浏览 (LVGL)
        2、商品选择
        3、商品购买(预留)+存量更新
        4、搜索商品(拓展)
    面向商家:
        1、广告表现
        2、订单天生(服务器+数据库)
        3、管理员后台对售卖货物的管理

二、框架

     1、lvgl库:

             ①:参考:
               欢迎阅读百问网LVGL中文开辟手册! — 百问网LVGL中文教程文档 文档
             
             ②:屏幕无操作时返回广告页面,在主函数while循环里面检测屏幕空闲度,达到100且到                       达一定时间就返回
  1.     unsigned int time_count = 0;//计算屏幕空闲时间
  2.     /*4、循环不断的监测用户有没有操作屏幕*/
  3.     while(1)
  4.     {
  5.    
  6.         lv_timer_handler();
  7.         usleep(5000);
  8.         /*屏幕无操作返回广告页面*/
  9.         //printf("lv_timer_get_idle() = %d\n", lv_timer_get_idle());
  10.         //屏幕空闲等于100时,开始计数
  11.         if(lv_timer_get_idle() >= 100)
  12.         {
  13.             time_count++;
  14.             //printf("time_count = %d\n", time_count);
  15.         }
  16.         //不等于100时计数清零
  17.         else
  18.         {
  19.             time_count = 0;
  20.         }
  21.         if(time_count >= 2000)//计数达到2000,大约14秒
  22.         {
  23.             AdvertisingPage();//跳转广告页面
  24.         }
  25.     }
复制代码

     2、C根本部分

          略

    3、体系+网络编程

                1、商品信息由本地文件提供变为服务器(虚拟机)数据库提供
                2、数据库使用sqlite3,轻量高效,容易操作
                3、TCP协议,虚拟机作为服务器,6818开辟板为客户端,可以多台客户端毗连服务器                       (两者之间的通信)

三、部分代码

        
  1. /*贩卖机主界面*/
  2. void Main_Menu(lv_event_t * e)
  3. {
  4.     usleep(50000);
  5.     lv_obj_clean(lv_scr_act()); // 清理屏幕
  6.     //选择商品界面
  7.     C_choose = lv_obj_create(lv_scr_act());
  8.     lv_obj_set_size(C_choose, 160, 260);
  9.     lv_obj_set_pos(C_choose, 640, 50);
  10.     //初始提示语
  11.     lv_obj_t * label_wel = lv_label_create(C_choose);
  12.     lv_obj_align(label_wel, LV_ALIGN_CENTER, 0, 20);
  13.     lv_label_set_text(label_wel, "  Welcome!");
  14.     lv_obj_set_width(label_wel, 100);
  15.     lv_obj_set_height(label_wel, 80);
  16.     // 确定按钮
  17.     lv_obj_t * btn1 = lv_obj_create(lv_scr_act());
  18.     lv_obj_set_size(btn1, 85, 65);
  19.     lv_obj_align(btn1, LV_ALIGN_BOTTOM_LEFT, 715, 0);
  20.     lv_obj_t * label_en = lv_label_create(btn1);
  21.     lv_label_set_text(label_en, "Enter");
  22.     lv_obj_center(label_en);
  23.     //管理员功能
  24.     lv_obj_t * btn2 = lv_btn_create(lv_scr_act());
  25.     lv_obj_set_size(btn2, 70, 480);
  26.     lv_obj_set_pos(btn2, 0, 0);
  27.     lv_obj_t * label_en2 = lv_label_create(btn2);
  28.     lv_label_set_text(label_en2, "Root");
  29.     lv_obj_center(label_en2);
  30.     lv_obj_add_event_cb(btn2, Root_login, LV_EVENT_LONG_PRESSED, NULL); // 点击广告调出主界面
  31.     /*选项卡列表*/
  32.     lv_obj_t * tabview;
  33.     tabview = lv_tabview_create(lv_scr_act(), LV_DIR_LEFT, 0);
  34.     lv_obj_set_size(tabview, 570, 480); // 设置选项卡列表的大小
  35.     lv_obj_set_pos(tabview, 70, 0);
  36.     lv_obj_set_style_bg_color(tabview, lv_palette_lighten(LV_PALETTE_LIGHT_BLUE, 2), 0); // 颜色
  37.     lv_obj_t * tab_btns = lv_tabview_get_tab_btns(tabview);
  38.     lv_obj_set_style_bg_color(tab_btns, lv_palette_darken(LV_PALETTE_BLUE, 3), 0);
  39.     lv_obj_set_style_text_color(tab_btns, lv_palette_lighten(LV_PALETTE_BLUE, 6), 0);
  40.     lv_obj_set_style_border_side(tab_btns, LV_BORDER_SIDE_RIGHT, LV_PART_ITEMS | LV_STATE_CHECKED);
  41.     /*选项卡Tab1*/
  42.     lv_obj_t * tab1 = lv_tabview_add_tab(tabview, "Welcome!");
  43.     lv_obj_set_flex_flow(tab1, LV_FLEX_FLOW_ROW_WRAP); // 布局
  44.     // Get_CInfo();
  45.     CL * p = Head->next;
  46.     // 循环根据链表的节点个数来创建对象
  47.     while(1) {
  48.         lv_obj_t * temp = lv_obj_create(tab1);
  49.       
  50.         lv_obj_set_size(temp, 160, 260); // 设置商品对象的大小
  51.         lv_obj_t * label_name   = lv_label_create(temp); // 创建标签对象--商品名
  52.         lv_obj_t * label_price  = lv_label_create(temp); // 创建标签对象--商品价格
  53.         lv_obj_t * label_Margin = lv_label_create(temp); // 创建标签对象--商品余量
  54.         lv_obj_t * img_picture  = lv_img_create(temp);   // 创建标签对象--商品照片
  55.         if(p->CInfo.CMargin > 0) // 商品余量大于0,可以购买
  56.         {
  57.             lv_obj_t * C_add = lv_obj_create(temp); // 购买
  58.             lv_obj_align(C_add, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
  59.             lv_obj_set_size(C_add, 35, 35);
  60.             lv_obj_add_event_cb(C_add, CI_Choose, LV_EVENT_SHORT_CLICKED, p); // 调用选择商品函数
  61.             lv_obj_t * img_picture1 = lv_img_create(temp);                  // 图片
  62.             lv_obj_align(img_picture1, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
  63.             lv_img_set_src(img_picture1, "S:/root/user/mydemo/goumai.bmp");
  64.         }
  65.         if(p->CInfo.CMargin == 0) // 少于0则不能购买,显示为NULL
  66.         {
  67.             lv_obj_t * label_null = lv_label_create(temp);
  68.             lv_label_set_text(label_null, "NULL!");
  69.             lv_obj_align(label_null, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
  70.         }
  71.         // 显示标签--商品信息
  72.         lv_label_set_text(label_name, p->CInfo.CName); // 商品名
  73.         lv_obj_align(label_name, LV_ALIGN_CENTER, 0, 30);
  74.         char buf[128] = {"\0"};
  75.         sprintf(buf, "$%.1f", p->CInfo.CPrice); // 商品价格
  76.         lv_label_set_text(label_price, buf);
  77.         lv_obj_align(label_price, LV_ALIGN_BOTTOM_LEFT, 20, 0);
  78.         sprintf(buf, "%d", p->CInfo.CMargin); // 商品余量
  79.         lv_label_set_text(label_Margin, buf);
  80.         lv_obj_align(label_Margin, LV_ALIGN_CENTER, 0, 50);
  81.         lv_img_set_src(img_picture, p->CInfo.CPicture); // 商品图片
  82.         lv_obj_set_size(img_picture, 100, 128);         // 设置图片大小
  83.         lv_obj_set_pos(img_picture, 0, 0);
  84.         // 切换到下一个节点
  85.         p = p->next;
  86.         if(p == Head) break; // 绘制完成即结束商品打印
  87.     }
  88.     lv_obj_clear_flag(lv_tabview_get_content(tabview), LV_OBJ_FLAG_SCROLLABLE);
  89.     sum     = 1;  // 更新默认购买数量
  90.     Search_box(); // 搜素框+键盘
  91. }
  92. /*广告页面*/
  93. void AdvertisingPage(void)
  94. {
  95.    
  96.     lv_obj_clean(lv_scr_act()); // 清理屏幕
  97.     lv_obj_t * img_advertisement = lv_img_create(lv_scr_act());
  98.     lv_obj_set_size(img_advertisement, 800, 480); // 设置大小
  99.     lv_obj_set_pos(img_advertisement, 0, 0);      // 位置
  100.     lv_img_set_src(img_advertisement, "S:/root/user/mydemo/gg.bmp");
  101.     lv_obj_add_flag(img_advertisement, LV_OBJ_FLAG_CLICKABLE); // 使图片可点击
  102.     // 滚动文字
  103.     lv_obj_t * label1 = lv_label_create(lv_scr_act());
  104.     lv_label_set_long_mode(label1, LV_LABEL_LONG_SCROLL_CIRCULAR); // 滚动文字
  105.     lv_obj_set_width(label1, 400);
  106.     lv_obj_set_height(label1, 80);
  107.     lv_label_set_text(label1, "Tap the screen to start buying!  "
  108.                               "Tap the screen to start buying!"
  109.                               "Tap the screen to start buying!"); // 文本
  110.     lv_obj_set_style_text_color(label1, lv_color_hex(0xED1C1C), LV_PART_SCROLLBAR); // 字体颜色
  111.     lv_obj_set_style_text_font(label1, &lv_font_montserrat_36, LV_STATE_DEFAULT);
  112.     lv_obj_align(label1, LV_ALIGN_BOTTOM_MID, 0, 0); // 位置;参考对象,对齐方式,x轴偏移量,y轴偏移量
  113.     lv_obj_add_event_cb(img_advertisement, Request, LV_EVENT_LONG_PRESSED, NULL);
  114.     lv_obj_add_event_cb(img_advertisement, Main_Menu, LV_EVENT_LONG_PRESSED, NULL); // 点击广告调出主界面
  115.    
  116. }
复制代码
  1. //获取商品信息
  2. void Get_CInfo(void)
  3. {
  4.     char *p = Rbuf;
  5.     char *p1;
  6.     Head = List_Create();//创建链表
  7.     CI temp ;//创建结构体
  8.     while(1)
  9.     {
  10.         p1 = strchr(p,'#');
  11.         if(p1 == NULL)
  12.         {
  13.             break;
  14.         }
  15.         *p1 = '\0';
  16.         strcpy(temp.CName,p);//商品名字
  17.         p = p1 + 1;
  18.         p1 = strchr(p,'#');
  19.         *p1 = '\0';
  20.         temp.CID = atoi(p);//商品编号
  21.         p = p1+1;
  22.         p1 = strchr(p,'#');
  23.         *p1 = '\0';
  24.         temp.CPrice = atof(p);//商品价格
  25.         p = p1+1;
  26.         p1 = strchr(p,'#');
  27.         *p1 = '\0';
  28.         strcpy(temp.CPicture,p);//商品图片地址
  29.         p = p1+1;
  30.         p1 = strchr(p,'\n');
  31.         *p1 = '\0';
  32.         temp.CMargin = atoi(p);//商品余量
  33.         p = p1+1;
  34.         if(p == NULL)
  35.         {
  36.             break;
  37.         }
  38.         List_TailInsert(Head,temp );
  39.     }
  40.     printf("链表:\n");
  41.     List_Ergodic(Head,1);
  42.     memset(Rbuf,0,sizeof(Rbuf));//清空
  43.    
  44. }
  45. //读取服务器发送的数据
  46. void *Client_read(void *arg)
  47. {   
  48.     // int  socket_fd = (int)arg;
  49.     while(1)
  50.     {
  51.         // pthread_mutex_lock(&mutex);
  52.         ssize_t n = read(socket_fd,Rbuf,sizeof(Rbuf));
  53.         printf("收到服务器:%s\n",Rbuf);
  54.         // pthread_mutex_unlock(&mutex);
  55.         if(n == 0)
  56.         {
  57.             printf("服务器关闭\n");
  58.             exit(0);
  59.         }
  60.         if(n>0)
  61.         {
  62.             Get_CInfo();
  63.         }
  64.     }
  65.    
  66.     // memset(Rbuf,0,sizeof(Rbuf));
  67.     // return NULL;   
  68. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

李优秀

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表