演示
一、功能:
面向用户:
1、商品浏览 (LVGL)
2、商品选择
3、商品购买(预留)+存量更新
4、搜索商品(拓展)
面向商家:
1、广告显示
2、订单生成(服务器+数据库)
3、管理员后台对售卖货物的管理
二、框架
1、lvgl库:
①:参考:
欢迎阅读百问网LVGL中文开发手册! — 百问网LVGL中文教程文档 文档
②:屏幕无操作时返回广告页面,在主函数while循环里面检测屏幕空闲度,达到100且到 达一定时间就返回
unsigned int time_count = 0;//计算屏幕空闲时间
/*4、循环不断的监测用户有没有操作屏幕*/
while(1)
{
lv_timer_handler();
usleep(5000);
/*屏幕无操作返回广告页面*/
//printf("lv_timer_get_idle() = %d\n", lv_timer_get_idle());
//屏幕空闲等于100时,开始计数
if(lv_timer_get_idle() >= 100)
{
time_count++;
//printf("time_count = %d\n", time_count);
}
//不等于100时计数清零
else
{
time_count = 0;
}
if(time_count >= 2000)//计数达到2000,大约14秒
{
AdvertisingPage();//跳转广告页面
}
}
2、C基础部分
略
3、系统+网络编程
1、商品信息由本地文件提供变为服务器(虚拟机)数据库提供
2、数据库使用sqlite3,轻量高效,容易操作
3、TCP协议,虚拟机作为服务器,6818开发板为客户端,可以多台客户端连接服务器 (两者之间的通信)
三、部分代码
/*贩卖机主界面*/
void Main_Menu(lv_event_t * e)
{
usleep(50000);
lv_obj_clean(lv_scr_act()); // 清理屏幕
//选择商品界面
C_choose = lv_obj_create(lv_scr_act());
lv_obj_set_size(C_choose, 160, 260);
lv_obj_set_pos(C_choose, 640, 50);
//初始提示语
lv_obj_t * label_wel = lv_label_create(C_choose);
lv_obj_align(label_wel, LV_ALIGN_CENTER, 0, 20);
lv_label_set_text(label_wel, " Welcome!");
lv_obj_set_width(label_wel, 100);
lv_obj_set_height(label_wel, 80);
// 确定按钮
lv_obj_t * btn1 = lv_obj_create(lv_scr_act());
lv_obj_set_size(btn1, 85, 65);
lv_obj_align(btn1, LV_ALIGN_BOTTOM_LEFT, 715, 0);
lv_obj_t * label_en = lv_label_create(btn1);
lv_label_set_text(label_en, "Enter");
lv_obj_center(label_en);
//管理员功能
lv_obj_t * btn2 = lv_btn_create(lv_scr_act());
lv_obj_set_size(btn2, 70, 480);
lv_obj_set_pos(btn2, 0, 0);
lv_obj_t * label_en2 = lv_label_create(btn2);
lv_label_set_text(label_en2, "Root");
lv_obj_center(label_en2);
lv_obj_add_event_cb(btn2, Root_login, LV_EVENT_LONG_PRESSED, NULL); // 点击广告调出主界面
/*选项卡列表*/
lv_obj_t * tabview;
tabview = lv_tabview_create(lv_scr_act(), LV_DIR_LEFT, 0);
lv_obj_set_size(tabview, 570, 480); // 设置选项卡列表的大小
lv_obj_set_pos(tabview, 70, 0);
lv_obj_set_style_bg_color(tabview, lv_palette_lighten(LV_PALETTE_LIGHT_BLUE, 2), 0); // 颜色
lv_obj_t * tab_btns = lv_tabview_get_tab_btns(tabview);
lv_obj_set_style_bg_color(tab_btns, lv_palette_darken(LV_PALETTE_BLUE, 3), 0);
lv_obj_set_style_text_color(tab_btns, lv_palette_lighten(LV_PALETTE_BLUE, 6), 0);
lv_obj_set_style_border_side(tab_btns, LV_BORDER_SIDE_RIGHT, LV_PART_ITEMS | LV_STATE_CHECKED);
/*选项卡Tab1*/
lv_obj_t * tab1 = lv_tabview_add_tab(tabview, "Welcome!");
lv_obj_set_flex_flow(tab1, LV_FLEX_FLOW_ROW_WRAP); // 布局
// Get_CInfo();
CL * p = Head->next;
// 循环根据链表的节点个数来创建对象
while(1) {
lv_obj_t * temp = lv_obj_create(tab1);
lv_obj_set_size(temp, 160, 260); // 设置商品对象的大小
lv_obj_t * label_name = lv_label_create(temp); // 创建标签对象--商品名
lv_obj_t * label_price = lv_label_create(temp); // 创建标签对象--商品价格
lv_obj_t * label_Margin = lv_label_create(temp); // 创建标签对象--商品余量
lv_obj_t * img_picture = lv_img_create(temp); // 创建标签对象--商品照片
if(p->CInfo.CMargin > 0) // 商品余量大于0,可以购买
{
lv_obj_t * C_add = lv_obj_create(temp); // 购买
lv_obj_align(C_add, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
lv_obj_set_size(C_add, 35, 35);
lv_obj_add_event_cb(C_add, CI_Choose, LV_EVENT_SHORT_CLICKED, p); // 调用选择商品函数
lv_obj_t * img_picture1 = lv_img_create(temp); // 图片
lv_obj_align(img_picture1, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
lv_img_set_src(img_picture1, "S:/root/user/mydemo/goumai.bmp");
}
if(p->CInfo.CMargin == 0) // 少于0则不能购买,显示为NULL
{
lv_obj_t * label_null = lv_label_create(temp);
lv_label_set_text(label_null, "NULL!");
lv_obj_align(label_null, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
}
// 显示标签--商品信息
lv_label_set_text(label_name, p->CInfo.CName); // 商品名
lv_obj_align(label_name, LV_ALIGN_CENTER, 0, 30);
char buf[128] = {"\0"};
sprintf(buf, "$%.1f", p->CInfo.CPrice); // 商品价格
lv_label_set_text(label_price, buf);
lv_obj_align(label_price, LV_ALIGN_BOTTOM_LEFT, 20, 0);
sprintf(buf, "%d", p->CInfo.CMargin); // 商品余量
lv_label_set_text(label_Margin, buf);
lv_obj_align(label_Margin, LV_ALIGN_CENTER, 0, 50);
lv_img_set_src(img_picture, p->CInfo.CPicture); // 商品图片
lv_obj_set_size(img_picture, 100, 128); // 设置图片大小
lv_obj_set_pos(img_picture, 0, 0);
// 切换到下一个节点
p = p->next;
if(p == Head) break; // 绘制完成即结束商品打印
}
lv_obj_clear_flag(lv_tabview_get_content(tabview), LV_OBJ_FLAG_SCROLLABLE);
sum = 1; // 更新默认购买数量
Search_box(); // 搜素框+键盘
}
/*广告页面*/
void AdvertisingPage(void)
{
lv_obj_clean(lv_scr_act()); // 清理屏幕
lv_obj_t * img_advertisement = lv_img_create(lv_scr_act());
lv_obj_set_size(img_advertisement, 800, 480); // 设置大小
lv_obj_set_pos(img_advertisement, 0, 0); // 位置
lv_img_set_src(img_advertisement, "S:/root/user/mydemo/gg.bmp");
lv_obj_add_flag(img_advertisement, LV_OBJ_FLAG_CLICKABLE); // 使图片可点击
// 滚动文字
lv_obj_t * label1 = lv_label_create(lv_scr_act());
lv_label_set_long_mode(label1, LV_LABEL_LONG_SCROLL_CIRCULAR); // 滚动文字
lv_obj_set_width(label1, 400);
lv_obj_set_height(label1, 80);
lv_label_set_text(label1, "Tap the screen to start buying! "
"Tap the screen to start buying!"
"Tap the screen to start buying!"); // 文本
lv_obj_set_style_text_color(label1, lv_color_hex(0xED1C1C), LV_PART_SCROLLBAR); // 字体颜色
lv_obj_set_style_text_font(label1, &lv_font_montserrat_36, LV_STATE_DEFAULT);
lv_obj_align(label1, LV_ALIGN_BOTTOM_MID, 0, 0); // 位置;参考对象,对齐方式,x轴偏移量,y轴偏移量
lv_obj_add_event_cb(img_advertisement, Request, LV_EVENT_LONG_PRESSED, NULL);
lv_obj_add_event_cb(img_advertisement, Main_Menu, LV_EVENT_LONG_PRESSED, NULL); // 点击广告调出主界面
}
//获取商品信息
void Get_CInfo(void)
{
char *p = Rbuf;
char *p1;
Head = List_Create();//创建链表
CI temp ;//创建结构体
while(1)
{
p1 = strchr(p,'#');
if(p1 == NULL)
{
break;
}
*p1 = '\0';
strcpy(temp.CName,p);//商品名字
p = p1 + 1;
p1 = strchr(p,'#');
*p1 = '\0';
temp.CID = atoi(p);//商品编号
p = p1+1;
p1 = strchr(p,'#');
*p1 = '\0';
temp.CPrice = atof(p);//商品价格
p = p1+1;
p1 = strchr(p,'#');
*p1 = '\0';
strcpy(temp.CPicture,p);//商品图片地址
p = p1+1;
p1 = strchr(p,'\n');
*p1 = '\0';
temp.CMargin = atoi(p);//商品余量
p = p1+1;
if(p == NULL)
{
break;
}
List_TailInsert(Head,temp );
}
printf("链表:\n");
List_Ergodic(Head,1);
memset(Rbuf,0,sizeof(Rbuf));//清空
}
//读取服务器发送的数据
void *Client_read(void *arg)
{
// int socket_fd = (int)arg;
while(1)
{
// pthread_mutex_lock(&mutex);
ssize_t n = read(socket_fd,Rbuf,sizeof(Rbuf));
printf("收到服务器:%s\n",Rbuf);
// pthread_mutex_unlock(&mutex);
if(n == 0)
{
printf("服务器关闭\n");
exit(0);
}
if(n>0)
{
Get_CInfo();
}
}
// memset(Rbuf,0,sizeof(Rbuf));
// return NULL;
}