Doxygen Source Code Documentation
plugout_drive.c File Reference
#include "thd_iochan.h"Go to the source code of this file.
Defines | |
| #define | COM_LENGTH 1000 |
| #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 = 8099 |
| int | afni_verbose = 0 |
| int | DontWait = 0 |
| int | N_com = 0 |
| int | I_com = 0 |
| char * | com [1024] |
Define Documentation
|
|
Definition at line 230 of file plugout_drive.c. Referenced by afni_io(). |
|
|
Je ne sais pas * Definition at line 226 of file plugout_drive.c. Referenced by afni_io(). |
|
|
Definition at line 228 of file plugout_drive.c. Referenced by afni_io(). |
|
|
Definition at line 227 of file plugout_drive.c. Referenced by afni_io(). |
|
|
Definition at line 229 of file plugout_drive.c. Referenced by afni_io(). |
|
|
Definition at line 34 of file plugout_drive.c. |
|
|
Definition at line 236 of file plugout_drive.c. Referenced by afni_io(), AFNI_plugout_workproc(), and AFNI_process_plugout(). |
|
|
Definition at line 237 of file plugout_drive.c. Referenced by afni_io(), AFNI_plugout_workproc(), and AFNI_process_plugout(). |
|
|
Definition at line 238 of file plugout_drive.c. Referenced by AFNI_process_plugout(). |
|
|
Definition at line 234 of file plugout_drive.c. Referenced by afni_io(). |
Function Documentation
|
|
Definition at line 241 of file plugout_drive.c. References AFNI_CONTINUE_MODE, afni_host, afni_name, AFNI_OPEN_CONTROL_MODE, AFNI_OPEN_DATA_MODE, afni_port, afni_verbose, AFNI_WAIT_CONTROL_MODE, AFNI_WAIT_DATA_MODE, com, COM_LENGTH, I_com, IOCHAN_CLOSE, iochan_goodcheck(), iochan_init(), iochan_recvall(), iochan_sendall(), iochan_sleep(), iochan_writecheck(), N_com, and POACKSIZE. Referenced by main().
00242 {
00243 static int afni_mode = AFNI_OPEN_CONTROL_MODE ; /* status variable */
00244 static IOCHAN * afni_ioc = NULL ; /* connection to AFNI */
00245 int ii ;
00246
00247 /***************************************************************/
00248 /***** Check to see if status is OK before we proceed. *****/
00249 /***** (if an error occurs below, afni_mode gets set to 0) *****/
00250
00251 if( afni_mode <= 0 ) return -1 ;
00252
00253 /***********************************************************************/
00254 /***** First time into this routine? Open control channel to AFNI *****/
00255
00256 if( afni_mode == AFNI_OPEN_CONTROL_MODE ){
00257 char afni_iocname[128] ; /* will hold name of I/O channel */
00258
00259 /** Note that the control channel is always a
00260 TCP/IP channel to port # 7955 on the AFNI host system **/
00261
00262 if( strcmp(afni_host,".") == 0 )
00263 sprintf( afni_iocname , "tcp:%s:7955" , "localhost" ); /* make name */
00264 else
00265 sprintf( afni_iocname , "tcp:%s:7955" , afni_host ) ; /* make name */
00266
00267 afni_ioc = iochan_init( afni_iocname , "create" ) ; /* create it */
00268 if( afni_ioc == NULL ){
00269 fprintf(stderr,
00270 "** Can't create control channel %s to AFNI!\n",afni_iocname) ;
00271 afni_mode = 0 ;
00272 return -1 ;
00273 }
00274 afni_mode = AFNI_WAIT_CONTROL_MODE ; /* waiting for AFNI connection */
00275 if( afni_verbose )
00276 fprintf(stderr,"++ AFNI control channel created\n") ;
00277 }
00278
00279 /****************************************************/
00280 /**** Check if AFNI control channel is connected ****/
00281
00282 if( afni_mode == AFNI_WAIT_CONTROL_MODE ){
00283 ii = iochan_writecheck( afni_ioc , 5 ) ; /* wait at most 5 msec */
00284
00285 /** the iochan_*check() routines return
00286 -1 for an error,
00287 0 if not ready,
00288 >0 if the I/O channel is ready. **/
00289
00290 if( ii < 0 ){
00291 fprintf(stderr,"** Control channel to AFNI failed!\a\n") ;
00292 IOCHAN_CLOSE(afni_ioc) ;
00293 afni_mode = 0 ;
00294 return -1 ;
00295 } else if( ii > 0 ){
00296 afni_mode = AFNI_OPEN_DATA_MODE ; /* prepare to send data */
00297 if( afni_verbose )
00298 fprintf(stderr,"++ AFNI control channel connected\n");
00299 } else {
00300 return 0 ; /* try again next time */
00301 }
00302 }
00303
00304 /**********************************************************/
00305 /**** Send control data to AFNI, and open data channel ****/
00306
00307 if( afni_mode == AFNI_OPEN_DATA_MODE ){
00308 char afni_iocname[128] ;
00309 char afni_buf[256] ;
00310
00311 /** decide name of data channel:
00312 use shared memory (shm:) on ".",
00313 use TCP/IP (tcp:) on other computer systems;
00314 * Note that the TCP/IP port number can be
00315 anything that isn't already in use;
00316 * Note that the shm control name (here "test_plugout")
00317 is a string that will be converted to an IPC
00318 key (in function string_to_key in iochan.c). **/
00319
00320 if( strcmp(afni_host,".") == 0 )
00321 strcpy( afni_iocname , "shm:test_plugout:1K+1K" ) ;
00322 else
00323 sprintf( afni_iocname , "tcp:%s:%d" , afni_host , afni_port ) ;
00324
00325 /** write the command to AFNI into the buffer:
00326 * each command ends with a newline character,
00327 except (possibly) the last command;
00328 * the command buffer is a C string, which ends
00329 with an ASCII NUL character;
00330 * PONAME means 'use this string for informative messages';
00331 * IOCHAN means 'use this I/O channel from now on'. **/
00332
00333 if( afni_name[0] == '\0' ) strcpy(afni_name,"ManOfLaMancha") ;
00334
00335 sprintf( afni_buf , "PONAME %s\n"
00336 "IOCHAN %s" ,
00337 afni_name , afni_iocname ) ;
00338
00339 if( afni_verbose )
00340 fprintf(stderr,"++ Sending control information to AFNI\n") ;
00341
00342 /** note that the ASCII NUL at the end of the buffer is sent **/
00343
00344 ii = iochan_sendall( afni_ioc , afni_buf , strlen(afni_buf)+1 ) ;
00345
00346 /** the return value is the number of bytes sent,
00347 or -1 indicating a fatal error transpired. **/
00348
00349 if( ii < 0 ){
00350 fprintf(stderr,"** Transmission of control data to AFNI failed!\a\n") ;
00351 IOCHAN_CLOSE(afni_ioc) ;
00352 afni_mode = 0 ;
00353 return -1 ;
00354
00355 } else {
00356
00357 /** wait for the acknowledgment from AFNI, then close channel **/
00358
00359 ii = iochan_recvall( afni_ioc , afni_buf , POACKSIZE ) ;
00360 IOCHAN_CLOSE(afni_ioc) ;
00361
00362 if( ii < 0 || strncmp(afni_buf,"OK!",3) != 0 ){
00363 fprintf(stderr,"** AFNI didn't like control information!\a\n") ;
00364 afni_mode = 0 ;
00365 return -1 ;
00366 }
00367
00368 /** now open data channel to AFNI **/
00369
00370 afni_ioc = iochan_init( afni_iocname , "create" ) ;
00371 if( afni_ioc == NULL ){
00372 fprintf(stderr,
00373 "** Can't open data channel %s to AFNI!\a\n",afni_iocname) ;
00374 afni_mode = 0 ;
00375 return -1 ;
00376 } else {
00377 afni_mode = AFNI_WAIT_DATA_MODE ;
00378 if( afni_verbose ) fprintf(stderr,"++ AFNI data channel created\n") ;
00379 }
00380 }
00381 }
00382
00383 /****************************************************/
00384 /***** See if data channel is connected to AFNI *****/
00385
00386 if( afni_mode == AFNI_WAIT_DATA_MODE ){
00387
00388 ii = iochan_goodcheck( afni_ioc , 5 ) ; /* wait at most 5 msec */
00389 if( ii < 0 ){
00390 fprintf(stderr,
00391 "** AFNI data channel aborted before any data was sent!\a\n") ;
00392 IOCHAN_CLOSE( afni_ioc ) ;
00393 afni_mode = 0 ;
00394 return -1 ;
00395 } else if( ii > 0 ){ /* ready to go! */
00396 afni_mode = AFNI_CONTINUE_MODE ;
00397 if( afni_verbose ) fprintf(stderr,"++ AFNI data channel is open\n") ;
00398 } else {
00399 return 0 ; /* try again next time */
00400 }
00401 }
00402
00403 /**************************************************************/
00404 /***** The "normal" state of affairs: AFNI is connected. *****/
00405 /***** See if the user wants to drive AFNI. *****/
00406
00407 if( afni_mode == AFNI_CONTINUE_MODE ){
00408 char cmd_buf[COM_LENGTH] , afni_buf[COM_LENGTH+56];
00409
00410 if( I_com < N_com ){ /* send the I_com'th command */
00411 strcpy(afni_buf, "DRIVE_AFNI ") ;
00412 strcat(afni_buf, com[I_com] ) ; strcpy(cmd_buf,com[I_com]) ;
00413 I_com++ ;
00414 } else {
00415 if (DontWait) exit(0);
00416 /* get user input */
00417
00418 printf("Enter command: ") ; fflush(stdout) ; fgets(cmd_buf,COM_LENGTH,stdin) ;
00419
00420 /* make command to AFNI */
00421
00422 strcpy(afni_buf,"DRIVE_AFNI ") ;
00423 strcat(afni_buf,cmd_buf) ;
00424 }
00425
00426 /* send command to AFNI */
00427
00428 ii = iochan_sendall( afni_ioc , afni_buf , strlen(afni_buf)+1 ) ;
00429
00430 if( strcmp(cmd_buf,"QUIT") == 0 ){ /* 28 Jul 2005 */
00431 iochan_sleep(222) ; exit(0) ;
00432 }
00433
00434 if( ii > 0 ){ /* send was OK; wait for acknowledgment */
00435 ii = iochan_recvall( afni_ioc , afni_buf , POACKSIZE ) ;
00436 if( ii > 0 && afni_verbose )
00437 printf("++ AFNI response string: %s\n",afni_buf) ;
00438 }
00439
00440 if( ii < 0 ){ /* send or acknowledgment failed */
00441 fprintf(stderr,"** AFNI data channel aborted!\a\n") ;
00442 IOCHAN_CLOSE(afni_ioc) ;
00443 afni_mode = 0 ;
00444 return -1 ;
00445 }
00446 return 0 ;
00447 }
00448
00449 return 0 ;
00450 }
|
|
||||||||||||
|
\** File : SUMA.c
Input paramters :
Definition at line 57 of file plugout_drive.c. References afni_host, afni_io(), afni_name, afni_port, afni_verbose, argc, com, COM_LENGTH, DontWait, iochan_sleep(), and N_com.
00058 {
00059 int narg , ii;
00060
00061 /***** See if the pitiful user wants help *****/
00062
00063 if( argc == 2 && strncmp(argv[1],"-help",5) == 0 ){
00064 printf("Usage: plugout_drive [-host name] [-v]\n"
00065 "This program connects to AFNI and sends commands\n"
00066 " that the user specifies interactively or on command line\n"
00067 " over to AFNI to be executed.\n"
00068 "\n"
00069 "Options:\n"
00070 " -host name Means to connect to AFNI running on the\n"
00071 " computer 'name' using TCP/IP. The default is to\n"
00072 " connect on the current host using shared memory.\n"
00073 " -v Verbose mode.\n"
00074 " -port pp Use TCP/IP port number 'pp'. The default is\n"
00075 " 8099, but if two plugouts are running on the\n"
00076 " same computer, they must use different ports.\n"
00077 " -name sss Use the string 'sss' for the name that AFNI assigns\n"
00078 " to this plugout. The default is something stupid.\n"
00079 " -com 'ACTION DATA' Execute the following command. For example:\n"
00080 " -com 'SET_FUNCTION SomeFunction'\n"
00081 " will switch AFNI's function (overlay) to\n"
00082 " dataset with prefix SomeFunction. \n"
00083 " Make sure ACTION and DATA are together enclosed\n"
00084 " in one pair of single quotes.\n"
00085 " There are numerous actions listed in AFNI's\n"
00086 " README.driver file.\n"
00087 " You can use the option -com repeatedly. \n"
00088 " -quit Quit after you are done with all the -com commands.\n"
00089 " The default is for the program to wait for more\n"
00090 " commands to be typed at the terminal's prompt.\n"
00091 "\n"
00092 "NOTE:\n"
00093 "You will need to turn plugouts on in AFNI using one of the\n"
00094 "following methods: \n"
00095 " 1. Including '-yesplugouts' as an option on AFNI's command line\n"
00096 " 2. From AFNI: Define Datamode->Misc->Start Plugouts\n"
00097 " 3. Set environment variable AFNI_YESPLUGOUTS to YES in .afnirc\n"
00098 "Otherwise, AFNI won't be listening for a plugout connection.\n"
00099 "\n"
00100 ) ;
00101 exit(0) ;
00102 }
00103
00104 /***** Process command line options *****/
00105
00106 N_com = 0;
00107 DontWait = 0;
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 <= 1024 ){
00149 fprintf(stderr,"** -port needs an argument > 1024!\a\n"); exit(1);
00150 }
00151 if( strcmp(afni_host,".") == 0 ) strcpy(afni_host,"localhost") ;
00152 narg++ ; continue ;
00153 }
00154
00155 /*** -com 'command this' */
00156 if( strncmp(argv[narg],"-com",4) == 0 ){
00157 narg++ ;
00158 if( narg >= argc ){
00159 fprintf(stderr,"** -com needs a following argument!\a\n"); exit(1);
00160 }
00161
00162 if (argv[narg] && strlen(argv[narg]) >= COM_LENGTH) {
00163 fprintf(stderr,"** Command length must be smaller than %d characters.\n", COM_LENGTH);
00164 }
00165
00166 if (N_com < 1024) {
00167 com[N_com] = argv[narg];
00168 ++N_com;
00169 } else {
00170 fprintf(stderr,"** Only 1024 -com options allowed. Are you nuts?\a\n"); exit(1);
00171 }
00172
00173 narg++ ; continue ;
00174 }
00175
00176 /*** -quit */
00177 if( strncmp(argv[narg],"-quit",5) == 0 ){
00178 DontWait = 1 ;
00179 narg++ ; continue ;
00180 }
00181
00182 /** Je ne sais pas **/
00183
00184 fprintf(stderr,"** Unrecognized option: %s\a\n",argv[narg]) ;
00185 exit(1) ;
00186 }
00187
00188 if (DontWait && !N_com) {
00189 fprintf(stderr,"** WARNING: -quit option is meaningless without -com option.\n");
00190 DontWait = 0;
00191 }
00192
00193 /***** Loop and check in with AFNI every 100 msec *****/
00194
00195 while( 1 ){
00196 ii = afni_io() ; /* commune with AFNI */
00197 if( ii < 0 ) exit(0) ; /* bad trip? then die */
00198 iochan_sleep(100) ; /* perchance to dream */
00199 }
00200
00201 }
|
Variable Documentation
|
|
Definition at line 39 of file plugout_drive.c. |
|
|
Definition at line 40 of file plugout_drive.c. |
|
|
Definition at line 41 of file plugout_drive.c. |
|
|
Definition at line 42 of file plugout_drive.c. |
|
|
Definition at line 46 of file plugout_drive.c. |
|
|
Definition at line 43 of file plugout_drive.c. Referenced by main(). |
|
|
Definition at line 45 of file plugout_drive.c. Referenced by afni_io(). |
|
|
Definition at line 44 of file plugout_drive.c. |