merged zmqdata to developer

This commit is contained in:
Dhanya Maliakal
2016-10-20 08:46:48 +02:00
21 changed files with 743 additions and 487 deletions

View File

@ -11,7 +11,6 @@
#include <math.h>
#include "gitInfoLib.h"
int slsDetector::initSharedMemory(detectorType type, int id) {
@ -3987,9 +3986,9 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t){
if (index!=MEASUREMENTS_NUMBER) {
//#ifdef VERBOSE
#ifdef VERBOSE
std::cout<< "Setting timer "<< index << " to " << t << "ns/value" << std::endl;
//#endif
#endif
if (thisDetector->onlineFlag==ONLINE_FLAG) {
if (connectControl() == OK){
controlSocket->SendDataOnly(&fnum,sizeof(fnum));
@ -5556,6 +5555,7 @@ char* slsDetector::setReceiver(string receiverIP){
std::cout << "frame number:" << thisDetector->timerValue[FRAME_NUMBER] << endl;
std::cout << "dynamic range:" << thisDetector->dynamicRange << endl << endl;
std::cout << "10GbE:" << thisDetector->tenGigaEnable << endl << endl;
//std::cout << "dataStreaming:" << enableDataStreamingFromReceiver(-1) << endl << endl;
/** enable compresison, */
#endif
if(setDetectorType()!= GENERIC){
@ -5580,6 +5580,8 @@ char* slsDetector::setReceiver(string receiverIP){
setTimer(FRAME_NUMBER,thisDetector->timerValue[FRAME_NUMBER]);
setDynamicRange(thisDetector->dynamicRange);
activate(-1);
//std::cout << "***********************************dataStreaming:" << parentDet->enableDataStreamingFromReceiver(-1) << endl << endl;
//parentDet->enableDataStreamingFromReceiver(parentDet->enableDataStreamingFromReceiver(-1));
//set scan tag
setUDPConnection();
if(thisDetector->myDetectorType == EIGER)
@ -7381,64 +7383,6 @@ int slsDetector::resetFramesCaught(){
int* slsDetector::readFrameFromReceiver(char* fName, int &acquisitionIndex, int &frameIndex, int &subFrameIndex){
int fnum=F_READ_RECEIVER_FRAME;
int nel=thisDetector->dataBytes/sizeof(int);
int* retval=new int[nel];
int ret=FAIL;
int n;
char mess[MAX_STR_LENGTH]="Nothing";
if (setReceiverOnline(ONLINE_FLAG)==ONLINE_FLAG) {
#ifdef VERBOSE
std::cout<< "slsDetector: Reading frame from receiver "<< thisDetector->dataBytes << " " <<nel <<std::endl;
#endif
if (connectData() == OK){
dataSocket->SendDataOnly(&fnum,sizeof(fnum));
dataSocket->ReceiveDataOnly(&ret,sizeof(ret));
if (ret==FAIL) {
n= dataSocket->ReceiveDataOnly(mess,sizeof(mess));
std::cout<< "Detector returned: " << mess << " " << n << std::endl;
delete [] retval;
disconnectData();
return NULL;
} else {
n=dataSocket->ReceiveDataOnly(fName,MAX_STR_LENGTH);
n=dataSocket->ReceiveDataOnly(&acquisitionIndex,sizeof(acquisitionIndex));
n=dataSocket->ReceiveDataOnly(&frameIndex,sizeof(frameIndex));
if(thisDetector->myDetectorType == EIGER)
n=dataSocket->ReceiveDataOnly(&subFrameIndex,sizeof(subFrameIndex));
n=dataSocket->ReceiveDataOnly(retval,thisDetector->dataBytes);
#ifdef VERBOSE
std::cout<< "Received "<< n << " data bytes" << std::endl;
#endif
if (n!=thisDetector->dataBytes) {
std::cout<<endl<< "wrong data size received: received " << n << " but expected from receiver " << thisDetector->dataBytes << std::endl;
ret=FAIL;
delete [] retval;
disconnectData();
return NULL;
}
//jungfrau masking adcval
if(thisDetector->myDetectorType == JUNGFRAU){
for(unsigned int i=0;i<nel;i++){
retval[i] = (retval[i] & 0x3FFF3FFF);
}
}
}
disconnectData();
}
}
return retval;
};
int slsDetector::lockReceiver(int lock){
int fnum=F_LOCK_RECEIVER;
@ -7726,18 +7670,18 @@ int64_t slsDetector::clearAllErrorMask(){
int slsDetector::setReadReceiverFrequency(int getFromReceiver,int i){
int slsDetector::setReadReceiverFrequency(int getFromReceiver, int freq){
int fnum=F_READ_RECEIVER_FREQUENCY;
int ret = FAIL;
int retval=-1;
int arg = i;
int arg = freq;
if(!getFromReceiver)
return retval;
if(setReceiverOnline(ONLINE_FLAG)==ONLINE_FLAG){
#ifdef VERBOSE
std::cout << "Sending read frequency to receiver " << arg << std::endl;
std::cout << "Sending read frequency to receiver " << arg << std::endl;
#endif
if (connectData() == OK)
ret=thisReceiver->sendInt(fnum,retval,arg);
@ -7748,14 +7692,44 @@ int slsDetector::setReadReceiverFrequency(int getFromReceiver,int i){
updateReceiver();
}
if ((i > 0) && (retval != i)){
cout << "could not set receiver read frequency:" << retval << endl;
if ((freq > 0) && (retval != freq)){
cout << "could not set receiver read frequency to " << freq <<" Returned:" << retval << endl;
setErrorMask((getErrorMask())|(RECEIVER_READ_FREQUENCY));
}
return retval;
}
int slsDetector::enableDataStreamingFromReceiver(int enable){
int fnum=F_STREAM_DATA_FROM_RECEIVER;
int ret = FAIL;
int retval=-1;
int arg = enable;
if(setReceiverOnline(ONLINE_FLAG)==ONLINE_FLAG){
#ifdef VERBOSE
std::cout << "***************Sending Data Streaming in Receiver " << arg << std::endl;
#endif
if (connectData() == OK)
ret=thisReceiver->sendInt(fnum,retval,arg);
disconnectData();
if(ret==FAIL)
retval = -1;
if(ret==FORCE_UPDATE)
updateReceiver();
}
if ((enable > 0) && (retval != enable)){
cout << "could not set data streaming in receiver to " << enable <<" Returned:" << retval << endl;
setErrorMask((getErrorMask())|(DATA_STREAMING));
}
return retval;
}
int slsDetector::enableReceiverCompression(int i){
int fnum=F_ENABLE_RECEIVER_COMPRESSION;
int ret = FAIL;

View File

@ -1574,14 +1574,16 @@ class slsDetector : public slsDetectorUtils, public energyConversion {
int resetFramesCaught();
/**
* Reads a frame from receiver
* @param fName file name of current frame()
* @param acquisitionIndex current acquisition index
* @param frameIndex current frame index (for each scan)
* @param subFrameIndex current sub frame index (for 32 bit mode for eiger)
/returns a frame read from recever
* Create Receiving Data Threads
* @param destroy is true to destroy all the threads
* @return OK or FAIL
*/
int createReceivingDataThreads(bool destroy = false){};
/** Reads frames from receiver through a constant socket
*/
int* readFrameFromReceiver(char* fName, int &acquisitionIndex, int &frameIndex, int &subFrameIndex);
void readFrameFromReceiver(){};
/** Locks/Unlocks the connection to the receiver
/param lock sets (1), usets (0), gets (-1) the lock
@ -1682,14 +1684,20 @@ class slsDetector : public slsDetectorUtils, public energyConversion {
char* setDetectorNetworkParameter(networkParameter index, int delay);
/** Sets the read receiver frequency
if Receiver read upon gui request, readRxrFrequency=0,
if data required from receiver randomly readRxrFrequency=0,
else every nth frame to be sent to gui
@param getFromReceiver is 1 if it should ask the receiver,
0 if it can get it from multislsdetecter
@param i is the receiver read frequency
0 if it can get it from multi structure
@param freq is the receiver read frequency
/returns read receiver frequency
*/
int setReadReceiverFrequency(int getFromReceiver, int i=-1);
int setReadReceiverFrequency(int getFromReceiver, int freq=-1);
/** Enable or disable streaming data from receiver to client
* @param enable 0 to disable 1 to enable -1 to only get the value
* @returns data streaming
*/
int enableDataStreamingFromReceiver(int enable=-1);
/** enable/disable or get data compression in receiver
* @param i is -1 to get, 0 to disable and 1 to enable

View File

@ -506,26 +506,20 @@ class slsDetectorBase : public virtual slsDetectorDefs, public virtual errorDef
virtual int lockReceiver(int lock=-1)=0;
/**
* Reads a frame from receiver
* @param fName file name of current frame()
* @param acquisitionIndex current acquisition index
* @param frameIndex current frame index (for each scan)
* @param subFrameIndex current sub frame index (for 32 bit mode for eiger)
/returns a frame read from recever
/** Reads frames from receiver through a constant socket
*/
virtual int* readFrameFromReceiver(char* fName, int &acquisitionIndex, int &frameIndex, int &subFrameIndex)=0;
virtual void readFrameFromReceiver()=0;
/** Sets the read receiver frequency
if Receiver read upon gui request, readRxrFrequency=0,
if data required from receiver randomly readRxrFrequency=0,
else every nth frame to be sent to gui
@param getFromReceiver is 1 if it should ask the receiver,
0 if it can get it from multislsdetecter
@param i is the receiver read frequency
0 if it can get it from multi structure
@param freq is the receiver read frequency
/returns read receiver frequency
*/
virtual int setReadReceiverFrequency(int getFromReceiver, int i=-1)=0;
virtual int setReadReceiverFrequency(int getFromReceiver, int freq=-1)=0;
/** Sets the receiver to start any readout remaining in the fifo and
* change status to transmitting.

View File

@ -4502,7 +4502,8 @@ string slsDetectorCommand::cmdReceiver(int narg, char *args[], int action) {
if(!strcasecmp(args[1],"start"))
myDet->startReceiver();
else if(!strcasecmp(args[1],"stop")){
myDet->startReceiverReadout();
//myDet->stopReceiver();
// myDet->startReceiverReadout();
/*runStatus s = myDet->getReceiverStatus();
while(s != RUN_FINISHED){
usleep(50000);

View File

@ -240,7 +240,9 @@ int slsDetectorUsers::setReceiverMode(int n){
return myDetector->setReadReceiverFrequency(1,n);
}
int slsDetectorUsers::enableDataStreamingFromReceiver(int i){
return myDetector->enableDataStreamingFromReceiver(i);
}
int64_t slsDetectorUsers::getModuleFirmwareVersion(){

View File

@ -450,6 +450,15 @@ class slsDetectorUsers
virtual void finalizeDataset(double *a, double *v, double *e, int &np);
/**
Enable data streaming from receiver (zmq)
\param i 1 to set, 0 to reset and -1 to get
\returns data streaming enable
*/
int enableDataStreamingFromReceiver(int i=-1);
/**
get get Module Firmware Version
\returns id

View File

@ -8,7 +8,7 @@
#include <cstdlib>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <time.h> //clock()
using namespace std;
slsDetectorUtils::slsDetectorUtils() {
@ -42,6 +42,8 @@ slsDetectorUtils::slsDetectorUtils() {
int slsDetectorUtils::acquire(int delflag){
struct timespec begin,end;
clock_gettime(CLOCK_REALTIME, &begin);
//ensure acquire isnt started multiple times by same client
if(getAcquiringFlag() == false)
@ -58,11 +60,15 @@ int slsDetectorUtils::acquire(int delflag){
}else{
//put receiver read frequency to random if no gui
int ret = setReadReceiverFrequency(0);
if(ret>0 && (acquisition_finished == NULL)){
std::cout << "Error: receiver read frequency is set to " << ret << " but should be > 0 only when using gui." << std::endl;
if(ret>0 && (dataReady == NULL)){
ret = setReadReceiverFrequency(1,0);
std::cout << "Current receiver read frequency: " << ret << std::endl;
std::cout << "No Data call back and hence receiver read frequency reset to " << ret <<" (Random)" << std::endl;
}
//start/stop data streaming threads if threads in client enabled/disabled
ret = enableDataStreamingFromReceiver(-1);
// cout<<"getting datastream:"<<ret<<endl;
// cout<<"result of enabledatastream:"<<enableDataStreamingFromReceiver(ret)<<endl;
}
int nc=setTimer(CYCLES_NUMBER,-1);
@ -72,10 +78,6 @@ int slsDetectorUtils::acquire(int delflag){
int multiframe = nc*nf;
pthread_mutex_lock(&mg);
acquiringDone = 0;
pthread_mutex_unlock(&mg);
// setTotalProgress();
//moved these 2 here for measurement change
progressIndex=0;
@ -148,11 +150,10 @@ int slsDetectorUtils::acquire(int delflag){
stopReceiver();
if(setReceiverOnline()==OFFLINE_FLAG)
*stoppedFlag=1;
//multi detectors shouldnt have different receiver read frequencies enabled/disabled
if(setReadReceiverFrequency(0) < 0){
std::cout << "Error: The receiver read frequency is invalid:" << setReadReceiverFrequency(0) << std::endl;
*stoppedFlag=1;
*stoppedFlag=1;
}
if(setReceiverOnline()==OFFLINE_FLAG)
@ -160,22 +161,20 @@ int slsDetectorUtils::acquire(int delflag){
}
if (*threadedProcessing) {
sem_init(&sem_queue,0,0);
startThread(delflag);
}
if (*threadedProcessing)
startThread(delflag);
#ifdef VERBOSE
cout << " starting thread " << endl;
#endif
//resets frames caught in receiver
if(receiver){
pthread_mutex_lock(&mg);
resetFramesCaught();
pthread_mutex_unlock(&mg);
pthread_mutex_lock(&mg);
resetFramesCaught();
pthread_mutex_unlock(&mg);
}
for(int im=0;im<nm;im++) {
#ifdef VERBOSE
@ -281,7 +280,7 @@ int slsDetectorUtils::acquire(int delflag){
if(receiver){
pthread_mutex_unlock(&mg);//unlock previous
pthread_mutex_unlock(&mg);
pthread_mutex_lock(&mp);
createFileName();
pthread_mutex_unlock(&mp);
@ -341,55 +340,21 @@ int slsDetectorUtils::acquire(int delflag){
break;
pthread_mutex_lock(&mg);
//offline
pthread_mutex_lock(&mg);
if(setReceiverOnline()==OFFLINE_FLAG){
// wait until data processing thread has finished the data
acquiringDone = 1;
pthread_mutex_unlock(&mg);
if (*threadedProcessing) {
sem_wait(&sem_queue);
pthread_mutex_lock(&mg);
acquiringDone = 0;
pthread_mutex_unlock(&mg);
if ((getDetectorsType()==GOTTHARD) || (getDetectorsType()==MOENCH) || (getDetectorsType()==JUNGFRAU) ){
if((*correctionMask)&(1<<WRITE_FILE))
closeDataFile();
}
#ifdef VERBOSE
cout << "check data queue size " << endl;
#endif
/*while (dataQueueSize()){
//#ifdef VERBOSE
cout << "AAAAAAAAA check data queue size " << endl;
//#endif
usleep(100000);
}*/
if ((getDetectorsType()==GOTTHARD) || (getDetectorsType()==MOENCH) || (getDetectorsType()==JUNGFRAU) ){
if((*correctionMask)&(1<<WRITE_FILE))
closeDataFile();
}
}
//online
else{
acquiringDone = 1;
pthread_mutex_unlock(&mg);
// wait until data processing thread has taken the last frame
if (*threadedProcessing) {
sem_wait(&sem_queue);
pthread_mutex_lock(&mg);
acquiringDone = 0;
pthread_mutex_unlock(&mg);
}
pthread_mutex_lock(&mg);
stopReceiver();
pthread_mutex_unlock(&mg);
// cout<<"***********receiver stopped"<<endl;
}
pthread_mutex_unlock(&mg);
@ -507,7 +472,6 @@ int slsDetectorUtils::acquire(int delflag){
#endif
setJoinThread(1);
pthread_join(dataProcessingThread, &status);
sem_destroy(&sem_queue);
#ifdef VERBOSE
cout << "data processing thread joined" << endl;
#endif
@ -538,6 +502,10 @@ int slsDetectorUtils::acquire(int delflag){
#endif
setAcquiringFlag(false);
clock_gettime(CLOCK_REALTIME, &end);
cout << "Elapsed time for acquisition:" << (( end.tv_sec - begin.tv_sec ) + ( end.tv_nsec - begin.tv_nsec ) / 1000000000.0) << " seconds" << endl;
return OK;
}

View File

@ -29,7 +29,7 @@ extern "C" {
#include <sstream>
#include <queue>
#include <math.h>
#include <semaphore.h>
using namespace std;
@ -647,16 +647,17 @@ virtual int getReceiverCurrentFrameIndex()=0;
virtual int resetFramesCaught()=0;
/**
* Reads a frame from receiver
* @param fName file name of current frame()
* @param acquisitionIndex current acquisition index
* @param frameIndex current frame index (for each scan)
* @param subFrameIndex current sub frame index (for 32 bit mode for eiger)
/returns a frame read from recever
*/
virtual int* readFrameFromReceiver(char* fName, int &acquisitionIndex, int &frameIndex, int &subFrameIndex)=0;
* Create Receiving Data Threads
* @param destroy is true to destroy all the threads
* @return OK or FAIL
*/
virtual int createReceivingDataThreads(bool destroy = false)=0;
/** Reads frames from receiver through a constant socket
*/
virtual void readFrameFromReceiver()=0;
/**
Turns off the receiver server!
*/
@ -699,14 +700,20 @@ virtual int setROI(int n=-1,ROI roiLimits[]=NULL)=0;
virtual ROI* getROI(int &n)=0;
/** Sets the read receiver frequency
if Receiver read upon gui request, readRxrFrequency=0,
if data required from receiver randomly readRxrFrequency=0,
else every nth frame to be sent to gui
@param getFromReceiver is 1 if it should ask the receiver,
0 if it can get it from multislsdetecter
@param i is the receiver read frequency
0 if it can get it from multi structure
@param freq is the receiver read frequency
/returns read receiver frequency
*/
virtual int setReadReceiverFrequency(int getFromReceiver, int i=-1)=0;
virtual int setReadReceiverFrequency(int getFromReceiver, int freq=-1)=0;
/** Enable or disable streaming of data from receiver to client
* @param enable 0 to disable 1 to enable -1 to only get the value
* @returns data streaming
*/
virtual int enableDataStreamingFromReceiver(int enable=-1)=0;
/** enable/disable or get data compression in receiver
@ -830,7 +837,6 @@ virtual int setReceiverFifoDepth(int i = -1)=0;
//protected:
int *stoppedFlag;
int64_t *timerValue;
detectorSettings *currentSettings;
int *currentThresholdEV;
@ -856,6 +862,8 @@ virtual int setReceiverFifoDepth(int i = -1)=0;
int (*progress_call)(double,void*);
void *pProgressCallArg;
};