📄 eibdrv_sim.c
字号:
fl_ext_formobjects_add_box(FL_BORDER_BOX,40,555,365,20,"", FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); rw_ges=0; for (i=0;i<4;i++) rw_ges+=sim->stat->write[i]; rw_pt=363.0/rw_ges; lowerbound=41; for (i=1;i<5;i++) { if (sim->stat->write[i%4]>0) { fl_ext_formobjects_add_box2(&obj,FL_FLAT_BOX,lowerbound,556,404-lowerbound,18,"", FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); switch(i%4) { case 1: fl_set_object_color(obj,EIBDRV_SIM_W1_COL,BOX_COL2); break; case 2: fl_set_object_color(obj,EIBDRV_SIM_W2_COL,BOX_COL2); break; case 3: fl_set_object_color(obj,EIBDRV_SIM_W3_COL,BOX_COL2); break; case 0: fl_set_object_color(obj,EIBDRV_SIM_WFAILED_COL,BOX_COL2); break; } lowerbound+=(int)(sim->stat->write[i%4]*rw_pt); } } fl_ext_formobjects_add_box(FL_BORDER_BOX,465,555,365,20,"", FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); rw_ges=0; for (i=0;i<3;i++) rw_ges+=sim->stat->read[i]; rw_pt=363.0/rw_ges; lowerbound=466; for (i=0;i<3;i++) { if (sim->stat->read[i]>0) { fl_ext_formobjects_add_box2(&obj,FL_FLAT_BOX,lowerbound,556,829-lowerbound,18,"", FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); switch(i) { case 0: fl_set_object_color(obj,EIBDRV_SIM_W1_COL,BOX_COL2); break; case 1: fl_set_object_color(obj,EIBDRV_SIM_W2_COL,BOX_COL2); break; case 2: fl_set_object_color(obj,EIBDRV_SIM_W3_COL,BOX_COL2); break; } lowerbound+=(int)(sim->stat->read[i]*rw_pt); } } diff_time=difftime(sim->stat_get_time,sim->stat_reset_time); sprintf(&helpstring[0],"%li - %li - %li - %li",sim->stat->write[1],sim->stat->write[2], sim->stat->write[3],sim->stat->write[0]); fl_ext_formobjects_add_text(&obj,FL_NO_BOX,40,575,165,20,&helpstring[0], FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); sprintf(&helpstring[0],"%li - %li - %li",sim->stat->read[0],sim->stat->read[1],sim->stat->read[2]); fl_ext_formobjects_add_text(&obj,FL_NO_BOX,465,575,205,20,&helpstring[0], FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); if (diff_time>0) { sprintf(&helpstring[0],"%3.2f - %3.2f - %3.2f - %3.2f",sim->stat->write[1]/diff_time, sim->stat->write[2]/diff_time,sim->stat->write[3]/diff_time,sim->stat->write[0]/diff_time); fl_ext_formobjects_add_text(&obj,FL_NO_BOX,40,590,205,20,&helpstring[0], FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); sprintf(&helpstring[0],"%3.2f - %3.2f - %3.2f",sim->stat->read[0]/diff_time, sim->stat->read[1]/diff_time,sim->stat->read[2]/diff_time); fl_ext_formobjects_add_text(&obj,FL_NO_BOX,465,590,205,20,&helpstring[0], FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); } fl_ext_formobjects_add_text(&obj,FL_NO_BOX,35,615,140,15,"Average total time for write", FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); fl_ext_formobjects_add_text(&obj,FL_NO_BOX,35,630,170,15,"with success in first attempt (ms):", FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); if (sim->stat->write[1]>0) { avg_w1time=((sim->stat->total_w1time.tv_sec+sim->stat->total_w1time.tv_usec/1000000.0)*1000)/ sim->stat->write[1]; if (avg_w1time<1000) sprintf(&helpstring[0],"%i",avg_w1time); else strcpy(&helpstring[0],""); fl_ext_formobjects_add_text(&obj,FL_BORDER_BOX,205,625,75,20,&helpstring[0], FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); } fl_ext_formobjects_add_btn(&obj,FL_NORMAL_BUTTON,870,630,90,25,"Close", FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); fl_set_object_callback(obj,CloseBtn_cb,0); fl_end_form(); fdui->VisForm->fdui=fdui; return fdui; }#if FL_INCLUDE_VERSION >= 89void idle_Indicator(int arg1,void *arg2)#else int idle_Indicator(XEvent *xev,void *userdata)#endif{ time_t actual_time; time_t stop_time=sim->start_time+sim->sim_parameter->run_time*60; time(&actual_time); if (actual_time!=sim->last_act_time) { if (actual_time>=stop_time) fl_ext_update_indicator(sim->RunForm->Indicator,FL_EXT_INDICATOR_RUNNING,100); else fl_ext_update_indicator(sim->RunForm->Indicator,FL_EXT_INDICATOR_RUNNING, (100.0*difftime(actual_time,sim->start_time))/(sim->sim_parameter->run_time*60)); sim->last_act_time=actual_time; }#if FL_INCLUDE_VERSION >= 89 fl_add_timeout(500,idle_Indicator,NULL);#else return 0;#endif}FD_RunForm *create_form_RunForm(Eib_bcu2_sim *sim){ FL_OBJECT *obj; int form_width=FL_EXT_INDICATOR_MINWIDTH+160; int form_height=FL_EXT_INDICATOR_MINHEIGHT+40; FD_RunForm *fdui=(FD_RunForm *)fl_calloc(1,sizeof(*fdui)); fdui->VisForm=fl_bgn_form(FL_NO_BOX,form_width,form_height); fl_ext_formobjects_add_box(FL_UP_BOX,0,0,form_width,form_height,"", FL_RESIZE_NONE,FL_NorthWest,FL_SouthEast); fl_ext_formobjects_add_btn(&obj,FL_NORMAL_BUTTON,form_width-110,form_height-45,90,25,"Stop", FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); fl_set_object_callback(obj,StopBtn_cb,0); fl_end_form(); fdui->VisForm->fdui=fdui; fdui->VisForm->u_vdata=sim; fdui->Indicator=fl_ext_add_indicator(fdui->VisForm,20,20, FL_EXT_INDICATOR_MINWIDTH,FL_EXT_INDICATOR_MINHEIGHT,FL_NoGravity); return fdui; }void RunTimeCounter_cb(FL_OBJECT *obj,long data){ Eib_bcu2_sim *sim=(Eib_bcu2_sim *)obj->form->u_vdata; sim->act_parameter->run_time=fl_get_counter_value(obj);}void IntervalCounter_cb(FL_OBJECT *obj,long data){ Eib_bcu2_sim *sim=(Eib_bcu2_sim *)obj->form->u_vdata; sim->act_parameter->write_interval=fl_get_counter_value(obj);}void MinLengthCounter_cb(FL_OBJECT *obj,long data){ Eib_bcu2_sim *sim=(Eib_bcu2_sim *)obj->form->u_vdata; sim->act_parameter->min_len=fl_get_counter_value(obj); fl_set_counter_bounds(sim->MainForm->MaxLengthCounter,fl_get_counter_value(obj),23);}void MaxLengthCounter_cb(FL_OBJECT *obj,long data){ Eib_bcu2_sim *sim=(Eib_bcu2_sim *)obj->form->u_vdata; sim->act_parameter->max_len=fl_get_counter_value(obj); fl_set_counter_bounds(sim->MainForm->MinLengthCounter,1,fl_get_counter_value(obj));}void ProcessCounter_cb(FL_OBJECT *obj,long data){ Eib_bcu2_sim *sim=(Eib_bcu2_sim *)obj->form->u_vdata; sim->act_parameter->proc_count=fl_get_counter_value(obj);}void WModeCheckbtn_cb(FL_OBJECT *obj,long data){ Eib_bcu2_sim *sim=(Eib_bcu2_sim *)obj->form->u_vdata; sim->act_parameter->wmode=(int)data;}void WIntervalCheckbtn_cb(FL_OBJECT *obj,long data){ Eib_bcu2_sim *sim=(Eib_bcu2_sim *)obj->form->u_vdata; sim->act_parameter->winterval=(int)data;} void StartBtn_cb(FL_OBJECT *obj,long data){ Eib_bcu2_sim *sim=(Eib_bcu2_sim *)obj->form->u_vdata; int result; fl_ext_deactivate_object(sim->MainForm->StartBtn); *(sim->sim_parameter)=*(sim->act_parameter); sim->cleanup_code=6; if ((sim->shm_results_id=shmget(IPC_PRIVATE,2*sim->sim_parameter->proc_count*sizeof(Eib_bcu2_sim_shm), 0666|IPC_CREAT|IPC_EXCL))==-1) { make_InternalErrorPanel(sim->Panels+6,56); fl_ext_panel1(sim->Panels+6,sim,cleanup); return; } sim->cleanup_code=7; if ((sim->shm_results=(Eib_bcu2_sim_shm *)shmat(sim->shm_results_id,NULL,0))==(void *)-1) { make_InternalErrorPanel(sim->Panels+6,57); fl_ext_panel1(sim->Panels+6,sim,cleanup); return; } sim->cleanup_code=8; if (ioctl(sim->eib_fd,FT_RESET_STAT)<0) { switch(result=errno) { case EBUSY: fl_ext_panel1(sim->Panels+4,sim,cleanup); break; case EACCES: fl_ext_panel1(sim->Panels+10,sim,cleanup); break; } return; } time(&sim->stat_reset_time); switch(sim->split_pid=fork()) { case 0: sim_split(); case -1: make_InternalErrorPanel(sim->Panels+6,58); fl_ext_panel1(sim->Panels+6,sim,cleanup); return; default: sim->state=EIBDRV_SIM_STATE_RUNNING; sim->cleanup_code=5; break; } fl_ext_reset_indicator(sim->RunForm->Indicator); fl_ext_start_indicator(sim->RunForm->Indicator); time(&sim->start_time); fl_ext_update_indicator(sim->RunForm->Indicator,FL_EXT_INDICATOR_RUNNING,0); fl_show_form(sim->RunForm->VisForm,FL_PLACE_CENTER,FL_TRANSIENT,"eibdrv_sim");#if FL_INCLUDE_VERSION >= 89 fl_add_timeout(500,idle_Indicator,NULL);#else fl_set_idle_callback(idle_Indicator,0);#endif }void StopBtn_cb(FL_OBJECT *obj,long data){ Eib_bcu2_sim *sim=(Eib_bcu2_sim *)obj->form->u_vdata; if (sim->state==EIBDRV_SIM_STATE_RUNNING) kill(-sim->split_pid,SIGTERM);}void ExitBtn_cb(FL_OBJECT *obj,long data){ Eib_bcu2_sim *sim=(Eib_bcu2_sim *)obj->form->u_vdata; fl_hide_form(obj->form); if (sim->state==EIBDRV_SIM_STATE_RUNNING) { fl_hide_form(sim->RunForm->VisForm);#if FL_INCLUDE_VERSION < 89 fl_set_idle_callback(0,0);#endif sim->state=EIBDRV_SIM_STATE_SHUTDOWN; // wait for all processes in kill(-sim->split_pid,SIGTERM); // main_sigchld and exit } else { semctl(sim->sem_start_rw,0,IPC_RMID,(int)0); // direct exit because no semctl(sim->sem_shm_results,0,IPC_RMID,(int)0); // read or write processes fl_free_form(sim->MainForm->VisForm); // are running fl_ext_free_indicator(sim->RunForm->Indicator); fl_free_form(sim->RunForm->VisForm); close(sim->eib_fd); returnEib_bcu2_sim(sim); fl_finish(); exit(0); }}FD_MainForm *create_form_MainForm(Eib_bcu2_sim *sim){ FL_OBJECT *obj; FD_MainForm *fdui = (FD_MainForm *) fl_calloc(1, sizeof(*fdui)); fdui->VisForm = fl_bgn_form(FL_NO_BOX, 520, 425); fl_ext_formobjects_add_box(FL_UP_BOX,0,0,520,425,"", FL_RESIZE_NONE,FL_NorthWest,FL_SouthEast); fl_ext_formobjects_add_labelframe(FL_ENGRAVED_FRAME,20,20,325,80,"Settings", FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); fl_ext_formobjects_add_text(&obj,FL_NO_BOX,35,30,40,20,"Device:", FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); fl_ext_formobjects_add_text(&obj,FL_NO_BOX,35,55,40,20,"Mode:", FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); fl_ext_formobjects_add_text(&fdui->DeviceText,FL_BORDER_BOX,80,30,250,20,"", FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); fl_ext_formobjects_add_text(&fdui->ModeText,FL_BORDER_BOX,80,55,250,20,"", FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); create_object_copyright(365,20); fl_ext_formobjects_add_labelframe(FL_ENGRAVED_FRAME,20,120,370,145,"Simulation Parameter", FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); fl_ext_formobjects_add_text(&obj,FL_NO_BOX,35,130,160,20,"Run Time (min):", FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); fl_ext_formobjects_add_counter(&fdui->RunTimeCounter,FL_NORMAL_COUNTER,200,130,170,20,"", FL_ALIGN_LEFT,1,1000,1,10,0, FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); fl_set_counter_value(fdui->RunTimeCounter, 1); sim->act_parameter->run_time=1; fl_set_object_callback(fdui->RunTimeCounter,RunTimeCounter_cb,0); fl_ext_formobjects_add_text(&obj,FL_NO_BOX,35,155,160,20,"Write Interval (ms):", FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); fl_ext_formobjects_add_counter(&fdui->IntervalCounter,FL_NORMAL_COUNTER,200,155,170,20,"", FL_ALIGN_LEFT,10,10000,1,100,0, FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); fl_set_counter_value(fdui->IntervalCounter, 1000); sim->act_parameter->write_interval=1000; fl_set_object_callback(fdui->IntervalCounter,IntervalCounter_cb,0); fl_ext_formobjects_add_text(&obj,FL_NO_BOX,35,180,160,20,"Minimal message length (Byte):", FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); fl_ext_formobjects_add_counter(&fdui->MinLengthCounter,FL_SIMPLE_COUNTER,200,180,170,20,"", FL_ALIGN_LEFT,1,23,1,1,0, FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); fl_set_counter_value(fdui->MinLengthCounter, 1); sim->act_parameter->min_len=1; fl_set_object_callback(fdui->MinLengthCounter,MinLengthCounter_cb,0); fl_ext_formobjects_add_text(&obj,FL_NO_BOX,35,205,160,20,"Maximal message length (Byte):", FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); fl_ext_formobjects_add_counter(&fdui->MaxLengthCounter,FL_SIMPLE_COUNTER,200,205,170,20,"", FL_ALIGN_LEFT,1,EIB_BUF_ELEMENT_SIZE,1,1,0, FL_RESIZE_NONE,FL_NorthWest,FL_NorthWest); fl_set_counter_value(fdui->MaxLengthCounter,EIB_BUF_ELEMENT_SIZE); sim->act_parameter->max_len=EIB_BUF_ELEMENT_SIZE; fl_set_object_callback(fdui->MaxLengthCounter,MaxLengthCounter_cb,0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -