some fixes + other output + analyse recoils instead of ions
[physik/nlsop.git] / nlsop_gui.c
index 0c56147..e467791 100644 (file)
 #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,12 +65,91 @@ 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;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];
+
+  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<count;i++) {
+    network_receive_chan(net,0,(unsigned char *)&job,sizeof(t_job));
+    snprintf(string,MAX_CONTENT,
+             "channel %d %c => 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;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,input,"done");
 
   return 1;
 }
@@ -78,11 +159,12 @@ int send_job(t_net *net,t_input *input,t_display *display) {
   char command[MAX_CONTENT];
   int x,y,z;
   info info;
+  char *ptr;
 
   /* default values */
-  x=X;
-  y=Y;
-  z=Z;
+  x=_X;
+  y=_Y;
+  z=_Z;
   info.cc=CC;
   info.steps=STEPS;
   info.range=RANGE;
@@ -96,57 +178,59 @@ int send_job(t_net *net,t_input *input,t_display *display) {
   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;
     }
   }
 
   command[0]=GUI_ADDJOB;
-  network_send_chan(net,0,data,1);
+  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));
@@ -154,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;
 }
 
@@ -162,31 +310,40 @@ int get_command(t_event *event,void *allineed) {
   t_net *net;
   t_display *display;
   t_input *input;
+  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];
 
-  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;
+  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;
@@ -213,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 */
@@ -247,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);
@@ -281,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;