Doxygen Source Code Documentation
plugout_tt.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 = 8001 |
int | afni_verbose = 0 |
int | afni_do_ijk = 0 |
Define Documentation
|
Definition at line 205 of file plugout_tt.c. Referenced by afni_io(). |
|
Je ne sais pas * Definition at line 201 of file plugout_tt.c. Referenced by afni_io(). |
|
Definition at line 203 of file plugout_tt.c. Referenced by afni_io(). |
|
Definition at line 202 of file plugout_tt.c. Referenced by afni_io(). |
|
Definition at line 204 of file plugout_tt.c. Referenced by afni_io(). |
|
Definition at line 211 of file plugout_tt.c. |
|
Definition at line 212 of file plugout_tt.c. |
|
Definition at line 213 of file plugout_tt.c. |
|
Definition at line 209 of file plugout_tt.c. Referenced by afni_io(). |
Function Documentation
|
Definition at line 215 of file plugout_tt.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_readcheck(), iochan_recv(), iochan_recvall(), iochan_sendall(), iochan_writecheck(), PO_ACK_BAD, PO_ACK_OK, and POACKSIZE.
00216 { 00217 static int afni_mode = AFNI_OPEN_CONTROL_MODE ; /* status variable */ 00218 static IOCHAN * afni_ioc = NULL ; /* connection to AFNI */ 00219 int ii ; 00220 00221 /***************************************************************/ 00222 /***** Check to see if status is OK before we proceed. *****/ 00223 /***** (if an error occurs below, afni_mode gets set to 0) *****/ 00224 00225 if( afni_mode <= 0 ) return -1 ; 00226 00227 /***********************************************************************/ 00228 /***** First time into this routine? Open control channel to AFNI *****/ 00229 00230 if( afni_mode == AFNI_OPEN_CONTROL_MODE ){ 00231 char afni_iocname[128] ; /* will hold name of I/O channel */ 00232 00233 /** Note that the control channel is always a 00234 TCP/IP channel to port # 7955 on the AFNI host system **/ 00235 00236 if( strcmp(afni_host,".") == 0 ) 00237 sprintf( afni_iocname , "tcp:%s:7955" , "localhost" ); /* make name */ 00238 else 00239 sprintf( afni_iocname , "tcp:%s:7955" , afni_host ) ; /* make name */ 00240 afni_ioc = iochan_init( afni_iocname , "create" ) ; /* create it */ 00241 if( afni_ioc == NULL ){ 00242 fprintf(stderr, 00243 "Can't create control channel %s to AFNI!\n",afni_iocname) ; 00244 afni_mode = 0 ; 00245 return -1 ; 00246 } 00247 afni_mode = AFNI_WAIT_CONTROL_MODE ; /* waiting for AFNI connection */ 00248 if( afni_verbose ) 00249 fprintf(stderr,"AFNI control channel created\n") ; 00250 } 00251 00252 /****************************************************/ 00253 /**** Check if AFNI control channel is connected ****/ 00254 00255 if( afni_mode == AFNI_WAIT_CONTROL_MODE ){ 00256 ii = iochan_writecheck( afni_ioc , 5 ) ; /* wait at most 5 msec */ 00257 00258 /** the iochan_*check() routines return 00259 -1 for an error, 00260 0 if not ready, 00261 >0 if the I/O channel is ready. **/ 00262 00263 if( ii < 0 ){ 00264 fprintf(stderr,"Control channel to AFNI failed!\a\n") ; 00265 IOCHAN_CLOSE(afni_ioc) ; 00266 afni_mode = 0 ; 00267 return -1 ; 00268 } else if( ii > 0 ){ 00269 afni_mode = AFNI_OPEN_DATA_MODE ; /* prepare to send data */ 00270 if( afni_verbose ) 00271 fprintf(stderr,"AFNI control channel connected\n"); 00272 } else { 00273 return 0 ; /* try again next time */ 00274 } 00275 } 00276 00277 /**********************************************************/ 00278 /**** Send control data to AFNI, and open data channel ****/ 00279 00280 if( afni_mode == AFNI_OPEN_DATA_MODE ){ 00281 char afni_iocname[128] ; 00282 char afni_buf[256] ; 00283 00284 /** decide name of data channel: 00285 use shared memory (shm:) on ".", 00286 use TCP/IP (tcp:) on other computer systems; 00287 * Note that the TCP/IP port number can be 00288 anything that isn't already in use; 00289 * Note that the shm control name (here "test_plugout") 00290 is a string that will be converted to an IPC 00291 key (in function string_to_key in iochan.c). **/ 00292 00293 if( strcmp(afni_host,".") == 0 ) 00294 strcpy( afni_iocname , "shm:test_plugout:1K+1K" ) ; 00295 else 00296 sprintf( afni_iocname , "tcp:%s:%d" , afni_host , afni_port ) ; 00297 00298 /** write the command to AFNI into the buffer: 00299 * each command ends with a newline character, 00300 except (possibly) the last command; 00301 * the command buffer is a C string, which ends 00302 with an ASCII NUL character; 00303 * TT_XYZ_DELTA means 'send me T-T coordinates when they change'; 00304 * DSET_IJK_DELTA means 'send me IJK voxel indices when they change'; 00305 * PONAME means 'use this string for informative messages'; 00306 * IOCHAN means 'use this I/O channel from now on'. **/ 00307 00308 if( afni_name[0] == '\0' ) strcpy(afni_name,"aManCalledHorse") ; 00309 00310 if( afni_do_ijk ){ 00311 sprintf( afni_buf , "DSET_IJK_DELTA\n" 00312 "UNDERLAY_DELTA\n" 00313 "PONAME %s\n" 00314 "IOCHAN %s" , 00315 afni_name , afni_iocname ) ; 00316 } else { 00317 sprintf( afni_buf , "TT_XYZ_DELTA\n" 00318 "UNDERLAY_DELTA\n" 00319 "PONAME %s\n" 00320 "IOCHAN %s" , 00321 afni_name , afni_iocname ) ; 00322 } 00323 00324 if( afni_verbose ) 00325 fprintf(stderr,"Sending control information to AFNI\n") ; 00326 00327 /** note that the ASCII NUL at the end of the buffer is sent **/ 00328 00329 ii = iochan_sendall( afni_ioc , afni_buf , strlen(afni_buf)+1 ) ; 00330 00331 /** the return value is the number of bytes sent, 00332 or -1 indicating a fatal error transpired. **/ 00333 00334 if( ii < 0 ){ 00335 fprintf(stderr,"Transmission of control data to AFNI failed!\a\n") ; 00336 IOCHAN_CLOSE(afni_ioc) ; 00337 afni_mode = 0 ; 00338 return -1 ; 00339 00340 } else { 00341 00342 /** wait for the acknowledgment from AFNI, then close channel **/ 00343 00344 ii = iochan_recvall( afni_ioc , afni_buf , POACKSIZE ) ; 00345 IOCHAN_CLOSE(afni_ioc) ; 00346 00347 if( ii < 0 || strncmp(afni_buf,"OK!",3) != 0 ){ 00348 fprintf(stderr,"AFNI didn't like control information!\a\n") ; 00349 afni_mode = 0 ; 00350 return -1 ; 00351 } 00352 00353 /** now open data channel to AFNI **/ 00354 00355 afni_ioc = iochan_init( afni_iocname , "create" ) ; 00356 if( afni_ioc == NULL ){ 00357 fprintf(stderr, 00358 "Can't open data channel %s to AFNI!\a\n",afni_iocname) ; 00359 afni_mode = 0 ; 00360 return -1 ; 00361 } else { 00362 afni_mode = AFNI_WAIT_DATA_MODE ; 00363 if( afni_verbose ) fprintf(stderr,"AFNI data channel created\n") ; 00364 } 00365 } 00366 } 00367 00368 /****************************************************/ 00369 /***** See if data channel is connected to AFNI *****/ 00370 00371 if( afni_mode == AFNI_WAIT_DATA_MODE ){ 00372 00373 ii = iochan_goodcheck( afni_ioc , 5 ) ; /* wait at most 5 msec */ 00374 if( ii < 0 ){ 00375 fprintf(stderr, 00376 "AFNI data channel aborted before any data was sent!\a\n") ; 00377 IOCHAN_CLOSE( afni_ioc ) ; 00378 afni_mode = 0 ; 00379 return -1 ; 00380 } else if( ii > 0 ){ /* ready to go! */ 00381 afni_mode = AFNI_CONTINUE_MODE ; 00382 if( afni_verbose ) fprintf(stderr,"AFNI data channel is open\n") ; 00383 } else { 00384 return 0 ; /* try again next time */ 00385 } 00386 } 00387 00388 /************************************************************/ 00389 /***** The "normal" state of affairs: *****/ 00390 /***** AFNI is connected. See if any data is arriving. *****/ 00391 00392 if( afni_mode == AFNI_CONTINUE_MODE ){ 00393 char afni_buf[256] ; 00394 float xx , yy , zz ; 00395 int ix , jy , kz ; 00396 00397 ii = iochan_readcheck( afni_ioc , 0 ) ; /* don't wait */ 00398 00399 /** ii < 0 ==> a fatal error has happened 00400 ii == 0 ==> no data is ready 00401 ii > 0 ==> data is ready to read from the channel **/ 00402 00403 if( ii < 0 ){ 00404 fprintf(stderr,"AFNI data channel aborted!\a\n") ; 00405 IOCHAN_CLOSE(afni_ioc) ; 00406 afni_mode = 0 ; 00407 return -1 ; 00408 } else if( ii == 0 ){ 00409 return 0 ; /* no data ==> try again next time */ 00410 } 00411 00412 /** at this point, data is incoming from AFNI **/ 00413 00414 ii = iochan_recv( afni_ioc , afni_buf , 256 ) ; 00415 00416 if( ii <= 0 ){ 00417 fprintf(stderr,"AFNI data channel recv failed!\a\n") ; 00418 IOCHAN_CLOSE(afni_ioc) ; 00419 afni_mode = 0 ; 00420 return -1 ; 00421 } 00422 00423 /** at last! "process" the data from AFNI 00424 (in this case, just print it out) **/ 00425 00426 #if 0 00427 if( afni_do_ijk ) 00428 ii = sscanf( afni_buf , "DSET_IJK %d %d %d" , &ix,&jy,&kz ) ; 00429 else 00430 ii = sscanf( afni_buf , "TT_XYZ %f %f %f" , &xx,&yy,&zz ) ; 00431 00432 /** also, AFNI will wait until we send an acknowledgment; 00433 acknowledgment messages are always 4 (POACKSIZE) bytes long **/ 00434 00435 if( ii < 3 ){ 00436 fprintf(stderr,"AFNI sent bad data: %s\a\n",afni_buf) ; 00437 PO_ACK_BAD(afni_ioc) ; 00438 } else if( afni_do_ijk ){ 00439 fprintf(stderr,"AFNI sent indices: %d %d %d\n",ix,jy,kz) ; 00440 PO_ACK_OK(afni_ioc) ; 00441 } else { 00442 fprintf(stderr,"AFNI sent coords: %9.3f %9.3f %9.3f\n",xx,yy,zz) ; 00443 PO_ACK_OK(afni_ioc) ; 00444 } 00445 #else 00446 fprintf(stderr,"AFNI sent data:\n%s\n",afni_buf) ; 00447 PO_ACK_OK(afni_ioc) ; 00448 #endif 00449 } 00450 00451 return 0 ; 00452 } |
|
\** File : SUMA.c
Input paramters :
Definition at line 80 of file plugout_tt.c. References afni_do_ijk, afni_host, afni_io(), afni_name, afni_port, afni_verbose, argc, and iochan_sleep().
00081 { 00082 int narg , ii ; 00083 00084 /***** See if the pitiful user wants help *****/ 00085 00086 if( argc == 2 && strncmp(argv[1],"-help",5) == 0 ){ 00087 printf("Usage: plugout_tt [-host name] [-v]\n" 00088 "This program connects to AFNI and receives notification\n" 00089 "whenever the user changes Talairach coordinates.\n\n" 00090 "Options:\n" 00091 " -host name Means to connect to AFNI running on the\n" 00092 " computer 'name' using TCP/IP. The default is to\n" 00093 " connect on the current host using shared memory.\n" 00094 " -ijk Means to get voxel indices from AFNI, rather\n" 00095 " than Talairach coordinates.\n" 00096 " -v Verbose mode: prints out lots of stuff.\n" 00097 " -port pp Use TCP/IP port number 'pp'. The default is\n" 00098 " 8001, but if two copies of this are running on\n" 00099 " the same computer, they must use different ports.\n" 00100 " -name sss Use the string 'sss' for the name that AFNI assigns\n" 00101 " to this plugout. The default is something stupid.\n" 00102 ) ; 00103 exit(0) ; 00104 } 00105 00106 /***** Process command line options *****/ 00107 00108 narg = 1 ; 00109 while( narg < argc ){ 00110 00111 /** -host name **/ 00112 00113 if( strncmp(argv[narg],"-host",5) == 0 ){ 00114 narg++ ; 00115 if( narg >= argc ){ 00116 fprintf(stderr,"-host needs a following name!\a\n"); exit(1); 00117 } 00118 strcpy( afni_host , argv[narg] ) ; 00119 narg++ ; continue ; 00120 } 00121 00122 /** -name sss **/ 00123 00124 if( strncmp(argv[narg],"-name",5) == 0 ){ 00125 narg++ ; 00126 if( narg >= argc ){ 00127 fprintf(stderr,"-name needs a following string!\a\n"); exit(1); 00128 } 00129 strcpy( afni_name , argv[narg] ) ; 00130 narg++ ; continue ; 00131 } 00132 00133 /** -v **/ 00134 00135 if( strncmp(argv[narg],"-v",2) == 0 ){ 00136 afni_verbose = 1 ; 00137 narg++ ; continue ; 00138 } 00139 00140 /** -port pp **/ 00141 00142 if( strncmp(argv[narg],"-port",4) == 0 ){ 00143 narg++ ; 00144 if( narg >= argc ){ 00145 fprintf(stderr,"-port needs a following argument!\a\n"); exit(1); 00146 } 00147 afni_port = strtol( argv[narg] , NULL , 10 ) ; 00148 if( afni_port <= 0 ){ 00149 fprintf(stderr,"-port needs a positive argument!\a\n"); exit(1); 00150 } 00151 if( strcmp(afni_host,".") == 0 ) strcpy(afni_host,"localhost") ; 00152 narg++ ; continue ; 00153 } 00154 00155 /** -ijk **/ 00156 00157 if( strncmp(argv[narg],"-ijk",4) == 0 ){ 00158 afni_do_ijk = 1 ; 00159 narg++ ; continue ; 00160 } 00161 00162 /** Je ne sais pas **/ 00163 00164 fprintf(stderr,"Unrecognized option: %s\a\n",argv[narg]) ; 00165 exit(1) ; 00166 } 00167 00168 /***** Loop and check in with AFNI every 100 msec *****/ 00169 00170 while( 1 ){ 00171 ii = afni_io() ; /* commune with AFNI */ 00172 if( ii < 0 ) exit(0) ; /* bad trip? then die */ 00173 iochan_sleep(100) ; /* perchance to dream */ 00174 } 00175 00176 } |
Variable Documentation
|
Definition at line 68 of file plugout_tt.c. Referenced by main(). |
|
Definition at line 63 of file plugout_tt.c. |
|
Definition at line 64 of file plugout_tt.c. |
|
Definition at line 65 of file plugout_tt.c. |
|
Definition at line 67 of file plugout_tt.c. Referenced by main(). |