⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main_func.c

📁 手机点菜系统手机端,利用GPRS实现菜名上报
💻 C
📖 第 1 页 / 共 3 页
字号:
//*********************************************************************************************************
//File    : main_func.c
//Function: main function
//**********************************************************************************************************
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <api.h>
#include <database.h>

#include "ExEH0218.h"
#include "db.h"
#include "common.h"
#include "hd_dt_wl.h"

extern unsigned char g_desk_NO[4+1];
extern unsigned char g_person_num;
extern unsigned char g_waiter_NO[4+1];
extern unsigned char g_waiter_PWD[4+1];
extern unsigned int ac_time;
extern unsigned int ac_wage=0;
extern unsigned char g_id_self;
extern unsigned char g_id_server;
extern unsigned char g_comm_current_id;
extern unsigned char g_menu_set_float_percent;
tab_client_menu *p_client_rec_Temp_lzm;
int Temp;
unsigned long append_count_count;
unsigned long append_count_count1;

unsigned char g_upld_client_mode = 0;
short select_append(unsigned char *p_menu,tab_client_menu *p_client_rec,int *p_cPtr,int *p_lPtr,int k);//定义--0610-LZM
short select_appenda(unsigned char *p_menu,tab_client_menu *p_client_rec,int *p_cPtr,int *p_lPtr,int k);//
short get_new_start_item_dish(const unsigned long *p_arr_ids,unsigned long num_ids,int method,
			      const unsigned char *str_input,int len_str_input,unsigned long *p_new_start_item);
short get_new_start_item_append(const unsigned long *p_arr_ids,unsigned long num_ids,int method,
			        const unsigned char *str_input,int len_str_input,unsigned long *p_new_start_item);
short get_dish_info_by_NO(unsigned char *p_dish_NO,tab_menu **p_rec);
short browse_client_dish(int d_type,int seq_backup,int flag_last);
//const char mMenu_append[8*16+2] = "1.忌糖          2.低糖          3.低辣          4.忌辣          5.忌盐          6.低盐          7.忌油          8.少油           \0";
int delete_client_menu();//删除
int delete_mode();//删除方式
short browse_append(unsigned char *p_menu_namelzm,unsigned long *p_arr_idlzm);
Temp=0;

