//在制定位置显示一个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; //错误或者无操作 }
/* 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; }