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

📄 matain.c

📁 用MINIGUI开发的维护程序.ARM编译. 上传镜像文件,下载镜像文件,下载程序文件,下载配置文件,上传日志文件 利用XMODEM 协议传输文件.
💻 C
📖 第 1 页 / 共 2 页
字号:
/* ** $Id: helloworld.c,v 1.25 2005/02/01 09:42:31 clear Exp $**** Listing 2.1**** helloworld.c: Sample program for MiniGUI Programming Guide**      The first MiniGUI application.**** Copyright (C) 2004 Feynman Software.**** License: GPL*/#include <minigui/common.h>#include <minigui/minigui.h>#include <minigui/gdi.h>#include <minigui/window.h>#include <minigui/control.h>#include <linux/input.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <errno.h>#include <limits.h>#include <unistd.h>#include <time.h>#include <pwd.h>#include <stdarg.h>#include <sys/ioctl.h>#include <sys/types.h>#include <sys/time.h>#include <wait.h>#include <sys/stat.h>#include <sys/file.h>#include <unistd.h>#include <sched.h>#include <pthread.h>#include <termios.h> #include <fcntl.h>#include <setjmp.h>#include <assert.h>#define	IDC_USB			100#define	IDC_MENU			101#define	IDC_SETUP			102#define  	VIEW_WIDTH      		320#define  	VIEW_HEIGHT     		240#define  	ONE_SECOND     		100#define	HALF_SECOND		25#define  	MSG_XMODEM        	(MSG_USER + 106)#define  	MSG_EXCUTE        	(MSG_USER + 107)#define  	MSG_NOTIFY        		(MSG_USER + 108)#define	DBGMSG				printf#define 	USB_DISCON		119#define 	USB_INSERT			110#define 	BEEP_PIN    			13  // PA13#define 	FALSE       			0#define 	TRUE        			1#define 	IDC_DUMMY   		100#define	 TIMER_ONE_SEC	100#define	 TIMER_HAF_SEC	  	50#define	IDC_FIRST			100#define	MAX_ARG			10typedef	struct	SystemInfo_tag{		int		usb_status;	int		menu;	int		in_excute;	int		in_xmodem;	int		xm_pid;	int		xm_mode;	char		filen[128];	}Systeminfo;struct  gpio_pin {    unsigned short pin;    unsigned short value;};Systeminfo	si;BOOL  volatile  fAppExit = FALSE;BOOL volatile fXMCancel = FALSE;BOOL volatile fNOmonit = FALSE;static pthread_t  pthread_xmodem;static pthread_t  pthread_excute;static pthread_t  pthread_cmd;sem_t   sem_xmodem;sem_t   sem_excute;sem_t   sem_cmd;static int	lasterr	=0;HWND  hMainWnd = HWND_INVALID;HWND  hctlusb = HWND_INVALID;HWND  hctlmenu = HWND_INVALID;#define	SET_USB(text)	SetWindowText(hctlusb, text)#define	SET_OPT(text)	SetWindowText(hctlmenu, text) #define	CLR_OPT()		SetWindowText(hctlmenu, " [当前操作]:空闲!") static inline	void  	CLR_USB(void) {	if(si.usb_status)		SetWindowText(hctlusb, " [连接状态]:USB已连接!");	else		SetWindowText(hctlusb, " [连接状态]:请插入USB线!"); }char *args_cfg[] = {"/bin/cp","-af","/usr/abpm.cfg","/media/flash/abpm/",NULL};char *args_abpm[] = {"/bin/cp","-af","/usr/abpm","/media/flash/abpm/",NULL};char *args_tarx[] = {"/bin/tar","-xzf","abpm.tar.gz",NULL};char *args_tarc[] = {"/bin/tar","-czf","abpm.tar.gz","bpfile","msgs","abpm.cfg",NULL};char *args_getty[] = {"/bin/getty","115200","ttyGS0",NULL};char *args_setabpm[MAX_ARG+1];struct termios oldtty;unsigned char		G_buff[8092];static const char *  lines[] ={	"上传镜像文件",	"下载镜像文件",	"下载程序文件",	"下载配置文件",	"上传系统日志",	"超级用户模式",};static const char *  xmode[] ={	"send",	"recv",};enum {	XM_SEND	=0,	XM_RECV,};enum {	RET_SUCESS		= 0,	RET_SYSFAILED,	RET_XMCANCEL,	RET_XMNOSYNC,	RET_XMERROR,	//send or receiv error	RET_USBDISC = 100,};enum {	EXCUTE_IDLE	=0,	EXCUTE_BPMC,	EXCUTE_CFGC,	EXCUTE_TARX,	EXCUTE_TARC,	EXCUTE_CMD,	EXCUTE_GETTY,	};typedef enum {	MENU_UP_ALL = 0,	MENU_DW_ALL,	MENU_DW_ABPM,	MENU_DW_CONF,	MENU_UP_LOG,	MENU_CMD_GETTY,	MENU_LAST_RESERVED,} MenuID;enum {	IDC_YES = IDC_FIRST,	IDC_NO};typedef enum {    CONFIRM_YES     = 0,    CONFIRM_NO      = 1,    CONFIRM_CANCEL  = 2,    CONFIRM_RSTALL = 3,    CONFIRM_RSTPIN	= 4,} ConfirmType;//确定取消static CTRLDATA cd_yesno[] ={     {        CTRL_STATIC,		WS_VISIBLE | SS_GROUPBOX,        20, 20, 200, 90,        IDC_DUMMY,        "请选择: ",        0    },    {		CTRL_BUTTON,		WS_CHILD | BS_PUSHBUTTON | WS_VISIBLE | WS_TABSTOP,		30, 60, 80, 30,        IDC_YES,        "是",    },    {		CTRL_BUTTON,		WS_CHILD | BS_PUSHBUTTON | WS_VISIBLE | WS_TABSTOP,		120, 60, 80, 30,        IDC_NO,        "否",    }};static  inline void cmd_Start(void){	int sv = 0;	sem_getvalue(&sem_cmd, &sv);	if (sv <= 0){		fNOmonit  = FALSE;		sem_post (&sem_cmd);		CLR_USB();	}}void  GPIO_Set(int pin, int v){    struct  gpio_pin  gpio;    int  fd = open ("/dev/gpio", 0);    if (fd >= 0){        gpio.pin = pin;        gpio.value = !!v;        ioctl (fd, 1, &gpio);        close(fd);    }}void  VPM_Set( const char * file, int value){    FILE * vf;    if ((vf = fopen(file, "w"))){        char buf[64];        sprintf(buf, "%d", value);        fputs(buf, vf);        fclose(vf);    }}static inline void LCD_Flash(void){    VPM_Set("/proc/sys/vpm/lcd_busy", 1);    VPM_Set("/proc/sys/vpm/lcd_busy", 0);}void Wait(int n10ms, BOOL * pexit){    uint  etv = GetTickCount()  + n10ms;    sched_yield();    while (1){        if (pexit && *pexit) break;        if (GetTickCount()  >= etv) break;        sched_yield();    }}static inline void BEEP(int n10ms){        GPIO_Set(BEEP_PIN, TRUE);	Wait(n10ms, NULL);        GPIO_Set(BEEP_PIN, FALSE);}// tick: 10 ms unitvoid SlowWait(int n10ms){    uint  etv = GetTickCount()  + n10ms;    //sched_yield();    while (!fAppExit){	//printf("get tick:%d\n",GetTickCount() );        if (GetTickCount()  >= etv) break;       // sched_yield();    }}int myDefaultMainWinProc(HWND hwnd, int msg, WPARAM wp, LPARAM lp){    switch (msg){        case MSG_KEYDOWN:		if(wp == USB_DISCON){			if(si.usb_status == TRUE){				HWND  aw = GetActiveWindow();				while (aw != hMainWnd){					SendMessage(aw, MSG_CLOSE, 0, 0L);					aw = GetActiveWindow();				}				BEEP(5);				SetWindowText(GetDlgItem(hwnd,IDC_USB)," [连接状态]:请插入USB线!");				fXMCancel = TRUE;				fNOmonit = TRUE;				SlowWait(HALF_SECOND);							}		}else if(wp == USB_INSERT){			HWND  aw = GetActiveWindow();			while (aw != hMainWnd){				SendMessage(aw, MSG_CLOSE, 0, 0L);				aw = GetActiveWindow();			}			BEEP(5);			SetWindowText(GetDlgItem(hwnd,IDC_USB)," [连接状态]:USB已连接!");			CLR_OPT();			fXMCancel = TRUE;			fNOmonit = TRUE;			SlowWait(HALF_SECOND);						si.usb_status = TRUE;			si.in_excute = 0;			si.in_xmodem= 0;			si.menu = 0;			fNOmonit = FALSE;			fXMCancel = FALSE;			cmd_Start();					}		    }    return DefaultMainWinProc(hwnd, msg, wp, lp);}static int confirmYesNopro (HWND hDlg, int msg, WPARAM wp, LPARAM lp){ 	HWND hctl;	switch (msg) {		case MSG_INITDIALOG:		{	        hctl = GetDlgItem(hDlg,IDC_YES);			SetWindowText(GetDlgItem(hDlg, IDC_DUMMY), \					(char *)GetWindowAdditionalData(hDlg));	        SetFocusChild(hctl);	        SendMessage(hctl, BM_SETCHECK, BST_CHECKED, 0);			return 0;		}        	case MSG_KEYDOWN:			switch(wp){				//if(lp) return 0;				printf("get key:%d\n",wp);				if(si.in_excute == EXCUTE_GETTY)		return 0;								case KEY_ESC:					//PostMessage (GetHosting(hDlg), MSG_NOTIFY, CONFIRM_CANCEL,lp);					//PostMessage(hDlg, MSG_CLOSE, 0, 0L);					return 0;				case KEY_UP:				case KEY_DOWN:				case KEY_LEFT:				case KEY_RIGHT:				{					HWND lastFocus;					HWND focus;					lastFocus = GetFocusChild(hDlg);					if (wp == KEY_LEFT || wp == KEY_UP)					focus = GetNextDlgTabItem(hDlg, lastFocus, TRUE);					else					focus = GetNextDlgTabItem(hDlg, lastFocus, FALSE);					if (focus)						SetFocusChild(focus);				  }					return 0;				default:					break;			}			break;		case MSG_COMMAND:			if(wp == IDC_YES){				PostMessage (GetHosting(hDlg), MSG_NOTIFY,CONFIRM_YES,0);				PostMessage(hDlg, MSG_CLOSE, 0, 0L);			}else if(wp == IDC_NO){				PostMessage (GetHosting(hDlg), MSG_NOTIFY,CONFIRM_NO,0);			}			return 0;		  case MSG_CLOSE:		            DestroyAllControls(hDlg);		            DestroyMainWindow (hDlg);		            return 0;		   case MSG_SETFOCUS:			    SetFocusChild(GetDlgItem(hDlg,IDC_NO));		default:			break;	}    return myDefaultMainWinProc(hDlg, msg, wp, lp);}int ConfirmYesNo(HWND hwnd, char *caption,char *title,int id){	static DLGTEMPLATE dlg =	{		WS_BORDER | WS_CAPTION,		WS_EX_NONE,		46, 80, 240, 150,		"请您继续操作",		0, 0,		0,   // controls count		NULL, 0	};	dlg.caption = caption;	dlg.dwAddData = (DWORD)title;	dlg.controlnr = TABLESIZE(cd_yesno);	dlg.controls = cd_yesno;	return CreateMainWindowIndirectParam (&dlg, hwnd, confirmYesNopro, (LPARAM)id);}static int  msgAlert (HWND hDlg, int msg, WPARAM wp, LPARAM lp){    static int  v;	switch (msg) {		case MSG_INITDIALOG:		    v = (int)lp;			if(v == 0)				SetTimer(hDlg, 100, TIMER_ONE_SEC);			else				SetTimer(hDlg, 100, v);			return 0;        case MSG_TIMER:		if(v == 0){			DBGMSG("device locked\n");			while(1);		}		SendMessage(hDlg, MSG_CLOSE, 0, 0L);		return 0;	case MSG_KEYDOWN:			if(lp) return 0;	case MSG_CLOSE:		KillTimer(hDlg, 100); 		DestroyAllControls(hDlg);		DestroyMainWindow (hDlg);		return 0;	}	return myDefaultMainWinProc (hDlg, msg, wp, lp);}int MessageAlert(HWND hwnd, const char * caption, const char * text, int n10ms){	static DLGTEMPLATE dlg =    {        WS_ABSSCRPOS | WS_CAPTION | WS_BORDER, WS_EX_NONE,	    40, 80,	    VIEW_WIDTH - 80,   VIEW_HEIGHT - 100,        "alert",        0, 0, 0, NULL, 0L    };    CTRLDATA     ctrldata [] =    {        {            CTRL_STATIC,            WS_CHILD | SS_CENTER | WS_VISIBLE,            20,20,    		208,80,    		100,    		text,    		0, 0        },    };    dlg.caption = caption;    dlg.controlnr = TABLESIZE(ctrldata);    dlg.controls = ctrldata;    return CreateMainWindowIndirectParam (&dlg, hwnd, msgAlert, n10ms);}static  inline void Xmodem_Start(void){	int sv = 0;	sem_getvalue(&sem_xmodem, &sv);	if (sv <= 0){		fNOmonit  = TRUE;		sem_post (&sem_xmodem);		SET_USB(" [连接状态]:传输中...");		SET_OPT(" [当前操作]:正在传输文件...");			}}static  inline void excute_Start(int	type){	int sv = 0;	sem_getvalue(&sem_excute, &sv);	if (sv <= 0){		fNOmonit  = TRUE;		si.in_excute = type;		sem_post (&sem_excute);		CLR_USB();		if(type != EXCUTE_GETTY)			SET_OPT(" [当前操作]:拷贝/压缩/解压 文件...");	}} static void fillmenuitems(HWND hdlg,int cursel){	int i;	//SendMessage(hdlg, LB_RESETCONTENT, 0, 0);	for(i=0;i<MENU_LAST_RESERVED;i++)		SendMessage (hdlg, LB_ADDSTRING, 0, (LPARAM)lines[i]);	SendMessage (hdlg, LB_SETCURSEL, cursel, 0);}static void menuSelected(HWND hctl, int id, int nc, DWORD add_data){    char	buff[64];    int 	ret;    if (id == IDC_MENU){        if(nc == LBN_ENTER){		int index = SendMessage (hctl, LB_GETCURSEL, 0, 0);		if(si.in_xmodem ||si.in_excute|| (!si.usb_status)){			BEEP(5);			 MessageAlert(hMainWnd, "[错误提示]", "请插入USB或等待操作结束!", ONE_SECOND*3);			 return ;		}		si.menu = index;		switch(index){			case MENU_DW_ABPM:			case MENU_DW_CONF:			case MENU_DW_ALL:				if(index == MENU_DW_ABPM)					strcpy(si.filen,"/usr/abpm");				else if(index == MENU_DW_CONF)					strcpy(si.filen,"/usr/abpm.cfg");				else 					strcpy(si.filen,"/media/flash/abpm/abpm.tar.gz");				si.xm_mode = XM_RECV;				Xmodem_Start();				break;			case MENU_UP_LOG:				si.xm_mode = XM_SEND;				strcpy(si.filen,"/media/flash/abpm/log/abpm.log");				//strcpy(si.filen,"/media/flash/log/abpm.log");				Xmodem_Start();				break;			case MENU_UP_ALL:				ret = chdir("/media/flash/abpm");				if(!ret)					excute_Start(EXCUTE_TARC);				else{					BEEP(5);					MessageAlert (hMainWnd,(char *) lines[si.menu], "[失败] 压缩文件失败",ONE_SECOND*5);				}				break;			case MENU_CMD_GETTY:				sprintf(buff," [当前操作]:超级用户模式");				SET_OPT(buff);				excute_Start(EXCUTE_GETTY);				MessageAlert(hMainWnd, "[提示]", "界面失效,请登陆操作", 0);				return;		}		ConfirmYesNo(hMainWnd,(char *) lines[si.menu],"是否中止?",0);        }    }}static void automenuSelected(int index){    char	buff[64];    int 	ret;	if(si.in_xmodem ||si.in_excute|| (!si.usb_status)){		BEEP(5);		 MessageAlert(hMainWnd, "[错误提示]", "请插入USB或等待操作结束!", ONE_SECOND*3);		 return ;	}		SendMessage (hctlmenu, LB_SETCURSEL, index, 0);	si.menu = index;	printf("menu select:%d\n",index);	switch(index){		case MENU_DW_ABPM:		case MENU_DW_CONF:		case MENU_DW_ALL:			if(index == MENU_DW_ABPM)				strcpy(si.filen,"/usr/abpm");			else if(index == MENU_DW_CONF)				strcpy(si.filen,"/usr/abpm.cfg");			else 				strcpy(si.filen,"/media/flash/abpm/abpm.tar.gz");			si.xm_mode = XM_RECV;			Xmodem_Start();			break;		case MENU_UP_LOG:			si.xm_mode = XM_SEND;			strcpy(si.filen,"/media/flash/abpm/log/abpm.log");			//strcpy(si.filen,"/media/flash/log/abpm.log");			Xmodem_Start();						break;		case MENU_UP_ALL:			ret = chdir("/media/flash/abpm");			if(!ret)				excute_Start(EXCUTE_TARC);			else{				BEEP(5);				MessageAlert (hMainWnd,(char *) lines[si.menu], "[失败] 压缩文件失败",ONE_SECOND*5);			}			break;		case MENU_CMD_GETTY:			sprintf(buff," [当前操作]:超级用户模式");			SET_OPT(buff);			excute_Start(EXCUTE_GETTY);			MessageAlert(hMainWnd, "[提示]", "界面失效,请登陆操作", 0);			return;	}	//ConfirmYesNo(hMainWnd,(char *) lines[si.menu],"是否中止?",0);}static void createWidgets(HWND hwnd){    HWND hctl = HWND_INVALID;		hctlusb = CreateWindow (CTRL_STATIC,				  " [连接状态]:请插入USB线!",				  WS_CHILD | WS_VISIBLE | SS_SIMPLE,				  IDC_USB,				  0, 0, 310, 20,				  hwnd, 0);	hctlmenu = CreateWindow (CTRL_STATIC,				  " [当前操作]:请选择!",				  WS_CHILD | WS_VISIBLE | SS_SIMPLE,				  IDC_SETUP,				  0, 20, 310, 32,				  hwnd, 0);	hctl = CreateWindow(CTRL_LISTBOX, "",                        WS_BORDER | WS_CHILD | WS_VISIBLE | WS_VSCROLL | LBS_NOTIFY ,                        IDC_MENU,

⌨️ 快捷键说明

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