#include "nlsop_general.h"
-#define LOGFILE "~/.nlsop_logfile"
+#define LOGFILE "nlsop_gui_logfile"
+#define GOON 2
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;
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;i<display->max_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;i<display->max_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];
/* 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;i<count;i++) {
network_receive_chan(net,0,(unsigned char *)&job,sizeof(t_job));
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,input,string);
+ }
+
+ display_new_line(display,input,"clients:");
+ network_receive_chan(net,0,(unsigned char *)&count,sizeof(int));
+ for(i=0;i<count;i++) {
+ network_receive_chan(net,0,(unsigned char *)&client,sizeof(t_client));
+ if(client.status&WORK) snprintf(string,MAX_CONTENT,
+ "channel %d: client is busy",
+ client.channel);
+ else snprintf(string,MAX_CONTENT,"channel %d: client is idle",
+ client.status);
+ display_new_line(display,input,string);
}
- display_new_line(display,"done");
+ display_new_line(display,input,"done");
return 1;
}
char command[MAX_CONTENT];
int x,y,z;
info info;
+ char *ptr;
/* default values */
x=_X;
info.dr_ac=DR_AC;
strncpy(command,input->content,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;
}
}
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;
}
t_net *net;
t_display *display;
t_input *input;
+ unsigned int addr[3];
- 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_stop(event);
- return 2;
- default:
- display_new_line(display,"unknown gui command");
- break;
+ 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;
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 */
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),&input,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,"welcome to nlsop gui! :)");
+ display_new_line(&display,&input,"welcome to nlsop gui! :)");
/* connect to server */
network_init(&net,fd);
}
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;