From 50111bcea790c2989a6a60f74d5575ef431aba66 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Fri, 16 Mar 2018 10:41:30 +0100 Subject: [PATCH 01/25] removed unused variable in slsDetector --- .../multiSlsDetector/multiSlsDetector.cpp | 315 +++++++++--------- 1 file changed, 157 insertions(+), 158 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index c415be085..becc2fd76 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -57,7 +57,7 @@ int multiSlsDetector::freeSharedMemory() { int multiSlsDetector::initSharedMemory(int id=0) { - + key_t mem_key=DEFAULT_SHM_KEY+MAXDET+id; int shm_id; int sz; @@ -76,20 +76,20 @@ int multiSlsDetector::initSharedMemory(int id=0) { std::cout<<"*** shmget error (server) ***"<< shm_id << std::endl; return shm_id; } - + /** thisMultiDetector pointer is set to the memory address of the shared memory */ thisMultiDetector = (sharedMultiSlsDetector*) shmat(shm_id, NULL, 0); /* attach */ - + if (thisMultiDetector == (void*)-1) { std::cout<<"*** shmat error (server) ***" << std::endl; return shm_id; } /** shm_id returns -1 is shared memory initialization fails - */ + */ return shm_id; @@ -191,7 +191,7 @@ multiSlsDetector::multiSlsDetector(int id) : slsDetectorUtils(), shmId(-1) /** set binsize*/ thisMultiDetector->binSize=0.001; thisMultiDetector->stoppedFlag=0; - + thisMultiDetector->threadedProcessing=1; thisMultiDetector->actionMask=0; @@ -205,7 +205,7 @@ multiSlsDetector::multiSlsDetector(int id) : slsDetectorUtils(), shmId(-1) for (int iscan=0; iscanscanMode[iscan]=0; strcpy(thisMultiDetector->scanScript[iscan],"none"); strcpy(thisMultiDetector->scanParameter[iscan],"none"); @@ -223,8 +223,8 @@ multiSlsDetector::multiSlsDetector(int id) : slsDetectorUtils(), shmId(-1) stoppedFlag=&thisMultiDetector->stoppedFlag; threadedProcessing=&thisMultiDetector->threadedProcessing; actionMask=&thisMultiDetector->actionMask; - actionScript=thisMultiDetector->actionScript; - actionParameter=thisMultiDetector->actionParameter; + actionScript=thisMultiDetector->actionScript; + actionParameter=thisMultiDetector->actionParameter; nScanSteps=thisMultiDetector->nScanSteps; scanMode=thisMultiDetector->scanMode; scanScript=thisMultiDetector->scanScript; @@ -343,7 +343,7 @@ int multiSlsDetector::addSlsDetector(int id, int pos) { if (slsDetector::exists(id)==0) { cout << "Detector " << id << " does not exist - You should first create it to determine type etc." << endl; } - + #ifdef VERBOSE cout << "Adding detector " << id << " in position " << pos << endl; #endif @@ -353,21 +353,21 @@ int multiSlsDetector::addSlsDetector(int id, int pos) { if (pos>j) pos=thisMultiDetector->numberOfDetectors; - + //check that it is not already in the list - + for (int i=0; inumberOfDetectors; ++i) { //check that it is not already in the list, in that case move to new position if (detectors[i]) { - if (detectors[i]->getDetectorId()==id) { + if (detectors[i]->getDetectorId()==id) { cout << "Detector " << id << "already part of the multiDetector in position " << i << "!" << endl << "Remove it before adding it back in a new position!"<< endl; return -1; } } } - + if (pos!=thisMultiDetector->numberOfDetectors) { @@ -386,10 +386,10 @@ int multiSlsDetector::addSlsDetector(int id, int pos) { detectors[pos]=new slsDetector(pos, id, this); thisMultiDetector->detectorIds[pos]=detectors[pos]->getDetectorId(); ++thisMultiDetector->numberOfDetectors; - + thisMultiDetector->dataBytes+=detectors[pos]->getDataBytes(); thisMultiDetector->dataBytesInclGapPixels+=detectors[pos]->getDataBytesInclGapPixels(); - + thisMultiDetector->numberOfChannels+=detectors[pos]->getTotalNumberOfChannels(); thisMultiDetector->maxNumberOfChannels+=detectors[pos]->getMaxNumberOfChannels(); @@ -646,7 +646,7 @@ string multiSlsDetector::getHostname(int pos) { } } return s; - + } @@ -667,7 +667,7 @@ slsDetectorDefs::detectorType multiSlsDetector::getDetectorsType(int pos) { string multiSlsDetector::sgetDetectorsType(int pos) { - + string s=string(""); #ifdef VERBOSE cout << "returning type" << pos << endl; @@ -690,14 +690,14 @@ string multiSlsDetector::sgetDetectorsType(int pos) { } } return s; - + } int multiSlsDetector::getDetectorId(int pos) { - + #ifdef VERBOSE cout << "Getting detector ID " << pos << endl; #endif @@ -705,7 +705,7 @@ int multiSlsDetector::getDetectorId(int pos) { if (pos>=0) { if (detectors[pos]) return detectors[pos]->getDetectorId(); - } + } return -1; } @@ -721,12 +721,12 @@ int multiSlsDetector::setDetectorId(int ival, int pos){ return -1; } return -1; - + } int multiSlsDetector::addSlsDetector(const char *name, int pos) { - + detectorType t=getDetectorType(string(name)); int online=0; slsDetector *s=NULL; @@ -741,13 +741,13 @@ int multiSlsDetector::addSlsDetector(const char *name, int pos) { if (detectors[i]) { if (detectors[i]->getHostname()==string(name)) { cout << "Detector " << name << "already part of the multiDetector in position " << i << "!" << endl<< "Remove it before adding it back in a new position!"<< endl; - return -1; + return -1; } } } - + //checking that the detector doesn't already exists - + for (id=0; id0) { #ifdef VERBOSE @@ -776,7 +776,7 @@ int multiSlsDetector::addSlsDetector(const char *name, int pos) { #endif online=1; } - } + } #ifdef VERBOSE else cout << "Adding detector by type " << getDetectorType(t) << endl; @@ -790,7 +790,7 @@ int multiSlsDetector::addSlsDetector(const char *name, int pos) { break; } } - + #ifdef VERBOSE cout << "Creating detector " << id << " of type " << getDetectorType(t) << endl; #endif @@ -823,12 +823,12 @@ int multiSlsDetector::addSlsDetector(detectorType t, int pos) { break; } } - + #ifdef VERBOSE cout << "Creating detector " << id << " of type " << getDetectorType(t) << endl; #endif - slsDetector *s=new slsDetector(pos, t, id, this); - s=NULL; + new slsDetector(pos, t, id, this); + #ifdef VERBOSE cout << "Adding it to the multi detector structure" << endl; #endif @@ -855,15 +855,15 @@ int multiSlsDetector::getDetectorOffset(int pos, int &ox, int &oy) { } int multiSlsDetector::setDetectorOffset(int pos, int ox, int oy) { - - + + int ret=FAIL; - + if (pos>=0 && posnumberOfDetectors) { if (detectors[pos]) { if (ox!=-1) thisMultiDetector->offsetX[pos]=ox; - if (oy!=-1) + if (oy!=-1) thisMultiDetector->offsetY[pos]=oy; ret=OK; } @@ -875,12 +875,12 @@ int multiSlsDetector::setDetectorOffset(int pos, int ox, int oy) { int multiSlsDetector::removeSlsDetector(char *name){ for (int id=0; idnumberOfDetectors; ++id) { - if (detectors[id]) { - if (detectors[id]->getHostname()==string(name)) { - removeSlsDetector(id); - } - } - } + if (detectors[id]) { + if (detectors[id]->getHostname()==string(name)) { + removeSlsDetector(id); + } + } + } return thisMultiDetector->numberOfDetectors; }; @@ -889,7 +889,7 @@ int multiSlsDetector::removeSlsDetector(char *name){ int multiSlsDetector::removeSlsDetector(int pos) { int j; - + #ifdef VERBOSE cout << "Removing detector in position " << pos << endl; #endif @@ -910,7 +910,7 @@ int multiSlsDetector::removeSlsDetector(int pos) { //j=pos; for (j=mi; jdataBytes-=detectors[j]->getDataBytes(); @@ -947,7 +947,7 @@ int multiSlsDetector::removeSlsDetector(int pos) { - + int multiSlsDetector::setMaster(int i) { int ret=-1, slave=0; @@ -991,7 +991,7 @@ int multiSlsDetector::setMaster(int i) { } } - + } // check return value @@ -1026,10 +1026,10 @@ int multiSlsDetector::setMaster(int i) { } if (slave>0 && ret<0) ret=-2; - + if (ret<0) ret=-1; - + thisMultiDetector->masterPosition=ret; return thisMultiDetector->masterPosition; @@ -1042,17 +1042,17 @@ int multiSlsDetector::setMaster(int i) { // MASTER_TRIGGERS, /**< the master triggers the other detectors */ // SLAVE_STARTS_WHEN_MASTER_STOPS /**< the slave acquires when the master finishes, to avoid deadtime */ // } - -/** + +/** Sets/gets the synchronization mode of the various detectors \param sync syncronization mode \returns current syncronization mode */ slsDetectorDefs::synchronizationMode multiSlsDetector::setSynchronization(synchronizationMode sync) { - + synchronizationMode ret=GET_SYNCHRONIZATION_MODE, ret1=GET_SYNCHRONIZATION_MODE; - + for (int id=0; idnumberOfDetectors; ++id) { if (detectors[id]) { ret1=detectors[id]->setSynchronization(sync); @@ -1066,11 +1066,11 @@ slsDetectorDefs::synchronizationMode multiSlsDetector::setSynchronization(synchr } } - + thisMultiDetector->syncMode=ret; return thisMultiDetector->syncMode; - + } @@ -1191,10 +1191,10 @@ int multiSlsDetector::exists() { - + int multiSlsDetector::getThresholdEnergy(int pos) { - + int i, posmin, posmax; int ret1=-100, ret; @@ -1216,15 +1216,15 @@ int multiSlsDetector::getThresholdEnergy(int pos) { ret1=ret; else if (ret<(ret1-200) || ret>(ret1+200)) ret1=-1; - + } - + } thisMultiDetector->currentThresholdEV=ret1; return ret1; -} +} int multiSlsDetector::setThresholdEnergy(int e_eV, int pos, detectorSettings isettings, int tb) { @@ -1273,7 +1273,7 @@ int multiSlsDetector::setThresholdEnergy(int e_eV, int pos, detectorSettings ise thisMultiDetector->currentThresholdEV=ret; return ret; } - + @@ -1656,7 +1656,7 @@ int multiSlsDetector::startReadOut(){ } return ret1; - + }; @@ -1747,7 +1747,7 @@ int* multiSlsDetector::readFrame(){ int n; int* retval=new int[nel]; int *retdet, *p=retval; - + /** probably it's always better to have one integer per channel in any case! */ for (int id=0; idnumberOfDetectors; ++id) { @@ -1779,7 +1779,7 @@ int* multiSlsDetector::readFrame(){ int* multiSlsDetector::readAll(){ - + /** Thread for each detector?!?!?! */ // int fnum=F_READ_ALL; @@ -1791,7 +1791,7 @@ int* multiSlsDetector::readAll(){ std::cout<< "Reading all frames "<< std::endl; #endif if (thisMultiDetector->onlineFlag==ONLINE_FLAG) { - + for (int id=0; idnumberOfDetectors; ++id) { if (detectors[id]) { detectors[id]->readAllNoWait(); @@ -1812,14 +1812,14 @@ int* multiSlsDetector::readAll(){ if (detectors[id]) { detectors[id]->disconnectControl(); } - } - + } + } #ifdef VERBOSE std::cout<< "received "<< i<< " frames" << std::endl; //#else - // std::cout << std::endl; + // std::cout << std::endl; #endif return dataQueueFront(); // check what we return! @@ -1842,7 +1842,7 @@ int* multiSlsDetector::startAndReadAll(){ return NULL; } startAndReadAllNoWait(); - + while ((retval=getDataFromDetector())){ ++i; #ifdef VERBOSE @@ -1858,17 +1858,17 @@ int* multiSlsDetector::startAndReadAll(){ detectors[id]->disconnectControl(); } } - + } #ifdef VERBOSE std::cout<< "MMMM recieved "<< i<< " frames" << std::endl; //#else - // std::cout << std::endl; + // std::cout << std::endl; #endif return dataQueueFront(); // check what we return! - + }; @@ -1940,7 +1940,7 @@ slsDetectorDefs::runStatus multiSlsDetector::getRunStatus() { } for (int i=0; inumberOfDetectors; ++i) { - s1=detectors[i]->getRunStatus(); + s1=detectors[i]->getRunStatus(); if(detectors[i]->getErrorMask()) setErrorMask(getErrorMask()|(1<masterPosition>=0) if (detectors[thisMultiDetector->masterPosition]){ - ret1 = detectors[thisMultiDetector->masterPosition]->getTimeLeft(index); + ret1 = detectors[thisMultiDetector->masterPosition]->getTimeLeft(index); if(detectors[thisMultiDetector->masterPosition]->getErrorMask()) setErrorMask(getErrorMask()|(1<masterPosition)); return ret1; } - + for (i=0; inumberOfDetectors; ++i) { if (detectors[i]) { ret=detectors[i]->getTimeLeft(index); @@ -2077,9 +2077,9 @@ int64_t multiSlsDetector::getTimeLeft(timerIndex index){ ret1=-1; } } - + return ret1; - + } @@ -2087,9 +2087,9 @@ int64_t multiSlsDetector::getTimeLeft(timerIndex index){ int multiSlsDetector::setSpeed(speedVariable index, int value){ int i; int ret1=-100, ret; - - + + for (i=0; inumberOfDetectors; ++i) { if (detectors[i]) { ret=detectors[i]->setSpeed(index,value); @@ -2101,9 +2101,9 @@ int multiSlsDetector::setSpeed(speedVariable index, int value){ ret1=FAIL; } } - + return ret1; - + } @@ -2119,9 +2119,9 @@ int multiSlsDetector::setSpeed(speedVariable index, int value){ int multiSlsDetector::getDataBytes(){ - int ret=0; + int ret=0; for (int ip=0; ipnumberOfDetectors; ++ip) { - if (detectors[ip]) + if (detectors[ip]) ret+=detectors[ip]->getDataBytes(); } return ret; @@ -2146,7 +2146,7 @@ int multiSlsDetector::setDynamicRange(int n, int pos){ imi=pos; ima=pos+1; } - + for (i=imi; igetDataBytes()/sizeof(int); detp+=n; // if (detectors[0]->getDetectorsType()==JUNGFRAUCTB) { @@ -2561,7 +2561,7 @@ double* multiSlsDetector::decodeData(int *datain, int &nn, double *fdata) { return dataout; } - + //Correction /* enum correctionFlags { @@ -2605,13 +2605,13 @@ int multiSlsDetector::setFlatFieldCorrection(string fname){ if (fname=="default") { fname=string(thisMultiDetector->flatFieldFile); - } - + } + thisMultiDetector->correctionMask&=~(1<flatFieldDir,fname.c_str()); nch=readDataFile(string(ffffname),data); - + if (nch>thisMultiDetector->numberOfChannels) nch=thisMultiDetector->numberOfChannels; - + if (nch>0) { - + //???? bad ff chans? int nm=getNMods(); int chpm[nm]; @@ -2651,18 +2651,18 @@ int multiSlsDetector::setFlatFieldCorrection(string fname){ fillBadChannelMask(); if ((postProcessingFuncs::calculateFlatField(&nm, chpm, mMask, badChannelMask, data, ffcoefficients, fferrors))>=0) { strcpy(thisMultiDetector->flatFieldFile,fname.c_str()); - - + + thisMultiDetector->correctionMask|=(1<correctionMask&(1<getMaxMods(); } - - + + } } return getNMods(); @@ -3059,14 +3059,14 @@ int multiSlsDetector::setBadChannelCorrection(string fname){ if (fname=="default") fname=string(thisMultiDetector->badChanFile); - - - + + + ret=setBadChannelCorrection(fname, nbad, badlist); //#ifdef VERBOSE - cout << "multi: file contained " << ret << " badchans" << endl; + cout << "multi: file contained " << ret << " badchans" << endl; //#endif if (ret==0) { thisMultiDetector->correctionMask&=~(1<0) { thisMultiDetector->correctionMask|=(1<=detectors[idet]->getMaxNumberOfChannels()) { @@ -3119,7 +3119,7 @@ int multiSlsDetector::setBadChannelCorrection(int nbad, int *badlist, int ff) { } } if (nbaddet>0) { - + if (detectors[idet]) { #ifdef VERBOSE cout << "setting " << nbaddet << " badchans to detector " << idet << endl; @@ -3143,7 +3143,7 @@ int multiSlsDetector::setBadChannelCorrection(int nbad, int *badlist, int ff) { setErrorMask(getErrorMask()|(1<numberOfDetectors; ++i) { @@ -3157,8 +3157,8 @@ int multiSlsDetector::setBadChannelCorrection(int nbad, int *badlist, int ff) { } } thisMultiDetector->correctionMask&=~(1<correctionMask&(1<correctionMask&(1<correctionMask&(1<< ANGULAR_CONVERSION)) { return 1; - } + } return 0; - + } @@ -3540,7 +3540,7 @@ int multiSlsDetector::setChannel(int64_t reg, int ichan, int ichip, int imod) { int ret, ret1=-100; int id=-1, im=-1; int dmi=0, dma=thisMultiDetector->numberOfDetectors; - + if (decodeNMod(imod, id, im)>=0) { dmi=id; dma=id+1; @@ -3557,7 +3557,7 @@ int multiSlsDetector::setChannel(int64_t reg, int ichan, int ichip, int imod) { } } return ret1; - + } @@ -3572,9 +3572,9 @@ int multiSlsDetector::setChannel(int64_t reg, int ichan, int ichip, int imod) { double multiSlsDetector::setAngularConversionParameter(angleConversionParameter c, double v) { double ret=slsDetectorUtils::setAngularConversionParameter(c,v); for (int idet=0; idetnumberOfDetectors; ++idet) { - + if (detectors[idet]) { - + detectors[idet]->setAngularConversionParameter(c,v); if(detectors[idet]->getErrorMask()) setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) { - + // if (detectors[idet]) { // #ifdef EPICS // // cout << "convert angle det " << idet << endl; @@ -3618,7 +3618,7 @@ double multiSlsDetector::setAngularConversionParameter(angleConversionParameter int multiSlsDetector::getBadChannelCorrection(int *bad) { //int ichan; int *bd, nd, ntot=0, choff=0;; - + if (((thisMultiDetector->correctionMask)&(1<< DISCARD_BAD_CHANNELS))==0) return 0; //else @@ -3644,7 +3644,7 @@ int multiSlsDetector::getBadChannelCorrection(int *bad) { delete [] bd; } else ntot+=nd; - + } } return ntot; @@ -3669,7 +3669,7 @@ int multiSlsDetector::exitServer() { /** returns the detector trimbit/settings directory */ char* multiSlsDetector::getSettingsDir() { string s0="", s1="", s; - + //char ans[1000]; for (int idet=0; idetnumberOfDetectors; ++idet) { @@ -3849,7 +3849,7 @@ char* multiSlsDetector::setCalDir(string s){ } return getCalDir(); -} +} /** returns the location of the calibration files @@ -3947,7 +3947,7 @@ string multiSlsDetector::setNetworkParameter(networkParameter p, string s){ return getNetworkParameter(p); -} +} int multiSlsDetector::setPort(portType t, int p) { @@ -3990,7 +3990,7 @@ int multiSlsDetector::lockServer(int p) { string multiSlsDetector::getLastClientIP() { string s0="", s1="",s ; - + for (int idet=0; idetnumberOfDetectors; ++idet) { if (detectors[idet]) { s=detectors[idet]->getLastClientIP(); @@ -4049,7 +4049,7 @@ slsDetectorDefs::externalCommunicationMode multiSlsDetector::setExternalCommunic if(detectors[0]->getErrorMask()) setErrorMask(getErrorMask()|(1<<0)); - + for (int idet=1; idetnumberOfDetectors; ++idet) { if (detectors[idet]) { ret1=detectors[idet]->setExternalCommunicationMode(pol); @@ -4108,7 +4108,7 @@ slsDetectorDefs::externalSignalFlag multiSlsDetector::setExternalSignalFlags(ext string multiSlsDetector::getSettingsFile() { string s0="", s1="",s ; - + for (int idet=0; idetnumberOfDetectors; ++idet) { if (detectors[idet]) { s=detectors[idet]->getSettingsFile(); @@ -4327,7 +4327,7 @@ int multiSlsDetector::getMaxMods() { int ret=0, ret1; - + for (int idet=0; idetnumberOfDetectors; ++idet) { if (detectors[idet]) { ret1=detectors[idet]->getMaxMods(); @@ -4390,7 +4390,7 @@ int multiSlsDetector::getMaxMod(dimension d){ int multiSlsDetector::getMaxNumberOfModules(dimension d) { int ret=0, ret1; - + for (int idet=0; idetnumberOfDetectors; ++idet) { if (detectors[idet]) { ret1=detectors[idet]->getMaxNumberOfModules(d); @@ -4543,12 +4543,12 @@ int multiSlsDetector::decodeNMod(int i, int &id, int &im) { cout <<" C---------" << id << " position " << im << endl; #endif return -1; - + } - + int64_t multiSlsDetector::getId(idMode mode, int imod) { int id, im; @@ -4799,7 +4799,7 @@ int multiSlsDetector::setAllTrimbits(int val, int imod){ return -1; } } - + // multi if(!threadpool){ cout << "Error in creating threadpool. Exiting" << endl; @@ -5113,14 +5113,14 @@ int multiSlsDetector::readConfigurationFile(string const fname){ while (ssstr.good()) { ssstr >> sargname; //if (ssstr.good()) { -#ifdef VERBOSE +#ifdef VERBOSE std::cout<< iargval << " " << sargname << std::endl; #endif strcpy(myargs[iargval], sargname.c_str()); args[iargval]=myargs[iargval]; -#ifdef VERBOSE +#ifdef VERBOSE std::cout<< "--" << iargval << " " << args[iargval] << std::endl; #endif @@ -5168,7 +5168,7 @@ int multiSlsDetector::readConfigurationFile(string const fname){ return OK; -}; +}; @@ -5286,7 +5286,7 @@ int multiSlsDetector::writeDataFile(string fname, double *data, double *err, dou ofstream outfile; - int choff=0, off=0; //idata, + int choff=0, off=0; //idata, double *pe=err, *pa=ang; int nch_left=nch, n;//, nd; @@ -5300,9 +5300,9 @@ int multiSlsDetector::writeDataFile(string fname, double *data, double *err, dou outfile.open (fname.c_str(),ios_base::out); if (outfile.is_open()) { - + for (int i=0; inumberOfDetectors; ++i) { - + if (detectors[i]) { n=detectors[i]->getTotalNumberOfChannels(); if (nch_leftgetMaxNumberOfChannels(); - + off+=n; - + if (pe) pe=err+off; - + if (pa) pa=ang+off; - + } - + } outfile.close(); return OK; @@ -5384,7 +5384,7 @@ int multiSlsDetector::readDataFile(string fname, double *data, double *err, doub #endif ifstream infile; - int iline=0;//ichan, + int iline=0;//ichan, //int interrupt=0; string str; int choff=0, off=0; @@ -6416,7 +6416,7 @@ string multiSlsDetector::getReceiverLastClientIP() { s=detectors[idet]->getReceiverLastClientIP(); if(detectors[idet]->getErrorMask()) setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) @@ -6998,4 +6998,3 @@ bool multiSlsDetector::isAcquireReady() { thisMultiDetector->acquiringFlag = true; return OK; } - From 9ba3fb9279f07c76c917805d7fed0970cb766dbd Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Fri, 16 Mar 2018 10:51:27 +0100 Subject: [PATCH 02/25] removed using namespace std from multiSlsDetector --- slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index becc2fd76..1a2d1e21f 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -24,7 +24,7 @@ ID: $Id$ #include #include #include -using namespace std; + char ans[MAX_STR_LENGTH]; From d59f4193706953587298dd486d3fbdde54d9d153 Mon Sep 17 00:00:00 2001 From: Gemma Tinti Date: Tue, 20 Mar 2018 11:32:09 +0100 Subject: [PATCH 03/25] manual --- manual/manual-client/Eiger_short.tex | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/manual/manual-client/Eiger_short.tex b/manual/manual-client/Eiger_short.tex index d133b7730..f9cb8cf72 100644 --- a/manual/manual-client/Eiger_short.tex +++ b/manual/manual-client/Eiger_short.tex @@ -694,7 +694,15 @@ Start the server again: \begin{verbatim} ./eigerDetectorServer & \end{verbatim} +\textbf{Note that the server appropiate for the software version used is located inside the package: {\tt{slsDetectorsPackage/serverBin/eigerDetectorServerxx.yy.}}}. +To copy the detector server on many boards, a script can be implemented on the lines of: +\begin{verbatim} +for i in beb111 beb070; +do ssh root@$i killall eigerDetectorServer; +scp eigerDetectorServer root@$i:~/executables/eigerDetectorServer ; +ssh root@$i sync; done +\end{verbatim} \section{Loading firmware bitfiles} @@ -835,6 +843,10 @@ It is connected to the TCPport which the receiver uses: %%%#To display only open UDP ports try the following command: netstat -vaun \end{itemize} +\subsection{Zmq socket is blocked} +It is connected to the TCPport which is used. In rare cases, it might be that the TCP port crashes. To find out which process uses the TCPPOrt do: \textbf{netstat -nlp | grep xxxx}, where xxxx is the tcpport number. To display open ports and established TCP connections, enter: \textbf{netstat -vatn}. Kill the process. + + \subsection{Client has \textbf{shmget error}} Note that occasionally if there is a shared memory of a different size (from an older software version), it will return also a line like this: \begin{verbatim} From 98752e1cdbd78167ad20c6a01a17852b1a2263a7 Mon Sep 17 00:00:00 2001 From: Gemma Tinti Date: Tue, 20 Mar 2018 11:40:37 +0100 Subject: [PATCH 04/25] manual --- manual/manual-client/Eiger_short.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manual/manual-client/Eiger_short.tex b/manual/manual-client/Eiger_short.tex index f9cb8cf72..2c704cf74 100644 --- a/manual/manual-client/Eiger_short.tex +++ b/manual/manual-client/Eiger_short.tex @@ -82,8 +82,8 @@ The receiver is a process run on a PC closely connected to the detector. Open on where xxxx, yyyy are the tcp port numbers. Use 1955 and 1956 for example. Note that in older version of the software {\tt{--mode 1}} was used only for the ``bottom'' half module. Now, the receiver for the bottom is open without arguments anymore, but still in the configuration file one needs to write {\tt{n:flippeddatax 1}}, where {\tt{n}} indicated the half module number, 1 if it is a module. \\ Open as many receiver as half module boards. A single module has two half module boards. -From the software version 3.0.1, one can decide weather start a zmq callback from the receiver to the client (for example to visualize data in the slsDetectorGui or another gui). If the zmq steam is not required (cased of the command line for example, one can switch off the streaming with {\tt{./sls\_detector\_put rx\_datastream 0}}, enable it with {\tt{./sls\_detector\_put rx\_datastream 1}}. In the case of inizialising the stream to use the slsDetectorGui, nothing needs to be taken care of by the user. If instead you want to stream the streaming on different channels, the zmq port of the client can be set stealing from the slsDetectorGui stream having {\tt{./sls\_detector\_put n:zmqport 300y}}, where n is each half module independently, matching the receiver stream {\tt{./sls\_detector\_put n:rx\_zmqport 300y}}. - +From the software version 3.0.1, one can decide weather start a zmq callback from the receiver to the client (for example to visualize data in the slsDetectorGui or another gui). If the zmq steam is not required (cased of the command line for example, one can switch off the streaming with {\tt{./sls\_detector\_put rx\_datastream 0}}, enable it with {\tt{./sls\_detector\_put rx\_datastream 1}}. In the case of inizialising the stream to use the slsDetectorGui, nothing needs to be taken care of by the user. If instead you want to stream the streaming on different channels, the zmq port of the client can be set stealing from the slsDetectorGui stream having {\tt{./sls\_detector\_put zmqport 300y}}. Note taht if this is done globally (not for every half module n independently, then the client automatically takes into account that for every half module, there are 2 zmq stream. The receiver stream {\tt{./sls\_detector\_put rx\_zmqport 300y}} has to match such that the GUI can work. +If one desires to set the zmqport manually, he offset has to be taken into account: {\tt{./sls\_detector\_put 0:rx\_zmqport 300y}}, {\tt{./sls\_detector\_put 1:rx\_zmqport 300y+2}} and so on.. There is an example code that can be compiled in {\tt{manual/manual-api/mainReceiver.cpp}} and gives the executable {\tt{./detReceiver}}, use it with two or more receivers to open all receivers in one single terminal: {\tt{./detReceiver startTCPPort numReceivers withCallback}}, where startTCPPort assumes the other ports are consecutively increased. From 688dd15fe9ee45ae3048b3b52918da5f31283a22 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 20 Mar 2018 12:12:38 +0100 Subject: [PATCH 05/25] Jungfrau bug fix: cannot give same adcphase value to pll, updated recommended default of adcphase for half speed and quarter speed, updated client manuals for both adcphase and clkdivider --- .../slsDetectorClientDocs/acquisition.html | 2 +- .../html/slsDetectorClientDocs/actions.html | 2 +- .../html/slsDetectorClientDocs/advanced.html | 2 +- .../html/slsDetectorClientDocs/config.html | 6 +++--- .../docs/html/slsDetectorClientDocs/ctb.html | 2 +- .../docs/html/slsDetectorClientDocs/data.html | 2 +- .../html/slsDetectorClientDocs/index.html | 2 +- .../html/slsDetectorClientDocs/network.html | 2 +- .../html/slsDetectorClientDocs/output.html | 2 +- .../html/slsDetectorClientDocs/pages.html | 2 +- .../html/slsDetectorClientDocs/receiver.html | 2 +- .../html/slsDetectorClientDocs/settings.html | 2 +- .../docs/html/slsDetectorClientDocs/test.html | 2 +- .../html/slsDetectorClientDocs/timing.html | 2 +- .../html/slsDetectorClientHowTo/images.log | 2 +- .../html/slsDetectorClientHowTo/index.html | 4 ++-- .../html/slsDetectorClientHowTo/node1.html | 2 +- .../html/slsDetectorClientHowTo/node2.html | 2 +- .../html/slsDetectorClientHowTo/node3.html | 2 +- .../html/slsDetectorClientHowTo/node4.html | 2 +- .../html/slsDetectorClientHowTo/node5.html | 2 +- .../html/slsDetectorClientHowTo/node6.html | 4 ++-- .../slsDetectorClientHowTo.html | 4 ++-- manual/docs/pdf/slsDetectorClientDocs.pdf | Bin 130355 -> 130667 bytes manual/docs/pdf/slsDetectorClientHowTo.pdf | Bin 121025 -> 121024 bytes serverBin/jungfrauDetectorServerv3.1.0.2 | 1 - serverBin/jungfrauDetectorServerv3.1.1.0 | 1 + slsDetectorSoftware/gitInfo.txt | 12 ++++++------ ...3.1.0.2 => jungfrauDetectorServerv3.1.1.0} | Bin 110264 -> 110280 bytes .../jungfrauDetectorServer/gitInfo.txt | 12 ++++++------ .../jungfrauDetectorServer/gitInfoJungfrau.h | 10 +++++----- .../slsDetectorFunctionList.c | 12 +++++++++--- .../slsDetectorServer_defs.h | 4 ++-- slsDetectorSoftware/slsDetector/gitInfoLib.h | 10 +++++----- .../slsDetector/slsDetectorCommand.cpp | 13 ++++++------- .../slsDetector/slsDetectorUsers.h | 4 ++-- .../slsDetectorServer_funcs.c | 2 +- 37 files changed, 71 insertions(+), 66 deletions(-) delete mode 120000 serverBin/jungfrauDetectorServerv3.1.0.2 create mode 120000 serverBin/jungfrauDetectorServerv3.1.1.0 rename slsDetectorSoftware/jungfrauDetectorServer/bin/{jungfrauDetectorServerv3.1.0.2 => jungfrauDetectorServerv3.1.1.0} (52%) diff --git a/manual/docs/html/slsDetectorClientDocs/acquisition.html b/manual/docs/html/slsDetectorClientDocs/acquisition.html index b8fc5722a..be1c15d7e 100644 --- a/manual/docs/html/slsDetectorClientDocs/acquisition.html +++ b/manual/docs/html/slsDetectorClientDocs/acquisition.html @@ -78,7 +78,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); -
Generated on 12 Mar 2018 by  +
Generated on 20 Mar 2018 by  doxygen 1.6.1
diff --git a/manual/docs/html/slsDetectorClientDocs/actions.html b/manual/docs/html/slsDetectorClientDocs/actions.html index 110d24adb..6649c951c 100644 --- a/manual/docs/html/slsDetectorClientDocs/actions.html +++ b/manual/docs/html/slsDetectorClientDocs/actions.html @@ -129,7 +129,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); -
Generated on 12 Mar 2018 by  +
Generated on 20 Mar 2018 by  doxygen 1.6.1
diff --git a/manual/docs/html/slsDetectorClientDocs/advanced.html b/manual/docs/html/slsDetectorClientDocs/advanced.html index 0c1eb0353..984ebcac7 100644 --- a/manual/docs/html/slsDetectorClientDocs/advanced.html +++ b/manual/docs/html/slsDetectorClientDocs/advanced.html @@ -54,7 +54,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); -
Generated on 12 Mar 2018 by  +
Generated on 20 Mar 2018 by  doxygen 1.6.1
diff --git a/manual/docs/html/slsDetectorClientDocs/config.html b/manual/docs/html/slsDetectorClientDocs/config.html index 12f4e1727..87f0df5ea 100644 --- a/manual/docs/html/slsDetectorClientDocs/config.html +++ b/manual/docs/html/slsDetectorClientDocs/config.html @@ -183,7 +183,7 @@ Versions Speed

commands to configure speed of detector

    -
  • clkdivider [i] sets/gets the readout clock divider. EIGER, JUNGFRAU [0(fast speed), 1(half speed), 2(quarter speed)]. MYTHEN[???]. Returns (int)
  • +
  • clkdivider [i] sets/gets the readout clock divider. EIGER, JUNGFRAU [0(fast speed), 1(half speed), 2(quarter speed)]. Jungfrau, full speed is not implemented and overwrites adcphase to recommended default. MYTHEN[???]. Returns (int)
  • setlength [i] sets/gets length of set/reset signals (in clock cycles). Used in MYTHEN only. Returns (int)
  • @@ -207,7 +207,7 @@ Speed
  • adcclk [i] sets/gets the ADC clock frequency in MHz. For the new chiptestboard!Returns (int)
    -
  • adcphase [i] Sets/gets the ADC clock frequency in MHz. For the new chiptestboard!Returns (int)
  • +
  • adcphase [i] Sets/gets phase of the sampling clock. For JUNGFRAU, setting speed (clkdivider) overwrites adcphase to its default recommended value. (Not for EIGER) Returns (int)
  • adcpipeline [i] Sets/gets the pipeline of the ADC. For the new chiptestbaord!Returns (int)
  • @@ -251,7 +251,7 @@ Detector Parameters -
    Generated on 12 Mar 2018 by  +
    Generated on 20 Mar 2018 by  doxygen 1.6.1
    diff --git a/manual/docs/html/slsDetectorClientDocs/ctb.html b/manual/docs/html/slsDetectorClientDocs/ctb.html index c2c8f60cd..5742a888c 100644 --- a/manual/docs/html/slsDetectorClientDocs/ctb.html +++ b/manual/docs/html/slsDetectorClientDocs/ctb.html @@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); -
    Generated on 12 Mar 2018 by  +
    Generated on 20 Mar 2018 by  doxygen 1.6.1
    diff --git a/manual/docs/html/slsDetectorClientDocs/data.html b/manual/docs/html/slsDetectorClientDocs/data.html index 2e7f9c497..87c1cc5b5 100644 --- a/manual/docs/html/slsDetectorClientDocs/data.html +++ b/manual/docs/html/slsDetectorClientDocs/data.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); -
    Generated on 12 Mar 2018 by  +
    Generated on 20 Mar 2018 by  doxygen 1.6.1
    diff --git a/manual/docs/html/slsDetectorClientDocs/index.html b/manual/docs/html/slsDetectorClientDocs/index.html index 3d209f2ab..b14200830 100644 --- a/manual/docs/html/slsDetectorClientDocs/index.html +++ b/manual/docs/html/slsDetectorClientDocs/index.html @@ -83,7 +83,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); -
    Generated on 12 Mar 2018 by  +
    Generated on 20 Mar 2018 by  doxygen 1.6.1
    diff --git a/manual/docs/html/slsDetectorClientDocs/network.html b/manual/docs/html/slsDetectorClientDocs/network.html index c15aed89f..9915194e0 100644 --- a/manual/docs/html/slsDetectorClientDocs/network.html +++ b/manual/docs/html/slsDetectorClientDocs/network.html @@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); -
    Generated on 12 Mar 2018 by  +
    Generated on 20 Mar 2018 by  doxygen 1.6.1
    diff --git a/manual/docs/html/slsDetectorClientDocs/output.html b/manual/docs/html/slsDetectorClientDocs/output.html index 3220cad15..1d8ce9f7d 100644 --- a/manual/docs/html/slsDetectorClientDocs/output.html +++ b/manual/docs/html/slsDetectorClientDocs/output.html @@ -75,7 +75,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); -
    Generated on 12 Mar 2018 by  +
    Generated on 20 Mar 2018 by  doxygen 1.6.1
    diff --git a/manual/docs/html/slsDetectorClientDocs/pages.html b/manual/docs/html/slsDetectorClientDocs/pages.html index c4975f0ba..34504a49d 100644 --- a/manual/docs/html/slsDetectorClientDocs/pages.html +++ b/manual/docs/html/slsDetectorClientDocs/pages.html @@ -77,7 +77,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); -
    Generated on 12 Mar 2018 by  +
    Generated on 20 Mar 2018 by  doxygen 1.6.1
    diff --git a/manual/docs/html/slsDetectorClientDocs/receiver.html b/manual/docs/html/slsDetectorClientDocs/receiver.html index b2e5e1607..455ec0ba8 100644 --- a/manual/docs/html/slsDetectorClientDocs/receiver.html +++ b/manual/docs/html/slsDetectorClientDocs/receiver.html @@ -87,7 +87,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); -
    Generated on 12 Mar 2018 by  +
    Generated on 20 Mar 2018 by  doxygen 1.6.1
    diff --git a/manual/docs/html/slsDetectorClientDocs/settings.html b/manual/docs/html/slsDetectorClientDocs/settings.html index 37674d98a..9f800e86e 100644 --- a/manual/docs/html/slsDetectorClientDocs/settings.html +++ b/manual/docs/html/slsDetectorClientDocs/settings.html @@ -317,7 +317,7 @@ Temp Control -
    Generated on 12 Mar 2018 by  +
    Generated on 20 Mar 2018 by  doxygen 1.6.1
    diff --git a/manual/docs/html/slsDetectorClientDocs/test.html b/manual/docs/html/slsDetectorClientDocs/test.html index 7f7f52321..af1cafd7e 100644 --- a/manual/docs/html/slsDetectorClientDocs/test.html +++ b/manual/docs/html/slsDetectorClientDocs/test.html @@ -96,7 +96,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); -
    Generated on 12 Mar 2018 by  +
    Generated on 20 Mar 2018 by  doxygen 1.6.1
    diff --git a/manual/docs/html/slsDetectorClientDocs/timing.html b/manual/docs/html/slsDetectorClientDocs/timing.html index cc46d2c8a..9b8be04d0 100644 --- a/manual/docs/html/slsDetectorClientDocs/timing.html +++ b/manual/docs/html/slsDetectorClientDocs/timing.html @@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); -
    Generated on 12 Mar 2018 by  +
    Generated on 20 Mar 2018 by  doxygen 1.6.1
    diff --git a/manual/docs/html/slsDetectorClientHowTo/images.log b/manual/docs/html/slsDetectorClientHowTo/images.log index 0a5cf9e0a..dea7e4a65 100644 --- a/manual/docs/html/slsDetectorClientHowTo/images.log +++ b/manual/docs/html/slsDetectorClientHowTo/images.log @@ -1,4 +1,4 @@ -This is pdfTeXk, Version 3.141592-1.40.3 (Web2C 7.5.6) (format=latex 2014.12.17) 12 MAR 2018 15:45 +This is pdfTeXk, Version 3.141592-1.40.3 (Web2C 7.5.6) (format=latex 2014.12.17) 20 MAR 2018 12:10 entering extended mode %&-line parsing enabled. **./images.tex diff --git a/manual/docs/html/slsDetectorClientHowTo/index.html b/manual/docs/html/slsDetectorClientHowTo/index.html index 9e12192a6..569dcdec8 100644 --- a/manual/docs/html/slsDetectorClientHowTo/index.html +++ b/manual/docs/html/slsDetectorClientHowTo/index.html @@ -43,7 +43,7 @@ original version by: Nikos Drakos, CBLU, University of Leeds

    SLS Detector text clients manual

    -

    March 12, 2018

    +

    March 20, 2018

    @@ -148,7 +148,7 @@ original version by: Nikos Drakos, CBLU, University of Leeds


    Thattil Dhanya -2018-03-12 +2018-03-20
    diff --git a/manual/docs/html/slsDetectorClientHowTo/node1.html b/manual/docs/html/slsDetectorClientHowTo/node1.html index de9ddf858..33dfd2ac8 100644 --- a/manual/docs/html/slsDetectorClientHowTo/node1.html +++ b/manual/docs/html/slsDetectorClientHowTo/node1.html @@ -123,7 +123,7 @@ For additional questions concerning the indexing of the detector, please refer t
    Thattil Dhanya -2018-03-12 +2018-03-20
    diff --git a/manual/docs/html/slsDetectorClientHowTo/node2.html b/manual/docs/html/slsDetectorClientHowTo/node2.html index 7b7ddbac0..f9a02e675 100644 --- a/manual/docs/html/slsDetectorClientHowTo/node2.html +++ b/manual/docs/html/slsDetectorClientHowTo/node2.html @@ -68,7 +68,7 @@ For additional questions concerning the acquisition flow, please refer to the
    Thattil Dhanya -2018-03-12 +2018-03-20
    diff --git a/manual/docs/html/slsDetectorClientHowTo/node3.html b/manual/docs/html/slsDetectorClientHowTo/node3.html index 4ab6a0c0d..3052841e1 100644 --- a/manual/docs/html/slsDetectorClientHowTo/node3.html +++ b/manual/docs/html/slsDetectorClientHowTo/node3.html @@ -763,7 +763,7 @@ Debug
    Thattil Dhanya -2018-03-12 +2018-03-20
    diff --git a/manual/docs/html/slsDetectorClientHowTo/node4.html b/manual/docs/html/slsDetectorClientHowTo/node4.html index e07278383..3e3c7aef4 100644 --- a/manual/docs/html/slsDetectorClientHowTo/node4.html +++ b/manual/docs/html/slsDetectorClientHowTo/node4.html @@ -815,7 +815,7 @@ Advanced settings changing the analog or digital performance of the acquisition.
    Thattil Dhanya -2018-03-12 +2018-03-20
    diff --git a/manual/docs/html/slsDetectorClientHowTo/node5.html b/manual/docs/html/slsDetectorClientHowTo/node5.html index 14c17ae24..e862282da 100644 --- a/manual/docs/html/slsDetectorClientHowTo/node5.html +++ b/manual/docs/html/slsDetectorClientHowTo/node5.html @@ -160,7 +160,7 @@ sls_detector_put ratecorr -1
    Thattil Dhanya -2018-03-12 +2018-03-20
    diff --git a/manual/docs/html/slsDetectorClientHowTo/node6.html b/manual/docs/html/slsDetectorClientHowTo/node6.html index 7b0d9ea22..b04f3ce2a 100644 --- a/manual/docs/html/slsDetectorClientHowTo/node6.html +++ b/manual/docs/html/slsDetectorClientHowTo/node6.html @@ -61,11 +61,11 @@ Mathematics Department, Macquarie University, Sydney. The command line arguments were:
    latex2html -split 4 slsDetectorClientHowTo.tex

    -The translation was initiated by Thattil Dhanya on 2018-03-12 +The translation was initiated by Thattil Dhanya on 2018-03-20


    Thattil Dhanya -2018-03-12 +2018-03-20
    diff --git a/manual/docs/html/slsDetectorClientHowTo/slsDetectorClientHowTo.html b/manual/docs/html/slsDetectorClientHowTo/slsDetectorClientHowTo.html index 9e12192a6..569dcdec8 100644 --- a/manual/docs/html/slsDetectorClientHowTo/slsDetectorClientHowTo.html +++ b/manual/docs/html/slsDetectorClientHowTo/slsDetectorClientHowTo.html @@ -43,7 +43,7 @@ original version by: Nikos Drakos, CBLU, University of Leeds

    SLS Detector text clients manual

    -

    March 12, 2018

    +

    March 20, 2018

    @@ -148,7 +148,7 @@ original version by: Nikos Drakos, CBLU, University of Leeds


    Thattil Dhanya -2018-03-12 +2018-03-20
    diff --git a/manual/docs/pdf/slsDetectorClientDocs.pdf b/manual/docs/pdf/slsDetectorClientDocs.pdf index d383269d8c9a60976784722e4c7fa19688338ab1..5f7a768a50157a7f788327df1688e83ff904e1d3 100644 GIT binary patch delta 37446 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 delta 37172 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 diff --git a/manual/docs/pdf/slsDetectorClientHowTo.pdf b/manual/docs/pdf/slsDetectorClientHowTo.pdf index 123be17979d6562fae7b8cd762bb37089cca252c..216791fa3f18639a27a580e56fb83fd42b2368a3 100644 GIT binary patch delta 5950 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 E0GE_)#Q*>R delta 6305 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 diff --git a/serverBin/jungfrauDetectorServerv3.1.0.2 b/serverBin/jungfrauDetectorServerv3.1.0.2 deleted file mode 120000 index e5ad646f3..000000000 --- a/serverBin/jungfrauDetectorServerv3.1.0.2 +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv3.1.0.2 \ No newline at end of file diff --git a/serverBin/jungfrauDetectorServerv3.1.1.0 b/serverBin/jungfrauDetectorServerv3.1.1.0 new file mode 120000 index 000000000..0a4a0eadd --- /dev/null +++ b/serverBin/jungfrauDetectorServerv3.1.1.0 @@ -0,0 +1 @@ +../slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv3.1.1.0 \ No newline at end of file diff --git a/slsDetectorSoftware/gitInfo.txt b/slsDetectorSoftware/gitInfo.txt index 1720e7069..be251be6f 100644 --- a/slsDetectorSoftware/gitInfo.txt +++ b/slsDetectorSoftware/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: b389402d647e939342dbb2c9317c688c0eb6b105 -Revision: 1714 -Branch: 3.1.0-rc -Last Changed Author: Erik_Frojdh -Last Changed Rev: 3458 -Last Changed Date: 2018-03-12 14:19:44.000000002 +0100 ./threadFiles/ThreadPool.o +Repsitory UUID: 85aa47b8353bb84f52c435a967a03ddf46af5dd1 +Revision: 1716 +Branch: 3.1.1-rc +Last Changed Author: Dhanya_Thattil +Last Changed Rev: 3465 +Last Changed Date: 2018-03-19 18:13:27.000000002 +0100 ./threadFiles/ThreadPool.o diff --git a/slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv3.1.0.2 b/slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv3.1.1.0 similarity index 52% rename from slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv3.1.0.2 rename to slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv3.1.1.0 index 99ac8fd9c95932b8b320482f037bb15ad67c96e0..71daa79333de357ef4e685dc8675987866097fe7 100755 GIT binary patch delta 27488 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 D2vfE| delta 27458 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 diff --git a/slsDetectorSoftware/jungfrauDetectorServer/gitInfo.txt b/slsDetectorSoftware/jungfrauDetectorServer/gitInfo.txt index f3aa14041..47f9f0fac 100644 --- a/slsDetectorSoftware/jungfrauDetectorServer/gitInfo.txt +++ b/slsDetectorSoftware/jungfrauDetectorServer/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware/jungfrauDetectorServer URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: 8b02aa9e91bbee0470492dcf1ff67415851e14fa -Revision: 117 -Branch: 3.1.0-rc -Last Changed Author: Erik_Frojdh -Last Changed Rev: 3455 -Last Changed Date: 2018-03-08 16:44:32.000000002 +0100 ./RegisterDefs.h +Repsitory UUID: 85aa47b8353bb84f52c435a967a03ddf46af5dd1 +Revision: 118 +Branch: 3.1.1-rc +Last Changed Author: Dhanya_Thattil +Last Changed Rev: 3465 +Last Changed Date: 2018-03-19 17:26:38.000000002 +0100 ./RegisterDefs.h diff --git a/slsDetectorSoftware/jungfrauDetectorServer/gitInfoJungfrau.h b/slsDetectorSoftware/jungfrauDetectorServer/gitInfoJungfrau.h index 857ca4ad2..29b3f8b03 100644 --- a/slsDetectorSoftware/jungfrauDetectorServer/gitInfoJungfrau.h +++ b/slsDetectorSoftware/jungfrauDetectorServer/gitInfoJungfrau.h @@ -1,6 +1,6 @@ #define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "8b02aa9e91bbee0470492dcf1ff67415851e14fa" -#define GITAUTH "Erik_Frojdh" -#define GITREV 0x3455 -#define GITDATE 0x20180308 -#define GITBRANCH "3.1.0-rc" +#define GITREPUUID "85aa47b8353bb84f52c435a967a03ddf46af5dd1" +#define GITAUTH "Dhanya_Thattil" +#define GITREV 0x3465 +#define GITDATE 0x20180319 +#define GITBRANCH "3.1.1-rc" diff --git a/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorFunctionList.c b/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorFunctionList.c index 3355be706..a55f1ec59 100644 --- a/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorFunctionList.c @@ -487,9 +487,11 @@ int adcPhase(int st){ /**carlos needed clkphase 1 and 2? cehck with Aldo */ printf("Setting ADC Phase to %d\n",st); if (st > 65535 || st < -65535) return clkPhase[0]; - clkPhase[1] = st - clkPhase[0]; - printf(" phase %d\n", clkPhase[1] ); + clkPhase[1] = st - clkPhase[0]; + if (clkPhase[1] == 0) + return clkPhase[0]; + configurePll(); clkPhase[0] = st; return clkPhase[0]; @@ -1230,8 +1232,12 @@ void configurePll() { #endif u_int32_t val; int32_t phase=0, inv=0; + // ensuring PLL is never configured with same phase + if (clkPhase[1] == 0) { + return; + } - printf(" phase in %d\n", clkPhase[1]); + printf("Configuring PLL with phase in %d\n", clkPhase[1]); if (clkPhase[1]>0) { inv=0; phase=clkPhase[1]; diff --git a/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer_defs.h b/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer_defs.h index c3002121e..bc2600230 100644 --- a/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer_defs.h @@ -101,8 +101,8 @@ enum NETWORKINDEX { TXN_FRAME }; #define CONFIG_QUARTER_SPEED (CONFIG_TDMA_DISABLE_VAL + CONFIG_QUARTER_SPEED_10MHZ_VAL + CONFIG_MODE_1_X_10GBE_VAL) #define ADC_OFST_HALF_SPEED_VAL (0x20) //adc pipeline #define ADC_OFST_QUARTER_SPEED_VAL (0x0f) -#define ADC_PHASE_HALF_SPEED (0x41) -#define ADC_PHASE_QUARTER_SPEED (0x19) +#define ADC_PHASE_HALF_SPEED (0x48) //72 +#define ADC_PHASE_QUARTER_SPEED (0x48) //72 /* Maybe not required for jungfrau */ #define NTRIMBITS (6) diff --git a/slsDetectorSoftware/slsDetector/gitInfoLib.h b/slsDetectorSoftware/slsDetector/gitInfoLib.h index 56e83c55a..29b3f8b03 100644 --- a/slsDetectorSoftware/slsDetector/gitInfoLib.h +++ b/slsDetectorSoftware/slsDetector/gitInfoLib.h @@ -1,6 +1,6 @@ #define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "b389402d647e939342dbb2c9317c688c0eb6b105" -#define GITAUTH "Erik_Frojdh" -#define GITREV 0x3458 -#define GITDATE 0x20180312 -#define GITBRANCH "3.1.0-rc" +#define GITREPUUID "85aa47b8353bb84f52c435a967a03ddf46af5dd1" +#define GITAUTH "Dhanya_Thattil" +#define GITREV 0x3465 +#define GITDATE 0x20180319 +#define GITBRANCH "3.1.1-rc" diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 7a6536c51..bc0a34793 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -710,7 +710,7 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { */ /*! \page config - - clkdivider [i] sets/gets the readout clock divider. EIGER, JUNGFRAU [0(fast speed), 1(half speed), 2(quarter speed)]. MYTHEN[???]. \c Returns \c (int) + - clkdivider [i] sets/gets the readout clock divider. EIGER, JUNGFRAU [0(fast speed), 1(half speed), 2(quarter speed)]. Jungfrau, full speed is not implemented and overwrites adcphase to recommended default. MYTHEN[???]. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="clkdivider"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; @@ -766,7 +766,7 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { ++i; /*! \page config - - adcphase [i] Sets/gets the ADC clock frequency in MHz. For the new chiptestboard!\c Returns \c (int) + - adcphase [i] Sets/gets phase of the sampling clock. For JUNGFRAU, setting speed (clkdivider) overwrites adcphase to its default recommended value. (Not for EIGER) \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="adcphase"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; @@ -5685,9 +5685,6 @@ string slsDetectorCommand::cmdSpeed(int narg, char *args[], int action) { return string("cannot scan speed value ")+string(args[1]); } - // -1 could work - else if (cmd=="adcphase") - t = 65536; myDet->setOnline(ONLINE_FLAG); @@ -5707,21 +5704,23 @@ string slsDetectorCommand::helpSpeed(int narg, char *args[], int action) { ostringstream os; if (action==PUT_ACTION || action==HELP_ACTION) { - os << "clkdivider c \t sets readout clock divider" << std::endl; + os << "clkdivider c \t sets readout clock divider. For Jungfrau, it also overwrites adcphase to recommended default" << std::endl; os << "setlength c\t sets the length of the set/reset signals (in clock cycles)" << std::endl; os << "waitstates c \t sets the waitstates of the bus interface" << std::endl; os << "totdivider c\t sets the clock divider in tot mode" << std::endl; os << "totdutycycle c\t sets the duty cycle of the tot clock" << std::endl; + os << "adcphase c\t Sets phase of the sampling clock. For JUNGFRAU, setting speed (clkdivider) overwrites adcphase to its default recommended value. (Not for EIGER)" << std::endl; os << std::endl; } if (action==GET_ACTION || action==HELP_ACTION) { - os << "clkdivider \t gets readout clock divider" << std::endl; + os << "clkdivider \t gets readout clock divider. For Jungfrau, it also overwrites adcphase to recommended default" << std::endl; os << "setlength \t gets the length of the set/reset signals (in clock cycles)" << std::endl; os << "waitstates \t gets the waitstates of the bus interface" << std::endl; os << "totdivider \t gets the clock divider in tot mode" << std::endl; os << "totdutycycle \t gets the duty cycle of the tot clock" << std::endl; + os << "totdutycycle \t gets phase of the sampling clock. For JUNGFRAU, setting speed (clkdivider) overwrites adcphase to its default recommended value. (Not for EIGER)" << std::endl; os << std::endl; } diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUsers.h b/slsDetectorSoftware/slsDetector/slsDetectorUsers.h index 8d6f1d86d..a3e80d91e 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUsers.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUsers.h @@ -77,7 +77,7 @@ You can find examples of how this classes can be instatiated in mainClient.cpp @libdoc The slsDetectorUsers class is a minimal interface class which should be instantiated by the users in their acquisition software (EPICS, spec etc.). More advanced configuration functions are not implemented and can be written in a configuration or parameters file that can be read/written. */ /** - @short Class for detector functionalitiesto embed the detector controls in the users custom interface e.g. EPICS, Lima etc. + @short Class for detector functionalities to embed the detector controls in the users custom interface e.g. EPICS, Lima etc. */ @@ -270,7 +270,7 @@ class slsDetectorUsers */ int getDetectorSize(int &x0, int &y0, int &nx, int &ny); /** - @short setsthe maximum detector size + @short gets the maximum detector size \param x0 horizontal position origin in channel number \param y0 vertical position origin in channel number \param nx number of channels in horiziontal diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c index 8b6281825..b4cb565f2 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c @@ -2988,7 +2988,7 @@ int set_speed(int file_des) { #ifdef JUNGFRAUD case ADC_PHASE: retval = adcPhase(val); - if ((val != 65536) && (retval!=val) && (val>=0)) { + if ((val != 100000) && (retval!=val) && (val>=0)) { ret=FAIL; sprintf(mess,"could not change set adc phase: should be %d but is %d \n", val, retval); cprintf(RED, "Warning: %s", mess); From afac5be3c3674fe87044d3b7a54471291698d4ba Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 20 Mar 2018 12:20:15 +0100 Subject: [PATCH 06/25] updated release notes --- RELEASE.txt | 346 ++-------------------------------------------------- 1 file changed, 10 insertions(+), 336 deletions(-) diff --git a/RELEASE.txt b/RELEASE.txt index 63b72b4a9..6b32f1df1 100644 --- a/RELEASE.txt +++ b/RELEASE.txt @@ -1,353 +1,27 @@ -SLS Detector Package 3.1.0 released on 2018-03-12 +SLS Detector Package 3.1.1 released on 2018-03-20 ================================================= INTRODUCTION -This document describes the differences between 3.1.0 and 3.0.0 releases. - -The conda package of the binaries can be downloaded from - - https://github.com/slsdetectorgroup/sls_detector_software.git - -The Python interface to the software package (including the package) is at - - https://github.com/slsdetectorgroup/sls_detector.git - -Manual (both HTML and pdf versions) are provided in - - manual/docs/ - -Documentation from Source Code can be found for the Command Line and C++ API in - - html: - manual/docs/html/slsDetectorClientDocs/index.html - manual/docs/html/slsDetectorUsersDocs/index.html - pdf: - manual/docs/pdf/slsDetectorClientDocs.pdf - manual/docs/pdf/slsDetectorUsersDocs.pdf - -Documentation to the python API is available at - - https://slsdetectorgroup.github.io/sls_detector/ - -Example including binaries for detector and receiver user classes can be found in - - manual/manual-api - -User documentation can also be accessed directly at this location: - - https://www.psi.ch/detectors/users-support - -If you have any software related questions or comments, please send them to: - - dhanya.thattil@psi.ch - anna.bergamaschi@psi.ch - -If you have any python related questions or comments, please send them to: - - erik.frojdh@psi.ch +This document describes the differences between 3.1.0 into 3.1.0 releases. -CONTENTS - -- Firmware Requirements -- Changes in User Interface -- New Features -- Resolved Issues -- Known Issues - - - -Firmware Requirements -===================== - - Please refer to the link below for more details on the firmware versions. - https://www.psi.ch/detectors/firmware. - - Gotthard - ======== - Minimum compatible version : 11.01.2013 - Latest version : 08.02.2018 (50um and 25um Master) - 09.02.2018 (25 um Slave) - - -Can not be upgraded remotely. - - - Eiger - ===== - Minimum compatible version : 16 - Latest version : 20 - - -Can be upgraded remotely via bit files. - - - Jungfrau - ======== - Minimum compatible version : 13.11.2017 - Latest version : 13.11.2017 - - -Can be upgraded remotely via sls_detector_put programfpga . - - - -Changes in User Interface -========================= - - - Client - ------ - 1. Additional functions added for advanced users in users class: - (setSpeed, setClockDivider, setReadOutFlags, setDac, getADC, - setAllTrimbits, startReceiver, stopReceiver, - startAcquisition non blocking, setReceiverSilentMode, setHighVoltage, - enableDataStreamingToClient, enableDataStreamingFromReceiver, - setReceiverDataStreamingOutPort, setClientDataStreamingInPort) - - 2. Zmq set up for client and receiver are separated. - zmqport for client and rx_zmqport for receiver. By default, they are the - same for the slsDetectorGui to work. - - 3. Users example also works without config file, where detector already - configured in shared memory. - - 4. Use "sls_detector_get busy 0" to clear acquiring flag in shared memory - caused due to an earlier interrupted acquisition from Ctrl+C" - - 5. Set bit, clear bit, read register and write register cannot give -1 for - inconsistent values from multiple detectors. One has to check error from - API or read the values individually. - - 6. multiSlsDetector::char* getSettingsFile() function signature has been - changed to string getSettingsFile(). - - - - Receiver - -------- - 7. Modified the help manaual/main-api/mainReceiver.cpp to make it more - robust (handling child process exit) and flexible to determine upon - start up the number of receivers (child processes), the start TCP port - and whether to call back data. - - detReceiver is now executed with [start tcp port] [number of receivers] - [1 for call back, 0 for none] as arguments. - By default, start tcp port is 1954, number of receivers is 1, and call - back is initiated. - - 8. rx_datastream to enable/disable data streaming in receiver. Using the GUI - or registering data call back in client automatically enables zmq in - receiver and client. "externalgui" is removed from the command line. Use - this command instead. - - 9. Rx_tcpport argument to the slsReceiver can be given using -t. - Eg. slsReceiver -t1955 - - -New Features -============ - - - Package - ------- - 1. In addition to the C++ API, the Python API is also now provided. - - 2. CMAKE now with debug flag and rpath, show warnings, compile only certain - components (such as receiver or gui) - - 3. One repository for entire package and made available at github. - - 4. One can do --version or -v to all the binaries to find out the release - version of the particular executable. - - 5. All the software version numbers have only date in format YYMMDD. - - - Client - ------ - 6. Parallelized more commands to detector. Beneficial for large detectors. - (setTimer, setFileIndex, setOnline, setReceiverOnline, getReceiverStatus, - resetFramesCaught, setFrameIndex, setFileName, getFramesCaughtByReceiver, - setDynamicRange, setRateCorrection) - - Option to also use "sls_detector_put threaded 0" to improve speed by - eliminating progress display during acquisition. Effective only for - large detectors. - - - Detector Server - --------------- - 7. (Eiger) Virtual class to execute on pc. - - 8. One can now read temperatures during acquisition. It goes via the stop - server. - - 9. (Jungfrau) One can start server in "debug" mode and then program the - new firmware via software command "sls_detector_put programfpga xx.pof". - - 10. (Jungfrau) Server can exit on start up if either the firmware or the - server is incompatible with each other. - - 11. (Jungfrau) One is able to set transmission delay (ms) of image for each - individual detector using "txndelay_frame" command. Beneficial for - large detectors. - - 12. (Jungfrau) One can set a threshold temperature (temp_threshold) and - enable the temperature control feature (temp_control). When the - temperature (temp_fpga) overshoots the threshold temperature, it will - set the temperature event (temp_event) and power off the chip. One must - then switch off the detector and check cooling. Switching back on starts - with defaults. - - 13. (25um Gotthard) Added start acquisition delay to master module. - - 14. (Gotthard) New constraints for firmware dated 08.02.2018 and 09.02.2018 - (25 um Slave) include minimum exposure time is 186 ns and minimum - period is 1278 ns + current exposure time. - - - Receiver - -------- - 14. The detectorip and rx_udpip does not have to be in the same subnet anymore. - Add the following commands after rx_hostname in config file to overwrite - mac configuration: - rx_udpmac [router mac] - configuremac 0 - - 15. Added silent mode to receiver using command r_silent [i] from client. - It might be beneficial for max frame rate applications. - - 16. Receiver print out can handle black or white backgrounds. - - 17. zmq package included updated to v4.0.8. - - 18. Zmq streaming from receiver also sends file index in json header. - - - Gui - --- - 19. If acquisition is done, but "stop dummy packet" to the gui was lost in - the network, stop acquisition command will restream it so that the gui - doesnt hang forever. This is used only for very fast detectors like - Moench. - +Detector Concerning +================== + Jungfrau Resolved Issues =============== - - Client - ------ - 1. gethostbyname used in connecting to sockets was not thread safe for - multiple detectors. Using getaddrinfo for stability in multi threaded - environment. - - 2. Updated writing content of config and parameter dump into files. - - 3. More locking to handle main and processing threads using the threadpool. - Removing unlock twice, which is undefined behavior. - - 4. (Jungfrau) adcphase returns the correct value, instead of -1. - - - Detector Server - --------------- - 4. (Eiger) The hardware MAC of the detector is used during configuration - and relayed back to client. Similarly, hardware IP for 1 Gbe data mode. - - 5. (Eiger) Status will return error if there was the unlikely trouble - reading status register in the front end board. Earlier, it would only - return idle. - - 6. (Jungfrau) patch server v3.0.0.6.3 - Able to set settings, high voltage now correctly reads 0 when - switched off, dacs are properly set. - - 7. (Jungfrau) FPGA reset and programming FPGA firmware via software is done - properly - - 8. (Gotthard) patch server v3.0.0.5.1 - Able to read temperature properly. - - 9. (Gotthard) butst mode if set too fast had unwanted behavior such as - sending same image continuously. Now it is handled to display error - and stop acquisition. - - 10. (Gotthard) completely removed the possibility to set timing modes - other than auto and trigger as they are not implemented anyway. Also - signal index 1, 2 and 3 are reserved and hence, cannot be configured for - an external trigger. - - 11. Non Mythen and non Eiger detectors can also now get settings file from - board. - - 12. (Gotthard) Did not get first few images initially after configuring MAC - of detector. Fixed. - - - Receiver - -------- - 12. Made it easier to disable the standard receiver and fixing bugs related - to the use of a custom one. - - 13. (Jungfrau) HDF5 dimensions (npixelsY) required for mapping fixed. - - 14. patch2-v3.0.0-slsReceiverSoftware.patch - x, y and z coordinates in the call backs and the files are hardcoded - for this release. - - 15. Rest implementation (not used by standard receiver) removed. - - - Gui - --- - 16. patch1-v3.0.0-slsDetectorGui.patch - (Eiger) In expert mode and in advanced tab, when trimbits - loaded are different for every pixel, the gui complains and sets - all trimbits to zero. This has been resolved. Now, the "Set All - Trimbits" field is just set to -1. - - 17. Fixed segmentation fault of xputsn properly. - - 18. Upon clicking on "Start", clears acquiring flag in shared memory - caused due to an earlier interrupted acquisition from Ctrl+C" - - 19. Fixed plotting twice caused due to unzooming the first time. - - 20. Removed option for compression in Gui as it is not available currently. - - 21. Can also show Jungfrau multi detector in x direction in gui. - - 22. Switching tabs sometimes results in delay and gates fields being incorrectly - enabled. Fixed. - - - -Known Issues -============ - - - Client - ------ - 1. File name prefix can only be done at multi deector level. Changing at - individual detector level will not include scan or position variables. - - - Detector Server - --------------- - 2. Standard header fills x-coord in 1D. y-coord and z-coord is not - implemented (3D). - - - Receiver - -------- - 3. HDF5 compression and filters are not implemented yet. - - + Detector Server and Client + -------------------------- + 1. (Jungfrau) Bug fix: Same adc phase given to the PLL will still shift + adc by one step. One can now give same adc phase repeatedly. - + 2. Updated Command Line Manual for adcphase and clkdivider. From 59ad15b54e25a6c04cdfda487b596fa39d3a316c Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 20 Mar 2018 16:36:45 +0100 Subject: [PATCH 07/25] eiger server bug fix: in 10giga mode always used the 1g ip (dhcp ip) if detectorip is before tengiga in config file --- RELEASE.txt | 12 ++++++--- ....0.16.1 => eigerDetectorServerv3.1.1.16.0} | Bin 293060 -> 293085 bytes .../eigerDetectorServer/gitInfo.txt | 12 ++++----- .../eigerDetectorServer/gitInfoEiger.h | 10 +++---- .../slsDetectorServer_funcs.c | 25 ++++++++++++------ 5 files changed, 36 insertions(+), 23 deletions(-) rename slsDetectorSoftware/eigerDetectorServer/bin/{eigerDetectorServerv3.1.0.16.1 => eigerDetectorServerv3.1.1.16.0} (67%) diff --git a/RELEASE.txt b/RELEASE.txt index 6b32f1df1..8d81059f4 100644 --- a/RELEASE.txt +++ b/RELEASE.txt @@ -8,9 +8,10 @@ INTRODUCTION This document describes the differences between 3.1.0 into 3.1.0 releases. -Detector Concerning +Topics Concerning ================== - Jungfrau + Jungfrau adcphase + Eiger in 10 Giga mode Resolved Issues @@ -21,7 +22,10 @@ Resolved Issues 1. (Jungfrau) Bug fix: Same adc phase given to the PLL will still shift adc by one step. One can now give same adc phase repeatedly. - 2. Updated Command Line Manual for adcphase and clkdivider. - + Updated Command Line Manual for adcphase and clkdivider. + + 2. (Eiger) Bug Fix: This bug was introduced in 3.1.0 release. + In 10GbE mode, if "detectorip" is before "tengiga", the detector still + used the 1G IP (DHCP IP). This is fixed in this release. diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.1.0.16.1 b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.1.1.16.0 similarity index 67% rename from slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.1.0.16.1 rename to slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.1.1.16.0 index e4262429137a353597e0baf5d2695116a49b0775..0f2ee669755e5192aab3ef82992d419cf931a00d 100755 GIT binary patch delta 34572 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 WAm>FH3$vDFEm&lC$uxi9`u_o`s68_P delta 34961 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≦̸0> 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 diff --git a/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt b/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt index 651eecb39..8ecad72b0 100644 --- a/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt +++ b/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware/eigerDetectorServer URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: 8b02aa9e91bbee0470492dcf1ff67415851e14fa -Revision: 315 -Branch: 3.1.0-rc -Last Changed Author: Erik_Frojdh -Last Changed Rev: 3455 -Last Changed Date: 2018-03-08 16:44:32.000000002 +0100 ./FebRegisterDefs.h +Repsitory UUID: afac5be3c3674fe87044d3b7a54471291698d4ba +Revision: 316 +Branch: 3.1.1-rc +Last Changed Author: Dhanya_Thattil +Last Changed Rev: 3467 +Last Changed Date: 2018-03-19 17:26:38.000000002 +0100 ./FebRegisterDefs.h diff --git a/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h b/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h index 857ca4ad2..f2600c3f8 100644 --- a/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h +++ b/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h @@ -1,6 +1,6 @@ #define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "8b02aa9e91bbee0470492dcf1ff67415851e14fa" -#define GITAUTH "Erik_Frojdh" -#define GITREV 0x3455 -#define GITDATE 0x20180308 -#define GITBRANCH "3.1.0-rc" +#define GITREPUUID "afac5be3c3674fe87044d3b7a54471291698d4ba" +#define GITAUTH "Dhanya_Thattil" +#define GITREV 0x3467 +#define GITDATE 0x20180319 +#define GITBRANCH "3.1.1-rc" diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c index b4cb565f2..22f60fbd4 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c @@ -39,6 +39,9 @@ char mess[MAX_STR_LENGTH]; int dataBytes = 10; int isControlServer = 0; int debugflag = 0; +#ifdef EIGERD +uint32_t dhcpipad = 0; +#endif /* initialization functions */ @@ -64,6 +67,9 @@ void init_detector(int controlserver) { if (controlserver) { isControlServer = 1; initControlServer(); +#ifdef EIGERD + dhcpipad = getDetectorIP(); +#endif } else initStopServer(); #endif @@ -3488,16 +3494,19 @@ int configure_mac(int file_des) { printf("WARNING: Matched detectormac to the hardware mac now\n"); printf("*************************************************\n"); } + + // always remember the ip sent from the client (could be for 10g(if not dhcp)) + if (detipad != getDetectorIP()) + dhcpipad = detipad; + //only for 1Gbe if(!enableTenGigabitEthernet(-1)){ - if (detipad != getDetectorIP()){ - printf("*************************************************\n"); - printf("WARNING: actual detector ip address %x does not match the one from client %x\n",getDetectorIP(),detipad); - detipad = getDetectorIP(); - printf("WARNING: Matched detector ip to the hardware ip now\n"); - printf("*************************************************\n"); - } - } + printf("*************************************************\n"); + printf("WARNING: Using DHCP IP for Configuring MAC\n"); + printf("*************************************************\n"); + detipad = getDetectorIP(); + } else + detipad = dhcpipad; #endif retval=configureMAC(ipad,imacadd,idetectormacadd,detipad,udpport,udpport2,0); //digitalTestBit); if(retval==-1) { From 5203a0d621db78bad083ab6aff55478e92a61bbc Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 20 Mar 2018 16:40:56 +0100 Subject: [PATCH 08/25] updated doc --- RELEASE.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASE.txt b/RELEASE.txt index 8d81059f4..9c98e2182 100644 --- a/RELEASE.txt +++ b/RELEASE.txt @@ -11,7 +11,7 @@ This document describes the differences between 3.1.0 into 3.1.0 releases. Topics Concerning ================== Jungfrau adcphase - Eiger in 10 Giga mode + Eiger in 10 GbE mode Resolved Issues From 70ce8c165319c242125d757a1679644f232fc581 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 20 Mar 2018 17:35:39 +0100 Subject: [PATCH 09/25] updated doc --- RELEASE.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASE.txt b/RELEASE.txt index 9c98e2182..b0063374c 100644 --- a/RELEASE.txt +++ b/RELEASE.txt @@ -24,7 +24,7 @@ Resolved Issues Updated Command Line Manual for adcphase and clkdivider. - 2. (Eiger) Bug Fix: This bug was introduced in 3.1.0 release. + 2. (Eiger) Bug Fix: This bug was introduced in 3.1.0 release. In 10GbE mode, if "detectorip" is before "tengiga", the detector still used the 1G IP (DHCP IP). This is fixed in this release. From d5f8a1b4e7a6fd36e5c497758c84bbc66af478af Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 20 Mar 2018 17:37:48 +0100 Subject: [PATCH 10/25] updated doc --- RELEASE.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASE.txt b/RELEASE.txt index b0063374c..15199b0f2 100644 --- a/RELEASE.txt +++ b/RELEASE.txt @@ -24,7 +24,7 @@ Resolved Issues Updated Command Line Manual for adcphase and clkdivider. - 2. (Eiger) Bug Fix: This bug was introduced in 3.1.0 release. + 2. (Eiger) Bug Fix: This bug was introduced in 3.1.0 release. In 10GbE mode, if "detectorip" is before "tengiga", the detector still used the 1G IP (DHCP IP). This is fixed in this release. From 17c20748bc6a152f4871541e2c8fe0bc618a813b Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 21 Mar 2018 08:28:49 +0100 Subject: [PATCH 11/25] updated links in serverbin --- serverBin/eigerDetectorServerv3.1.0.16.1 | 1 - serverBin/eigerDetectorServerv3.1.1.16.0 | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 120000 serverBin/eigerDetectorServerv3.1.0.16.1 create mode 120000 serverBin/eigerDetectorServerv3.1.1.16.0 diff --git a/serverBin/eigerDetectorServerv3.1.0.16.1 b/serverBin/eigerDetectorServerv3.1.0.16.1 deleted file mode 120000 index 2c90d8002..000000000 --- a/serverBin/eigerDetectorServerv3.1.0.16.1 +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.1.0.16.1 \ No newline at end of file diff --git a/serverBin/eigerDetectorServerv3.1.1.16.0 b/serverBin/eigerDetectorServerv3.1.1.16.0 new file mode 120000 index 000000000..5d162f9e5 --- /dev/null +++ b/serverBin/eigerDetectorServerv3.1.1.16.0 @@ -0,0 +1 @@ +../slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.1.1.16.0 \ No newline at end of file From a1936cb884182868cf5ae2b69485a5f3e41dc688 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 21 Mar 2018 09:10:11 +0100 Subject: [PATCH 12/25] updated docu --- slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index e1a4ca221..01b349d32 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -5864,7 +5864,7 @@ string slsDetectorCommand::helpSpeed(int narg, char *args[], int action) { os << "waitstates \t gets the waitstates of the bus interface" << std::endl; os << "totdivider \t gets the clock divider in tot mode" << std::endl; os << "totdutycycle \t gets the duty cycle of the tot clock" << std::endl; - os << "totdutycycle \t gets phase of the sampling clock. For JUNGFRAU, setting speed (clkdivider) overwrites adcphase to its default recommended value. (Not for EIGER)" << std::endl; + os << "adcphase \t gets phase of the sampling clock. For JUNGFRAU, setting speed (clkdivider) overwrites adcphase to its default recommended value. (Not for EIGER)" << std::endl; os << std::endl; } From a74e8f68f7f77cb7be1058927b54921801c407b5 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 21 Mar 2018 17:08:38 +0100 Subject: [PATCH 13/25] size change in receiver call back API now streamed, gui allows smaller packet size than expected to be caught and replaced the rest with 0xFF --- manual/manual-api/mainReceiver.cpp | 7 ++++--- slsReceiverSoftware/include/DataProcessor.h | 15 +++++++++------ slsReceiverSoftware/include/DataStreamer.h | 3 ++- .../include/UDPBaseImplementation.h | 15 +++++++++------ slsReceiverSoftware/include/UDPInterface.h | 4 ++-- slsReceiverSoftware/include/ZmqSocket.h | 11 ++++++++++- slsReceiverSoftware/include/slsReceiver.h | 8 +++++--- .../include/slsReceiverTCPIPInterface.h | 13 ++++++++----- slsReceiverSoftware/include/slsReceiverUsers.h | 2 +- slsReceiverSoftware/src/DataProcessor.cpp | 17 +++++++++-------- slsReceiverSoftware/src/DataStreamer.cpp | 18 +++++++++--------- .../src/UDPBaseImplementation.cpp | 6 ++++-- slsReceiverSoftware/src/main.cpp | 4 ++-- slsReceiverSoftware/src/slsReceiver.cpp | 6 ++++-- .../src/slsReceiverTCPIPInterface.cpp | 6 ++++-- slsReceiverSoftware/src/slsReceiverUsers.cpp | 2 +- 16 files changed, 83 insertions(+), 54 deletions(-) diff --git a/manual/manual-api/mainReceiver.cpp b/manual/manual-api/mainReceiver.cpp index 25924e808..ac0eb2233 100644 --- a/manual/manual-api/mainReceiver.cpp +++ b/manual/manual-api/mainReceiver.cpp @@ -103,12 +103,12 @@ void AcquisitionFinished(uint64_t frames, void*p){ * @param detType detector type see :: detectorType * @param version version of standard header (structure format) * @param datapointer pointer to data - * @param datasize data size in bytes + * @param datasize data size in bytes. To write/stream a smaller size of processed data, change this value (only smaller value is allowed). * @param p pointer to object */ void GetData(uint64_t frameNumber, uint32_t expLength, uint32_t packetNumber, uint64_t bunchId, uint64_t timestamp, uint16_t modId, uint16_t xCoord, uint16_t yCoord, uint16_t zCoord, uint32_t debug, uint16_t roundRNumber, uint8_t detType, uint8_t version, - char* datapointer, uint32_t datasize, void* p){ + char* datapointer, uint32_t* datasize, void* p){ PRINT_IN_COLOR (modId?modId:xCoord, "#### %d GetData: ####\n" @@ -117,7 +117,8 @@ void GetData(uint64_t frameNumber, uint32_t expLength, uint32_t packetNumber, ui "version: %u\t\tfirstbytedata: 0x%x\t\tdatsize: %u\n\n", xCoord, frameNumber, expLength, packetNumber, bunchId, timestamp, modId, xCoord, yCoord, zCoord, debug, roundRNumber, detType, version, - ((uint8_t)(*((uint8_t*)(datapointer)))), datasize); + ((uint8_t)(*((uint8_t*)(datapointer)))), *datasize); + *datasize = 26000; } diff --git a/slsReceiverSoftware/include/DataProcessor.h b/slsReceiverSoftware/include/DataProcessor.h index 4fd7654fd..1636b203b 100644 --- a/slsReceiverSoftware/include/DataProcessor.h +++ b/slsReceiverSoftware/include/DataProcessor.h @@ -33,12 +33,14 @@ class DataProcessor : private virtual slsReceiverDefs, public ThreadObject { * @param freq pointer to streaming frequency * @param timer pointer to timer if streaming frequency is random * @param dataReadycb pointer to data ready call back function - * @param pDataReadycb pointer to arguments of data ready call back function + * @param pDataReadycb pointer to arguments of data ready call back function. To write/stream a smaller size of processed data, change this value (only smaller value is allowed). */ DataProcessor(Fifo*& f, fileFormat* ftype, bool fwenable, bool* dsEnable, bool* gpEnable, uint32_t* dr, uint32_t* freq, uint32_t* timer, - void (*dataReadycb)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, - char*, uint32_t, void*), + void (*dataReadycb)(uint64_t, uint32_t, uint32_t, uint64_t, + uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, + uint32_t, uint16_t, uint8_t, uint8_t, + char*, uint32_t*, void*), void *pDataReadycb); /** @@ -393,10 +395,11 @@ class DataProcessor : private virtual slsReceiverDefs, public ThreadObject { * detType is the detector type see :: detectorType * version is the version number of this structure format * dataPointer is the pointer to the data - * dataSize in bytes is the size of the data in bytes + * dataSize in bytes is the size of the data in bytes. To write/stream a smaller size of processed data, change this value (only smaller value is allowed). */ - void (*rawDataReadyCallBack)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, - char*, uint32_t, void*); + void (*rawDataReadyCallBack)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, + uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, + char*, uint32_t*, void*); void *pRawDataReady; diff --git a/slsReceiverSoftware/include/DataStreamer.h b/slsReceiverSoftware/include/DataStreamer.h index fb66aeb9c..a08183a1e 100644 --- a/slsReceiverSoftware/include/DataStreamer.h +++ b/slsReceiverSoftware/include/DataStreamer.h @@ -166,12 +166,13 @@ class DataStreamer : private virtual slsReceiverDefs, public ThreadObject { /** * Create and send Json Header * @param header header of image + * @param size data size (could have been modified in call back) * @param nx number of pixels in x dim * @param ny number of pixels in y dim * @param dummy true if its a dummy header * @returns 0 if error, else 1 */ - int SendHeader(sls_detector_header* header, uint32_t nx = 0, uint32_t ny = 0, bool dummy = true); + int SendHeader(sls_detector_header* header, uint32_t size = 0, uint32_t nx = 0, uint32_t ny = 0, bool dummy = true); /** type of thread */ static const std::string TypeName; diff --git a/slsReceiverSoftware/include/UDPBaseImplementation.h b/slsReceiverSoftware/include/UDPBaseImplementation.h index ca1e6acdf..5babfc50c 100644 --- a/slsReceiverSoftware/include/UDPBaseImplementation.h +++ b/slsReceiverSoftware/include/UDPBaseImplementation.h @@ -600,10 +600,12 @@ class UDPBaseImplementation : protected virtual slsReceiverDefs, public UDPInter * detType is the detector type see :: detectorType * version is the version number of this structure format * dataPointer is the pointer to the data - * dataSize in bytes is the size of the data in bytes + * dataSize in bytes is the size of the data in bytes. To write/stream a smaller size of processed data, change this value (only smaller value is allowed). */ - void registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, - char*, uint32_t, void*),void *arg); + void registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, uint32_t, + uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, + uint16_t, uint8_t, uint8_t, + char*, uint32_t*, void*),void *arg); @@ -736,10 +738,11 @@ class UDPBaseImplementation : protected virtual slsReceiverDefs, public UDPInter * detType is the detector type see :: detectorType * version is the version number of this structure format * dataPointer is the pointer to the data - * dataSize in bytes is the size of the data in bytes + * dataSize in bytes is the size of the data in bytes. To write/stream a smaller size of processed data, change this value (only smaller value is allowed). */ - void (*rawDataReadyCallBack)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, - char*, uint32_t, void*); + void (*rawDataReadyCallBack)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, + uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, + char*, uint32_t*, void*); void *pRawDataReady; diff --git a/slsReceiverSoftware/include/UDPInterface.h b/slsReceiverSoftware/include/UDPInterface.h index 0af8edbe1..35e756587 100644 --- a/slsReceiverSoftware/include/UDPInterface.h +++ b/slsReceiverSoftware/include/UDPInterface.h @@ -689,10 +689,10 @@ class UDPInterface { * detType is the detector type see :: detectorType * version is the version number of this structure format * dataPointer is the pointer to the data - * dataSize in bytes is the size of the data in bytes + * dataSize in bytes is the size of the data in bytes. To write/stream a smaller size of processed data, change this value (only smaller value is allowed). */ virtual void registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, - char*, uint32_t, void*),void *arg) = 0; + char*, uint32_t*, void*),void *arg) = 0; protected: diff --git a/slsReceiverSoftware/include/ZmqSocket.h b/slsReceiverSoftware/include/ZmqSocket.h index dd260dffb..8fc063670 100644 --- a/slsReceiverSoftware/include/ZmqSocket.h +++ b/slsReceiverSoftware/include/ZmqSocket.h @@ -24,6 +24,7 @@ using namespace rapidjson; #define MAX_STR_LENGTH 1000 //#define ZMQ_DETAIL +#define ROIVERBOSITY class ZmqSocket { @@ -426,7 +427,15 @@ public: memcpy(buf, (char*)zmq_msg_data(&message), size); } - //incorrect size + //incorrect size (smaller) + else if (length < size){ +#ifdef ROIVERBOSITY + cprintf(RED,"Error: Received smaller packet size %d for socket %d\n", length, index); +#endif + memcpy(buf, (char*)zmq_msg_data(&message), length); + memset(buf+length,0xFF,size-length); + } + //incorrect size (larger) else { cprintf(RED,"Error: Received weird packet size %d for socket %d\n", length, index); memset(buf,0xFF,size); diff --git a/slsReceiverSoftware/include/slsReceiver.h b/slsReceiverSoftware/include/slsReceiver.h index 348d90e8e..69155ad76 100644 --- a/slsReceiverSoftware/include/slsReceiver.h +++ b/slsReceiverSoftware/include/slsReceiver.h @@ -91,10 +91,12 @@ class slsReceiver : private virtual slsReceiverDefs { * detType is the detector type see :: detectorType * version is the version number of this structure format * dataPointer is the pointer to the data - * dataSize in bytes is the size of the data in bytes + * dataSize in bytes is the size of the data in bytes. To write/stream a smaller size of processed data, change this value (only smaller value is allowed). */ - void registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, - char*, uint32_t, void*),void *arg); + void registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, uint32_t, + uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, + uint16_t, uint8_t, uint8_t, + char*, uint32_t*, void*),void *arg); diff --git a/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h b/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h index 83e6198db..e75253f14 100644 --- a/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h +++ b/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h @@ -95,8 +95,10 @@ class slsReceiverTCPIPInterface : private virtual slsReceiverDefs { * dataPointer is the pointer to the data * dataSize in bytes is the size of the data in bytes */ - void registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, - char*, uint32_t, void*),void *arg); + void registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, uint32_t, + uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, + uint16_t, uint8_t, uint8_t, + char*, uint32_t*, void*),void *arg); private: @@ -344,10 +346,11 @@ class slsReceiverTCPIPInterface : private virtual slsReceiverDefs { * detType is the detector type see :: detectorType * version is the version number of this structure format * dataPointer is the pointer to the data - * dataSize in bytes is the size of the data in bytes + * dataSize in bytes is the size of the data in bytes. To write/stream a smaller size of processed data, change this value (only smaller value is allowed). */ - void (*rawDataReadyCallBack)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, - char*, uint32_t, void*); + void (*rawDataReadyCallBack)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, + uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, + char*, uint32_t*, void*); void *pRawDataReady; diff --git a/slsReceiverSoftware/include/slsReceiverUsers.h b/slsReceiverSoftware/include/slsReceiverUsers.h index c2dd0bc0d..8035d33b4 100644 --- a/slsReceiverSoftware/include/slsReceiverUsers.h +++ b/slsReceiverSoftware/include/slsReceiverUsers.h @@ -69,7 +69,7 @@ public: */ void registerCallBackRawDataReady(void (*func)(uint64_t frameNumber, uint32_t expLength, uint32_t packetNumber, uint64_t bunchId, uint64_t timestamp, uint16_t modId, uint16_t xCoord, uint16_t yCoord, uint16_t zCoord, uint32_t debug, uint16_t roundRNumber, uint8_t detType, uint8_t version, - char* datapointer, uint32_t datasize, void*),void *arg); + char* datapointer, uint32_t* datasize, void*),void *arg); //receiver object slsReceiver* receiver; diff --git a/slsReceiverSoftware/src/DataProcessor.cpp b/slsReceiverSoftware/src/DataProcessor.cpp index e2dfc9d8a..d78c8bc48 100644 --- a/slsReceiverSoftware/src/DataProcessor.cpp +++ b/slsReceiverSoftware/src/DataProcessor.cpp @@ -35,8 +35,9 @@ bool DataProcessor::SilentMode(false); DataProcessor::DataProcessor(Fifo*& f, fileFormat* ftype, bool fwenable, bool* dsEnable, bool* gpEnable, uint32_t* dr, uint32_t* freq, uint32_t* timer, - void (*dataReadycb)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, - char*, uint32_t, void*), + void (*dataReadycb)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, + uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, + char*, uint32_t*, void*), void *pDataReadycb) : ThreadObject(NumberofDataProcessors), @@ -316,7 +317,7 @@ void DataProcessor::ThreadExecution() { return; } - ProcessAnImage(buffer + FIFO_HEADER_NUMBYTES); + ProcessAnImage(buffer); //stream (if time/freq to stream) or free if (*dataStreamEnable && SendToStreamer()) @@ -348,7 +349,7 @@ void DataProcessor::StopProcessing(char* buf) { /** buf includes only the standard header */ void DataProcessor::ProcessAnImage(char* buf) { - sls_detector_header* header = (sls_detector_header*) (buf); + sls_detector_header* header = (sls_detector_header*) (buf + FIFO_HEADER_NUMBYTES); uint64_t fnum = header->frameNumber; currentFrameIndex = fnum; uint32_t nump = header->packetNumber; @@ -381,7 +382,7 @@ void DataProcessor::ProcessAnImage(char* buf) { } if (*gapPixelsEnable && (*dynamicRange!=4)) - InsertGapPixels(buf + sizeof(sls_detector_header), *dynamicRange); + InsertGapPixels(buf + FIFO_HEADER_NUMBYTES + sizeof(sls_detector_header), *dynamicRange); // x coord is 0 for detector in pos [0,0,0] if (xcoordin1D) { @@ -409,14 +410,14 @@ void DataProcessor::ProcessAnImage(char* buf) { header->roundRNumber, header->detType, header->version, - buf + sizeof(sls_detector_header), - generalData->imageSize, + buf + FIFO_HEADER_NUMBYTES + sizeof(sls_detector_header), + (uint32_t*)buf, pRawDataReady); } if (file) - file->WriteToFile(buf, sizeof(sls_detector_header) + generalData->imageSize, fnum-firstMeasurementIndex, nump); + file->WriteToFile(buf + FIFO_HEADER_NUMBYTES, sizeof(sls_detector_header) + (uint32_t)(*((uint32_t*)buf)), fnum-firstMeasurementIndex, nump); diff --git a/slsReceiverSoftware/src/DataStreamer.cpp b/slsReceiverSoftware/src/DataStreamer.cpp index 8946c6e40..3dfced933 100644 --- a/slsReceiverSoftware/src/DataStreamer.cpp +++ b/slsReceiverSoftware/src/DataStreamer.cpp @@ -200,7 +200,7 @@ void DataStreamer::ThreadExecution() { return; } - ProcessAnImage(buffer + FIFO_HEADER_NUMBYTES); + ProcessAnImage(buffer); //free fifo->FreeAddress(buffer); @@ -216,7 +216,7 @@ void DataStreamer::StopProcessing(char* buf) { #endif sls_detector_header* header = (sls_detector_header*) (buf); //send dummy header and data - if (!SendHeader(header, 0, 0, true)) + if (!SendHeader(header, 0, 0, 0, true)) cprintf(RED,"Error: Could not send zmq dummy header for streamer %d\n", index); fifo->FreeAddress(buf); @@ -229,7 +229,7 @@ void DataStreamer::StopProcessing(char* buf) { /** buf includes only the standard header */ void DataStreamer::ProcessAnImage(char* buf) { - sls_detector_header* header = (sls_detector_header*) (buf); + sls_detector_header* header = (sls_detector_header*) (buf + FIFO_HEADER_NUMBYTES); uint64_t fnum = header->frameNumber; #ifdef VERBOSE cprintf(MAGENTA,"DataStreamer %d: fnum:%lu\n", index,fnum); @@ -245,11 +245,11 @@ void DataStreamer::ProcessAnImage(char* buf) { //shortframe gotthard if (completeBuffer) { - if (!SendHeader(header, generalData->nPixelsXComplete, generalData->nPixelsYComplete, false)) + if (!SendHeader(header, (uint32_t)(*((uint32_t*)buf)), generalData->nPixelsXComplete, generalData->nPixelsYComplete, false)) cprintf(RED,"Error: Could not send zmq header for fnum %lld and streamer %d\n", (long long int) fnum, index); - memcpy(completeBuffer + ((generalData->imageSize)**shortFrameEnable), buf + sizeof(sls_detector_header), generalData->imageSize); + memcpy(completeBuffer + ((generalData->imageSize)**shortFrameEnable), buf + FIFO_HEADER_NUMBYTES + sizeof(sls_detector_header), (uint32_t)(*((uint32_t*)buf)) ); // new size possibly from callback if (!zmqSocket->SendData(completeBuffer, generalData->imageSizeComplete)) cprintf(RED,"Error: Could not send zmq data for fnum %lld and streamer %d\n", (long long int) fnum, index); @@ -259,11 +259,11 @@ void DataStreamer::ProcessAnImage(char* buf) { //normal else { - if (!SendHeader(header, generalData->nPixelsX, generalData->nPixelsY, false)) + if (!SendHeader(header, (uint32_t)(*((uint32_t*)buf)), generalData->nPixelsX, generalData->nPixelsY, false)) // new size possibly from callback cprintf(RED,"Error: Could not send zmq header for fnum %lld and streamer %d\n", (long long int) fnum, index); - if (!zmqSocket->SendData(buf + sizeof(sls_detector_header), generalData->imageSize)) + if (!zmqSocket->SendData(buf + FIFO_HEADER_NUMBYTES + sizeof(sls_detector_header), (uint32_t)(*((uint32_t*)buf)) )) // new size possibly from callback cprintf(RED,"Error: Could not send zmq data for fnum %lld and streamer %d\n", (long long int) fnum, index); } @@ -271,7 +271,7 @@ void DataStreamer::ProcessAnImage(char* buf) { -int DataStreamer::SendHeader(sls_detector_header* header, uint32_t nx, uint32_t ny, bool dummy) { +int DataStreamer::SendHeader(sls_detector_header* header, uint32_t size, uint32_t nx, uint32_t ny, bool dummy) { if (dummy) return zmqSocket->SendHeaderData(index, dummy,SLS_DETECTOR_JSON_HEADER_VERSION); @@ -280,7 +280,7 @@ int DataStreamer::SendHeader(sls_detector_header* header, uint32_t nx, uint32_t uint64_t acquisitionIndex = header->frameNumber - firstAcquisitionIndex; return zmqSocket->SendHeaderData(index, dummy, SLS_DETECTOR_JSON_HEADER_VERSION, *dynamicRange, *fileIndex, - nx, ny,generalData->imageSize, + nx, ny, size, acquisitionIndex, frameIndex, fileNametoStream, header->frameNumber, header->expLength, header->packetNumber, header->bunchId, header->timestamp, header->modId, header->xCoord, header->yCoord, header->zCoord, diff --git a/slsReceiverSoftware/src/UDPBaseImplementation.cpp b/slsReceiverSoftware/src/UDPBaseImplementation.cpp index 4ac209004..64996cb74 100644 --- a/slsReceiverSoftware/src/UDPBaseImplementation.cpp +++ b/slsReceiverSoftware/src/UDPBaseImplementation.cpp @@ -614,8 +614,10 @@ void UDPBaseImplementation::registerCallBackAcquisitionFinished(void (*func)(uin pAcquisitionFinished=arg; } -void UDPBaseImplementation::registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, - char*, uint32_t, void*),void *arg){ +void UDPBaseImplementation::registerCallBackRawDataReady(void (*func)(uint64_t, + uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, + uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, + char*, uint32_t*, void*),void *arg){ rawDataReadyCallBack=func; pRawDataReady=arg; } diff --git a/slsReceiverSoftware/src/main.cpp b/slsReceiverSoftware/src/main.cpp index 0086df416..91c22db9a 100644 --- a/slsReceiverSoftware/src/main.cpp +++ b/slsReceiverSoftware/src/main.cpp @@ -42,7 +42,7 @@ void AcquisitionFinished(uint64_t frames, void*p){ void GetData(uint64_t frameNumber, uint32_t expLength, uint32_t packetNumber, uint64_t bunchId, uint64_t timestamp, uint16_t modId, uint16_t xCoord, uint16_t yCoord, uint16_t zCoord, uint32_t debug, uint16_t roundRNumber, uint8_t detType, uint8_t version, - char* datapointer, uint32_t datasize, void* p){ + char* datapointer, uint32_t* datasize, void* p){ PRINT_IN_COLOR (xCoord, "#### %d GetData: ####\n" @@ -51,7 +51,7 @@ void GetData(uint64_t frameNumber, uint32_t expLength, uint32_t packetNumber, ui "version: %u\t\tfirstbytedata: 0x%x\t\tdatsize: %u\n\n", xCoord, frameNumber, expLength, packetNumber, bunchId, timestamp, modId, xCoord, yCoord, zCoord, debug, roundRNumber, detType, version, - ((uint8_t)(*((uint8_t*)(datapointer)))), datasize); + ((uint8_t)(*((uint8_t*)(datapointer)))), *datasize); } */ diff --git a/slsReceiverSoftware/src/slsReceiver.cpp b/slsReceiverSoftware/src/slsReceiver.cpp index baae6b1c8..9e54c3a45 100644 --- a/slsReceiverSoftware/src/slsReceiver.cpp +++ b/slsReceiverSoftware/src/slsReceiver.cpp @@ -150,8 +150,10 @@ void slsReceiver::registerCallBackAcquisitionFinished(void (*func)(uint64_t, voi } -void slsReceiver::registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, - char*, uint32_t, void*),void *arg){ +void slsReceiver::registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, + uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, + uint32_t, uint16_t, uint8_t, uint8_t, + char*, uint32_t*, void*),void *arg){ //tcpipInterface if(udp_interface) udp_interface->registerCallBackRawDataReady(func,arg); diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp index 22c123ce7..9701e983f 100644 --- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp +++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp @@ -170,8 +170,10 @@ void slsReceiverTCPIPInterface::registerCallBackAcquisitionFinished(void (*func) pAcquisitionFinished=arg; } -void slsReceiverTCPIPInterface::registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, - char*, uint32_t, void*),void *arg){ +void slsReceiverTCPIPInterface::registerCallBackRawDataReady(void (*func)(uint64_t, + uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, + uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, + char*, uint32_t*, void*),void *arg){ rawDataReadyCallBack=func; pRawDataReady=arg; } diff --git a/slsReceiverSoftware/src/slsReceiverUsers.cpp b/slsReceiverSoftware/src/slsReceiverUsers.cpp index bab16867f..1ce7de26b 100644 --- a/slsReceiverSoftware/src/slsReceiverUsers.cpp +++ b/slsReceiverSoftware/src/slsReceiverUsers.cpp @@ -31,7 +31,7 @@ void slsReceiverUsers::registerCallBackAcquisitionFinished(void (*func)(uint64_t void slsReceiverUsers::registerCallBackRawDataReady(void (*func)(uint64_t frameNumber, uint32_t expLength, uint32_t packetNumber, uint64_t bunchId, uint64_t timestamp, uint16_t modId, uint16_t xCoord, uint16_t yCoord, uint16_t zCoord, uint32_t debug, uint16_t roundRNumber, uint8_t detType, uint8_t version, - char* datapointer, uint32_t datasize, void*), void *arg){ + char* datapointer, uint32_t* datasize, void*), void *arg){ receiver->registerCallBackRawDataReady(func,arg); } From 14546247e40e617de861cdb4c43e7d10df84e72c Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Thu, 22 Mar 2018 14:34:03 +0100 Subject: [PATCH 14/25] adding a receiver callback to be able to give modified size from the callback --- manual/manual-api/mainReceiver.cpp | 53 ++++++- slsReceiverSoftware/include/DataProcessor.h | 77 +++++++--- .../include/UDPBaseImplementation.h | 141 ++++++++++++------ slsReceiverSoftware/include/UDPInterface.h | 32 +++- slsReceiverSoftware/include/slsReceiver.h | 28 +++- .../include/slsReceiverTCPIPInterface.h | 56 ++++++- .../include/slsReceiverUsers.h | 12 +- slsReceiverSoftware/src/DataProcessor.cpp | 31 +++- .../src/UDPBaseImplementation.cpp | 10 +- .../src/UDPStandardImplementation.cpp | 2 +- slsReceiverSoftware/src/slsReceiver.cpp | 12 +- .../src/slsReceiverTCPIPInterface.cpp | 12 +- slsReceiverSoftware/src/slsReceiverUsers.cpp | 7 +- 13 files changed, 383 insertions(+), 90 deletions(-) diff --git a/manual/manual-api/mainReceiver.cpp b/manual/manual-api/mainReceiver.cpp index ac0eb2233..e39663d3d 100644 --- a/manual/manual-api/mainReceiver.cpp +++ b/manual/manual-api/mainReceiver.cpp @@ -86,6 +86,7 @@ void AcquisitionFinished(uint64_t frames, void*p){ cprintf(BLUE, "#### AcquisitionFinished: frames:%llu ####\n",frames); } + /** * Get Receiver Data Call back * Prints in different colors(for each receiver process) the different headers for each image call back. @@ -94,6 +95,42 @@ void AcquisitionFinished(uint64_t frames, void*p){ * @param packetNumber number of packets caught for this frame * @param bunchId bunch id from beamline * @param timestamp time stamp in 10MHz clock (not implemented for most) + * @param modId module id (not implemented for most) + * @param xCoord x coordinates (detector id in 1D) + * @param yCoord y coordinates (not implemented) + * @param zCoord z coordinates (not implemented) + * @param debug debug values if any + * @param roundRNumber (not implemented) + * @param detType detector type see :: detectorType + * @param version version of standard header (structure format) + * @param datapointer pointer to data + * @param datasize data size in bytes. + * @param p pointer to object + */ +void GetData(uint64_t frameNumber, uint32_t expLength, uint32_t packetNumber, uint64_t bunchId, uint64_t timestamp, + uint16_t modId, uint16_t xCoord, uint16_t yCoord, uint16_t zCoord, uint32_t debug, uint16_t roundRNumber, uint8_t detType, uint8_t version, + char* datapointer, uint32_t datasize, void* p){ + + PRINT_IN_COLOR (modId?modId:xCoord, + "#### %d GetData: ####\n" + "frameNumber: %llu\t\texpLength: %u\t\tpacketNumber: %u\t\tbunchId: %llu\t\ttimestamp: %llu\t\tmodId: %u\t\t" + "xCoord: %u\t\tyCoord: %u\t\tzCoord: %u\t\tdebug: %u\t\troundRNumber: %u\t\tdetType: %u\t\t" + "version: %u\t\tfirstbytedata: 0x%x\t\tdatsize: %u\n\n", + xCoord, frameNumber, expLength, packetNumber, bunchId, timestamp, modId, + xCoord, yCoord, zCoord, debug, roundRNumber, detType, version, + ((uint8_t)(*((uint8_t*)(datapointer)))), datasize); +} + + + +/** + * Get Receiver Data Call back (modified) + * Prints in different colors(for each receiver process) the different headers for each image call back. + * @param frameNumber frame number + * @param expLength real time exposure length (in 100ns) or sub frame number (Eiger 32 bit mode only) + * @param packetNumber number of packets caught for this frame + * @param bunchId bunch id from beamline + * @param timestamp time stamp in 10MHz clock (not implemented for most) * @param modId module id (not implemented for most) * @param xCoord x coordinates (detector id in 1D) * @param yCoord y coordinates (not implemented) @@ -103,12 +140,14 @@ void AcquisitionFinished(uint64_t frames, void*p){ * @param detType detector type see :: detectorType * @param version version of standard header (structure format) * @param datapointer pointer to data - * @param datasize data size in bytes. To write/stream a smaller size of processed data, change this value (only smaller value is allowed). + * @param datasize data size in bytes. + * @param revDatasize new data size in bytes after the callback. + * This will be the size written/streamed. (only smaller value is allowed). * @param p pointer to object */ void GetData(uint64_t frameNumber, uint32_t expLength, uint32_t packetNumber, uint64_t bunchId, uint64_t timestamp, uint16_t modId, uint16_t xCoord, uint16_t yCoord, uint16_t zCoord, uint32_t debug, uint16_t roundRNumber, uint8_t detType, uint8_t version, - char* datapointer, uint32_t* datasize, void* p){ + char* datapointer, uint32_t &revDatasize, void* p){ PRINT_IN_COLOR (modId?modId:xCoord, "#### %d GetData: ####\n" @@ -117,12 +156,15 @@ void GetData(uint64_t frameNumber, uint32_t expLength, uint32_t packetNumber, ui "version: %u\t\tfirstbytedata: 0x%x\t\tdatsize: %u\n\n", xCoord, frameNumber, expLength, packetNumber, bunchId, timestamp, modId, xCoord, yCoord, zCoord, debug, roundRNumber, detType, version, - ((uint8_t)(*((uint8_t*)(datapointer)))), *datasize); - *datasize = 26000; + ((uint8_t)(*((uint8_t*)(datapointer)))), revDatasize); + + // if data is modified, eg ROI and size is reduced + revDatasize = 26000; } + /** * Example of main program using the slsReceiverUsers class * @@ -210,7 +252,8 @@ int main(int argc, char *argv[]) { /* - Call back for raw data */ cprintf(BLUE, "Registering GetData() \n"); - receiver->registerCallBackRawDataReady(GetData,NULL); + if (withCallback == 1) receiver->registerCallBackRawDataReady(GetData,NULL); + else if (withCallback == 2) receiver->registerCallBackRawDataModifyReady(GetData,NULL); } diff --git a/slsReceiverSoftware/include/DataProcessor.h b/slsReceiverSoftware/include/DataProcessor.h index 1636b203b..db559e0d2 100644 --- a/slsReceiverSoftware/include/DataProcessor.h +++ b/slsReceiverSoftware/include/DataProcessor.h @@ -40,7 +40,11 @@ class DataProcessor : private virtual slsReceiverDefs, public ThreadObject { void (*dataReadycb)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, - char*, uint32_t*, void*), + char*, uint32_t, void*), + void (*dataModifyReadycb)(uint64_t, uint32_t, uint32_t, uint64_t, + uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, + uint32_t, uint16_t, uint8_t, uint8_t, + char*, uint32_t &, void*), void *pDataReadycb); /** @@ -378,28 +382,55 @@ class DataProcessor : private virtual slsReceiverDefs, public ThreadObject { //call back - /** - * Call back for raw data - * args to raw data ready callback are - * frameNumber is the frame number - * expLength is the subframe number (32 bit eiger) or real time exposure time in 100ns (others) - * packetNumber is the packet number - * bunchId is the bunch id from beamline - * timestamp is the time stamp with 10 MHz clock - * modId is the unique module id (unique even for left, right, top, bottom) - * xCoord is the x coordinate in the complete detector system - * yCoord is the y coordinate in the complete detector system - * zCoord is the z coordinate in the complete detector system - * debug is for debugging purposes - * roundRNumber is the round robin set number - * detType is the detector type see :: detectorType - * version is the version number of this structure format - * dataPointer is the pointer to the data - * dataSize in bytes is the size of the data in bytes. To write/stream a smaller size of processed data, change this value (only smaller value is allowed). - */ - void (*rawDataReadyCallBack)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, - uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, - char*, uint32_t*, void*); + /** + * Call back for raw data + * args to raw data ready callback are + * frameNumber is the frame number + * expLength is the subframe number (32 bit eiger) or real time exposure time in 100ns (others) + * packetNumber is the packet number + * bunchId is the bunch id from beamline + * timestamp is the time stamp with 10 MHz clock + * modId is the unique module id (unique even for left, right, top, bottom) + * xCoord is the x coordinate in the complete detector system + * yCoord is the y coordinate in the complete detector system + * zCoord is the z coordinate in the complete detector system + * debug is for debugging purposes + * roundRNumber is the round robin set number + * detType is the detector type see :: detectorType + * version is the version number of this structure format + * dataPointer is the pointer to the data + * dataSize in bytes is the size of the data in bytes. + */ + void (*rawDataReadyCallBack)(uint64_t, uint32_t, + uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, + uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, + char*, uint32_t, void*); + + + /** + * Call back for raw data (modified) + * args to raw data ready callback are + * frameNumber is the frame number + * expLength is the subframe number (32 bit eiger) or real time exposure time in 100ns (others) + * packetNumber is the packet number + * bunchId is the bunch id from beamline + * timestamp is the time stamp with 10 MHz clock + * modId is the unique module id (unique even for left, right, top, bottom) + * xCoord is the x coordinate in the complete detector system + * yCoord is the y coordinate in the complete detector system + * zCoord is the z coordinate in the complete detector system + * debug is for debugging purposes + * roundRNumber is the round robin set number + * detType is the detector type see :: detectorType + * version is the version number of this structure format + * dataPointer is the pointer to the data + * revDatasize is the reference of data size in bytes. Can be modified to the new size to be written/streamed. (only smaller value). + */ + void (*rawDataModifyReadyCallBack)(uint64_t, uint32_t, + uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, + uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, + char*, uint32_t &, void*); + void *pRawDataReady; diff --git a/slsReceiverSoftware/include/UDPBaseImplementation.h b/slsReceiverSoftware/include/UDPBaseImplementation.h index 5babfc50c..144fff951 100644 --- a/slsReceiverSoftware/include/UDPBaseImplementation.h +++ b/slsReceiverSoftware/include/UDPBaseImplementation.h @@ -583,31 +583,53 @@ class UDPBaseImplementation : protected virtual slsReceiverDefs, public UDPInter */ void registerCallBackAcquisitionFinished(void (*func)(uint64_t, void*),void *arg); - /** - * Call back for raw data - * args to raw data ready callback are - * frameNumber is the frame number - * expLength is the subframe number (32 bit eiger) or real time exposure time in 100ns (others) - * packetNumber is the packet number - * bunchId is the bunch id from beamline - * timestamp is the time stamp with 10 MHz clock - * modId is the unique module id (unique even for left, right, top, bottom) - * xCoord is the x coordinate in the complete detector system - * yCoord is the y coordinate in the complete detector system - * zCoord is the z coordinate in the complete detector system - * debug is for debugging purposes - * roundRNumber is the round robin set number - * detType is the detector type see :: detectorType - * version is the version number of this structure format - * dataPointer is the pointer to the data - * dataSize in bytes is the size of the data in bytes. To write/stream a smaller size of processed data, change this value (only smaller value is allowed). - */ - void registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, uint32_t, - uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, - uint16_t, uint8_t, uint8_t, - char*, uint32_t*, void*),void *arg); - + /** + * Call back for raw data + * args to raw data ready callback are + * frameNumber is the frame number + * expLength is the subframe number (32 bit eiger) or real time exposure time in 100ns (others) + * packetNumber is the packet number + * bunchId is the bunch id from beamline + * timestamp is the time stamp with 10 MHz clock + * modId is the unique module id (unique even for left, right, top, bottom) + * xCoord is the x coordinate in the complete detector system + * yCoord is the y coordinate in the complete detector system + * zCoord is the z coordinate in the complete detector system + * debug is for debugging purposes + * roundRNumber is the round robin set number + * detType is the detector type see :: detectorType + * version is the version number of this structure format + * dataPointer is the pointer to the data + * dataSize in bytes is the size of the data in bytes. + */ + void registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, + uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, + uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, + char*, uint32_t, void*),void *arg); + /** + * Call back for raw data (modified) + * args to raw data ready callback are + * frameNumber is the frame number + * expLength is the subframe number (32 bit eiger) or real time exposure time in 100ns (others) + * packetNumber is the packet number + * bunchId is the bunch id from beamline + * timestamp is the time stamp with 10 MHz clock + * modId is the unique module id (unique even for left, right, top, bottom) + * xCoord is the x coordinate in the complete detector system + * yCoord is the y coordinate in the complete detector system + * zCoord is the z coordinate in the complete detector system + * debug is for debugging purposes + * roundRNumber is the round robin set number + * detType is the detector type see :: detectorType + * version is the version number of this structure format + * dataPointer is the pointer to the data + * revDatasize is the reference of data size in bytes. Can be modified to the new size to be written/streamed. (only smaller value). + */ + void registerCallBackRawDataModifyReady(void (*func)(uint64_t, uint32_t, + uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, + uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, + char*, uint32_t &,void*),void *arg); protected: @@ -721,28 +743,55 @@ class UDPBaseImplementation : protected virtual slsReceiverDefs, public UDPInter void *pAcquisitionFinished; - /** - * Call back for raw data - * args to raw data ready callback are - * frameNumber is the frame number - * expLength is the subframe number (32 bit eiger) or real time exposure time in 100ns (others) - * packetNumber is the packet number - * bunchId is the bunch id from beamline - * timestamp is the time stamp with 10 MHz clock - * modId is the unique module id (unique even for left, right, top, bottom) - * xCoord is the x coordinate in the complete detector system - * yCoord is the y coordinate in the complete detector system - * zCoord is the z coordinate in the complete detector system - * debug is for debugging purposes - * roundRNumber is the round robin set number - * detType is the detector type see :: detectorType - * version is the version number of this structure format - * dataPointer is the pointer to the data - * dataSize in bytes is the size of the data in bytes. To write/stream a smaller size of processed data, change this value (only smaller value is allowed). - */ - void (*rawDataReadyCallBack)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, - uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, - char*, uint32_t*, void*); + /** + * Call back for raw data + * args to raw data ready callback are + * frameNumber is the frame number + * expLength is the subframe number (32 bit eiger) or real time exposure time in 100ns (others) + * packetNumber is the packet number + * bunchId is the bunch id from beamline + * timestamp is the time stamp with 10 MHz clock + * modId is the unique module id (unique even for left, right, top, bottom) + * xCoord is the x coordinate in the complete detector system + * yCoord is the y coordinate in the complete detector system + * zCoord is the z coordinate in the complete detector system + * debug is for debugging purposes + * roundRNumber is the round robin set number + * detType is the detector type see :: detectorType + * version is the version number of this structure format + * dataPointer is the pointer to the data + * dataSize in bytes is the size of the data in bytes. + */ + void (*rawDataReadyCallBack)(uint64_t, uint32_t, + uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, + uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, + char*, uint32_t, void*); + + + /** + * Call back for raw data (modified) + * args to raw data ready callback are + * frameNumber is the frame number + * expLength is the subframe number (32 bit eiger) or real time exposure time in 100ns (others) + * packetNumber is the packet number + * bunchId is the bunch id from beamline + * timestamp is the time stamp with 10 MHz clock + * modId is the unique module id (unique even for left, right, top, bottom) + * xCoord is the x coordinate in the complete detector system + * yCoord is the y coordinate in the complete detector system + * zCoord is the z coordinate in the complete detector system + * debug is for debugging purposes + * roundRNumber is the round robin set number + * detType is the detector type see :: detectorType + * version is the version number of this structure format + * dataPointer is the pointer to the data + * revDatasize is the reference of data size in bytes. Can be modified to the new size to be written/streamed. (only smaller value). + */ + void (*rawDataModifyReadyCallBack)(uint64_t, uint32_t, + uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, + uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, + char*, uint32_t &, void*); + void *pRawDataReady; diff --git a/slsReceiverSoftware/include/UDPInterface.h b/slsReceiverSoftware/include/UDPInterface.h index 35e756587..a058ea301 100644 --- a/slsReceiverSoftware/include/UDPInterface.h +++ b/slsReceiverSoftware/include/UDPInterface.h @@ -689,10 +689,36 @@ class UDPInterface { * detType is the detector type see :: detectorType * version is the version number of this structure format * dataPointer is the pointer to the data - * dataSize in bytes is the size of the data in bytes. To write/stream a smaller size of processed data, change this value (only smaller value is allowed). + * dataSize in bytes is the size of the data in bytes. */ - virtual void registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, - char*, uint32_t*, void*),void *arg) = 0; + virtual void registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, + uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, + uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, + char*, uint32_t, void*),void *arg) = 0; + + /** + * Call back for raw data (modified) + * args to raw data ready callback are + * frameNumber is the frame number + * expLength is the subframe number (32 bit eiger) or real time exposure time in 100ns (others) + * packetNumber is the packet number + * bunchId is the bunch id from beamline + * timestamp is the time stamp with 10 MHz clock + * modId is the unique module id (unique even for left, right, top, bottom) + * xCoord is the x coordinate in the complete detector system + * yCoord is the y coordinate in the complete detector system + * zCoord is the z coordinate in the complete detector system + * debug is for debugging purposes + * roundRNumber is the round robin set number + * detType is the detector type see :: detectorType + * version is the version number of this structure format + * dataPointer is the pointer to the data + * revDatasize is the reference of data size in bytes. Can be modified to the new size to be written/streamed. (only smaller value). + */ + virtual void registerCallBackRawDataModifyReady(void (*func)(uint64_t, uint32_t, + uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, + uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, + char*, uint32_t &,void*),void *arg) = 0; protected: diff --git a/slsReceiverSoftware/include/slsReceiver.h b/slsReceiverSoftware/include/slsReceiver.h index 69155ad76..efd0050b9 100644 --- a/slsReceiverSoftware/include/slsReceiver.h +++ b/slsReceiverSoftware/include/slsReceiver.h @@ -91,12 +91,36 @@ class slsReceiver : private virtual slsReceiverDefs { * detType is the detector type see :: detectorType * version is the version number of this structure format * dataPointer is the pointer to the data - * dataSize in bytes is the size of the data in bytes. To write/stream a smaller size of processed data, change this value (only smaller value is allowed). + * dataSize in bytes is the size of the data in bytes. */ void registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, - char*, uint32_t*, void*),void *arg); + char*, uint32_t, void*),void *arg); + + /** + * Call back for raw data (modified) + * args to raw data ready callback are + * frameNumber is the frame number + * expLength is the subframe number (32 bit eiger) or real time exposure time in 100ns (others) + * packetNumber is the packet number + * bunchId is the bunch id from beamline + * timestamp is the time stamp with 10 MHz clock + * modId is the unique module id (unique even for left, right, top, bottom) + * xCoord is the x coordinate in the complete detector system + * yCoord is the y coordinate in the complete detector system + * zCoord is the z coordinate in the complete detector system + * debug is for debugging purposes + * roundRNumber is the round robin set number + * detType is the detector type see :: detectorType + * version is the version number of this structure format + * dataPointer is the pointer to the data + * revDatasize is the reference of data size in bytes. Can be modified to the new size to be written/streamed. (only smaller value). + */ + void registerCallBackRawDataModifyReady(void (*func)(uint64_t, uint32_t, + uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, + uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, + char*, uint32_t &,void*),void *arg); diff --git a/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h b/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h index e75253f14..7e33d6e77 100644 --- a/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h +++ b/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h @@ -98,7 +98,32 @@ class slsReceiverTCPIPInterface : private virtual slsReceiverDefs { void registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, - char*, uint32_t*, void*),void *arg); + char*, uint32_t, void*),void *arg); + + /** + * Call back for raw data (modified) + * args to raw data ready callback are + * frameNumber is the frame number + * expLength is the subframe number (32 bit eiger) or real time exposure time in 100ns (others) + * packetNumber is the packet number + * bunchId is the bunch id from beamline + * timestamp is the time stamp with 10 MHz clock + * modId is the unique module id (unique even for left, right, top, bottom) + * xCoord is the x coordinate in the complete detector system + * yCoord is the y coordinate in the complete detector system + * zCoord is the z coordinate in the complete detector system + * debug is for debugging purposes + * roundRNumber is the round robin set number + * detType is the detector type see :: detectorType + * version is the version number of this structure format + * dataPointer is the pointer to the data + * revDatasize is the reference of data size in bytes. Can be modified to the new size to be written/streamed. (only smaller value). + */ + void registerCallBackRawDataModifyReady(void (*func)(uint64_t, uint32_t, + uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, + uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, + char*, uint32_t &,void*),void *arg); + private: @@ -346,11 +371,36 @@ class slsReceiverTCPIPInterface : private virtual slsReceiverDefs { * detType is the detector type see :: detectorType * version is the version number of this structure format * dataPointer is the pointer to the data - * dataSize in bytes is the size of the data in bytes. To write/stream a smaller size of processed data, change this value (only smaller value is allowed). + * dataSize in bytes is the size of the data in bytes. */ void (*rawDataReadyCallBack)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, - char*, uint32_t*, void*); + char*, uint32_t, void*); + + /** + * Call back for raw data (modified) + * args to raw data ready callback are + * frameNumber is the frame number + * expLength is the subframe number (32 bit eiger) or real time exposure time in 100ns (others) + * packetNumber is the packet number + * bunchId is the bunch id from beamline + * timestamp is the time stamp with 10 MHz clock + * modId is the unique module id (unique even for left, right, top, bottom) + * xCoord is the x coordinate in the complete detector system + * yCoord is the y coordinate in the complete detector system + * zCoord is the z coordinate in the complete detector system + * debug is for debugging purposes + * roundRNumber is the round robin set number + * detType is the detector type see :: detectorType + * version is the version number of this structure format + * dataPointer is the pointer to the data + * revDatasize is the reference of data size in bytes. Can be modified to the new size to be written/streamed. (only smaller value). + */ + void (*rawDataModifyReadyCallBack)(uint64_t, uint32_t, + uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, + uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, + char*, uint32_t &, void*); + void *pRawDataReady; diff --git a/slsReceiverSoftware/include/slsReceiverUsers.h b/slsReceiverSoftware/include/slsReceiverUsers.h index 8035d33b4..b257e64a0 100644 --- a/slsReceiverSoftware/include/slsReceiverUsers.h +++ b/slsReceiverSoftware/include/slsReceiverUsers.h @@ -69,8 +69,18 @@ public: */ void registerCallBackRawDataReady(void (*func)(uint64_t frameNumber, uint32_t expLength, uint32_t packetNumber, uint64_t bunchId, uint64_t timestamp, uint16_t modId, uint16_t xCoord, uint16_t yCoord, uint16_t zCoord, uint32_t debug, uint16_t roundRNumber, uint8_t detType, uint8_t version, - char* datapointer, uint32_t* datasize, void*),void *arg); + char* datapointer, uint32_t datasize, void*),void *arg); + + /** + @sort register callback to be called when data are available (to process and/or save the data). + \param func raw data ready callback. arguments are frameNumber, expLength, packetNumber, bunchId, timestamp, modId, xCoord, yCoord, zCoord, debug, roundRNumber, detType, version, dataPointer, revDatasize is the reference of data size in bytes. Can be modified to the new size to be written/streamed. (only smaller value). + \returns nothing + */ + void registerCallBackRawDataModifyReady(void (*func)(uint64_t frameNumber, uint32_t expLength, uint32_t packetNumber, uint64_t bunchId, uint64_t timestamp, + uint16_t modId, uint16_t xCoord, uint16_t yCoord, uint16_t zCoord, uint32_t debug, uint16_t roundRNumber, uint8_t detType, uint8_t version, + char* datapointer, uint32_t &revDatasize, void*),void *arg); + //receiver object slsReceiver* receiver; }; diff --git a/slsReceiverSoftware/src/DataProcessor.cpp b/slsReceiverSoftware/src/DataProcessor.cpp index d78c8bc48..99835b6ed 100644 --- a/slsReceiverSoftware/src/DataProcessor.cpp +++ b/slsReceiverSoftware/src/DataProcessor.cpp @@ -37,7 +37,11 @@ DataProcessor::DataProcessor(Fifo*& f, fileFormat* ftype, bool fwenable, bool* d uint32_t* freq, uint32_t* timer, void (*dataReadycb)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, - char*, uint32_t*, void*), + char*, uint32_t, void*), + void (*dataModifyReadycb)(uint64_t, uint32_t, uint32_t, uint64_t, + uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, + uint32_t, uint16_t, uint8_t, uint8_t, + char*, uint32_t &, void*), void *pDataReadycb) : ThreadObject(NumberofDataProcessors), @@ -62,6 +66,7 @@ DataProcessor::DataProcessor(Fifo*& f, fileFormat* ftype, bool fwenable, bool* d numFramesCaught(0), currentFrameIndex(0), rawDataReadyCallBack(dataReadycb), + rawDataModifyReadyCallBack(dataModifyReadycb), pRawDataReady(pDataReadycb) { if(ThreadObject::CreateThread()){ @@ -411,10 +416,32 @@ void DataProcessor::ProcessAnImage(char* buf) { header->detType, header->version, buf + FIFO_HEADER_NUMBYTES + sizeof(sls_detector_header), - (uint32_t*)buf, + (uint32_t)(*((uint32_t*)buf)), pRawDataReady); } + else if (rawDataModifyReadyCallBack) {cprintf(BG_GREEN,"Calling rawdatamodify\n"); + uint32_t revsize = (uint32_t)(*((uint32_t*)buf)); + rawDataModifyReadyCallBack( + header->frameNumber, + header->expLength, + header->packetNumber, + header->bunchId, + header->timestamp, + header->modId, + header->xCoord, + header->yCoord, + header->zCoord, + header->debug, + header->roundRNumber, + header->detType, + header->version, + buf + FIFO_HEADER_NUMBYTES + sizeof(sls_detector_header), + revsize, + pRawDataReady); + (*((uint32_t*)buf)) = revsize; + } + if (file) file->WriteToFile(buf + FIFO_HEADER_NUMBYTES, sizeof(sls_detector_header) + (uint32_t)(*((uint32_t*)buf)), fnum-firstMeasurementIndex, nump); diff --git a/slsReceiverSoftware/src/UDPBaseImplementation.cpp b/slsReceiverSoftware/src/UDPBaseImplementation.cpp index 64996cb74..cf3c3265d 100644 --- a/slsReceiverSoftware/src/UDPBaseImplementation.cpp +++ b/slsReceiverSoftware/src/UDPBaseImplementation.cpp @@ -30,6 +30,7 @@ UDPBaseImplementation::UDPBaseImplementation(){ acquisitionFinishedCallBack = NULL; pAcquisitionFinished = NULL; rawDataReadyCallBack = NULL; + rawDataModifyReadyCallBack = NULL; pRawDataReady = NULL; } @@ -617,9 +618,16 @@ void UDPBaseImplementation::registerCallBackAcquisitionFinished(void (*func)(uin void UDPBaseImplementation::registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, - char*, uint32_t*, void*),void *arg){ + char*, uint32_t, void*),void *arg){ rawDataReadyCallBack=func; pRawDataReady=arg; } +void UDPBaseImplementation::registerCallBackRawDataModifyReady(void (*func)(uint64_t, + uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, + uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, + char*, uint32_t&, void*),void *arg){ + rawDataModifyReadyCallBack=func; + pRawDataReady=arg; +} //#endif diff --git a/slsReceiverSoftware/src/UDPStandardImplementation.cpp b/slsReceiverSoftware/src/UDPStandardImplementation.cpp index bf6aa324c..ecf061c44 100644 --- a/slsReceiverSoftware/src/UDPStandardImplementation.cpp +++ b/slsReceiverSoftware/src/UDPStandardImplementation.cpp @@ -367,7 +367,7 @@ int UDPStandardImplementation::setDetectorType(const detectorType d) { listener.push_back(new Listener(myDetectorType, fifo[i], &status, &udpPortNum[i], eth, &activated, &numberOfFrames, &dynamicRange)); dataProcessor.push_back(new DataProcessor(fifo[i], &fileFormatType, fileWriteEnable, &dataStreamEnable, &gapPixelsEnable, &dynamicRange, &frameToGuiFrequency, &frameToGuiTimerinMS, - rawDataReadyCallBack,pRawDataReady)); + rawDataReadyCallBack, rawDataModifyReadyCallBack, pRawDataReady)); if (Listener::GetErrorMask() || DataProcessor::GetErrorMask()) { FILE_LOG(logERROR) << "Could not create listener/dataprocessor threads (index:" << i << ")"; for (vector::const_iterator it = listener.begin(); it != listener.end(); ++it) diff --git a/slsReceiverSoftware/src/slsReceiver.cpp b/slsReceiverSoftware/src/slsReceiver.cpp index 9e54c3a45..838554bb3 100644 --- a/slsReceiverSoftware/src/slsReceiver.cpp +++ b/slsReceiverSoftware/src/slsReceiver.cpp @@ -153,7 +153,7 @@ void slsReceiver::registerCallBackAcquisitionFinished(void (*func)(uint64_t, voi void slsReceiver::registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, - char*, uint32_t*, void*),void *arg){ + char*, uint32_t, void*),void *arg){ //tcpipInterface if(udp_interface) udp_interface->registerCallBackRawDataReady(func,arg); @@ -162,3 +162,13 @@ void slsReceiver::registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, } +void slsReceiver::registerCallBackRawDataModifyReady(void (*func)(uint64_t, uint32_t, + uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, + uint32_t, uint16_t, uint8_t, uint8_t, + char*, uint32_t &, void*),void *arg){ + //tcpipInterface + if(udp_interface) + udp_interface->registerCallBackRawDataModifyReady(func,arg); + else + tcpipInterface->registerCallBackRawDataModifyReady(func,arg); +} diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp index 9701e983f..e8a703043 100644 --- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp +++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp @@ -46,6 +46,7 @@ slsReceiverTCPIPInterface::slsReceiverTCPIPInterface(int &success, UDPInterface* acquisitionFinishedCallBack = NULL; pAcquisitionFinished = NULL; rawDataReadyCallBack = NULL; + rawDataModifyReadyCallBack = NULL; pRawDataReady = NULL; unsigned short int port_no=portNumber; @@ -173,11 +174,18 @@ void slsReceiverTCPIPInterface::registerCallBackAcquisitionFinished(void (*func) void slsReceiverTCPIPInterface::registerCallBackRawDataReady(void (*func)(uint64_t, uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, - char*, uint32_t*, void*),void *arg){ + char*, uint32_t, void*),void *arg){ rawDataReadyCallBack=func; pRawDataReady=arg; } +void slsReceiverTCPIPInterface::registerCallBackRawDataModifyReady(void (*func)(uint64_t, + uint32_t, uint32_t, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, + uint16_t, uint32_t, uint16_t, uint8_t, uint8_t, + char*, uint32_t &,void*),void *arg){ + rawDataModifyReadyCallBack=func; + pRawDataReady=arg; +} @@ -787,6 +795,8 @@ int slsReceiverTCPIPInterface::set_detector_type(){ receiverBase->registerCallBackAcquisitionFinished(acquisitionFinishedCallBack,pAcquisitionFinished); if(rawDataReadyCallBack) receiverBase->registerCallBackRawDataReady(rawDataReadyCallBack,pRawDataReady); + if(rawDataModifyReadyCallBack) + receiverBase->registerCallBackRawDataModifyReady(rawDataModifyReadyCallBack,pRawDataReady); } myDetectorType = dr; ret = receiverBase->setDetectorType(myDetectorType); diff --git a/slsReceiverSoftware/src/slsReceiverUsers.cpp b/slsReceiverSoftware/src/slsReceiverUsers.cpp index 1ce7de26b..ab19b9bac 100644 --- a/slsReceiverSoftware/src/slsReceiverUsers.cpp +++ b/slsReceiverSoftware/src/slsReceiverUsers.cpp @@ -31,7 +31,12 @@ void slsReceiverUsers::registerCallBackAcquisitionFinished(void (*func)(uint64_t void slsReceiverUsers::registerCallBackRawDataReady(void (*func)(uint64_t frameNumber, uint32_t expLength, uint32_t packetNumber, uint64_t bunchId, uint64_t timestamp, uint16_t modId, uint16_t xCoord, uint16_t yCoord, uint16_t zCoord, uint32_t debug, uint16_t roundRNumber, uint8_t detType, uint8_t version, - char* datapointer, uint32_t* datasize, void*), void *arg){ + char* datapointer, uint32_t datasize, void*), void *arg){ receiver->registerCallBackRawDataReady(func,arg); } +void slsReceiverUsers::registerCallBackRawDataModifyReady(void (*func)(uint64_t frameNumber, uint32_t expLength, uint32_t packetNumber, uint64_t bunchId, uint64_t timestamp, + uint16_t modId, uint16_t xCoord, uint16_t yCoord, uint16_t zCoord, uint32_t debug, uint16_t roundRNumber, uint8_t detType, uint8_t version, + char* datapointer, uint32_t& revDatasize, void*), void *arg){ + receiver->registerCallBackRawDataModifyReady(func,arg); +} From 5340b8ef24e00cbc04e9827adc55e3adc9046a24 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 26 Mar 2018 18:07:10 +0200 Subject: [PATCH 15/25] added error mask for loading/writing config file to be caught by python --- slsDetectorSoftware/commonFiles/error_defs.h | 4 ++++ slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp | 6 ++++++ slsDetectorSoftware/slsDetector/slsDetector.cpp | 2 ++ 3 files changed, 12 insertions(+) diff --git a/slsDetectorSoftware/commonFiles/error_defs.h b/slsDetectorSoftware/commonFiles/error_defs.h index 01a73ae7d..03730964f 100644 --- a/slsDetectorSoftware/commonFiles/error_defs.h +++ b/slsDetectorSoftware/commonFiles/error_defs.h @@ -24,6 +24,7 @@ using namespace std; // 0xFFF0000000000000ULL #define MULTI_DETECTORS_NOT_ADDED 0x8000000000000000ULL #define MULTI_HAVE_DIFFERENT_VALUES 0x4000000000000000ULL +#define MULTI_CONFIG_FILE_ERROR 0x2000000000000000ULL // sls errors #define CRITICAL_ERROR_MASK 0xFFFFFFF @@ -91,6 +92,7 @@ using namespace std; #define RESTREAM_STOP_FROM_RECEIVER 0x0000000800000000ULL #define TEMPERATURE_CONTROL 0x0000001000000000ULL #define AUTO_COMP_DISABLE 0x0000002000000000ULL +#define CONFIG_FILE 0x0000004000000000ULL // 0x000000FFFFFFFFFFULL @@ -289,6 +291,8 @@ public: if(slsErrorMask&AUTO_COMP_DISABLE) retval.append("Could not set/get auto comparator disable\n"); + if(slsErrorMask&CONFIG_FILE) + retval.append("Could not load/write config file\n"); //------------------------------------------------------ length of message diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 1a2d1e21f..ae16c2a31 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -5149,6 +5149,7 @@ int multiSlsDetector::readConfigurationFile(string const fname){ } else { std::cout<< "Error opening configuration file " << fname << " for reading" << std::endl; + setErrorMask(getErrorMask()|MULTI_CONFIG_FILE_ERROR); return FAIL; } #ifdef VERBOSE @@ -5255,6 +5256,7 @@ int multiSlsDetector::writeConfigurationFile(string const fname){ #endif } else { std::cout<< "Error opening configuration file " << fname << " for writing" << std::endl; + setErrorMask(getErrorMask()|MULTI_CONFIG_FILE_ERROR); ret = FAIL; } @@ -6510,6 +6512,10 @@ string multiSlsDetector::getErrorMessage(int &critical){ "Please check the console\n"); critical = 0; } + if(multiMask & MULTI_CONFIG_FILE_ERROR) { + retval.append("Could not load Config File\n"); + critical = 0; + } for (int idet=0; idetnumberOfDetectors; ++idet) { if (detectors[idet]) { diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 89d80025d..d2fe36d9c 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -7265,6 +7265,7 @@ int slsDetector::readConfigurationFile(string const fname){ infile.close(); } else { std::cout<< "Error opening configuration file " << fname << " for reading" << std::endl; + setErrorMask((getErrorMask())|(CONFIG_FILE)); return FAIL; } #ifdef VERBOSE @@ -7362,6 +7363,7 @@ int slsDetector::writeConfigurationFile(string const fname){ } else { std::cout<< "Error opening configuration file " << fname << " for writing" << std::endl; + setErrorMask((getErrorMask())|(CONFIG_FILE)); return FAIL; } #ifdef VERBOSE From b8bdbf4da61f95b88893b02ddabc2491b16fa10f Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 26 Mar 2018 18:10:14 +0200 Subject: [PATCH 16/25] updaterev --- slsDetectorSoftware/gitInfo.txt | 10 +++++----- slsDetectorSoftware/slsDetector/gitInfoLib.h | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/slsDetectorSoftware/gitInfo.txt b/slsDetectorSoftware/gitInfo.txt index 20f82575c..df6de841b 100644 --- a/slsDetectorSoftware/gitInfo.txt +++ b/slsDetectorSoftware/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: 98752e1cdbd78167ad20c6a01a17852b1a2263a7 -Revision: 1846 +Repsitory UUID: 5340b8ef24e00cbc04e9827adc55e3adc9046a24 +Revision: 1851 Branch: developer -Last Changed Author: Gemma_Tinti -Last Changed Rev: 3733 -Last Changed Date: 2018-03-21 09:01:24.000000002 +0100 ./threadFiles/ThreadPool.o +Last Changed Author: Dhanya_Thattil +Last Changed Rev: 3745 +Last Changed Date: 2018-03-26 18:09:40.000000002 +0200 ./threadFiles/ThreadPool.o diff --git a/slsDetectorSoftware/slsDetector/gitInfoLib.h b/slsDetectorSoftware/slsDetector/gitInfoLib.h index 6f11e61ce..c21027e41 100644 --- a/slsDetectorSoftware/slsDetector/gitInfoLib.h +++ b/slsDetectorSoftware/slsDetector/gitInfoLib.h @@ -1,6 +1,6 @@ #define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "98752e1cdbd78167ad20c6a01a17852b1a2263a7" -#define GITAUTH "Gemma_Tinti" -#define GITREV 0x3733 -#define GITDATE 0x20180321 +#define GITREPUUID "5340b8ef24e00cbc04e9827adc55e3adc9046a24" +#define GITAUTH "Dhanya_Thattil" +#define GITREV 0x3745 +#define GITDATE 0x20180326 #define GITBRANCH "developer" From fe2ba8621b33bc00f51c8cd4d33e98b7d4ebfa41 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 27 Mar 2018 11:00:15 +0200 Subject: [PATCH 17/25] updating versioning to only have date --- slsDetectorGui/gitInfo.txt | 8 ++++---- slsDetectorGui/include/gitInfoGui.h | 6 +++--- slsDetectorGui/src/qDetectorMain.cpp | 6 ++---- slsDetectorSoftware/gitInfo.txt | 8 ++++---- slsDetectorSoftware/slsDetector/gitInfoLib.h | 6 +++--- slsDetectorSoftware/slsDetector/slsDetector.cpp | 3 +-- .../slsDetectorClient/sls_detector_client.cpp | 3 +-- slsReceiverSoftware/gitInfo.txt | 8 ++++---- slsReceiverSoftware/include/gitInfoReceiver.h | 6 +++--- slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp | 3 +-- 10 files changed, 26 insertions(+), 31 deletions(-) diff --git a/slsDetectorGui/gitInfo.txt b/slsDetectorGui/gitInfo.txt index 4ded3c165..18233bfd2 100644 --- a/slsDetectorGui/gitInfo.txt +++ b/slsDetectorGui/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorGui URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: b58c3e8951625ed9124669404f6b68aca340a1b8 -Revision: 491 +Repsitory UUID: b8bdbf4da61f95b88893b02ddabc2491b16fa10f +Revision: 492 Branch: developer Last Changed Author: Dhanya_Thattil -Last Changed Rev: 3727 -Last Changed Date: 2018-03-14 15:24:03.000000002 +0100 ./src/qTabMeasurement.cpp +Last Changed Rev: 3746 +Last Changed Date: 2018-03-26 17:27:44.000000002 +0200 ./src/qTabSettings.cpp diff --git a/slsDetectorGui/include/gitInfoGui.h b/slsDetectorGui/include/gitInfoGui.h index 997240797..9dac684be 100644 --- a/slsDetectorGui/include/gitInfoGui.h +++ b/slsDetectorGui/include/gitInfoGui.h @@ -1,6 +1,6 @@ #define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "b58c3e8951625ed9124669404f6b68aca340a1b8" +#define GITREPUUID "b8bdbf4da61f95b88893b02ddabc2491b16fa10f" #define GITAUTH "Dhanya_Thattil" -#define GITREV 0x3727 -#define GITDATE 0x20180314 +#define GITREV 0x3746 +#define GITDATE 0x20180326 #define GITBRANCH "developer" diff --git a/slsDetectorGui/src/qDetectorMain.cpp b/slsDetectorGui/src/qDetectorMain.cpp index 83be041bf..763b32afe 100644 --- a/slsDetectorGui/src/qDetectorMain.cpp +++ b/slsDetectorGui/src/qDetectorMain.cpp @@ -99,8 +99,7 @@ qDetectorMain::qDetectorMain(int argc, char **argv, QApplication *app, int& ret, break; case 'v': - tempval = GITREV; - tempval = (tempval <<32) | GITDATE; + tempval = GITDATE; cout << "SLS Detector GUI " << GITBRANCH << " (0x" << hex << tempval << ")" << endl; return; @@ -666,8 +665,7 @@ void qDetectorMain::ExecuteHelp(QAction *action){ cout << "About: Common GUI for Mythen, Eiger, Gotthard, Jungfrau, Moench and Propix detectors" << endl; #endif char version[200]; - long long unsigned int retval= GITREV; - retval= (retval <<32) | GITDATE; + long long unsigned int retval= GITDATE; sprintf(version,"%llx",retval); string thisGUIVersion = string(version); diff --git a/slsDetectorSoftware/gitInfo.txt b/slsDetectorSoftware/gitInfo.txt index df6de841b..1795ad4f8 100644 --- a/slsDetectorSoftware/gitInfo.txt +++ b/slsDetectorSoftware/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: 5340b8ef24e00cbc04e9827adc55e3adc9046a24 -Revision: 1851 +Repsitory UUID: b8bdbf4da61f95b88893b02ddabc2491b16fa10f +Revision: 1852 Branch: developer Last Changed Author: Dhanya_Thattil -Last Changed Rev: 3745 -Last Changed Date: 2018-03-26 18:09:40.000000002 +0200 ./threadFiles/ThreadPool.o +Last Changed Rev: 3746 +Last Changed Date: 2018-03-27 10:47:02.000000002 +0200 ./slsDetector/slsDetector.o diff --git a/slsDetectorSoftware/slsDetector/gitInfoLib.h b/slsDetectorSoftware/slsDetector/gitInfoLib.h index c21027e41..40b07cb7e 100644 --- a/slsDetectorSoftware/slsDetector/gitInfoLib.h +++ b/slsDetectorSoftware/slsDetector/gitInfoLib.h @@ -1,6 +1,6 @@ #define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "5340b8ef24e00cbc04e9827adc55e3adc9046a24" +#define GITREPUUID "b8bdbf4da61f95b88893b02ddabc2491b16fa10f" #define GITAUTH "Dhanya_Thattil" -#define GITREV 0x3745 -#define GITDATE 0x20180326 +#define GITREV 0x3746 +#define GITDATE 0x20180327 #define GITBRANCH "developer" diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index d2fe36d9c..1b4cdfcfd 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -2246,8 +2246,7 @@ int64_t slsDetector::getId( idMode mode, int imod){ #endif if (mode==THIS_SOFTWARE_VERSION) { ret=OK; - retval=GITREV; - retval=(retval<<32) | GITDATE; + retval=GITDATE; } else if (mode==RECEIVER_VERSION) { if (thisDetector->receiverOnlineFlag==ONLINE_FLAG) { if (connectData() == OK){ diff --git a/slsDetectorSoftware/slsDetectorClient/sls_detector_client.cpp b/slsDetectorSoftware/slsDetectorClient/sls_detector_client.cpp index e2fefcb21..d0525f9a6 100644 --- a/slsDetectorSoftware/slsDetectorClient/sls_detector_client.cpp +++ b/slsDetectorSoftware/slsDetectorClient/sls_detector_client.cpp @@ -10,8 +10,7 @@ int main(int argc, char *argv[]) { for (int i = 1; i < argc; ++i ) { if (!(strcmp (argv[i],"--version")) || !(strcmp (argv[i],"-v"))) { - int64_t tempval = GITREV; - tempval = (tempval <<32) | GITDATE; + int64_t tempval = GITDATE; cout << argv[0] << " " << GITBRANCH << " (0x" << hex << tempval << ")" << endl; return 0; } diff --git a/slsReceiverSoftware/gitInfo.txt b/slsReceiverSoftware/gitInfo.txt index abab2e22b..f9de8877d 100644 --- a/slsReceiverSoftware/gitInfo.txt +++ b/slsReceiverSoftware/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsReceiverSoftware URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: b58c3e8951625ed9124669404f6b68aca340a1b8 -Revision: 764 +Repsitory UUID: b8bdbf4da61f95b88893b02ddabc2491b16fa10f +Revision: 767 Branch: developer Last Changed Author: Dhanya_Thattil -Last Changed Rev: 3727 -Last Changed Date: 2018-03-13 10:29:32.000000002 +0100 ./src/slsReceiverTCPIPInterface.cpp +Last Changed Rev: 3746 +Last Changed Date: 2018-03-27 10:43:44.000000002 +0200 ./src/slsReceiverTCPIPInterface.cpp diff --git a/slsReceiverSoftware/include/gitInfoReceiver.h b/slsReceiverSoftware/include/gitInfoReceiver.h index 0d471e36c..40b07cb7e 100644 --- a/slsReceiverSoftware/include/gitInfoReceiver.h +++ b/slsReceiverSoftware/include/gitInfoReceiver.h @@ -1,6 +1,6 @@ #define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "b58c3e8951625ed9124669404f6b68aca340a1b8" +#define GITREPUUID "b8bdbf4da61f95b88893b02ddabc2491b16fa10f" #define GITAUTH "Dhanya_Thattil" -#define GITREV 0x3727 -#define GITDATE 0x20180313 +#define GITREV 0x3746 +#define GITDATE 0x20180327 #define GITBRANCH "developer" diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp index e8a703043..ae24c75f4 100644 --- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp +++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp @@ -153,8 +153,7 @@ void slsReceiverTCPIPInterface::stop(){ int64_t slsReceiverTCPIPInterface::getReceiverVersion(){ - int64_t retval = GITREV; - retval= (retval <<32) | GITDATE; + int64_t retval = GITDATE; return retval; } From 252e924f927457ca996fb4821664ca0bde3cd9ed Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 27 Mar 2018 17:49:01 +0200 Subject: [PATCH 18/25] separated start gui button into start and stop to prevent multiple click syndrome --- slsDetectorGui/forms/form_tab_measurement.ui | 139 ++++++++++++++----- slsDetectorGui/gitInfo.txt | 8 +- slsDetectorGui/include/gitInfoGui.h | 6 +- slsDetectorGui/include/qDrawPlot.h | 1 - slsDetectorGui/include/qTabMeasurement.h | 20 ++- slsDetectorGui/src/qDetectorMain.cpp | 1 - slsDetectorGui/src/qDrawPlot.cpp | 1 - slsDetectorGui/src/qTabMeasurement.cpp | 102 +++++--------- 8 files changed, 153 insertions(+), 125 deletions(-) diff --git a/slsDetectorGui/forms/form_tab_measurement.ui b/slsDetectorGui/forms/form_tab_measurement.ui index 4b325f5b0..f4ce14964 100644 --- a/slsDetectorGui/forms/form_tab_measurement.ui +++ b/slsDetectorGui/forms/form_tab_measurement.ui @@ -133,44 +133,6 @@ - - - - 30 - 289 - 319 - 31 - - - - - 0 - 0 - - - - Qt::NoFocus - - - Starts or Stops Acquisition - - - Start - - - - :/icons/images/start.png:/icons/images/start.png - - - Shift+Space - - - true - - - false - - @@ -999,6 +961,107 @@ Frame period between exposures. + + + + 30 + 297 + 318 + 30 + + + + + + + + 0 + 0 + + + + Qt::NoFocus + + + Starts Acquisition + + + Start + + + + :/icons/images/start.png:/icons/images/start.png + + + Shift+Space + + + false + + + false + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + true + + + + 0 + 0 + + + + + 70 + 16777215 + + + + Qt::NoFocus + + + Stops Acquisition + + + Stop + + + + :/icons/images/stop.png:/icons/images/stop.png + + + Shift+Space + + + false + + + false + + + + + spinNumMeasurements diff --git a/slsDetectorGui/gitInfo.txt b/slsDetectorGui/gitInfo.txt index 18233bfd2..df5e478bd 100644 --- a/slsDetectorGui/gitInfo.txt +++ b/slsDetectorGui/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorGui URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: b8bdbf4da61f95b88893b02ddabc2491b16fa10f -Revision: 492 +Repsitory UUID: fe2ba8621b33bc00f51c8cd4d33e98b7d4ebfa41 +Revision: 493 Branch: developer Last Changed Author: Dhanya_Thattil -Last Changed Rev: 3746 -Last Changed Date: 2018-03-26 17:27:44.000000002 +0200 ./src/qTabSettings.cpp +Last Changed Rev: 3747 +Last Changed Date: 2018-03-27 17:30:53.000000002 +0200 ./include/qTabMeasurement.h diff --git a/slsDetectorGui/include/gitInfoGui.h b/slsDetectorGui/include/gitInfoGui.h index 9dac684be..bd01362fb 100644 --- a/slsDetectorGui/include/gitInfoGui.h +++ b/slsDetectorGui/include/gitInfoGui.h @@ -1,6 +1,6 @@ #define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "b8bdbf4da61f95b88893b02ddabc2491b16fa10f" +#define GITREPUUID "fe2ba8621b33bc00f51c8cd4d33e98b7d4ebfa41" #define GITAUTH "Dhanya_Thattil" -#define GITREV 0x3746 -#define GITDATE 0x20180326 +#define GITREV 0x3747 +#define GITDATE 0x20180327 #define GITBRANCH "developer" diff --git a/slsDetectorGui/include/qDrawPlot.h b/slsDetectorGui/include/qDrawPlot.h index 63f9e5b07..54a4a2542 100644 --- a/slsDetectorGui/include/qDrawPlot.h +++ b/slsDetectorGui/include/qDrawPlot.h @@ -617,7 +617,6 @@ void saveErrorSignal(QString); void AcquisitionErrorSignal(QString); void UpdatePlotSignal(); void GainPlotSignal(bool); -void AcquisitionFinishedSignal(); }; diff --git a/slsDetectorGui/include/qTabMeasurement.h b/slsDetectorGui/include/qTabMeasurement.h index 8b925a343..362fba590 100644 --- a/slsDetectorGui/include/qTabMeasurement.h +++ b/slsDetectorGui/include/qTabMeasurement.h @@ -50,14 +50,14 @@ public: */ void SetExpertMode(bool enable); - /** Returns the status of the Start/Stop Acquisition button + /** Returns the status of the acquisition in gui */ - bool GetStartStatus(){return btnStartStop->isChecked();}; + bool GetStartStatus(){return (!btnStart->isEnabled());}; /** Click the Start/Stop Acquisition button * This is used if this command came from gui client */ - void ClickStartStop(){btnStartStop->click();myPlot->SetClientInitiated();}; + void ClickStartStop(){startAcquisition();myPlot->SetClientInitiated();}; /** Returns progress bar value */ int GetProgress(){return progressBar->value();}; @@ -65,10 +65,6 @@ public: public slots: - /** Unconnects start/stop button when acquisition is finished - */ - void AcquisitionFinished(); - /** update plot is finished, * changes start/stop text and enables/disables all widgets */ @@ -131,9 +127,13 @@ private slots: */ void setRunIndex(int index); - /** starts/stops Acquisition + /** starts Acquisition */ - void startStopAcquisition(); + void startAcquisition(); + + /** stops Acquisition + */ + void stopAcquisition(); /** Set number of frames * @param val number of frames to be set @@ -193,8 +193,6 @@ private: QPalette red; /** expert mode */ bool expertMode; - QIcon *iconStart; - QIcon *iconStop; /** to access items in settings combobox */ QStandardItemModel* model; diff --git a/slsDetectorGui/src/qDetectorMain.cpp b/slsDetectorGui/src/qDetectorMain.cpp index 763b32afe..766dac696 100644 --- a/slsDetectorGui/src/qDetectorMain.cpp +++ b/slsDetectorGui/src/qDetectorMain.cpp @@ -336,7 +336,6 @@ void qDetectorMain::Initialization(){ // Plotting // When the acquisition is finished, must update the meas tab connect(myPlot, SIGNAL(UpdatingPlotFinished()), this, SLOT(EnableTabs())); - connect(myPlot, SIGNAL(AcquisitionFinishedSignal()), tab_measurement, SLOT(AcquisitionFinished())); connect(myPlot, SIGNAL(UpdatingPlotFinished()), tab_measurement, SLOT(UpdateFinished())); //This should not be called as it will change file name to measurement when run finished //connect(myPlot, SIGNAL(UpdatingPlotFinished()), tab_plot, SLOT(Refresh())); diff --git a/slsDetectorGui/src/qDrawPlot.cpp b/slsDetectorGui/src/qDrawPlot.cpp index 7385097fb..6ad3e2ec8 100644 --- a/slsDetectorGui/src/qDrawPlot.cpp +++ b/slsDetectorGui/src/qDrawPlot.cpp @@ -1296,7 +1296,6 @@ int qDrawPlot::AcquisitionFinished(double currentProgress, int detectorStatus){ #ifdef VERBOSE cout << "\nEntering Acquisition Finished with status " ; #endif - emit AcquisitionFinishedSignal(); QString status = QString(slsDetectorBase::runStatusType(slsDetectorDefs::runStatus(detectorStatus)).c_str()); #ifdef VERBOSE cout << status.toAscii().constData() << " and progress " << currentProgress << endl; diff --git a/slsDetectorGui/src/qTabMeasurement.cpp b/slsDetectorGui/src/qTabMeasurement.cpp index b6e28ce0e..fa246e84a 100644 --- a/slsDetectorGui/src/qTabMeasurement.cpp +++ b/slsDetectorGui/src/qTabMeasurement.cpp @@ -94,12 +94,6 @@ void qTabMeasurement::SetupWidgetWindow(){ chkFile->setChecked(myDet->enableWriteToFile()); dispFileName->setEnabled(myDet->enableWriteToFile()); - - //creating the icons for the buttons - iconStart = new QIcon(":/icons/images/start.png"); - iconStop = new QIcon(":/icons/images/stop.png"); - - //Timer to update the progress bar progressTimer = new QTimer(this); @@ -267,8 +261,10 @@ void qTabMeasurement::Initialization(){ connect(dispFileName, SIGNAL(editingFinished()),this, SLOT(setFileName())); //File Index connect(spinIndex, SIGNAL(valueChanged(int)), this, SLOT(setRunIndex(int))); - //Start/Stop Acquisition - connect(btnStartStop, SIGNAL(clicked()), this, SLOT(startStopAcquisition())); + //Start Acquisition + connect(btnStart, SIGNAL(clicked()), this, SLOT(startAcquisition())); + //Stop Acquisition + connect(btnStop, SIGNAL(clicked()), this, SLOT(stopAcquisition())); //Timing Mode connect(comboTimingMode, SIGNAL(currentIndexChanged(int)), this, SLOT(SetTimingMode(int)));// //progress bar @@ -309,75 +305,53 @@ void qTabMeasurement::Enable(bool enable){ frameNotTimeResolved->setEnabled(enable); //shortcut each time, else it doesnt work a second time - btnStartStop->setShortcut(QApplication::translate("TabMeasurementObject", "Shift+Space", 0, QApplication::UnicodeUTF8)); + btnStart->setShortcut(QApplication::translate("TabMeasurementObject", "Shift+Space", 0, QApplication::UnicodeUTF8)); } //------------------------------------------------------------------------------------------------------------------------------------------------- -void qTabMeasurement::startStopAcquisition(){ - if(btnStartStop->isChecked()){ - - //if file write enabled and output dir doesnt exist - if((chkFile->isChecked())&&(thisParent->DoesOutputDirExist() == slsDetectorDefs::FAIL)){ - if(qDefs::Message(qDefs::QUESTION, - "Your data will not be saved.
    Disable File write and Proceed with acquisition anyway?", - "qTabMeasurement::startStopAcquisition") == slsDetectorDefs::FAIL){ - disconnect(btnStartStop,SIGNAL(clicked()),this,SLOT(startStopAcquisition())); - btnStartStop->click(); - connect(btnStartStop,SIGNAL(clicked()),this,SLOT(startStopAcquisition())); - return; - }else{ - //done because for receiver it cant save a file with blank file path and returns without acquiring even to the gui - disconnect(chkFile, SIGNAL(toggled(bool)), this, SLOT(EnableFileWrite(bool))); - chkFile->setChecked(false); - EnableFileWrite(false); - connect(chkFile, SIGNAL(toggled(bool)), this, SLOT(EnableFileWrite(bool))); - } - } +void qTabMeasurement::startAcquisition(){ + btnStart->setEnabled(false); + //if file write enabled and output dir doesnt exist + if((chkFile->isChecked())&&(thisParent->DoesOutputDirExist() == slsDetectorDefs::FAIL)){ + if(qDefs::Message(qDefs::QUESTION, + "Your data will not be saved.
    Disable File write and Proceed with acquisition anyway?", + "qTabMeasurement::startAcquisition") == slsDetectorDefs::FAIL){ + btnStart->setEnabled(true); + return; + }else{ + //done because for receiver it cant save a file with blank file path and returns without acquiring even to the gui + disconnect(chkFile, SIGNAL(toggled(bool)), this, SLOT(EnableFileWrite(bool))); + chkFile->setChecked(false); + EnableFileWrite(false); + connect(chkFile, SIGNAL(toggled(bool)), this, SLOT(EnableFileWrite(bool))); + } + } #ifdef VERBOSE - cout << endl << endl << "Starting Acquisition" << endl; + cout << endl << endl << "Starting Acquisition" << endl; #endif - //btnStartStop->setStyleSheet("color:red"); - btnStartStop->setText("Stop"); - btnStartStop->setIcon(*iconStop); - lblProgressIndex->setText(QString::number(0)); - Enable(0); - progressBar->setValue(0); - progressTimer->start(100); + lblProgressIndex->setText(QString::number(0)); + Enable(0); + progressBar->setValue(0); + progressTimer->start(100); - emit StartSignal(); - }else{ -#ifdef VERBOSE - cout << "Stopping Acquisition" << endl<< endl; -#endif - //emit StopSignal(); commented out to prevent undefined state - myDet->stopAcquisition(); - /* commented out to prevent undefined state - myDet->waitForReceiverReadToFinish(); - UpdateProgress(); - //spin index - disconnect(spinIndex, SIGNAL(valueChanged(int)), this, SLOT(setRunIndex(int))); - spinIndex->setValue(myDet->getFileIndex()); - connect(spinIndex, SIGNAL(valueChanged(int)), this, SLOT(setRunIndex(int))); - progressTimer->stop(); - btnStartStop->setText("Start"); - btnStartStop->setIcon(*iconStart); - btnStartStop->setChecked(false); - Enable(1);*/ - } - qDefs::checkErrorMessage(myDet,"qTabMeasurement::startStopAcquisition"); + emit StartSignal(); + qDefs::checkErrorMessage(myDet,"qTabMeasurement::startAcquisition"); } //------------------------------------------------------------------------------------------------------------------------------------------------- -void qTabMeasurement::AcquisitionFinished(){ - disconnect(btnStartStop,SIGNAL(clicked()),this,SLOT(startStopAcquisition())); - btnStartStop->setText("Wait"); +void qTabMeasurement::stopAcquisition(){ +#ifdef VERBOSE + cout << "Stopping Acquisition" << endl<< endl; +#endif + myDet->stopAcquisition(); + qDefs::checkErrorMessage(myDet,"qTabMeasurement::stopAcquisition"); } @@ -391,12 +365,8 @@ void qTabMeasurement::UpdateFinished(){ connect(spinIndex, SIGNAL(valueChanged(int)), this, SLOT(setRunIndex(int))); progressTimer->stop(); - /*disconnect(btnStartStop,SIGNAL(clicked()),this,SLOT(startStopAcquisition())); done in AcquisitionFinished() already */ - btnStartStop->setText("Start"); - btnStartStop->setIcon(*iconStart); - btnStartStop->setChecked(false); Enable(1); - connect(btnStartStop,SIGNAL(clicked()),this,SLOT(startStopAcquisition())); + btnStart->setEnabled(true); qDefs::checkErrorMessage(myDet,"qTabMeasurement::UpdateFinished"); } From 9e8d3e598feb7f28117fe10d1f6cffc6e0f8ad01 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 28 Mar 2018 10:41:52 +0200 Subject: [PATCH 19/25] added enablegappixels to users class --- slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp | 5 +++-- slsDetectorSoftware/slsDetector/slsDetectorUsers.h | 8 ++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp b/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp index 87909bfe8..b26c2e42d 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp @@ -275,8 +275,9 @@ int64_t slsDetectorUsers::getThisSoftwareVersion(){ return myDetector->getThisSoftwareVersion(); } - - +int slsDetectorUsers::enableGapPixels(int enable) { + return myDetector->enableGapPixels(enable); +} void slsDetectorUsers::registerDataCallback(int( *userCallback)(detectorData*, int, int, void*), void *pArg){ myDetector->registerDataCallback(userCallback,pArg); diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUsers.h b/slsDetectorSoftware/slsDetector/slsDetectorUsers.h index 2bc3462aa..645998e12 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUsers.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUsers.h @@ -528,6 +528,14 @@ class slsDetectorUsers */ int64_t getThisSoftwareVersion(); + /** + * Enable gap pixels, only for Eiger and for 8,16 and 32 bit mode. + * 4 bit mode gap pixels only in gui call back (registerDataCallback) + * @param enable 1 sets, 0 unsets, -1 gets + * @return gap pixel enable or -1 for error + */ + int enableGapPixels(int enable=-1); + /** @short register calbback for accessing detector final data \param func function to be called at the end of the acquisition. gets detector status and progress index as arguments From e4868671ae63f8f94a3d131779c8744941aea85d Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 4 Apr 2018 14:56:55 +0200 Subject: [PATCH 20/25] bugfix: users api version numbering always gives a -1. --- .../multiSlsDetector/multiSlsDetector.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index ae16c2a31..6009bc8c9 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -4563,6 +4563,17 @@ int64_t multiSlsDetector::getId(idMode mode, int imod) { } } + ret = -100; int64_t ret1; + for (int idet=0; idetnumberOfDetectors; ++idet) + if (detectors[idet]){ + ret1=detectors[idet]->getId(mode, imod); + if(ret==-100) + ret=ret1; + else if (ret!=ret1) + ret=-1; + } + return ret; + return -1; } From da010a03d725b6f18020d2142d58771534414274 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Wed, 4 Apr 2018 18:07:33 +0200 Subject: [PATCH 21/25] added -std=c++98 to CXX flags --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 14f4ecf85..116d270cf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ option (USE_TEXTCLIENT "Text Client" OFF) option (USE_RECEIVER "Receiver" OFF) option (USE_GUI "GUI" OFF) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-misleading-indentation") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++98 -Wall -Wno-misleading-indentation") find_package(Qt4) find_package(Qwt 6) From d28f293485909f6bafc5654fc68fead531b72377 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 6 Apr 2018 12:15:57 +0200 Subject: [PATCH 22/25] jungfrau and eiger server bug fix: module_firmware_version gets stuck as it expects an int, but should have been for module_serial_number --- .../bin/eigerDetectorServer_developer | Bin 293767 -> 293767 bytes .../eigerDetectorServer/gitInfo.txt | 10 +++++----- .../eigerDetectorServer/gitInfoEiger.h | 8 ++++---- .../bin/jungfrauDetectorServer_developer | Bin 110932 -> 110932 bytes .../jungfrauDetectorServer/gitInfo.txt | 10 +++++----- .../jungfrauDetectorServer/gitInfoJungfrau.h | 8 ++++---- .../slsDetectorServer_funcs.c | 2 +- 7 files changed, 19 insertions(+), 19 deletions(-) diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_developer b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_developer index e95c3395dfc28740fdad26a9d80f25881ed25e94..c2c348a0ab4479cd233d6610ff4e4beaa215641e 100755 GIT binary patch delta 44 zcmZqwF4+EEaKm>WRtAT83>K3YxQlHT@;xz!iG{iO&dc^YFByTDY5Sd*%&R8?0Jj4a A+5i9m delta 44 zcmZqwF4+EEaKm>WRz`<;3>K3YxQlHT@;xz!iCMAv&dc^YFByTDY5Sd*%&R8?0J$y{ A_y7O^ diff --git a/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt b/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt index f8ff0bed0..37168cb6b 100644 --- a/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt +++ b/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware/eigerDetectorServer URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: 98752e1cdbd78167ad20c6a01a17852b1a2263a7 -Revision: 326 +Repsitory UUID: da010a03d725b6f18020d2142d58771534414274 +Revision: 328 Branch: developer -Last Changed Author: Gemma_Tinti -Last Changed Rev: 3733 -Last Changed Date: 2018-03-21 08:34:29.000000002 +0100 ./FebRegisterDefs.h +Last Changed Author: Erik_Frojdh +Last Changed Rev: 3751 +Last Changed Date: 2018-04-03 16:29:39.000000002 +0200 ./xparameters.h diff --git a/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h b/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h index 6f11e61ce..37d82e952 100644 --- a/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h +++ b/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h @@ -1,6 +1,6 @@ #define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "98752e1cdbd78167ad20c6a01a17852b1a2263a7" -#define GITAUTH "Gemma_Tinti" -#define GITREV 0x3733 -#define GITDATE 0x20180321 +#define GITREPUUID "da010a03d725b6f18020d2142d58771534414274" +#define GITAUTH "Erik_Frojdh" +#define GITREV 0x3751 +#define GITDATE 0x20180403 #define GITBRANCH "developer" diff --git a/slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer b/slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer index aaaa788e606091283c15be3de836afe2c1992da5..995b38685cc3ee4ecf8bfc483f8bc4d8a0fd1273 100755 GIT binary patch delta 40 ycmV+@0N4N2;s(^>29PNO$4FS00aXDQu|%dO0RXe>Cg)fJ0|bNAf49_s0e~@4%@6_r delta 40 ycmV+@0N4N2;s(^>29PNOvJU^30aXDQu|%dO0SL3}Cg)fJAp?Wdf49_s0e~@GF%W+M diff --git a/slsDetectorSoftware/jungfrauDetectorServer/gitInfo.txt b/slsDetectorSoftware/jungfrauDetectorServer/gitInfo.txt index d4c24f7db..889923a98 100644 --- a/slsDetectorSoftware/jungfrauDetectorServer/gitInfo.txt +++ b/slsDetectorSoftware/jungfrauDetectorServer/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware/jungfrauDetectorServer URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: 98752e1cdbd78167ad20c6a01a17852b1a2263a7 -Revision: 133 +Repsitory UUID: da010a03d725b6f18020d2142d58771534414274 +Revision: 135 Branch: developer -Last Changed Author: Gemma_Tinti -Last Changed Rev: 3733 -Last Changed Date: 2018-03-21 08:34:29.000000002 +0100 ./RegisterDefs.h +Last Changed Author: Erik_Frojdh +Last Changed Rev: 3751 +Last Changed Date: 2018-04-03 16:29:40.000000002 +0200 ./RegisterDefs.h diff --git a/slsDetectorSoftware/jungfrauDetectorServer/gitInfoJungfrau.h b/slsDetectorSoftware/jungfrauDetectorServer/gitInfoJungfrau.h index 6f11e61ce..37d82e952 100644 --- a/slsDetectorSoftware/jungfrauDetectorServer/gitInfoJungfrau.h +++ b/slsDetectorSoftware/jungfrauDetectorServer/gitInfoJungfrau.h @@ -1,6 +1,6 @@ #define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "98752e1cdbd78167ad20c6a01a17852b1a2263a7" -#define GITAUTH "Gemma_Tinti" -#define GITREV 0x3733 -#define GITDATE 0x20180321 +#define GITREPUUID "da010a03d725b6f18020d2142d58771534414274" +#define GITAUTH "Erik_Frojdh" +#define GITREV 0x3751 +#define GITDATE 0x20180403 #define GITBRANCH "developer" diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c index 1e58550c5..fab206e9b 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c @@ -653,7 +653,7 @@ int get_id(int file_des) { n = receiveData(file_des,&arg,sizeof(arg),INT32); if (n < 0) return printSocketReadError(); - if (arg == MODULE_FIRMWARE_VERSION) { + if (arg == MODULE_SERIAL_NUMBER) { n = receiveData(file_des,&imod,sizeof(imod),INT32); if (n < 0) return printSocketReadError(); } From 649cb0aed9589c09660355ed341af5268e1c8163 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 9 Apr 2018 09:18:56 +0200 Subject: [PATCH 23/25] added reset frames caught in to users class --- slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp | 4 ++++ slsDetectorSoftware/slsDetector/slsDetectorUsers.h | 11 +++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp b/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp index b26c2e42d..ae6b1ca75 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp @@ -383,3 +383,7 @@ int slsDetectorUsers::setReceiverSilentMode(int i) { int slsDetectorUsers::setHighVoltage(int i) { return myDetector->setHighVoltage(i); } + +int slsDetectorUsers::resetFramesCaughtInReceiver() { + return myDetector->resetFramesCaught(); +} diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUsers.h b/slsDetectorSoftware/slsDetector/slsDetectorUsers.h index 645998e12..049ba7178 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUsers.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUsers.h @@ -666,17 +666,24 @@ class slsDetectorUsers /** * set receiver in silent mode * @param i 1 sets, 0 unsets (-1 gets) - * @return silent mode of receiver + * @returns silent mode of receiver */ int setReceiverSilentMode(int i); /** * set high voltage * @param i > 0 sets, 0 unsets, (-1 gets) - * @return high voltage + * @returns high voltage */ int setHighVoltage(int i); + /** + * reset frames caught in receiver + * should be called before startReceiver() + * @retuns OK or FAIL + */ + int resetFramesCaughtInReceiver(); + /************************************************************************ STATIC FUNCTIONS From 9847729f3ca9695fcdda47a7a2bf172c9686b3e7 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 9 Apr 2018 11:13:20 +0200 Subject: [PATCH 24/25] gap pixels included in gui --- slsDetectorGui/forms/form_tab_plot.ui | 49 +++++++++++++++++++++++---- slsDetectorGui/include/qTabPlot.h | 3 ++ slsDetectorGui/src/qTabPlot.cpp | 40 ++++++++++++++++++++-- 3 files changed, 83 insertions(+), 9 deletions(-) diff --git a/slsDetectorGui/forms/form_tab_plot.ui b/slsDetectorGui/forms/form_tab_plot.ui index 241c8e944..e16c6ae46 100644 --- a/slsDetectorGui/forms/form_tab_plot.ui +++ b/slsDetectorGui/forms/form_tab_plot.ui @@ -99,7 +99,7 @@ - 0 + 4 @@ -548,7 +548,7 @@ 25 5 - 314 + 335 26 @@ -587,7 +587,7 @@ Displays minimum, maximum and sum of values for each plot. - 100 + 10 10 @@ -596,7 +596,7 @@ Displays minimum, maximum and sum of values for each plot. - true + false @@ -614,6 +614,43 @@ Displays minimum, maximum and sum of values for each plot. + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 10 + + + + + + + + false + + + + 0 + 0 + + + + <nobr> +Displays minimum, maximum and sum of values for each plot. +<nobr> + + + Gap Pixels + + + @@ -1695,7 +1732,7 @@ Displays minimum, maximum and sum of values for each plot. 10 20 - 331 + 357 26 @@ -2522,7 +2559,7 @@ Interval between plots has 2 modes. A condition to be satisfied, in order to avo 10 12 - 331 + 365 36 diff --git a/slsDetectorGui/include/qTabPlot.h b/slsDetectorGui/include/qTabPlot.h index 92fcae92a..b2dbbd208 100644 --- a/slsDetectorGui/include/qTabPlot.h +++ b/slsDetectorGui/include/qTabPlot.h @@ -174,6 +174,9 @@ private slots: /** Set histogram options */ void SetHistogramOptions(); + /** Enable Gap pixels */ + void EnableGapPixels(bool enable); + signals: void DisableZoomSignal(bool); void ResetZMinZMaxSignal(bool,bool,double,double); diff --git a/slsDetectorGui/src/qTabPlot.cpp b/slsDetectorGui/src/qTabPlot.cpp index 3f599ed78..cbcda6ec5 100644 --- a/slsDetectorGui/src/qTabPlot.cpp +++ b/slsDetectorGui/src/qTabPlot.cpp @@ -156,9 +156,6 @@ void qTabPlot::SetupWidgetWindow(){ stackedWidget->setCurrentIndex(0); stackedWidget_2->setCurrentIndex(0); - //gain plot - chkGainPlot->setEnabled(false); - // Depending on whether the detector is 1d or 2d switch(myDet->getDetectorsType()){ case slsDetectorDefs::MYTHEN: @@ -174,6 +171,7 @@ void qTabPlot::SetupWidgetWindow(){ pagePedestal_2->setEnabled(false); chkBinary->setEnabled(false); chkBinary_2->setEnabled(false); + chkGapPixels->setEnabled(true); break; case slsDetectorDefs::GOTTHARD: isOriginallyOneD = true; @@ -202,6 +200,12 @@ void qTabPlot::SetupWidgetWindow(){ //disable histogram initially boxHistogram->hide(); + if (chkGapPixels->isEnabled()) { + int ret = myDet->enableGapPixels(-1); + qDefs::checkErrorMessage(myDet,"qTabPlot::SetupWidgetWindow"); + chkGapPixels->setChecked((ret == 1) ? true : false); + } + qDefs::checkErrorMessage(myDet,"qTabPlot::SetupWidgetWindow"); } @@ -376,6 +380,10 @@ void qTabPlot::Initialization(){ //gainplot if (chkGainPlot->isEnabled()) connect(chkGainPlot, SIGNAL(toggled(bool)),myPlot, SIGNAL(GainPlotSignal(bool))); + + // gap pixels + if (chkGapPixels->isEnabled()) + connect(chkGapPixels, SIGNAL(toggled(bool)),this, SLOT(EnableGapPixels(bool))); } @@ -1471,6 +1479,24 @@ void qTabPlot::SetHistogramOptions(){ +//------------------------------------------------------------------------------------------------------------------------------------------------- + + +void qTabPlot::EnableGapPixels(bool enable) { +#ifdef VERBOSE + cout << "Setting Gap pixels to " << enable << endl; +#endif + disconnect(chkGapPixels, SIGNAL(toggled(bool)),this, SLOT(EnableGapPixels(bool))); + + myDet->enableGapPixels(enable); + int ret = myDet->enableGapPixels(-1); + qDefs::checkErrorMessage(myDet,"qTabPlot::SetScanArgument"); + chkGapPixels->setChecked((ret == 1) ? true : false); + + connect(chkGapPixels, SIGNAL(toggled(bool)),this, SLOT(EnableGapPixels(bool))); +} + + //------------------------------------------------------------------------------------------------------------------------------------------------- @@ -1487,6 +1513,14 @@ void qTabPlot::Refresh(){ comboFrequency->setCurrentIndex(1);*/ SetFrequency(); + if (chkGapPixels->isEnabled()) { + disconnect(chkGapPixels, SIGNAL(toggled(bool)),this, SLOT(EnableGapPixels(bool))); + int ret = myDet->enableGapPixels(-1); + qDefs::checkErrorMessage(myDet,"qTabPlot::Refresh"); + chkGapPixels->setChecked((ret == 1) ? true : false); + connect(chkGapPixels, SIGNAL(toggled(bool)),this, SLOT(EnableGapPixels(bool))); + } + }else{ boxFrequency->setEnabled(false); disconnect(boxScan, SIGNAL(toggled(bool)), this, SLOT(EnableScanBox())); From 7cd35f24b87501374fbaf45693a2adf16dfae3e3 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 9 Apr 2018 18:21:43 +0200 Subject: [PATCH 25/25] added to users class receiverfifodepth, flowcontrol10g, 10gbe --- .../slsDetector/slsDetectorUsers.cpp | 12 +++++++++++ .../slsDetector/slsDetectorUsers.h | 21 +++++++++++++++++++ .../slsDetector/slsDetectorUtils.h | 13 ++++++++++++ 3 files changed, 46 insertions(+) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp b/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp index ae6b1ca75..11a3f800b 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp @@ -387,3 +387,15 @@ int slsDetectorUsers::setHighVoltage(int i) { int slsDetectorUsers::resetFramesCaughtInReceiver() { return myDetector->resetFramesCaught(); } + +int slsDetectorUsers::setReceiverFifoDepth(int i) { + return myDetector->setReceiverFifoDepth(i); +} + +int slsDetectorUsers::setFlowControl10G(int i) { + return myDetector->setFlowControl10G(i); +} + +int slsDetectorUsers::setTenGigabitEthernet(int i) { + return myDetector->enableTenGigabitEthernet(i); +} diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUsers.h b/slsDetectorSoftware/slsDetector/slsDetectorUsers.h index 049ba7178..9b6c2c297 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUsers.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUsers.h @@ -684,6 +684,27 @@ class slsDetectorUsers */ int resetFramesCaughtInReceiver(); + /** + * set receiver fifo depth + * @param i number of images in fifo depth (-1 gets) + * @returns receiver fifo depth + */ + int setReceiverFifoDepth(int i = -1); + + /** + * set flow control for 10Gbe (Eiger only) + * @param i 1 sets, 0 unsets (-1 gets) + * @return flow control enable for 10 Gbe + */ + int setFlowControl10G(int i = -1); + + /** + * enable/disable 10GbE (Eiger only) + * @param i 1 sets, 0 unsets (-1 gets) + * @return 10GbE enable + */ + int setTenGigabitEthernet(int i = -1); + /************************************************************************ STATIC FUNCTIONS diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h index 1ac5e5b14..a84b71850 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h @@ -259,6 +259,19 @@ class slsDetectorUtils : public slsDetectorActions, public postProcessing { */ virtual string setNetworkParameter(networkParameter i, string s)=0; + int setFlowControl10G(int i = -1) { + string sret=""; + if (i != -1) { + ostringstream o; + o << ((i >= 1) ? 1 : 0); + string sval = o.str(); + sret = setNetworkParameter(FLOW_CONTROL_10G, sval); + } else + sret = getNetworkParameter(FLOW_CONTROL_10G); + + return atoi(sret.c_str()); + } + /** changes/gets the port number \param t type port type can be CONTROL_PORT, DATA_PORT, STOP_PORT