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

📄 matain.c

📁 用MINIGUI开发的维护程序.ARM编译. 上传镜像文件,下载镜像文件,下载程序文件,下载配置文件,上传日志文件 利用XMODEM 协议传输文件.
💻 C
📖 第 1 页 / 共 2 页
字号:
                        2, 52,                        VIEW_WIDTH-4 , VIEW_HEIGHT-53,                        hwnd, 0);	SendMessage(hctl, LB_SETITEMHEIGHT, 0, 23);	fillmenuitems(hctl,0);	SetNotificationCallback(hctl, menuSelected);	SetWindowBkColor(hwnd, PIXEL_lightgray);  	}int	execute(char	*cmd,char *args[],int	timeout){	int		status,ret=0,stas = RET_SYSFAILED;	pid_t		child;	uint  etv; 		 if ((child = fork()) == 0){	  	execv(cmd,args);    	}else if(child < 0){		DBGMSG("fork xmodem failed\n");		return -1;    	}	etv = GetTickCount() + ONE_SECOND*timeout;	    	while (GetTickCount() < etv && !fAppExit && !fXMCancel){		//remove the child proceser PCB		printf("wait for execute complete\n");	   	ret = waitpid(child,&status,WNOHANG);		if(ret != child)			SlowWait(10);		else{			if(WIFEXITED(status))				stas = WEXITSTATUS(status);			printf("execute over return:%d\n",stas);			 break;		}        }	if(GetTickCount() >= etv || fXMCancel){		if((kill(child,SIGTERM)) != 0){			printf("kill execute failed\n");			waitpid(child,&status,0);		}		stas = -1;	}	if(stas)		lasterr = TRUE;	else		lasterr = FALSE;	return stas;}void	processFiles(HWND hwnd,int	index,int	status){	char		pmt[68];	int		ret;	printf("processFiles:%d\n",index);		switch(index){		case  MENU_DW_ABPM:{			mode_t newmode ;			newmode = 0777;			ret = chmod("/usr/abpm", newmode);			if(!ret)				excute_Start(EXCUTE_BPMC);			else{				BEEP(5);				MessageAlert (hMainWnd,(char *) lines[si.menu], "[失败] 保存文件失败", ONE_SECOND*5);			}			break;		}		case MENU_DW_CONF:			excute_Start(EXCUTE_CFGC);			break;		case MENU_DW_ALL:			ret = chdir("/media/flash/abpm");			if(!ret)				excute_Start(EXCUTE_TARX);			else{				BEEP(5);				MessageAlert (hMainWnd,(char *) lines[si.menu], "[失败] 保存文件失败", ONE_SECOND*5);			}			break;		case MENU_UP_ALL:			BEEP(5);			MessageAlert (hMainWnd,(char *) lines[si.menu], "[成功] 镜像上传成功",  ONE_SECOND*5);			break;		case MENU_UP_LOG:			BEEP(5);			strcpy(pmt,"日志上传成功");			MessageAlert (hMainWnd,(char *) lines[si.menu], pmt, ONE_SECOND*5);		default:			break;				}}static int MainWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam){    switch (message) {        case MSG_CREATE:		createWidgets(hWnd);		break;		case	MSG_XMODEM:	{		CLR_OPT();		printf("get xmodem msg:%d\n",wParam);		HWND  aw = GetActiveWindow();		while (aw != hMainWnd){			SendMessage(aw, MSG_CLOSE, 0, 0L);			aw = GetActiveWindow();		}		if(fXMCancel){			fXMCancel  = FALSE;			return 0;		}		if(wParam != 0){			BEEP(50);		 	MessageAlert (hMainWnd,(char *) lines[si.menu],"[失败] 通讯失败", ONE_SECOND*5);			return 0;		}		processFiles(hWnd,si.menu,wParam);		return 0;	}	case MSG_EXCUTE:{		CLR_OPT();		printf("get excute msg:%d\n",wParam);		if(si.menu != MENU_UP_ALL && fXMCancel != TRUE){			HWND  aw = GetActiveWindow();			while (aw != hMainWnd){				SendMessage(aw, MSG_CLOSE, 0, 0L);				aw = GetActiveWindow();			}		}		if(fXMCancel){			fXMCancel  = FALSE;			return 0;		}		if(si.menu >= MENU_DW_ALL && si.menu <= MENU_DW_CONF){			if(wParam != 0){				BEEP(50);			 	MessageAlert (hMainWnd,(char *) lines[si.menu], "[失败] 下载操作失败!!",  ONE_SECOND*5);			}else{				BEEP(2);			 	MessageAlert (hMainWnd,(char *) lines[si.menu], "[成功] 下载操作成功!!",   ONE_SECOND*5);			}		}else if(si.menu == MENU_UP_ALL){			if(wParam != 0){				BEEP(50);			 	MessageAlert (hMainWnd,(char *) lines[si.menu],  "[失败] 压缩文件失败!!", ONE_SECOND*5);			}else{				BEEP(1);				si.xm_mode = XM_SEND;				strcpy(si.filen,"/media/flash/abpm/abpm.tar.gz");			 	Xmodem_Start();			}		}				return 0;	}			case MSG_SETFOCUS:		SetFocusChild(GetDlgItem(hWnd,IDC_MENU));		return 0;	case MSG_NOTIFY:		if(wParam == CONFIRM_YES){			if(si.in_xmodem || si.in_excute)				fXMCancel = TRUE;			CLR_OPT();		}		return 0;        case MSG_CLOSE:            DestroyMainWindow (hWnd);            PostQuitMessage (hWnd);            return 0;    }    return myDefaultMainWinProc(hWnd, message, wParam, lParam);}int Initial_SerialPort(char	*file){	int fd;	struct termios options;	//printf("wb:Initial_SerialPort:%s\n",file);	fd = open( file , O_RDWR |O_NOCTTY |O_NDELAY);	if ( fd == -1 )	{	/*open error!*/	perror(" Can't open serial port!");	return -1;	}		/*Get the current options for the port...*/	tcgetattr(fd, &options);	//oldtty = options;	/*Set the baud rates to BAUDRATE...*/	cfsetispeed(&options,B115200);	cfsetospeed(&options,B115200);	tcsetattr(fd, TCSANOW, &options);	if (0 != tcgetattr(fd, &options))	{	perror("  SetupSerial error");	return -1;	}	/*	* 8bit Data,no partity,1 stop bit...	*/	options.c_cflag &= ~PARENB;	options.c_cflag &= ~CSTOPB;	options.c_cflag &= ~CSIZE;	options.c_cflag |= CS8;	 options.c_cflag  |=   CREAD;	tcflush(fd,TCIFLUSH);	//close char change	options.c_iflag = 0;	/***Choosing Raw Input*/	options.c_lflag = 0;	//options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);	options.c_oflag &= ~OPOST;	/*	* Set the new options for the port...	*/	if (0 != tcsetattr(fd, TCSANOW, &options))	{	perror("  SetupSerial error");	return -1 ;	}	return fd ;}void port_outstr(int	fp,unsigned char *s){	write(fp,s,strlen(s));	tcflush(fp, TCOFLUSH); }int lowLevel_read(int	fp,unsigned char *c ,int len){	return read(fp,c,len);}uint GetTimeTick(void){    static struct timeval  stmv = {0, 0};    if (!stmv.tv_sec){        gettimeofday(&stmv, NULL);        return 0;    }    else {        struct timeval  tmv;        gettimeofday(&tmv, NULL);        return  ((tmv.tv_sec  - stmv.tv_sec)*100 +                (tmv.tv_usec - stmv.tv_usec)/100000);    }}int port_instr(int fp){	unsigned char ch;	int	idx = 0;	while (!fAppExit && !fNOmonit){		if( (read(fp,&ch,1)) == 1){			G_buff[idx] = ch;			printf("%c,%0x,%d\n",G_buff[idx],G_buff[idx],idx);			if((G_buff[idx] ==0x0d || G_buff[idx] ==0x0a))				return idx;			idx ++;			if(idx >= 8092){				idx = 0;				break;			}		}   	 }	 //printf("port_inbyte return\n");	return -1;}/*unsigned char port_inbyte(int fp){	unsigned char ch;	uint  etv = GetTickCount() + ONE_SECOND;	while (!fAppExit && !fNOmonit){		if (GetTickCount() >= etv) break;		if( (read(fp,&ch,1)) == 1){			return ch;		}		   	 }	 //printf("port_inbyte return\n");	return 0;}*/int	getabpmcmd(void){	int	Comfp,idxb=0,idxa=0,i=0;	char * base, *itr;	char * ptr;		Comfp = Initial_SerialPort("/dev/ttyGS0");	if(Comfp < 0){		printf("open /dev/ttyGS0 failed\n");		return FALSE;	}			/*if(lasterr)		port_outstr(Comfp,"[ERR.abpm]#ready ");	else		port_outstr(Comfp,"[SUC.abpm]#ready ");*/	port_outstr(Comfp,"\n[CMDEND]\n# ");	lasterr = FALSE;	//port_outstr(Comfp,"\nabpm]# ");	//tcflush(Comfp, TCIOFLUSH);     	while (!fAppExit && !fNOmonit){		idxb = port_instr(Comfp);		if(idxb < 0) continue;				//G_buff[idxb] = port_inbyte(Comfp);		//printf("%c,%0x,%d\n",G_buff[idxb],G_buff[idxb],idxb);		if((G_buff[idxb] ==0x0d || G_buff[idxb] ==0x0a) &&( idxb== 0)){			//port_outstr(Comfp,"\n[ERR.abpm]# ");			port_outstr(Comfp,"\n[CMDEND]\n#");			idxb = 0;			idxa = 0;			continue;		}		if(G_buff[idxb] ==0x0d || G_buff[idxb] ==0x0a){			G_buff[idxb] = 0;			//printf("getcmd:%s\n",G_buff);						for (i=0,base=G_buff; i<MAX_ARG; i++){				ptr = strtok_r(base, " ", &itr);				if (ptr == NULL) break;				args_setabpm[idxa++] = ptr;				if (base != NULL) base = NULL;			}			/*printf("get setabpm:\n");			for(i=0;i<idxa;i++)				printf("%s,",args_setabpm[i]);			printf("\n");*/						if(!strcasecmp(args_setabpm[0],"setabpm")){				args_setabpm[idxa++] = NULL;				close(Comfp);				return 1;			}else if(!strcasecmp(args_setabpm[0],"trabpm")){				close(Comfp);				return 2;			}			idxb = 0;			idxa = 0;			//port_outstr(Comfp,"\n[ERR.abpm]# ");			port_outstr(Comfp,"\n[CMDEND]\n#");					}else{			idxb++;			idxa = 0;		}		        }			//printf("getabpmcmd return\n");	close(Comfp);		return FALSE;	}static void * xmodemThreadProc (void * sem){	int		status,ret=0,stas = RET_SYSFAILED;	pid_t		child;	uint  etv; 	    while (!fAppExit){        while (sem_wait((sem_t*)sem) < 0 && errno == EINTR && !fAppExit){            sched_yield();        }	printf("begin to xmodem file:menu:%d\n",si.menu);	si.in_xmodem = 1;	fXMCancel = 	FALSE;		  if ((child = fork()) == 0){	  	execl("/usr/bin/xmodem","/usr/bin/xmodem",xmode[si.xm_mode] , si.filen, NULL);        	//execl("/usr/bin/xmodem","/usr/bin/xmodem","recv","abpm", NULL);    	}else if(child < 0){		DBGMSG("fork xmodem failed\n");		break;    	}	si.xm_pid = child;	etv = GetTickCount() + ONE_SECOND*1000;	 // wait until ppp link setup    	while (GetTickCount() < etv && !fAppExit && !fXMCancel){		//remove the child proceser PCB		printf("wait for xmodem complete\n");	   	ret = waitpid(child,&status,WNOHANG);		if(ret != child)			SlowWait(10);		else{			if(WIFEXITED(status))				stas = WEXITSTATUS(status);			printf("xmodem over return:%d\n",stas);			 break;		}        }	if(fXMCancel ||GetTickCount() >= etv){		if((kill(child,SIGTERM)) != 0){			printf("kill xmodem failed\n");			waitpid(child,&status,0);		}		stas = RET_USBDISC;	}		if(stas)		lasterr = TRUE;	else		lasterr = FALSE;	si.in_xmodem = 0;	if(si.menu > MENU_DW_CONF || si.menu < MENU_DW_ALL){		cmd_Start();	}	if(stas)		cmd_Start();		CLR_USB();	CLR_OPT();	PostMessage(hMainWnd, MSG_XMODEM, stas, 0L);	        if (fAppExit) break;	    }    DBGMSG(" thread exit: fAppExit:%d\n", fAppExit);    return NULL;}static void * excuteThreadProc (void * sem){	int		ret=-1;;	    while (!fAppExit){        while (sem_wait((sem_t*)sem) < 0 && errno == EINTR && !fAppExit){            sched_yield();        }	printf("begin to excute\n");	fXMCancel = 	FALSE;	if(si.in_excute == EXCUTE_CFGC)		ret = execute(args_cfg[0],args_cfg,5);	else if(si.in_excute == EXCUTE_BPMC)		ret = execute(args_abpm[0],args_abpm,5);	else if(si.in_excute == EXCUTE_TARX)		ret = execute(args_tarx[0],args_tarx,20);	else if(si.in_excute == EXCUTE_TARC)		ret = execute(args_tarc[0],args_tarc,20);	else if(si.in_excute == EXCUTE_GETTY)		ret = execute(args_getty[0],args_getty,1800);	else		break;	if(ret)		lasterr = TRUE;	else		lasterr = FALSE;	CLR_OPT();	if(si.in_excute == EXCUTE_TARX)		remove("/usr/local/abpm/abpm.tar.gz");	if(si.in_excute != EXCUTE_GETTY){				if(si.in_excute != EXCUTE_TARC){			si.in_excute = EXCUTE_IDLE;			cmd_Start();		}else			si.in_excute = EXCUTE_IDLE;		if(ret)			cmd_Start();		CLR_OPT();		PostMessage(hMainWnd, MSG_EXCUTE, ret, si.in_excute);	}	if (fAppExit) break;	    }    DBGMSG(" thread exit: fAppExit:%d\n", fAppExit);    return NULL;}static void * cmdThreadProc (void * sem){	int		ret = -1;	    	while (!fAppExit){	        while (sem_wait((sem_t*)sem) < 0 && errno == EINTR && !fAppExit){	            sched_yield();	        }		printf("begin to cmd\n");		while(!fAppExit && !fNOmonit){			char	buff[64];						if(si.in_excute || si.in_xmodem ||(!si.usb_status)){				fNOmonit = TRUE;				continue;			}						if((ret=getabpmcmd()) == FALSE){				printf("getcmd false\n");				continue;			}			//printf("excute setabpm\n");			if(si.in_excute || si.in_xmodem ||(!si.usb_status)){				fNOmonit = TRUE;				continue;			}						if(ret == 1){				si.in_excute = EXCUTE_CMD;				sprintf(buff,"/usr/bin/%s",args_setabpm[0]);				args_setabpm[0] = buff;				ret = execute(args_setabpm[0],args_setabpm,120);				CLR_OPT();				si.in_excute = EXCUTE_IDLE;			}else if(ret == 2){				int	idx = -1;				if(args_setabpm[1])					idx = atoi(args_setabpm[1]);				if(idx >=MENU_UP_ALL && idx <= MENU_CMD_GETTY)					//printf("run menu:%d\n",idx);					automenuSelected(idx);					fNOmonit = TRUE;			}			if (fAppExit) break;		    		}		printf("thread cancel monit\n");	}	DBGMSG(" thread exit: fAppExit:%d\n", fAppExit);	return NULL;}int Thread_Init(void){	int	ret;	sem_init (&sem_xmodem, 0, 0);	ret = pthread_create (&pthread_xmodem, NULL, xmodemThreadProc, &sem_xmodem);	if(ret ){		printf("init pthread_xmodem failed\n");		return -1;	}	sem_init (&sem_excute, 0, 0);	ret = pthread_create (&pthread_excute, NULL, excuteThreadProc, &sem_excute);	if(ret ){		printf("init pthread_xmodem failed\n");		return -1;	}	sem_init (&sem_cmd, 0, 0);	ret = pthread_create (&pthread_cmd, NULL, cmdThreadProc, &sem_cmd);	if(ret ){		printf("init pthread_xmodem failed\n");		return -1;	}		return 0;}void	SystemIint(void){	chdir("/media/flash/abpm");	system("rm abpm.tar.gz");	chdir("/usr");	memset(&si,0,sizeof(Systeminfo));}int MiniGUIMain (int argc, const char* argv[]){	MSG Msg;	MAINWINCREATE CreateInfo;		if(Thread_Init()){		goto EXIT;	}		SystemIint();	LCD_Flash();		CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;	CreateInfo.dwExStyle = WS_EX_NONE;	CreateInfo.spCaption = "设备通讯菜单";	CreateInfo.hMenu = 0;	CreateInfo.hCursor = GetSystemCursor(0);	CreateInfo.hIcon = 0;	CreateInfo.MainWindowProc = MainWinProc;	CreateInfo.lx = 0;	CreateInfo.ty = 0;	CreateInfo.rx = 320;	CreateInfo.by = 240;	CreateInfo.iBkColor = COLOR_lightwhite;	CreateInfo.dwAddData = 0;	CreateInfo.hHosting = HWND_DESKTOP;	hMainWnd = CreateMainWindow (&CreateInfo);	//printf ("The main window created.\n");	if (hMainWnd == HWND_INVALID){		printf("create whd failed\n");		return -1;	}	ShowWindow(hMainWnd, SW_SHOWNORMAL);	//printf ("The main window showed.\n");	while (GetMessage(&Msg, hMainWnd)) {		TranslateMessage(&Msg);		DispatchMessage(&Msg);	}	MainWindowThreadCleanup (hMainWnd);EXIT:		return 0;}

⌨️ 快捷键说明

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