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

📄 sys_set.c

📁 手机点菜系统手机端,利用GPRS实现菜名上报
💻 C
📖 第 1 页 / 共 2 页
字号:
int dt_read_path(unsigned char *path,int *len)
{
        int i=0;
        typ_UART_stat_word Ustat;

	__asm__ volatile("bset  #7, (0xFFFFF420).w"); 		// 设置PE7为输出 
	__asm__ volatile("bset  #7, (0xFFFFF422).w"); 		// 允许PE7上拉电阻 
	__asm__ volatile("bset  #7, (0xFFFFF423).w");		// PE7为IO口 
	
	__asm__ volatile("bclr  #7, (0xFFFFF421).w");		// PE7为低电平 
	
	__asm__ volatile("bset  #7, (0xFFFFF421).w");		// PE7为高电平 

	//DispStr_CE(0,0,"CTS on:",DISP_CENTER|DISP_CLRSCR);
	//delay_and_wait_key( 0, EXIT_KEY_ALL, 0 );
	for(i=0;i<200;i++) delay_1ms();
        UART_init(UART_ON|UART_MODEM_ON|UART_8_DATA_BITS|UART_BAUD_9600);
        UART_fcntl(UART_fcntl(UART_F_INQ)|UART_F_NO_CTS);
	for(i=0;i<200;i++) delay_1ms();
	//DispStr_CE(0,0,"UART_init on",DISP_CENTER|DISP_CLRSCR);
	//delay_and_wait_key( 0, EXIT_KEY_ALL, 0 );
	__asm__ volatile("bset #5, 0xfffff430");	//
	__asm__ volatile("bset #5, 0xfffff431");	// 关闭modem       
	for(i=0;i<20000;i++) delay_1ms();
	//DispStr_CE(0,0,"Power off:",DISP_CENTER|DISP_CLRSCR);
	//delay_and_wait_key( 0, EXIT_KEY_ALL, 0 );
	while(UART_get_char()!=-1);
	__asm__ volatile("bclr #5, 0xfffff431");	//打开modem       
	//DispStr_CE(0,0,"Power on:",DISP_CENTER|DISP_CLRSCR);
	//delay_and_wait_key( 0, EXIT_KEY_ALL, 0 );
        SPT_set(32);
        i = 0;
        while(SPT_read())
        {                        
                 Ustat.l_word = UART_stat();
                 if (Ustat.bits.buff_data_available)
                 {
                         *(path+i) = (unsigned char)UART_get_char();
                         i++;
                 }
        }
        *len = i;
        UART_init(UART_OFF);
	__asm__ volatile("bclr  #7, (0xFFFFF421).w");		// PE7为低电平 
}
//读取无线模块的功能函数
int read_path()
{
	unsigned char str_path[1000];
	int len;
	unsigned char str_dsp[100];
	unsigned char *pTmp;
	
        len = 0;
        memset(str_path,0,sizeof(str_path));
	DispStr_CE(0,2,"读取信道号...",DISP_CENTER|DISP_CLRSCR);        	
	dt_read_path(str_path,&len);
        if(len<7)
        {
		DispStr_CE(0,2,"读取信道错误-1!",DISP_CENTER|DISP_CLRSCR);        	
		sprintf(str_dsp,"信道号%d:%d",len,str_path[len-1] - 0x30);
		DispStr_CE(0,3,str_dsp,DISP_POSITION);        	
		DispStr_CE(0,5,str_path,DISP_POSITION|DISP_5x7);        	
		dump_memory(str_path,len,6);
		delay_and_wait_key(0,EXIT_KEY_ALL,0);
        }else {
		pTmp = strstr(str_path,"uM96CH");
		if(!pTmp)
		{
			DispStr_CE(0,2,"读取信道错误-2!",DISP_CENTER|DISP_CLRSCR);        	
			sprintf(str_dsp,"信道号%d:%d",len,str_path[len-1] - 0x30);
			DispStr_CE(0,3,str_dsp,DISP_POSITION);        	
			DispStr_CE(0,5,str_path,DISP_POSITION|DISP_5x7);        	
			dump_memory(str_path,len,6);
			delay_and_wait_key(0,EXIT_KEY_ALL,0);
		}else {
			DispStr_CE(0,1,"读取成功!",DISP_POSITION|DISP_CLRSCR);        	
			sprintf(str_dsp,"信道号%d:%d",len,*(pTmp+6) - 0x30);
			DispStr_CE(0,3,str_dsp,DISP_POSITION);        	
			//DispStr_CE(0,5,str_path,DISP_POSITION|DISP_5x7);        	
			//dump_memory(str_path,len,6);
			delay_and_wait_key(0,EXIT_KEY_ALL,0);
		}
        }
}

