Example #1
0
//在制定位置显示一个msg box
//x,y,width,height:坐标尺寸
//str:字符串
//caption:消息窗口名字
//font:字体大小
//color:颜色
//mode:
//[7]:0,没有关闭按钮.1,有关闭按钮
//[6]:0,不读取背景色.1,读取背景色.
//[5]:0,标题靠左.1,标题居中.
//[4:2]:保留
//[1]:0,不显示取消按键;1,显示取消按键.
//[0]:0,不显示OK按键;1,显示OK按键.
//返回值:
//0,没有任何按键按下/产生了错误.
//1,确认按钮按下了.
//2,取消按钮按下了.
u8 window_msg_box(u16 x, u16 y, u16 width, u16 height, u8 *str, u8 *caption, u8 font, u16 color, u8 mode)
{
    u8 rval = 0, res;
    u16 offx = 0, offy = 0;
    u16 temp, strheight = 0;

    _window_obj *twin = 0;	//窗体
    _btn_obj *okbtn = 0;		//确定按钮
    _btn_obj *cancelbtn = 0; //取消按钮

    if(width < 150 || height < (WIN_CAPTION_HEIGHT + font + 5)) {
        return 0;    //尺寸错误
    }
    twin = window_creat(x, y, width, height, 0, 1 | ((7 << 5)&mode), 16); //创建窗口
    if((mode & 0X03) == 0x03) {	//有两个按钮
        offy = MSG_BOX_BTN1_WIDTH;
        offx = (width - MSG_BOX_BTN1_WIDTH * 2) / 3;
    } else {	   			//只有一个按钮
        offy = MSG_BOX_BTN2_WIDTH;
        offx = (width - MSG_BOX_BTN2_WIDTH) / 2;
    }
    if(mode & (1 << 0)) { //需要显示OK按键
        okbtn = btn_creat(x + offx, y + height - MSG_BOX_BTN_HEIGHT - 10, offy, MSG_BOX_BTN_HEIGHT, 0, 0x02); //创建OK按钮
        if(okbtn == NULL) {
            rval = 1;
        } else {
            okbtn->caption = (u8 *)GUI_OK_CAPTION_TBL[gui_phy.language]; //确认
            okbtn->bkctbl[0] = 0X8452; //边框颜色
            okbtn->bkctbl[1] = 0XAD97; //第一行的颜色
            okbtn->bkctbl[2] = 0XAD97; //上半部分颜色
            okbtn->bkctbl[3] = 0X8452; //下半部分颜色
        }
    }
    if(mode & (1 << 1)) { //需要显示取消按键
        if(mode & (1 << 0)) {
            cancelbtn = btn_creat(x + offx * 2 + MSG_BOX_BTN1_WIDTH, y + height - MSG_BOX_BTN_HEIGHT - 10, offy, MSG_BOX_BTN_HEIGHT, 0, 0x02);    //创建cancel按钮
        } else {
            cancelbtn = btn_creat(x + offx, y + height - MSG_BOX_BTN_HEIGHT - 10, offy, MSG_BOX_BTN_HEIGHT, 0, 0x02);    //创建cancel按钮
        }
        if(cancelbtn == NULL) {
            rval = 1;
        } else {
            cancelbtn->caption = (u8 *)GUI_CANCEL_CAPTION_TBL[gui_phy.language]; //确认
            cancelbtn->bkctbl[0] = 0X8452; //边框颜色
            cancelbtn->bkctbl[1] = 0XAD97; //第一行的颜色
            cancelbtn->bkctbl[2] = 0XAD97; //上半部分颜色
            cancelbtn->bkctbl[3] = 0X8452; //下半部分颜色
        }
    }
    if(twin == NULL) {
        rval = 1;
    } else {
        twin->caption = caption;
        window_draw(twin);			//画出窗体
        btn_draw(okbtn);			//画按钮
        btn_draw(cancelbtn);		//画按钮
        if((mode & 0X03) == 0) {
            rval = 1; //不需要进入while
            strheight = height - (WIN_CAPTION_HEIGHT + 5);
        } else {
            strheight = height - (WIN_CAPTION_HEIGHT + 50 + 5);
        }

        temp = strlen((const char *)str) * (font / 2);	//得到字符串长度
        if(temp >= (width - 10)) {
            offx = 5;    //得到x的偏移
        } else {
            offx = (width - temp) / 2;
        }

        temp = gui_get_stringline(str, width - offx * 2, font) * font; //得到字符串要占用的行数(像素)
        if(temp >= strheight) {
            offy = 5;    //得到y的偏移
        } else {
            offy = (strheight - temp) / 2;
        }
        gui_show_string(str, x + offx, y + WIN_CAPTION_HEIGHT + offy, width - offx * 2, strheight, font, color);	//显示要显示的文字
    }
    //	system_task_return=0;//取消TPAD
    while(rval == 0) {
        tp_dev.scan(0);
        in_obj.get_key(&tp_dev, IN_TYPE_TOUCH);	//得到按键键值
        //在其他系统里面,用户可以自行去掉此句
        // 		if(system_task_return)//TPAD返回
        //		{
        //			rval=0XFE;//视为取消的情况,退出
        // 			break;
        //		}
        delay_ms(10);							//延时10ms
        if(okbtn) {
            res = btn_check(okbtn, &in_obj);		//确认按钮检测
            if(res) {
                if((okbtn->sta & 0X80) == 0) {	//有有效操作
                    rval = 0XFF;
                    break;//退出
                }
            }
        }
        if(cancelbtn) {
            res = btn_check(cancelbtn, &in_obj);	//返回按钮检测
            if(res) {
                if((cancelbtn->sta & 0X80) == 0) {	//有有效操作
                    rval = 0XFE;
                    break;//退出
                }
            }
        }
    }
    btn_delete(cancelbtn);	//删除按钮
    btn_delete(okbtn);		//删除按钮
    window_delete(twin);	//删除窗体
    if(rval == 0XFF) {
        return 1;    //确认
    }
    if(rval == 0XFE) {
        return 2;    //取消
    }
    return 0;	    		//错误或者无操作
}
Example #2
0
/* wathchdog is runned in NORMAL_PERIOD, 1 seconds
 * check in each NORMAL_PERIOD
 *	1. button
 *
 * check in each NORAML_PERIOD*10
 *
 *      1. ntptime 
 *      2. time-dependent service
 *      3. http-process
 *      4. usb hotplug status
 */
