Doxygen Source Code Documentation
rtfeedme.c File Reference
#include "mrilib.h"
#include <signal.h>
Go to the source code of this file.
Defines | |
#define | MAX_CHAN 32 |
#define | AFNI_CONTROL_PORT 7954 |
#define | AFNI_TCP_PORT 7953 |
#define | AFNI_OPEN_CONTROL_MODE 1 |
#define | AFNI_WAIT_CONTROL_MODE 2 |
#define | AFNI_OPEN_DATA_MODE 3 |
#define | AFNI_CATCHUP_MODE 4 |
#define | AFNI_CONTINUE_MODE 5 |
#define | RSH "rsh" |
#define | COMMAND_MARKER "Et Earello Endorenna utulien!!" |
#define | COMMAND_MARKER_LENGTH 30 |
#define | ERREX(ee) |
#define | ADDTO_BUF ( strcat(RT_buf,RT_com) , strcat(RT_buf,"\n") ) |
Functions | |
void | RT_start_io (void) |
void | RT_exit (void) |
void | RT_sigfunc (int sig) |
void | AFNI_start_io (void) |
int | main (int argc, char *argv[]) |
Variables | |
THD_3dim_dataset * | RT_dset [MAX_CHAN] |
float | RT_dt = 0.0 |
int | RT_3D = 0 |
int | RT_swap2 = 0 |
char | RT_buf [32768] |
char | RT_com [1024] |
int | RT_mega = 1 |
int | AFNI_mode = 0 |
int | AFNI_use_tcp = 0 |
char | AFNI_host [128] = "localhost" |
char | AFNI_iochan [128] = "\0" |
IOCHAN * | AFNI_ioc = NULL |
char | AFNI_buf [1024] |
int | AFNI_verbose = 0 |
char | AFNI_infocom [256] = "\0" |
Define Documentation
|
|
|
Definition at line 26 of file rtfeedme.c. Referenced by AFNI_start_io(). |
|
Definition at line 27 of file rtfeedme.c. Referenced by AFNI_start_io(), and main(). |
|
Definition at line 20 of file rtfeedme.c. Referenced by AFNI_start_io(). |
|
Definition at line 23 of file rtfeedme.c. Referenced by AFNI_start_io(), and main(). |
|
Definition at line 25 of file rtfeedme.c. Referenced by AFNI_start_io(). |
|
Definition at line 21 of file rtfeedme.c. Referenced by AFNI_start_io(). |
|
Definition at line 24 of file rtfeedme.c. Referenced by AFNI_start_io(). |
|
A negative return is bad news * Definition at line 236 of file rtfeedme.c. Referenced by main(). |
|
Definition at line 237 of file rtfeedme.c. Referenced by main(). |
|
Value: do { fprintf(stderr,"*** " ee ":%s and %s\n",argv[jarg],argv[jarg+cc]) ; \ exit(1) ; } while(0) |
|
Definition at line 9 of file rtfeedme.c. Referenced by main(). |
|
Definition at line 51 of file rtfeedme.c. |
Function Documentation
|
Definition at line 104 of file rtfeedme.c. References AFNI_buf, AFNI_CATCHUP_MODE, AFNI_CONTINUE_MODE, AFNI_CONTROL_PORT, AFNI_host, AFNI_infocom, AFNI_iochan, AFNI_mode, AFNI_OPEN_CONTROL_MODE, AFNI_OPEN_DATA_MODE, AFNI_TCP_PORT, AFNI_WAIT_CONTROL_MODE, iochan_clearcheck(), IOCHAN_CLOSE, iochan_init(), iochan_sendall(), iochan_sleep(), iochan_writecheck(), and RT_mega. Referenced by main().
00105 { 00106 int ii , jj ; 00107 00108 /***** Check for conditions in which to do nothing *****/ 00109 00110 if( AFNI_mode <= 0 || AFNI_mode == AFNI_CONTINUE_MODE ) return ; 00111 00112 /***** If we are at the first time in, 00113 try to open a control socket to talk to AFNI *****/ 00114 00115 if( AFNI_mode == AFNI_OPEN_CONTROL_MODE ){ 00116 00117 sprintf( AFNI_iochan , "tcp:%s:%d" , AFNI_host , AFNI_CONTROL_PORT ) ; 00118 00119 if( AFNI_verbose ) 00120 fprintf(stderr,"Opening control channel %s to AFNI.\n",AFNI_iochan) ; 00121 00122 AFNI_ioc = iochan_init( AFNI_iochan , "w" ) ; 00123 00124 if( AFNI_ioc == NULL ){ 00125 fprintf(stderr,"Can't open control channel %s to AFNI!\a\n",AFNI_iochan) ; 00126 #if 0 00127 AFNI_mode = 0 ; /* disable AFNI */ 00128 #endif 00129 return ; 00130 } else { 00131 if( AFNI_verbose ) fprintf(stderr,"Entering AFNI_WAIT_CONTROL_MODE.\n") ; 00132 AFNI_mode = AFNI_WAIT_CONTROL_MODE ; /* begin waiting for AFNI connection */ 00133 iochan_sleep(5) ; /* give other program a moment */ 00134 } 00135 } 00136 00137 /***** Check if the control socket is connected to AFNI *****/ 00138 00139 if( AFNI_mode == AFNI_WAIT_CONTROL_MODE ){ 00140 00141 ii = iochan_writecheck( AFNI_ioc , 1 ) ; /* Check; wait at most 1 msec */ 00142 00143 /** if ii == 0, then the channel is still pending, 00144 so do nothing; otherwise, take some action. **/ 00145 00146 if( ii < 0 ){ 00147 fprintf(stderr,"Control channel to AFNI failed!\a\n") ; 00148 IOCHAN_CLOSE(AFNI_ioc) ; 00149 AFNI_mode = 0 ; /* disable AFNI */ 00150 return ; 00151 } else if( ii > 0 ){ 00152 if( AFNI_verbose ) fprintf(stderr,"Control channel connected to AFNI." 00153 " Entering AFNI_OPEN_DATA_MODE.\n") ; 00154 AFNI_mode = AFNI_OPEN_DATA_MODE ; /* prepare to send data to AFNI */ 00155 } 00156 } 00157 00158 /***** Send the control information, which says 00159 how we will talk to AFNI in the future (shmem or TCP/IP), 00160 then close the control channel and open this new data channel *****/ 00161 00162 if( AFNI_mode == AFNI_OPEN_DATA_MODE ){ 00163 00164 /* decide name of data channel: it can be TCP/IP or shared memory */ 00165 00166 if( AFNI_use_tcp ) sprintf(AFNI_iochan,"tcp:%s:%d",AFNI_host,AFNI_TCP_PORT) ; 00167 else if( RT_mega ) sprintf(AFNI_iochan,"shm:grv:%dM",RT_mega) ; 00168 else sprintf(AFNI_iochan,"shm:grv:50K") ; /* 11 Dec 2002 */ 00169 00170 strcpy(AFNI_buf,AFNI_iochan) ; /* tell AFNI where to read data */ 00171 if( AFNI_infocom[0] != '\0' ){ 00172 strcat(AFNI_buf,"\n") ; 00173 strcat(AFNI_buf,AFNI_infocom) ; /* tell it where to get 3T info */ 00174 } 00175 00176 if( AFNI_verbose ) 00177 fprintf(stderr,"Sending control information to AFNI:\n%s\n",AFNI_buf) ; 00178 00179 ii = iochan_sendall( AFNI_ioc , AFNI_buf , strlen(AFNI_buf)+1 ) ; 00180 00181 /** A negative return is bad news **/ 00182 00183 if( ii < 0 ){ 00184 fprintf(stderr,"Transmission of control data to AFNI failed!\a\n") ; 00185 IOCHAN_CLOSE(AFNI_ioc) ; 00186 AFNI_mode = 0 ; 00187 return ; 00188 } else { 00189 while( ! iochan_clearcheck(AFNI_ioc,2) ) /* wait for control data to clear */ 00190 iochan_sleep(2) ; 00191 IOCHAN_CLOSE(AFNI_ioc) ; /* close control channel */ 00192 00193 if( AFNI_verbose ) 00194 fprintf(stderr,"Opening data channel %s to AFNI.\n",AFNI_iochan) ; 00195 00196 AFNI_ioc = iochan_init( AFNI_iochan , "w" ) ; /* open data channel */ 00197 if( AFNI_ioc == NULL ){ 00198 fprintf(stderr,"Can't open data channel %s to AFNI!\a\n",AFNI_iochan) ; 00199 AFNI_mode = 0 ; 00200 return ; 00201 } else { 00202 if( AFNI_verbose ) fprintf(stderr,"Entering AFNI_CATCHUP_MODE.\n") ; 00203 AFNI_mode = AFNI_CATCHUP_MODE ; 00204 iochan_sleep(5) ; /* give other program a moment */ 00205 } 00206 } 00207 } 00208 00209 /***** Wait for the data channel to be connected to AFNI, 00210 and then send any images that are reconstructed and ready to go *****/ 00211 00212 if( AFNI_mode == AFNI_CATCHUP_MODE ){ 00213 00214 ii = iochan_writecheck( AFNI_ioc , 1 ) ; /* wait at most 1 msec */ 00215 if( ii < 0 ){ 00216 fprintf(stderr,"AFNI data channel aborted before any data was sent!\a\n") ; 00217 IOCHAN_CLOSE( AFNI_ioc ) ; 00218 AFNI_mode = 0 ; 00219 return ; 00220 } else if( ii > 0 ){ /* can now send data to AFNI! */ 00221 if( AFNI_verbose ) 00222 fprintf(stderr,"AFNI data channel %s is connected.\n" 00223 "Entering AFNI_CONTINUE_MODE.\n" , AFNI_iochan) ; 00224 AFNI_mode = AFNI_CONTINUE_MODE ; 00225 } 00226 } 00227 00228 return ; 00229 } |
|
\** File : SUMA.c
Input paramters :
Definition at line 239 of file rtfeedme.c. References AFNI_CONTINUE_MODE, AFNI_host, AFNI_mode, AFNI_OPEN_CONTROL_MODE, AFNI_start_io(), AFNI_use_tcp, AFNI_verbose, argc, atexit(), COMMAND_MARKER, COMMAND_MARKER_LENGTH, COX_clock_time(), THD_3dim_dataset::daxes, DSET_ARRAY, DSET_BRICK_TYPE, DSET_delete, DSET_DX, DSET_DY, DSET_DZ, DSET_load, DSET_LOADED, DSET_NVALS, DSET_NX, DSET_NY, DSET_NZ, DSET_TIMEUNITS, DSET_TR, DSET_unload_one, free, iochan_clearcheck(), iochan_sendall(), iochan_sleep(), mainENTRY, malloc, MAX_CHAN, mri_datum_size(), mri_swap2(), ORIENT_OPPOSITE, RT_3D, RT_buf, RT_com, RT_dt, RT_exit(), RT_mega, RT_sigfunc(), RT_swap2, strtod(), THD_open_dataset(), TR, tt, UNITS_MSEC_TYPE, THD_dataxes::xxorg, THD_dataxes::xxorient, THD_dataxes::yyorg, THD_dataxes::yyorient, THD_dataxes::zzorg, and THD_dataxes::zzorient.
00240 { 00241 int iarg=1 , ii,tt,kk , nbytes , nbslice , ntran , nzfake=0 ; 00242 char *bar , *qar=NULL , *sar ; 00243 double start_time , left_time , xtime ; 00244 char *drive_afni[128] ; 00245 int ndrive=0 ; 00246 int num_chan , cur_chan , cc ; 00247 char *note[128] ; /* 02 Oct 2002 */ 00248 int num_note=0 ; 00249 int num_start=0 , jarg , bwait ; /* 11 Dec 2002 */ 00250 float gyr=0.0 ; /* 29 Jan 2004 */ 00251 00252 /*-- help the ignorant user --*/ 00253 00254 if( argc < 2 || strcmp(argv[1],"-help") == 0 ){ 00255 printf( 00256 "Usage: rtfeedme [options] dataset [dataset ...]\n" 00257 "Test the real-time plugin by sending all the bricks in 'dataset' to AFNI.\n" 00258 " * 'dataset' may include a sub-brick selector list.\n" 00259 " * If more than one dataset is given, multiple channel acquisition\n" 00260 " will be simulated. Each dataset must then have the same datum\n" 00261 " and dimensions.\n" 00262 " * If you put the flag '-break' between datasets, then the datasets\n" 00263 " in each group will be transmitted in parallel, but the groups\n" 00264 " will be transmitted serially (one group, then another, etc.).\n" 00265 " + For example:\n" 00266 " rtfeedme A+orig B+orig -break C+orig -break D+orig\n" 00267 " will send the A and B datasets in parallel, then send\n" 00268 " the C dataset separately, then send the D dataset separately.\n" 00269 " (That is, there will be 3 groups of datasets.)\n" 00270 " + There is a 1 second delay between the end transmission for\n" 00271 " a group and the start transmission for the next group.\n" 00272 " + You can extend the inter-group delay by using a break option\n" 00273 " of the form '-break_20' to indicate a 20 second delay.\n" 00274 " + Within a group, each dataset must have the same datum and\n" 00275 " same x,y,z,t dimensions. (Different groups don't need to\n" 00276 " be conformant to each other.)\n" 00277 " + All the options below apply to each group of datasets;\n" 00278 " i.e., they will all get the same notes, drive commands, ....\n" 00279 "\n" 00280 "Options:\n" 00281 " -host sname = Send data, via TCP/IP, to AFNI running on the\n" 00282 " computer system 'sname'. By default, uses the\n" 00283 " current system, and transfers data using shared\n" 00284 " memory. To send on the current system using\n" 00285 " TCP/IP, use the system 'localhost'.\n" 00286 "\n" 00287 " -dt ms = Tries to maintain an inter-transmit interval of\n" 00288 " 'ms' milliseconds. The default is to send data\n" 00289 " as fast as possible.\n" 00290 "\n" 00291 " -3D = Sends data in 3D bricks. By default, sends in\n" 00292 " 2D slices.\n" 00293 "\n" 00294 " -buf m = When using shared memory, sets the interprocess\n" 00295 " communications buffer to 'm' megabytes. Has no\n" 00296 " effect if using TCP/IP. Default is m=1.\n" 00297 " If you use m=0, then a 50 Kbyte buffer is used.\n" 00298 "\n" 00299 " -verbose = Be talkative about actions.\n" 00300 " -swap2 = Swap byte pairs before sending data.\n" 00301 "\n" 00302 " -nzfake nz = Send 'nz' as the value of nzz (for debugging).\n" 00303 "\n" 00304 " -drive cmd = Send 'cmd' as a DRIVE_AFNI command; e.g.,\n" 00305 " -drive 'OPEN_WINDOW A.axialimage'\n" 00306 " If cmd contains blanks, it must be in 'quotes'.\n" 00307 " Multiple -drive options may be used.\n" 00308 "\n" 00309 " -note sss = Send 'sss' as a NOTE to the realtime plugin.\n" 00310 " Multiple -note options may be used.\n" 00311 "\n" 00312 " -gyr v = Send value 'v' as the y-range for realtime motion\n" 00313 " estimation graphing.\n" 00314 ) ; 00315 exit(0) ; 00316 } 00317 00318 mainENTRY("rtfeedme") ; 00319 00320 /*-- scan arguments --*/ 00321 00322 while( iarg < argc && argv[iarg][0] == '-' ){ 00323 00324 if( strcmp(argv[iarg],"-gyr") == 0 ){ /* 29 Jan 2004 */ 00325 gyr = strtod( argv[++iarg] , NULL ) ; 00326 iarg++ ; continue ; 00327 } 00328 00329 if( strcmp(argv[iarg],"-drive") == 0 ){ /* 30 Jul 2002 */ 00330 drive_afni[ndrive++] = argv[++iarg] ; 00331 iarg++ ; continue ; 00332 } 00333 00334 if( strcmp(argv[iarg],"-note") == 0 ){ /* 02 Oct 2002 */ 00335 note[num_note++] = argv[++iarg] ; 00336 iarg++ ; continue ; 00337 } 00338 00339 if( strcmp(argv[iarg],"-nzfake") == 0 ){ 00340 nzfake = (int) strtod( argv[++iarg] , NULL ) ; 00341 iarg++ ; continue ; 00342 } 00343 00344 if( strcmp(argv[iarg],"-buf") == 0 ){ 00345 RT_mega = (int) strtod( argv[++iarg] , NULL ) ; 00346 if( RT_mega < 0 ){ 00347 fprintf(stderr,"*** Illegal value after -buf\n") ; exit(1) ; 00348 } 00349 iarg++ ; continue ; 00350 } 00351 00352 if( strcmp(argv[iarg],"-host") == 0 ){ 00353 strcpy( AFNI_host , argv[++iarg] ) ; 00354 AFNI_use_tcp = 1 ; 00355 iarg++ ; continue ; 00356 } 00357 00358 if( strcmp(argv[iarg],"-dt") == 0 ){ 00359 RT_dt = strtod( argv[++iarg] , NULL ) * 0.001 ; 00360 iarg++ ; continue ; 00361 } 00362 00363 if( strcmp(argv[iarg],"-3D") == 0 ){ 00364 RT_3D = 1 ; 00365 iarg++ ; continue ; 00366 } 00367 00368 if( strcmp(argv[iarg],"-swap2") == 0 ){ 00369 RT_swap2 = 1 ; 00370 iarg++ ; continue ; 00371 } 00372 00373 if( strcmp(argv[iarg],"-verbose") == 0 ){ 00374 AFNI_verbose = 1 ; 00375 iarg++ ; continue ; 00376 } 00377 00378 fprintf(stderr,"*** Unrecognized option: %s\n",argv[iarg]) ; 00379 exit(1) ; 00380 } 00381 00382 /*-- this stuff is one-time-only setup of the I/O to AFNI --*/ 00383 00384 atexit(RT_exit) ; /* call this when program ends */ 00385 AFNI_mode = AFNI_OPEN_CONTROL_MODE ; /* mode in which to start I/O */ 00386 00387 signal(SIGINT ,RT_sigfunc) ; /* setup signal handler */ 00388 signal(SIGBUS ,RT_sigfunc) ; /* for fatal errors */ 00389 signal(SIGSEGV,RT_sigfunc) ; 00390 signal(SIGTERM,RT_sigfunc) ; 00391 00392 /*------ 11 Dec 2002: after a -break, will jump back here ------*/ 00393 00394 Restart: 00395 00396 /*-- count datasets up to end of argv or next -break --*/ 00397 00398 jarg = iarg ; /* keep track of where we are starting */ 00399 num_chan = 0 ; 00400 for( ; iarg < argc && strncmp(argv[iarg],"-break",6) != 0 ; iarg++ ) num_chan++; 00401 if( num_chan == 0 ){ 00402 fprintf(stderr,"*** No more datasets! Free, free, free at last!\n"); exit(0); 00403 } 00404 if( num_chan > MAX_CHAN ){ 00405 fprintf(stderr,"*** Too many datasets on command line!\n"); exit(1); 00406 } 00407 00408 /*-- skip any -break's for when we loop back to Restart --*/ 00409 00410 for( ; iarg < argc && strncmp(argv[iarg],"-break",6) == 0 ; iarg++ ) ; /* nada */ 00411 00412 /* check for delay in the form of "-break_XXX" where XXX = # sec to wait */ 00413 00414 bwait = 1 ; 00415 if( iarg < argc && strncmp(argv[iarg-1],"-break_",7) == 0 ){ 00416 bwait = strtol( argv[iarg-1]+7 , NULL , 10 ) ; 00417 } 00418 if( bwait < 0 ) bwait = 1 ; 00419 00420 num_start++ ; /* number of times we've been here */ 00421 00422 /*-- read the input dataset(s) and check them for OK-ositiness --*/ 00423 00424 for( cc=0 ; cc < num_chan ; cc++ ){ 00425 00426 RT_dset[cc] = THD_open_dataset( argv[jarg+cc] ) ; 00427 00428 if( RT_dset[cc] == NULL ){ 00429 fprintf(stderr,"*** Can't open dataset %s\n",argv[jarg+cc]); exit(1); 00430 } 00431 00432 if( cc > 0 ){ /* check for compatibility with #0 */ 00433 00434 #define ERREX(ee) \ 00435 do { fprintf(stderr,"*** " ee ":%s and %s\n",argv[jarg],argv[jarg+cc]) ; \ 00436 exit(1) ; } while(0) 00437 00438 if( DSET_NX (RT_dset[0]) != DSET_NX (RT_dset[cc]) ) ERREX("nx mismatch") ; 00439 if( DSET_NY (RT_dset[0]) != DSET_NY (RT_dset[cc]) ) ERREX("ny mismatch") ; 00440 if( DSET_NZ (RT_dset[0]) != DSET_NZ (RT_dset[cc]) ) ERREX("nz mismatch") ; 00441 00442 if( DSET_NVALS(RT_dset[0]) != DSET_NVALS(RT_dset[cc]) ) ERREX("nvals mismatch"); 00443 00444 if( DSET_BRICK_TYPE(RT_dset[0],0) != DSET_BRICK_TYPE(RT_dset[cc],0) ) 00445 ERREX("datum mismatch"); 00446 } 00447 00448 /* load from disk */ 00449 00450 DSET_load(RT_dset[cc]) ; 00451 if( !DSET_LOADED(RT_dset[cc]) ){ 00452 fprintf(stderr,"*** Can't load dataset %s\n",argv[jarg+cc]); exit(1); 00453 } 00454 } /* end of loop over channels (datasets to send in parallel) */ 00455 00456 /*-- initiate communications with AFNI --*/ 00457 00458 if( AFNI_verbose ) fprintf(stderr,"--- Starting I/O to AFNI\n") ; 00459 00460 AFNI_start_io() ; 00461 00462 ii = 1 ; 00463 while( AFNI_mode > 0 && AFNI_mode != AFNI_CONTINUE_MODE && ii < 1000 ){ 00464 iochan_sleep( 300 ) ; /* 300 msec wait */ 00465 AFNI_start_io() ; 00466 ii++ ; 00467 } 00468 00469 if( AFNI_mode != AFNI_CONTINUE_MODE ){ 00470 fprintf(stderr,"\n*** Can't connect to AFNI?!\n") ; exit(1) ; 00471 } 00472 00473 if( AFNI_verbose ) 00474 fprintf(stderr,"\n--- Connection to AFNI is ready after %d tries\n",ii) ; 00475 00476 /*-- Send dataset control information --*/ 00477 00478 #define ADDTO_BUF ( strcat(RT_buf,RT_com) , strcat(RT_buf,"\n") ) 00479 00480 RT_buf[0] = '\0' ; /* string to hold commands to AFNI realtime plugin */ 00481 00482 /*** Number of channels [Aug 2002] ***/ 00483 00484 if( num_chan > 1 ){ /* default is 1 channel */ 00485 sprintf(RT_com,"NUM_CHAN %d",num_chan) ; 00486 ADDTO_BUF ; 00487 } 00488 00489 /*** How the data will be sent ***/ 00490 00491 strcpy(RT_com,"ACQUISITION_TYPE ") ; 00492 if( DSET_NVALS(RT_dset[0]) == 1 ){ 00493 if( RT_3D ) strcat(RT_com,"3D") ; /* 1 3D array, all at once */ 00494 else strcat(RT_com,"2D+z") ; /* 1 3D array, by slices */ 00495 } else { 00496 if( RT_3D ) strcat(RT_com,"3D+t") ; /* multi 3D arrays, each all at once */ 00497 else strcat(RT_com,"2D+zt") ; /* multi 3D arrays, each by slices */ 00498 } 00499 ADDTO_BUF ; 00500 00501 /*** Time step, if needed ***/ 00502 00503 if( DSET_NVALS(RT_dset[0]) > 1 && DSET_TR(RT_dset[0]) > 0.0 ){ 00504 float TR = DSET_TR(RT_dset[0]) ; 00505 if( DSET_TIMEUNITS(RT_dset[0]) == UNITS_MSEC_TYPE ) TR *= 0.001 ; 00506 sprintf( RT_com , "TR %f" , TR ) ; 00507 ADDTO_BUF ; 00508 } 00509 00510 /*** Volume dimensions ***/ 00511 00512 sprintf( RT_com, "XYFOV %f %f %f", fabs(DSET_DX(RT_dset[0]) * DSET_NX(RT_dset[0])) , 00513 fabs(DSET_DY(RT_dset[0]) * DSET_NY(RT_dset[0])) , 00514 fabs(DSET_DZ(RT_dset[0]) * DSET_NZ(RT_dset[0])) ) ; 00515 ADDTO_BUF ; 00516 00517 /*** Matrix sizes ***/ 00518 00519 if( nzfake <= 0 ){ 00520 sprintf( RT_com , "XYMATRIX %d %d %d" , DSET_NX(RT_dset[0]) , 00521 DSET_NY(RT_dset[0]) , 00522 DSET_NZ(RT_dset[0]) ) ; 00523 ADDTO_BUF ; 00524 } else { 00525 sprintf( RT_com , "XYMATRIX %d %d" , DSET_NX(RT_dset[0]) , 00526 DSET_NY(RT_dset[0]) ) ; 00527 ADDTO_BUF ; 00528 sprintf( RT_com , "ZNUM %d" , nzfake ) ; 00529 ADDTO_BUF ; 00530 } 00531 00532 /*** Data type ***/ 00533 00534 sprintf( RT_com, "DATUM %s", MRI_TYPE_name[DSET_BRICK_TYPE(RT_dset[0],0)] ) ; 00535 ADDTO_BUF ; 00536 00537 /*** Slice order ***/ 00538 00539 if( ! RT_3D ){ /* this cheapo program always */ 00540 strcpy( RT_com , "ZORDER seq" ) ; /* send slices in sequential order */ 00541 ADDTO_BUF ; /* unlike their true acquisition */ 00542 } 00543 00544 /*** Axes orientation [e.g., RAI] ***/ 00545 00546 sprintf( RT_com , "XYZAXES %s %s %s" , 00547 ORIENT_shortstr[ RT_dset[0]->daxes->xxorient ] , 00548 ORIENT_shortstr[ RT_dset[0]->daxes->yyorient ] , 00549 ORIENT_shortstr[ RT_dset[0]->daxes->zzorient ] ) ; 00550 ADDTO_BUF ; 00551 00552 /*** Axes offsets [11 Dec 2002] ***/ 00553 00554 { float xorg,yorg,zorg ; 00555 int xorc,yorc,zorc ; 00556 00557 xorg = RT_dset[0]->daxes->xxorg ; 00558 yorg = RT_dset[0]->daxes->yyorg ; 00559 zorg = RT_dset[0]->daxes->zzorg ; 00560 00561 xorc = RT_dset[0]->daxes->xxorient ; 00562 yorc = RT_dset[0]->daxes->yyorient ; 00563 zorc = RT_dset[0]->daxes->zzorient ; 00564 00565 if( ORIENT_sign[xorc] == '+' ) xorc = ORIENT_OPPOSITE(xorc) ; 00566 if( ORIENT_sign[yorc] == '+' ) yorc = ORIENT_OPPOSITE(yorc) ; 00567 if( ORIENT_sign[zorc] == '+' ) zorc = ORIENT_OPPOSITE(zorc) ; 00568 00569 sprintf( RT_com , "XYZFIRST %g%c %g%c %g%c" , 00570 xorg , ORIENT_first[xorc] , 00571 yorg , ORIENT_first[yorc] , 00572 zorg , ORIENT_first[zorc] ) ; 00573 ADDTO_BUF ; 00574 } 00575 00576 /*** DRIVE_AFNI commands [Jul 2002] ***/ 00577 00578 for( ii=0 ; ii < ndrive ; ii++ ){ 00579 sprintf( RT_com , "DRIVE_AFNI %s" , drive_afni[ii] ) ; 00580 ADDTO_BUF ; 00581 } 00582 00583 /*** NOTE commands [02 Oct 2002] ***/ 00584 00585 for( ii=0 ; ii < num_note ; ii++ ){ 00586 sprintf( RT_com , "NOTE %s" , note[ii] ) ; 00587 ADDTO_BUF ; 00588 } 00589 00590 /*** GRAPH range commands [29 Jan 2004] ***/ 00591 00592 if( DSET_NVALS(RT_dset[0]) > 9 ){ 00593 sprintf( RT_com , "GRAPH_XRANGE %d" , DSET_NVALS(RT_dset[0]) ) ; 00594 ADDTO_BUF ; 00595 if( gyr > 0.0 ){ 00596 sprintf( RT_com , "GRAPH_YRANGE %.2f" , gyr ) ; 00597 ADDTO_BUF ; 00598 } 00599 } 00600 00601 /*** send metadata buffer to AFNI ***/ 00602 00603 if( AFNI_verbose ) 00604 fprintf(stderr,"--- Dataset control info for AFNI:\n%s",RT_buf) ; 00605 00606 ii = iochan_sendall( AFNI_ioc , RT_buf , strlen(RT_buf)+1 ) ; 00607 if( ii < 0 ){ 00608 fprintf(stderr,"*** Error sending dataset control info to AFNI\n") ; 00609 exit(1) ; 00610 } 00611 00612 iochan_sleep(128) ; /* let AFNI digest the results for a while */ 00613 00614 /*-- compute number of bytes per slice, and per image transmission --*/ 00615 00616 nbslice = nbytes = mri_datum_size( DSET_BRICK_TYPE(RT_dset[0],0) ) 00617 * DSET_NX(RT_dset[0]) * DSET_NY(RT_dset[0]) ; 00618 00619 if( RT_3D ) nbytes *= DSET_NZ(RT_dset[0]) ; 00620 00621 if( qar != NULL ) free(qar) ; /* free old workspace */ 00622 qar = (char *) malloc( sizeof(char) * nbytes ) ; /* make new workspace */ 00623 if( qar == NULL ){ 00624 fprintf(stderr,"*** Can't malloc workspace!\n"); exit(1); 00625 } 00626 00627 /*--- send slices or volumes to AFNI ---*/ 00628 00629 xtime = COX_clock_time() ; /* keep track of elapsed time */ 00630 00631 ntran = DSET_NVALS(RT_dset[0]) * num_chan ; /* number of transmissions: */ 00632 if( !RT_3D ) ntran *= DSET_NZ(RT_dset[0]) ; /* volumes or slices */ 00633 00634 for( tt=0 ; tt < DSET_NVALS(RT_dset[0]) ; tt++ ){ /* loop over time points */ 00635 00636 if( RT_3D ){ /** send 3D arrays **/ 00637 00638 for( cc=0 ; cc < num_chan ; cc++ ){ /* loop over channels (datasets) */ 00639 00640 bar = DSET_ARRAY(RT_dset[cc],tt) ; /* array to send */ 00641 00642 if( AFNI_verbose ) 00643 fprintf(stderr,"--- Sending brick %d, channel %02d\n",tt,cc+1) ; 00644 00645 if( RT_dt > 0.0 ) start_time = COX_clock_time() ; 00646 00647 sar = bar ; 00648 if( RT_swap2 ){ /* swap bytes? */ 00649 memcpy(qar,sar,nbytes) ; sar = qar ; 00650 mri_swap2( nbytes/2 , (short *) sar ) ; 00651 } 00652 00653 /* send the whole 3D array (sar points to data to transmit) */ 00654 00655 ii = iochan_sendall( AFNI_ioc , sar , nbytes ) ; 00656 if( ii < 0 ){ 00657 fprintf(stderr, 00658 "*** Error sending brick %d, channel %02d, to AFNI\n", 00659 tt,cc+1) ; 00660 exit(1) ; 00661 } 00662 00663 /* maybe wait for prescribed transmission time */ 00664 00665 if( RT_dt > 0.0 ){ 00666 left_time = RT_dt - ( COX_clock_time() - start_time ) ; 00667 if( left_time >= 0.001 ){ 00668 ii = (int) (1000.0 * left_time) ; /* number of milliseconds */ 00669 iochan_sleep( ii ) ; 00670 } 00671 } 00672 } /* end of loop over channels */ 00673 00674 /** send 2D slices from each channel in turn **/ 00675 00676 } else { 00677 00678 for( kk=0 ; kk < DSET_NZ(RT_dset[0]) ; kk++ ){ /* loop over slices */ 00679 for( cc=0 ; cc < num_chan ; cc++ ){ /* loop over channels */ 00680 00681 bar = DSET_ARRAY(RT_dset[cc],tt) ; /* 3D array to get slice from */ 00682 00683 if( AFNI_verbose ) 00684 fprintf(stderr,"--- Sending brick %d, slice %d, channel %02d\n", 00685 tt,kk,cc+1) ; 00686 00687 if( RT_dt > 0.0 ) start_time = COX_clock_time() ; 00688 00689 sar = bar+(kk*nbslice) ; /* pointer to start of slice data */ 00690 00691 if( RT_swap2 ){ /* byte swapping */ 00692 memcpy(qar,sar,nbslice) ; sar = qar ; 00693 mri_swap2( nbslice/2 , (short *) sar ) ; 00694 } 00695 00696 /* send slice data */ 00697 00698 ii = iochan_sendall( AFNI_ioc , sar , nbslice ) ; 00699 00700 if( ii < 0 ){ 00701 fprintf(stderr, 00702 "*** Error sending slice brick %d, slice %d, channel %02d to AFNI\n", 00703 tt,kk,cc+1) ; 00704 exit(1) ; 00705 } 00706 00707 if( RT_dt > 0.0 ){ /* wait for prescribed transmission time */ 00708 left_time = RT_dt - ( COX_clock_time() - start_time ) ; 00709 if( left_time >= 0.001 ){ 00710 ii = (int) (1000.0 * left_time) ; 00711 iochan_sleep( ii ) ; 00712 } 00713 } 00714 00715 } /* end of loop over channels */ 00716 } /* end of loop over slices */ 00717 00718 } /* end of if 3D or 2D transmissions */ 00719 00720 /** unload dataset bricks we just sent **/ 00721 00722 for( cc=0 ; cc < num_chan ; cc++ ) 00723 DSET_unload_one( RT_dset[cc] , tt ) ; 00724 00725 } /* end of loop over time points */ 00726 00727 /*-- cleanup --*/ 00728 00729 xtime = COX_clock_time() - xtime ; /* total transmit time */ 00730 00731 for( cc=0 ; cc < num_chan ; cc++ ) /* unload all datasets */ 00732 DSET_delete( RT_dset[cc] ) ; 00733 00734 /* make sure all data is transmitted to AFNI */ 00735 00736 if( AFNI_verbose ) fprintf(stderr,"--- Clearing buffer") ; 00737 iochan_sleep(100) ; 00738 while( ! iochan_clearcheck(AFNI_ioc,100) ){ 00739 if( AFNI_verbose ) fprintf(stderr,".") ; 00740 } 00741 if( AFNI_verbose ) fprintf(stderr,"\n") ; 00742 00743 fprintf(stderr, 00744 "--- Elapsed transmit time = %f s (%f per transmit)\n", 00745 xtime,xtime/ntran) ; 00746 00747 /*-- If we are going to restart, send the end-of-input message. --*/ 00748 /*-- Note that an entire image must be sent with this message. --*/ 00749 00750 if( iarg < argc ){ 00751 fprintf(stderr,"--- Restarting after '-break'\n") ; 00752 memcpy( qar , COMMAND_MARKER , COMMAND_MARKER_LENGTH ) ; 00753 iochan_sendall( AFNI_ioc , qar , nbytes ) ; 00754 iochan_sleep(1000*bwait) ; /* let AFNI meditate on that for a while */ 00755 goto Restart ; 00756 } 00757 00758 /*-- Otherwise, quit. --*/ 00759 00760 exit(0) ; 00761 } |
|
Definition at line 56 of file rtfeedme.c. References iochan_close(). Referenced by main().
00057 { /* the AFNI data channels get closed. */ 00058 fprintf(stderr,"*** RT_exit: closing data channel to AFNI\n") ; 00059 iochan_close(AFNI_ioc) ; 00060 return ; 00061 } |
|
signal handler for fatal errors * Definition at line 67 of file rtfeedme.c. Referenced by main().
00068 { 00069 char * sname ; 00070 static volatile int fff=0 ; 00071 if( fff ) _exit(1) ; else fff = 1 ; 00072 switch(sig){ 00073 default: sname = "unknown" ; break ; 00074 case SIGINT: sname = "SIGINT" ; break ; 00075 case SIGPIPE: sname = "SIGPIPE" ; break ; 00076 case SIGSEGV: sname = "SIGSEGV" ; break ; 00077 case SIGBUS: sname = "SIGBUS" ; break ; 00078 case SIGTERM: sname = "SIGTERM" ; break ; 00079 } 00080 fprintf(stderr,"\n*** Fatal Signal %d (%s) received\n",sig,sname) ; 00081 exit(1) ; 00082 } |
|
|
Variable Documentation
|
Definition at line 36 of file rtfeedme.c. Referenced by AFNI_start_io(). |
|
Definition at line 33 of file rtfeedme.c. Referenced by AFNI_start_io(), and main(). |
|
Definition at line 39 of file rtfeedme.c. Referenced by AFNI_start_io(). |
|
Definition at line 35 of file rtfeedme.c. |
|
Definition at line 34 of file rtfeedme.c. Referenced by AFNI_start_io(). |
|
Definition at line 31 of file rtfeedme.c. Referenced by AFNI_start_io(), and main(). |
|
Definition at line 32 of file rtfeedme.c. Referenced by main(). |
|
Definition at line 37 of file rtfeedme.c. Referenced by main(). |
|
Definition at line 13 of file rtfeedme.c. Referenced by main(). |
|
Definition at line 15 of file rtfeedme.c. Referenced by main(). |
|
Definition at line 15 of file rtfeedme.c. Referenced by main(). |
|
Definition at line 11 of file rtfeedme.c. |
|
Definition at line 12 of file rtfeedme.c. Referenced by main(). |
|
Definition at line 16 of file rtfeedme.c. Referenced by AFNI_start_io(), and main(). |
|
Definition at line 14 of file rtfeedme.c. Referenced by main(). |