diff --git a/src/mx_stream/mx_fe.c b/src/mx_stream/mx_fe.c index 39b1a67986c7cac722f49a3616f9e0a3ba4474e4..3d6215600b18af6e188b20583638e3aaeffe2e04 100644 --- a/src/mx_stream/mx_fe.c +++ b/src/mx_stream/mx_fe.c @@ -4,24 +4,16 @@ //// // -#include <ctype.h> #include <stdio.h> #include <string.h> #include <stdlib.h> -#include <malloc.h> #include <signal.h> #include <unistd.h> -#include <sys/ioctl.h> #include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> #include <stdlib.h> #include "../drv/crc.c" -#include "../include/daqmap.h" -#include "../include/drv/fb.h" #include "../include/daq_core.h" -#include "../drv/gpstime/gpstime.h" #include "myriexpress.h" #include "mx_extensions.h" #include <pthread.h> @@ -46,7 +38,7 @@ MX_MUTEX_T stream_mutex; #define DFLT_ITER 1000 #define NUM_RREQ 16 /* currently constrained by MX_MCP_RDMA_HANDLES_CNT*/ #define NUM_SREQ 256 /* currently constrained by MX_MCP_RDMA_HANDLES_CNT*/ -#define MSG_BUF_SIZE 0x200000 +#define MSG_BUF_SIZE sizeof(daq_dc_data_t) #define DO_HANDSHAKE 0 #define MATCH_VAL_MAIN (1 << 31) @@ -54,9 +46,6 @@ MX_MUTEX_T stream_mutex; #define __CDECL -static struct rmIpcStr *shmIpcPtr[128]; -static char *shmDataPtr[128]; -static struct cdsDaqNetGdsTpNum *shmTpTable[128]; static const int header_size = sizeof(struct daq_multi_dcu_header_t); static const int buf_size = DAQ_DCU_BLOCK_SIZE * 2; int modelrates[DAQ_TRANSIT_MAX_DCU]; @@ -68,17 +57,14 @@ char *zbuffer; extern void *findSharedMemory(char *); extern void *findSharedMemorySize(char *,int); -char modelnames[DAQ_TRANSIT_MAX_DCU][64]; -char *sysname; int do_verbose = 0; static volatile int keepRunning = 1; -char *ifo; -char *ifo_data; -size_t cycle_data_size; +char *ifo = 0; +char *ifo_data = 0; +size_t cycle_data_size = 0; char msg_buffer[MSG_BUF_SIZE]; -int symmetricom_fd = -1; int daqStatBit[2]; @@ -89,10 +75,9 @@ int daqStatBit[2]; void Usage() { - fprintf(stderr,"Usage of mx_fe:\n"); + fprintf(stderr,"Usage of omx_xmit:\n"); fprintf(stderr,"mx_fe -s <models> <OPTIONS>\n"); - fprintf(stderr," -b <buffer> : Name of the mbuf to concentrate the data to locally (defaults to ifo)\n"); - fprintf(stderr," -s <value> : Name of FE control models\n"); + fprintf(stderr," -b <buffer> : Name of the mbuf to read local data from (defaults to local_dc)\n"); fprintf(stderr," -m <value> : Local memory buffer size in megabytes\n"); fprintf(stderr," -l <filename> : log file name\n"); fprintf(stderr," -v 1 : Enable verbose output\n"); @@ -106,78 +91,40 @@ void Usage() fprintf(stderr,"\n"); } -// ********************************************************************************************** -/// Get current GPS time from the symmetricom IRIG-B card -unsigned long -symm_gps_time(unsigned long *frac, int *stt) { - unsigned long t[3]; - - ioctl (symmetricom_fd, IOCTL_SYMMETRICOM_TIME, &t); - t[1] *= 1000; - t[1] += t[2]; - if (frac) *frac = t[1]; - if (stt) *stt = 0; - return t[0]; +/** + * @brief Set the cycle counter to an invalid value. + * @param header pointer to the input block header + * @note Used to force a resync of the counter. + */ +void +reset_cycle_counter( volatile daq_multi_cycle_header_t* header ) +{ + header->curCycle = 0x50505050; } -// ******************************************************************************* -/// See if the GPS card is locked. +/** + * @brief wait until the data in the input shared mem buffer has the + * @param header pointer to the input block header + * requested cycle counter. + * + * @returns non-zero if it we timeout + */ int -symm_ok() { - unsigned long req = 0; - ioctl (symmetricom_fd, IOCTL_SYMMETRICOM_STATUS, &req); - fprintf(stderr,"Symmetricom status: %s\n", req? "LOCKED": "UNCLOCKED"); - return req; -} - -// ******************************************************************************* -// Wait for data ready from FE models -// ******************************************************************************* -int -waitNextCycle2( int nsys, - unsigned int cyclereq, // Cycle to wait for - int reset, // Request to reset model ipc shared memory - int dataRdy[], - struct rmIpcStr *ipcPtr[]) // Pointer to IOP IPC shared memory +wait_for_cycle( volatile daq_multi_cycle_header_t* header, + unsigned int requested_cycle ) { -int iopRunning = 0; -int ii; -int threads_rdy = 0; -int timeout = 0; - - // if reset, want to set all models cycle counters to impossible number - // this takes care of uninitialized or stopped models - if (reset) - { - for (ii = 0; ii < nsys; ++ii) - { - ipcPtr[ii]->cycle = 50; - } - } - usleep(1000); - // Wait until received data from at least 1 FE or timeout - do { - usleep(2000); - if(ipcPtr[0]->cycle == cyclereq) - { - iopRunning = 1; - dataRdy[0] = 1; - } - timeout += 1; - }while(!iopRunning && timeout < 500); + int timeout = 0; - // Wait until data received from everyone or timeout - timeout = 0; - do { - usleep(100); - for(ii=1;ii<nsys;ii++) { - if(ipcPtr[ii]->cycle == cyclereq && !dataRdy[ii]) threads_rdy ++; - if(ipcPtr[ii]->cycle == cyclereq) dataRdy[ii] = 1; + do + { + usleep( 2000 ); + if ( header->curCycle == requested_cycle ) + { + return 0; } - timeout += 1; - }while(threads_rdy < nsys && timeout < 20); - - return(iopRunning); + ++timeout; + } while ( timeout < 500 ); + return 1; } // ********************************************************************************************** @@ -192,9 +139,9 @@ void print_diags(int nsys, int lastCycle, int sendLength, daq_multi_dcu_data_t * unsigned long sym_gps_sec = 0; unsigned long sym_gps_nsec = 0; - sym_gps_sec = symm_gps_time(&sym_gps_nsec, 0); // Print diags in verbose mode - fprintf(stderr,"\nTime = %d-%d size = %d\n",shmIpcPtr[0]->bp[lastCycle].timeSec,shmIpcPtr[0]->bp[lastCycle].timeNSec,sendLength); + fprintf(stderr,"\nTime = %d-%d size = %d\n",ixDataBlock->header.dcuheader[0].timeSec, + ixDataBlock->header.dcuheader[0].timeNSec,sendLength); fprintf(stderr,"Sym gps = %d-%d (time received)\n", (int)sym_gps_sec, (int)sym_gps_nsec); fprintf(stderr,"\tCycle = "); for(ii=0;ii<nsys;ii++) fprintf(stderr,"\t\t%d",ixDataBlock->header.dcuheader[ii].cycle); @@ -209,178 +156,27 @@ void print_diags(int nsys, int lastCycle, int sendLength, daq_multi_dcu_data_t * fprintf(stderr,"\n\tTPSize = "); for(ii=0;ii<nsys;ii++) fprintf(stderr,"\t\t%d",ixDataBlock->header.dcuheader[ii].tpBlockSize); fprintf(stderr,"\n\tXmitSize = "); - for(ii=0;ii<nsys;ii++) fprintf(stderr,"\t\t%d",shmIpcPtr[ii]->dataBlockSize); + for(ii=0;ii<nsys;ii++) fprintf(stderr,"\t\t%d",ixDataBlock->header.fullDataBlockSize); fprintf(stderr,"\n\n "); } -// ********************************************************************************************** -// Get control model loop rates from GDS param files -// Needed to properly size TP data into the data stream -int getmodelrate( int *rate, int *dcuid, char *modelname, char *gds_tp_dir) { - char gdsfile[128]; - int ii = 0; - FILE *f = 0; - char *token = 0; - char *search = "="; - char line[80]; - char *s = 0; - char *s1 = 0; - - if (gds_tp_dir) { - sprintf(gdsfile, "%s/tpchn_%s.par", gds_tp_dir, modelname); - } else { - /// Need to get IFO and SITE info from environment variables. - s = getenv("IFO"); - for (ii = 0; s[ii] != '\0'; ii++) { - if (isupper(s[ii])) s[ii] = (char) tolower(s[ii]); - } - s1 = getenv("SITE"); - for (ii = 0; s1[ii] != '\0'; ii++) { - if (isupper(s1[ii])) s1[ii] = (char) tolower(s1[ii]); - } - sprintf(gdsfile, "/opt/rtcds/%s/%s/target/gds/param/tpchn_%s.par", s1, s, modelname); - } - f = fopen(gdsfile, "rt"); - if (!f) return 0; - while(fgets(line,80,f) != NULL) { - line[strcspn(line, "\n")] = 0; - if (strstr(line, "datarate") != NULL) { - token = strtok(line, search); - token = strtok(NULL, search); - if (!token) continue; - while (*token && *token == ' ') { - ++token; - } - *rate = atoi(token); - break; - } - } - fclose(f); - f = fopen(gdsfile, "rt"); - if (!f) return 0; - while(fgets(line,80,f) != NULL) { - line[strcspn(line, "\n")] = 0; - if (strstr(line, "rmid") != NULL) { - token = strtok(line, search); - token = strtok(NULL, search); - if (!token) continue; - while (*token && *token == ' ') { - ++token; - } - *dcuid = atoi(token); - break; - } - } - fclose(f); - - return 0; -} - - -// ********************************************************************************************** -int loadMessageBuffer( int nsys, - int lastCycle, - int status, - int dataRdy[] - ) -{ - int sendLength = 0; - int ii; - int dataXferSize; - char *dataBuff; - int myCrc = 0; - int crcLength = 0; - - // Set pointer to 0MQ message data block - zbuffer = (char *)&ixDataBlock->dataBlock[0]; - // Initialize data send length to size of message header - sendLength = header_size; - // Set number of FE models that have data in this message - ixDataBlock->header.fullDataBlockSize = 0; - int db = 0; - // Loop thru all FE models - for (ii=0;ii<nsys;ii++) { - if(dataRdy[ii]) { - // Set heartbeat monitor for return to DAQ software - if (lastCycle == 0) shmIpcPtr[ii]->reqAck ^= daqStatBit[0]; - // Set DCU ID in header - ixDataBlock->header.dcuheader[db].dcuId = shmIpcPtr[ii]->dcuId; - // Set DAQ .ini file CRC checksum - ixDataBlock->header.dcuheader[db].fileCrc = shmIpcPtr[ii]->crc; - // Set 1/16Hz cycle number - ixDataBlock->header.dcuheader[db].cycle = shmIpcPtr[ii]->cycle; - // Set GPS seconds - ixDataBlock->header.dcuheader[db].timeSec = shmIpcPtr[ii]->bp[lastCycle].timeSec; - // Set GPS nanoseconds - ixDataBlock->header.dcuheader[db].timeNSec = shmIpcPtr[ii]->bp[lastCycle].timeNSec; - crcLength = shmIpcPtr[ii]->bp[lastCycle].crc; - // Set Status -- as running - ixDataBlock->header.dcuheader[db].status = 2; - // Indicate size of data block - // ********ixDataBlock->header.dcuheader[db].dataBlockSize = shmIpcPtr[ii]->dataBlockSize; - ixDataBlock->header.dcuheader[db].dataBlockSize = crcLength; - // Prevent going beyond MAX allowed data size - if (ixDataBlock->header.dcuheader[db].dataBlockSize > DAQ_DCU_BLOCK_SIZE) - ixDataBlock->header.dcuheader[db].dataBlockSize = DAQ_DCU_BLOCK_SIZE; - // Calculate TP data size - ixDataBlock->header.dcuheader[db].tpCount = (unsigned int)shmTpTable[ii]->count & 0xff; - ixDataBlock->header.dcuheader[db].tpBlockSize = sizeof(float) * modelrates[ii] * ixDataBlock->header.dcuheader[db].tpCount / DAQ_NUM_DATA_BLOCKS_PER_SECOND; - - // Copy GDSTP table to xmission buffer header - memcpy(&(ixDataBlock->header.dcuheader[db].tpNum[0]), - &(shmTpTable[ii]->tpNum[0]), - sizeof(int)*ixDataBlock->header.dcuheader[db].tpCount); - - // Set pointer to dcu data in shared memory - dataBuff = (char *)(shmDataPtr[ii] + lastCycle * buf_size); - // Copy data from shared memory into local buffer - dataXferSize = ixDataBlock->header.dcuheader[db].dataBlockSize + ixDataBlock->header.dcuheader[db].tpBlockSize; - // if the dataXferSize is too large, something is wrong so return error message. - if(dataXferSize > DAQ_DCU_BLOCK_SIZE) return(-1); - memcpy((void *)zbuffer, dataBuff, dataXferSize); - - // Calculate CRC on the data and add to header info - myCrc = 0; - myCrc = crc_ptr((char *)zbuffer, crcLength, 0); - myCrc = crc_len(crcLength, myCrc); - ixDataBlock->header.dcuheader[db].dataCrc = myCrc; - - // Increment the 0mq data buffer pointer for next FE - zbuffer += dataXferSize; - // Increment the 0mq message size with size of FE data block - sendLength += dataXferSize; - // Increment the data block size for the message, this includes regular data + TP data - ixDataBlock->header.fullDataBlockSize += dataXferSize; - - // Update heartbeat monitor to DAQ code - if (lastCycle == 0) shmIpcPtr[ii]->reqAck ^= daqStatBit[1]; - db ++; - } - } - ixDataBlock->header.dcuTotalModels = db; - return sendLength; -} // ********************************************************************************************** int send_to_local_memory(int nsys, - int xmitData, int send_delay_ms, mx_endpoint_t ep, int64_t his_nic_id, uint16_t his_eid, - int len, - uint32_t match_val, - uint16_t my_dcu) + uint32_t match_val) { int do_wait = 1; - char *nextData; + char *nextData = 0; - int ii; + int ii =0; int lastCycle = 0; unsigned int nextCycle = 0; - int sync2iop = 1; int status = 0; int dataRdy[10]; @@ -391,43 +187,44 @@ int send_to_local_memory(int nsys, uint32_t result; mx_endpoint_addr_t dest; uint32_t filter = FILTER; - int init_mx = 1; for(ii=0;ii<10;ii++) dataRdy[ii] = 0; mx_set_error_handler(MX_ERRORS_RETURN); int myErrorSignal = 1; - do { + do{ + mx_return_t conStat = mx_connect(ep, his_nic_id, his_eid, filter, + 1000, &dest); + if (conStat != MX_SUCCESS) + { + myErrorSignal = 1; + } + else + { + myErrorSignal = 0; + fprintf(stderr, "Connection Made\n"); + mx_return_t ret = mx_set_request_timeout(ep, 0, 1); // Set one second timeout + if (ret != MX_SUCCESS) + { + fprintf(stderr, "Failed to set request timeout %s\n", mx_strerror(ret)); + exit(1); + } - if(init_mx && xmitData) { - do{ - mx_return_t conStat = mx_connect(ep, his_nic_id, his_eid, filter, - 1000, &dest); - if (conStat != MX_SUCCESS) myErrorSignal = 1; - else { - myErrorSignal = 0; - fprintf(stderr, "Connection Made\n"); - mx_return_t ret = mx_set_request_timeout(ep, 0, 1); // Set one second timeout - if (ret != MX_SUCCESS) { - fprintf(stderr, "Failed to set request timeout %s\n", mx_strerror(ret)); - exit(1); - } - - } - }while(myErrorSignal); - init_mx = 0; - } + } + } while(myErrorSignal); + + do { myErrorSignal = 0; for(ii=0;ii<nsys;ii++) dataRdy[ii] = 0; - status = waitNextCycle2(nsys,nextCycle,sync2iop,dataRdy,shmIpcPtr); + + status = wait_for_cycle(ifo_header, nextCycle); // status = waitNextCycle(nextCycle,sync2iop,shmIpcPtr[0]); - if(!status) { + if(status != 0) { keepRunning = 0;; return(0); } - else sync2iop = 0; // IOP will be first model ready // Need to wait for 2K models to reach end of their cycled @@ -437,47 +234,42 @@ int send_to_local_memory(int nsys, nextData = (char *)ifo_data; nextData += cycle_data_size * nextCycle; ixDataBlock = (daq_multi_dcu_data_t *)nextData; - int sendLength = loadMessageBuffer(nsys, nextCycle, status,dataRdy); + int sendLength = ixDataBlock->header.fullDataBlockSize + sizeof(daq_multi_dcu_header_t); if(sendLength == -1 || sendLength > MSG_BUF_SIZE) { fprintf(stderr, "Message buffer overflow error\n"); return(-1); } // Print diags in verbose mode if(nextCycle == 8 && do_verbose) print_diags(nsys,lastCycle,sendLength,ixDataBlock); - // Write header info - ifo_header->curCycle = nextCycle; - ifo_header->cycleDataSize = cycle_data_size; - ifo_header->maxCycle = DAQ_NUM_DATA_BLOCKS_PER_SECOND; - - if(xmitData) { - // Copy data to 0mq message buffer - memcpy((void*)&msg_buffer,nextData,sendLength); - // Send Data - usleep(send_delay_ms * 1000); - seg.segment_ptr = &msg_buffer; - seg.segment_length = sendLength; - mx_return_t res = mx_isend(ep, &seg, 1, dest, match_val, NULL, &req[cur_req]); - if (res != MX_SUCCESS) { - fprintf(stderr, "mx_isend failed ret=%d\n", res); - myErrorSignal = 1; - break; - } + + // Copy data to 0mq message buffer + memcpy((void*)&msg_buffer,nextData,sendLength); + // Send Data + usleep(send_delay_ms * 1000); + seg.segment_ptr = &msg_buffer; + seg.segment_length = sendLength; + mx_return_t res = mx_isend(ep, &seg, 1, dest, match_val, NULL, &req[cur_req]); + if (res != MX_SUCCESS) { + fprintf(stderr, "mx_isend failed ret=%d\n", res); + myErrorSignal = 1; + break; + } again: - res = mx_wait(ep, &req[cur_req], 50, &stat, &result); - if (res != MX_SUCCESS) { - fprintf(stderr, "mx_cancel() failed with status %s\n", mx_strerror(res)); - exit(1); - } - if (result == 0) { - fprintf(stderr, "trying again \n"); - goto again; - // myErrorSignal = 1; - } - if (stat.code != MX_STATUS_SUCCESS) { - fprintf(stderr, "isendxxx failed with status %s\n", mx_strstatus(stat.code)); - myErrorSignal = 1; - } - } + res = mx_wait(ep, &req[cur_req], 50, &stat, &result); + if (res != MX_SUCCESS) { + fprintf(stderr, "mx_cancel() failed with status %s\n", mx_strerror(res)); + exit(1); + } + if (result == 0) { + fprintf(stderr, "trying again \n"); + goto again; + // myErrorSignal = 1; + } + if (stat.code != MX_STATUS_SUCCESS) { + fprintf(stderr, "isendxxx failed with status %s\n", mx_strstatus(stat.code)); + myErrorSignal = 1; + } + nextCycle = (nextCycle + 1) % 16; @@ -506,13 +298,7 @@ main(int argc,char *argv[]) int max_data_size_mb = 64; int max_data_size = 0; int error = 0; - int status = -1; - unsigned long gps_frac = 0; - int gps_stt = 0; - int gps_ok = 0; - unsigned long gps_time = 0; - int sendViaOmx = 0; - char *buffer_name = "ifo"; + char *buffer_name = "local_dc"; int send_delay_ms = 0; mx_endpoint_t ep; @@ -523,10 +309,6 @@ main(int argc,char *argv[]) uint16_t his_eid; char *rem_host; char *sysname; - int len; - int iter; - int do_wait; - int do_bothways; extern char *optarg; mx_return_t ret; @@ -537,10 +319,6 @@ main(int argc,char *argv[]) my_eid = DFLT_EID; his_eid = DFLT_EID; board_id = MX_ANY_NIC; - len = DFLT_LEN; - iter = DFLT_ITER; - do_wait = 0; - do_bothways = 0; @@ -554,14 +332,15 @@ main(int argc,char *argv[]) } /* Get the parameters */ - while ((counter = getopt(argc, argv, "b:e:m:h:v:s:r:t:d:l:D:")) != EOF) + while ((counter = getopt(argc, argv, "b:e:m:h:v:r:t:d:l:D:")) != EOF) + { switch(counter) { case 't': rem_host = optarg; - sendViaOmx = 1; break; case 'b': buffer_name = optarg; + fprintf(stderr, "Buffer name = '%s'\n", buffer_name); break; case 'm': @@ -576,10 +355,6 @@ main(int argc,char *argv[]) } break; - case 's': - sysname = optarg; - fprintf (stderr,"sysnames = %s\n",sysname); - continue; case 'l': if (0 == freopen(optarg, "w", stdout)) { perror ("freopen"); @@ -590,6 +365,7 @@ main(int argc,char *argv[]) break; case 'r': his_eid = atoi(optarg); + fprintf (stderr, "remoteeid = %d\n", his_eid); break; case 'v': do_verbose = atoi(optarg); @@ -607,84 +383,30 @@ main(int argc,char *argv[]) case 'D': send_delay_ms = atoi(optarg); break; + default: + fprintf(stderr, "Not handling argument '%c'\n", counter); + } } max_data_size = max_data_size_mb * 1024*1024; // If sending to DAQ via net enabled, ensure all options have been set - if (sendViaOmx) { - mx_init(); - MX_MUTEX_INIT(&stream_mutex); - if(my_eid == DFLT_EID || his_eid == DFLT_EID){ + mx_init(); + MX_MUTEX_INIT(&stream_mutex); + if(my_eid == DFLT_EID || his_eid == DFLT_EID) + { fprintf(stderr, "\n***ERROR\n***Must set both -e and -r options to send data to DAQ\n\n"); Usage(); return(0); - } - fprintf(stderr,"Writing DAQ data to local shared memory and sending out on Open-MX\n"); - if(my_eid == 0) { - daqStatBit[0] = 1; - daqStatBit[1] = 2; - } else { - daqStatBit[0] = 4; - daqStatBit[1] = 8; - } - } else { - daqStatBit[0] = 1; - daqStatBit[1] = 2; - fprintf(stderr,"Writing DAQ data to local shared memory only \n"); } - - // Parse the model names - if(sysname != NULL) { - fprintf(stderr,"System names: %s\n", sysname); - sprintf(modelnames[0],"%s",strtok(sysname, " ")); - for(;;) { - char *s = strtok(0, " "); - if (!s) break; - sprintf(modelnames[nsys],"%s",s); - dcuId[nsys] = 0; - nsys++; - } + fprintf(stderr,"Writing DAQ data to local shared memory and sending out on Open-MX\n"); + if(my_eid == 0) { + daqStatBit[0] = 1; + daqStatBit[1] = 2; } else { - Usage(); - return(0); - } - - // Open file descriptor for the gpstime driver - symmetricom_fd = open ("/dev/gpstime", O_RDWR | O_SYNC); - if (symmetricom_fd < 0) { - perror("/dev/gpstime"); - exit(1); - } - gps_ok = symm_ok(); - gps_time = symm_gps_time(&gps_frac, &gps_stt); - fprintf(stderr,"GPS TIME = %ld\tfrac = %ld\tstt = %d\n",gps_time,gps_frac,gps_stt); - - // Find the shared memory locations for the various model names - for(ii=0;ii<nsys;ii++) { - char shmem_fname[128]; - sprintf(shmem_fname, "%s_daq", modelnames[ii]); - void *dcu_addr = findSharedMemory(shmem_fname); - if (dcu_addr == NULL) { - fprintf(stderr, "Can't map shmem\n"); - exit(-1); - } else { - fprintf(stderr," %s mapped at 0x%lx\n",modelnames[ii],(unsigned long)dcu_addr); - } - shmIpcPtr[ii] = (struct rmIpcStr *)((char *)dcu_addr + CDS_DAQ_NET_IPC_OFFSET); - shmDataPtr[ii] = ((char *)dcu_addr + CDS_DAQ_NET_DATA_OFFSET); - shmTpTable[ii] = (struct cdsDaqNetGdsTpNum *)((char *)dcu_addr + CDS_DAQ_NET_GDS_TP_TABLE_OFFSET); - } - - // Get model rates to get GDS TP data sizes. - for (ii = 0; ii < nsys; ii++) { - status = getmodelrate(&modelrates[ii],&dcuid[ii],modelnames[ii], gds_tp_dir); - fprintf(stderr,"Model %s rate = %d dcuid = %d\n",modelnames[ii],modelrates[ii],dcuid[ii]); - if (status != 0) { - fprintf(stderr, "Unable to determine the rate of %s\n", modelnames[ii]); - exit(1); - } + daqStatBit[0] = 4; + daqStatBit[1] = 8; } // Get pointers to local DAQ mbuf @@ -694,33 +416,36 @@ main(int argc,char *argv[]) cycle_data_size = (max_data_size - sizeof(daq_multi_cycle_header_t))/DAQ_NUM_DATA_BLOCKS_PER_SECOND; cycle_data_size -= (cycle_data_size % 8); + fprintf(stderr, "ifo mapped to %p\n", ifo); + // Setup signal handler to catch Control C signal(SIGINT,intHandler); sleep(1); - if(sendViaOmx) { - // Open the NIC endpoint to send data - fprintf(stderr,"Open endpoint \n"); - ret = mx_open_endpoint(board_id, my_eid, filter, NULL, 0, &ep); - if (ret != MX_SUCCESS) { - fprintf(stderr, "Failed to open endpoint %s\n", mx_strerror(ret)); - exit(1); - } - sleep(1); - mx_hostname_to_nic_id(rem_host, &his_nic_id); + + // Open the NIC endpoint to send data + fprintf(stderr,"Open endpoint \n"); + ret = mx_open_endpoint(board_id, my_eid, filter, NULL, 0, &ep); + if (ret != MX_SUCCESS) { + fprintf(stderr, "Failed to open endpoint %s\n", mx_strerror(ret)); + exit(1); } + sleep(1); + mx_hostname_to_nic_id(rem_host, &his_nic_id); + + + reset_cycle_counter(ifo_header); // Enter infinite loop of reading control model data and writing to local shared memory do { - error = send_to_local_memory(nsys, sendViaOmx, send_delay_ms,ep,his_nic_id,his_eid,len,MATCH_VAL_MAIN,my_eid); + error = send_to_local_memory(nsys, send_delay_ms,ep,his_nic_id,his_eid,MATCH_VAL_MAIN); } while (error == 0 && keepRunning == 1); // Cleanup Open-MX stuff - if(sendViaOmx) { - fprintf(stderr,"Closing out OpenMX and exiting\n"); - mx_close_endpoint(ep); - mx_finalize(); - } + + fprintf(stderr,"Closing out OpenMX and exiting\n"); + mx_close_endpoint(ep); + mx_finalize(); return 0; }