[linux]基于C语言的自动售货机系统

文章目录

  • 1 项目描述
  • 2 项目需求
  • 3 搭建环境
  • 4 技术描述
  • 5 概要设计
  • 6 主界面
  • 7 商品信息页
  • 8 购物车界面
  • 9 项目总结

1 项目描述

本次项目是基于Linux环境的交叉编译arm-linux-gcc,在GEC6818arm开发板上运行,运用C语言的相关知识利用链表存储商品信息和购物车功能,用户通过触摸屏点击事件选择和购买商品。

2 项目需求

[linux]基于C语言的自动售货机系统_第1张图片

3 搭建环境

开发环境:
Linux
开发工具:
arm-linux-gcc、Notepad++
其他工具:
font库
编程实现:
通过开源代码编译器notepad++编写代码,利用arm-linux-gcc交叉编译,再通过LINUX平台的SSH服务器将编译生成的程序文件传输到开发板中,最后执行。

4 技术描述

  • C语言
  • font库的使用
  • 触摸屏
  • 双向循环链表
  • 文件IO

5 概要设计

整体项目框架设计图如下:
[linux]基于C语言的自动售货机系统_第2张图片

6 主界面

实现思路:
创建链表存取所有商品信息(商品名称,数量,价格),利用触摸屏事件,先确定商品页,再判断每件商品所在坐标。当用户点击商品坐标时,判断出该坐标为第几页第几个商品再切换界面显示商品信息。或者点击购物车,进入购物车界面。
实体效果:
[linux]基于C语言的自动售货机系统_第3张图片
[linux]基于C语言的自动售货机系统_第4张图片

具体部分代码:

while(1)
	{
		//显示主界面一
		printf("\n");
		show_pohoto("yinliao.bmp");		
		tmp_x=0;
		tmp_y=0;
		
       page=yinliao_list(fd,head,head2);//判断用户点击的是第几页的第几个商品,返回页数。(全局变量X,Y保存用户点击的坐标)

       printf("页数=%d\n",page);

	     while(1)
	   {
	           tmp_x=x,tmp_y=y;
			   printf("x=%d y=%d\n",tmp_x,tmp_y);//打印x,y的坐标
			 
			 if(page==1)//显示点击的商品
			 {
				 if(tmp_y>60 &&tmp_y<200 &&tmp_x>80 &&tmp_x<170)//显示第一页第一商品
				 {				            	
                        tmp=seek_pos(head,1);//获取节点						
		                sprintf(buff,"//shangping/%s",tmp->pic_name);//拼接路径		 
						show_pohoto(buff);//显示第一个商品
                        show_num(tmp->num);//字库显示该商品数量				
                        add_shoppingcar(head,head2,tmp,tmp_x,tmp_y,fd,xy);//加入购物车链表	 
						break;												
				 }
				
				else if(tmp_y>60 &&tmp_y<200 && tmp_x>300 &&tmp_x<390)//显示第一页第二个商品
				{
					 //重复上述....
				}
				//以此类推,显示该页其他所有商品
			    
			 }
		   	   
			   if(page==2)//显示点击的商品
				 {
					 if(tmp_y>60 &&tmp_y<200 && tmp_x>80 &&tmp_x<170)//显示第二页第一商品
					 {			                 	
							tmp=seek_pos(head,7);//获取节点						
							sprintf(buff,"//shangping/%s",tmp->pic_name);		 						
							show_pohoto(buff);//显示第七个商品					
							show_num(tmp->num);//显示商品数量
							add_shoppingcar(head,head2,tmp,tmp_x,tmp_y,fd,xy);//加入购物车链表	 
							break;											
					 }
					
					
					if(tmp_y>60 &&tmp_y<200 && tmp_x>300 &&tmp_x<390)//显示第二页第二个商品
					 {
					      //重复上述....
							
					 }
					 //以此类推,显示该页其他所有商品
					
					
				 }
				 if(page==3)//购物车清单界面
				 {
					 break;
				 }
			 
	   }
			 

	  if(page!=3)//单商品信息列表
	  {
	  return_menu(head,head2,tmp,tmp_x,tmp_y,fd,xy);
	 
	  }
	}