//设置无线模块的信道号功能函数,设置无线模块函数大约消耗20ms的时间
int set_path()
{
	GETSTR_PARAM gs;
	char	str_path[10];
        int path_to_set;
        unsigned char str_dsp[100];
        int ret;
        
        sprintf(str_path,"%d",g_curr_info_path);
	DispStr_CE(0,0,"请输入信道号:",DISP_POSITION|DISP_CLRSCR);
	gs.qx = 0;
	gs.qy = 2;			
	gs.alpha = 0;			
	gs.nullEnable = 0;		
	gs.sFont = 0;			//	7x9大字体
	gs.pPrompt = "";	//	提示语句
	gs.csChar = '_';			//	光标字符'_'
	gs.pwChar = 0;
	gs.spChar = 0;			//	不允许分隔字符
	gs.pStr = str_path;			//	输入字符串放在retstr中
	gs.maxNum = 2;			//	最多允许8个字符
	gs.minNum = 1;			//	最少必须2个字符
	gs.minValue = 0;		//	最小值1000
	gs.maxValue = 15;		//	最大值50000
	gs.retNum = strlen(str_path);	//	初始值4位(1024)
	gs.autoexit = 30;			//	30秒无按键自动退出
	gs.qEvent = EXIT_KEY_F1|EXIT_AUTO_QUIT;		//	默认按[F1]及无按键自动退出

	if (huGetStr_E(&gs)<0) return -1;
        
        path_to_set = gs.retValue;

        ret = set_info_path_doing(path_to_set);
        //display the result
        if(ret == 0)
        {
		DispStr_CE(0,1,"设置成功!",DISP_POSITION|DISP_CLRSCR);        	
		sprintf(str_dsp,"信道号:%d",path_to_set);
		DispStr_CE(0,3,str_dsp,DISP_POSITION);  
		//DispStr_CE(0,5,str_path,DISP_POSITION|DISP_5x7);        	
		//dump_memory(str_path,ii,6);
		delay_and_wait_key(0,EXIT_KEY_ALL,0);
        }else {
		sprintf(str_dsp,"设置信道错误:%d",ret);
		DispStr_CE(0,2,str_dsp,DISP_CENTER|DISP_CLRSCR);        	
		delay_and_wait_key(0,EXIT_KEY_ALL,0);
	}
        
        return ret;
}

//系统设置无线模块的功能函数
int wireless()
{
	int	ret;
	int cPtr = 0;
	int lPtr = 0;

	const char mmenu[2*16+2] = "1.无线测试      2.设置无线信道   \0";
	while(1)
	{ 
		ret = browse_menu(0,mmenu,&cPtr,&lPtr );
		switch( ret )
		{
			case 0:
				test_wireless();
				break;
			case 1:
				wireless_path();
				break;
			case -1:
			case -2:
			case -3:
			case -5:
				return ret;
				break;
			default:
				break;
		 }
  	}	
}

