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

📄 eibdrv_comm.c

📁 欧洲安装总线系统的USB串口接口驱动c程序源代码.软件代码由西门子公司提供
💻 C
📖 第 1 页 / 共 2 页
字号:
      exit(2);   while(1) pause();}void write_sigchld_handler(){   /*  SIGCHLD wird bei jeder Beendigung des Write-idle-       Prozesses an den main-Prozess gesendet. Wenn die        Beendigung des Prozesses jedoch durch den        SIGTERM-Handler des main-Prozesses erfolgt ist, wird       aufgrund der Nichtunterbrechbarkeit des SIGTERM-Handlers       durch andere Signale mit anschliessender Programmbeendigung der       SIGCHLD-Handler nicht mehr aufgerufen.    */   int exit_status;   pid_t exit_pid;      exit_pid=wait(&exit_status);   comm->cleanup_code=6;   if (WIFSIGNALED(exit_status))      fl_ext_panel1(comm->Panels+6,comm,cleanup);   else   {  switch(WEXITSTATUS(exit_status))      {  case 1: // receive SIGTERM         case 2: // fail sigaction for SIGTERM-handler                 // fail sigaction for SIGUSR1-handler                 // fail shmat for write_shm                 fl_ext_panel1(comm->Panels+6,comm,cleanup);                 break;      }   }  }void write_sigterm_handler(){   /*  Das Hauptform ist bereits aufgebaut, wenn der Handler installiert       wird. Ein hide ist daher auch bei abgeblendetem Form ungefaehrlich,       das free wirkt jedenfalls auf ein bestehendes Form.    */     fl_hide_form(comm->Form->VisForm);   fl_free_form(comm->Form->VisForm);      if (write_pid!=0)   {  kill(write_pid,SIGTERM);      waitpid(write_pid,NULL,0);   }   semctl(write_shm_sem_id,0,IPC_RMID,(int)0);   shmdt(write_shm);   shmctl(write_shm_id,IPC_RMID,(int)0);   close(comm->eib_fd);   returnEib_bcu2_comm(comm);      fl_finish();   exit(0);}void write_sigusr1_handler(){     /*  SIGUSR1 wird vom write-idle process an den communicator im        write mode gesendet, wenn er dieser die das Ergebnis des       write Systemaufrufs erhalten hat, gesendet.    */          char browsertext[EIB_BUF_ELEMENT_SIZE*3+12+27];   int i;   time_t log_time;   FL_OBJECT *browser=comm->Form->SentMsgBrowser;      if (comm->state==EIBDRV_COMM_STATE_WAITWRITE)   {  comm->state=EIBDRV_COMM_STATE_READY;      time(&log_time);      P(write_shm_sem_id);      strcpy(&browsertext[0],"@f");      strcpy(&browsertext[2],ctime(&log_time));      strcpy(&browsertext[26],"   ");      for (i=0;i<write_shm->len;i++)         sprintf(&browsertext[29+3*i],"%02X ",write_shm->msg[i]);      for (i=write_shm->len;i<EIB_BUF_ELEMENT_SIZE;i++)         strcpy(&browsertext[29+3*i],"-- ");         if (write_shm->n_written<write_shm->len)                  sprintf(&browsertext[29+3*i],"(%3i)",write_shm->n_written);      else         sprintf(&browsertext[29+3*i],"(%3i)  OK",write_shm->n_written);      browsertext[38+3*i]='\0';        V(write_shm_sem_id);      if (fl_get_browser_maxline(browser)+1==EIBDRV_COMM_BROWSERMAXLINE)      {  for (i=0;i<EIBDRV_COMM_BROWSERDELLINE-1;i++)            fl_delete_browser_line(browser,1);         fl_replace_browser_line(browser,1,"lines have been deleted ...");      }      fl_add_browser_line(browser,&browsertext[0]);      fl_set_browser_topline(browser,fl_get_browser_maxline(browser)-            fl_get_browser_screenlines(browser)+1);   }}void eibdrv_comm_write(char *device){     /*  Communicator in Write Mode    */       int result,mode;   struct sigaction write_sigterm;   struct sigaction write_sigchld;   struct sigaction write_sigusr1;         comm->comm_mode=EIBDRV_COMM_MODE_WRITE;   comm->cleanup_code=1;         if ((comm->eib_fd=open(device,O_RDWR))<0)   {  switch(result=errno)      {  case ENOENT:  fl_ext_panel1(comm->Panels,comm,cleanup);                       break;         case EBUSY:   fl_ext_panel1(comm->Panels+1,comm,cleanup);                       break;         case ENOBUFS: fl_ext_panel1(comm->Panels+2,comm,cleanup);                       break;         default:      fl_ext_panel1(comm->Panels+3,comm,cleanup);                       break;      }      fl_do_forms();   }   comm->cleanup_code=2;      if ((mode=ioctl(comm->eib_fd,FT_GET_MODE))<0)   {  switch(result=errno)      {  case EBUSY: fl_ext_panel1(comm->Panels+4,comm,cleanup);                     break;      }      fl_do_forms();   }   comm->Form=create_form_VisForm(comm);   fl_show_form(comm->Form->VisForm,FL_PLACE_CENTER,FL_TRANSIENT,"eibdrv_comm_write");   comm->cleanup_code=3;        fl_set_object_label(comm->Form->DeviceText,device);   switch(mode)   {  case FT_STANDARDMODE:               fl_set_object_label(comm->Form->ModeText,"Standard Mode");              fl_ext_panel1(comm->Panels+5,comm,panel_cb);              break;      case FT_SERVERMODE:              fl_set_object_label(comm->Form->ModeText,"Server Mode");              if (ioctl(comm->eib_fd,FT_SET_WRITE_MODE,FT_WRITE_ACKNOWLEDGED)<0)              {  switch(result=errno)                 {  case EBUSY:                            fl_ext_panel1(comm->Panels+4,comm,cleanup);                            break;                    case ENOPROC: // should not occur                 }                 fl_do_forms();              }              break;   }   write_sigterm.sa_handler=write_sigterm_handler;   sigfillset(&write_sigterm.sa_mask);   write_sigterm.sa_flags=0;   if (sigaction(SIGTERM,&write_sigterm,NULL)==-1)   {  fl_ext_panel1(comm->Panels+6,comm,cleanup);      fl_do_forms();   }   write_sigchld.sa_handler=write_sigchld_handler;   sigfillset(&write_sigchld.sa_mask);   write_sigchld.sa_flags=0;   if (sigaction(SIGCHLD,&write_sigchld,NULL)==-1)   {  fl_ext_panel1(comm->Panels+6,comm,cleanup);      fl_do_forms();   }   write_sigusr1.sa_handler=write_sigusr1_handler;   sigfillset(&write_sigusr1.sa_mask);   write_sigusr1.sa_flags=0;   if (sigaction(SIGUSR1,&write_sigusr1,NULL)==-1)   {  fl_ext_panel1(comm->Panels+6,comm,cleanup);      fl_do_forms();   }   if ((write_shm_id=shmget(IPC_PRIVATE,sizeof(write_shm_struct),0600|IPC_CREAT|IPC_EXCL))==-1)   {  fl_ext_panel1(comm->Panels+6,comm,cleanup);      fl_do_forms();   }   comm->cleanup_code=4;      if ((write_shm=(write_shm_struct *)shmat(write_shm_id,NULL,0))==(void *)-1)   {  fl_ext_panel1(comm->Panels+6,comm,cleanup);      fl_do_forms();   }   comm->cleanup_code=5;      if ((write_shm_sem_id=semget(IPC_PRIVATE,1,0600|IPC_CREAT|IPC_EXCL))==-1)   {  fl_ext_panel1(comm->Panels+6,comm,cleanup);      fl_do_forms();   }   comm->cleanup_code=6;      if (semctl(write_shm_sem_id,0,SETVAL,(int)1)==-1)   {  fl_ext_panel1(comm->Panels+6,comm,cleanup);      fl_do_forms();   }   switch(write_pid=fork())   {  case -1: fl_ext_panel1(comm->Panels+6,comm,cleanup);               fl_do_forms();      case  0: eibdrv_comm_write_idle();   }   comm->state=EIBDRV_COMM_STATE_READY;   fl_do_forms();}/*  ---------------------------------------------------------------------------    Funktionen fuer Read Mode.    ---------------------------------------------------------------------------     */void read_sigterm_handler(){  time_t end_time;   char line[96];   int i;         if (comm->log_fd!=NULL)   {  time(&end_time);      for (i=0;i<95;i++) line[i]='='; line[95]='\0';      fprintf(comm->log_fd,"%s\nEnd:     %s%s",line,ctime(&end_time),line);      fclose(comm->log_fd);   }   fl_hide_form(comm->Form->VisForm);   fl_free_form(comm->Form->VisForm);   close(comm->eib_fd);   returnEib_bcu2_comm(comm);   fl_finish();   exit(0);}void read_sigio_handler(){  unsigned char msg[EIB_BUF_ELEMENT_SIZE];   char browsertext[EIB_BUF_ELEMENT_SIZE*3+3+27];   int i;   int n_read;   time_t log_time;   FL_OBJECT *browser=comm->Form->ReceivedMsgBrowser;   while ((n_read=read(comm->eib_fd,&msg[0],EIB_BUF_ELEMENT_SIZE))>0)   {  time(&log_time);      strcpy(&browsertext[0],"@f");      strcpy(&browsertext[2],ctime(&log_time));      strcpy(&browsertext[26],"   ");      for (i=0;i<n_read;i++)         sprintf(&browsertext[29+3*i],"%02X ",msg[i]);      for (i=n_read;i<EIB_BUF_ELEMENT_SIZE;i++)         strcpy(&browsertext[29+3*i],"-- ");      if (fl_get_browser_maxline(browser)+1==EIBDRV_COMM_BROWSERMAXLINE)      {  for (i=0;i<EIBDRV_COMM_BROWSERDELLINE-1;i++)            fl_delete_browser_line(browser,1);         fl_replace_browser_line(browser,1,"lines have been deleted ...");      }      fl_add_browser_line(browser,&browsertext[0]);      fl_set_browser_topline(browser,fl_get_browser_maxline(browser)-            fl_get_browser_screenlines(browser)+1);      fprintf(comm->log_fd,"%s\n",&browsertext[2]);   }}   void eibdrv_comm_read(char *device){     /*  Communicator in Read Mode    */      int result,mode,i;   struct sigaction read_sigio;   struct sigaction read_sigterm;   unsigned long flags;   time_t start_time;   char line[96];               comm->comm_mode=EIBDRV_COMM_MODE_READ;   comm->cleanup_code=1;         if ((comm->eib_fd=open(device,O_RDWR|O_NONBLOCK))<0)   {  switch(result=errno)      {  case ENOENT:  fl_ext_panel1(comm->Panels,comm,cleanup);                       break;         case EBUSY:   fl_ext_panel1(comm->Panels+1,comm,cleanup);                       break;         case ENOBUFS: fl_ext_panel1(comm->Panels+2,comm,cleanup);                       break;         default:      fl_ext_panel1(comm->Panels+3,comm,cleanup);                       break;      }      fl_do_forms();   }   comm->cleanup_code=2;      if ((mode=ioctl(comm->eib_fd,FT_GET_MODE))<0)   {  switch(result=errno)      {  case EBUSY: fl_ext_panel1(comm->Panels+4,comm,cleanup);                     break;      }      fl_do_forms();   }      if (fcntl(comm->eib_fd,F_SETOWN,getpid())==-1)   {  fl_ext_panel1(comm->Panels+6,comm,cleanup);      fl_do_forms();   }   if ((flags=fcntl(comm->eib_fd,F_GETFL))==-1)   {  fl_ext_panel1(comm->Panels+6,comm,cleanup);      fl_do_forms();   }   if (fcntl(comm->eib_fd,F_SETFL,flags|FASYNC)==-1)   {  fl_ext_panel1(comm->Panels+6,comm,cleanup);      fl_do_forms();   }         comm->Form=create_form_VisForm(comm);   fl_show_form(comm->Form->VisForm,FL_PLACE_CENTER,FL_TRANSIENT,"eibdrv_comm_read");   comm->cleanup_code=3;        fl_set_object_label(comm->Form->DeviceText,device);   switch(mode)   {  case FT_STANDARDMODE:               fl_set_object_label(comm->Form->ModeText,"Standard Mode");              fl_ext_panel1(comm->Panels+5,comm,panel_cb);              fl_ext_deactivate_object(comm->Form->StatusBtn);              break;      case FT_SERVERMODE:              fl_set_object_label(comm->Form->ModeText,"Server Mode");              break;   }   read_sigio.sa_handler=read_sigio_handler;   sigfillset(&read_sigio.sa_mask);   read_sigio.sa_flags=0;   if (sigaction(SIGIO,&read_sigio,NULL)==-1)   {  fl_ext_panel1(comm->Panels+6,comm,cleanup);      fl_do_forms();   }   read_sigterm.sa_handler=read_sigterm_handler;   sigfillset(&read_sigterm.sa_mask);   read_sigterm.sa_flags=0;   if (sigaction(SIGTERM,&read_sigterm,NULL)==-1)   {  fl_ext_panel1(comm->Panels+6,comm,cleanup);      fl_do_forms();   }   if ((comm->log_fd=fopen(EIBDRV_COMM_LOGFILE,"w"))==NULL)      fl_ext_panel1(comm->Panels+9,comm,panel_cb);   else   {  time(&start_time);      for (i=0;i<95;i++) line[i]='='; line[95]='\0';      fprintf(comm->log_fd,"%s\nLOG for: %s\nFile:    %s\nStart:   %s%s\n",            line,"eibdrv_comm (Read Mode)","eibdrv_comm.log",            ctime(&start_time),line);      fprintf(comm->log_fd,"\n\nCONFIGURATION:\n\nDevice:  %s\nMode:    %s\n%s\n\n",            device,(mode==FT_STANDARDMODE ? "Standard Mode" : "Server Mode"),line);   }            fl_do_forms();}         int main(int argc, char *argv[]){        comm=getEib_bcu2_comm();   if (read_PanelContentA(EIBDRV_COMM_PANELFILE,&comm->Panels)!=EIBDRV_COMM_PANELFILESIZE)   {  printf("eibdrv_comm: Panelfile %s not found!\n",EIBDRV_COMM_PANELFILE);      exit(2);   }      if (argc!=3)   {  printf("usage: eibdrv_comm r|w device\n");      exit(1);   }      fl_set_icm_color(FL_INACTIVE_COL,200,200,200);   fl_initialize(&argc,argv,"eibdrv_comm",0,0);   fl_set_border_width(2);      if (strcmp(argv[1],"w")==0)      eibdrv_comm_write(argv[2]);   else if (strcmp(argv[1],"r")==0)      eibdrv_comm_read(argv[2]);   else   {  printf("usage: eibdrv_comm r|w device\n");      exit(1);   }}   

⌨️ 快捷键说明

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