diff --git a/slsDetectorSoftware/Makefile b/slsDetectorSoftware/Makefile index eee7e1138..18cf05587 100644 --- a/slsDetectorSoftware/Makefile +++ b/slsDetectorSoftware/Makefile @@ -3,13 +3,12 @@ CFLAGS= -DC_ONLY -fPIC DFLAGS= -DDACS_INT -INCLUDES= -IcommonFiles -IslsDetector -IMySocketTCP -IusersFunctions -ImultiSlsDetector -IslsDetectorUtils -IslsDetectorCommand -IslsDetectorAnalysis - +INCLUDES= -IcommonFiles -IslsDetector -IMySocketTCP -IusersFunctions -ImultiSlsDetector -IslsDetectorUtils -IslsDetectorCommand -IslsDetectorAnalysis -IslsReceiverInterface #EPICSFLAGS=-D EPICS -I/usr/local/epics/base/include/ -I /usr/local/epics/base/include/os/Linux/ -L /usr/local/epics/base/lib/SL5-x86/ -Wl,-R/usr/local/epics/base/lib/SL5-x86 -lca -lCom CC=g++ -SRC_CLNT= slsDetectorAnalysis/fileIO.cpp MySocketTCP/MySocketTCP.cpp usersFunctions/usersFunctions.cpp slsDetector/slsDetectorUtils.cpp slsDetector/slsDetectorCommand.cpp slsDetectorAnalysis/angularConversion.cpp slsDetectorAnalysis/angularConversionStatic.cpp slsDetectorAnalysis/energyConversion.cpp slsDetector/slsDetectorActions.cpp slsDetectorAnalysis/postProcessing.cpp slsDetector/slsDetector.cpp multiSlsDetector/multiSlsDetector.cpp slsDetector/slsDetectorUsers.cpp slsDetectorAnalysis/postProcessingFuncs.cpp +SRC_CLNT= slsDetectorAnalysis/fileIO.cpp MySocketTCP/MySocketTCP.cpp usersFunctions/usersFunctions.cpp slsDetector/slsDetectorUtils.cpp slsDetector/slsDetectorCommand.cpp slsDetectorAnalysis/angularConversion.cpp slsDetectorAnalysis/angularConversionStatic.cpp slsDetectorAnalysis/energyConversion.cpp slsDetector/slsDetectorActions.cpp slsDetectorAnalysis/postProcessing.cpp slsDetector/slsDetector.cpp multiSlsDetector/multiSlsDetector.cpp slsDetector/slsDetectorUsers.cpp slsDetectorAnalysis/postProcessingFuncs.cpp slsReceiverInterface/receiverInterface.cpp OBJS = $(SRC_CLNT:.cpp=.o) diff --git a/slsDetectorSoftware/commonFiles/communication_funcs.c b/slsDetectorSoftware/commonFiles/communication_funcs.c index 18fa431dd..6de2c35d4 100755 --- a/slsDetectorSoftware/commonFiles/communication_funcs.c +++ b/slsDetectorSoftware/commonFiles/communication_funcs.c @@ -354,7 +354,7 @@ int sendModule(int file_des, sls_detector_module *myMod) { #ifdef VERBOSE printf("dacs %d of size %d sent\n",myMod->module, ts); for (idac=0; idac< nDacs; idac++) - printf("dac %d is %d\n",idac,myMod->dacs[idac]); + printf("dac %d is %d\n",idac,(int)myMod->dacs[idac]); #endif ts+= sendDataOnly(file_des,myMod->adcs,sizeof(dacs_t)*nAdcs); #ifdef VERBOSE @@ -482,7 +482,7 @@ int receiveModule(int file_des, sls_detector_module* myMod) { #ifdef VERBOSE printf("dacs received\n"); for (id=0; iddacs[id]); + printf("dac %d val %d\n",id, (int)myMod->dacs[id]); #endif diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index ac15b8173..6c47956b7 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -123,7 +123,8 @@ slsDetector::slsDetector(int id,multiSlsDetector *p) :slsDetectorUtils(), dacs(NULL), adcs(NULL), chipregs(NULL), - chanregs(NULL) + chanregs(NULL), + thisReceiver(NULL) { @@ -172,7 +173,8 @@ slsDetector::slsDetector(detectorType type, int id,multiSlsDetector *p): slsDete dacs(NULL), adcs(NULL), chipregs(NULL), - chanregs(NULL) + chanregs(NULL), + thisReceiver(NULL) { while (shmId<0) { /**Initlializes shared memory \sa initSharedMemory @@ -224,7 +226,8 @@ slsDetector::slsDetector(char *name, int id, int cport,multiSlsDetector *p) : sl dacs(NULL), adcs(NULL), chipregs(NULL), - chanregs(NULL) + chanregs(NULL), + thisReceiver(NULL) { detectorType type=(detectorType)getDetectorType(name, cport); @@ -672,6 +675,7 @@ int slsDetector::initializeDetectorSize(detectorType type) { fileName=parentDet->fileName; fileIndex=parentDet->fileIndex; + thisReceiver = new receiverInterface(dataSocket); // setAngularConversionPointer(thisDetector->angOff,&thisDetector->nMods, thisDetector->nChans*thisDetector->nChips); @@ -5284,18 +5288,21 @@ slsDetectorDefs::synchronizationMode slsDetector::setSynchronization(synchroniza /*receiver*/ int slsDetector::setReceiverOnline(int off) { - if (off!=GET_ONLINE_FLAG) { - if(strcmp(thisDetector->receiverIP,"none")){ - thisDetector->receiverOnlineFlag=off; - if (thisDetector->receiverOnlineFlag==ONLINE_FLAG) - setReceiverTCPSocket(); - } - //Since flag becomes offline if receiver not online. - //This ensures server to NOT send to receiver in the next command line comment - if((off==ONLINE_FLAG)&&(thisDetector->receiverOnlineFlag!=ONLINE_FLAG)) - DetectorStopReceiver(); - } - return thisDetector->receiverOnlineFlag; + int prev = thisDetector->receiverOnlineFlag; + if (off!=GET_ONLINE_FLAG) { + if(strcmp(thisDetector->receiverIP,"none")){ + thisDetector->receiverOnlineFlag=off; + if (thisDetector->receiverOnlineFlag==ONLINE_FLAG){ + setReceiverTCPSocket(); + if(thisDetector->receiverOnlineFlag==OFFLINE_FLAG) + std::cout << "cannot connect to receiver" << endl; + } + } + } + //To ensure detector knows, if receiver suddenly went down + if((prev==ONLINE_FLAG)&&(thisDetector->receiverOnlineFlag==OFFLINE_FLAG)) + detectorSendToReceiver(false); + return thisDetector->receiverOnlineFlag; } @@ -5336,14 +5343,7 @@ string slsDetector::checkReceiverOnline() { -/* - configure the socket communication and check that the receiver exists - enum communicationProtocol{ - TCP, - UDP - }{}; -*/ int slsDetector::setReceiverTCPSocket(string const name, int const data_port){ @@ -5405,6 +5405,7 @@ int slsDetector::setReceiverTCPSocket(string const name, int const data_port){ std::cout<< "offline!" << std::endl; #endif } + thisReceiver->setSocket(dataSocket); return retval; }; @@ -5414,11 +5415,10 @@ int slsDetector::setReceiverTCPSocket(string const name, int const data_port){ string slsDetector::setFilePath(string s) { - int fnum=F_SET_FILE_PATH; + int fnum = F_SET_FILE_PATH; int ret = FAIL; - char mess[100]; char arg[MAX_STR_LENGTH]; - char retval[MAX_STR_LENGTH]=""; + char retval[MAX_STR_LENGTH] = ""; struct stat st; if(thisDetector->receiverOnlineFlag==OFFLINE_FLAG){ @@ -5430,30 +5430,17 @@ string slsDetector::setFilePath(string s) { } } - else if(setReceiverOnline(ONLINE_FLAG)==ONLINE_FLAG){ strcpy(arg,s.c_str()); #ifdef VERBOSE std::cout << "Sending file path to receiver " << arg << std::endl; #endif - if (dataSocket) { - if (dataSocket->Connect()>=0) { - dataSocket->SendDataOnly(&fnum,sizeof(fnum)); - dataSocket->SendDataOnly(arg,MAX_STR_LENGTH); - dataSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret==FAIL){ - dataSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Receiver returned error: " << mess << std::endl; - } - dataSocket->ReceiveDataOnly(retval,MAX_STR_LENGTH); - fileIO::setFilePath(s); - } - dataSocket->Disconnect(); - if (ret==FORCE_UPDATE) - updateReceiver(); - } - }else - std::cout << "cannot connect to receiver" << endl; + ret=thisReceiver->sendString(fnum,retval,arg); + if(ret!=FAIL) + fileIO::setFilePath(string(retval)); + if(ret==FORCE_UPDATE) + updateReceiver(); + } return fileIO::getFilePath(); } @@ -5463,7 +5450,6 @@ string slsDetector::setFilePath(string s) { string slsDetector::setFileName(string s) { int fnum=F_SET_FILE_NAME; int ret = FAIL; - char mess[100]; char arg[MAX_STR_LENGTH]; char retval[MAX_STR_LENGTH]=""; @@ -5474,33 +5460,21 @@ string slsDetector::setFileName(string s) { } if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ - if(setReceiverOnline(ONLINE_FLAG)!=ONLINE_FLAG){ + if(setReceiverOnline(ONLINE_FLAG)==ONLINE_FLAG){ strcpy(arg,s.c_str()); #ifdef VERBOSE std::cout << "Sending file name to receiver " << arg << std::endl; #endif - if (dataSocket) { - if (dataSocket->Connect()>=0) { - dataSocket->SendDataOnly(&fnum,sizeof(fnum)); - dataSocket->SendDataOnly(arg,MAX_STR_LENGTH); - dataSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret==FAIL){ - dataSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Receiver returned error: " << mess << std::endl; - } - dataSocket->ReceiveDataOnly(retval,MAX_STR_LENGTH); + ret=thisReceiver->sendString(fnum,retval,arg); + if(ret!=FAIL){ #ifdef VERBOSE - std::cout << "Complete file prefix from receiver: " << retval << std::endl; + std::cout << "Complete file prefix from receiver: " << retval << std::endl; #endif - fileIO::setFileName(parentDet->getNameFromReceiverFilePrefix(string(retval))); - } - dataSocket->Disconnect(); - if (ret==FORCE_UPDATE) - updateReceiver(); + fileIO::setFileName(parentDet->getNameFromReceiverFilePrefix(string(retval))); } - - }else - std::cout << "cannot connect to receiver" << endl; + if(ret==FORCE_UPDATE) + updateReceiver(); + } } return fileIO::getFileName(); @@ -5510,46 +5484,27 @@ string slsDetector::setFileName(string s) { - - - - int slsDetector::setFileIndex(int i) { int fnum=F_SET_FILE_INDEX; int ret = FAIL; int retval=-1; int arg = i; - char mess[100]; if(thisDetector->receiverOnlineFlag==OFFLINE_FLAG){ if(i>=0) fileIO::setFileIndex(i); } - else if(setReceiverOnline(ONLINE_FLAG)==ONLINE_FLAG){ #ifdef VERBOSE - std::cout << "Sending file dir to receiver " << arg << std::endl; + std::cout << "Sending file index to receiver " << arg << std::endl; #endif - if (dataSocket) { - if (dataSocket->Connect()>=0) { - dataSocket->SendDataOnly(&fnum,sizeof(fnum)); - dataSocket->SendDataOnly(&arg,sizeof(arg)); - dataSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret==FAIL){ - dataSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Receiver returned error: " << mess << std::endl; - } - dataSocket->ReceiveDataOnly(&retval,sizeof(retval)); - fileIO::setFileIndex(retval); - } - dataSocket->Disconnect(); - if (ret==FORCE_UPDATE) - updateReceiver(); - } - - }else - std::cout << "cannot connect to receiver" << endl; + ret=thisReceiver->sendInt(fnum,retval,arg); + if(ret!=FAIL) + fileIO::setFileIndex(retval); + if(ret==FORCE_UPDATE) + updateReceiver(); + } return fileIO::getFileIndex(); } @@ -5560,55 +5515,49 @@ int slsDetector::setFileIndex(int i) { int slsDetector::startReceiver(){ int fnum=F_START_RECEIVER; int ret = FAIL; - char mess[100]; - if (setReceiverOnline(ONLINE_FLAG)==ONLINE_FLAG) { #ifdef VERBOSE std::cout << "Starting Receiver " << std::endl; #endif - if (dataSocket) { - if (dataSocket->Connect()>=0) { - dataSocket->SendDataOnly(&fnum,sizeof(fnum)); - dataSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret==FAIL){ - dataSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Receiver returned error: " << mess << std::endl; - } - dataSocket->Disconnect(); - if (ret==FORCE_UPDATE) - ret=updateReceiver(); - } - } - }else - std::cout << "cannot connect to receiver" << endl; - + ret=thisReceiver->executeFunction(fnum); + if(ret==FORCE_UPDATE) + ret=updateReceiver(); + } //configuremac for gotthard if(ret==OK) if(thisDetector->myDetectorType==GOTTHARD) ret=configureMAC(); - if(ret==OK){ - if (thisDetector->onlineFlag==ONLINE_FLAG) { + if(ret==OK) + ret=detectorSendToReceiver(true); + + return ret; +} + + + + +int slsDetector::stopReceiver(){ + int fnum=F_STOP_RECEIVER; + int ret = FAIL; + + detectorSendToReceiver(false); + + if (setReceiverOnline(ONLINE_FLAG)==ONLINE_FLAG) { #ifdef VERBOSE - std::cout << "Setting detector to send packets via receiver " << std::endl; + std::cout << "Stopping Receiver " << std::endl; #endif - if (controlSocket) { - if (controlSocket->Connect()>=0) { - controlSocket->SendDataOnly(&fnum,sizeof(fnum)); - controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret==FAIL){ - controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; - } - controlSocket->Disconnect(); - if (ret==FORCE_UPDATE) - ret=updateDetector(); - } - } - }else - std::cout << "cannot connect to detector" << endl; + ret=thisReceiver->executeFunction(fnum); + if(ret==FORCE_UPDATE) + ret=updateReceiver(); + } + + //increment file index + if(ret==OK){ + fileIO::setFileIndex(fileIO::getFileIndex()+1); + setFileIndex(fileIO::getFileIndex()); } return ret; @@ -5616,10 +5565,13 @@ int slsDetector::startReceiver(){ -int slsDetector::DetectorStopReceiver(){ - int fnum=F_STOP_RECEIVER; +int slsDetector::detectorSendToReceiver(bool set){ + int fnum; + if(set) fnum=F_START_RECEIVER; + else fnum=F_STOP_RECEIVER; int ret = FAIL; char mess[100]; + if (thisDetector->onlineFlag==ONLINE_FLAG) { #ifdef VERBOSE std::cout << "Setting detector to send packets via client " << std::endl; @@ -5645,42 +5597,6 @@ int slsDetector::DetectorStopReceiver(){ -int slsDetector::stopReceiver(){ - int fnum=F_STOP_RECEIVER; - int ret = FAIL; - char mess[100]; - - DetectorStopReceiver(); - - if (setReceiverOnline(ONLINE_FLAG)==ONLINE_FLAG) { -#ifdef VERBOSE - std::cout << "Stopping Receiver " << std::endl; -#endif - if (dataSocket) { - if (dataSocket->Connect()>=0) { - dataSocket->SendDataOnly(&fnum,sizeof(fnum)); - dataSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret==FAIL){ - dataSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Receiver returned error: " << mess << std::endl; - } - - dataSocket->Disconnect(); - if (ret==FORCE_UPDATE) - ret=updateReceiver(); - } - } - }else - std::cout << "cannot connect to receiver" << endl; - - //increment file index - if(ret==OK){ - fileIO::setFileIndex(fileIO::getFileIndex()+1); - setFileIndex(fileIO::getFileIndex()); - } - - return ret; -} @@ -5688,31 +5604,21 @@ int slsDetector::stopReceiver(){ slsDetectorDefs::runStatus slsDetector::getReceiverStatus(){ int fnum=F_GET_RECEIVER_STATUS; int ret = FAIL; - char mess[100]; - runStatus retval=ERROR; + int retval=-1; + runStatus s=ERROR; if (setReceiverOnline(ONLINE_FLAG)==ONLINE_FLAG) { #ifdef VERBOSE std::cout << "Getting Receiver Status" << std::endl; #endif - if (dataSocket) { - if (dataSocket->Connect()>=0) { - dataSocket->SendDataOnly(&fnum,sizeof(fnum)); - dataSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret==FAIL){ - dataSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Receiver returned error: " << mess << std::endl; - }else - dataSocket->ReceiveDataOnly(&retval,sizeof(retval)); + ret=thisReceiver->getInt(fnum,retval); + if(retval!=-1) + s=(runStatus)retval; + if(ret==FORCE_UPDATE) + ret=updateReceiver(); + } - dataSocket->Disconnect(); - if (ret==FORCE_UPDATE) - updateReceiver(); - } - } - }else - std::cout << "cannot connect to receiver" << endl; - return retval; + return s; } @@ -5721,30 +5627,17 @@ slsDetectorDefs::runStatus slsDetector::getReceiverStatus(){ int slsDetector::getFramesCaughtByReciver(){ int fnum=F_GET_FRAMES_CAUGHT; int ret = FAIL; - char mess[100]; int retval=-1; if (setReceiverOnline(ONLINE_FLAG)==ONLINE_FLAG) { #ifdef VERBOSE std::cout << "Getting Frames Caught by Receiver " << std::endl; #endif - if (dataSocket) { - if (dataSocket->Connect()>=0) { - dataSocket->SendDataOnly(&fnum,sizeof(fnum)); - dataSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret!=FAIL) - dataSocket->ReceiveDataOnly(&retval,sizeof(retval)); - else{ - dataSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Receiver returned error: " << mess << std::endl; - } - dataSocket->Disconnect(); - if (ret==FORCE_UPDATE) - updateReceiver(); - } - } - }else - std::cout << "cannot connect to receiver" << endl; + ret=thisReceiver->getInt(fnum,retval); + if(ret==FORCE_UPDATE) + ret=updateReceiver(); + } + return retval; } @@ -5755,33 +5648,17 @@ int slsDetector::lockReceiver(int lock){ int fnum=F_LOCK_RECEIVER; int ret = FAIL; int retval=-1; - char mess[100]; - int arg= lock; + int arg=lock; if(setReceiverOnline(ONLINE_FLAG)!=ONLINE_FLAG){ #ifdef VERBOSE std::cout << "Locking or Unlocking Receiver " << std::endl; #endif - if (dataSocket) { - if (dataSocket->Connect()>=0) { - dataSocket->SendDataOnly(&fnum,sizeof(fnum)); - dataSocket->SendDataOnly(&arg,sizeof(arg)); - dataSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret!=FAIL) - dataSocket->ReceiveDataOnly(&retval,sizeof(retval)); - else{ - dataSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Receiver returned error: " << mess << std::endl; - } - - dataSocket->Disconnect(); - if (ret==FORCE_UPDATE) - updateReceiver(); - } - } - }else - std::cout << "cannot connect to receiver" << endl; + ret=thisReceiver->sendInt(fnum,retval,arg); + if(ret==FORCE_UPDATE) + updateReceiver(); + } return retval; } @@ -5795,30 +5672,15 @@ string slsDetector::getReceiverLastClientIP(){ int fnum=F_GET_LAST_CLIENT_IP; int ret = FAIL; char retval[INET_ADDRSTRLEN]=""; - char mess[100]; if(setReceiverOnline(ONLINE_FLAG)!=ONLINE_FLAG){ #ifdef VERBOSE std::cout << "Geting Last Client IP connected to Receiver " << std::endl; #endif - if (dataSocket) { - if (dataSocket->Connect()>=0) { - dataSocket->SendDataOnly(&fnum,sizeof(fnum)); - dataSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret!=FAIL) - dataSocket->ReceiveDataOnly(retval,sizeof(retval)); - else{ - dataSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Receiver returned error: " << mess << std::endl; - } - - dataSocket->Disconnect(); - if (ret==FORCE_UPDATE) - updateReceiver(); - } - } - }else - std::cout << "cannot connect to receiver" << endl; + ret=thisReceiver->getLastClientIP(fnum,retval); + if(ret==FORCE_UPDATE) + updateReceiver(); + } return string(retval); } @@ -5837,7 +5699,6 @@ int slsDetector::updateReceiverNoWait() { #ifdef VERBOSE cout << "Updating receiver last modified by " << lastClientIP << std::endl; #endif - n = dataSocket->ReceiveDataOnly(&ind,sizeof(ind)); fileIO::setFileIndex(ind); n = dataSocket->ReceiveDataOnly(path,MAX_STR_LENGTH); diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index 91258009e..1357d6f10 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -13,6 +13,8 @@ #include "angleConversionConstant.h"; +#include "receiverInterface.h" + /** * @@ -1437,7 +1439,10 @@ class slsDetector : public slsDetectorUtils, public energyConversion { */ int stopReceiver(); - int DetectorStopReceiver(); + /** Sets(false) or Resets(true) the CPU bit in detector + \returns OK or FAIL + */ + int detectorSendToReceiver(bool set); /** gets the status of the listening mode of receiver \returns status @@ -1488,7 +1493,7 @@ class slsDetector : public slsDetectorUtils, public energyConversion { /** - * + * parent multi detector * */ multiSlsDetector *parentDet; @@ -1534,6 +1539,8 @@ class slsDetector : public slsDetectorUtils, public energyConversion { /** pointer to channal registers */ int *chanregs; + receiverInterface *thisReceiver; + /** Initializes the shared memory \param type is needed to define the size of the shared memory \param id is the detector id needed to define the shared memory id diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index b5d59810c..f8b4e73ea 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -774,7 +774,7 @@ string slsDetectorCommand::cmdAcquire(int narg, char *args[], int action) { myDet->setOnline(ONLINE_FLAG); - bool receiver=myDet->setReceiverOnline(); + bool receiver=(myDet->setReceiverOnline()==ONLINE_FLAG); if(receiver) if(myDet->startReceiver()==OK)