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