Doxygen Source Code Documentation
plugout_ijk.c File Reference
#include "thd_iochan.h"
Go to the source code of this file.
Defines | |
#define | AFNI_OPEN_CONTROL_MODE 1 |
#define | AFNI_WAIT_CONTROL_MODE 2 |
#define | AFNI_OPEN_DATA_MODE 3 |
#define | AFNI_WAIT_DATA_MODE 4 |
#define | AFNI_CONTINUE_MODE 5 |
#define | POACKSIZE 4 |
#define | PO_ACK_BAD(ic) iochan_sendall( (ic) , "BAD" , POACKSIZE ) |
#define | PO_ACK_OK(ic) iochan_sendall( (ic) , "OK!" , POACKSIZE ) |
#define | PO_SEND(ic, str) iochan_sendall( (ic) , (str) , strlen((str))+1 ) |
Functions | |
int | afni_io (void) |
int | main (int argc, char *argv[]) |
Variables | |
char | afni_host [128] = "." |
char | afni_name [128] = "\0" |
int | afni_port = 8009 |
int | afni_verbose = 0 |
Define Documentation
|
Definition at line 150 of file plugout_ijk.c. Referenced by afni_io(). |
|
Je ne sais pas * Definition at line 146 of file plugout_ijk.c. Referenced by afni_io(). |
|
Definition at line 148 of file plugout_ijk.c. Referenced by afni_io(). |
|
Definition at line 147 of file plugout_ijk.c. Referenced by afni_io(). |
|
Definition at line 149 of file plugout_ijk.c. Referenced by afni_io(). |
|
Definition at line 156 of file plugout_ijk.c. |
|
Definition at line 157 of file plugout_ijk.c. |
|
Definition at line 158 of file plugout_ijk.c. |
|
Definition at line 154 of file plugout_ijk.c. Referenced by afni_io(). |
Function Documentation
|
Definition at line 160 of file plugout_ijk.c. References AFNI_CONTINUE_MODE, afni_host, afni_name, AFNI_OPEN_CONTROL_MODE, AFNI_OPEN_DATA_MODE, afni_port, AFNI_WAIT_CONTROL_MODE, AFNI_WAIT_DATA_MODE, IOCHAN_CLOSE, iochan_goodcheck(), iochan_init(), iochan_recvall(), iochan_sendall(), iochan_sleep(), iochan_writecheck(), and POACKSIZE.
00161 { 00162 static int afni_mode = AFNI_OPEN_CONTROL_MODE ; /* status variable */ 00163 static IOCHAN * afni_ioc = NULL ; /* connection to AFNI */ 00164 int ii ; 00165 00166 /***************************************************************/ 00167 /***** Check to see if status is OK before we proceed. *****/ 00168 /***** (if an error occurs below, afni_mode gets set to 0) *****/ 00169 00170 if( afni_mode <= 0 ) return -1 ; 00171 00172 /***********************************************************************/ 00173 /***** First time into this routine? Open control channel to AFNI *****/ 00174 00175 if( afni_mode == AFNI_OPEN_CONTROL_MODE ){ 00176 char afni_iocname[128] ; /* will hold name of I/O channel */ 00177 00178 /** Note that the control channel is always a 00179 TCP/IP channel to port # 7955 on the AFNI host system **/ 00180 00181 if( strcmp(afni_host,".") == 0 ) 00182 sprintf( afni_iocname , "tcp:%s:7955" , "localhost" ); /* make name */ 00183 else 00184 sprintf( afni_iocname , "tcp:%s:7955" , afni_host ) ; /* make name */ 00185 00186 afni_ioc = iochan_init( afni_iocname , "create" ) ; /* create it */ 00187 if( afni_ioc == NULL ){ 00188 fprintf(stderr, 00189 "Can't create control channel %s to AFNI!\n",afni_iocname) ; 00190 afni_mode = 0 ; 00191 return -1 ; 00192 } 00193 afni_mode = AFNI_WAIT_CONTROL_MODE ; /* waiting for AFNI connection */ 00194 if( afni_verbose ) 00195 fprintf(stderr,"AFNI control channel created\n") ; 00196 } 00197 00198 /****************************************************/ 00199 /**** Check if AFNI control channel is connected ****/ 00200 00201 if( afni_mode == AFNI_WAIT_CONTROL_MODE ){ 00202 ii = iochan_writecheck( afni_ioc , 5 ) ; /* wait at most 5 msec */ 00203 00204 /** the iochan_*check() routines return 00205 -1 for an error, 00206 0 if not ready, 00207 >0 if the I/O channel is ready. **/ 00208 00209 if( ii < 0 ){ 00210 fprintf(stderr,"Control channel to AFNI failed!\a\n") ; 00211 IOCHAN_CLOSE(afni_ioc) ; 00212 afni_mode = 0 ; 00213 return -1 ; 00214 } else if( ii > 0 ){ 00215 afni_mode = AFNI_OPEN_DATA_MODE ; /* prepare to send data */ 00216 if( afni_verbose ) 00217 fprintf(stderr,"AFNI control channel connected\n"); 00218 } else { 00219 return 0 ; /* try again next time */ 00220 } 00221 } 00222 00223 /**********************************************************/ 00224 /**** Send control data to AFNI, and open data channel ****/ 00225 00226 if( afni_mode == AFNI_OPEN_DATA_MODE ){ 00227 char afni_iocname[128] ; 00228 char afni_buf[256] ; 00229 00230 /** decide name of data channel: 00231 use shared memory (shm:) on ".", 00232 use TCP/IP (tcp:) on other computer systems; 00233 * Note that the TCP/IP port number can be 00234 anything that isn't already in use; 00235 * Note that the shm control name (here "test_plugout") 00236 is a string that will be converted to an IPC 00237 key (in function string_to_key in iochan.c). **/ 00238 00239 if( strcmp(afni_host,".") == 0 ) 00240 strcpy( afni_iocname , "shm:test_plugout:1K+1K" ) ; 00241 else 00242 sprintf( afni_iocname , "tcp:%s:%d" , afni_host , afni_port ) ; 00243 00244 /** write the command to AFNI into the buffer: 00245 * each command ends with a newline character, 00246 except (possibly) the last command; 00247 * the command buffer is a C string, which ends 00248 with an ASCII NUL character; 00249 * PONAME means 'use this string for informative messages'; 00250 * IOCHAN means 'use this I/O channel from now on'. **/ 00251 00252 if( afni_name[0] == '\0' ) strcpy(afni_name,"aHorseCalledMan") ; 00253 00254 sprintf( afni_buf , "PONAME %s\n" 00255 "IOCHAN %s" , 00256 afni_name , afni_iocname ) ; 00257 00258 if( afni_verbose ) 00259 fprintf(stderr,"Sending control information to AFNI\n") ; 00260 00261 /** note that the ASCII NUL at the end of the buffer is sent **/ 00262 00263 ii = iochan_sendall( afni_ioc , afni_buf , strlen(afni_buf)+1 ) ; 00264 00265 /** the return value is the number of bytes sent, 00266 or -1 indicating a fatal error transpired. **/ 00267 00268 if( ii < 0 ){ 00269 fprintf(stderr,"Transmission of control data to AFNI failed!\a\n") ; 00270 IOCHAN_CLOSE(afni_ioc) ; 00271 afni_mode = 0 ; 00272 return -1 ; 00273 00274 } else { 00275 00276 /** wait for the acknowledgment from AFNI, then close channel **/ 00277 00278 ii = iochan_recvall( afni_ioc , afni_buf , POACKSIZE ) ; 00279 IOCHAN_CLOSE(afni_ioc) ; 00280 00281 if( ii < 0 || strncmp(afni_buf,"OK!",3) != 0 ){ 00282 fprintf(stderr,"AFNI didn't like control information!\a\n") ; 00283 afni_mode = 0 ; 00284 return -1 ; 00285 } 00286 00287 /** now open data channel to AFNI **/ 00288 00289 afni_ioc = iochan_init( afni_iocname , "create" ) ; 00290 if( afni_ioc == NULL ){ 00291 fprintf(stderr, 00292 "Can't open data channel %s to AFNI!\a\n",afni_iocname) ; 00293 afni_mode = 0 ; 00294 return -1 ; 00295 } else { 00296 afni_mode = AFNI_WAIT_DATA_MODE ; 00297 if( afni_verbose ) fprintf(stderr,"AFNI data channel created\n") ; 00298 } 00299 } 00300 } 00301 00302 /****************************************************/ 00303 /***** See if data channel is connected to AFNI *****/ 00304 00305 if( afni_mode == AFNI_WAIT_DATA_MODE ){ 00306 00307 ii = iochan_goodcheck( afni_ioc , 5 ) ; /* wait at most 5 msec */ 00308 if( ii < 0 ){ 00309 fprintf(stderr, 00310 "AFNI data channel aborted before any data was sent!\a\n") ; 00311 IOCHAN_CLOSE( afni_ioc ) ; 00312 afni_mode = 0 ; 00313 return -1 ; 00314 } else if( ii > 0 ){ /* ready to go! */ 00315 afni_mode = AFNI_CONTINUE_MODE ; 00316 if( afni_verbose ) fprintf(stderr,"AFNI data channel is open\n") ; 00317 } else { 00318 return 0 ; /* try again next time */ 00319 } 00320 } 00321 00322 /**************************************************************/ 00323 /***** The "normal" state of affairs: AFNI is connected. *****/ 00324 /***** See if the user wants to send i,j,k to AFNI. *****/ 00325 00326 if( afni_mode == AFNI_CONTINUE_MODE ){ 00327 char afni_buf[256] ; 00328 int ix , jy , kz ; 00329 00330 /* get user input */ 00331 00332 printf("Enter i j k: ") ; fflush(stdout) ; fgets(afni_buf,256,stdin) ; 00333 ii = sscanf(afni_buf,"%d %d %d",&ix,&jy,&kz) ; 00334 if( ii < 3 ){ 00335 printf("** Warning -- planetary meltdown will occur in 10 seconds!\a\n") ; 00336 iochan_sleep(1000) ; 00337 ii = iochan_writecheck(afni_ioc,5) ; if( ii < 0 ) return -1 ; 00338 return 0 ; 00339 } 00340 00341 /* send input to AFNI (essentially unedited) */ 00342 00343 sprintf(afni_buf,"DSET_IJK_SET %d %d %d",ix,jy,kz) ; 00344 ii = iochan_sendall( afni_ioc , afni_buf , strlen(afni_buf)+1 ) ; 00345 00346 if( ii > 0 ){ /* send was OK; wait for acknowledgment */ 00347 ii = iochan_recvall( afni_ioc , afni_buf , POACKSIZE ) ; 00348 } 00349 00350 if( ii < 0 ){ /* send or acknowledgment failed */ 00351 fprintf(stderr,"AFNI data channel aborted!\a\n") ; 00352 IOCHAN_CLOSE(afni_ioc) ; 00353 afni_mode = 0 ; 00354 return -1 ; 00355 } 00356 return 0 ; 00357 } 00358 00359 return 0 ; 00360 } |
|
\** File : SUMA.c
Input paramters :
Definition at line 34 of file plugout_ijk.c. References afni_host, afni_io(), afni_name, afni_port, afni_verbose, argc, and iochan_sleep().
00035 { 00036 int narg , ii ; 00037 00038 /***** See if the pitiful user wants help *****/ 00039 00040 if( argc == 2 && strncmp(argv[1],"-help",5) == 0 ){ 00041 printf("Usage: plugout_ijk [-host name] [-v]\n" 00042 "This program connects to AFNI and send (i,j,k)\n" 00043 "dataset indices to control the viewpoint.\n\n" 00044 "Options:\n" 00045 " -host name Means to connect to AFNI running on the\n" 00046 " computer 'name' using TCP/IP. The default is to\n" 00047 " connect on the current host using shared memory.\n" 00048 " -v Verbose mode.\n" 00049 " -port pp Use TCP/IP port number 'pp'. The default is\n" 00050 " 8009, but if two plugouts are running on the\n" 00051 " same computer, they must use different ports.\n" 00052 " -name sss Use the string 'sss' for the name that AFNI assigns\n" 00053 " to this plugout. The default is something stupid.\n" 00054 ) ; 00055 exit(0) ; 00056 } 00057 00058 /***** Process command line options *****/ 00059 00060 narg = 1 ; 00061 while( narg < argc ){ 00062 00063 /** -host name **/ 00064 00065 if( strncmp(argv[narg],"-host",5) == 0 ){ 00066 narg++ ; 00067 if( narg >= argc ){ 00068 fprintf(stderr,"-host needs a following name!\a\n"); exit(1); 00069 } 00070 strcpy( afni_host , argv[narg] ) ; 00071 narg++ ; continue ; 00072 } 00073 00074 /** -name sss **/ 00075 00076 if( strncmp(argv[narg],"-name",5) == 0 ){ 00077 narg++ ; 00078 if( narg >= argc ){ 00079 fprintf(stderr,"-name needs a following string!\a\n"); exit(1); 00080 } 00081 strcpy( afni_name , argv[narg] ) ; 00082 narg++ ; continue ; 00083 } 00084 00085 /** -v **/ 00086 00087 if( strncmp(argv[narg],"-v",2) == 0 ){ 00088 afni_verbose = 1 ; 00089 narg++ ; continue ; 00090 } 00091 00092 /** -port pp **/ 00093 00094 if( strncmp(argv[narg],"-port",4) == 0 ){ 00095 narg++ ; 00096 if( narg >= argc ){ 00097 fprintf(stderr,"-port needs a following argument!\a\n"); exit(1); 00098 } 00099 afni_port = strtol( argv[narg] , NULL , 10 ) ; 00100 if( afni_port <= 0 ){ 00101 fprintf(stderr,"-port needs a positive argument!\a\n"); exit(1); 00102 } 00103 if( strcmp(afni_host,".") == 0 ) strcpy(afni_host,"localhost") ; 00104 narg++ ; continue ; 00105 } 00106 00107 /** Je ne sais pas **/ 00108 00109 fprintf(stderr,"Unrecognized option: %s\a\n",argv[narg]) ; 00110 exit(1) ; 00111 } 00112 00113 /***** Loop and check in with AFNI every 100 msec *****/ 00114 00115 while( 1 ){ 00116 ii = afni_io() ; /* commune with AFNI */ 00117 if( ii < 0 ) exit(0) ; /* bad trip? then die */ 00118 iochan_sleep(100) ; /* perchance to dream */ 00119 } 00120 00121 } |
Variable Documentation
|
Definition at line 19 of file plugout_ijk.c. |
|
Definition at line 20 of file plugout_ijk.c. |
|
Definition at line 21 of file plugout_ijk.c. |
|
Definition at line 22 of file plugout_ijk.c. Referenced by main(). |