diff --git a/Makefile b/Makefile index 0b76b91eb..b340e9158 100755 --- a/Makefile +++ b/Makefile @@ -23,7 +23,7 @@ CALIBDIR = $(WD)/slsDetectorCalibration TABSPACE := "\t" -INCLUDES=-I. -I$(LIBRARYDIR)/commonFiles -I$(LIBRARYDIR)/slsDetector -I$(LIBRARYDIR)/usersFunctions -I$(LIBRARYDIR)/multiSlsDetector -I$(LIBRARYDIR)/slsDetectorUtils -I$(LIBRARYDIR)/slsDetectorCommand -I$(LIBRARYDIR)/slsDetectorAnalysis -I$(LIBRARYDIR)/slsReceiverInterface -I$(LIBRARYRXRDIR)/include -I$(LIBRARYDIR)/threadFiles -I$(ASM) +INCLUDES=-I. -I$(LIBRARYDIR)/commonFiles -I$(LIBRARYDIR)/slsDetector -I$(LIBRARYDIR)/usersFunctions -I$(LIBRARYDIR)/multiSlsDetector -I$(LIBRARYDIR)/slsDetectorUtils -I$(LIBRARYDIR)/slsDetectorCommand -I$(LIBRARYDIR)/slsDetectorAnalysis -I$(LIBRARYDIR)/slsReceiverInterface -I$(LIBRARYRXRDIR)/include -I$(LIBRARYDIR)/threadFiles --I$(LIBRARYDIR)/sharedMemory I$(ASM) INCLUDESRXR += -I. -I$(LIBRARYRXRDIR)/include -I$(CALIBDIR) -I$(ASM) #LIBFLAGRXR += diff --git a/slsDetectorSoftware/CMakeLists.txt b/slsDetectorSoftware/CMakeLists.txt index 17370ba50..939d833e9 100644 --- a/slsDetectorSoftware/CMakeLists.txt +++ b/slsDetectorSoftware/CMakeLists.txt @@ -1,5 +1,6 @@ set(SOURCES multiSlsDetector/multiSlsDetector.cpp + sharedMemory/SharedMemory.cpp slsDetector/slsDetectorUsers.cpp slsDetector/slsDetectorUtils.cpp slsDetector/slsDetectorCommand.cpp @@ -24,6 +25,7 @@ set(HEADERS include_directories( commonFiles multiSlsDetector +sharedMemory slsDetector slsDetectorUtils slsDetectorCommand @@ -57,6 +59,9 @@ set(PUBLICHEADERS commonFiles/sls_detector_defs.h commonFiles/sls_detector_funcs.h commonFiles/error_defs.h + commonFiles/sls_detector_exceptions.h + commonFiles/versionAPI.h + sharedMemory/SharedMemory.h slsDetector/slsDetectorUtils.h slsDetector/slsDetector.h slsDetector/slsDetectorActions.h diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 97e8bc255..d0ac14df2 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -36,9 +36,10 @@ multiSlsDetector::multiSlsDetector(int id, bool verify, bool update) thisMultiDetector(0), client_downstream(false), threadpool(0) { - bool created = initSharedMemory(verify); - initializeDetectorStructure(created, verify); - initializeMembers(); + if (initSharedMemory(verify)) + // shared memory just created, so initialize the structure + initializeDetectorStructure(); + initializeMembers(verify); if (update) updateUserdetails(); } @@ -615,12 +616,11 @@ void multiSlsDetector::freeSharedMemory(int multiId) { // get number of detectors int numDetectors = 0; SharedMemory* shm = new SharedMemory(multiId, -1); - std::string shmname = shm->GetName(); // shm not created before - if (SharedMemory::IsExisting(shmname)) { - sharedMultiDet* mdet = (sharedMultiSlsDetector*)shm->OpenSharedMemory( - sizeof(sharedMultiSlsDetector), false); + if (SharedMemory::IsExisting(shm->GetName())) { + sharedMultiSlsDetector* mdet = (sharedMultiSlsDetector*)shm->OpenSharedMemory( + sizeof(sharedMultiSlsDetector)); numDetectors = mdet->numberOfDetectors; shm->UnmapSharedMemory(mdet); shm->RemoveSharedMemory(); @@ -647,7 +647,7 @@ void multiSlsDetector::freeSharedMemory() { // multi detector if (sharedMemory) { - sharedMemory->Unmap(thisMultiDetector); + sharedMemory->UnmapSharedMemory(thisMultiDetector); sharedMemory->RemoveSharedMemory(); delete sharedMemory; } @@ -722,93 +722,88 @@ bool multiSlsDetector::initSharedMemory(bool verify) { } -void multiSlsDetector::initializeDetectorStructure(bool created, bool verify) { - if (created) { - thisMultiDetector->shmversion = MULTI_SHMVERSION; - thisMultiDetector->numberOfDetectors = 0; - thisMultiDetector->numberOfDetector[X] = 0; - thisMultiDetector->numberOfDetector[Y] = 0; - thisMultiDetector->onlineFlag = 1; - thisMultiDetector->stoppedFlag = 0; - thisMultiDetector->masterPosition = -1; - thisMultiDetector->syncMode = GET_SYNCHRONIZATION_MODE; - for(int i = 0; i < MAXDET; ++i) { - thisMultiDetector->offsetX[i] = 0; - thisMultiDetector->offsetY[i] = 0; - } - thisMultiDetector->dataBytes = 0; - thisMultiDetector->dataBytesInclGapPixels = 0; - thisMultiDetector->numberOfChannels = 0; - thisMultiDetector->numberOfChannel[X] = 0; - thisMultiDetector->numberOfChannel[Y] = 0; - thisMultiDetector->numberOfChannelInclGapPixels[X] = 0; - thisMultiDetector->numberOfChannelInclGapPixels[Y] = 0; - thisMultiDetector->maxNumberOfChannels = 0; - thisMultiDetector->maxNumberOfChannel[X] = 0; - thisMultiDetector->maxNumberOfChannel[Y] = 0; - thisMultiDetector->maxNumberOfChannelInclGapPixels[X] = 0; - thisMultiDetector->maxNumberOfChannelInclGapPixels[Y] = 0; - thisMultiDetector->maxNumberOfChannelsPerDetector[X] = 0; - thisMultiDetector->maxNumberOfChannelsPerDetector[Y] = 0; - for (int i = 0; i < MAX_TIMERS; ++i) { - thisMultiDetector->timerValue[i] = 0; - } - thisMultiDetector->currentSettings = -1; - thisMultiDetector->currentThresholdEV = -1; - thisMultiDetector->progressIndex = 0; - thisMultiDetector->totalProgress = 1; - thisMultiDetector->fileIndex = 0; - strncpy(thisMultiDetector->fileName, "run", MAX_STR_LENGTH); - strncpy(thisMultiDetector->filePath, "/", MAX_STR_LENGTH); - thisMultiDetector->framesPerFile = 1; - thisMultiDetector->fileFormatType = ASCII; - thisMultiDetector->correctionMask = (1 << WRITE_FILE) | (1 << OVERWRITE_FILE); - thisMultiDetector->threadedProcessing = 1; - thisMultiDetector->tDead = 0; - strncpy(flatFieldDir, getenv("HOME"), MAX_STR_LENGTH); - strncpy(flatFieldFile, "none", MAX_STR_LENGTH); - strncpy(thisMultiDetector->badChanFile, "none", MAX_STR_LENGTH); - strncpy(thisMultiDetector->angConvFile, "none", MAX_STR_LENGTH); - thisMultiDetector->angDirection = 1; - thisMultiDetector->fineOffset = 0; - thisMultiDetector->globalOffset = 0; - thisMultiDetector->binSize = 0.001; - for (int i = 0; i < 2; ++i) { - thisMultiDetector->sampleDisplacement[i] = 0.0; - } - thisMultiDetector->numberOfPositions = 0; - for (int i = 0; i < MAXPOS; ++i) { - thisMultiDetector->detPositions[i] = 0.0; - } - thisMultiDetector->actionMask = 0; - for (int i = 0; i < MAX_ACTIONS; ++i) { - strncpy(thisMultiDetector->actionScript[i], "none", MAX_STR_LENGTH); - strncpy(thisMultiDetector->actionParameter[i], "none", MAX_STR_LENGTH); - } - for (int i = 0; i < MAX_SCAN_LEVELS; ++i) { - thisMultiDetector->scanMode[i] = 0; - strncpy(thisMultiDetector->scanScript[i], "none", MAX_STR_LENGTH); - strncpy(thisMultiDetector-> scanParameter[i], "none", MAX_STR_LENGTH); - thisMultiDetector->nScanSteps[i] = 0; - thisMultiDetector->scanSteps[i] = 0.0; - thisMultiDetector->scanPrecision[i] = 0; - - } - thisMultiDetector->acquiringFlag = false; - thisMultiDetector->externalgui = false; - thisMultiDetector->receiverOnlineFlag = OFFLINE_FLAG; - thisMultiDetector->receiver_upstream = false; +void multiSlsDetector::initializeDetectorStructure() { + thisMultiDetector->shmversion = MULTI_SHMVERSION; + thisMultiDetector->numberOfDetectors = 0; + thisMultiDetector->numberOfDetector[X] = 0; + thisMultiDetector->numberOfDetector[Y] = 0; + thisMultiDetector->onlineFlag = 1; + thisMultiDetector->stoppedFlag = 0; + thisMultiDetector->masterPosition = -1; + thisMultiDetector->syncMode = GET_SYNCHRONIZATION_MODE; + for(int i = 0; i < MAXDET; ++i) { + thisMultiDetector->offsetX[i] = 0; + thisMultiDetector->offsetY[i] = 0; } - - - // get objects from single det shared memory (open) - for (int i = 0; i < thisMultiDetector->numberOfDetectors; i++) { - slsDetector* sdet = new slsDetector(detId, i, verify, this); - detectors.push_back(sdet); + thisMultiDetector->dataBytes = 0; + thisMultiDetector->dataBytesInclGapPixels = 0; + thisMultiDetector->numberOfChannels = 0; + thisMultiDetector->numberOfChannel[X] = 0; + thisMultiDetector->numberOfChannel[Y] = 0; + thisMultiDetector->numberOfChannelInclGapPixels[X] = 0; + thisMultiDetector->numberOfChannelInclGapPixels[Y] = 0; + thisMultiDetector->maxNumberOfChannels = 0; + thisMultiDetector->maxNumberOfChannel[X] = 0; + thisMultiDetector->maxNumberOfChannel[Y] = 0; + thisMultiDetector->maxNumberOfChannelInclGapPixels[X] = 0; + thisMultiDetector->maxNumberOfChannelInclGapPixels[Y] = 0; + thisMultiDetector->maxNumberOfChannelsPerDetector[X] = 0; + thisMultiDetector->maxNumberOfChannelsPerDetector[Y] = 0; + for (int i = 0; i < MAX_TIMERS; ++i) { + thisMultiDetector->timerValue[i] = 0; } + thisMultiDetector->currentSettings = GET_SETTINGS; + thisMultiDetector->currentThresholdEV = -1; + thisMultiDetector->progressIndex = 0; + thisMultiDetector->totalProgress = 1; + thisMultiDetector->fileIndex = 0; + strcpy(thisMultiDetector->fileName, "run"); + strcpy(thisMultiDetector->filePath, "/"); + thisMultiDetector->framesPerFile = 1; + thisMultiDetector->fileFormatType = ASCII; + thisMultiDetector->correctionMask = (1 << WRITE_FILE) | (1 << OVERWRITE_FILE); + thisMultiDetector->threadedProcessing = 1; + thisMultiDetector->tDead = 0; + strncpy(thisMultiDetector->flatFieldDir, getenv("HOME"), MAX_STR_LENGTH-1); + thisMultiDetector->flatFieldDir[MAX_STR_LENGTH-1] = 0; + strcpy(thisMultiDetector->flatFieldFile, "none"); + strcpy(thisMultiDetector->badChanFile, "none"); + strcpy(thisMultiDetector->angConvFile, "none"); + thisMultiDetector->angDirection = 1; + thisMultiDetector->fineOffset = 0; + thisMultiDetector->globalOffset = 0; + thisMultiDetector->binSize = 0.001; + for (int i = 0; i < 2; ++i) { + thisMultiDetector->sampleDisplacement[i] = 0.0; + } + thisMultiDetector->numberOfPositions = 0; + for (int i = 0; i < MAXPOS; ++i) { + thisMultiDetector->detPositions[i] = 0.0; + } + thisMultiDetector->actionMask = 0; + for (int i = 0; i < MAX_ACTIONS; ++i) { + strcpy(thisMultiDetector->actionScript[i], "none"); + strcpy(thisMultiDetector->actionParameter[i], "none"); + } + for (int i = 0; i < MAX_SCAN_LEVELS; ++i) { + thisMultiDetector->scanMode[i] = 0; + strcpy(thisMultiDetector->scanScript[i], "none"); + strcpy(thisMultiDetector-> scanParameter[i], "none"); + thisMultiDetector->nScanSteps[i] = 0; + { + double initValue = 0; + std::fill_n(thisMultiDetector->scanSteps[i], MAX_SCAN_STEPS, initValue); + } + thisMultiDetector->scanPrecision[i] = 0; + + } + thisMultiDetector->acquiringFlag = false; + thisMultiDetector->externalgui = false; + thisMultiDetector->receiverOnlineFlag = OFFLINE_FLAG; + thisMultiDetector->receiver_upstream = false; } -void multiSlsDetector::initializeMembers() { +void multiSlsDetector::initializeMembers(bool verify) { //slsDetectorUtils stoppedFlag = &thisMultiDetector->stoppedFlag; timerValue = thisMultiDetector->timerValue; @@ -822,7 +817,6 @@ void multiSlsDetector::initializeMembers() { framesPerFile = &thisMultiDetector->framesPerFile; fileFormatType = &thisMultiDetector->fileFormatType; - //postprocessing threadedProcessing = &thisMultiDetector->threadedProcessing; correctionMask = &thisMultiDetector->correctionMask; @@ -832,10 +826,6 @@ void multiSlsDetector::initializeMembers() { badChannelMask = NULL; fdata = NULL; thisData = NULL; - ppFun = NULL; - ang = NULL; - val = NULL; - err = NULL; //slsDetectorActions actionMask = &thisMultiDetector->actionMask; @@ -874,6 +864,12 @@ void multiSlsDetector::initializeMembers() { updateOffsets(); createThreadPool(); + + // get objects from single det shared memory (open) + for (int i = 0; i < thisMultiDetector->numberOfDetectors; i++) { + slsDetector* sdet = new slsDetector(detId, i, verify, this); + detectors.push_back(sdet); + } } @@ -882,17 +878,20 @@ void multiSlsDetector::updateUserdetails() { memset(thisMultiDetector->lastUser, 0, SHORT_STRING_LENGTH); memset(thisMultiDetector->lastDate, 0, SHORT_STRING_LENGTH); try { - strncpy(thisMultiDetector->lastUser, exec("whoami").c_str(), SHORT_STRING_LENGTH); - strncpy(thisMultiDetector->lastDate, exec("date").c_str(), DATE_LENGTH); + strncpy(thisMultiDetector->lastUser, exec("whoami").c_str(), SHORT_STRING_LENGTH-1); + thisMultiDetector->lastUser[SHORT_STRING_LENGTH-1] = 0; + strncpy(thisMultiDetector->lastDate, exec("date").c_str(), DATE_LENGTH-1); + thisMultiDetector->lastDate[DATE_LENGTH-1] = 0; } catch(...) { - strncpy(thisMultiDetector->lastUser, exec("errorreading").c_str(), SHORT_STRING_LENGTH); - strncpy(thisMultiDetector->lastDate, exec("errorreading").c_str(), SHORT_STRING_LENGTH); + strcpy(thisMultiDetector->lastUser, "errorreading"); + strcpy(thisMultiDetector->lastDate, "errorreading"); } } std::string multiSlsDetector::exec(const char* cmd) { - int bufsize = 1char buffer[bufsize]; + int bufsize = 128; + char buffer[bufsize]; std::string result = ""; FILE* pipe = popen(cmd, "r"); if (!pipe) throw std::exception(); @@ -911,14 +910,13 @@ std::string multiSlsDetector::exec(const char* cmd) { } -void multiSlsDetector::setHostname(string s) { - freeSharedMemory(detId); +void multiSlsDetector::setHostname(const char* name) { size_t p1 = 0; - string temp = string(s); + string temp = string(name); size_t p2 = temp.find('+', p1); //single if (p2 == string::npos) { - addSlsDetector(s); + addSlsDetector(temp); } // multi else { @@ -1227,7 +1225,7 @@ void multiSlsDetector::updateOffsets() { "prevChanY_gp:" << prevChanY_gp << endl; #endif //cout<<" totalchan:"<< detectors[idet]->getTotalNumberOfChannels(Y) - <<" maxChanY:"<setSynchronization(sync); if (detectors[idet]->getErrorMask()) setErrorMask(getErrorMask() | (1 << idet)); - - if (id == 0) + if (idet == 0) ret = ret1; else if (ret != ret1) ret = GET_SYNCHRONIZATION_MODE; @@ -2643,7 +2641,7 @@ dacs_t multiSlsDetector::setDAC(dacs_t val, dacIndex idac, int mV, int imod) { { int id = -1, im = -1; if (decodeNMod(imod, id, im) >= 0) { - if (if < 0 && id >= detectors.size()) + if (id < 0 && id >= detectors.size()) return -1; ret = detectors[id]->setDAC(val, idac, mV, im); if (detectors[id]->getErrorMask()) @@ -2700,7 +2698,7 @@ dacs_t multiSlsDetector::getADC(dacIndex idac, int imod) { { int id = -1, im = -1; if (decodeNMod(imod, id, im) >= 0) { - if (if < 0 && id >= detectors.size()) + if (id < 0 && id >= detectors.size()) return -1; ret = detectors[id]->getADC(idac, im); if (detectors[id]->getErrorMask()) @@ -3168,7 +3166,7 @@ int multiSlsDetector::setROI(int n, ROI roiLimits[]) { cout << "det:" << idet << "\t" << xmin << "\t" << ymin << "\t" << channelX << "\t" << channelY << endl; #endif - if (idet < 0 || id >= detectors.size) { + if (idet < 0 || idet >= detectors.size()) { cout << "invalid roi" << endl; invalidroi = true; break; @@ -4325,7 +4323,7 @@ angleConversionConstant* multiSlsDetector::getAngularConversionPointer(int imod) #endif if (decodeNMod(imod, id, im) >= 0) { if (id < 0 || id >= detectors.size()) - return -1; + return NULL; return detectors[id]->getAngularConversionPointer(im); } return NULL; @@ -4431,7 +4429,7 @@ string multiSlsDetector::setFileName(string s) { return string(""); } else { string* sret[detectors.size()]; - if (detectors[idet]) { + for (int idet = 0; idet < posmax; ++idet) { sret[idet] = new string("error"); Task* task = new Task(new func1_t(&slsDetector::setFileName, detectors[idet], s, sret[idet])); @@ -4469,7 +4467,7 @@ int multiSlsDetector::setReceiverFramesPerFile(int f) { return parallelCallDetectorMember(&slsDetector::setReceiverFramesPerFile, f); } -fileFormat multiSlsDetector::getFileFormat() { +slsReceiverDefs::fileFormat multiSlsDetector::getFileFormat() { return setFileFormat(); } @@ -4763,12 +4761,12 @@ int multiSlsDetector::createReceivingDataSockets(const bool destroy) { detectors[i / numSocketsPerDetector]->getClientStreamingIP().c_str(), portnum); zmqSocket.push_back(z); + printf("Zmq Client[%d] at %s\n", i, z->GetZmqServerAddress()); } catch (...) { cprintf(RED, "Error: Could not create Zmq socket on port %d\n", portnum); createReceivingDataSockets(true); return FAIL; } - printf("Zmq Client[%d] at %s\n", i, z->GetZmqServerAddress()); } client_downstream = true; diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index df37d6f32..d35fcaaa6 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -489,7 +489,7 @@ public: * @param pos position in the multi list * @returns slsDetector object */ - slsDetector *operator(); + slsDetector *operator()(int pos); /** * Free shared memory from the command line @@ -513,9 +513,9 @@ public: /** * Sets the hostname of all sls detectors in shared memory * Connects to them to set up online flag - * @param s concatenated hostname of all the sls detectors + * @param name concatenated hostname of all the sls detectors */ - void setHostname(std::string s); + void setHostname(const char* name); /** * Gets the hostname of detector at particular position @@ -554,7 +554,7 @@ public: * Creates all the threads in the threadpool * throws an exception if it cannot create threads */ - int createThreadPool(); + void createThreadPool(); /** * Destroys all the threads in the threadpool @@ -1822,16 +1822,15 @@ private: bool initSharedMemory(bool verify = true); /** - * Initialize detector structure - * @param created true if shared memory was just created now - * @param verify true to verify if shm size matches existing one + * Initialize detector structure for the shared memory just created */ - void initializeDetectorStructure(bool created, bool verify = true); + void initializeDetectorStructure(); /** * Initialize class members (and from parent classes) + * @param verify true to verify if shm size matches existing one */ - void initializeMembers(); + void initializeMembers(bool verify = true); /** * Update user details in detector structure diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetectorClient.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetectorClient.h index f5e796189..b8815eabb 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetectorClient.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetectorClient.h @@ -4,6 +4,7 @@ #include "multiSlsDetector.h" #include "multiSlsDetectorCommand.h" +#include "sls_detector_exceptions.h" #include @@ -54,7 +55,7 @@ public: // sls pos scanned iv=sscanf(argv[0],"%d:%s", &pos, cmd); \ if (iv != 2 ) \ - pos = 0; \ + pos = -1; \ if (iv == 2 && pos >= 0) { \ argv[0] = cmd; \ cout << pos << ":" ; \ @@ -62,8 +63,12 @@ public: if ((action==slsDetectorDefs::READOUT_ACTION) && (pos != -1) ) { \ cout << "pos " << pos << "is not allowed for readout!" << endl; \ + return; \ } \ + if (!strlen(cmd)) \ + strcpy(cmd, argv[0]); \ + // special commands string scmd = cmd; \ // free without calling multiSlsDetector constructor @@ -74,6 +79,17 @@ public: multiSlsDetector::freeSharedMemory(id); \ return; \ } \ + // (sls level): give error message + // (multi level): free before calling multiSlsDetector constructor + else if (scmd == "hostname") { \ + if (pos != -1) { \ + cout << "pos " << pos << "not allowed for hostname. " \ + "Only from multi detector level." << endl; \ + return; \ + } \ + else \ + multiSlsDetector::freeSharedMemory(id); \ + } \ // get user details without verify sharedMultiSlsDetector version else if ((scmd == "userdetails") && (action==slsDetectorDefs::GET_ACTION)) {\ verify = false; \ @@ -107,7 +123,7 @@ public: return; \ }; \ - + cout<<"id:"<executeLine(argc, argv, action, pos); \ diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 93c7e453b..6b4502fc8 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -1,5 +1,6 @@ #include "slsDetector.h" #include "multiSlsDetector.h" +#include "sls_detector_exceptions.h" #include "SharedMemory.h" #include "receiverInterface.h" #include "gitInfoLib.h" @@ -21,7 +22,7 @@ using namespace std; -slsDetector::slsDetector(detectorType type, int multiId, int id, bool verify, MultiDet* m) +slsDetector::slsDetector(detectorType type, int multiId, int id, bool verify, multiSlsDetector* m) : slsDetectorUtils(), detId(id), sharedMemory(0), @@ -45,8 +46,7 @@ slsDetector::slsDetector(detectorType type, int multiId, int id, bool verify, Mu // ensure shared memory was not created before SharedMemory* shm = new SharedMemory(multiId, id); - std::string shmname = shm->GetName(); - if (SharedMemory::IsExisting(shmname)) { + if (SharedMemory::IsExisting(shm->GetName())) { cprintf(YELLOW BOLD,"Warning: Weird, this shared memory should have been " "deleted before! %s. Freeing it again.\n", shm->GetName().c_str()); freeSharedMemory(multiId, id); @@ -60,7 +60,7 @@ slsDetector::slsDetector(detectorType type, int multiId, int id, bool verify, Mu initializeDetectorStructurePointers(); } -slsDetector::slsDetector(int multiId, int id, bool verify, MultiDet* m) +slsDetector::slsDetector(int multiId, int id, bool verify, multiSlsDetector* m) : slsDetectorUtils(), detId(id), sharedMemory(0), @@ -85,7 +85,7 @@ slsDetector::slsDetector(int multiId, int id, bool verify, MultiDet* m) // ensure shared memory is existing SharedMemory* shm = new SharedMemory(multiId, id); - if (!SharedMemory::IsExisting(shmname)) { + if (!SharedMemory::IsExisting(shm->GetName())) { cprintf(YELLOW BOLD,"Warning: Corrupted shared memory. It should have been " "created before! %s.\n", shm->GetName().c_str()); delete shm; /* is this necessary ?*/ @@ -93,14 +93,14 @@ slsDetector::slsDetector(int multiId, int id, bool verify, MultiDet* m) } delete shm; - detectorType type = GetDetectorTypeFromShm(multiId, verify); + detectorType type = getDetectorTypeFromShm(multiId, verify); initSharedMemory(false, type, multiId, verify); initializeMembers(); } slsDetector::~slsDetector() { if (sharedMemory) { - sharedMemory->UnmapSharedMemory(thisMultiDetector); + sharedMemory->UnmapSharedMemory(thisDetector); delete sharedMemory; } if(thisReceiver) @@ -211,8 +211,7 @@ int64_t slsDetector::clearAllErrorMask() { clearErrorMask(); pthread_mutex_lock(&ms); for(int i=0;igetNumberOfDetectors();++i){ - if(multiDet->getDetectorId(i) == getDetectorId()) - multiDet->setErrorMask(multiDet->getErrorMask()|(0<setErrorMask(multiDet->getErrorMask()|(0<RemoveSharedMemory(); delete shm; @@ -420,7 +419,7 @@ void slsDetector::setHostname(const char *name) { setTCPSocket(string(name)); } -string slsDetector::getHostname(int pos = -1) { +string slsDetector::getHostname(int pos) { return string(thisDetector->hostname); } @@ -439,22 +438,22 @@ void slsDetector::initSharedMemory(bool created, detectorType type, int multiId, // create if (created) { try { - thisSingleDet = (sharedSingleDet*)sharedMemory->CreateSharedMemory(sz); + thisDetector = (sharedSlsDetector*)sharedMemory->CreateSharedMemory(sz); } catch(...) { sharedMemory->RemoveSharedMemory(); - thisSingleDet = 0; + thisDetector = 0; throw; } } // open and verify version else { - thisSingleDet = (sharedSingleDet*)sharedMemory->OpenSharedMemory(sz, verify); + thisDetector = (sharedSlsDetector*)sharedMemory->OpenSharedMemory(sz); if (verify && thisDetector->shmversion != SLS_SHMVERSION) { cprintf(RED, "Single shared memory (%d-%d:)version mismatch " "(expected 0x%x but got 0x%x)\n", multiId, detId, SLS_SHMVERSION, thisDetector->shmversion); - shm->UnmapSharedMemory(sdet); /** is this unncessary? */ - delete shm;/** is this unncessary? */ + sharedMemory->UnmapSharedMemory(thisDetector); /** is this unncessary? */ + delete sharedMemory;/** is this unncessary? */ throw SharedMemoryException(); } } @@ -464,136 +463,136 @@ void slsDetector::initSharedMemory(bool created, detectorType type, int multiId, void slsDetector::setDetectorSpecificParameters(detectorType type, detParameterList& list) { switch (type) { case MYTHEN: - detlist.nModMaxX = 24; - detlist.nModMaxY = 1; - detlist.nChanX = 128; - detlist.nChanY = 1; - detlist.nChipX = 10; - detlist.nChipY = 1; - detlist.nDacs = 6; - detlist.nAdcs = 0; - detlist.nGain = 0; - detlist.nOffset = 0; - detlist.dynamicRange = 24; - detlist.moveFlag = 1; - detlist.nGappixelsX = 0; - detlist.nGappixelsY = 0; + list.nModMaxX = 24; + list.nModMaxY = 1; + list.nChanX = 128; + list.nChanY = 1; + list.nChipX = 10; + list.nChipY = 1; + list.nDacs = 6; + list.nAdcs = 0; + list.nGain = 0; + list.nOffset = 0; + list.dynamicRange = 24; + list.moveFlag = 1; + list.nGappixelsX = 0; + list.nGappixelsY = 0; break; case PICASSO: /** is this needed?*/ - detlist.nModMaxX = 24; - detlist.nModMaxY = 1; - detlist.nChanX = 128; - detlist.nChanY = 1; - detlist.nChipX = 12; - detlist.nChipY = 1; - detlist.nDacs = 6; - detlist.nAdcs = 0; - detlist.nGain = 0; - detlist.nOffset = 0; - detlist.dynamicRange = 24; - detlist.moveFlag = 0; - detlist.nGappixelsX = 0; - detlist.nGappixelsY = 0; + list.nModMaxX = 24; + list.nModMaxY = 1; + list.nChanX = 128; + list.nChanY = 1; + list.nChipX = 12; + list.nChipY = 1; + list.nDacs = 6; + list.nAdcs = 0; + list.nGain = 0; + list.nOffset = 0; + list.dynamicRange = 24; + list.moveFlag = 0; + list.nGappixelsX = 0; + list.nGappixelsY = 0; break; case GOTTHARD: - detlist.nModMaxX = 1; - detlist.nModMaxY = 1; - detlist.nChanX = 128; - detlist.nChanY = 1; - detlist.nChipX = 10; - detlist.nChipY = 1; - detlist.nDacs = 8; - detlist.nAdcs = 5; - detlist.nGain = 0; - detlist.nOffset = 0; - detlist.dynamicRange = 16; - detlist.moveFlag = 0; - detlist.nGappixelsX = 0; - detlist.nGappixelsY = 0; + list.nModMaxX = 1; + list.nModMaxY = 1; + list.nChanX = 128; + list.nChanY = 1; + list.nChipX = 10; + list.nChipY = 1; + list.nDacs = 8; + list.nAdcs = 5; + list.nGain = 0; + list.nOffset = 0; + list.dynamicRange = 16; + list.moveFlag = 0; + list.nGappixelsX = 0; + list.nGappixelsY = 0; break; case PROPIX: - detlist.nModMaxX = 1; - detlist.nModMaxY = 1; - detlist.nChanX = 22; - detlist.nChanY = 22; - detlist.nChipX = 1; - detlist.nChipY = 1; - detlist.nDacs = 8; - detlist.nAdcs = 5; - detlist.nGain = 0; - detlist.nOffset = 0; - detlist.dynamicRange = 16; - detlist.moveFlag = 0; - detlist.nGappixelsX = 0; - detlist.nGappixelsY = 0; + list.nModMaxX = 1; + list.nModMaxY = 1; + list.nChanX = 22; + list.nChanY = 22; + list.nChipX = 1; + list.nChipY = 1; + list.nDacs = 8; + list.nAdcs = 5; + list.nGain = 0; + list.nOffset = 0; + list.dynamicRange = 16; + list.moveFlag = 0; + list.nGappixelsX = 0; + list.nGappixelsY = 0; break; case MOENCH: - detlist.nModMaxX = 1; - detlist.nModMaxY = 1; - detlist.nChanX = 160; - detlist.nChanY = 160; - detlist.nChipX = 1; - detlist.nChipY = 1; - detlist.nDacs = 8; - detlist.nAdcs = 1; - detlist.nGain = 0; - detlist.nOffset = 0; - detlist.dynamicRange = 16; - detlist.moveFlag = 0; - detlist.nGappixelsX = 0; - detlist.nGappixelsY = 0; + list.nModMaxX = 1; + list.nModMaxY = 1; + list.nChanX = 160; + list.nChanY = 160; + list.nChipX = 1; + list.nChipY = 1; + list.nDacs = 8; + list.nAdcs = 1; + list.nGain = 0; + list.nOffset = 0; + list.dynamicRange = 16; + list.moveFlag = 0; + list.nGappixelsX = 0; + list.nGappixelsY = 0; break; case JUNGFRAU: - detlist.nModMaxX = 1; - detlist.nModMaxY = 1; - detlist.nChanX = 256; - detlist.nChanY = 256; - detlist.nChipX = 4; - detlist.nChipY = 2; - detlist.nDacs = 16; - detlist.nAdcs = 0; - detlist.nGain = 0; - detlist.nOffset = 0; - detlist.dynamicRange = 16; - detlist.moveFlag = 0; - detlist.nGappixelsX = 0; - detlist.nGappixelsY = 0; + list.nModMaxX = 1; + list.nModMaxY = 1; + list.nChanX = 256; + list.nChanY = 256; + list.nChipX = 4; + list.nChipY = 2; + list.nDacs = 16; + list.nAdcs = 0; + list.nGain = 0; + list.nOffset = 0; + list.dynamicRange = 16; + list.moveFlag = 0; + list.nGappixelsX = 0; + list.nGappixelsY = 0; break; case JUNGFRAUCTB: - detlist.nModMaxX = 1; - detlist.nModMaxY = 1; - detlist.nChanX = 36; - detlist.nChanY = 1; - detlist.nChipX = 1; - detlist.nChipY = 1; - detlist.nDacs = 16; - detlist.nAdcs = 9;//???? When calculating size, only d+a=16 how come?FIXME - detlist.nGain = 0; - detlist.nOffset = 0; - detlist.dynamicRange =16; - detlist.moveFlag = 0; - detlist.nGappixelsX = 0; - detlist.nGappixelsY = 0; + list.nModMaxX = 1; + list.nModMaxY = 1; + list.nChanX = 36; + list.nChanY = 1; + list.nChipX = 1; + list.nChipY = 1; + list.nDacs = 16; + list.nAdcs = 9;//???? When calculating size, only d+a=16 how come?FIXME + list.nGain = 0; + list.nOffset = 0; + list.dynamicRange =16; + list.moveFlag = 0; + list.nGappixelsX = 0; + list.nGappixelsY = 0; break; case EIGER: - detlist.nModMaxX = 1; - detlist.nModMaxY = 1; - detlist.nChanX = 256; - detlist.nChanY = 256; - detlist.nChipX = 4; - detlist.nChipY = 1; - detlist.nDacs = 16; - detlist.nAdcs = 0; - detlist.nGain = 0; // can be set back to 4 in case we require it again - detlist.nOffset = 0; // can be set back to 4 in case we require it again - detlist.dynamicRange = 16; - detlist.moveFlag = 0; - detlist.nGappixelsX = 6; - detlist.nGappixelsY = 1; + list.nModMaxX = 1; + list.nModMaxY = 1; + list.nChanX = 256; + list.nChanY = 256; + list.nChipX = 4; + list.nChipY = 1; + list.nDacs = 16; + list.nAdcs = 0; + list.nGain = 0; // can be set back to 4 in case we require it again + list.nOffset = 0; // can be set back to 4 in case we require it again + list.dynamicRange = 16; + list.moveFlag = 0; + list.nGappixelsX = 6; + list.nGappixelsY = 1; break; default: cprintf(RED,"Unknown detector type!\n"); - throw Exception(); + throw exception(); } } @@ -629,34 +628,37 @@ int slsDetector::calculateSharedMemorySize(detectorType type) { void slsDetector::initializeDetectorStructure(detectorType type) { - char *goff = (char*)thisDetector; thisDetector->shmversion = SLS_SHMVERSION; thisDetector->onlineFlag = OFFLINE_FLAG; thisDetector->stoppedFlag = 0; - strncpy(thisDetector->hostname, DEFAULT_HOSTNAME, strlen(DEFAULT_HOSTNAME)); + strncpy(thisDetector->hostname, DEFAULT_HOSTNAME, MAX_STR_LENGTH-1); + thisDetector->hostname[MAX_STR_LENGTH-1] = 0; thisDetector->controlPort = DEFAULT_PORTNO; thisDetector->stopPort = DEFAULT_PORTNO + 1; thisDetector->myDetectorType = type; - strncpy(thisDetector->settingsDir, getenv("HOME"), strlen(getenv("HOME"))); - strncpy(thisDetector->calDir, getenv("HOME"), strlen(getenv("HOME"))); + strncpy(thisDetector->settingsDir, getenv("HOME"), MAX_STR_LENGTH-1); + thisDetector->settingsDir[MAX_STR_LENGTH-1] = 0; + strncpy(thisDetector->calDir, getenv("HOME"), MAX_STR_LENGTH-1); + thisDetector->calDir[MAX_STR_LENGTH-1] = 0; thisDetector->nTrimEn = 0; thisDetector->trimEnergies[100]; thisDetector->progressIndex = 0; thisDetector->totalProgress = 1; - strncpy(thisDetector->filePath, "/", strlen("/")); + strcpy(thisDetector->filePath, "/"); thisDetector->correctionMask = 0; thisDetector->threadedProcessing = 1; thisDetector->tDead = 0; - strncpy(thisDetector->flatFieldDir, getenv("HOME"), strlen(getenv("HOME"))); - strncpy(thisDetector->flatFieldFile, "none", strlen("none")); + strncpy(thisDetector->flatFieldDir, getenv("HOME"), MAX_STR_LENGTH-1); + thisDetector->flatFieldDir[MAX_STR_LENGTH-1] = 0; + strcpy(thisDetector->flatFieldFile, "none"); thisDetector->nBadChans = 0; - strncpy(thisDetector->badChanFile, "none", strlen("none")); + strcpy(thisDetector->badChanFile, "none"); thisDetector->nBadFF = 0; for (int i = 0; i < MAX_BADCHANS; ++i) { thisDetector->badChansList[i] = 0; thisDetector->badFFList[i] = 0; } - strncpy(thisDetector->angConvFile, "none", strlen("none")); + strcpy(thisDetector->angConvFile, "none"); memset(thisDetector->angOff, 0, MAXMODS * sizeof(angleConversionConstant)); thisDetector->angDirection = 1; thisDetector->fineOffset = 0; @@ -669,7 +671,7 @@ void slsDetector::initializeDetectorStructure(detectorType type) { thisDetector->nROI = 0; memset(thisDetector->roiLimits, 0, MAX_ROIS * sizeof(ROI)); thisDetector->roFlags = NORMAL_READOUT; - strncpy(thisDetector->settingsFile, "none", strlen("none")); + strcpy(thisDetector->settingsFile, "none"); thisDetector->currentSettings = UNINITIALIZED; thisDetector->currentThresholdEV = -1; thisDetector->timerValue[FRAME_NUMBER] = 1; @@ -691,25 +693,30 @@ void slsDetector::initializeDetectorStructure(detectorType type) { thisDetector->timerValue[SUBFRAME_PERIOD] = 0; thisDetector->actionMask = 0; for (int i = 0; i < MAX_ACTIONS; ++i) { - strncpy(thisDetector->actionScript[i], "none", strlen("none")); - strncpy(thisDetector->actionParameter[i], "none", strlen("none")); + strcpy(thisDetector->actionScript[i], "none"); + strcpy(thisDetector->actionParameter[i], "none"); } for (int i = 0; i < MAX_SCAN_LEVELS; ++i) { thisDetector->scanMode[i] = 0; - strncpy(thisDetector->scanScript[i], "none", strlen("none")); - strncpy(thisDetector->scanParameter[i], "none", strlen("none")); + strcpy(thisDetector->scanScript[i], "none"); + strcpy(thisDetector->scanParameter[i], "none"); thisDetector->nScanSteps[i] = 0; - thisDetector->scanSteps[i] = 0.0; + { + double initValue = 0; + std::fill_n(thisDetector->scanSteps[i], MAX_SCAN_STEPS, initValue); + } thisDetector->scanPrecision[i] = 0; } - strncpy(thisDetector->receiver_hostname, "none", strlen("none")); + strcpy(thisDetector->receiver_hostname, "none"); thisDetector->receiverTCPPort = DEFAULT_PORTNO+2; thisDetector->receiverUDPPort = DEFAULT_UDP_PORTNO; thisDetector->receiverUDPPort2 = DEFAULT_UDP_PORTNO + 1; - strncpy(thisDetector->receiverUDPIP, "none", strlen("none")); - strncpy(thisDetector->receiverUDPMAC, "none", strlen("none")); - strncpy(thisDetector->detectorMAC, DEFAULT_DET_MAC, strlen(DEFAULT_DET_MAC)); - strncpy(thisDetector->detectorIP, DEFAULT_DET_IP, strlen(DEFAULT_DET_IP)); + strcpy(thisDetector->receiverUDPIP, "none"); + strcpy(thisDetector->receiverUDPMAC, "none"); + strncpy(thisDetector->detectorMAC, DEFAULT_DET_MAC, MAX_STR_LENGTH-1); + thisDetector->detectorMAC[MAX_STR_LENGTH-1] = 0; + strncpy(thisDetector->detectorIP, DEFAULT_DET_IP, MAX_STR_LENGTH-1); + thisDetector->detectorIP[MAX_STR_LENGTH-1] = 0; thisDetector->receiverOnlineFlag = OFFLINE_FLAG; thisDetector->tenGigaEnable = 0; thisDetector->flippedData[X] = 0; @@ -813,6 +820,7 @@ void slsDetector::initializeDetectorStructure(detectorType type) { void slsDetector::initializeMembers() { // slsdetector // assign addresses + char *goff = (char*)thisDetector; ffcoefficients = (double*)(goff + thisDetector->ffoff); fferrors = (double*)(goff + thisDetector->fferroff); detectorModules = (sls_detector_module*)(goff + thisDetector->modoff); @@ -839,6 +847,7 @@ void slsDetector::initializeMembers() { fileIndex=multiDet->fileIndex; framesPerFile=multiDet->framesPerFile; fileFormatType=multiDet->fileFormatType; + if (thisDetector->myDetectorType != MYTHEN) fileIO::setFileFormat(BINARY); switch(thisDetector->myDetectorType) { @@ -870,10 +879,6 @@ void slsDetector::initializeMembers() { badChannelMask = NULL; fdata = NULL; thisData = NULL; - ppFun = NULL; - ang = NULL; - val = NULL; - err = NULL; // slsDetectorActions @@ -913,12 +918,17 @@ void slsDetector::initializeMembers() { void slsDetector::initializeDetectorStructurePointers() { - // initialize with defaults - ffcoefficients?? - fferrors?? - sls_detector_module *thisMod; + sls_detector_module* thisMod; for (int imod = 0; imod < thisDetector->nModsMax; ++imod) { + // initializes the ffcoefficients values to 0 + for (int i = 0; i < thisDetector->nChans * thisDetector->nChips; ++i) { + *(ffcoefficients + i + thisDetector->nChans * thisDetector->nChips * imod) = 0; + } + // initializes the fferrors values to 0 + for (int i = 0; i < thisDetector->nChans * thisDetector->nChips; ++i) { + *(fferrors + i + thisDetector->nChans * thisDetector->nChips * imod) = 0; + } // set thisMod to point to one of the detector structure modules thisMod = detectorModules + imod; @@ -968,7 +978,7 @@ slsDetectorDefs::sls_detector_module* slsDetector::createModule() { } -slsDetectorDefs::sls_detector_module* slsDetector::createModule(detectorType t) { +slsDetectorDefs::sls_detector_module* slsDetector::createModule(detectorType type) { // get the detector parameters based on type detParameterList detlist; int nch = 0, nc = 0, nd = 0, na = 0; @@ -979,7 +989,7 @@ slsDetectorDefs::sls_detector_module* slsDetector::createModule(detectorType t) nd = detlist.nDacs; na = detlist.nAdcs; } catch(...) { - // FIXME do what here? + ;// FIXME do what here? } dacs_t *dacs=new dacs_t[nd]; dacs_t *adcs=new dacs_t[na]; @@ -1228,20 +1238,18 @@ int slsDetector::receiveModule(sls_detector_module* myMod) { } -detectorType slsDetector::getDetectorTypeFromShm(int multiId) { +slsReceiverDefs::detectorType slsDetector::getDetectorTypeFromShm(int multiId, bool verify) { SharedMemory* shm = new SharedMemory(multiId, detId); - std::string shmname = shm->GetName(); - // shm not created before - if (!SharedMemory::IsExisting(shmname)) { + if (!SharedMemory::IsExisting(shm->GetName())) { cprintf(RED,"Shared memory %s does not exist.\n" "Corrupted Multi Shared memory. Please free shared memory.\n", - shmname.c_str()); + shm->GetName().c_str()); throw SharedMemoryException(); } // map basic size of sls detector structure (no need of offsets, just version is required) - slsDetector* sdet = 0; + sharedSlsDetector* sdet = 0; size_t sz = sizeof(sharedSlsDetector); // open, map, verify version, get type @@ -1254,7 +1262,7 @@ detectorType slsDetector::getDetectorTypeFromShm(int multiId) { delete shm;/** is this unncessary? */ throw SharedMemoryException(); } - detectorType type = sdet->type; + detectorType type = sdet->myDetectorType; // unmap shm->UnmapSharedMemory(sdet); @@ -1376,7 +1384,7 @@ slsDetectorDefs::detectorType slsDetector::getDetectorsType(int pos) { return thisDetector->myDetectorType; } -string slsDetector::sgetDetectorsType(int pos=-1) { +string slsDetector::sgetDetectorsType(int pos) { return getDetectorType(getDetectorsType(pos)); } @@ -1581,11 +1589,11 @@ std::cout<< "nModX " << thisDetector->nMod[X] << " nModY " << thisDetector->nMod -int slsDetector::getChansPerMod(int imod=0) { +int slsDetector::getChansPerMod(int imod) { return thisDetector->nChans*thisDetector->nChips; } -int slsDetector::getChansPerMod( dimension d,int imod=0) { +int slsDetector::getChansPerMod( dimension d,int imod) { return thisDetector->nChan[d]*thisDetector->nChip[d]; } @@ -2545,8 +2553,8 @@ int slsDetector::writeConfigurationFile(ofstream &outfile, int id) { } -f - int nsig=4;//-1; + + int nsig=4; int iv=0; char *args[100]; char myargs[100][1000]; @@ -4418,8 +4426,8 @@ int slsDetector::setDynamicRange(int n) { } if(thisDetector->myDetectorType==MYTHEN){ if (thisDetector->timerValue[PROBES_NUMBER]!=0) { - thisDetector->dataBytes=thisDetector->nMod[X]*t - hisDetector->nMod[Y]*thisDetector->nChips*thisDetector->nChans*4; + thisDetector->dataBytes=thisDetector->nMod[X]* + thisDetector->nMod[Y]*thisDetector->nChips*thisDetector->nChans*4; thisDetector->dataBytesInclGapPixels = (thisDetector->nMod[X] * thisDetector->nChip[X] * thisDetector->nChan[X] + thisDetector->gappixels * @@ -6169,15 +6177,12 @@ int slsDetector::activate(int const enable) { - -int slsDetector::getFlippedData(dimension d=X) { +int slsDetector::getFlippedData(dimension d) { return thisDetector->flippedData[d]; } - - int slsDetector::setFlippedData(dimension d, int value) { int retval=-1; int fnum=F_SET_FLIPPED_DATA_RECEIVER; @@ -6335,8 +6340,7 @@ int slsDetector::enableGapPixels(int val) { -int slsDetector::setTrimEn(int nen, int *en=NULL) { -{ +int slsDetector::setTrimEn(int nen, int *en) { if (en) { for (int ien=0; ientrimEnergies[ien]=en[ien]; @@ -6346,12 +6350,12 @@ int slsDetector::setTrimEn(int nen, int *en=NULL) { } -int slsDetector::getTrimEn(int *en=NULL) { +int slsDetector::getTrimEn(int *en) { if (en) { for (int ien=0; iennTrimEn; ien++) en[ien]=thisDetector->trimEnergies[ien]; } - return (thisDetector->nTrimEn);}; + return (thisDetector->nTrimEn); } @@ -8136,7 +8140,7 @@ int slsDetector::getAngularConversion(int &direction, angleConversionConstant * -angleConversionConstant* slsDetector::getAngularConversionPointer(int imod=0) { +angleConversionConstant* slsDetector::getAngularConversionPointer(int imod) { return &thisDetector->angOff[imod]; } @@ -8738,7 +8742,7 @@ slsReceiverDefs::fileFormat slsDetector::setFileFormat(fileFormat f) { -fileFormat slsDetector::getFileFormat() { +slsReceiverDefs::fileFormat slsDetector::getFileFormat() { return setFileFormat(); } @@ -9141,7 +9145,7 @@ int slsDetector::setReceiverReadTimer(int time_in_ms) { } -int slsDetector::enableDataStreamingToClient(int enable=-1) { +int slsDetector::enableDataStreamingToClient(int enable) { cprintf(RED,"ERROR: Must be called from the multi Detector level\n"); return 0; } diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index 4f9638f6b..74cf16dd3 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -390,7 +390,7 @@ public: * @param verify true to verify if shared memory version matches existing one * @param m multiSlsDetector reference */ - slsDetector(detectorType type, int multiId = 0, int id = 0, bool verify = true, MultiDet* m = NULL); + slsDetector(detectorType type, int multiId = 0, int id = 0, bool verify = true, multiSlsDetector* m = NULL); /** * Constructor called when opening existing shared memory @@ -399,7 +399,7 @@ public: * @param verify true to verify if shared memory version matches existing one * @param m multiSlsDetector reference */ - slsDetector(int multiId = 0, int id = 0, bool verify = true, MultiDet* m = NULL); + slsDetector(int multiId = 0, int id = 0, bool verify = true, multiSlsDetector* m = NULL); /** * Destructor @@ -484,7 +484,7 @@ public: /** * Sets the hostname of all sls detectors in shared memory * Connects to them to set up online flag - * @param s hostname + * @param name hostname */ void setHostname(const char *name); @@ -495,6 +495,39 @@ public: */ string getHostname(int pos = -1); + /** + * Connect to the control port + * @returns OK, FAIL or undefined + */ + int connectControl(); + + /** + * Disconnect the control port + */ + void disconnectControl(); + + /** + * Connect to the data port + * @returns OK, FAIL or undefined + */ + int connectData(); + + /** + * Disconnect the data port + */ + void disconnectData(); + + /** + * Connect to the stop port + * @returns OK, FAIL or undefined + */ + int connectStop(); + + /** + * Disconnect the stop port + */ + void disconnectStop(); + /** * Get detector type by connecting to the detector without creating an object * @param name hostname of detector @@ -1195,6 +1228,153 @@ public: */ string getNetworkParameter(networkParameter index); + /** + * Returns the detector MAC address\sa sharedSlsDetector + * @returns the detector MAC address + */ + string getDetectorMAC(); + + /** + * Returns the detector IP address\sa sharedSlsDetector + * @returns the detector IP address + */ + string getDetectorIP(); + + /** + * Returns the receiver IP address\sa sharedSlsDetector + * @returns the receiver IP address + */ + string getReceiver(); + + /** + * Returns the receiver UDP IP address\sa sharedSlsDetector + * @returns the receiver UDP IP address + */ + string getReceiverUDPIP(); + + /** + * Returns the receiver UDP MAC address\sa sharedSlsDetector + * @returns the receiver UDP MAC address + */ + string getReceiverUDPMAC(); + + /** + * Returns the receiver UDP port\sa sharedSlsDetector + * @returns the receiver UDP port + */ + string getReceiverUDPPort(); + + /** + * Returns the receiver UDP port 2 of same interface\sa sharedSlsDetector + * @returns the receiver UDP port 2 of same interface + */ + string getReceiverUDPPort2(); + + /** + * Returns the client zmq port \sa sharedSlsDetector + * @returns the client zmq port + */ + string getClientStreamingPort(); + + /** + * Returns the receiver zmq port \sa sharedSlsDetector + * @returns the receiver zmq port + */ + string getReceiverStreamingPort(); + + /** + * Returns the client zmq ip \sa sharedSlsDetector + * @returns the client zmq ip, returns "none" if default setting and no custom ip set + */ + string getClientStreamingIP(); + + /** + * Returns the receiver zmq ip \sa sharedSlsDetector + * @returns the receiver zmq ip, returns "none" if default setting and no custom ip set + */ + string getReceiverStreamingIP(); + + /** + * Validates the format of the detector MAC address and sets it \sa sharedSlsDetector + * @param detectorMAC detector MAC address + * @returns the detector MAC address + */ + string setDetectorMAC(string detectorMAC); + + /** + * Validates the format of the detector IP address and sets it \sa sharedSlsDetector + * @param detectorIP detector IP address + * @returns the detector IP address + */ + string setDetectorIP(string detectorIP); + + /** + * Validates and sets the receiver. + * Also updates the receiver with all the shared memory parameters significant for the receiver + * Also configures the detector to the receiver as UDP destination + * @param receiver receiver hostname or IP address + * @returns the receiver IP address from shared memory + */ + string setReceiver(string receiver); + + /** + * Validates the format of the receiver UDP IP address and sets it \sa sharedSlsDetector + * @param udpip receiver UDP IP address + * @returns the receiver UDP IP address + */ + string setReceiverUDPIP(string udpip); + + /** + * Validates the format of the receiver UDP MAC address and sets it \sa sharedSlsDetector + * @param udpmac receiver UDP MAC address + * @returns the receiver UDP MAC address + */ + string setReceiverUDPMAC(string udpmac); + + /** + * Sets the receiver UDP port\sa sharedSlsDetector + * @param udpport receiver UDP port + * @returns the receiver UDP port + */ + int setReceiverUDPPort(int udpport); + + /** + * Sets the receiver UDP port 2\sa sharedSlsDetector + * @param udpport receiver UDP port 2 + * @returns the receiver UDP port 2 + */ + int setReceiverUDPPort2(int udpport); + + /** + * Sets the client zmq port\sa sharedSlsDetector + * @param port client zmq port (includes "multi" at the end if it should + * calculate individual ports) + * @returns the client zmq port + */ + string setClientStreamingPort(string port); + + /** + * Sets the receiver zmq port\sa sharedSlsDetector + * @param port receiver zmq port (includes "multi" at the end if it should + * calculate individual ports) + * @returns the receiver zmq port + */ + string setReceiverStreamingPort(string port); + + /** + * Sets the client zmq ip\sa sharedSlsDetector + * @param sourceIP client zmq ip + * @returns the client zmq ip, returns "none" if default setting and no custom ip set + */ + string setClientStreamingIP(string sourceIP); + + /** + * Sets the receiver zmq ip\sa sharedSlsDetector + * @param sourceIP receiver zmq ip. If empty, uses rx_hostname + * @returns the receiver zmq ip, returns "none" if default setting and no custom ip set + */ + string setReceiverStreamingIP(string sourceIP); + /** * Execute a digital test (Gotthard, Mythen) * @param mode testmode type @@ -1310,7 +1490,7 @@ public: * @param d axis across which data is flipped * @returns 1 for flipped, else 0 */ - int getFlippedData(dimension d=X){return thisDetector->flippedData[d];}; + int getFlippedData(dimension d=X); /** * Sets the enable which determines if @@ -1831,7 +2011,7 @@ public: * Returns file index * @returns file index */ - int getFileIndex(){return setFileIndex();}; + int getFileIndex(); /** * Sets up the file index @@ -2080,10 +2260,10 @@ private: /** * Allocates the memory for a sls_detector_module structure and initializes it * Has detector type - * @param myDetectorType detector type + * @param type detector type * @returns myMod the pointer to the allocate dmemory location */ - sls_detector_module* createModule(detectorType myDetectorType); + sls_detector_module* createModule(detectorType type); /** * Frees the memory for a sls_detector_module structure @@ -2091,39 +2271,6 @@ private: */ void deleteModule(sls_detector_module *myMod); - /** - * Connect to the control port - * @returns OK, FAIL or undefined - */ - int connectControl(); - - /** - * Disconnect the control port - */ - void disconnectControl(); - - /** - * Connect to the data port - * @returns OK, FAIL or undefined - */ - int connectData(); - - /** - * Disconnect the data port - */ - int disconnectData(); - - /** - * Connect to the stop port - * @returns OK, FAIL or undefined - */ - int connectStop(); - - /** - * Disconnect the stop port - */ - int disconnectStop(); - /** * Send a sls_detector_channel structure over socket * @param myChan channel structure to send @@ -2166,72 +2313,6 @@ private: */ int receiveModule(sls_detector_module* myMod); - /** - * Returns the detector MAC address\sa sharedSlsDetector - * @returns the detector MAC address - */ - string getDetectorMAC(); - - /** - * Returns the detector IP address\sa sharedSlsDetector - * @returns the detector IP address - */ - string getDetectorIP(); - - /** - * Returns the receiver IP address\sa sharedSlsDetector - * @returns the receiver IP address - */ - string getReceiver(); - - /** - * Returns the receiver UDP IP address\sa sharedSlsDetector - * @returns the receiver UDP IP address - */ - string getReceiverUDPIP(); - - /** - * Returns the receiver UDP MAC address\sa sharedSlsDetector - * @returns the receiver UDP MAC address - */ - string getReceiverUDPMAC(); - - /** - * Returns the receiver UDP port\sa sharedSlsDetector - * @returns the receiver UDP port - */ - string getReceiverUDPPort(); - - /** - * Returns the receiver UDP port 2 of same interface\sa sharedSlsDetector - * @returns the receiver UDP port 2 of same interface - */ - string getReceiverUDPPort2(); - - /** - * Returns the client zmq port \sa sharedSlsDetector - * @returns the client zmq port - */ - string getClientStreamingPort(); - - /** - * Returns the receiver zmq port \sa sharedSlsDetector - * @returns the receiver zmq port - */ - string getReceiverStreamingPort(); - - /** - * Returns the client zmq ip \sa sharedSlsDetector - * @returns the client zmq ip, returns "none" if default setting and no custom ip set - */ - string getClientStreamingIP(); - - /** - * Returns the receiver zmq ip \sa sharedSlsDetector - * @returns the receiver zmq ip, returns "none" if default setting and no custom ip set - */ - string getReceiverStreamingIP(); - /** * Returns the additional json header \sa sharedSlsDetector * @returns the additional json header, returns "none" if default setting and no custom ip set @@ -2250,87 +2331,6 @@ private: */ string getReceiverRealUDPSocketBufferSize(); - /** - * Validates the format of the detector MAC address and sets it \sa sharedSlsDetector - * @param detectorMAC detector MAC address - * @returns the detector MAC address - */ - string setDetectorMAC(string detectorMAC); - - /** - * Validates the format of the detector IP address and sets it \sa sharedSlsDetector - * @param detectorIP detector IP address - * @returns the detector IP address - */ - string setDetectorIP(string detectorIP); - - /** - * Validates and sets the receiver. - * Also updates the receiver with all the shared memory parameters significant for the receiver - * Also configures the detector to the receiver as UDP destination - * @param receiver receiver hostname or IP address - * @returns the receiver IP address from shared memory - */ - string setReceiver(string receiver); - - /** - * Validates the format of the receiver UDP IP address and sets it \sa sharedSlsDetector - * @param udpip receiver UDP IP address - * @returns the receiver UDP IP address - */ - string setReceiverUDPIP(string udpip); - - /** - * Validates the format of the receiver UDP MAC address and sets it \sa sharedSlsDetector - * @param udpmac receiver UDP MAC address - * @returns the receiver UDP MAC address - */ - string setReceiverUDPMAC(string udpmac); - - /** - * Sets the receiver UDP port\sa sharedSlsDetector - * @param udpport receiver UDP port - * @returns the receiver UDP port - */ - int setReceiverUDPPort(int udpport); - - /** - * Sets the receiver UDP port 2\sa sharedSlsDetector - * @param udpport receiver UDP port 2 - * @returns the receiver UDP port 2 - */ - int setReceiverUDPPort2(int udpport); - - /** - * Sets the client zmq port\sa sharedSlsDetector - * @param port client zmq port (includes "multi" at the end if it should - * calculate individual ports) - * @returns the client zmq port - */ - string setClientStreamingPort(string port); - - /** - * Sets the receiver zmq port\sa sharedSlsDetector - * @param port receiver zmq port (includes "multi" at the end if it should - * calculate individual ports) - * @returns the receiver zmq port - */ - string setReceiverStreamingPort(string port); - - /** - * Sets the client zmq ip\sa sharedSlsDetector - * @param sourceIP client zmq ip - * @returns the client zmq ip, returns "none" if default setting and no custom ip set - */ - string setClientStreamingIP(string sourceIP); - - /** - * Sets the receiver zmq ip\sa sharedSlsDetector - * @param sourceIP receiver zmq ip. If empty, uses rx_hostname - * @returns the receiver zmq ip, returns "none" if default setting and no custom ip set - */ - string setReceiverStreamingIP(string sourceIP); - /** * Sets the additional json header\sa sharedSlsDetector * @param jsonheader additional json header diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 2414c335a..c69d4771d 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -264,14 +264,14 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { ++i; /*! \page config - - \b add Adds a detector at the end of the multi-detector structure. \c put argument is the hostname or IP adress. Returns the chained list of detector hostnames. + - \b add Adds a detector at the end of the multi-detector structure. \c put argument is the hostname or IP adress. cannot get. \c Returns the current list of detector hostnames. \c (string) */ descrToFuncMap[i].m_pFuncName="add";//OK - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdd; + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdHostname; ++i; /*! \page config - - hostname \c put adds the hostname (ot IP adress) at the end of the multi-detector structure. If used for a single controlled (i:) replaces the current hostname. Returns the list of the hostnames of the multi-detector structure. \c Returns \c (string) + - hostname \c put frees shared memory and sets the hostname (or IP adress).\c Returns the list of the hostnames of the multi-detector structure. \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="hostname"; //OK descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdHostname; @@ -2697,7 +2697,7 @@ string slsDetectorCommand::helpFree(int narg, char *args[], int action) { } - +/* string slsDetectorCommand::cmdAdd(int narg, char *args[], int action) { #ifdef VERBOSE cout << string("Executing command ")+string(args[0])+string(" ( ")+cmd+string(" )\n"); @@ -2733,7 +2733,7 @@ string slsDetectorCommand::helpAdd(int narg, char *args[], int action){ "det can either be the detector hostname or the detector id. " "Returns hostnames in the multi detector structure\n"); } -/* + string slsDetectorCommand::cmdReplace(int narg, char *args[], int action){ #ifdef VERBOSE cout << string("Executing command ")+string(args[0])+string(" ( ")+cmd+string(" )\n"); @@ -2764,6 +2764,9 @@ string slsDetectorCommand::cmdHostname(int narg, char *args[], int action){ if (action==HELP_ACTION) { return helpHostname(narg,args,HELP_ACTION); } + if ((action==GET_ACTION) && (cmd == "add")) { + return string("cannot get"); + } if (action==PUT_ACTION) { @@ -2780,7 +2783,6 @@ string slsDetectorCommand::cmdHostname(int narg, char *args[], int action){ if(narg>2) strcat(hostname,"+"); } - myDet->freeSharedMemory(); myDet->setHostname(hostname); } @@ -2795,9 +2797,13 @@ string slsDetectorCommand::helpHostname(int narg, char *args[], int action){ ostringstream os; if (action==GET_ACTION || action==HELP_ACTION) os << string("hostname \t returns the hostname(s) of the detector structure."); - if (action==PUT_ACTION || action==HELP_ACTION) + if (action==PUT_ACTION || action==HELP_ACTION) { os << string("hostname name [name name]\t frees shared memory and " "configures the hostnames of the detector structure.\n"); + os << string ("add det [det det]\t appends a detector(s) to the multi detector structure. " + "det can either be the detector hostname or the detector id. " + "Returns hostnames in the multi detector structure\n"); + } return os.str(); } diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.h b/slsDetectorSoftware/slsDetector/slsDetectorCommand.h index 60568d8b3..2c61c7b59 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.h @@ -40,7 +40,7 @@ class slsDetectorCommand : public virtual slsDetectorDefs { static std::string helpStatus(int narg, char *args[], int action); static std::string helpDataStream(int narg, char *args[], int action); static std::string helpFree(int narg, char *args[], int action); - static std::string helpAdd(int narg, char *args[], int action); + // static std::string helpAdd(int narg, char *args[], int action); // static std::string helpReplace(int narg, char *args[], int action); static std::string helpHostname(int narg, char *args[], int action); static std::string helpMaster(int narg, char *args[], int action); @@ -112,7 +112,7 @@ class slsDetectorCommand : public virtual slsDetectorDefs { std::string cmdStatus(int narg, char *args[], int action); std::string cmdDataStream(int narg, char *args[], int action); std::string cmdFree(int narg, char *args[], int action); - std::string cmdAdd(int narg, char *args[], int action); + //std::string cmdAdd(int narg, char *args[], int action); //std::string cmdReplace(int narg, char *args[], int action); std::string cmdHostname(int narg, char *args[], int action); std::string cmdMaster(int narg, char *args[], int action); diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h index 6a677cfde..c38557523 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h @@ -204,10 +204,8 @@ class slsDetectorUtils : public slsDetectorActions, public postProcessing { /** sets the detector hostname \param name hostname - \param pos position in the multi detector structure (is -1 expects concatenated hostnames divided by a +) - \returns hostname */ - virtual std::string setHostname(const char* name, int pos=-1)=0; + virtual void setHostname(const char* name)=0; /** returns the detector type @@ -216,25 +214,6 @@ class slsDetectorUtils : public slsDetectorActions, public postProcessing { */ virtual std::string sgetDetectorsType(int pos=-1)=0; - - - - - /** Gets the detector id (shared memory id) of an slsDetector - \param i position in the multiSlsDetector structure - \return id or -1 if FAIL - */ - virtual int getDetectorId(int i=-1)=0; - - /** Sets the detector id (shared memory id) of an slsDetector in a multiSlsDetector structure - \param ival id to be set - \param i position in the multiSlsDetector structure - \return id or -1 if FAIL (e.g. in case of an slsDetector) - */ - virtual int setDetectorId(int ival, int i=-1){return -1;}; - - - /** gets the network parameters (implemented for gotthard) \param i network parameter type can be RECEIVER_IP, RECEIVER_MAC, SERVER_MAC @@ -415,7 +394,7 @@ class slsDetectorUtils : public slsDetectorActions, public postProcessing { virtual std::string setCalDir(std::string s)=0; /** Frees the shared memory - should not be used except for debugging*/ - virtual int freeSharedMemory()=0; + virtual void freeSharedMemory()=0; /** adds the detector with ID id in postion pos diff --git a/slsDetectorSoftware/slsDetectorAnalysis/fileIO.h b/slsDetectorSoftware/slsDetectorAnalysis/fileIO.h index 9d48e8622..2bc416991 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/fileIO.h +++ b/slsDetectorSoftware/slsDetectorAnalysis/fileIO.h @@ -160,14 +160,22 @@ class fileIO : public fileIOStatic, public virtual slsDetectorBase { \param i detector index to be set \returns actual detector index */ - virtual int setDetectorIndex(int i) {detIndex=i;return detIndex;}; + virtual int setDetectorIndex(int i) { + pthread_mutex_lock(&mf); + detIndex=i; + pthread_mutex_unlock(&mf); + return detIndex;}; /** sets the default file format \param i file format to be set \returns actual file frame format */ - virtual fileFormat setFileFormat(int i) {*fileFormatType=(fileFormat)i; return *fileFormatType;}; + virtual fileFormat setFileFormat(int i) { + pthread_mutex_lock(&mf); + *fileFormatType=(fileFormat)i; + pthread_mutex_unlock(&mf); + return *fileFormatType; };