5.3无线点菜系统后台PC功能实现
在PC后台上主要有两大功能,就是结账和统计餐厅一个月内的营业情况。
在PC机上装有SQLite数据库,在该数据库中建立一张和点菜终端一摸一样的表,PC机可以通过从点菜终端发过来的ID进行查表,主要是调用SQLite提供的函数sqlite3_get_table(db,sql,&foods,&row,&column,&errmsg),sql为要查询的SQL语句。根据ID查询出来的菜的价格存储到一个数组里,当顾客要结账时就对该数据的成员进行累加,得出的金额就是顾客所付的金额。
5.4本章小结
在本章主要论述了如何实现点菜系统的功能。主要分三大模块开实现:点菜终端实现、ZigBee通讯模块实现、后台PC机模块实现。在三大模块中重点是讲述点菜终端的实现。在点菜终端模块中可以独立出三大子模块的实现分别是:嵌入式数据库SQLite实现、MiniGui模块实现、PXA270实现。
6 总结与展望.
基于ZigBee无线电子点菜系统分成前端和后台两大部分,在前端部分中主要有点菜、呼叫酒水,取消预点菜和酒水,以及发送预点菜和酒水到后台PC机,所以的前端功能都是通过点击触摸屏来实现的。后台PC端具有结账和统计功能。在整个无线点菜系统中,重点是在前端点菜终端的实现,其中在点菜终端中难点是MiniGui界面编写、移植和 MiniGui在PXA270上实现触摸屏。在经过了一个多月的苦战,我终于把这些难点一一击破。在这段时间里,曾经遇到了很多难题,尝试了很多失败,在困难和挫折面前曾经想过要放弃,可就在我想要放弃的那一霎那:如果我想在放弃了那么我将带着我遗憾毕业,带着我的挫败感毕业,大学四年我真的不想就带着这种心里阴影毕业,如果我不放弃继续坚持下去,即使我没做出来,那也证明我是努力过,为着我的毕业作品奋斗过,那毕业时我也不会有什么遗憾,我可以骄傲地毕业。就在这种心理的作用下,我每天都除了睡觉时间,其余时间都是在做我的毕业作品。在MiniGui触摸屏那一模块中,我花了有差不多三个星期去搞,每天早出晚归留在实验室做我的毕业作品。晚上回到宿舍也继续苦干到两三点。最后老天不负苦心人,总于让我实现了MiniGui在PXA270上的触摸屏功能。在接下来的工作中我就开始修改我的点菜界面,开始的界面做得比较简单,后来在老师的指导下,我开始重新去规划我的点菜终端界面,让它实现更多的功能,以及更完善更美观。
在整个做无线点菜系统的过程中,我不但学会了很多嵌入式的知识,更重要的是我在学习的过程中领悟到了很多人生宝贵的真理。只要你不放弃,永远都会有奇迹发生,只要有毅力有信心有恒心,面对的苦难都不是困难,这就证明:一分耕耘一分收获。
在本人毕业设计—基于ZigBee无线电子点菜系统中,基本已经实现了点菜,呼叫酒水以及结账等功能,能够成功地把所点的菜以及酒水等信息通过ZigBee无线设备发送到后台PC机上,在后台PC机可以对ZigBee发送过来的信息进行查表处理。整个系统可以逼真地模拟顾客在餐厅点菜的流程,体现了高新技术服务于人。在该系统中有些地方时需要完善。第一MiniGui的软键盘的实现,这是为了方便顾在点同种菜、酒水的时候可以输入份数,而不用一个个地点。第二MiniGui触摸屏的校正问题,需要有更精确的算法。
参考文献
[1]周立功:《ARM嵌入式MiniGui初步与应用开发范例》[M],北京航空航天大学出版社
[2]石秀名 魏洪兴:《嵌入式系统原理与应用》[M],北京航空航天大学出版社
[3]孟庆昌 牛欣源:《Linux 教程》[M],电子工业出版社
[4]魏永明:《嵌入式软件开发及C语言实现-MiniGui剖析》[M],电子工业出版社
[5]《MiniGui编程指南》[-EB/OL],北京飞漫软件技术有限公司
[6]何玉洁:《数据库原理与应用》[M],机械工业出版社
[7]李洋 :《UML和模式应用》[M],机械工业出版社
[8]周明德:《微机原理与接口技术》[M],人民邮电出版社
[9]严蔚敏 吴伟民:《数据结构》[M],清华大学出版社
[10]王军 崔同良:《ADO.NET》[M], 程序设计教程与实验
附 录
menu.c 代码如下:
/////////////////////////////////////////////////////////////////////数据库建立
static void open_sqlite()
{
int rc;
rc = sqlite3_open("dish.db", &db);
if( rc )
{
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}
//else printf("OK\n");
}
static void init(char ***out)
{
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
static void clean_up(HWND hWnd)
{
}
static void show_win(HWND hWnd,int page) //显示窗口
{
}
////////////////////////////////////////////////////////////////////////////////////////////////////填充到列表框中
static void initdish(HWND hDlg,char *foodstring,char **out)
{
}
static void fill_food (HWND hDlg,char **dish,char **dish_tosec)
{
}
//菜系回调函数
static void foods_notif_proc(HWND hwnd,int id,int nc,DWORD add_data)
{
if(nc==LBN_CLICKED||nc==LBN_ENTER)
{
int clickn=SendMessage(hwnd,LB_GETCURSEL,0,0L);
if(clickn>=0)
{
char string[50]; SendMessage(hwnd,LB_GETTEXT,clickn,(LPARAM)string);
food=string;
initdish(GetParent(hwnd),string,dish_tosec);
fill_food(GetParent(hwnd),dish,dish_tosec);
}
}
}
static void calue(HWND hDlg) //计算金额
{
}
static void foods_notif_add (HWND hWnd,int id,int nc,DWORD add_data)
{
char *errmsg=0;
char value[100];
open_sqlite();
sprintf(value,"INSERT INTO t1 VALUES('%s')",dish_tosec[next]);
sqlite3_exec(db,value,0,0,&errmsg);
SendDlgItemMessage(GetParent(hWnd),IDL_Add,LB_ADDSTRING,0,dish_tosec[next]);
calue(hWnd);
}
static void foods_notif_next(HWND hDlg,int id,WPARAM nc,DWORD add_data)
{
HDC hdc;
RECT rect;
char **result,**result1;
char *errmsg,*errmsg1;
int nrow,nrow1,ncolumn,ncolumn1;
char value[100],value1[100];
next++;
if(next>=(hang+1)*lie)
next=1;
sprintf(value,"select b from cdish where dishname='%s'",dish_tosec[next]);
sqlite3_get_table(db,value,&result,&nrow,&ncolumn,&errmsg );
sprintf(value1,"select b1 from cdish where dishname='%s'",dish_tosec[next]);
sqlite3_get_table(db,value1,&result1,&nrow1,&ncolumn1,&errmsg1 );
hdc = GetClientDC(GetParent(hDlg));
rect.left = 200+50;
rect.right =rect.left+150;
rect.top = 90;
rect.bottom = rect.top+110;
SetBkMode(hdc,BM_TRANSPARENT); InvalidateRect (GetParent(hDlg),&rect,TRUE);
if(LoadBitmap(hdc,&delet,result[1]))
DrawText(hdc,"不能打开图片 ",-1,&rect,DT_LEFT) ;
else
FillBoxWithBitmap(hdc, 200+50, 90, 150, 110,&delet);
ReleaseDC(hdc);
UnloadBitmap (&delet);
hdc = GetClientDC(GetParent(hDlg));
rect.left = 360+50;
rect.right =rect.left+150;
rect.top = 90;
rect.bottom = rect.top+110;
SetBkMode(hdc,BM_TRANSPARENT); InvalidateRect (GetParent(hDlg),&rect,TRUE);
DrawText(hdc,result1[1],-1,&rect,DT_LEFT);
ReleaseDC(hdc);
if(next>(hang+1)*lie)
next=1;
}
static void foods_notif_chose(HWND hwnd,int id,int nc,DWORD add_data)
{
if(nc==LBN_CLICKED||nc==LBN_ENTER)
{
int clickn=SendMessage(hwnd,LB_GETCURSEL,0,0L);
if(clickn>=0)
{
char string[50];//如果改成指针,出现内存错误,花了三个小时查找!
SendMessage(hwnd,LB_GETTEXT,clickn,(LPARAM)del);