7 商品信息页

实现思路:
当用户点击某件商品图标时,通过指针跳转到该商品节点,显示商品图片,名称,价格,数量。再根据触摸屏事件判断坐标,实现上下商品切换(链表节点跳转),购买商品,加入购物车的功能。
实体效果:
商品上下切换:
[linux]基于C语言的自动售货机系统_第5张图片
[linux]基于C语言的自动售货机系统_第6张图片
商品购买,库存更改:
[linux]基于C语言的自动售货机系统_第7张图片
[linux]基于C语言的自动售货机系统_第8张图片
判断节点中商品数量,若为0,则无法购买。库存不足:
[linux]基于C语言的自动售货机系统_第9张图片
加入购物车:
[linux]基于C语言的自动售货机系统_第10张图片
具体部分代码:

int return_menu(struct double_list *head,struct double_list *head2,struct double_list *tmp,int tmp_x,int tmp_y,int fd,struct input_event  xy)//获取商品信息,左右查看商品,购买或者返回菜单
{
	char buff[66]={0};	//接取拼接后的节点信息
	
	while(1)
	{
		read(fd,&xy,sizeof(xy));
		   
		if(xy.type == EV_ABS  && xy.code == ABS_X )
		{
		    tmp_x=xy.value;	
		}
 
		if(xy.type == EV_ABS  && xy.code == ABS_Y)
		{		 
				tmp_y=xy.value;		   		 
		}
		 
	    if(xy.type == EV_KEY && xy.code == BTN_TOUCH && xy.value == 0)
		{	
            printf("x=%d y=%d\n",tmp_x,tmp_y);
			
		    if(tmp_y>400 &&tmp_y<480 && tmp_x>0 &&tmp_x<130)//退出返回主菜单
			 {			   						 
                printf("\n");
			   show_pohoto("yinliao.bmp");
			    break;							 							
			  }
				
		    if(tmp_y>400 &&tmp_y<480 && tmp_x>270 &&tmp_x<530)//购买商品后3秒自动返回
			 {						
			   if(tmp->num==0)
			   {
				   printf("\n");
				   show_pohoto("kucunbuzu.bmp");
				   sleep(2);
				   return 1;
				   
			   }
			   
			   printf("\n");
			   show_pohoto("goumai1.bmp");
               show_word(tmp->price);
			   gouwu_name(tmp->pic_name);
			   tmp->num=(tmp->num)-1;
			   sleep(1);
		   	  
			   printf("\n");
			   show_pohoto("goumai2.bmp");
			   show_word(tmp->price);
			   gouwu_name(tmp->pic_name);
			   sleep(1);
			   
			   printf("\n");
			   show_pohoto("goumai3.bmp");
			  show_word(tmp->price);
			  gouwu_name(tmp->pic_name);
			   sleep(1);
			  	  
			   break;								
			 }
			 
			if( tmp_y>170 &&tmp_y<310 && tmp_x>610 &&tmp_x<800)//显示下个商品以及数量
			{
				if(tmp->next==head)
				{
					tmp=tmp->next;									
				}
					
				tmp=tmp->next;
				bzero(buff,sizeof(buff));
		        sprintf(buff,"//shangping/%s",tmp->pic_name);		 
		        printf("\n");	
	            show_pohoto(buff);
                show_num(tmp->num);//显示商品数量	                                    				
					
			}
			 
			 if( tmp_y>170 &&tmp_y<310 && tmp_x>0 &&tmp_x<190)//显示上个商品以及数量
			{
				if(tmp->prev==head)
				{
					tmp=tmp->prev;									
				}
					
				tmp=tmp->prev;
				bzero(buff,sizeof(buff));
		        sprintf(buff,"//shangping/%s",tmp->pic_name);		 
		        printf("\n");	
	            show_pohoto(buff);
               	show_num(tmp->num);//显示商品数量	
					
			}
            if(tmp_y>400 &&tmp_y<480 &&tmp_x>620 &&tmp_x<800)//购物车
		   {	
				if(tmp->tmp_num>=tmp->num)
				{
					printf("\n");
					show_pohoto("kucunbuzu.bmp");
					sleep(1);
					break;
				}				
				printf("\n");
				show_pohoto("jiarugouwuche.bmp");
				sleep(1);			
				bzero(buff,sizeof(buff));
				sprintf(buff,"//shangping/%s",tmp->pic_name);
				printf("\n");
				tmp->tmp_num+=1;
				show_pohoto(buff);						
				show_num(tmp->num);
						
				printf("加入购物车\n");
				inser_gouwulist(head2,tmp);
				
				head2->price=tmp->price;
				head2->num=1;			
		   }		
		}	
	}	 
	    return 1;
}

