X-Git-Url: https://hackdaworld.org/gitweb/?p=physik%2Fnlsop.git;a=blobdiff_plain;f=nlsop_gui.c;h=e4677915503358528fd6b78e91b0785c2640f121;hp=7949c55558c5a56cfe1d1f6e32ba34fb04b2e1ab;hb=HEAD;hpb=b49c96b3def8a0907e366eac36be249f08e49799 diff --git a/nlsop_gui.c b/nlsop_gui.c index 7949c55..e467791 100644 --- a/nlsop_gui.c +++ b/nlsop_gui.c @@ -47,10 +47,12 @@ #include "network.h" #include "event.h" #include "display.h" +#include "input.h" #include "nlsop_general.h" -#define LOGFILE "~/.nlsop_logfile" +#define LOGFILE "nlsop_gui_logfile" +#define GOON 2 int usage(char *prog) { @@ -63,18 +65,243 @@ 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; + int i; + + unsigned char *tmp; + + x=display->max_x-1; + y=display->max_y-1; + + tmp=(unsigned char *)malloc(display->max_x); + memset(tmp,0x20,display->max_x); + + display_line(display,0,0,x,0,'#'); + 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); + 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]; + + data=GUI_INFO; + + /* request information */ + network_send_chan(net,0,&data,sizeof(unsigned char)); + + /* receive information */ + network_receive_chan(net,0,&data,sizeof(unsigned char)); + if(data!=GUI_INFO) { + 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;i b=%f c=%f s=%f | d: %d %f | %d", + job.channel,job.status&IN_WORK?'a':'q', + job.info.b,job.info.c,job.info.s, + job.info.diff_rate,job.info.dr_ac,job.progress); + display_new_line(display,input,string); + } + + display_new_line(display,input,"clients:"); + network_receive_chan(net,0,(unsigned char *)&count,sizeof(int)); + for(i=0;icontent,MAX_CONTENT); + ptr=command; + + ptr=strtok(command," "); + while((ptr=strtok(NULL," "))!=NULL) { + switch(ptr[0]) { + case 'b': + info.b=atof(ptr+1); + break; + case 'c': + info.c=atof(ptr+1); + break; + case 's': + info.s=atof(ptr+1); + break; + case 'd': + info.diff_rate=atoi(ptr+1); + break; + case 'D': + info.dr_ac=atof(ptr+1); + break; + case 'S': + info.steps=atoi(ptr+1); + break; + case 'C': + info.cpi=atoi(ptr+1); + break; + case 'r': + info.range=atoi(ptr+1); + break; + case 'R': + info.s_rate=atoi(ptr+1); + break; + case 'x': + info.save_rate=atoi(ptr+1); + break; + case 'X': + x=atoi(ptr+1); + break; + case 'Y': + y=atoi(ptr+1); + break; + case 'Z': + z=atoi(ptr+1); + break; + default: + display_new_line(display,input,"unknown command"); + dprintf(display->outfd,"unknown command %s\n",ptr); + break; + } + } + + command[0]=GUI_ADDJOB; + network_send_chan(net,0,command,1); + + network_send_chan(net,0,(unsigned char *)&x,sizeof(int)); + network_send_chan(net,0,(unsigned char *)&y,sizeof(int)); + network_send_chan(net,0,(unsigned char *)&z,sizeof(int)); + + 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; } @@ -83,31 +310,40 @@ int get_command(t_event *event,void *allineed) { t_net *net; t_display *display; t_input *input; - - unsigned char data[64]; - - net=(t_net *)allineed; - display=(t_display *)(allineed+sizeof(t_net)); - input=(t_input *)(allineed+sizeof(t_net)+sizeof(t_display)); - - 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_shutdown(event); - return 2; - default: - display_new_line(display,"unknown gui command"); - break; + unsigned int addr[3]; + + memcpy(addr,allineed,3*sizeof(unsigned int)); + net=(t_net *)addr[0]; + display=(t_display *)addr[1]; + input=(t_input *)addr[2]; + + 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; @@ -134,11 +370,18 @@ int main(int argc,char **argv) int fd; + unsigned int addr[3]; void *allyouneed; + allyouneed=(void *)addr; + + addr[0]=(unsigned int)&net; + addr[1]=(unsigned int)&display; + addr[2]=(unsigned int)&input; + /* default values */ strcpy(logfile,LOGFILE); - strcpy(server_ip,""); + strcpy(server_ip,"137.250.82.105"); port=1025; /* parse/check argv */ @@ -168,31 +411,28 @@ 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; } - allyouneed=malloc(sizeof(t_net)+sizeof(t_display)+sizeof(t_input)); - memcpy(allyouneed,&net,sizeof(t_net)); - memcpy(allyouneed+sizeof(t_net),&display,sizeof(t_display)); - memcpy(allyouneed+sizeof(t_net)+sizeof(t_display),sizeof(t_input)); + /* 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,&input,"welcome to nlsop gui! :)"); + /* connect to server */ network_init(&net,fd); network_set_connection_info(&net,0,server_ip,port); @@ -202,14 +442,17 @@ int main(int argc,char **argv) } network_select(&net,0); + 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,&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;