X-Git-Url: https://hackdaworld.org/gitweb/?p=physik%2Fnlsop.git;a=blobdiff_plain;f=nlsop_gui.c;h=a7b447d82c35afd570b8c653a352fd9c03012c34;hp=7949c55558c5a56cfe1d1f6e32ba34fb04b2e1ab;hb=cff0722b1d71b922fde2de222ece99e0b26a5524;hpb=b49c96b3def8a0907e366eac36be249f08e49799 diff --git a/nlsop_gui.c b/nlsop_gui.c index 7949c55..a7b447d 100644 --- a/nlsop_gui.c +++ b/nlsop_gui.c @@ -47,6 +47,7 @@ #include "network.h" #include "event.h" #include "display.h" +#include "input.h" #include "nlsop_general.h" @@ -65,16 +66,154 @@ int usage(char *prog) int display_new_line(t_display *display,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,1,y-y/2-17,"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; + } + + display_draw(display); + return 1; } int send_and_wait_for_answer(t_net *net,t_display *display) { + int i,count; + t_job job; + 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,"no gui info answer, ignored"); + return -1; + } + + 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,string); + } + + display_new_line(display,"done"); + return 1; } int send_job(t_net *net,t_input *input,t_display *display) { + char command[MAX_CONTENT]; + int x,y,z; + info info; + + /* default values */ + x=_X; + y=_Y; + z=_Z; + info.cc=CC; + info.steps=STEPS; + info.range=RANGE; + info.diff_rate=DIFF_RATE; + info.cpi=CPI; + info.s_rate=S_RATE; + info.save_rate=RESAVE; + info.s=S_D; + info.b=B_D; + info.c=C_D; + info.dr_ac=DR_AC; + + strncpy(command,input->content,MAX_CONTENT); + + strtok(command," "); + while(strtok(NULL," ")!=NULL) { + switch(command[0]) { + case 'b': + info.b=atof(command+1); + break; + case 'c': + info.c=atof(command+1); + break; + case 's': + info.s=atof(command+1); + break; + case 'd': + info.diff_rate=atoi(command+1); + break; + case 'D': + info.dr_ac=atof(command+1); + break; + case 'S': + info.steps=atoi(command+1); + break; + case 'C': + info.cpi=atoi(command+1); + break; + case 'r': + info.range=atoi(command+1); + break; + case 'R': + info.s_rate=atoi(command+1); + break; + case 'x': + info.save_rate=atoi(command+1); + break; + case 'X': + x=atoi(command+1); + break; + case 'Y': + y=atoi(command+1); + break; + case 'Z': + z=atoi(command+1); + break; + default: + display_new_line(display,"unknown command"); + 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)); + return 1; } @@ -83,19 +222,19 @@ int get_command(t_event *event,void *allineed) { t_net *net; t_display *display; t_input *input; + unsigned int addr[3]; - 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)); + memcpy(addr,allineed,3*sizeof(unsigned int)); + net=(t_net *)addr[0]; + 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) + send_job(net,input,display); break; case GUI_QUIT: /* stop everything */ @@ -103,7 +242,7 @@ int get_command(t_event *event,void *allineed) { network_shutdown(net); display_shutdown(display); input_shutdown(input); - event_shutdown(event); + event_stop(event); return 2; default: display_new_line(display,"unknown gui command"); @@ -134,8 +273,15 @@ 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,""); @@ -168,16 +314,11 @@ 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)); - /* input init */ input_init(&input,fd); input.mode=CONTENT_BUFFER|LINE_BUFFERED|INPUT_ECHO; @@ -193,6 +334,8 @@ int main(int argc,char **argv) /* user interaction */ event_math(0,&event,READ,ADD); + display_new_line(&display,"welcome to nlsop gui! :)"); + /* connect to server */ network_init(&net,fd); network_set_connection_info(&net,0,server_ip,port); @@ -202,10 +345,14 @@ int main(int argc,char **argv) } network_select(&net,0); + display_new_line(&display,"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 ..."); + /* wait for job */ event_start(&event,allyouneed,get_command,NULL);