设计目标
1、把商品信息存放到文件中
2、程序启动时加载文件信息到数据结构中
3、根据用户选择的功能显示商店或购物车信息
4、根据用户点击的商品添加、删除商店或购物车内容
功能描述
1、侧边功能栏可以浏览商品以及购物车
2、浏览商品时选中商品自动加入购物车,若数量为0则不加入,在购物车点击商品就减少该商品的数量,减至0则移除购物车
3、购物车中显示商品信息,带有翻页功能以及统计总价
4、结账功能会在屏幕显示购物信息,并且保存到文本文件,商店信息也重写到文本,最后退出程序。
浏览商品以及购物车;选中商品自动加入购物车,在购物车点击商品就减少该商品的数量,减至0则移除购物车;购物车中显示商品信息,带有翻页功能以及统计总价;结账功能会在屏幕显示购物信息,并且保存到文本文件,商店信息也重写到文本,最后退出程序。
设计方案
设计一个哈希表存储商店信息,一条链表存储购物车信息。
链表节点结构体包括数据域与指针域,数据域结构体有商品类型、商品名、数量、价格、图片路径。指针域使用内核链表。
设计一个函数解码jpg图片并且映射到lcd
设计字库,在商品图片下面显示商品信息,在左下角提示用户的操作
循环读取用户点击位置以触发相应功能
实现过程
首先读取商店信息的文件到哈希表中,fsanf格式化输入一行一行读取文件到结构体,根据数据结构体中的类别插入到哈希表。初始化LCD,把硬件设备层/dev/fb0映射到用户层,然后显示背景。这里用的图片都是jpg格式,要先对jpg进行解码,然后把24位的jpg图片转为32位才可以在屏幕中显示,最后把转化完的argb信息映射到lcd屏幕。
打开触摸屏/dev/input/event0,循环读取用户点击的位置,如果用户点击的是商店类型,show_list遍历该种类型的哈希表,读取结构体中的商品信息,解码映射jpg图片,并在图片下方使用字库显示商品信息,在进入一个循环读入用户是否要购物,点击右侧功能栏会退出这个循环,在这个循环中,如果用户点击了商品,就会加入购物车,商品数量-1,重新显示商品信息,商品数量为0则提示添加失败。如果用户点击购物车,就会遍历购物车链表,解码映射图片,字库显示信息。点击的位置是图片就购物车数量-1,并且商店的数量会+1,如果数量为0就不会显示在购物车。在此界面设计有翻页,商品的种类超过一页,就可以翻页,第二页内容全部删除则会跳转到前一页。
最后用户点击结账就退出读取用户点击的位置的循环,利用字库显示购物信息,并且保存到文本中,关闭打开的字库、触摸屏结束进程。
实现效果:
主函数
#include "head.h"
float TOTAL_COST = 0;
int GOODS_NUM = 0;
//int (*lcd)[800]=NULL;
int main()
{
//write_shop.c写商店信息
//1 加载商店信息到链表
//初始化哈希表
struct node *hash[3]; //0.饮料, 1.水果 2.零食
init_hash(hash);
//初始化购物车
struct list_head *cart=malloc(sizeof(struct list_head));
INIT_LIST_HEAD(cart);
//加载文件中的数据到哈希表中
load_shop(hash);
//show_hash(hash);//显示哈希表
//初始化LCD
init_lcd();
//显示背景
read_JPEG_file("picture/1-background.jpg",0,0);
//加载字库
font *f = fontLoad("/usr/share/fonts/DroidSansFallback.ttf");
if(f == NULL)puts("加载字库失败");
//提示框
msg_tips(f,"欢迎使用XX商店系统");
//打开触摸屏,在read_screen中打开
// int fd = open("/dev/input/event0",O_RDWR);
// if(fd<0){puts("Failed to open screen");return -1;}
//读输入设备的值**************************************************
read_screen(f,hash,cart);
//关闭触摸屏在read_screen中操作
//close(fd);
//开发板显示购物车进行结账
puts("\n购物信息:");
show_cart(cart);
printf("商品数量 %d ,共消费 %.2f 元\n",GOODS_NUM,TOTAL_COST);
//显示屏幕信息
display_from_cart_to_screen(cart,f);
//保存小票
save_ticket(cart);
//关闭字库
fontUnload(f);
//回写商店
save_shop(hash);
}
//arm-linux-gcc main.c 1-数据结构.c 2-LCD.c 3-map_jpeg.c -o main -L/home/gec/jpeglib/lib -ljpeg -L./ -lm -lfont
1-数据结构.c
#include "head.h"
//#include "list.h"
int GOODS_TYPE_NUM = 0;
//初始化哈希表
void init_hash(struct node *hash[3])
{
for(int i=0;i<3;i++)
{
hash[i] = malloc(sizeof(struct node));
INIT_LIST_HEAD(&hash[i]->list);
}
}
//加载文件
void load_shop(struct node *hash[3])
{
//打开文件
FILE *fp = fopen("shop.txt","r");
if(fp == NULL){puts("open shop.txt fail");return;}
//不断读取文本信息
while (1)
{
//数据结构体
struct shop data;
int ret = fscanf(fp,"%d %s %d %f %s\n",&data.type,data.name,&data.num,&data.price,data.pic_path);
if(ret <= 0){printf("读取完毕\n");return;}
//输出商品信息
//printf("%d %s %d %.2f %s\n",data.type,data.name,data.num,data.price,data.pic_path);
//根据类别插入哈希表
struct node *xnew = malloc(sizeof(struct node));
xnew->data = data;
//插入
list_add_tail(&xnew->list,&hash[data.typ