8 购物车界面

实现思路:
当用户点击了商品信息页中加入购物车图标时,若库存充足则将该商品名和价格保存到另一条链表之中,当用户进入购物车界面时,遍历购物车链表通过字库显示出所有需要购买商品的信息,再通过清空购物车图标或结账,选择清空链表或者计算所有商品价格,显示结账信息,最后清空链表。
实体效果:
[linux]基于C语言的自动售货机系统_第11张图片
结账
[linux]基于C语言的自动售货机系统_第12张图片
清空购物车
[linux]基于C语言的自动售货机系统_第13张图片
[linux]基于C语言的自动售货机系统_第14张图片
具体部分代码:

if(y>380 &&y<480 && x>650 && x<800)//进入购物车页面
					{						 																								
							show_pohoto("gouwuche.bmp");	
							page=3;//确定饮料页数
							int jiedian;//查看购物车有多少个商品
							jiedian=show_list(head2);//查看购物车信息
							printf("购物车的节点有%d个\n",jiedian);						
							
						switch(jiedian)
						{
                            //.....显示购物车中的商品信息						
							case 4:
							show_gouwu(head2->next->next->next->next->pic_name,10,240);
							show_gouwu_pirce(head2->next->next->next->next->price,240,240);							
							case 3:
							show_gouwu(head2->next->next->next->pic_name,10,200);
							show_gouwu_pirce(head2->next->next->next->price,240,200);						
							case 2:
							show_gouwu(head2->next->next->pic_name,10,160);
							show_gouwu_pirce(head2->next->next->price,240,160);							
							case 1:
							show_gouwu(head2->next->pic_name,10,120);
							show_gouwu_pirce(head2->next->price,240,120);																
						}
														
							while(1)
							{
							read(fd,&xy,sizeof(xy));
				 
								if(xy.type == EV_ABS  && xy.code == ABS_X )
								{
									x=xy.value;
								}								 
								if(xy.type == EV_ABS  && xy.code == ABS_Y)
								{					
										y=xy.value;	 
								}									
								if(xy.type == EV_KEY && xy.code == BTN_TOUCH && xy.value == 0)
								{
											
									if(y>400 &&y<480 &&x>0 &&x<130)//返回菜单
								   {				            	                
									show_pohoto("yinliao.bmp");									
									return page;												
								   }	
								
									if(y>410 &&y<480 &&x>670 &&x<800)//支付成功
								   {				            	                
									
									show_pohoto("gouwuchezhifu.bmp");																		
									//计算购物车总价格
									struct double_list  *q =  head2;
									float gw_price=0;										
									while(q->next !=head2)
									{																
										gw_price+=q->next->price;
										q=q->next;												
									}									
									show_gw_price(gw_price); 																						
									sleep(2);																				
									delete_list(head2);											
                                    jian_num(head);//减去链表1中购物车的库存;
									delete_tmp_num(head);
									return page;												
								   }
								   if(y>410 &&y<480 &&x>310 &&x<440)//清空购物车
								   {				            	                							
									show_pohoto("qingkong.bmp");																																					
									sleep(2);												
									delete_tmp_num(head);
									delete_list(head2);											
									return page;												
								   }				
											
								}		
																								
							}								
                           					
					}

9 项目总结

此次项目主要运用了双向链表的增删查改,对数据的判断和修改,字库的使用,触摸屏坐标的判断。通过不断重复去调试、解决出现的BUG。完善好链表之间的数据交互…从而实现项目的所有功能。

你可能感兴趣的:(项目)