From 27c91c36ff2642aeba5ee6377106f5b6f5fd48df Mon Sep 17 00:00:00 2001 From: l_maliakal_d Date: Fri, 12 Apr 2013 12:54:36 +0000 Subject: [PATCH] moench client and receiver works with gotthard module, without gui git-svn-id: file:///afs/psi.ch/project/sls_det_software/svn/slsDetectorSoftware@511 951219d9-93cf-4727-9268-0efd64621fa3 --- .../commonFiles/sls_detector_defs.h | 2 + .../moenchDetectorServer/firmware_funcs.c | 4 +- .../moenchDetectorServer/mcb_funcs.c | 8 +- .../moenchDetectorServer/server_defs.h | 7 + .../moenchDetectorServer/server_funcs.c | 8 +- .../multiSlsDetector/multiSlsDetector.cpp | 8 +- .../slsDetector/slsDetector.cpp | 65 +++- slsDetectorSoftware/slsDetector/slsDetector.h | 10 +- .../slsDetector/slsDetectorBase.h | 4 +- .../slsDetector/slsDetectorUtils.cpp | 4 +- .../slsDetectorAnalysis/energyConversion.cpp | 5 +- .../slsDetectorAnalysis/postProcessing.cpp | 7 +- slsDetectorSoftware/slsReceiver/Makefile | 2 +- .../slsReceiver/receiver_defs.h | 32 +- .../slsReceiver/slsReceiverFunctionList.cpp | 43 ++- .../slsReceiver/slsReceiverFunctionList.h | 9 +- .../slsReceiver/slsReceiver_funcs.cpp | 358 +++++++++++++----- .../slsReceiver/slsReceiver_funcs.h | 16 +- 18 files changed, 420 insertions(+), 172 deletions(-) diff --git a/slsDetectorSoftware/commonFiles/sls_detector_defs.h b/slsDetectorSoftware/commonFiles/sls_detector_defs.h index cb9148834..f74e81dc7 100755 --- a/slsDetectorSoftware/commonFiles/sls_detector_defs.h +++ b/slsDetectorSoftware/commonFiles/sls_detector_defs.h @@ -41,6 +41,8 @@ typedef float dacs_t; #define MAX_FRAMES_PER_FILE 20000 #define SHORT_MAX_FRAMES_PER_FILE 100000 +#define MOENCH_MAX_FRAMES_PER_FILE 1000 + /** \file sls_detector_defs.h diff --git a/slsDetectorSoftware/moenchDetectorServer/firmware_funcs.c b/slsDetectorSoftware/moenchDetectorServer/firmware_funcs.c index 630b3ba33..ce81ec8b2 100755 --- a/slsDetectorSoftware/moenchDetectorServer/firmware_funcs.c +++ b/slsDetectorSoftware/moenchDetectorServer/firmware_funcs.c @@ -1206,7 +1206,7 @@ int setADC(int adc){ ipPacketSize= DEFAULT_IP_PACKETSIZE; udpPacketSize=DEFAULT_UDP_PACKETSIZE; //set channel mask - nchips = NCHIP; + nchips = GOTTHARDNCHIP; mask = ACTIVE_ADC_MASK; } //1 adc @@ -1219,7 +1219,7 @@ int setADC(int adc){ } //set channel mask - reg = (NCHAN*nchips)<=0) && (adc<=4)); else { printf("warning:adc value greater than 5. deleting roi\n"); @@ -2617,8 +2617,8 @@ ROI* setROI(int n, ROI arg[], int *retvalsize, int *ret){ //set rois for just 1 adc - take only 1st roi if(adc!=-1){ - rois[0].xmin=adc*(NCHAN*NCHIPS_PER_ADC); - rois[0].xmax=(adc+1)*(NCHAN*NCHIPS_PER_ADC)-1; + rois[0].xmin=adc*(GOTTHARDNCHAN*NCHIPS_PER_ADC); + rois[0].xmax=(adc+1)*(GOTTHARDNCHAN*NCHIPS_PER_ADC)-1; rois[0].ymin=-1; rois[0].ymax=-1; nROI = 1; diff --git a/slsDetectorSoftware/moenchDetectorServer/server_defs.h b/slsDetectorSoftware/moenchDetectorServer/server_defs.h index 5298cb5f5..d6821563f 100755 --- a/slsDetectorSoftware/moenchDetectorServer/server_defs.h +++ b/slsDetectorSoftware/moenchDetectorServer/server_defs.h @@ -16,6 +16,13 @@ #define NDAC 8 #define NADC 1 +/**change this for the real moench chip*/ +#define GOTTHARDNCHAN 128 +#define GOTTHARDNCHIP 10 + + + + #define NCHANS NCHAN*NCHIP*NMAXMOD #define NDACS NDAC*NMAXMOD diff --git a/slsDetectorSoftware/moenchDetectorServer/server_funcs.c b/slsDetectorSoftware/moenchDetectorServer/server_funcs.c index 4b1ad6abf..d35ab83cf 100755 --- a/slsDetectorSoftware/moenchDetectorServer/server_funcs.c +++ b/slsDetectorSoftware/moenchDetectorServer/server_funcs.c @@ -80,7 +80,7 @@ int init_detector( int b) { prepareADC(); setADC(-1); //already does setdaqreg and clean fifo printf("in chip of interes reg:%d\n",bus_r(CHIP_OF_INTRST_REG)); - int reg = (NCHAN*NCHIP)<alreadyExisting=1; } - + //assigned before creating detector stoppedFlag=&thisMultiDetector->stoppedFlag; threadedProcessing=&thisMultiDetector->threadedProcessing; @@ -597,14 +597,14 @@ int multiSlsDetector::addSlsDetector(const char *name, int pos) { #ifdef VERBOSE else cout << "Detector type is " << t << endl; -#endif +#endif online=1; } } #ifdef VERBOSE else cout << "Adding detector by type " << getDetectorType(t) << endl; -#endif +#endif @@ -635,7 +635,7 @@ int multiSlsDetector::addSlsDetector(const char *name, int pos) { int multiSlsDetector::addSlsDetector(detectorType t, int pos) { - + int id; if (t==GENERIC) { diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index af69a3889..f1a266996 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -48,12 +48,19 @@ int slsDetector::initSharedMemory(detectorType type, int id) { nm=1; //modules/detector nc=4; //chips nd=16; //dacs+adcs + break; + case MOENCH: + nch=160*160; + nm=1; //modules/detector + nc=1; //chips + nd=9; //dacs+adcs + break; default: nch=0; // dum! nm=0; //modules/detector nc=0; //chips nd=0; //dacs+adcs - + break; } /** The size of the shared memory is: @@ -148,7 +155,7 @@ slsDetector::slsDetector(int id,multiSlsDetector *p) :slsDetectorUtils(), #endif detId=id; - + /**Initializes the detector stucture \sa initializeDetectorSize */ initializeDetectorSize(type); @@ -512,6 +519,15 @@ int slsDetector::initializeDetectorSize(detectorType type) { thisDetector->nModMax[Y]=1; thisDetector->dynamicRange=16; break; + case MOENCH: + thisDetector->nChans=160*160; + thisDetector->nChips=1; + thisDetector->nDacs=8; + thisDetector->nAdcs=1; + thisDetector->nModMax[X]=1; + thisDetector->nModMax[Y]=1; + thisDetector->dynamicRange=16; + break; default: thisDetector->nChans=0; thisDetector->nChips=0; @@ -642,9 +658,9 @@ int slsDetector::initializeDetectorSize(detectorType type) { adcs=(dacs_t*)(goff+thisDetector->adcoff); chipregs=(int*)(goff+thisDetector->chipoff); chanregs=(int*)(goff+thisDetector->chanoff); - if (thisDetector->alreadyExisting==0) { + if (thisDetector->alreadyExisting==0) { /** if thisDetector is new, initialize its structures \sa initializeDetectorStructure(); */ - initializeDetectorStructure(); + initializeDetectorStructure(); /** set thisDetector->alreadyExisting=1 */ thisDetector->alreadyExisting=1; } @@ -691,7 +707,8 @@ int slsDetector::initializeDetectorSize(detectorType type) { framesPerFile=parentDet->framesPerFile; if(thisDetector->myDetectorType==GOTTHARD) setFramesPerFile(MAX_FRAMES_PER_FILE); - + if (thisDetector->myDetectorType==MOENCH) + setFramesPerFile(MOENCH_MAX_FRAMES_PER_FILE); thisReceiver = new receiverInterface(dataSocket); // setAngularConversionPointer(thisDetector->angOff,&thisDetector->nMods, thisDetector->nChans*thisDetector->nChips); @@ -723,14 +740,14 @@ int slsDetector::initializeDetectorStructure() { thisMod=detectorModules+imod; thisMod->module=imod; - + /** sets the size of the module to nChans, nChips etc. */ thisMod->nchan=thisDetector->nChans*thisDetector->nChips; thisMod->nchip=thisDetector->nChips; thisMod->ndac=thisDetector->nDacs; thisMod->nadc=thisDetector->nAdcs; - + /** initializes the serial number and register to 0 */ thisMod->serialnumber=0; thisMod->reg=0; @@ -753,7 +770,7 @@ int slsDetector::initializeDetectorStructure() { *(chipregs+ichip+thisDetector->nChips*imod)=-1; } - + /** initializes the channel registers to 0 */ for (int ichan=0; ichannChans*thisDetector->nChips; ichan++) { *(chanregs+ichan+thisDetector->nChips*thisDetector->nChans*imod)=-1; @@ -797,7 +814,15 @@ slsDetectorDefs::sls_detector_module* slsDetector::createModule(detectorType t) nm=1; //modules/detector nc=4; //chips nd=16; //dacs - na=16; + na=16; + break; + case MOENCH: + nch=160*160; + nm=1; //modules/detector + nc=1; //chips + nd=8; //dacs + na=1; + break; default: nch=0; // dum! nm=0; //modules/detector @@ -1262,7 +1287,8 @@ int slsDetector::execCommand(string cmd, string answer){ PILATUS, EIGER, GOTTHARD, - AGIPD + AGIPD, + MOENCH }; */ @@ -2757,6 +2783,7 @@ slsDetectorDefs::detectorSettings slsDetector::setSettings( detectorSettings ise detectorSettings minsettings, maxsettings; switch(thisDetector->myDetectorType){ + case MOENCH: case GOTTHARD: minsettings = HIGHGAIN; maxsettings = VERYHIGHGAIN; @@ -2811,6 +2838,7 @@ slsDetectorDefs::detectorSettings slsDetector::setSettings( detectorSettings ise myMod->module=im; //create file names switch(thisDetector->myDetectorType){ + case MOENCH: case GOTTHARD: //settings is saved in myMod.reg for gotthard myMod->reg=thisDetector->currentSettings; @@ -2838,6 +2866,7 @@ slsDetectorDefs::detectorSettings slsDetector::setSettings( detectorSettings ise } else { ostringstream ostfn,oscfn; switch(thisDetector->myDetectorType){ + case MOENCH: case GOTTHARD: ostfn << thisDetector->settingsDir << ssettings << ssettings << ".settings"; break; @@ -2936,7 +2965,7 @@ int slsDetector::updateDetectorNoWait() { n = controlSocket->ReceiveDataOnly( &t,sizeof(t)); thisDetector->currentSettings=t; - if(thisDetector->myDetectorType!= GOTTHARD){ + if((thisDetector->myDetectorType!= GOTTHARD)&&(thisDetector->myDetectorType!= MOENCH)){ //thr=getThresholdEnergy(); n = controlSocket->ReceiveDataOnly( &thr,sizeof(thr)); thisDetector->currentThresholdEV=thr; @@ -2960,7 +2989,7 @@ int slsDetector::updateDetectorNoWait() { thisDetector->timerValue[GATES_NUMBER]=retval; //retval=setProbes(tns); - if(thisDetector->myDetectorType!= GOTTHARD){ + if((thisDetector->myDetectorType!= GOTTHARD)&&(thisDetector->myDetectorType!= MOENCH)){ n = controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); thisDetector->timerValue[PROBES_NUMBER]=retval; } @@ -3401,7 +3430,7 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t){ //std::cout<< "offline " << std::endl; if (t>=0) thisDetector->timerValue[index]=t; - if(thisDetector->myDetectorType==GOTTHARD) + if((thisDetector->myDetectorType==GOTTHARD)||(thisDetector->myDetectorType==MOENCH)) thisDetector->timerValue[PROBES_NUMBER]=0; } } else { @@ -4941,8 +4970,8 @@ int slsDetector::configureMAC(){ std::cout<< "Configuring MAC failed " << std::endl; setErrorMask((getErrorMask())|(COULD_NOT_CONFIGURE_MAC)); } - else{ - //set frames per file + else if (thisDetector->myDetectorType==GOTTHARD){ + //set frames per file - only for gotthard if(retval==-1) setFramesPerFile(MAX_FRAMES_PER_FILE); else @@ -5317,7 +5346,7 @@ int slsDetector::writeConfigurationFile(ofstream &outfile, int id){ // "trimen", // "receiverTCPPort", - if (thisDetector->myDetectorType==GOTTHARD) { + if ((thisDetector->myDetectorType==GOTTHARD)||(thisDetector->myDetectorType==MOENCH)) { names[0]= "hostname"; names[1]= "port"; names[2]= "stopport"; @@ -5417,8 +5446,8 @@ int slsDetector::loadSettingsFile(string fname, int imod) { myMod=readSettingsFile(fn, thisDetector->myDetectorType); if (myMod) { myMod->module=im; - //settings is saved in myMod.reg for gotthard - if(thisDetector->myDetectorType==GOTTHARD) + //settings is saved in myMod.reg for gotthard or moench + if((thisDetector->myDetectorType==GOTTHARD)||(thisDetector->myDetectorType==MOENCH)) myMod->reg=thisDetector->currentSettings; setModule(*myMod); deleteModule(myMod); diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index d4a8886c2..c8bf9d852 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -307,7 +307,7 @@ class slsDetector : public slsDetectorUtils, public energyConversion { static int exists(int id); /** - configures mac for gotthard readout + configures mac for gotthard, moench readout \returns OK or FAIL */ int configureMAC(); @@ -611,22 +611,22 @@ class slsDetector : public slsDetectorUtils, public energyConversion { sets/gets detector type normally the detector knows what type of detector it is \param type is the detector type (defaults to GET_DETECTOR_TYPE) - \returns returns detector type index (1 GENERIC, 2 MYTHEN, 3 PILATUS, 4 XFS, 5 GOTTHARD, 6 AGIPD, -1 command failed) + \returns returns detector type index (1 GENERIC, 2 MYTHEN, 3 PILATUS, 4 XFS, 5 GOTTHARD, 6 AGIPD, 7 MOENCH, -1 command failed) */ int setDetectorType(detectorType type=GET_DETECTOR_TYPE); /** sets/gets detector type normally the detector knows what type of detector it is - \param type is the detector type ("Mythen", "Pilatus", "XFS", "Gotthard", Agipd") - \returns returns detector type index (1 GENERIC, 2 MYTHEN, 3 PILATUS, 4 XFS, 5 GOTTHARD, 6 AGIPD, -1 command failed) + \param type is the detector type ("Mythen", "Pilatus", "XFS", "Gotthard", Agipd", "Mönch") + \returns returns detector type index (1 GENERIC, 2 MYTHEN, 3 PILATUS, 4 XFS, 5 GOTTHARD, 6 AGIPD, 7 MOENCH, -1 command failed) */ int setDetectorType(string type); /** gets detector type normally the detector knows what type of detector it is - \returns returns detector type index (1 GENERIC, 2 MYTHEN, 3 PILATUS, 4 XFS, 5 GOTTHARD, 6 AGIPD, -1 command failed) + \returns returns detector type index (1 GENERIC, 2 MYTHEN, 3 PILATUS, 4 XFS, 5 GOTTHARD, 6 AGIPD, 7 MOENCH,-1 command failed) */ detectorType getDetectorsType(int pos=-1); diff --git a/slsDetectorSoftware/slsDetector/slsDetectorBase.h b/slsDetectorSoftware/slsDetector/slsDetectorBase.h index 7fc1badde..74a4e76a6 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorBase.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorBase.h @@ -486,7 +486,7 @@ class slsDetectorBase : public virtual slsDetectorDefs, public virtual errorDef case EIGER: return string("Eiger"); \ case GOTTHARD: return string("Gotthard"); \ case AGIPD: return string("Agipd"); \ - case MOENCH: return string("Mönch"); \ + case MOENCH: return string("Moench"); \ default: return string("Unknown"); \ }}; @@ -500,7 +500,7 @@ class slsDetectorBase : public virtual slsDetectorDefs, public virtual errorDef if (type=="Eiger") return EIGER; \ if (type=="Gotthard") return GOTTHARD; \ if (type=="Agipd") return AGIPD; \ - if (type=="Mönch") return MOENCH; \ + if (type=="Moench") return MOENCH; \ return GENERIC;}; diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp b/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp index c3b564e7f..1269cda76 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp @@ -310,7 +310,7 @@ void slsDetectorUtils::acquire(int delflag){ usleep(100000); } - if (getDetectorsType()==GOTTHARD){ + if ((getDetectorsType()==GOTTHARD) || (getDetectorsType()==MOENCH)){ if((*correctionMask)&(1<0) nc=timerValue[CYCLES_NUMBER]; diff --git a/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.cpp b/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.cpp index ae8ab41db..f6f7cd061 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.cpp +++ b/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.cpp @@ -200,7 +200,7 @@ slsDetectorDefs::sls_detector_module* energyConversion::readSettingsFile(string break; - + case MOENCH: case GOTTHARD: //---------------dacs--------------- for (int iarg=0; iargndac; iarg++) { @@ -262,6 +262,7 @@ int energyConversion::writeSettingsFile(string fname, detectorType myDetectorTyp names[id++]="Vcal"; names[id++]="outBuffEnable"; break; + case MOENCH: case GOTTHARD: names[id++]="Vref"; names[id++]="VcascN"; @@ -288,7 +289,7 @@ int energyConversion::writeSettingsFile(string fname, detectorType myDetectorTyp outfile << names[idac] << " " << iv << std::endl; } - if(myDetectorType!=GOTTHARD){ + if((myDetectorType!=GOTTHARD)&&(myDetectorType!=MOENCH)){ for (ichip=0; ichip0)) ******Not implemented yet ******** * else */ @@ -409,7 +410,7 @@ void* postProcessing::processData(int delflag) { int caught=0; bool newData=false; - char currentfName[MAX_STR_LENGTH]; + char currentfName[MAX_STR_LENGTH]=""; int currentfIndex=0; while(1){ cout.flush(); diff --git a/slsDetectorSoftware/slsReceiver/Makefile b/slsDetectorSoftware/slsReceiver/Makefile index fa3669d29..5d3a52641 100644 --- a/slsDetectorSoftware/slsReceiver/Makefile +++ b/slsDetectorSoftware/slsReceiver/Makefile @@ -1,5 +1,5 @@ CC = g++ -CLAGS += -DSLS_RECEIVER_FUNCTION_LIST -DGOTTHARDD #-DUHRIXCALLBACK #-DTESTWRITE +CLAGS += -DSLS_RECEIVER_FUNCTION_LIST #-DUHRIXCALLBACK #-DTESTWRITE LDFLAG= -L/usr/lib64/ -lpthread -lm -lstdc++ diff --git a/slsDetectorSoftware/slsReceiver/receiver_defs.h b/slsDetectorSoftware/slsReceiver/receiver_defs.h index a2965dc91..e4c9b1d71 100755 --- a/slsDetectorSoftware/slsReceiver/receiver_defs.h +++ b/slsDetectorSoftware/slsReceiver/receiver_defs.h @@ -5,20 +5,32 @@ #include -#define GOODBYE -200 +#define GOODBYE -200 -#define BUFFER_SIZE 1286*2 -#define DATA_BYTES 2560 -#define MAX_FRAMES 20000 -#define PACKETS_PER_FRAME 2 +//all max frames defined in sls_detector_defs.h. 20000 gotthard, 100000 for short gotthard, 1000 for moench + +#define GOTTHARD_FIFO_SIZE 25000 + +#define GOTTHARD_PACKETS_PER_FRAME 2 +#define GOTTHARD_BUFFER_SIZE 1286*GOTTHARD_PACKETS_PER_FRAME +#define GOTTHARD_DATA_BYTES 1280*GOTTHARD_PACKETS_PER_FRAME + + +#define GOTTHARD_SHORT_PACKETS_PER_FRAME 1 +#define GOTTHARD_SHORT_BUFFER_SIZE 518 +#define GOTTHARD_SHORT_DATABYTES 512 + + + + +#define MOENCH_FIFO_SIZE 25000 + +#define MOENCH_PACKETS_PER_FRAME 40 +#define MOENCH_BUFFER_SIZE 1286*MOENCH_PACKETS_PER_FRAME +#define MOENCH_DATA_BYTES 1280*MOENCH_PACKETS_PER_FRAME -#define SHORT_BUFFER_SIZE 518 -#define SHORT_DATABYTES 512 -#define SHORT_MAX_FRAMES 100000 -#define SHORT_PACKETS_PER_FRAME 1 -#define FIFO_SIZE 25000 //#define THIS_SOFTWARE_VERSION 0x20120919 #endif diff --git a/slsDetectorSoftware/slsReceiver/slsReceiverFunctionList.cpp b/slsDetectorSoftware/slsReceiver/slsReceiverFunctionList.cpp index fc04de280..1292797da 100644 --- a/slsDetectorSoftware/slsReceiver/slsReceiverFunctionList.cpp +++ b/slsDetectorSoftware/slsReceiver/slsReceiverFunctionList.cpp @@ -31,8 +31,9 @@ using namespace std; FILE* slsReceiverFunctionList::sfilefd(NULL); int slsReceiverFunctionList::listening_thread_running(0); -slsReceiverFunctionList::slsReceiverFunctionList(): - maxFramesPerFile(MAX_FRAMES), +slsReceiverFunctionList::slsReceiverFunctionList(detectorType det): + myDetectorType(det), + maxFramesPerFile(MAX_FRAMES_PER_FILE), enableFileWrite(1), fileIndex(0), frameIndexNeeded(0), @@ -45,13 +46,13 @@ slsReceiverFunctionList::slsReceiverFunctionList(): framesInFile(0), prevframenum(0), status(IDLE), - latestData(NULL),/**?*/ + latestData(NULL), udpSocket(NULL), server_port(DEFAULT_UDP_PORTNO), fifo(NULL), shortFrame(-1), - bufferSize(BUFFER_SIZE), - packetsPerFrame(2), + bufferSize(GOTTHARD_BUFFER_SIZE), + packetsPerFrame(GOTTHARD_PACKETS_PER_FRAME), guiDataReady(0), guiData(NULL), guiFileName(NULL), @@ -67,6 +68,12 @@ slsReceiverFunctionList::slsReceiverFunctionList(): pRawDataReady(NULL) { + if(myDetectorType == MOENCH){ + maxFramesPerFile = MOENCH_MAX_FRAMES_PER_FILE; + bufferSize = MOENCH_BUFFER_SIZE; + packetsPerFrame = MOENCH_PACKETS_PER_FRAME; + } + strcpy(savefilename,""); strcpy(filePath,""); strcpy(fileName,"run"); @@ -75,16 +82,16 @@ slsReceiverFunctionList::slsReceiverFunctionList(): strcpy(eth,""); latestData = new char[bufferSize]; - fifofree = new CircularFifo(); - fifo = new CircularFifo(); + fifofree = new CircularFifo();/**MOENCH SAME FIFO SIZE FOR NOW,ELSE MEMBER DECLARATION ERROR*/ + fifo = new CircularFifo(); - mem0=(char*)malloc(4096*FIFO_SIZE); + mem0=(char*)malloc(4096*GOTTHARD_FIFO_SIZE); if (mem0==NULL) { cout<<"++++++++++++++++++++++ COULD NOT ALLOCATE MEMORY!!!!!!!+++++++++++++++++++++" << endl; } buffer=mem0; - while (buffer<(mem0+4096*(FIFO_SIZE-1))) { + while (buffer<(mem0+4096*(GOTTHARD_FIFO_SIZE-1))) { fifofree->push(buffer); buffer+=4096; } @@ -329,7 +336,7 @@ int slsReceiverFunctionList::startListening(){ if (!fifofree->isEmpty()) { fifofree->pop(buffer); - //receiver 2 half frames + //receiver 2 half frames / 1 short frame / 40 moench frames rc = udpSocket->ReceiveDataOnly(buffer,bufferSize);//sizeof(buffer)); if( rc < 0) cerr << "recvfrom() failed" << endl; @@ -477,7 +484,7 @@ int slsReceiverFunctionList::startWriting(){ if(fifo->pop(wbuf)){ framesCaught++; totalFramesCaught++; - currframenum = (int)(*((int*)wbuf)); + currframenum = (int)(*((int*)wbuf));//cout<<"curreframenm:"<* fifo; - CircularFifo* fifo; + CircularFifo* fifo; /** circular fifo to read and write data*/ - CircularFifo* fifofree; + CircularFifo* fifofree; /** short frames */ int shortFrame; diff --git a/slsDetectorSoftware/slsReceiver/slsReceiver_funcs.cpp b/slsDetectorSoftware/slsReceiver/slsReceiver_funcs.cpp index dd12b8072..642c1cb45 100644 --- a/slsDetectorSoftware/slsReceiver/slsReceiver_funcs.cpp +++ b/slsDetectorSoftware/slsReceiver/slsReceiver_funcs.cpp @@ -15,7 +15,6 @@ using namespace std; - int slsReceiverFuncs::file_des(-1); int slsReceiverFuncs::socketDescriptor(-1); @@ -30,11 +29,12 @@ slsReceiverFuncs::~slsReceiverFuncs() { slsReceiverFuncs::slsReceiverFuncs(int argc, char *argv[], int &success): + myDetectorType(GOTTHARD), socket(NULL), ret(OK), lockStatus(0), shortFrame(-1), - packetsPerFrame(PACKETS_PER_FRAME){ + packetsPerFrame(GOTTHARD_PACKETS_PER_FRAME){ int port_no = DEFAULT_PORTNO+2; ifstream infile; @@ -49,51 +49,88 @@ slsReceiverFuncs::slsReceiverFuncs(int argc, char *argv[], int &success): if((!strcasecmp(argv[iarg],"-config"))||(!strcasecmp(argv[iarg],"-f"))){ if(iarg+1==argc){ cout << "no config file name given. Exiting." << endl; - success=slsDetectorDefs::FAIL; + success=FAIL; + }else + fname.assign(argv[iarg+1]); + } + if(!strcasecmp(argv[iarg],"-type")){ + if(iarg+1==argc){ + cout << "no detector type given after -type in command line. Exiting." << endl; + success=FAIL; + }else{ + if(!strcasecmp(argv[iarg+1],"gotthard")); + else if(!strcasecmp(argv[iarg+1],"moench")) + slsReceiverFuncs::myDetectorType = MOENCH; + else{ + cout << "could not decode detector type in command line. Exiting." << endl; + success=FAIL; + } } - fname.assign(argv[iarg+1]); } } - if(!fname.empty()){ + if((!fname.empty()) && (success == OK)){ #ifdef VERBOSE std::cout<< "config file name "<< fname << std::endl; #endif infile.open(fname.c_str(), ios_base::in); if (infile.is_open()) { - while(infile.good()){ - getline(infile,sLine); - iline++; + while(infile.good()){ + getline(infile,sLine); + iline++; #ifdef VERBOSE - cout << str << endl; + cout << str << endl; #endif - if(sLine.find('#')!=string::npos){ + if(sLine.find('#')!=string::npos){ #ifdef VERBOSE - cout << "Line is a comment " << endl; + cout << "Line is a comment " << endl; #endif - continue; - }else if(sLine.length()<2){ + continue; + }else if(sLine.length()<2){ #ifdef VERBOSE - cout << "Empty line " << endl; + cout << "Empty line " << endl; #endif - continue; - }else{ - istringstream sstr(sLine); + continue; + }else{ + istringstream sstr(sLine); - //parameter name - if(sstr.good()) - sstr >> sargname; + //parameter name + if(sstr.good()) + sstr >> sargname; - //value - if(sargname=="rx_tcpport"){ - if(sstr.good()) { - sstr >> sargname; - sscanf(sargname.c_str(),"%d",&port_no); - cout<<"dataport:"<> sargname; + if(sscanf(sargname.c_str(),"%d",&port_no)) + cout<<"dataport:"<> sargname; + if(!strcasecmp(sargname.c_str(),"gotthard")) + slsReceiverFuncs::myDetectorType = GOTTHARD; + else if(!strcasecmp(sargname.c_str(),"moench")) + slsReceiverFuncs::myDetectorType = MOENCH; + else{ + cout << "could not decode detector type in config file. Exiting." << endl; + success=FAIL; + } + } + } + + + + } + } infile.close(); }else { cout << "Error opening configuration file " << fname << endl; @@ -119,7 +156,7 @@ slsReceiverFuncs::slsReceiverFuncs(int argc, char *argv[], int &success): strcpy(mess,"dummy message"); function_table(); - slsReceiverList = new slsReceiverFunctionList(); + slsReceiverList = new slsReceiverFunctionList(myDetectorType); #ifdef VERBOSE cout << "Function table assigned." << endl; @@ -131,6 +168,12 @@ slsReceiverFuncs::slsReceiverFuncs(int argc, char *argv[], int &success): //success = OK; } } + + switch(myDetectorType){ + case GOTTHARD: cout << "This is a GOTTHARD Receiver" << endl; break; + case MOENCH: cout << "This is a MOENCH Receiver" << endl; break; + default: cout << "Unknown Receiver" << endl;success=FAIL;break; + } } void slsReceiverFuncs::start(){ @@ -755,26 +798,210 @@ int slsReceiverFuncs::reset_frames_caught(){ } + + + + +int slsReceiverFuncs::set_short_frame() { + ret=OK; + int index=0; + int retval=-100; + strcpy(mess,"Could not set/reset short frame for receiver\n"); + + //does not exist for moench + if(myDetectorType==MOENCH){ + strcpy(mess,"can not set short frame for moench\n"); + ret = FAIL; + } + + // receive arguments + if(socket->ReceiveDataOnly(&index,sizeof(index)) < 0 ){ + strcpy(mess,"Error reading from socket\n"); + ret = FAIL; + } + + + // execute action if the arguments correctly arrived +#ifdef SLS_RECEIVER_FUNCTION_LIST + if (ret==OK) { + if (lockStatus==1 && socket->differentClients==1){//necessary??? + sprintf(mess,"Receiver locked by %s\n", socket->lastClientIP); + ret=FAIL; + } + else if(slsReceiverList->getStatus()==RUNNING){ + strcpy(mess,"Cannot set short frame while status is running\n"); + ret=FAIL; + } + else{ + retval=slsReceiverList->setShortFrame(index); + shortFrame = retval; + if(shortFrame==-1) + packetsPerFrame=GOTTHARD_PACKETS_PER_FRAME; + else + packetsPerFrame=GOTTHARD_SHORT_PACKETS_PER_FRAME; + } + } +#endif + + if(ret==OK && socket->differentClients){ + cout << "Force update" << endl; + ret=FORCE_UPDATE; + } + + // send answer + socket->SendDataOnly(&ret,sizeof(ret)); + if(ret==FAIL) + socket->SendDataOnly(mess,sizeof(mess)); + socket->SendDataOnly(&retval,sizeof(retval)); + + //return ok/fail + return ret; +} + + + + int slsReceiverFuncs::read_frame(){ + switch(myDetectorType){ + case MOENCH: + return moench_read_frame(); + default: + return gotthard_read_frame(); + } +} + + + +int slsReceiverFuncs::moench_read_frame(){ ret=OK; char fName[MAX_STR_LENGTH]=""; int arg = -1,i; + + int bufferSize = MOENCH_BUFFER_SIZE; + char* raw = new char[bufferSize]; + + int rnel = bufferSize/(sizeof(int)); + int* retval = new int[rnel]; + int* origVal = new int[rnel]; + + //all initialized to 0 + for(i=0;igetStartFrameIndex(); + if(startIndex!=-1){ + ret=OK; + break; + }else + usleep(500000); + } + + + if(ret==FAIL) + cout<<"failed to start"<readFrame(fName,&raw); + if (raw == NULL){ + index = startIndex; + cout << "didnt get data. Gui will try again" << endl; + + for(i=0;idifferentClients){ + cout << "Force update" << endl; + ret=FORCE_UPDATE; + } + + // send answer + socket->SendDataOnly(&ret,sizeof(ret)); + if(ret==FAIL){ + cout << "mess:" << mess << endl; + socket->SendDataOnly(mess,sizeof(mess)); + } + else{ + socket->SendDataOnly(fName,MAX_STR_LENGTH); + socket->SendDataOnly(&arg,sizeof(arg)); + socket->SendDataOnly(retval,MOENCH_DATA_BYTES); + } + //return ok/fail + +/* ///ADDED BY ANNA?!?!?!? //?????????FOR GOTTHARD AS WELL????? + if(retval) delete [] retval; + if(origVal) delete [] origVal; +*/ + return ret; + +} + + + + +int slsReceiverFuncs::gotthard_read_frame(){ + ret=OK; + char fName[MAX_STR_LENGTH]=""; + int arg = -1,i; + + //retval is a full frame - int rnel = BUFFER_SIZE/(sizeof(int)); + int rnel = GOTTHARD_BUFFER_SIZE/(sizeof(int)); int* retval = new int[rnel]; //all initialized to 0 for(i=0;iSendDataOnly(fName,MAX_STR_LENGTH); socket->SendDataOnly(&arg,sizeof(arg)); - socket->SendDataOnly(retval,DATA_BYTES); + socket->SendDataOnly(retval,GOTTHARD_DATA_BYTES); } //return ok/fail @@ -1045,59 +1272,6 @@ int slsReceiverFuncs::get_version(){ -int slsReceiverFuncs::set_short_frame() { - ret=OK; - int index=0; - int retval=-100; - strcpy(mess,"Could not set/reset short frame for receiver\n"); - - - // receive arguments - if(socket->ReceiveDataOnly(&index,sizeof(index)) < 0 ){ - strcpy(mess,"Error reading from socket\n"); - ret = FAIL; - } - - // execute action if the arguments correctly arrived -#ifdef SLS_RECEIVER_FUNCTION_LIST - if (ret==OK) { - if (lockStatus==1 && socket->differentClients==1){//necessary??? - sprintf(mess,"Receiver locked by %s\n", socket->lastClientIP); - ret=FAIL; - } - else if(slsReceiverList->getStatus()==RUNNING){ - strcpy(mess,"Cannot set short frame while status is running\n"); - ret=FAIL; - } - else{ - retval=slsReceiverList->setShortFrame(index); - shortFrame = retval; - if(shortFrame==-1) - packetsPerFrame=PACKETS_PER_FRAME; - else - packetsPerFrame=SHORT_PACKETS_PER_FRAME; - } - } -#endif - - if(ret==OK && socket->differentClients){ - cout << "Force update" << endl; - ret=FORCE_UPDATE; - } - - // send answer - socket->SendDataOnly(&ret,sizeof(ret)); - if(ret==FAIL) - socket->SendDataOnly(mess,sizeof(mess)); - socket->SendDataOnly(&retval,sizeof(retval)); - - //return ok/fail - return ret; -} - - - - diff --git a/slsDetectorSoftware/slsReceiver/slsReceiver_funcs.h b/slsDetectorSoftware/slsReceiver/slsReceiver_funcs.h index 78fec20a0..cf4a7cf8b 100644 --- a/slsDetectorSoftware/slsReceiver/slsReceiver_funcs.h +++ b/slsDetectorSoftware/slsReceiver/slsReceiver_funcs.h @@ -121,9 +121,18 @@ public: /** Resets Total Frames Caught */ int reset_frames_caught(); + /** set short frame */ + int set_short_frame(); + /** Reads Frame/ buffer */ int read_frame(); + /** gotthard specific read frame */ + int gotthard_read_frame(); + + /** moench specific read frame */ + int moench_read_frame(); + /** Sets the receiver to send every nth frame to gui, or only upon gui request */ int set_read_frequency(); @@ -136,8 +145,6 @@ public: /** Get Version */ int get_version(); - /** set short frame */ - int set_short_frame(); //General Functions /** Locks Receiver */ @@ -161,7 +168,12 @@ public: /** Execute command */ int exec_command(); + + //private: + /** detector type */ + detectorType myDetectorType; + /** slsReceiverFunctionList object */ slsReceiverFunctionList *slsReceiverList;