X-Git-Url: https://hackdaworld.org/gitweb/?p=physik%2Fnlsop.git;a=blobdiff_plain;f=nlsop_gui.c;h=e4677915503358528fd6b78e91b0785c2640f121;hp=8649442a8b1d417a1e71e9641516cb3f7f49faeb;hb=HEAD;hpb=1be202092955615e3448b1ab1b746347eb20cca3 diff --git a/nlsop_gui.c b/nlsop_gui.c index 8649442..e467791 100644 --- a/nlsop_gui.c +++ b/nlsop_gui.c @@ -51,7 +51,8 @@ #include "nlsop_general.h" -#define LOGFILE "~/.nlsop_logfile" +#define LOGFILE "nlsop_gui_logfile" +#define GOON 2 int usage(char *prog) { @@ -64,7 +65,7 @@ int usage(char *prog) * gui internal functions */ -int display_new_line(t_display *display,char *text) { +int display_new_line(t_display *display,t_input *input,char *text) { int x,y; int ptr; @@ -79,29 +80,36 @@ int display_new_line(t_display *display,char *text) { memset(tmp,0x20,display->max_x); display_line(display,0,0,x,0,'#'); - display_string(display,1,y-y/2-17,"nlsop gui (C) 2004 Frank Zirkelbach",35); + display_string(display,x/2-17,1,"nlsop gui (C) 2004 Frank Zirkelbach",35); display_line(display,0,2,x,2,'#'); display_line(display,0,y-1,x,y-1,'#'); display_string(display,0,y,"prompt: ",8); - display_string(display,8,y,tmp,x-8); - display_set_cursor(display,8,y); - - ptr=3*display->max_x; - for(i=0;imax_x-6;i++) { - memcpy(display->screen+ptr,display->screen+ptr+display->max_x, - display->max_x); - ptr+=display->max_x; + memcpy(tmp,input->content,input->c_count); + display_string(display,8,y,tmp,x-9); + + if(text!=NULL) { + ptr=3*display->max_x; + for(i=0;imax_y-6;i++) { + memcpy(display->screen+ptr,display->screen+ptr+display->max_x, + display->max_x); + ptr+=display->max_x; + } + i=strlen(text); + memcpy(display->screen+ptr,text,i); + memset(display->screen+ptr+i,0x20,x-i); } display_draw(display); + display_set_cursor(display,8+input->c_count,y); return 1; } -int send_and_wait_for_answer(t_net *net,t_display *display) { +int send_and_wait_for_answer(t_net *net,t_display *display,t_input *input) { int i,count; t_job job; + t_client client; char data; char string[MAX_CONTENT]; @@ -113,10 +121,11 @@ int send_and_wait_for_answer(t_net *net,t_display *display) { /* receive information */ network_receive_chan(net,0,&data,sizeof(unsigned char)); if(data!=GUI_INFO) { - display_new_line(display,"no gui info answer, ignored"); + display_new_line(display,input,"no gui info answer, ignored"); return -1; } + display_new_line(display,input,"jobs:"); network_receive_chan(net,0,(unsigned char *)&count,sizeof(int)); for(i=0;icontent,MAX_CONTENT); + ptr=command; - strtok(command," "); - while(strtok(NULL," ")!=NULL) { - switch(command[0]) { + ptr=strtok(command," "); + while((ptr=strtok(NULL," "))!=NULL) { + switch(ptr[0]) { case 'b': - info.b=atof(command+1); + info.b=atof(ptr+1); break; case 'c': - info.c=atof(command+1); + info.c=atof(ptr+1); break; case 's': - info.s=atof(command+1); + info.s=atof(ptr+1); break; case 'd': - info.diff_rate=atoi(command+1); + info.diff_rate=atoi(ptr+1); break; case 'D': - info.dr_ac=atof(command+1); + info.dr_ac=atof(ptr+1); break; case 'S': - info.steps=atoi(command+1); + info.steps=atoi(ptr+1); break; case 'C': - info.cpi=atoi(command+1); + info.cpi=atoi(ptr+1); break; case 'r': - info.range=atoi(command+1); + info.range=atoi(ptr+1); break; case 'R': - info.s_rate=atoi(command+1); + info.s_rate=atoi(ptr+1); break; case 'x': - info.save_rate=atoi(command+1); + info.save_rate=atoi(ptr+1); break; case 'X': - x=atoi(command+1); + x=atoi(ptr+1); break; case 'Y': - y=atoi(command+1); + y=atoi(ptr+1); break; case 'Z': - z=atoi(command+1); + z=atoi(ptr+1); break; default: - display_new_line(display,"unknown command"); + display_new_line(display,input,"unknown command"); + dprintf(display->outfd,"unknown command %s\n",ptr); break; } } @@ -214,6 +238,70 @@ int send_job(t_net *net,t_input *input,t_display *display) { network_send_chan(net,0,(unsigned char *)&info,sizeof(info)); + display_new_line(display,input,"added new job:"); + snprintf(command,MAX_CONTENT,"b:%f | c:%f | s:%f | d: %d %f | %d", + info.b,info.c,info.s,info.diff_rate,info.dr_ac,info.steps); + display_new_line(display,input,command); + + + return 1; +} + +int get_whatever(t_input *input,void *ptr) { + + char last; + t_display *display; + + display=(t_display *)ptr; + + last=input->content[input->c_count-1]; + + if((last=='\n')||(last=='\r')) { + input->content[input->c_count-1]='\0'; + input->c_count=0; + return GOON; + } + + display_new_line(display,input,NULL); + + return 1; +} + +int nothing(t_event *event,void *allineed) { + + return 1; +} + +int send_quit(t_net *net) { + + unsigned char data; + + data=GUI_QUIT; + + network_send_chan(net,0,&data,1); + + return 1; +} + +int display_help(t_display *display,t_input *input) { + + display_new_line(display,input,"h: show this help"); + display_new_line(display,input,"i: get job/client info"); + display_new_line(display,input,"a: add a job"); + display_new_line(display,input," b: ballistic amorphization influence"); + display_new_line(display,input," c: carbon induced amorphization influence"); + display_new_line(display,input," s: stress induced amorphization influence"); + display_new_line(display,input," d: diffusion interval"); + display_new_line(display,input," D: diffusion rate"); + display_new_line(display,input," S: simulation teps / dose"); + display_new_line(display,input," C: collisions per ion"); + display_new_line(display,input," r: stress influence range"); + display_new_line(display,input," R: sputter rate"); + display_new_line(display,input," x: save interval"); + display_new_line(display,input," X: # cells in x direction"); + display_new_line(display,input," Y: # cells in Y direction"); + display_new_line(display,input," Z: # cells in Z direction"); + return 1; } @@ -229,24 +317,33 @@ int get_command(t_event *event,void *allineed) { display=(t_display *)addr[1]; input=(t_input *)addr[2]; - switch(input->content[0]) { - case GUI_INFO: - send_and_wait_for_answer(net,display); - break; - case GUI_ADDJOB: - send_job(net,input,display); - break; - case GUI_QUIT: - /* stop everything */ - event_math(0,event,READ,REMOVE); - network_shutdown(net); - display_shutdown(display); - input_shutdown(input); - event_stop(event); - return 2; - default: - display_new_line(display,"unknown gui command"); - break; + input_get_event(input,get_whatever,display); + + /* if there was a new line! */ + if(input->c_count==0) { + switch(input->content[0]) { + case GUI_HELP: + display_help(display,input); + break; + case GUI_INFO: + send_and_wait_for_answer(net,display,input); + break; + case GUI_ADDJOB: + send_job(net,input,display); + break; + case GUI_QUIT: + /* stop everything */ + event_math(0,event,READ,REMOVE); + send_quit(net); + network_shutdown(net); + input_shutdown(input); + display_shutdown(display); + event_stop(event); + return 2; + default: + display_new_line(display,input,"unknown gui command"); + break; + } } return 1; @@ -284,7 +381,7 @@ int main(int argc,char **argv) /* default values */ strcpy(logfile,LOGFILE); - strcpy(server_ip,""); + strcpy(server_ip,"137.250.82.105"); port=1025; /* parse/check argv */ @@ -314,27 +411,27 @@ int main(int argc,char **argv) return -1; } - if((fd=open(logfile,O_WRONLY,O_CREAT))<0) { + if((fd=open(logfile,O_WRONLY|O_CREAT))<0) { printf("unable to open file %s\n",logfile); return -1; } + /* display init */ + display_init(&display,fd); + /* input init */ input_init(&input,fd); - input.mode=CONTENT_BUFFER|LINE_BUFFERED|INPUT_ECHO; + input.mode=CONTENT_BUFFER|ECHO; input_ios_init(&input); /* event init */ event_init(&event,fd); event_set_timeout(&event,0,0); - /* display init */ - display_init(&display,fd); - /* user interaction */ event_math(0,&event,READ,ADD); - display_new_line(&display,"welcome to nlsop gui! :)"); + display_new_line(&display,&input,"welcome to nlsop gui! :)"); /* connect to server */ network_init(&net,fd); @@ -345,18 +442,17 @@ int main(int argc,char **argv) } network_select(&net,0); - display_new_line(&display,"successfully connected to server"); + display_new_line(&display,&input,"successfully connected to server"); /* tell server: i am a client, i may work for you */ data=NLSOP_GUI; network_send(net.connection[0].fd,&data,1); - display_new_line(&display,"send data to server, waiting for input ..."); + display_new_line(&display,&input,"send data to server, waiting for input"); /* wait for job */ - event_start(&event,allyouneed,get_command,NULL); + event_start(&event,allyouneed,get_command,nothing); - free(allyouneed); close(fd); return 1;