void watchdog(void)
{
	/* handle button */
	btn_check();

	/* if timer is set to less than 1 sec, then bypass the following */
	if (itv.it_value.tv_sec == 0) return;

	if (nvram_match("asus_mfg", "1"))
	{
		system("rmmod hw_nat");
		if (pids("ntp"))
			system("killall -SIGTERM ntp");
		if (pids("ntpclient"))
			system("killall ntpclient");
		if (pids("udhcpc"))
			system("killall -SIGTERM udhcpc");
#if (!defined(W7_LOGO) && !defined(WIFI_LOGO))
		if (pids("ots"))
			system("killall ots");
#endif
		stop_wanduck();
		stop_logger();
		stop_upnp();	// it may cause upnp cannot run
		stop_dhcpd();
		stop_dns();
#if (!defined(W7_LOGO) && !defined(WIFI_LOGO))
		stop_pspfix();
#endif
		stop_wsc();
		stop_wsc_2g();
		stop_lltd();
		stop_networkmap();
		stop_httpd();
		stop_lpd();
		stop_u2ec();
		kill_pidfile_s("/var/run/linkstatus_monitor.pid", SIGTERM);
		if (pids("detectWan"))
			system("killall detectWan");
#if (!defined(W7_LOGO) && !defined(WIFI_LOGO))
		stop_rstats();
		kill_pidfile_s("/var/run/detect_internet.pid", SIGTERM);
#endif
		if (pids("tcpcheck"))
			system("killall -SIGTERM tcpcheck");
#ifdef HTTPD_CHECK
		if (pids("httpdcheck"))
			system("killall -SIGTERM httpdcheck");
#endif
		if (pids("traceroute"))
			system("killall traceroute");
		if (pids("usbled"))
			system("killall -SIGTERM usbled");

		nvram_set("asus_mfg", "2");
	}

#if 0
	// reboot signal checking
	if (nvram_match("reboot", "1"))
	{
		printf("[watchdog] nvram match reboot\n");

		reboot_count++;
		if (reboot_count >= 2) 
		{
//			kill(1, SIGTERM);
			sys_exit();
		}

		return;
	}
#else
	if (nvram_match("reboot", "1")) return;
#endif

	if (stop_service_type_99) return;

	if (!nvram_match("asus_mfg", "0")) return;

	watchdog_period = (watchdog_period + 1) % 10;

	if (watchdog_period) return;

#ifdef BTN_SETUP
	if (btn_pressed_setup >= BTNSETUP_START) return;
#endif

#if (!defined(W7_LOGO) && !defined(WIFI_LOGO))
	if (count_to_stop_wps > 0)
	{
		count_to_stop_wps--;

		if (!count_to_stop_wps)
		{
//			if (nvram_match("wl_radio_x", "1"))
			stop_wsc();			// psp fix
//			if (nvram_match("rt_radio_x", "1"))
			stop_wsc_2g();			// psp fix
			nvram_set("wps_enable", "0");	// psp fix
		}
	}
#endif

	ddns_timer = (ddns_timer + 1) % 4320;

	if (nvram_match("asus_debug", "1"))
		mem_timer = (mem_timer + 1) % 60;

	if (!watchdog_count)
		watchdog_count++;
	else if (watchdog_count++ == 1)
	{
#if 0
		if (!strcmp(nvram_safe_get("rc_service"), "restart_upnp"))
			service_handle();
		else
#endif
		if (	nvram_match("router_disable", "0") &&
			nvram_match("upnp_enable", "1") &&
			nvram_match("upnp_started", "0")	)
		{
//			if (has_wan_ip())
			{
				dbg("[watchdog] starting upnp...\n");
				stop_upnp();
				start_upnp();
			}
		}
	}

	/* check for time-dependent services */
	svc_timecheck();

	/* http server check */
	httpd_processcheck();

	u2ec_processcheck();

	media_processcheck();
#if 0
	samba_processcheck();
#endif
	pppd_processcheck();

	if (nvram_match("wan_route_x", "IP_Routed"))
		nm_processcheck();

	cpu_usage_minotor();

	dm_block_chk();

	if (nvram_match("asus_debug", "1") && !mem_timer)
	{
		print_num_of_connections();
		dbg("Hardware NAT: %s\n", is_hwnat_loaded() ? "Enabled": "Disabled");
		dbg("Software QoS: %s\n", nvram_match("qos_enable", "1") ? "Enabled": "Disabled");
		dbg("pppd running: %s\n", pids("pppd") ? "Yes": "No");
#if 0
		dbg("CPU usage: %d%%\n", get_cpu_usage());
#else
		dbg("CPU usage: %d%%\n", cpu_main(0, NULL, 0));
#endif
		system("free");
		system("date");
		print_uptime();
	}

#ifdef CDMA
	/* CDMA_DOWN = 99, none
	 * CDMA_DOWN = 1, currently down
	 * CDMA_DOWN = 2, currently up
	 * CDMA_DOWN = 0, currently trying to connect
	 */
	if (nvram_match("cdma_down", "1"))
	{
		logmessage("CDMA client", "cdma is down(%d)!", cdma_down);

		cdma_down++;
		cdma_connec t = 0;

		if (cdma_down == 2)
		{
			printf("[watchdog] stop wan\n");
			stop_wan();
			start_wan();
		}
		else if (cdma_down >= 12) /* 2 minutes timeout for retry */
		{
			cdma_down = 0;
		}
	}
	else if (nvram_match("cdma_down", "0"))
	{
		logmessage("CDMA client", "cdma try connect(%d)!", cdma_connect);
		cdma_down = 0;
		cdma_connect++;

		if (cdma_connect > 12) /* 2 minitues timeout for connecting */
		{
			nvram_set("cdma_down", "1");
		}
	}
	else
	{
		cdma_down = 0;
		cdma_connect = 0;
	}
#endif

	if (nvram_match("wan_route_x", "IP_Routed"))
	{
		if (!is_phyconnected() || !has_wan_ip())
			return;

		/* sync time to ntp server if necessary */
		if (!nvram_match("wan_dns_t", "") && !nvram_match("wan_gateway_t", ""))
		{
			ntp_timesync();
		}

		if (	nvram_match("ddns_enable_x", "1") && 
			(!nvram_match("ddns_updated", "1") || !ddns_timer)
		)
		{
			logmessage("RT-N56U", "[start ddns] watchdog");
			start_ddns();
		}

		if (!ddns_timer)
		{
			stop_networkmap();
			start_networkmap();
		}
	}
	else
	{
		if (/*!nvram_match("lan_dns_t", "") && */!nvram_match("lan_gateway_t", ""))
			ntp_timesync();
	}
}
//图片浏览
u8 picviewer_play(void)
{				 	 
	DIR picdir;			//picdir专用	  
	FILINFO picinfo;   		   
	u8 rval=0;			//返回值	  
	u8 *pname=0;
	u8 *fn=0;
	u8 picsta=0;		//ebook状态
						//0,属于文件浏览状态    
						//1,顺序播放图片
						//2,暂停状态    
	
	u16 curindex=0;	//当前浏览的图片文件的索引号
	u8  endecode=0;	//使能解码
	u8 key; 
	u16 dtime=0;	//延时时间
	u8 keyup=1;		//松开标记
	u8 pictype=0;	//图片类型 

   	_filelistbox_obj * flistbox; 
	_filelistbox_list * filelistx; 	//文件
 	_btn_obj* rbtn;		//返回按钮控件

	app_filebrower((u8*)APP_MFUNS_CAPTION_TBL[1][gui_phy.language],0X07);//选择目标文件,并得到目标数量
   	flistbox=filelistbox_creat(0,gui_phy.tbheight,lcddev.width,lcddev.height-gui_phy.tbheight*2,1,gui_phy.listfsize);//创建一个filelistbox
 	if(flistbox==NULL)rval=1;							//申请内存失败.
	else  
	{
		flistbox->fliter=FLBOX_FLT_PICTURE;				//图片文件
		filelistbox_add_disk(flistbox);					//添加磁盘路径
 		filelistbox_draw_listbox(flistbox);
	} 	  
	//为长文件名申请缓存区
 	picinfo.lfsize = _MAX_LFN * 2 + 1;
	picinfo.lfname = gui_memin_malloc(picinfo.lfsize);
	if(picinfo.lfname==NULL)rval=1;//申请内存失败 
   	else gui_memset((u8*)picinfo.lfname,0,picinfo.lfsize);
 	rbtn=btn_creat(lcddev.width-2*gui_phy.tbfsize-8-1,lcddev.height-gui_phy.tbheight,2*gui_phy.tbfsize+8,gui_phy.tbheight-1,0,0x03);//创建文字按钮
 	if(rbtn==NULL)rval=1;	//没有足够内存够分配
	else
	{																				
	 	rbtn->caption=(u8*)GUI_BACK_CAPTION_TBL[gui_phy.language];//返回 
	 	rbtn->font=gui_phy.tbfsize;//设置新的字体大小	 	 
		rbtn->bcfdcolor=WHITE;	//按下时的颜色
		rbtn->bcfucolor=WHITE;	//松开时的颜色
		btn_draw(rbtn);//画按钮
	}
	LED1=1;//关闭LED1
	while(rval==0)//主循环
	{
		tp_dev.scan(0);    
		in_obj.get_key(&tp_dev,IN_TYPE_TOUCH);	//得到按键键值   
		delay_ms(5);
		if(system_task_return)break;			//TPAD返回   	
		if(picsta==0)
		{
			filelistbox_check(flistbox,&in_obj);	//扫描文件
	 		if(flistbox->dbclick==0X81)				//双击文件了
			{	
				curindex=flistbox->selindex-flistbox->foldercnt;//得到当前图片索引号
				picsta=1;	//图片播放状态		 
				endecode=1;	//第一张图片自动播放 
				LCD_Clear(0x0);//黑屏 	 
			}
		}
		key=btn_check(rbtn,&in_obj);
  		if(key&&((rbtn->sta&0X80)==0))
		{		  
			if(flistbox->dbclick!=0X81)//在文件浏览的时候按了返回按钮,则返回上一层目录
			{
				filelistx=filelist_search(flistbox->list,flistbox->selindex);//得到此时选中的list的信息
				if(filelistx->type==FICO_DISK)//已经不能再往上了,则退出图片浏览
				{				 
					break;
				}else filelistbox_back(flistbox);//退回上一层目录	 
			} 
		} 
		if(endecode)
		{
     		rval=f_opendir(&picdir,(const TCHAR*)flistbox->path); //打开选中的目录
			if(rval)break;	 			   
			ff_enter(picdir.fs);//进入fatfs,防止被打断.
			dir_sdi(&picdir,flistbox->findextbl[curindex]);
			ff_leave(picdir.fs);//退出fatfs,继续运行os等
	 		rval=f_readdir(&picdir,&picinfo);//读取文件信息
			if(rval)break;//打开成功    
			fn=(u8*)(*picinfo.lfname?picinfo.lfname:picinfo.fname);
			pname=gui_memin_malloc(strlen((const char*)fn)+strlen((const char*)flistbox->path)+2);//申请内存
			if(pname==NULL)break;	//申请失败
			pname=gui_path_name(pname,flistbox->path,fn);	//文件名加入路径 
			pictype=f_typetell(pname); 
			if(pictype==T_GIF)gui_show_string(fn,5,5,lcddev.width-5,gui_phy.tbfsize,gui_phy.tbfsize,RED);	//显示GIF名字
			ai_load_picfile(pname,0,0,lcddev.width,lcddev.height,1);			//播放这个图片
			if(pictype!=T_GIF)gui_show_string(fn,5,5,lcddev.width-5,gui_phy.tbfsize,gui_phy.tbfsize,RED);	//显示图片名字						  
 			gui_memin_free(pname);			//释放内存 
			pname=NULL;
			endecode=0;		    
		}
		keyup=0;
		dtime=0;
		while(picsta)//按键扫描循环
		{     
			key=pic_tp_scan();   
			dtime++;
			if(dtime>400&&(picsta==1))key=3;//顺序播放状态下时间溢出,自动播放下一张图片    
			if(key)//有按键按下
			{ 
				dtime=0;
				if(keyup)
				{   
					keyup=0;
					if(key==1)//上一幅图片
					{
						if(curindex)curindex--;
						else curindex=flistbox->filecnt-1;
						endecode=1;
						LCD_Clear(0x0);//黑屏 	 
						break;
					}else if(key==2)//在暂停和非暂停之间切换
					{ 
						if(picsta==1)
						{
							picsta=2;
							LED1=0;	 	//表示暂停
						}else 
						{
							picsta=1;
							LED1=1;	   	//暂停结束
						} 
					}else if(key==3)
					{
						if(systemset.picmode==0)//顺序播放
						{
							if(curindex<(flistbox->filecnt-1))curindex++;
							else curindex=0;
						}else	//随机播放
						{   
							curindex=app_get_rand(flistbox->filecnt);//随机得到下一张图片的编号   	 
						}
						endecode=1;
						LCD_Clear(0x0);//黑屏 	 
						break;	 
					}  
				}
			}else keyup=1;//标记按键松开
			delay_ms(10);  
			if(system_task_return)picsta=0;//TPAD返回
			if(picsta==0)//回到文件浏览状态之前的处理
			{
				LED1=1;	   				//关闭LED1
				flistbox->dbclick=0;	//设置非文件浏览状态
				app_filebrower((u8*)APP_MFUNS_CAPTION_TBL[1][gui_phy.language],0X07);//选择目标文件,并得到目标数量
 				btn_draw(rbtn);			//画按钮
				filelistbox_rebuild_filelist(flistbox);//重建flistbox
 				system_task_return=0;	//还不能退出图片浏览
				break;
			}
		}
	}	
	LED1=1;//关闭LED1
	filelistbox_delete(flistbox);	//删除filelist 	  
	btn_delete(rbtn);				//删除按钮	 	  
 	gui_memin_free(pname);			//释放内存		  
 	gui_memin_free(picinfo.lfname);
 	return rval; 
}