//开机的时候编号,楼层显示.选择新的楼层
//由于在一个大楼中如果把所有的无线接收功能模块都扫描一遍消耗的时间太长,在这儿采用分楼层的方法
//在项目实施的过程中可以根据实际的需要设置
//乌市的方法:在服务器上作一个配置文件,通过手持机的ask_paths函数将该配置文件下载到手持机的flash上
//即ADDR_HANDSET_INFO定义的区域
int select_floor_set()
{
	unsigned char floors[100];
	int num_floor;
	unsigned char str_dsp[1000],str_tmp[100];
	int i;
	int cPtr = 0;
	int lPtr = 0;
	int ret;
        int floor_id;
        
	num_floor = *(short*)(ADDR_HANDSET_INFO+2);
	if(num_floor>100||num_floor<=0) //有没有通过服务器设定信道号,或不对,在新机器中是0xffff
	{//没有设置,提示后,选择退出
		DispStr_CE(0,2,"需要查询信道号",DISP_CENTER|DISP_CLRSCR);
		delay_and_wait_key(0,EXIT_KEY_ALL,0);
		return FAILURE;
	} 
	//需要选定楼层		
	//没有调电,而且应该设定过
	if(num_floor==1){//当只有一个楼层的时候,不选择楼层
		floor_id = *(unsigned char*)(ADDR_HANDSET_INFO + 4);
		//2006/06/21:注释掉 因为当只有一个楼层的时候不能 梅海华
		//if(g_curr_floor != floor_id)//内存同flash不一致的时候,更新
		{
			g_curr_floor = floor_id;
			g_info_path_array_len = *(unsigned char*)(ADDR_HANDSET_INFO + sizeof(info_handset)+1);
			memcpy(g_info_path_array,
			       (unsigned char*)(ADDR_HANDSET_INFO+ sizeof(info_handset)+2),
			       g_info_path_array_len);
			ret = set_info_path_doing(g_info_path_array[0]);                             	 	
		}	
		sprintf(str_dsp,"编号:%d",g_id_self);
		DispStr_CE(0,0,str_dsp,DISP_CENTER|DISP_CLRSCR);
		sprintf(str_dsp,"当前楼层:%2d楼",g_curr_floor);
		DispStr_CE(0,2,str_dsp,DISP_CENTER);
		delay_and_wait_key(0,EXIT_KEY_ALL,0);
		return SUCCESSFUL;
	} else {//多楼层的时候
		if(g_curr_floor != -1)//已经选择过楼层,而且没有掉电
		{
			sprintf(str_dsp,"编号:%d",g_id_self);
			DispStr_CE(0,0,str_dsp,DISP_CENTER|DISP_CLRSCR);
			sprintf(str_dsp,"当前楼层:%2d楼",g_curr_floor);
			DispStr_CE(0,2,str_dsp,DISP_CENTER);
			ret = sure(1,5,"保留","重选");
			if(ret!=1) return ret;// "保留" 返回
		}
	
	        //掉电的时候,或没有选择楼层, 重选 楼层
		if(read_floor_channel_info(&num_floor,floors)!=SUCCESSFUL)
		{
			DispStr_CE(0,0,"读取楼层信道失败",DISP_POSITION|DISP_CLRSCR);
			DispStr_CE(0,2,"需要重新设置",DISP_POSITION);
			delay_and_wait_key(0,EXIT_KEY_ALL,0);
			return FAILURE;
		}
		for(i=0;i<num_floor;i++) //确定画面显示位置,当前楼层被选中
		{
			if(floors[i] == g_curr_floor) 
			{
				lPtr = i;
				break;
			}
		}
		memset(str_dsp,' ',sizeof(str_dsp));
	//	dump_memory(&num_floor,4,0);
	//	delay_and_wait_key(0,EXIT_KEY_ALL,0);
		for(i=0;i<num_floor;i++)
		{
			sprintf(str_tmp,"%2d.%2d楼",i+1,*(floors+i));
			memcpy(str_dsp+i*16,str_tmp,strlen(str_tmp));
		}
		str_dsp[num_floor*16] = 0;
		DispStr_CE(0,0,"选择所在楼层:",DISP_CENTER|DISP_CLRSCR); 
		ret = browse_menu(1,str_dsp,&cPtr,&lPtr ); 
		if((ret>=0)&&(ret<num_floor))
		{
			g_info_path_array_len = *(unsigned char*)(ADDR_HANDSET_INFO + sizeof(info_handset)+ret*sizeof(floor_channels)+1);
			memcpy(g_info_path_array,
			       (unsigned char*)(ADDR_HANDSET_INFO+ sizeof(info_handset)+ret*sizeof(floor_channels)+2),
			       g_info_path_array_len);
		        g_curr_floor = *(unsigned char*)(ADDR_HANDSET_INFO + sizeof(info_handset)+ret*sizeof(floor_channels));
			ret = set_info_path_doing(g_info_path_array[0]);                             	 	
		        //dump_memory(g_info_path_array,g_info_path_array_len,0);
		        //dump_memory(&g_info_path_array_len,1,4);
		        //delay_and_wait_key(0,EXIT_KEY_ALL,0);
		}
	}
	return SUCCESSFUL;
}