//-----------------------------------------------------------------------------------------------
//Function   : get_menu_str
//Description: 获取菜单列表中所有的菜品名称的显示字符串
//Input      : 
//	       method =〉0:编号 1:拼音
//Output     : p_menu_names  每个菜品16字节
//             p_arr_ids:    表(ID_TAB_MENU)中的位置,非id号 
//             p_total  :   菜品的数量
//Return     : SUCCESSFUL
//             -1
//             -2
//-----------------------------------------------------------------------------------------------
short get_menu_str(unsigned char *p_menu_names,unsigned long *p_arr_ids,int method,unsigned long *p_total)
{
	unsigned long counter,i,j;
	tab_menu *p_menu_rec;
	char flag;

	counter = DB_count_records(ID_TAB_MENU);
	if(counter<=0)
	{
		DispStr_CE(0,1,"请下载菜谱!",DISP_CENTER|DISP_CLRSCR);
		delay_and_wait_key(0,EXIT_KEY_ALL,0);
		return -1;
	}
	if(counter>=MAX_MENU_ITEM)
	{
		DispStr_CE(0,1,"菜谱超过最大值",DISP_CENTER|DISP_CLRSCR);
		delay_and_wait_key(0,EXIT_KEY_ALL,0);
		return -2;
	}
	if(method==0) //编号
	{
		for(i=0;i<counter;i++)
		{
			p_menu_rec = DB_jump_to_record(ID_TAB_MENU,i,&flag);
			memcpy(p_menu_names+i*16,p_menu_rec->name,16);
			for(j=0;j<16;j++)
			{
				if(*(p_menu_names+i*16+j)==0)
				 	*(p_menu_names+i*16+j) = ' ';
			}
			*(p_arr_ids+i) = i;
		}
	} else {		//1:拼音
		for(i=0;i<counter;i++)
		{
			p_menu_rec = DB_jump_to_record(ID_TAB_MENU,i,&flag);
			if(p_menu_rec->abbr_seq>=MAX_MENU_ITEM)
			{
				 DispStr_CE(0,2,"缩写编号有错误",DISP_CENTER|DISP_CLRSCR);
				 delay_and_wait_key(0,EXIT_KEY_ALL,0);
				 return FAILURE;
			}
			memcpy(p_menu_names+p_menu_rec->abbr_seq*16,p_menu_rec->name,16);
			for(j=0;j<16;j++)
			{
				if(*(p_menu_names+p_menu_rec->abbr_seq*16+j)==0)
				 	*(p_menu_names+p_menu_rec->abbr_seq*16+j) = ' ';
			}
			*(p_arr_ids+p_menu_rec->abbr_seq) = i;
		}
	}
	memset(p_menu_names+counter*16,0,1);//clear the end of string
	*p_total = counter;
	return SUCCESSFUL;
}
//-------------------------------------------------------------------------------------
//Function   : select_dish
//Description: 点菜,从菜单类表中选择一个菜品
//Input      : cur_start_item_addr, 画面显示的当前第一行,以第一个菜品为起点,起点为0
//             cur_sel_line,反写行,选择行,以画面的第一行为起点,起点为1
//             cur_method,0:编号 1:拼音
//Output     : p_new_start_item_addr:返回的新的画面显示的当前第一行,以第一个菜品为起点,起点为0
//             p_new_sel_line:返回的反写行,选择行,以画面的第一行为起点,起点为1
//             p_new_method:返回的方法 0:编号 1:拼音
//             p_selected_dish_pos: 所选择的菜品在数据库菜单表(tab_menu)中的位置,序号,
//-------------------------------------------------------------------------------------
short select_dish(int cur_start_item_addr,int cur_sel_line,int cur_method,int *p_new_start_item_addr,
				  int *p_new_sel_line,int *p_new_method,unsigned long *p_selected_dish_pos)
{
	typ_msg_word msg;
	
	char pressch;	//cjb
	int  charptr=0,chflag=0,ptr,maxNum;	//cjb
	char	keytochar[25]="*0*978564123**********";	//cjb
	char	key_char[10][5] = {	"    ",
								"    ",
								"ABC ",
								"DEF ",
								"GHI ",
								"JKL ",
								"MNO ",
								"PQRS",
								"TUV ",
								"WXYZ" };	//cjb
	int hitkey=0,dupkey=0;							
	short ch,ret;
	unsigned char arr_dish_name[(MAX_MENU_ITEM+1)*16];
	unsigned long arr_dish_id[MAX_MENU_ITEM];
	unsigned char str_input[30];
	int start_item=0,sel_line=1,line_num=3;
	unsigned long new_start_item = 0;	
	unsigned long total;
	unsigned char dispbuf[100];
	int method;
        int flag_chr_pressed;
        int temp;//
    
	//init by current value
	start_item = cur_start_item_addr;
	sel_line = cur_sel_line;
	method = cur_method;
	
	maxNum=6;
	ptr = 0;
	//ch='h';//
	temp=0;//
	
	
	memset(str_input,0,sizeof(str_input));
	ret = get_menu_str(arr_dish_name,arr_dish_id,method,&total);	
	if(ret) return ret;
	if(total<3) line_num = total;
	SPT_set(4);
	if(method==0)
	{
		sprintf( dispbuf, "编号:%s_", str_input );
	}else {
		sprintf( dispbuf, "拼音:%s_", str_input );
	}
	DispStr_CE( 0, 0, dispbuf, DISP_POSITION|DISP_CLRSCR );
	disp_menu_item(arr_dish_name,start_item,2,sel_line,line_num);
	while(1)
	{
		flag_chr_pressed = 0;
		msg.s_word = sys_msg(SM_GOTO_SLEEP);
		if (msg.bits.time_out)
		{
			hitkey++;
			dupkey++;
			SPT_set(4);
			if ( dupkey>12 )
			{
				dupkey = chflag = charptr = 0;
			}

			if ( hitkey>=(ac_time*16) )		//	自动退出
			{
				return -44;
			}
			
		}
		/*if(!(temp)){
			if((sel_line<3)&&(sel_line<line_num)) sel_line++;
				else if((sel_line==3)&&((start_item+line_num)<total))
				{
					start_item++;
				}
				temp++;			
		}*/
		if (msg.bits.key_available)
		{
			hitkey = dupkey = 0;
			ch = KEY_read();
			switch( ch )
			{
				case KEY_COMM:
					if(method)	method= 0;
					else 	method = 1;
					while(ptr>0) str_input[--ptr] = 0;	//清除搜索字符
					ret = get_menu_str(arr_dish_name,arr_dish_id,method,&total);	
					if(ret) return ret;
					if(total<3) line_num = total;
					sel_line = 1;
					start_item = 0;
					break;
				case KEY_UP:
					if(sel_line>1)	sel_line--;
					else if((sel_line==1)&&(start_item>0)) 
					{
						start_item--;
						if(line_num<3) line_num++;
					}
					break;
				case KEY_DOWN:
					if((sel_line<3)&&(sel_line<line_num)) sel_line++;
					else if((sel_line==3)&&((start_item+line_num)<total))
					{
						start_item++;
					}
					break;
	
			//cjb
				case KEY_0:
				case KEY_1:
						if(method) break;
				case KEY_2:
				case KEY_3:
				case KEY_4:
				case KEY_5:
				case KEY_6:
				case KEY_7:
				case KEY_8:
				case KEY_9:
					 if (pressch!=ch) chflag = charptr = 0;		// 重复按键标志与字符指针复位
					 pressch = ch;
					 if ((ptr<maxNum)||(chflag))
					 {
					 	if (method)
					 	{	//拼音方式
						 	if (chflag)
						 	{	//重复按键
						 		if ( ch==KEY_7||ch==KEY_9 )
							 		charptr = (charptr<3) ? charptr+1 : 0;
							 	else
							 		charptr = (charptr<2) ? charptr+1 : 0;
							 	ch = key_char[keytochar[ch]-'0'][charptr];
								if (ptr>0)
								{
									str_input[--ptr] = 0;
							 	}
						 	}
							else
							{
								ch = key_char[keytochar[ch]-'0'][0];
								chflag = 1;
							}
						} else {
							ch = keytochar[ch];
						}
				 		str_input[ptr++] = ch;
					 	str_input[ptr] = 0;
					 	if (method)
					 		sprintf( dispbuf, "拼音:%s_", str_input);
					 	else
					 		sprintf( dispbuf, "编号:%s_", str_input);
					 	DispStr_CE( 0, 0, dispbuf, DISP_POSITION|DISP_CLRLINE );
					 }
					 flag_chr_pressed = 1;
					 break;	
			//cjb	
				case KEY_F1:
					return -1;
					break;
			//CJB
				case KEY_F3:
					pressch = ch;
					chflag = charptr = 0;		// 重复按键标志与字符指针复位
					if (ptr>0) str_input[--ptr] = 0;
					if (method)
					{
						sprintf( dispbuf, "拼音:%s_", str_input );
					}else {
						sprintf( dispbuf, "编号:%s_", str_input );
					}
					DispStr_CE( 0, 0, dispbuf, DISP_POSITION|DISP_CLRLINE );
					flag_chr_pressed = 1;
					break;			
				case KEY_ENTER:
				    *p_new_start_item_addr = start_item;
				    *p_new_sel_line = sel_line;
				    *p_new_method = method;
				    *p_selected_dish_pos = arr_dish_id[start_item+sel_line-1];
					return SUCCESSFUL;
					break;
				case KEY_F2:
					browse_client_dish(0,0,1);					
				default:
					break;
			}
			if(flag_chr_pressed)
			{
				ret = get_new_start_item_dish(arr_dish_id,total,method,str_input,strlen(str_input),&new_start_item);
				if(ret==SUCCESSFUL)	
				{
					start_item = new_start_item;
					disp_menu_item(arr_dish_name,start_item,2,sel_line,line_num);
				}
				else {
					DispStr_CE( 0, 4, "没有这个菜", DISP_CENTER|DISP_CLRSCR);
				}
			}else {
					disp_menu_item(arr_dish_name,start_item,2,sel_line,line_num);
		    }
			if(method==0)
			{
				sprintf( dispbuf, "编号:%s_", str_input );
			}else {
				sprintf( dispbuf, "拼音:%s_", str_input );
			}
			DispStr_CE( 0, 0, dispbuf, DISP_POSITION|DISP_CLRLINE );
		}		
	}
}

