Doxygen Source Code Documentation
plugout_surf.c File Reference
#include "thd_iochan.h"#include <errno.h>#include <stdlib.h>#include <strings.h>#include <curses.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 ) |
| #define | BUF 256 |
Functions | |
| int | afni_io (void) |
| int | got_key (char *) |
| void | setup_key (void) |
| void | restore_key (void) |
| int | main (int argc, char *argv[]) |
Variables | |
| char | afni_host [128] = "." |
| char | afni_name [128] = "\0" |
| int | afni_port = 8019 |
| int | afni_verbose = 0 |
Define Documentation
|
|
Definition at line 148 of file plugout_surf.c. Referenced by afni_io(). |
|
|
Je ne sais pas * Definition at line 144 of file plugout_surf.c. Referenced by afni_io(). |
|
|
Definition at line 146 of file plugout_surf.c. Referenced by afni_io(). |
|
|
Definition at line 145 of file plugout_surf.c. Referenced by afni_io(). |
|
|
Definition at line 147 of file plugout_surf.c. Referenced by afni_io(). |
|
|
|
|
|
Definition at line 154 of file plugout_surf.c. |
|
|
Definition at line 155 of file plugout_surf.c. |
|
|
Definition at line 156 of file plugout_surf.c. |
|
|
Definition at line 152 of file plugout_surf.c. |
Function Documentation
|
|
Definition at line 158 of file plugout_surf.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, got_key(), IOCHAN_CLOSE, iochan_goodcheck(), iochan_init(), iochan_readcheck(), iochan_recv(), iochan_sendall(), iochan_writecheck(), and setup_key().
00159 {
00160 static int afni_mode = AFNI_OPEN_CONTROL_MODE ; /* status variable */
00161 static IOCHAN * afni_ioc = NULL ; /* connection to AFNI */
00162 int ii ;
00163 int need_setup_key=1 ;
00164
00165 /***************************************************************/
00166 /***** Check to see if status is OK before we proceed. *****/
00167 /***** (if an error occurs below, afni_mode gets set to 0) *****/
00168
00169 if( afni_mode <= 0 ) return -1 ;
00170
00171 /***********************************************************************/
00172 /***** First time into this routine? Open control channel to AFNI *****/
00173
00174 if( afni_mode == AFNI_OPEN_CONTROL_MODE ){
00175 char afni_iocname[128] ; /* will hold name of I/O channel */
00176
00177 /** Note that the control channel is always a
00178 TCP/IP channel to port # 7955 on the AFNI host system **/
00179
00180 if( strcmp(afni_host,".") == 0 )
00181 sprintf( afni_iocname , "tcp:%s:7955" , "localhost" ); /* make name */
00182 else
00183 sprintf( afni_iocname , "tcp:%s:7955" , afni_host ) ; /* make name */
00184
00185 afni_ioc = iochan_init( afni_iocname , "create" ) ; /* create it */
00186 if( afni_ioc == NULL ){
00187 fprintf(stderr,
00188 "Can't create control channel %s to AFNI!\n",afni_iocname) ;
00189 afni_mode = 0 ;
00190 return -1 ;
00191 }
00192 afni_mode = AFNI_WAIT_CONTROL_MODE ; /* waiting for AFNI connection */
00193 if( afni_verbose )
00194 fprintf(stderr,"AFNI control channel created\n") ;
00195 }
00196
00197 /****************************************************/
00198 /**** Check if AFNI control channel is connected ****/
00199
00200 if( afni_mode == AFNI_WAIT_CONTROL_MODE ){
00201 ii = iochan_writecheck( afni_ioc , 5 ) ; /* wait at most 5 msec */
00202
00203 /** the iochan_*check() routines return
00204 -1 for an error,
00205 0 if not ready,
00206 >0 if the I/O channel is ready. **/
00207
00208 if( ii < 0 ){
00209 fprintf(stderr,"Control channel to AFNI failed!\a\n") ;
00210 IOCHAN_CLOSE(afni_ioc) ;
00211 afni_mode = 0 ;
00212 return -1 ;
00213 } else if( ii > 0 ){
00214 afni_mode = AFNI_OPEN_DATA_MODE ; /* prepare to send data */
00215 if( afni_verbose )
00216 fprintf(stderr,"AFNI control channel connected\n");
00217 } else {
00218 return 0 ; /* try again next time */
00219 }
00220 }
00221
00222 /**********************************************************/
00223 /**** Send control data to AFNI, and open data channel ****/
00224
00225 if( afni_mode == AFNI_OPEN_DATA_MODE ){
00226 char afni_iocname[128] ;
00227 char afni_buf[256] ;
00228
00229 /** decide name of data channel:
00230 use shared memory (shm:) on ".",
00231 use TCP/IP (tcp:) on other computer systems;
00232 * Note that the TCP/IP port number can be
00233 anything that isn't already in use;
00234 * Note that the shm control name (here "surf_plugout")
00235 is a string that will be converted to an IPC
00236 key (in function string_to_key in iochan.c). **/
00237
00238 if( strcmp(afni_host,".") == 0 )
00239 strcpy( afni_iocname , "shm:surf_plugout:1K+1K" ) ;
00240 else
00241 sprintf( afni_iocname , "tcp:%s:%d" , afni_host , afni_port ) ;
00242
00243 /** write the command to AFNI into the buffer:
00244 * each command ends with a newline character,
00245 except (possibly) the last command;
00246 * the command buffer is a C string, which ends
00247 with an ASCII NUL character;
00248 * PONAME means 'use this string for informative messages';
00249 * IOCHAN means 'use this I/O channel from now on'. **/
00250
00251 if( afni_name[0] == '\0' ) strcpy(afni_name,"SurfaceHack") ;
00252
00253 sprintf( afni_buf , "SURFID_DELTA\n"
00254 "NO_ACK\n"
00255 "PONAME %s\n"
00256 "IOCHAN %s" ,
00257 afni_name , afni_iocname ) ;
00258
00259 if( afni_verbose )
00260 fprintf(stderr,"Sending control information to AFNI\n") ;
00261
00262 /** note that the ASCII NUL at the end of the buffer is sent **/
00263
00264 ii = iochan_sendall( afni_ioc , afni_buf , strlen(afni_buf)+1 ) ;
00265
00266 /** the return value is the number of bytes sent,
00267 or -1 indicating a fatal error transpired. **/
00268
00269 if( ii < 0 ){
00270 fprintf(stderr,"Transmission of control data to AFNI failed!\a\n") ;
00271 IOCHAN_CLOSE(afni_ioc) ;
00272 afni_mode = 0 ;
00273 return -1 ;
00274
00275 } else { /* things are cool, real cool */
00276
00277 /** close channel **/
00278
00279 IOCHAN_CLOSE(afni_ioc) ;
00280
00281 /** now open data channel to AFNI **/
00282
00283 afni_ioc = iochan_init( afni_iocname , "create" ) ;
00284 if( afni_ioc == NULL ){
00285 fprintf(stderr,
00286 "Can't open data channel %s to AFNI!\a\n",afni_iocname) ;
00287 afni_mode = 0 ;
00288 return -1 ;
00289 } else {
00290 afni_mode = AFNI_WAIT_DATA_MODE ;
00291 if( afni_verbose ) fprintf(stderr,"AFNI data channel created\n") ;
00292 }
00293 }
00294 }
00295
00296 /****************************************************/
00297 /***** See if data channel is connected to AFNI *****/
00298
00299 if( afni_mode == AFNI_WAIT_DATA_MODE ){
00300
00301 ii = iochan_goodcheck( afni_ioc , 5 ) ; /* wait at most 5 msec */
00302 if( ii < 0 ){
00303 fprintf(stderr,
00304 "AFNI data channel aborted before any data was sent!\a\n") ;
00305 IOCHAN_CLOSE( afni_ioc ) ;
00306 afni_mode = 0 ;
00307 return -1 ;
00308 } else if( ii > 0 ){ /* ready to go! */
00309 afni_mode = AFNI_CONTINUE_MODE ;
00310 if( afni_verbose ) fprintf(stderr,"AFNI data channel is open\n") ;
00311 printf("\rEnter node ID: "); fflush(stdout);
00312 } else {
00313 return 0 ; /* try again next time */
00314 }
00315 }
00316
00317 /**************************************************************/
00318 /***** The "normal" state of affairs: AFNI is connected. *****/
00319 /***** See if the user wants to send node ID to AFNI, *****/
00320 /***** or if AFNI has sent a node ID back to us. *****/
00321
00322 #define BUF 256
00323
00324 if( afni_mode == AFNI_CONTINUE_MODE ){
00325 static char kbuf[BUF] ; /* input keystroke buffer */
00326 static int nkey=0 ; /* number of keys */
00327 char afni_buf[BUF] ; /* text to send to AFNI */
00328 int id ; /* Surface node ID code */
00329
00330 if( need_setup_key ){ setup_key(); need_setup_key = 0; }
00331
00332 /* see if AFNI sent anything */
00333
00334 ii = iochan_readcheck( afni_ioc , 0 ) ; /* don't wait */
00335
00336 /** ii < 0 ==> a fatal error has happened
00337 ii == 0 ==> no data is ready
00338 ii > 0 ==> data is ready to read from the channel **/
00339
00340 if( ii < 0 ){ /** bad news on the I/O front **/
00341
00342 fprintf(stderr,"\nAFNI data channel aborted!\a\n") ;
00343 IOCHAN_CLOSE(afni_ioc) ;
00344 afni_mode = 0 ;
00345 return -1 ;
00346
00347 } else if( ii > 0 ){ /** at this point, data is incoming from AFNI **/
00348
00349 ii = iochan_recv( afni_ioc , afni_buf , BUF ) ; /* get data */
00350
00351 if( ii <= 0 ){ /** receive failed? */
00352 fprintf(stderr,"\nAFNI data channel recv failed!\a\n") ;
00353 IOCHAN_CLOSE(afni_ioc) ;
00354 afni_mode = 0 ;
00355 return -1 ;
00356 }
00357
00358 /** at last! "process" the data from AFNI
00359 (in this case, just print it out) **/
00360
00361 #if 1
00362 printf("AFNI sent: %s\n",afni_buf) ;
00363 #else
00364 ii = sscanf( afni_buf , "SURFID %d" , &id ) ; /* extract node id */
00365 if( ii < 1 ){
00366 fprintf(stderr,"AFNI sent bad data: %s\a\n",afni_buf) ;
00367 } else {
00368 fprintf(stderr,"AFNI sent id: %d\n",id) ;
00369 }
00370 #endif
00371
00372 /* give prompt for keyboard input again
00373 (if had keyboard input, it will be thrown away now) */
00374
00375 printf("\rEnter node ID: "); fflush(stdout); nkey = 0;
00376
00377 } /* end of processing input from AFNI */
00378
00379 /*-- check for user input --*/
00380
00381 while( got_key(kbuf+nkey) ){ /* loop while we have keystrokes */
00382
00383 if( isdigit(kbuf[nkey]) ){ /* save numerals */
00384
00385 printf("%c",kbuf[nkey++]); fflush(stdout);
00386
00387 } else if( nkey > 0 && kbuf[nkey] == '\n' ){ /* end of string */
00388
00389 printf("\n"); fflush(stdout); kbuf[nkey++]='\0'; break;
00390
00391 }
00392
00393 if( nkey == BUF ){ /* stupid user */
00394 fprintf(stderr,"\nBad boy.\n\a"); exit(1);
00395 }
00396 }
00397
00398 /* check if we have a whole string;
00399 if not, return; otherwise, send index to AFNI */
00400
00401 if( nkey == 0 || kbuf[nkey-1] != '\0' ) return 0 ; /* incomplete */
00402
00403 id = strtol( kbuf , NULL , 10 ) ;
00404 sprintf(afni_buf,"SURFID %d",id) ;
00405 ii = iochan_sendall( afni_ioc , afni_buf , strlen(afni_buf)+1 ) ;
00406
00407 if( ii < 0 ){ /* send failed */
00408 fprintf(stderr,"AFNI data channel aborted!\a\n") ;
00409 IOCHAN_CLOSE(afni_ioc) ;
00410 afni_mode = 0 ;
00411 return -1 ;
00412 }
00413
00414 printf("\rEnter node ID: "); fflush(stdout); nkey = 0;
00415 return 0 ;
00416 }
00417
00418 return 0 ;
00419 }
|
|
|
Definition at line 453 of file plugout_surf.c. Referenced by afni_io().
00454 {
00455 int return_code = 0;
00456 *char_pressed = getch();
00457 if (*char_pressed != ERR) return_code = TRUE;
00458 return(return_code);
00459 }
|
|
||||||||||||
|
\** File : SUMA.c
Input paramters :
Definition at line 31 of file plugout_surf.c. References afni_host, afni_io(), afni_name, afni_port, afni_verbose, argc, iochan_sleep(), and restore_key().
00032 {
00033 int narg , ii ;
00034
00035 /***** See if the pitiful user wants help *****/
00036
00037 if( argc == 2 && strncmp(argv[1],"-help",5) == 0 ){
00038 printf("Usage: plugout_surf [-host name] [-v]\n"
00039 "This program connects to AFNI and sends/gets surface\n"
00040 "node IDs to control/know the AFNI viewpoint.\n\n"
00041 "Options:\n"
00042 " -host name Means to connect to AFNI running on the\n"
00043 " computer 'name' using TCP/IP. The default is to\n"
00044 " connect on the current host using shared memory.\n"
00045 " -v Verbose mode.\n"
00046 " -port pp Use TCP/IP port number 'pp'. The default is\n"
00047 " 8019, but if two plugouts are running on the\n"
00048 " same computer, they must use different ports.\n"
00049 " -name sss Use the string 'sss' for the name that AFNI assigns\n"
00050 " to this plugout. The default is something stupid.\n"
00051 ) ;
00052 exit(0) ;
00053 }
00054
00055 /***** Process command line options *****/
00056
00057 narg = 1 ;
00058 while( narg < argc ){
00059
00060 /** -host name **/
00061
00062 if( strncmp(argv[narg],"-host",5) == 0 ){
00063 narg++ ;
00064 if( narg >= argc ){
00065 fprintf(stderr,"-host needs a following name!\a\n"); exit(1);
00066 }
00067 strcpy( afni_host , argv[narg] ) ;
00068 narg++ ; continue ;
00069 }
00070
00071 /** -name sss **/
00072
00073 if( strncmp(argv[narg],"-name",5) == 0 ){
00074 narg++ ;
00075 if( narg >= argc ){
00076 fprintf(stderr,"-name needs a following string!\a\n"); exit(1);
00077 }
00078 strcpy( afni_name , argv[narg] ) ;
00079 narg++ ; continue ;
00080 }
00081
00082 /** -v **/
00083
00084 if( strncmp(argv[narg],"-v",2) == 0 ){
00085 afni_verbose = 1 ;
00086 narg++ ; continue ;
00087 }
00088
00089 /** -port pp **/
00090
00091 if( strncmp(argv[narg],"-port",4) == 0 ){
00092 narg++ ;
00093 if( narg >= argc ){
00094 fprintf(stderr,"-port needs a following argument!\a\n"); exit(1);
00095 }
00096 afni_port = strtol( argv[narg] , NULL , 10 ) ;
00097 if( afni_port <= 0 ){
00098 fprintf(stderr,"-port needs a positive argument!\a\n"); exit(1);
00099 }
00100 if( strcmp(afni_host,".") == 0 ) strcpy(afni_host,"localhost") ;
00101 narg++ ; continue ;
00102 }
00103
00104 /** Je ne sais pas **/
00105
00106 fprintf(stderr,"Unrecognized option: %s\a\n",argv[narg]) ;
00107 exit(1) ;
00108 }
00109
00110 /***** Loop and check in with AFNI every 100 msec *****/
00111
00112 while( 1 ){
00113 ii = afni_io() ; /* commune with AFNI */
00114 if( ii < 0 ) break ; /* bad trip? then die */
00115 iochan_sleep(100) ; /* perchance to dream */
00116 }
00117
00118 restore_key() ; exit(0) ;
00119 }
|
|
|
Definition at line 440 of file plugout_surf.c. Referenced by main().
00441 {
00442 nodelay(stdscr, FALSE); /* Set keyboard to normal (blocking) mode */
00443 nocbreak(); /* Set terminal to "wait until press return" buffer mode */
00444 echo(); /* Restore echo of keypresses to screen */
00445 endwin(); /* Close down curses library */
00446 }
|
|
|
at last! "process" the data from AFNI (in this case, just print it out) * Definition at line 430 of file plugout_surf.c. Referenced by afni_io().
00431 {
00432 stdscr = initscr(); /* Initialise curses library */
00433 noecho(); /* Turn off echo of keypresses to screen */
00434 cbreak(); /* Set terminal to one-character-at-a-time mode */
00435 nodelay(stdscr, TRUE); /* Set keyboard to no-delay mode */
00436 }
|
Variable Documentation
|
|
Definition at line 12 of file plugout_surf.c. |
|
|
Definition at line 13 of file plugout_surf.c. |
|
|
Definition at line 14 of file plugout_surf.c. |
|
|
Definition at line 15 of file plugout_surf.c. Referenced by main(). |