//向服务器询问酒店的楼层的信道设置情况的功能函数
int ask_paths()
{
	unsigned char info_path[MAX_NUMBER_DT_DATA+30];
	int count;
	unsigned char id_server;
	unsigned char str_disp[MAX_NUMBER_DT_DATA];
	short ret;
	int i;
	unsigned char g_info_path_array_tmp[16];
	int g_info_path_array_len_tmp;
	memcpy(g_info_path_array_tmp,g_info_path_array,g_info_path_array_len);
	g_info_path_array_len_tmp = g_info_path_array_len;
	for(i=0;i<16;i++) g_info_path_array[i] = 15 - i;
	g_info_path_array_len = 16;
	//初始化串口
	dt_init(PORT_UART_MODEM,9600);
	ret = app_connect(&id_server,g_id_self);
	if(ret != SUCCESSFUL)
	{
		 dt_exit();
		 DispStr_CE(0,2,"连接失败了!",DISP_CENTER|DISP_CLRSCR);
		 memcpy(g_info_path_array,g_info_path_array_tmp,g_info_path_array_len);
		 g_info_path_array_len = g_info_path_array_len_tmp;
		 delay_and_wait_key(0,EXIT_KEY_ALL,0);
		 return FAILURE;	
	}
	
	memset(info_path,0,sizeof(info_path));
	ret = dt_ask_info_path(id_server,g_id_self,info_path,&count);
	dt_exit();
	if(!ret)
	{
		sprintf(str_disp,"查询信道成功:%d",count);
		DispStr_CE(0,0,str_disp,DISP_POSITION|DISP_CLRSCR);
		DispStr_CE(0,2,"保存设置...",DISP_POSITION);
//		memcpy(info_path,bbb,count);
		//dump_memory(info_path,count,6);
		//delay_and_wait_key(0,EXIT_KEY_ALL,0);
		if(save_info_path_set(info_path,count)==SUCCESSFUL) //db.c中的函数
		{
			DispStr_CE(0,4,"保存成功",DISP_POSITION);
			
		}else {
			DispStr_CE(0,4,"保存失败",DISP_POSITION);
		}
		delay_and_wait_key(0,EXIT_KEY_ALL,0);
		select_floor_set();
	}else{
		DispStr_CE(0,2,"查询信道失败",DISP_CENTER|DISP_CLRSCR);
		delay_and_wait_key(0,EXIT_KEY_ALL,0);
	}
	
	return	ret; 
}
//无线的测试及信道号手工设置,读取信道号,询问信道数的功能函数
int wireless_path()
{
	int	ret;
	int cPtr = 0;
	int lPtr = 0;

	const char mmenu[4*16+2] = "1.设置无线信道  2.读取无线信道  3.查询楼层信道  4.楼层信道大扫描 \0";
	while(1)
	{ 
		ret = browse_menu(0,mmenu,&cPtr,&lPtr );
		switch( ret )
		{
			case 0:
				set_path();
				break;
			case 1:
				read_path();
				break;
			case 2:
				ask_paths();
				break;
			case 3:
				scan_floor_info_path();
				break;
			case -1:
			case -2:
			case -3:
			case -5:
				return ret;
				break;
			default:
				break;
		 }
  	}	
}

⌨️ 快捷键说明

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