/** * @brief Configures the block, in this case the export time is hard-coded * to 0.5 seconds * @param n The configuration parameters */ void _configure(const pugi::xml_node& n ) { if(!n.child("notimer")) { set_periodic_timer(1000000,"test",0); } }
int main(int argc, char *argv[]) { static unsigned int oldPulseID = 0; char dataHeader[1024], globalHeader[1024]; pNEventArray data = NULL, tmp = NULL; MD5_CTX md5Context; unsigned char md5Hash[16]; struct timespec tPulse; void *zmqContext = NULL; void *pushSocket = NULL; char sockAddress[255]; unsigned long nCount = 0, pulseCount = 0; int64_t byteCount = 0; time_t statTime; int64_t rtimestamp[2]; unsigned int multiplier = 1; int i, rc; if(argc < 3) { printf("usage:\n\tzmqGenerator nexusfile portNo [multiplier]\n"); return 1; } /* load NeXus file into en event list */ data = loadNeXus2Events(argv[1]); if(data == NULL){ printf("Failed to load NeXus data to events\n"); } /* handle multiplier */ if(argc > 3){ multiplier = atoi(argv[3]); tmp = multiplyNEventArray(data,multiplier); if(tmp == NULL){ printf("Failed to multiply event array by %d\n", multiplier); } else { /* killNEventArray(&data); */ data = tmp; } } printf("Sending %ld n-events per message\n", data->count); /* create dataHeader */ snprintf(dataHeader,sizeof(dataHeader), "{\"htype\": \"bsr_d-1.0\", \"channels\" :[{\"name\":\"detectorID\", \"type\":\"long\",\"shape\":[%ld] }, [{\"name\":\"timestamps\", \"type\":\"int\",\"shape\":[%ld] } ]}", data->count, data->count); MD5Init(&md5Context); MD5Update(&md5Context,dataHeader,strlen(dataHeader)); MD5Final(md5Hash,&md5Context); /* printf("%s, hash =%x\n",dataHeader,md5Hash); */ /* initialize 0MQ */ zmqContext = zmq_ctx_new(); printf("message sent via %d\n",SEND_TYPE); pushSocket = zmq_socket(zmqContext,SEND_TYPE); snprintf(sockAddress,sizeof(sockAddress),"tcp://*:%s",argv[2]); rc = zmq_bind(pushSocket,sockAddress); assert (rc == 0); /* start timer */ init_timer(); set_periodic_timer(71420); /* 71,42 milliseconds == 14HZ */ statTime = time(NULL); while(1){ if(oldPulseID != pulseID){ if(pulseID - oldPulseID > 1) { printf("Timer miss at pulseID %d\n", pulseID); } oldPulseID = pulseID; /* printf("Timer triggered, pulseID = %ld\n", pulseID); */ /* create global header */ clock_gettime(CLOCK_MONOTONIC,&tPulse); snprintf(globalHeader,sizeof(globalHeader), "{\"global_timespamp\": {\"epoch\": %d, \"ns\": %d}, \"hash\": \"%x\",\"htype\": \"bsr_m-1.0\",\"pulse_id\": %ld}", tPulse.tv_sec,tPulse.tv_nsec, md5Hash,pulseID ); /* printf(globalHeader); */ /* create timestamp */ rtimestamp[0] = tPulse.tv_sec; rtimestamp[1] = tPulse.tv_nsec; /* send the stuff away */ byteCount += zmq_send(pushSocket,globalHeader,strlen(globalHeader),ZMQ_SNDMORE); byteCount += zmq_send(pushSocket,dataHeader,strlen(dataHeader),ZMQ_SNDMORE); byteCount += zmq_send(pushSocket,data->detectorID,data->count*sizeof(int64_t),ZMQ_SNDMORE); byteCount += zmq_send(pushSocket,rtimestamp,2*sizeof(int64_t), ZMQ_SNDMORE); byteCount += zmq_send(pushSocket,data->timeStamp,data->count*sizeof(int32_t),ZMQ_SNDMORE); byteCount += zmq_send(pushSocket,rtimestamp,2*sizeof(int64_t), 0); /* handle statistics */ nCount += data->count; pulseCount++; if(time(NULL) >= statTime + 10){ printf("byteCount = %ld, nCount = %ld, pulseCount = %ld\n", byteCount, nCount, pulseCount); printf("Sent %f MB/sec , %f n* 10^6/sec, %ld pulses\n", byteCount/(1024.*1024.*10.), nCount/10000000., pulseCount); pulseCount = 0; byteCount = 0; nCount = 0; statTime = time(NULL); } } } killNEventArray(&data); zmq_close(pushSocket); zmq_ctx_destroy(zmqContext); return 0; }