📄 matain.c
字号:
/* ** $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 + -