4 * author: frank zirkelbach (frank.zirkelbach@physik.uni-augsburg.de)
6 * this program tries helping to understand the amorphous depuration
7 * and recrystallization of SiCx while ion implantation at temperatures
8 * below 400 degree celsius.
9 * hopefully the program will simulate the stabilization of the
10 * selforganizing lamella structure in the observed behaviour.
13 * - J. K. N. Lindner. Habil.Schrift, Universitaet Augsburg.
14 * - Maik Haeberlen. Diplomarbeit, Universitaet Augsburg.
16 * Copyright (C) 2004 Frank Zirkelbach
18 * This program is free software; you can redistribute it and/or modify
19 * it under the terms of the GNU General Public License as published by
20 * the Free Software Foundation; either version 2 of the License, or
21 * (at your option) any later version.
23 * This program is distributed in the hope that it will be useful,
24 * but WITHOUT ANY WARRANTY; without even the implied warranty of
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26 * GNU General Public License for more details.
28 * You should have received a copy of the GNU General Public License
29 * along with this program; if not, write to the Free Software
30 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
38 #include <sys/types.h>
52 #include "nlsop_general.h"
54 #define LOGFILE "nlsop_gui_logfile"
60 printf("%s -i <ip> -p <port> -l <logfile>\n",prog);
65 * gui internal functions
68 int display_new_line(t_display *display,t_input *input,char *text) {
79 tmp=(unsigned char *)malloc(display->max_x);
80 memset(tmp,0x20,display->max_x);
82 display_line(display,0,0,x,0,'#');
83 display_string(display,x/2-17,1,"nlsop gui (C) 2004 Frank Zirkelbach",35);
84 display_line(display,0,2,x,2,'#');
85 display_line(display,0,y-1,x,y-1,'#');
86 display_string(display,0,y,"prompt: ",8);
87 memcpy(tmp,input->content,input->c_count);
88 display_string(display,8,y,tmp,x-9);
92 for(i=0;i<display->max_y-6;i++) {
93 memcpy(display->screen+ptr,display->screen+ptr+display->max_x,
98 memcpy(display->screen+ptr,text,i);
99 memset(display->screen+ptr+i,0x20,x-i);
102 display_draw(display);
103 display_set_cursor(display,8+input->c_count,y);
108 int send_and_wait_for_answer(t_net *net,t_display *display,t_input *input) {
114 char string[MAX_CONTENT];
118 /* request information */
119 network_send_chan(net,0,&data,sizeof(unsigned char));
121 /* receive information */
122 network_receive_chan(net,0,&data,sizeof(unsigned char));
124 display_new_line(display,input,"no gui info answer, ignored");
128 display_new_line(display,input,"jobs:");
129 network_receive_chan(net,0,(unsigned char *)&count,sizeof(int));
130 for(i=0;i<count;i++) {
131 network_receive_chan(net,0,(unsigned char *)&job,sizeof(t_job));
132 snprintf(string,MAX_CONTENT,
133 "channel %d %c => b=%f c=%f s=%f | d: %d %f | %d",
134 job.channel,job.status&IN_WORK?'a':'q',
135 job.info.b,job.info.c,job.info.s,
136 job.info.diff_rate,job.info.dr_ac,job.progress);
137 display_new_line(display,input,string);
140 display_new_line(display,input,"clients:");
141 network_receive_chan(net,0,(unsigned char *)&count,sizeof(int));
142 for(i=0;i<count;i++) {
143 network_receive_chan(net,0,(unsigned char *)&client,sizeof(t_client));
144 if(client.status&WORK) snprintf(string,MAX_CONTENT,
145 "channel %d: client is busy",
147 else snprintf(string,MAX_CONTENT,"channel %d: client is idle",
149 display_new_line(display,input,string);
152 display_new_line(display,input,"done");
157 int send_job(t_net *net,t_input *input,t_display *display) {
159 char command[MAX_CONTENT];
171 info.diff_rate=DIFF_RATE;
174 info.save_rate=RESAVE;
180 strncpy(command,input->content,MAX_CONTENT);
183 ptr=strtok(command," ");
184 while((ptr=strtok(NULL," "))!=NULL) {
196 info.diff_rate=atoi(ptr+1);
199 info.dr_ac=atof(ptr+1);
202 info.steps=atoi(ptr+1);
205 info.cpi=atoi(ptr+1);
208 info.range=atoi(ptr+1);
211 info.s_rate=atoi(ptr+1);
214 info.save_rate=atoi(ptr+1);
226 display_new_line(display,input,"unknown command");
227 dprintf(display->outfd,"unknown command %s\n",ptr);
232 command[0]=GUI_ADDJOB;
233 network_send_chan(net,0,command,1);
235 network_send_chan(net,0,(unsigned char *)&x,sizeof(int));
236 network_send_chan(net,0,(unsigned char *)&y,sizeof(int));
237 network_send_chan(net,0,(unsigned char *)&z,sizeof(int));
239 network_send_chan(net,0,(unsigned char *)&info,sizeof(info));
241 display_new_line(display,input,"added new job:");
242 snprintf(command,MAX_CONTENT,"b:%f | c:%f | s:%f | d: %d %f | %d",
243 info.b,info.c,info.s,info.diff_rate,info.dr_ac,info.steps);
244 display_new_line(display,input,command);
250 int get_whatever(t_input *input,void *ptr) {
255 display=(t_display *)ptr;
257 last=input->content[input->c_count-1];
259 if((last=='\n')||(last=='\r')) {
260 input->content[input->c_count-1]='\0';
265 display_new_line(display,input,NULL);
270 int nothing(t_event *event,void *allineed) {
275 int send_quit(t_net *net) {
281 network_send_chan(net,0,&data,1);
286 int display_help(t_display *display,t_input *input) {
288 display_new_line(display,input,"h: show this help");
289 display_new_line(display,input,"i: get job/client info");
290 display_new_line(display,input,"a: add a job");
291 display_new_line(display,input," b: ballistic amorphization influence");
292 display_new_line(display,input," c: carbon induced amorphization influence");
293 display_new_line(display,input," s: stress induced amorphization influence");
294 display_new_line(display,input," d: diffusion interval");
295 display_new_line(display,input," D: diffusion rate");
296 display_new_line(display,input," S: simulation teps / dose");
297 display_new_line(display,input," C: collisions per ion");
298 display_new_line(display,input," r: stress influence range");
299 display_new_line(display,input," R: sputter rate");
300 display_new_line(display,input," x: save interval");
301 display_new_line(display,input," X: # cells in x direction");
302 display_new_line(display,input," Y: # cells in Y direction");
303 display_new_line(display,input," Z: # cells in Z direction");
308 int get_command(t_event *event,void *allineed) {
313 unsigned int addr[3];
315 memcpy(addr,allineed,3*sizeof(unsigned int));
316 net=(t_net *)addr[0];
317 display=(t_display *)addr[1];
318 input=(t_input *)addr[2];
320 input_get_event(input,get_whatever,display);
322 /* if there was a new line! */
323 if(input->c_count==0) {
324 switch(input->content[0]) {
326 display_help(display,input);
329 send_and_wait_for_answer(net,display,input);
332 send_job(net,input,display);
335 /* stop everything */
336 event_math(0,event,READ,REMOVE);
338 network_shutdown(net);
339 input_shutdown(input);
340 display_shutdown(display);
344 display_new_line(display,input,"unknown gui command");
356 int main(int argc,char **argv)
373 unsigned int addr[3];
376 allyouneed=(void *)addr;
378 addr[0]=(unsigned int)&net;
379 addr[1]=(unsigned int)&display;
380 addr[2]=(unsigned int)&input;
383 strcpy(logfile,LOGFILE);
384 strcpy(server_ip,"137.250.82.105");
387 /* parse/check argv */
388 for(i=1;i<argc;i++) {
389 if(argv[i][0]=='-') {
395 strncpy(server_ip,argv[++i],16);
398 port=atoi(argv[++i]);
401 strncpy(logfile,argv[++i],64);
409 if(!strcmp(server_ip,"")) {
414 if((fd=open(logfile,O_WRONLY|O_CREAT))<0) {
415 printf("unable to open file %s\n",logfile);
420 display_init(&display,fd);
423 input_init(&input,fd);
424 input.mode=CONTENT_BUFFER|ECHO;
425 input_ios_init(&input);
428 event_init(&event,fd);
429 event_set_timeout(&event,0,0);
431 /* user interaction */
432 event_math(0,&event,READ,ADD);
434 display_new_line(&display,&input,"welcome to nlsop gui! :)");
436 /* connect to server */
437 network_init(&net,fd);
438 network_set_connection_info(&net,0,server_ip,port);
439 if(network_connect(&net,0)==N_E_CONNECT) {
440 printf("unable to connect to server, aborting ...\n");
443 network_select(&net,0);
445 display_new_line(&display,&input,"successfully connected to server");
447 /* tell server: i am a client, i may work for you */
449 network_send(net.connection[0].fd,&data,1);
451 display_new_line(&display,&input,"send data to server, waiting for input");
454 event_start(&event,allyouneed,get_command,nothing);