//---------------------------------------------------------------------------------------------
//Function   : input_dish_rec_info
//Description: 点菜时输入菜品数量和附加项
//Input      : pos -- 准备加入的菜品在菜品表中的位置
//Output     : p_client_rec 客户表记录指针
//Return     :
//             -1
//             FAILURE
//             SUCCESSFUL
//---------------------------------------------------------------------------------------------
short input_dish_rec_info(int pos,tab_client_menu *p_client_rec)
{
	unsigned long counter;
	tab_menu *p_menu_rec;
	char flag ;
	unsigned char str_dsp[100];
	unsigned char str_tmp[100];
	//GETSTR_PARAM gs;
	int menu_quant;
	unsigned long i;
	short ret,ret2;
	unsigned char arr_append[16*MAX_APPEND_PERMIT];
	unsigned char arr_dish_namelzm[MAX_APPEND_ITEM*16+1];
	unsigned char arr_dish_idlzm[MAX_APPEND_ITEM];
	int append_num;
	//加的
	int lPtr=0,cPtr=0;//临时测试
	int k;
	int ret1=0;
	k=0;
	
	memset(arr_append,0,16*MAX_APPEND_PERMIT);
	//完毕

	if(!Temp++) p_client_rec_Temp_lzm=p_client_rec;
	counter = DB_count_records(ID_TAB_MENU);
	if(pos>=counter){
 		DispStr_CE(0,2,"选择编号有错误",DISP_CENTER|DISP_CLRSCR);
		delay_and_wait_key(0,EXIT_KEY_ALL,0);
		return FAILURE;		
	}
	p_menu_rec = DB_jump_to_record(ID_TAB_MENU,pos,&flag);
	memset(str_dsp,0,sizeof(str_dsp));
	memcpy(str_dsp,p_menu_rec->name,sizeof(p_menu_rec->name));
	DispStr_CE(0,0,str_dsp,DISP_POSITION|DISP_CLRSCR);
	memset(str_tmp,0,sizeof(str_tmp));
	memcpy(str_tmp,p_menu_rec->unit,sizeof(p_menu_rec->unit));
	sprintf(str_dsp,"每%s%d.%02d元",str_tmp,p_menu_rec->price/100,p_menu_rec->price%100);
	DispStr_CE(0,2,str_dsp,DISP_POSITION);
	
	while(1)
	{
		menu_quant = 100;
    		ret = input_number(0,4,&menu_quant,"数量:");		
		if(ret) return ret;
		//if(menu_quant) break;
		break;
	} 
	memset(arr_append,0,sizeof(arr_append));                      		
        append_num = 0;	
	while(1)
	{
		memset(str_dsp,0,sizeof(str_dsp));
		memcpy(str_dsp,p_menu_rec->name,sizeof(p_menu_rec->name));
		DispStr_CE(0,0,str_dsp,DISP_POSITION|DISP_CLRSCR);
		memset(str_tmp,0,sizeof(str_tmp));
		memcpy(str_tmp,p_menu_rec->unit,sizeof(p_menu_rec->unit));
		sprintf(str_dsp,"每%s%d.%02d元",str_tmp,p_menu_rec->price/100,p_menu_rec->price%100);
		DispStr_CE(0,2,str_dsp,DISP_POSITION);	
		if(menu_quant%100)
			sprintf(str_tmp,"数量:%d.%02d",menu_quant/100,menu_quant%100);
		else
			sprintf(str_tmp,"数量:%d",menu_quant/100);
		DispStr_CE(0,4,str_tmp,DISP_POSITION);

		ret = sure(2,6,"保存","附加项F3");	
		if(ret==-1||ret==-2) return ret; //EXIT_KEY_POWER and EXIT_AUTO_QUIT return F1
		else if(ret == -4) //key F3
		{
			ret = 1;
		}
		if(ret==1&&++ac_wage)
			{
				ret1=0;
				ret2=0;
				ret2=browse_append(arr_dish_namelzm,arr_dish_idlzm);
				if(ret2==-1||ret2==-2) break;
				
				while(!ret1)
					{
						if(k>=MAX_APPEND_PERMIT) break;//k大于或者等于5
						//DispStr_CE(0,4,arr_dish_namelzm,DISP_POSITION);
						//delay_and_wait_key(0,EXIT_KEY_ALL,0);
						ret1=select_append(arr_dish_namelzm,p_client_rec,&lPtr,&cPtr,k++);
						//改变上面这句啦!
						//这里是为了更改附加项
						if(ret1==0) k--;
						if(ret1==-3) break;
						if(ret1==-2) //F2
							{
								k--;//不成功
								break;
							}
					}
			} else if(ret==0) 
				{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -