From 85134443dea23f51d2dc7e0c0ec027a875d9104c Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Wed, 13 Mar 2019 16:29:29 +0100 Subject: [PATCH 1/4] initial --- .../slsDetector/slsDetector.cpp | 168 +++++++++--------- slsDetectorSoftware/slsDetector/slsDetector.h | 8 +- 2 files changed, 89 insertions(+), 87 deletions(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index e5225b0b3..1ba94cf25 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -41,8 +41,8 @@ slsDetector::slsDetector(detectorType type, int multiId, int id, bool verify) initSharedMemory(true, type, multiId, verify); initializeDetectorStructure(type); - initializeMembers(); - initializeDetectorStructurePointers(); + // initializeMembers(); + // initializeDetectorStructurePointers(); } slsDetector::slsDetector(int multiId, int id, bool verify) @@ -54,7 +54,7 @@ slsDetector::slsDetector(int multiId, int id, bool verify) detectorType type = getDetectorTypeFromShm(multiId, verify); initSharedMemory(false, type, multiId, verify); - initializeMembers(); + // initializeMembers(); } slsDetector::~slsDetector() { @@ -490,38 +490,38 @@ void slsDetector::initializeDetectorStructure(detectorType type) { void slsDetector::initializeMembers() { // slsdetector // assign addresses - char *goff = (char *)thisDetector; - detectorModules = (sls_detector_module *)(goff + thisDetector->modoff); - dacs = (int *)(goff + thisDetector->dacoff); - chanregs = (int *)(goff + thisDetector->chanoff); + // char *goff = (char *)thisDetector; + // detectorModules = (sls_detector_module *)(goff + thisDetector->modoff); + // dacs = (int *)(goff + thisDetector->dacoff); + // chanregs = (int *)(goff + thisDetector->chanoff); } void slsDetector::initializeDetectorStructurePointers() { - sls_detector_module *thisMod; + // sls_detector_module *thisMod; - // set thisMod to point to one of the detector structure modules - thisMod = detectorModules; + // // set thisMod to point to one of the detector structure modules + // thisMod = detectorModules; - thisMod->serialnumber = 0; - thisMod->nchan = thisDetector->nChans * thisDetector->nChips; - thisMod->nchip = thisDetector->nChips; - thisMod->ndac = thisDetector->nDacs; - thisMod->reg = 0; - thisMod->iodelay = 0; - thisMod->tau = 0; - thisMod->eV = 0; - // dacs and chanregs for thisMod is not allocated in - // detectorModules in shared memory as they are already allocated separately - // in shared memory (below) + // thisMod->serialnumber = 0; + // thisMod->nchan = thisDetector->nChans * thisDetector->nChips; + // thisMod->nchip = thisDetector->nChips; + // thisMod->ndac = thisDetector->nDacs; + // thisMod->reg = 0; + // thisMod->iodelay = 0; + // thisMod->tau = 0; + // thisMod->eV = 0; + // // dacs and chanregs for thisMod is not allocated in + // // detectorModules in shared memory as they are already allocated separately + // // in shared memory (below) - // initializes the dacs values to 0 - for (int i = 0; i < thisDetector->nDacs; ++i) { - *(dacs + i) = 0; - } - // initializes the channel registers to 0 - for (int i = 0; i < thisDetector->nChans * thisDetector->nChips; ++i) { - *(chanregs + i) = -1; - } + // // initializes the dacs values to 0 + // for (int i = 0; i < thisDetector->nDacs; ++i) { + // *(dacs + i) = 0; + // } + // // initializes the channel registers to 0 + // for (int i = 0; i < thisDetector->nChans * thisDetector->nChips; ++i) { + // *(chanregs + i) = -1; + // } } slsDetectorDefs::sls_detector_module *slsDetector::createModule() { @@ -1265,9 +1265,10 @@ std::string slsDetector::getSettingsFile() { return std::string(thisDetector->settingsFile); } -int slsDetector::writeSettingsFile(const std::string &fname) { - return writeSettingsFile(fname, detectorModules[0]); -} +// int slsDetector::writeSettingsFile(const std::string &fname) { +// //TODO should read module from detector... +// return writeSettingsFile(fname, getModule()); +// } slsDetectorDefs::detectorSettings slsDetector::getSettings() { return sendSettingsOnly(GET_SETTINGS); @@ -1591,8 +1592,8 @@ int slsDetector::saveSettingsFile(const std::string &fname) { // get module int ret = FAIL; - sls_detector_module *myMod = nullptr; - if ((myMod = getModule())) { + sls_detector_module *myMod = getModule(); + if (myMod != nullptr) { ret = writeSettingsFile(fn, *myMod); deleteModule(myMod); } @@ -3987,13 +3988,14 @@ int slsDetector::getChanRegs(double *retval) { int n = getTotalNumberOfChannels(); // update chanregs sls_detector_module *myMod = getModule(); - deleteModule(myMod); + //the original array has 0 initialized - if (chanregs) { + if (myMod->chanregs) { for (int i = 0; i < n; ++i) { - retval[i] = (double)(chanregs[i] & TRIMBITMASK); + retval[i] = (double)(myMod->chanregs[i] & TRIMBITMASK); } } + deleteModule(myMod); return n; } @@ -4035,26 +4037,26 @@ int slsDetector::setModule(sls_detector_module module, int tb) { // update client structure if (ret == OK) { - if (detectorModules) { - if (thisDetector->myDetectorType == EIGER && tb && chanregs) { - for (int ichip = 0; ichip < thisDetector->nChips; ++ichip) { - for (int i = 0; i < thisDetector->nChans; ++i) { - chanregs[i + ichip * thisDetector->nChans] = - module.chanregs[ichip * thisDetector->nChans + i]; - } - } - } - if (dacs) { - for (int i = 0; i < thisDetector->nDacs; ++i) { - dacs[i] = module.dacs[i]; - } - } - (detectorModules)->serialnumber = module.serialnumber; - (detectorModules)->reg = module.reg; - (detectorModules)->iodelay = module.iodelay; - (detectorModules)->tau = module.tau; - (detectorModules)->eV = module.eV; - } + // if (detectorModules) { + // if (thisDetector->myDetectorType == EIGER && tb && chanregs) { + // for (int ichip = 0; ichip < thisDetector->nChips; ++ichip) { + // for (int i = 0; i < thisDetector->nChans; ++i) { + // chanregs[i + ichip * thisDetector->nChans] = + // module.chanregs[ichip * thisDetector->nChans + i]; + // } + // } + // } + // if (dacs) { + // for (int i = 0; i < thisDetector->nDacs; ++i) { + // dacs[i] = module.dacs[i]; + // } + // } + // (detectorModules)->serialnumber = module.serialnumber; + // (detectorModules)->reg = module.reg; + // (detectorModules)->iodelay = module.iodelay; + // (detectorModules)->tau = module.tau; + // (detectorModules)->eV = module.eV; + // } if (module.eV != -1) { thisDetector->currentThresholdEV = module.eV; } @@ -4090,31 +4092,31 @@ slsDetectorDefs::sls_detector_module *slsDetector::getModule() { } // update client structure - if (ret == OK) { - if (detectorModules) { - if (thisDetector->myDetectorType == EIGER && chanregs) { - for (int ichip = 0; ichip < thisDetector->nChips; ++ichip) { - for (int i = 0; i < thisDetector->nChans; ++i) { - chanregs[i + ichip * thisDetector->nChans] = - myMod->chanregs[ichip * thisDetector->nChans + i]; - } - } - } - if (dacs) { - for (int i = 0; i < thisDetector->nDacs; ++i) { - dacs[i] = myMod->dacs[i]; - } - } - (detectorModules)->serialnumber = myMod->serialnumber; - (detectorModules)->reg = myMod->reg; - (detectorModules)->iodelay = myMod->iodelay; - (detectorModules)->tau = myMod->tau; - (detectorModules)->eV = myMod->eV; - } - } else { - deleteModule(myMod); - myMod = nullptr; - } + // if (ret == OK) { + // if (detectorModules) { + // if (thisDetector->myDetectorType == EIGER && chanregs) { + // for (int ichip = 0; ichip < thisDetector->nChips; ++ichip) { + // for (int i = 0; i < thisDetector->nChans; ++i) { + // chanregs[i + ichip * thisDetector->nChans] = + // myMod->chanregs[ichip * thisDetector->nChans + i]; + // } + // } + // } + // if (dacs) { + // for (int i = 0; i < thisDetector->nDacs; ++i) { + // dacs[i] = myMod->dacs[i]; + // } + // } + // (detectorModules)->serialnumber = myMod->serialnumber; + // (detectorModules)->reg = myMod->reg; + // (detectorModules)->iodelay = myMod->iodelay; + // (detectorModules)->tau = myMod->tau; + // (detectorModules)->eV = myMod->eV; + // } + // } else { + // deleteModule(myMod); + // myMod = nullptr; + // } return myMod; } @@ -5526,7 +5528,7 @@ slsDetectorDefs::sls_detector_module *slsDetector::readSettingsFile(const std::s return myMod; } -int slsDetector::writeSettingsFile(const std::string &fname, sls_detector_module mod) { +int slsDetector::writeSettingsFile(const std::string &fname, sls_detector_module& mod) { FILE_LOG(logDEBUG1) << "Write settings file " << fname; diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index 14bb12ff1..4095db4c6 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -1769,7 +1769,7 @@ class slsDetector : public virtual slsDetectorDefs, public virtual errorDefs { * @param mod module structure which has to be written to file * @returns OK or FAIL if the file could not be written */ - int writeSettingsFile(const std::string &fname, sls_detector_module mod); + int writeSettingsFile(const std::string &fname, sls_detector_module& mod); /** slsDetector Id or position in the detectors list */ int detId; @@ -1781,13 +1781,13 @@ class slsDetector : public virtual slsDetectorDefs, public virtual errorDefs { sharedSlsDetector *thisDetector{nullptr}; /** pointer to detector module structures in shared memory */ - sls_detector_module *detectorModules{nullptr}; + // sls_detector_module *detectorModules{nullptr}; /** pointer to dac valuse in shared memory */ - int *dacs{nullptr}; + // int *dacs{nullptr}; /** pointer to channel registers in shared memory */ - int *chanregs{nullptr}; + // int *chanregs{nullptr}; }; #endif From 9a08c85b2ae2eeb1548d4fef438a119f6559df33 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Wed, 13 Mar 2019 17:38:27 +0100 Subject: [PATCH 2/4] changed the shared memory of slsDetector --- integrationTests/src/test-slsDetector.cpp | 12 +- .../multiSlsDetector/multiSlsDetector.cpp | 256 +- .../multiSlsDetector/multiSlsDetector.h | 2 +- .../slsDetector/slsDetector.cpp | 2051 ++++++++--------- slsDetectorSoftware/slsDetector/slsDetector.h | 51 +- 5 files changed, 1110 insertions(+), 1262 deletions(-) diff --git a/integrationTests/src/test-slsDetector.cpp b/integrationTests/src/test-slsDetector.cpp index 20be3b22b..40a720c52 100644 --- a/integrationTests/src/test-slsDetector.cpp +++ b/integrationTests/src/test-slsDetector.cpp @@ -24,7 +24,7 @@ TEST_CASE("single EIGER detector no receiver basic set and get") { CHECK(type == type_enum); //Create slsDetector of said type and set hostname and detector online - auto d = slsDetector(type); + slsDetector d(type); CHECK(d.getDetectorTypeAsEnum() == type); CHECK(d.getDetectorTypeAsString() == type_string); @@ -79,7 +79,7 @@ TEST_CASE("Set control port then create a new object with this control port") { { auto type = slsDetector::getTypeFromDetector(hostname); CHECK(type == type_enum); - auto d = slsDetector(type); + slsDetector d(type); d.setHostname(hostname); d.setOnline(true); CHECK(d.getControlPort() == old_cport); @@ -91,7 +91,7 @@ TEST_CASE("Set control port then create a new object with this control port") { { auto type = slsDetector::getTypeFromDetector(hostname, new_cport); CHECK(type == type_enum); - auto d = slsDetector(type); + slsDetector d(type); d.setHostname(hostname); d.setControlPort(new_cport); d.setStopPort(new_sport); @@ -108,7 +108,7 @@ TEST_CASE("Set control port then create a new object with this control port") { auto type = slsDetector::getTypeFromDetector(hostname); CHECK(type == type_enum); - auto d = slsDetector(type); + slsDetector d(type); d.setHostname(hostname); d.setOnline(true); CHECK(d.getStopPort() == DEFAULT_PORTNO + 1); @@ -116,7 +116,7 @@ TEST_CASE("Set control port then create a new object with this control port") { TEST_CASE("Locking mechanism and last ip") { auto type = slsDetector::getTypeFromDetector(hostname); - auto d = slsDetector(type); + slsDetector d(type); d.setHostname(hostname); d.setOnline(true); @@ -160,7 +160,7 @@ TEST_CASE("Excersise all possible set timer functions") { // MAX_TIMERS auto type = slsDetector::getTypeFromDetector(hostname); - auto d = slsDetector(type); + slsDetector d(type); d.setHostname(hostname); d.setOnline(true); diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index cd9f77b0d..c861de4a6 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -192,21 +192,21 @@ void multiSlsDetector::setErrorMaskFromAllDetectors() { } void multiSlsDetector::setAcquiringFlag(bool b) { - sharedMemory()->acquiringFlag = b; + multi_shm()->acquiringFlag = b; } bool multiSlsDetector::getAcquiringFlag() const { - return sharedMemory()->acquiringFlag; + return multi_shm()->acquiringFlag; } bool multiSlsDetector::isAcquireReady() { - if (sharedMemory()->acquiringFlag) { + if (multi_shm()->acquiringFlag) { FILE_LOG(logWARNING) << "Acquire has already started. " "If previous acquisition terminated unexpectedly, " "reset busy flag to restart.(sls_detector_put busy 0)"; return FAIL; } - sharedMemory()->acquiringFlag = true; + multi_shm()->acquiringFlag = true; return OK; } @@ -276,7 +276,7 @@ void multiSlsDetector::freeSharedMemory(int detPos) { detectors.clear(); // clear multi detector shm - sharedMemory.RemoveSharedMemory(); + multi_shm.RemoveSharedMemory(); client_downstream = false; } @@ -292,56 +292,56 @@ std::string multiSlsDetector::getUserDetails() { sstream << d->getDetectorTypeAsString() << "+"; } - sstream << "\nPID: " << sharedMemory()->lastPID - << "\nUser: " << sharedMemory()->lastUser - << "\nDate: " << sharedMemory()->lastDate << std::endl; + sstream << "\nPID: " << multi_shm()->lastPID + << "\nUser: " << multi_shm()->lastUser + << "\nDate: " << multi_shm()->lastDate << std::endl; return sstream.str(); } /* - * pre: sharedMemory=0, sharedMemory() = 0, detectors.size() = 0 + * pre: multi_shm=0, multi_shm() = 0, detectors.size() = 0 */ void multiSlsDetector::initSharedMemory(bool verify) { - sharedMemory = SharedMemory(detId, -1); - if (!sharedMemory.IsExisting()) { - sharedMemory.CreateSharedMemory(); + multi_shm = SharedMemory(detId, -1); + if (!multi_shm.IsExisting()) { + multi_shm.CreateSharedMemory(); initializeDetectorStructure(); } else { - sharedMemory.OpenSharedMemory(); - if (verify && sharedMemory()->shmversion != MULTI_SHMVERSION) { + multi_shm.OpenSharedMemory(); + if (verify && multi_shm()->shmversion != MULTI_SHMVERSION) { FILE_LOG(logERROR) << "Multi shared memory (" << detId << ") version mismatch " "(expected 0x" - << std::hex << MULTI_SHMVERSION << " but got 0x" << sharedMemory()->shmversion << std::dec; + << std::hex << MULTI_SHMVERSION << " but got 0x" << multi_shm()->shmversion << std::dec; throw SharedMemoryException(); } } } void multiSlsDetector::initializeDetectorStructure() { - sharedMemory()->shmversion = MULTI_SHMVERSION; - sharedMemory()->numberOfDetectors = 0; - sharedMemory()->numberOfDetector[X] = 0; - sharedMemory()->numberOfDetector[Y] = 0; - sharedMemory()->onlineFlag = 1; - sharedMemory()->stoppedFlag = 0; - sharedMemory()->dataBytes = 0; - sharedMemory()->dataBytesInclGapPixels = 0; - sharedMemory()->numberOfChannels = 0; - sharedMemory()->numberOfChannel[X] = 0; - sharedMemory()->numberOfChannel[Y] = 0; - sharedMemory()->numberOfChannelInclGapPixels[X] = 0; - sharedMemory()->numberOfChannelInclGapPixels[Y] = 0; - sharedMemory()->maxNumberOfChannelsPerDetector[X] = 0; - sharedMemory()->maxNumberOfChannelsPerDetector[Y] = 0; - for (int64_t &i : sharedMemory()->timerValue) { + multi_shm()->shmversion = MULTI_SHMVERSION; + multi_shm()->numberOfDetectors = 0; + multi_shm()->numberOfDetector[X] = 0; + multi_shm()->numberOfDetector[Y] = 0; + multi_shm()->onlineFlag = 1; + multi_shm()->stoppedFlag = 0; + multi_shm()->dataBytes = 0; + multi_shm()->dataBytesInclGapPixels = 0; + multi_shm()->numberOfChannels = 0; + multi_shm()->numberOfChannel[X] = 0; + multi_shm()->numberOfChannel[Y] = 0; + multi_shm()->numberOfChannelInclGapPixels[X] = 0; + multi_shm()->numberOfChannelInclGapPixels[Y] = 0; + multi_shm()->maxNumberOfChannelsPerDetector[X] = 0; + multi_shm()->maxNumberOfChannelsPerDetector[Y] = 0; + for (int64_t &i : multi_shm()->timerValue) { i = 0; } - sharedMemory()->acquiringFlag = false; - sharedMemory()->receiverOnlineFlag = OFFLINE_FLAG; - sharedMemory()->receiver_upstream = false; + multi_shm()->acquiringFlag = false; + multi_shm()->receiverOnlineFlag = OFFLINE_FLAG; + multi_shm()->receiver_upstream = false; } void multiSlsDetector::initializeMembers(bool verify) { @@ -349,7 +349,7 @@ void multiSlsDetector::initializeMembers(bool verify) { zmqSocket.clear(); // get objects from single det shared memory (open) - for (int i = 0; i < sharedMemory()->numberOfDetectors; i++) { + for (int i = 0; i < multi_shm()->numberOfDetectors; i++) { try { detectors.push_back( sls::make_unique(detId, i, verify)); @@ -364,15 +364,15 @@ void multiSlsDetector::initializeMembers(bool verify) { } void multiSlsDetector::updateUserdetails() { - sharedMemory()->lastPID = getpid(); - memset(sharedMemory()->lastUser, 0, SHORT_STRING_LENGTH); - memset(sharedMemory()->lastDate, 0, SHORT_STRING_LENGTH); + multi_shm()->lastPID = getpid(); + memset(multi_shm()->lastUser, 0, SHORT_STRING_LENGTH); + memset(multi_shm()->lastDate, 0, SHORT_STRING_LENGTH); try { - sls::strcpy_safe(sharedMemory()->lastUser, exec("whoami").c_str()); - sls::strcpy_safe(sharedMemory()->lastDate, exec("date").c_str()); + sls::strcpy_safe(multi_shm()->lastUser, exec("whoami").c_str()); + sls::strcpy_safe(multi_shm()->lastDate, exec("date").c_str()); } catch (...) { - sls::strcpy_safe(sharedMemory()->lastUser, "errorreading"); - sls::strcpy_safe(sharedMemory()->lastDate, "errorreading"); + sls::strcpy_safe(multi_shm()->lastUser, "errorreading"); + sls::strcpy_safe(multi_shm()->lastDate, "errorreading"); } } @@ -408,7 +408,7 @@ void multiSlsDetector::setHostname(const char *name, int detPos) { // multi // this check is there only to allow the previous detsizechan command - if (sharedMemory()->numberOfDetectors) { + if (multi_shm()->numberOfDetectors) { FILE_LOG(logWARNING) << "There are already detector(s) in shared memory." "Freeing Shared memory now."; freeSharedMemory(); @@ -461,11 +461,11 @@ void multiSlsDetector::addSlsDetector(const std::string &hostname) { int pos = (int)detectors.size(); detectors.push_back(sls::make_unique(type, detId, pos, false)); - sharedMemory()->numberOfDetectors = detectors.size(); - sharedMemory()->dataBytes += detectors[pos]->getDataBytes(); - sharedMemory()->dataBytesInclGapPixels += + multi_shm()->numberOfDetectors = detectors.size(); + multi_shm()->dataBytes += detectors[pos]->getDataBytes(); + multi_shm()->dataBytesInclGapPixels += detectors[pos]->getDataBytesInclGapPixels(); - sharedMemory()->numberOfChannels += + multi_shm()->numberOfChannels += detectors[pos]->getTotalNumberOfChannels(); detectors[pos]->setHostname(hostname); @@ -499,12 +499,12 @@ int multiSlsDetector::getNumberOfDetectors() const { } int multiSlsDetector::getNumberOfDetectors(dimension d) const { - return sharedMemory()->numberOfDetector[d]; + return multi_shm()->numberOfDetector[d]; } void multiSlsDetector::getNumberOfDetectors(int &nx, int &ny) const { - nx = sharedMemory()->numberOfDetector[X]; - ny = sharedMemory()->numberOfDetector[Y]; + nx = multi_shm()->numberOfDetector[X]; + ny = multi_shm()->numberOfDetector[Y]; } int multiSlsDetector::getTotalNumberOfChannels(int detPos) { @@ -514,7 +514,7 @@ int multiSlsDetector::getTotalNumberOfChannels(int detPos) { } // multi - return sharedMemory()->numberOfChannels; + return multi_shm()->numberOfChannels; } int multiSlsDetector::getTotalNumberOfChannels(dimension d, int detPos) { @@ -524,7 +524,7 @@ int multiSlsDetector::getTotalNumberOfChannels(dimension d, int detPos) { } // multi - return sharedMemory()->numberOfChannel[d]; + return multi_shm()->numberOfChannel[d]; } int multiSlsDetector::getTotalNumberOfChannelsInclGapPixels(dimension d, @@ -535,16 +535,16 @@ int multiSlsDetector::getTotalNumberOfChannelsInclGapPixels(dimension d, } // multi - return sharedMemory()->numberOfChannelInclGapPixels[d]; + return multi_shm()->numberOfChannelInclGapPixels[d]; } int multiSlsDetector::getMaxNumberOfChannelsPerDetector(dimension d) { - return sharedMemory()->maxNumberOfChannelsPerDetector[d]; + return multi_shm()->maxNumberOfChannelsPerDetector[d]; } int multiSlsDetector::setMaxNumberOfChannelsPerDetector(dimension d, int i) { - sharedMemory()->maxNumberOfChannelsPerDetector[d] = i; - return sharedMemory()->maxNumberOfChannelsPerDetector[d]; + multi_shm()->maxNumberOfChannelsPerDetector[d] = i; + return multi_shm()->maxNumberOfChannelsPerDetector[d]; } int multiSlsDetector::getDetectorOffset(dimension d, int detPos) { @@ -559,22 +559,22 @@ void multiSlsDetector::updateOffsets() { FILE_LOG(logDEBUG1) << "Updating Multi-Detector Offsets"; int offsetX = 0, offsetY = 0, numX = 0, numY = 0; - int maxChanX = sharedMemory()->maxNumberOfChannelsPerDetector[X]; - int maxChanY = sharedMemory()->maxNumberOfChannelsPerDetector[Y]; + int maxChanX = multi_shm()->maxNumberOfChannelsPerDetector[X]; + int maxChanY = multi_shm()->maxNumberOfChannelsPerDetector[Y]; int prevChanX = 0; int prevChanY = 0; bool firstTime = true; - sharedMemory()->numberOfChannel[X] = 0; - sharedMemory()->numberOfChannel[Y] = 0; - sharedMemory()->numberOfDetector[X] = 0; - sharedMemory()->numberOfDetector[Y] = 0; + multi_shm()->numberOfChannel[X] = 0; + multi_shm()->numberOfChannel[Y] = 0; + multi_shm()->numberOfDetector[X] = 0; + multi_shm()->numberOfDetector[Y] = 0; // gap pixels int offsetX_gp = 0, offsetY_gp = 0, numX_gp = 0, numY_gp = 0; int prevChanX_gp = 0, prevChanY_gp = 0; - sharedMemory()->numberOfChannelInclGapPixels[X] = 0; - sharedMemory()->numberOfChannelInclGapPixels[Y] = 0; + multi_shm()->numberOfChannelInclGapPixels[X] = 0; + multi_shm()->numberOfChannelInclGapPixels[Y] = 0; for (size_t idet = 0; idet < detectors.size(); ++idet) { FILE_LOG(logDEBUG1) << "offsetX:" << offsetX << " prevChanX:" << prevChanX << " offsetY:" << offsetY << " prevChanY:" << prevChanY << " offsetX_gp:" << offsetX_gp << " prevChanX_gp:" << prevChanX_gp << " offsetY_gp:" << offsetY_gp << " prevChanY_gp:" << prevChanY_gp; @@ -607,8 +607,8 @@ void multiSlsDetector::updateOffsets() { detectors[idet]->getTotalNumberOfChannelsInclGapPixels(X); numY_gp += detectors[idet]->getTotalNumberOfChannelsInclGapPixels(Y); - ++sharedMemory()->numberOfDetector[X]; - ++sharedMemory()->numberOfDetector[Y]; + ++multi_shm()->numberOfDetector[X]; + ++multi_shm()->numberOfDetector[Y]; FILE_LOG(logDEBUG1) << "incrementing in both direction"; } @@ -626,8 +626,8 @@ void multiSlsDetector::updateOffsets() { numY_gp += detectors[idet]->getTotalNumberOfChannelsInclGapPixels(Y); // increment in y again only in the first column (else you double increment) - if (sharedMemory()->numberOfDetector[X] == 1) - ++sharedMemory()->numberOfDetector[Y]; + if (multi_shm()->numberOfDetector[X] == 1) + ++multi_shm()->numberOfDetector[Y]; FILE_LOG(logDEBUG1) << "incrementing in y direction"; } @@ -656,7 +656,7 @@ void multiSlsDetector::updateOffsets() { numX += detectors[idet]->getTotalNumberOfChannels(X); numX_gp += detectors[idet]->getTotalNumberOfChannelsInclGapPixels(X); - ++sharedMemory()->numberOfDetector[X]; + ++multi_shm()->numberOfDetector[X]; FILE_LOG(logDEBUG1) << "incrementing in x direction"; } @@ -674,28 +674,28 @@ void multiSlsDetector::updateOffsets() { << detectors[idet]->getDetectorOffset(Y) << ")"; // offsetY has been reset sometimes and offsetX the first time, // but remember the highest values - if (numX > sharedMemory()->numberOfChannel[X]) { - sharedMemory()->numberOfChannel[X] = numX; + if (numX > multi_shm()->numberOfChannel[X]) { + multi_shm()->numberOfChannel[X] = numX; } - if (numY > sharedMemory()->numberOfChannel[Y]) { - sharedMemory()->numberOfChannel[Y] = numY; + if (numY > multi_shm()->numberOfChannel[Y]) { + multi_shm()->numberOfChannel[Y] = numY; } - if (numX_gp > sharedMemory()->numberOfChannelInclGapPixels[X]) { - sharedMemory()->numberOfChannelInclGapPixels[X] = numX_gp; + if (numX_gp > multi_shm()->numberOfChannelInclGapPixels[X]) { + multi_shm()->numberOfChannelInclGapPixels[X] = numX_gp; } - if (numY_gp > sharedMemory()->numberOfChannelInclGapPixels[Y]) { - sharedMemory()->numberOfChannelInclGapPixels[Y] = numY_gp; + if (numY_gp > multi_shm()->numberOfChannelInclGapPixels[Y]) { + multi_shm()->numberOfChannelInclGapPixels[Y] = numY_gp; } } - FILE_LOG(logDEBUG1) << "\n\tNumber of Channels in X direction:" << sharedMemory()->numberOfChannel[X] << "\n\tNumber of Channels in Y direction:" << sharedMemory()->numberOfChannel[Y] << "\n\tNumber of Channels in X direction with Gap Pixels:" << sharedMemory()->numberOfChannelInclGapPixels[X] << "\n\tNumber of Channels in Y direction with Gap Pixels:" << sharedMemory()->numberOfChannelInclGapPixels[Y]; + FILE_LOG(logDEBUG1) << "\n\tNumber of Channels in X direction:" << multi_shm()->numberOfChannel[X] << "\n\tNumber of Channels in Y direction:" << multi_shm()->numberOfChannel[Y] << "\n\tNumber of Channels in X direction with Gap Pixels:" << multi_shm()->numberOfChannelInclGapPixels[X] << "\n\tNumber of Channels in Y direction with Gap Pixels:" << multi_shm()->numberOfChannelInclGapPixels[Y]; - sharedMemory()->numberOfChannels = - sharedMemory()->numberOfChannel[0] * - sharedMemory()->numberOfChannel[1]; + multi_shm()->numberOfChannels = + multi_shm()->numberOfChannel[0] * + multi_shm()->numberOfChannel[1]; for (auto &d : detectors) { - d->updateMultiSize(sharedMemory()->numberOfDetector[0], - sharedMemory()->numberOfDetector[1]); + d->updateMultiSize(multi_shm()->numberOfDetector[0], + multi_shm()->numberOfDetector[1]); } } @@ -708,9 +708,9 @@ int multiSlsDetector::setOnline(int value, int detPos) { // multi if (value != GET_ONLINE_FLAG) { auto r = parallelCall(&slsDetector::setOnline, value); - sharedMemory()->onlineFlag = sls::minusOneIfDifferent(r); + multi_shm()->onlineFlag = sls::minusOneIfDifferent(r); } - return sharedMemory()->onlineFlag; + return multi_shm()->onlineFlag; } std::string multiSlsDetector::checkOnline(int detPos) { @@ -1062,12 +1062,12 @@ int multiSlsDetector::stopAcquisition(int detPos) { if (detPos >= 0) { // if only 1 detector, set flag to stop current acquisition if (detectors.size() == 1) { - sharedMemory()->stoppedFlag = 1; + multi_shm()->stoppedFlag = 1; } return detectors[detPos]->stopAcquisition(); } else { - sharedMemory()->stoppedFlag = 1; + multi_shm()->stoppedFlag = 1; auto r = parallelCall(&slsDetector::stopAcquisition); return sls::allEqualTo(r, static_cast(OK)) ? OK : FAIL; } @@ -1154,7 +1154,7 @@ int64_t multiSlsDetector::setTimer(timerIndex index, int64_t t, int detPos) { << "Cannot set number of frames, cycles, " "storage cells or measurements individually."; setErrorMask(getErrorMask() | MUST_BE_MULTI_CMD); - return sharedMemory()->timerValue[index]; + return multi_shm()->timerValue[index]; default: break; } @@ -1185,7 +1185,7 @@ int64_t multiSlsDetector::setTimer(timerIndex index, int64_t t, int detPos) { } } - sharedMemory()->timerValue[index] = ret; + multi_shm()->timerValue[index] = ret; return ret; } @@ -1353,16 +1353,16 @@ int multiSlsDetector::setDynamicRange(int dr, int detPos) { int ret = sls::minusOneIfDifferent(r); // update shm - int prevValue = sharedMemory()->dataBytes; - int prevGValue = sharedMemory()->dataBytesInclGapPixels; - sharedMemory()->dataBytes = 0; - sharedMemory()->dataBytesInclGapPixels = 0; - sharedMemory()->numberOfChannels = 0; + int prevValue = multi_shm()->dataBytes; + int prevGValue = multi_shm()->dataBytesInclGapPixels; + multi_shm()->dataBytes = 0; + multi_shm()->dataBytesInclGapPixels = 0; + multi_shm()->numberOfChannels = 0; for (auto &d : detectors) { - sharedMemory()->dataBytes += d->getDataBytes(); - sharedMemory()->dataBytesInclGapPixels += + multi_shm()->dataBytes += d->getDataBytes(); + multi_shm()->dataBytesInclGapPixels += d->getDataBytesInclGapPixels(); - sharedMemory()->numberOfChannels += d->getTotalNumberOfChannels(); + multi_shm()->numberOfChannels += d->getTotalNumberOfChannels(); } // for usability @@ -1385,8 +1385,8 @@ int multiSlsDetector::setDynamicRange(int dr, int detPos) { // update offsets if there was a change FIXME:add dr to sls shm and check // that instead - if ((prevValue != sharedMemory()->dataBytes) || - (prevGValue != sharedMemory()->dataBytesInclGapPixels)) { + if ((prevValue != multi_shm()->dataBytes) || + (prevGValue != multi_shm()->dataBytesInclGapPixels)) { updateOffsets(); } @@ -2021,7 +2021,7 @@ int multiSlsDetector::loadImageToDetector(imageType index, // multi // read image for all - int nch = sharedMemory()->numberOfChannels; + int nch = multi_shm()->numberOfChannels; short int imageVals[nch]; if (readDataFile(fname, imageVals, nch) < nch * (int)sizeof(short int)) { FILE_LOG(logERROR) << "Could not open file or not enough data in file " @@ -2050,7 +2050,7 @@ int multiSlsDetector::writeCounterBlockFile(const std::string &fname, // multi // get image from all - int nch = sharedMemory()->numberOfChannels; + int nch = multi_shm()->numberOfChannels; short int imageVals[nch]; std::vector r; for (size_t idet = 0; idet < detectors.size(); ++idet) { @@ -2494,7 +2494,7 @@ int multiSlsDetector::enableGapPixels(int val, int detPos) { // update data bytes incl gap pixels if (val != -1) { auto r = serialCall(&slsDetector::getDataBytesInclGapPixels); - sharedMemory()->dataBytesInclGapPixels = sls::sum(r); + multi_shm()->dataBytesInclGapPixels = sls::sum(r); // update updateOffsets(); @@ -2701,9 +2701,9 @@ int multiSlsDetector::setReceiverOnline(int value, int detPos) { // multi if (value != GET_ONLINE_FLAG) { auto r = parallelCall(&slsDetector::setReceiverOnline, value); - sharedMemory()->receiverOnlineFlag = sls::minusOneIfDifferent(r); + multi_shm()->receiverOnlineFlag = sls::minusOneIfDifferent(r); } - return sharedMemory()->receiverOnlineFlag; + return multi_shm()->receiverOnlineFlag; } std::string multiSlsDetector::checkReceiverOnline(int detPos) { @@ -3041,8 +3041,8 @@ int multiSlsDetector::createReceivingDataSockets(const bool destroy) { void multiSlsDetector::readFrameFromReceiver() { int nX = - sharedMemory()->numberOfDetector[X]; // to copy data in multi module - int nY = sharedMemory() + multi_shm()->numberOfDetector[X]; // to copy data in multi module + int nY = multi_shm() ->numberOfDetector[Y]; // for eiger, to reverse the data bool gappixelsenable = false; bool eiger = false; @@ -3190,8 +3190,8 @@ void multiSlsDetector::readFrameFromReceiver() { // 4bit gap pixels if (dynamicRange == 4 && gappixelsenable) { int n = processImageWithGapPixels(multiframe, multigappixels); - nPixelsX = sharedMemory()->numberOfChannelInclGapPixels[X]; - nPixelsY = sharedMemory()->numberOfChannelInclGapPixels[Y]; + nPixelsX = multi_shm()->numberOfChannelInclGapPixels[X]; + nPixelsY = multi_shm()->numberOfChannelInclGapPixels[Y]; thisData = new detectorData(getCurrentProgress(), currentFileName.c_str(), nPixelsX, nPixelsY, multigappixels, n, @@ -3247,12 +3247,12 @@ void multiSlsDetector::readFrameFromReceiver() { int multiSlsDetector::processImageWithGapPixels(char *image, char *&gpImage) { // eiger 4 bit mode - int nxb = sharedMemory()->numberOfDetector[X] * (512 + 3); - int nyb = sharedMemory()->numberOfDetector[Y] * (256 + 1); + int nxb = multi_shm()->numberOfDetector[X] * (512 + 3); + int nyb = multi_shm()->numberOfDetector[Y] * (256 + 1); int gapdatabytes = nxb * nyb; - int nxchip = sharedMemory()->numberOfDetector[X] * 4; - int nychip = sharedMemory()->numberOfDetector[Y] * 1; + int nxchip = multi_shm()->numberOfDetector[X] * 4; + int nychip = multi_shm()->numberOfDetector[Y] * 1; // allocate if (gpImage == nullptr) { @@ -3859,20 +3859,20 @@ void multiSlsDetector::registerDataCallback( int multiSlsDetector::setTotalProgress() { int nf = 1, nc = 1, ns = 1, nm = 1; - if (sharedMemory()->timerValue[FRAME_NUMBER]) { - nf = sharedMemory()->timerValue[FRAME_NUMBER]; + if (multi_shm()->timerValue[FRAME_NUMBER]) { + nf = multi_shm()->timerValue[FRAME_NUMBER]; } - if (sharedMemory()->timerValue[CYCLES_NUMBER] > 0) { - nc = sharedMemory()->timerValue[CYCLES_NUMBER]; + if (multi_shm()->timerValue[CYCLES_NUMBER] > 0) { + nc = multi_shm()->timerValue[CYCLES_NUMBER]; } - if (sharedMemory()->timerValue[STORAGE_CELL_NUMBER] > 0) { - ns = sharedMemory()->timerValue[STORAGE_CELL_NUMBER] + 1; + if (multi_shm()->timerValue[STORAGE_CELL_NUMBER] > 0) { + ns = multi_shm()->timerValue[STORAGE_CELL_NUMBER] + 1; } - if (sharedMemory()->timerValue[MEASUREMENTS_NUMBER] > 0) { - nm = sharedMemory()->timerValue[MEASUREMENTS_NUMBER]; + if (multi_shm()->timerValue[MEASUREMENTS_NUMBER] > 0) { + nm = multi_shm()->timerValue[MEASUREMENTS_NUMBER]; } totalProgress = nm * nf * nc * ns; @@ -3924,10 +3924,10 @@ int multiSlsDetector::acquire() { bool receiver = (setReceiverOnline() == ONLINE_FLAG); progressIndex = 0; - sharedMemory()->stoppedFlag = 0; + multi_shm()->stoppedFlag = 0; setJoinThreadFlag(false); - int nm = sharedMemory()->timerValue[MEASUREMENTS_NUMBER]; + int nm = multi_shm()->timerValue[MEASUREMENTS_NUMBER]; if (nm < 1) { nm = 1; } @@ -3937,7 +3937,7 @@ int multiSlsDetector::acquire() { std::lock_guard lock(mg); if (getReceiverStatus() != IDLE) { if (stopReceiver() == FAIL) { - sharedMemory()->stoppedFlag = 1; + multi_shm()->stoppedFlag = 1; } } } @@ -3948,13 +3948,13 @@ int multiSlsDetector::acquire() { if (receiver) { std::lock_guard lock(mg); if (resetFramesCaught() == FAIL) { - sharedMemory()->stoppedFlag = 1; + multi_shm()->stoppedFlag = 1; } } // loop through measurements for (int im = 0; im < nm; ++im) { - if (sharedMemory()->stoppedFlag) { + if (multi_shm()->stoppedFlag) { break; } @@ -3964,7 +3964,7 @@ int multiSlsDetector::acquire() { if (startReceiver() == FAIL) { FILE_LOG(logERROR) << "Start receiver failed "; stopReceiver(); - sharedMemory()->stoppedFlag = 1; + multi_shm()->stoppedFlag = 1; break; } // let processing thread listen to these packets @@ -3977,7 +3977,7 @@ int multiSlsDetector::acquire() { std::lock_guard lock(mg); if (receiver) { if (stopReceiver() == FAIL) { - sharedMemory()->stoppedFlag = 1; + multi_shm()->stoppedFlag = 1; } else { if (dataReady) { sem_wait(&sem_endRTAcquisition); // waits for receiver's @@ -3992,7 +3992,7 @@ int multiSlsDetector::acquire() { if (measurement_finished) { measurement_finished(im, findex, measFinished_p); } - if (sharedMemory()->stoppedFlag) { + if (multi_shm()->stoppedFlag) { break; } diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index 310113574..e555d0c9e 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -1959,7 +1959,7 @@ class multiSlsDetector : public virtual slsDetectorDefs, int detId; /** Shared Memory object */ - SharedMemory sharedMemory{0, -1}; + SharedMemory multi_shm{0, -1}; /** pointers to the slsDetector structures */ std::vector> detectors; diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 1ba94cf25..9cb55a4c2 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -39,10 +39,7 @@ slsDetector::slsDetector(detectorType type, int multiId, int id, bool verify) freeSharedMemory(multiId, id); } - initSharedMemory(true, type, multiId, verify); - initializeDetectorStructure(type); - // initializeMembers(); - // initializeDetectorStructurePointers(); + initSharedMemory(type, multiId, verify); } slsDetector::slsDetector(int multiId, int id, bool verify) @@ -52,17 +49,10 @@ slsDetector::slsDetector(int multiId, int id, bool verify) // getDetectorType From shm will check if it was already existing detectorType type = getDetectorTypeFromShm(multiId, verify); - - initSharedMemory(false, type, multiId, verify); - // initializeMembers(); + initSharedMemory(type, multiId, verify); } -slsDetector::~slsDetector() { - if (sharedMemory) { - sharedMemory->UnmapSharedMemory(); - delete sharedMemory; - } -} +slsDetector::~slsDetector() = default; int slsDetector::checkDetectorVersionCompatibility() { int fnum = F_CHECK_VERSION; @@ -71,7 +61,7 @@ int slsDetector::checkDetectorVersionCompatibility() { int64_t arg = 0; // get api version number for detector server - switch (thisDetector->myDetectorType) { + switch (detector_shm()->myDetectorType) { case EIGER: arg = APIEIGER; break; @@ -97,23 +87,23 @@ int slsDetector::checkDetectorVersionCompatibility() { << std::hex << arg << std::dec; // control server - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, &arg, sizeof(arg), nullptr, 0); if (ret == FAIL) { - thisDetector->detectorControlAPIVersion = 0; + detector_shm()->detectorControlAPIVersion = 0; // stop server } else { - thisDetector->detectorControlAPIVersion = arg; + detector_shm()->detectorControlAPIVersion = arg; ret = FAIL; - auto stop = sls::ClientSocket(false, thisDetector->hostname, thisDetector->stopPort); + auto stop = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->stopPort); ret = stop.sendCommandThenRead(fnum, &arg, sizeof(arg), nullptr, 0); if (ret == FAIL) { - thisDetector->detectorStopAPIVersion = 0; + detector_shm()->detectorStopAPIVersion = 0; } else { - thisDetector->detectorStopAPIVersion = arg; + detector_shm()->detectorStopAPIVersion = arg; } } } @@ -137,13 +127,13 @@ int slsDetector::checkReceiverVersionCompatibility() { "value " << std::hex << arg << std::dec; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, &arg, sizeof(arg), nullptr, 0); if (ret == FAIL) { - thisDetector->receiverAPIVersion = 0; + detector_shm()->receiverAPIVersion = 0; } else { - thisDetector->receiverAPIVersion = arg; + detector_shm()->receiverAPIVersion = arg; } } @@ -166,9 +156,9 @@ int64_t slsDetector::getId(idMode mode) { return GITDATE; } else if (mode == RECEIVER_VERSION) { int ret = FAIL; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { int fnum = F_GET_RECEIVER_ID; - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, nullptr, 0, &retval, sizeof(retval)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); @@ -181,8 +171,8 @@ int64_t slsDetector::getId(idMode mode) { } else { int fnum = F_GET_ID; int ret = FAIL; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); // handle ret @@ -203,72 +193,45 @@ int64_t slsDetector::getId(idMode mode) { void slsDetector::freeSharedMemory(int multiId, int slsId) { SharedMemory shm(multiId, slsId); - shm.RemoveSharedMemory(); + if (shm.IsExisting()) { + shm.RemoveSharedMemory(); + } } void slsDetector::freeSharedMemory() { - if (sharedMemory) { - sharedMemory->UnmapSharedMemory(); - sharedMemory->RemoveSharedMemory(); - delete sharedMemory; - sharedMemory = nullptr; + if (detector_shm.IsExisting()) { + detector_shm.RemoveSharedMemory(); } - thisDetector = nullptr; } void slsDetector::setHostname(const std::string &hostname) { - sls::strcpy_safe(thisDetector->hostname, hostname.c_str()); + sls::strcpy_safe(detector_shm()->hostname, hostname.c_str()); updateDetector(); } std::string slsDetector::getHostname() { - return thisDetector->hostname; + return detector_shm()->hostname; } -/* - * pre: sharedMemory=0, thisDetector = 0 - * exceptions are caught in calling function, shm unmapped and deleted - */ -void slsDetector::initSharedMemory(bool created, detectorType type, int multiId, +void slsDetector::initSharedMemory(detectorType type, + int multiId, bool verify) { - try { - // calculate shared memory size - int sz = calculateSharedMemorySize(type); - // shared memory object with name - sharedMemory = new SharedMemory(multiId, detId); - - // create - if (created) { - sharedMemory->CreateSharedMemory(sz); - thisDetector = (*sharedMemory)(); + detector_shm = SharedMemory(multiId, detId); + if (!detector_shm.IsExisting()) { + detector_shm.CreateSharedMemory(); + initializeDetectorStructure(type); + } else { + detector_shm.OpenSharedMemory(); + if (verify && detector_shm()->shmversion != SLS_SHMVERSION) { + FILE_LOG(logERROR) << "Single shared memory " + "(" + << multiId << "-" << detId << ":) " + "version mismatch " + "(expected 0x" + << std::hex << SLS_SHMVERSION << " but got 0x" << detector_shm()->shmversion << ")" << std::dec; + throw SharedMemoryException(); } - // open and verify version - else { - sharedMemory->OpenSharedMemory(sz); - thisDetector = (*sharedMemory)(); - if (verify && thisDetector->shmversion != SLS_SHMVERSION) { - FILE_LOG(logERROR) << "Single shared memory " - "(" - << multiId << "-" << detId << ":) " - "version mismatch " - "(expected 0x" - << std::hex << SLS_SHMVERSION << " but got 0x" << thisDetector->shmversion << ")" << std::dec; - throw SharedMemoryException(); - } - } - } catch (...) { - if (sharedMemory) { - // unmap - if (thisDetector) { - sharedMemory->UnmapSharedMemory(); - thisDetector = nullptr; - } - // delete - delete sharedMemory; - sharedMemory = nullptr; - } - throw; } } @@ -303,7 +266,7 @@ void slsDetector::setDetectorSpecificParameters(detectorType type, detParameterL list.dynamicRange = 16; list.nGappixelsX = 0; list.nGappixelsY = 0; - break; + break; case MOENCH: list.nChanX = 32; list.nChanY = 1; @@ -330,202 +293,136 @@ void slsDetector::setDetectorSpecificParameters(detectorType type, detParameterL } } -int slsDetector::calculateSharedMemorySize(detectorType type) { - // get the detector parameters based on type - detParameterList detlist; - setDetectorSpecificParameters(type, detlist); - int nch = detlist.nChanX * detlist.nChanY; - int nc = detlist.nChipX * detlist.nChipY; - int nd = detlist.nDacs; - - /** The size of the shared memory is - * size of shared structure + - * ffcoefficents+fferrors+modules+dacs+chans */ - int sz = sizeof(sharedSlsDetector) + - 2 * nch * nc * sizeof(double) + - sizeof(sls_detector_module) + - sizeof(int) * nd + - sizeof(int) * nch * nc; - FILE_LOG(logDEBUG1) << "Size of shared memory is " << sz; - return sz; -} - void slsDetector::initializeDetectorStructure(detectorType type) { - thisDetector->shmversion = SLS_SHMVERSION; - thisDetector->onlineFlag = OFFLINE_FLAG; - thisDetector->stoppedFlag = 0; - sls::strcpy_safe(thisDetector->hostname, DEFAULT_HOSTNAME); - thisDetector->myDetectorType = type; - thisDetector->offset[X] = 0; - thisDetector->offset[Y] = 0; - thisDetector->multiSize[X] = 0; - thisDetector->multiSize[Y] = 0; - thisDetector->controlPort = DEFAULT_PORTNO; - thisDetector->stopPort = DEFAULT_PORTNO + 1; - sls::strcpy_safe(thisDetector->settingsDir, getenv("HOME")); - thisDetector->nTrimEn = 0; - for (int &trimEnergie : thisDetector->trimEnergies) { + detector_shm()->shmversion = SLS_SHMVERSION; + detector_shm()->onlineFlag = OFFLINE_FLAG; + detector_shm()->stoppedFlag = 0; + sls::strcpy_safe(detector_shm()->hostname, DEFAULT_HOSTNAME); + detector_shm()->myDetectorType = type; + detector_shm()->offset[X] = 0; + detector_shm()->offset[Y] = 0; + detector_shm()->multiSize[X] = 0; + detector_shm()->multiSize[Y] = 0; + detector_shm()->controlPort = DEFAULT_PORTNO; + detector_shm()->stopPort = DEFAULT_PORTNO + 1; + sls::strcpy_safe(detector_shm()->settingsDir, getenv("HOME")); + detector_shm()->nTrimEn = 0; + for (int &trimEnergie : detector_shm()->trimEnergies) { trimEnergie = 0; } - // thisDetector->threadedProcessing = 1; - thisDetector->nROI = 0; - memset(thisDetector->roiLimits, 0, MAX_ROIS * sizeof(ROI)); - thisDetector->roFlags = NORMAL_READOUT; - sls::strcpy_safe(thisDetector->settingsFile, "none"); - thisDetector->currentSettings = UNINITIALIZED; - thisDetector->currentThresholdEV = -1; - thisDetector->timerValue[FRAME_NUMBER] = 1; - thisDetector->timerValue[ACQUISITION_TIME] = 0; - thisDetector->timerValue[FRAME_PERIOD] = 0; - thisDetector->timerValue[DELAY_AFTER_TRIGGER] = 0; - thisDetector->timerValue[GATES_NUMBER] = 0; - thisDetector->timerValue[CYCLES_NUMBER] = 1; - thisDetector->timerValue[ACTUAL_TIME] = 0; - thisDetector->timerValue[MEASUREMENT_TIME] = 0; - thisDetector->timerValue[PROGRESS] = 0; - thisDetector->timerValue[MEASUREMENTS_NUMBER] = 1; - thisDetector->timerValue[FRAMES_FROM_START] = 0; - thisDetector->timerValue[FRAMES_FROM_START_PG] = 0; - thisDetector->timerValue[SAMPLES] = 1; - thisDetector->timerValue[SUBFRAME_ACQUISITION_TIME] = 0; - thisDetector->timerValue[STORAGE_CELL_NUMBER] = 0; - thisDetector->timerValue[SUBFRAME_DEADTIME] = 0; - sls::strcpy_safe(thisDetector->receiver_hostname, "none"); - thisDetector->receiverTCPPort = DEFAULT_PORTNO + 2; - thisDetector->receiverUDPPort = DEFAULT_UDP_PORTNO; - thisDetector->receiverUDPPort2 = DEFAULT_UDP_PORTNO + 1; - sls::strcpy_safe(thisDetector->receiverUDPIP, "none"); - sls::strcpy_safe(thisDetector->receiverUDPMAC, "none"); - sls::strcpy_safe(thisDetector->detectorMAC, DEFAULT_DET_MAC); - sls::strcpy_safe(thisDetector->detectorIP, DEFAULT_DET_IP); - thisDetector->receiverOnlineFlag = OFFLINE_FLAG; - thisDetector->tenGigaEnable = 0; - thisDetector->flippedData[X] = 0; - thisDetector->flippedData[Y] = 0; - thisDetector->zmqport = DEFAULT_ZMQ_CL_PORTNO + - (detId * ((thisDetector->myDetectorType == EIGER) ? 2 : 1)); - thisDetector->receiver_zmqport = DEFAULT_ZMQ_RX_PORTNO + - (detId * ((thisDetector->myDetectorType == EIGER) ? 2 : 1)); - thisDetector->receiver_upstream = false; - thisDetector->receiver_read_freq = 0; - memset(thisDetector->zmqip, 0, MAX_STR_LENGTH); - memset(thisDetector->receiver_zmqip, 0, MAX_STR_LENGTH); - thisDetector->gappixels = 0; - memset(thisDetector->receiver_additionalJsonHeader, 0, MAX_STR_LENGTH); - thisDetector->detectorControlAPIVersion = 0; - thisDetector->detectorStopAPIVersion = 0; - thisDetector->receiverAPIVersion = 0; - thisDetector->receiver_frameDiscardMode = NO_DISCARD; - thisDetector->receiver_framePadding = true; - thisDetector->activated = true; - thisDetector->receiver_deactivatedPaddingEnable = true; - thisDetector->receiver_silentMode = false; - sls::strcpy_safe(thisDetector->receiver_filePath, "/"); - sls::strcpy_safe(thisDetector->receiver_fileName, "run"); - thisDetector->receiver_fileIndex = 0; - thisDetector->receiver_fileFormatType = BINARY; - switch (thisDetector->myDetectorType) { + detector_shm()->nROI = 0; + memset(detector_shm()->roiLimits, 0, MAX_ROIS * sizeof(ROI)); + detector_shm()->roFlags = NORMAL_READOUT; + sls::strcpy_safe(detector_shm()->settingsFile, "none"); + detector_shm()->currentSettings = UNINITIALIZED; + detector_shm()->currentThresholdEV = -1; + detector_shm()->timerValue[FRAME_NUMBER] = 1; + detector_shm()->timerValue[ACQUISITION_TIME] = 0; + detector_shm()->timerValue[FRAME_PERIOD] = 0; + detector_shm()->timerValue[DELAY_AFTER_TRIGGER] = 0; + detector_shm()->timerValue[GATES_NUMBER] = 0; + detector_shm()->timerValue[CYCLES_NUMBER] = 1; + detector_shm()->timerValue[ACTUAL_TIME] = 0; + detector_shm()->timerValue[MEASUREMENT_TIME] = 0; + detector_shm()->timerValue[PROGRESS] = 0; + detector_shm()->timerValue[MEASUREMENTS_NUMBER] = 1; + detector_shm()->timerValue[FRAMES_FROM_START] = 0; + detector_shm()->timerValue[FRAMES_FROM_START_PG] = 0; + detector_shm()->timerValue[SAMPLES] = 1; + detector_shm()->timerValue[SUBFRAME_ACQUISITION_TIME] = 0; + detector_shm()->timerValue[STORAGE_CELL_NUMBER] = 0; + detector_shm()->timerValue[SUBFRAME_DEADTIME] = 0; + sls::strcpy_safe(detector_shm()->receiver_hostname, "none"); + detector_shm()->receiverTCPPort = DEFAULT_PORTNO + 2; + detector_shm()->receiverUDPPort = DEFAULT_UDP_PORTNO; + detector_shm()->receiverUDPPort2 = DEFAULT_UDP_PORTNO + 1; + sls::strcpy_safe(detector_shm()->receiverUDPIP, "none"); + sls::strcpy_safe(detector_shm()->receiverUDPMAC, "none"); + sls::strcpy_safe(detector_shm()->detectorMAC, DEFAULT_DET_MAC); + sls::strcpy_safe(detector_shm()->detectorIP, DEFAULT_DET_IP); + detector_shm()->receiverOnlineFlag = OFFLINE_FLAG; + detector_shm()->tenGigaEnable = 0; + detector_shm()->flippedData[X] = 0; + detector_shm()->flippedData[Y] = 0; + detector_shm()->zmqport = DEFAULT_ZMQ_CL_PORTNO + + (detId * ((detector_shm()->myDetectorType == EIGER) ? 2 : 1)); + detector_shm()->receiver_zmqport = DEFAULT_ZMQ_RX_PORTNO + + (detId * ((detector_shm()->myDetectorType == EIGER) ? 2 : 1)); + detector_shm()->receiver_upstream = false; + detector_shm()->receiver_read_freq = 0; + memset(detector_shm()->zmqip, 0, MAX_STR_LENGTH); + memset(detector_shm()->receiver_zmqip, 0, MAX_STR_LENGTH); + detector_shm()->gappixels = 0; + memset(detector_shm()->receiver_additionalJsonHeader, 0, MAX_STR_LENGTH); + detector_shm()->detectorControlAPIVersion = 0; + detector_shm()->detectorStopAPIVersion = 0; + detector_shm()->receiverAPIVersion = 0; + detector_shm()->receiver_frameDiscardMode = NO_DISCARD; + detector_shm()->receiver_framePadding = true; + detector_shm()->activated = true; + detector_shm()->receiver_deactivatedPaddingEnable = true; + detector_shm()->receiver_silentMode = false; + sls::strcpy_safe(detector_shm()->receiver_filePath, "/"); + sls::strcpy_safe(detector_shm()->receiver_fileName, "run"); + detector_shm()->receiver_fileIndex = 0; + detector_shm()->receiver_fileFormatType = BINARY; + switch (detector_shm()->myDetectorType) { case GOTTHARD: - thisDetector->receiver_framesPerFile = MAX_FRAMES_PER_FILE; + detector_shm()->receiver_framesPerFile = MAX_FRAMES_PER_FILE; break; case EIGER: - thisDetector->receiver_framesPerFile = EIGER_MAX_FRAMES_PER_FILE; + detector_shm()->receiver_framesPerFile = EIGER_MAX_FRAMES_PER_FILE; break; case JUNGFRAU: - thisDetector->receiver_framesPerFile = JFRAU_MAX_FRAMES_PER_FILE; + detector_shm()->receiver_framesPerFile = JFRAU_MAX_FRAMES_PER_FILE; break; case CHIPTESTBOARD: - thisDetector->receiver_framesPerFile = CTB_MAX_FRAMES_PER_FILE; - break; + detector_shm()->receiver_framesPerFile = CTB_MAX_FRAMES_PER_FILE; + break; case MOENCH: - thisDetector->receiver_framesPerFile = MOENCH_MAX_FRAMES_PER_FILE; + detector_shm()->receiver_framesPerFile = MOENCH_MAX_FRAMES_PER_FILE; break; default: break; } - thisDetector->receiver_fileWriteEnable = true; - thisDetector->receiver_overWriteEnable = true; + detector_shm()->receiver_fileWriteEnable = true; + detector_shm()->receiver_overWriteEnable = true; // get the detector parameters based on type detParameterList detlist; setDetectorSpecificParameters(type, detlist); - thisDetector->nChan[X] = detlist.nChanX; - thisDetector->nChan[Y] = detlist.nChanY; - thisDetector->nChip[X] = detlist.nChipX; - thisDetector->nChip[Y] = detlist.nChipY; - thisDetector->nDacs = detlist.nDacs; - thisDetector->dynamicRange = detlist.dynamicRange; - thisDetector->nGappixels[X] = detlist.nGappixelsX; - thisDetector->nGappixels[Y] = detlist.nGappixelsY; + detector_shm()->nChan[X] = detlist.nChanX; + detector_shm()->nChan[Y] = detlist.nChanY; + detector_shm()->nChip[X] = detlist.nChipX; + detector_shm()->nChip[Y] = detlist.nChipY; + detector_shm()->nDacs = detlist.nDacs; + detector_shm()->dynamicRange = detlist.dynamicRange; + detector_shm()->nGappixels[X] = detlist.nGappixelsX; + detector_shm()->nGappixels[Y] = detlist.nGappixelsY; // derived parameters - thisDetector->nChans = thisDetector->nChan[X] * thisDetector->nChan[Y]; - thisDetector->nChips = thisDetector->nChip[X] * thisDetector->nChip[Y]; + detector_shm()->nChans = detector_shm()->nChan[X] * detector_shm()->nChan[Y]; + detector_shm()->nChips = detector_shm()->nChip[X] * detector_shm()->nChip[Y]; // calculating databytes - thisDetector->dataBytes = thisDetector->nChips * thisDetector->nChans * - thisDetector->dynamicRange / 8; - thisDetector->dataBytesInclGapPixels = - (thisDetector->nChip[X] * thisDetector->nChan[X] + - thisDetector->gappixels * thisDetector->nGappixels[X]) * - (thisDetector->nChip[Y] * thisDetector->nChan[Y] + - thisDetector->gappixels * thisDetector->nGappixels[Y]) * - thisDetector->dynamicRange / 8; + detector_shm()->dataBytes = detector_shm()->nChips * detector_shm()->nChans * + detector_shm()->dynamicRange / 8; + detector_shm()->dataBytesInclGapPixels = + (detector_shm()->nChip[X] * detector_shm()->nChan[X] + + detector_shm()->gappixels * detector_shm()->nGappixels[X]) * + (detector_shm()->nChip[Y] * detector_shm()->nChan[Y] + + detector_shm()->gappixels * detector_shm()->nGappixels[Y]) * + detector_shm()->dynamicRange / 8; // update #nchans and databytes, as it depends on #samples, roi, readoutflags (ctb only) - if (thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH) { - updateTotalNumberOfChannels(); + if (detector_shm()->myDetectorType == CHIPTESTBOARD || detector_shm()->myDetectorType == MOENCH) { + updateTotalNumberOfChannels(); } - /** calculates the memory offsets for - * flat field coefficients and errors, - * module structures, dacs, channels */ - thisDetector->modoff = sizeof(sharedSlsDetector); - thisDetector->dacoff = thisDetector->modoff + - sizeof(sls_detector_module); - thisDetector->chanoff = thisDetector->dacoff + - sizeof(int) * thisDetector->nChips; -} - -void slsDetector::initializeMembers() { - // slsdetector - // assign addresses - // char *goff = (char *)thisDetector; - // detectorModules = (sls_detector_module *)(goff + thisDetector->modoff); - // dacs = (int *)(goff + thisDetector->dacoff); - // chanregs = (int *)(goff + thisDetector->chanoff); -} - -void slsDetector::initializeDetectorStructurePointers() { - // sls_detector_module *thisMod; - - // // set thisMod to point to one of the detector structure modules - // thisMod = detectorModules; - - // thisMod->serialnumber = 0; - // thisMod->nchan = thisDetector->nChans * thisDetector->nChips; - // thisMod->nchip = thisDetector->nChips; - // thisMod->ndac = thisDetector->nDacs; - // thisMod->reg = 0; - // thisMod->iodelay = 0; - // thisMod->tau = 0; - // thisMod->eV = 0; - // // dacs and chanregs for thisMod is not allocated in - // // detectorModules in shared memory as they are already allocated separately - // // in shared memory (below) - - // // initializes the dacs values to 0 - // for (int i = 0; i < thisDetector->nDacs; ++i) { - // *(dacs + i) = 0; - // } - // // initializes the channel registers to 0 - // for (int i = 0; i < thisDetector->nChans * thisDetector->nChips; ++i) { - // *(chanregs + i) = -1; - // } } slsDetectorDefs::sls_detector_module *slsDetector::createModule() { - return createModule(thisDetector->myDetectorType); + return createModule(detector_shm()->myDetectorType); } slsDetectorDefs::sls_detector_module *slsDetector::createModule(detectorType type) { @@ -568,7 +465,7 @@ int slsDetector::sendModule(sls_detector_module *myMod) { FILE_LOG(level) << "Sending Module"; int ts = 0; int n = 0; - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); n = client.sendData(&(myMod->serialnumber), sizeof(myMod->serialnumber)); ts += n; FILE_LOG(level) << "Serial number sent. " << n << " bytes. serialno: " << myMod->serialnumber; @@ -605,7 +502,7 @@ int slsDetector::sendModule(sls_detector_module *myMod) { ts += n; FILE_LOG(level) << "dacs sent. " << n << " bytes"; - if (thisDetector->myDetectorType == EIGER) { + if (detector_shm()->myDetectorType == EIGER) { n = client.sendData(myMod->chanregs, sizeof(int) * (myMod->nchan)); ts += n; FILE_LOG(level) << "channels sent. " << n << " bytes"; @@ -614,7 +511,7 @@ int slsDetector::sendModule(sls_detector_module *myMod) { } int slsDetector::receiveModule(sls_detector_module *myMod) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); int ts = 0; ts += client.receiveData(&(myMod->serialnumber), sizeof(myMod->serialnumber)); ts += client.receiveData(&(myMod->nchan), sizeof(myMod->nchan)); @@ -627,9 +524,9 @@ int slsDetector::receiveModule(sls_detector_module *myMod) { ts += client.receiveData(myMod->dacs, sizeof(int) * (myMod->ndac)); FILE_LOG(logDEBUG1) << "received dacs of size " << ts; - if (thisDetector->myDetectorType == EIGER) { + if (detector_shm()->myDetectorType == EIGER) { ts += client.receiveData(myMod->chanregs, sizeof(int) * (myMod->nchan)); - FILE_LOG(logDEBUG1) << "nchans= " << thisDetector->nChans << " nchips= " << thisDetector->nChips + FILE_LOG(logDEBUG1) << "nchans= " << detector_shm()->nChans << " nchips= " << detector_shm()->nChips << "mod - nchans= " << myMod->nchan << " nchips= " << myMod->nchip << "received chans of size " << ts; } @@ -647,21 +544,18 @@ slsDetectorDefs::detectorType slsDetector::getDetectorTypeFromShm(int multiId, b // open, map, verify version shm.OpenSharedMemory(); - auto sdet = shm(); - if (verify && sdet->shmversion != SLS_SHMVERSION) { + + if (verify && shm()->shmversion != SLS_SHMVERSION) { FILE_LOG(logERROR) << "Single shared memory " "(" << multiId << "-" << detId << ":)version mismatch " "(expected 0x" - << std::hex << SLS_SHMVERSION << " but got 0x" << sdet->shmversion << ")" << std::dec; + << std::hex << SLS_SHMVERSION << " but got 0x" << shm()->shmversion << ")" << std::dec; // unmap and throw - sharedMemory->UnmapSharedMemory(); + detector_shm.UnmapSharedMemory(); throw SharedMemoryException(); } - - // get type, unmap - auto type = sdet->myDetectorType; - shm.UnmapSharedMemory(); + auto type = shm()->myDetectorType; return type; } @@ -692,18 +586,18 @@ int slsDetector::setDetectorType(detectorType const type) { // if unspecified, then get from detector if (type == GET_DETECTOR_TYPE) { - if (thisDetector->onlineFlag == ONLINE_FLAG) { + if (detector_shm()->onlineFlag == ONLINE_FLAG) { //Create socket - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, nullptr, 0, &retval, sizeof(retval)); // handle ret if (ret == FAIL) { // ret is never fail with this function setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); - thisDetector->myDetectorType = GENERIC; + detector_shm()->myDetectorType = GENERIC; } else { - thisDetector->myDetectorType = (detectorType)retval; + detector_shm()->myDetectorType = (detectorType)retval; FILE_LOG(logDEBUG1) << "Detector Type: " << retval; } } @@ -715,14 +609,14 @@ int slsDetector::setDetectorType(detectorType const type) { } // receiver - if ((thisDetector->receiverOnlineFlag == ONLINE_FLAG) && ret == OK) { + if ((detector_shm()->receiverOnlineFlag == ONLINE_FLAG) && ret == OK) { fnum = F_GET_RECEIVER_TYPE; ret = FAIL; - int arg = (int)thisDetector->myDetectorType; + int arg = (int)detector_shm()->myDetectorType; retval = GENERIC; - FILE_LOG(logDEBUG1) << "Sending detector type to Receiver: " << (int)thisDetector->myDetectorType; + FILE_LOG(logDEBUG1) << "Sending detector type to Receiver: " << (int)detector_shm()->myDetectorType; - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); // handle ret @@ -742,7 +636,7 @@ int slsDetector::setDetectorType(detectorType const type) { } slsDetectorDefs::detectorType slsDetector::getDetectorTypeAsEnum() { - return thisDetector->myDetectorType; + return detector_shm()->myDetectorType; } std::string slsDetector::getDetectorTypeAsString() { @@ -750,146 +644,146 @@ std::string slsDetector::getDetectorTypeAsString() { } int slsDetector::getTotalNumberOfChannels() { - return thisDetector->nChans * thisDetector->nChips; + return detector_shm()->nChans * detector_shm()->nChips; } void slsDetector::updateTotalNumberOfChannels() { - if (thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH) { + if (detector_shm()->myDetectorType == CHIPTESTBOARD || detector_shm()->myDetectorType == MOENCH) { - // default number of channels - thisDetector->nChan[X] = 32; + // default number of channels + detector_shm()->nChan[X] = 32; - // if roi, recalculate #nchanX - if (thisDetector->nROI > 0) { - thisDetector->nChan[X] = 0; - for (int iroi = 0; iroi < thisDetector->nROI; ++iroi) { - thisDetector->nChan[X] += - (thisDetector->roiLimits[iroi].xmax - - thisDetector->roiLimits[iroi].xmin + 1); + // if roi, recalculate #nchanX + if (detector_shm()->nROI > 0) { + detector_shm()->nChan[X] = 0; + for (int iroi = 0; iroi < detector_shm()->nROI; ++iroi) { + detector_shm()->nChan[X] += + (detector_shm()->roiLimits[iroi].xmax - + detector_shm()->roiLimits[iroi].xmin + 1); } } - // add digital signals depending on readout flags - if (thisDetector->myDetectorType == CHIPTESTBOARD && - (thisDetector->roFlags & DIGITAL_ONLY || thisDetector->roFlags & ANALOG_AND_DIGITAL)) { - thisDetector->nChan[X] += 4; - } + // add digital signals depending on readout flags + if (detector_shm()->myDetectorType == CHIPTESTBOARD && + (detector_shm()->roFlags & DIGITAL_ONLY || detector_shm()->roFlags & ANALOG_AND_DIGITAL)) { + detector_shm()->nChan[X] += 4; + } - // recalculate derived parameters chans and databytes - thisDetector->nChans = thisDetector->nChan[X]; - thisDetector->dataBytes = thisDetector->nChans * thisDetector->nChips * - (thisDetector->dynamicRange / 8) * thisDetector->timerValue[SAMPLES]; - FILE_LOG(logDEBUG1) << "Number of Channels:" << thisDetector->nChans << " Databytes: " << thisDetector->dataBytes; + // recalculate derived parameters chans and databytes + detector_shm()->nChans = detector_shm()->nChan[X]; + detector_shm()->dataBytes = detector_shm()->nChans * detector_shm()->nChips * + (detector_shm()->dynamicRange / 8) * detector_shm()->timerValue[SAMPLES]; + FILE_LOG(logDEBUG1) << "Number of Channels:" << detector_shm()->nChans << " Databytes: " << detector_shm()->dataBytes; } } int slsDetector::getTotalNumberOfChannels(dimension d) { - return thisDetector->nChan[d] * thisDetector->nChip[d]; + return detector_shm()->nChan[d] * detector_shm()->nChip[d]; } int slsDetector::getTotalNumberOfChannelsInclGapPixels(dimension d) { - return (thisDetector->nChan[d] * thisDetector->nChip[d] + thisDetector->gappixels * thisDetector->nGappixels[d]); + return (detector_shm()->nChan[d] * detector_shm()->nChip[d] + detector_shm()->gappixels * detector_shm()->nGappixels[d]); } int slsDetector::getNChans() { - return thisDetector->nChans; + return detector_shm()->nChans; } int slsDetector::getNChans(dimension d) { - return thisDetector->nChan[d]; + return detector_shm()->nChan[d]; } int slsDetector::getNChips() { - return thisDetector->nChips; + return detector_shm()->nChips; } int slsDetector::getNChips(dimension d) { - return thisDetector->nChip[d]; + return detector_shm()->nChip[d]; } int slsDetector::getDetectorOffset(dimension d) { - return thisDetector->offset[d]; + return detector_shm()->offset[d]; } void slsDetector::setDetectorOffset(dimension d, int off) { if (off >= 0) { - thisDetector->offset[d] = off; + detector_shm()->offset[d] = off; } } void slsDetector::updateMultiSize(int detx, int dety) { - thisDetector->multiSize[0] = detx; - thisDetector->multiSize[1] = dety; + detector_shm()->multiSize[0] = detx; + detector_shm()->multiSize[1] = dety; } int slsDetector::setOnline(int value) { if (value != GET_ONLINE_FLAG) { - thisDetector->onlineFlag = value; + detector_shm()->onlineFlag = value; // set online - if (thisDetector->onlineFlag == ONLINE_FLAG) { - int old = thisDetector->onlineFlag; + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + int old = detector_shm()->onlineFlag; // connecting first time - if (thisDetector->onlineFlag == ONLINE_FLAG && old == OFFLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG && old == OFFLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); FILE_LOG(logINFO) << "Detector connecting for the first time - updating!"; client.close(); updateDetector(); } // error - else if (thisDetector->onlineFlag == OFFLINE_FLAG) { + else if (detector_shm()->onlineFlag == OFFLINE_FLAG) { FILE_LOG(logERROR) << "Cannot connect to detector"; setErrorMask((getErrorMask()) | (CANNOT_CONNECT_TO_DETECTOR)); } } } - return thisDetector->onlineFlag; + return detector_shm()->onlineFlag; } int slsDetector::getOnlineFlag() const { - return thisDetector->onlineFlag; + return detector_shm()->onlineFlag; } std::string slsDetector::checkOnline() { std::string retval; try { //Need both control and stop socket to work! - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); - auto stop = sls::ClientSocket(false, thisDetector->hostname, thisDetector->stopPort); - retval = thisDetector->hostname; + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); + auto stop = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->stopPort); + retval = detector_shm()->hostname; } catch (...) { //try catch should not be used for control but we should also not call this function - thisDetector->onlineFlag = OFFLINE_FLAG; + detector_shm()->onlineFlag = OFFLINE_FLAG; } return retval; } int slsDetector::setControlPort(int port_number) { - int fnum = F_SET_PORT; - int ret = FAIL; - int retval = -1; + int fnum = F_SET_PORT; + int ret = FAIL; + int retval = -1; - FILE_LOG(logDEBUG1) << "Setting control port " - << " to " << port_number; + FILE_LOG(logDEBUG1) << "Setting control port " + << " to " << port_number; - if (port_number >= 0 && port_number != thisDetector->controlPort) { - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); - ret = client.sendCommandThenRead(fnum, &port_number, sizeof(port_number), &retval, sizeof(retval)); - if (ret == FAIL) { - setErrorMask((getErrorMask()) | (COULDNOT_SET_CONTROL_PORT)); - } else { - thisDetector->controlPort = retval; - FILE_LOG(logDEBUG1) << "Control port: " << retval; - } - } else { - thisDetector->controlPort = port_number; - } - } - if (ret == FORCE_UPDATE) { - ret = updateDetector(); - } - return thisDetector->controlPort; + if (port_number >= 0 && port_number != detector_shm()->controlPort) { + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); + ret = client.sendCommandThenRead(fnum, &port_number, sizeof(port_number), &retval, sizeof(retval)); + if (ret == FAIL) { + setErrorMask((getErrorMask()) | (COULDNOT_SET_CONTROL_PORT)); + } else { + detector_shm()->controlPort = retval; + FILE_LOG(logDEBUG1) << "Control port: " << retval; + } + } else { + detector_shm()->controlPort = port_number; + } + } + if (ret == FORCE_UPDATE) { + ret = updateDetector(); + } + return detector_shm()->controlPort; } int slsDetector::setStopPort(int port_number) { @@ -899,24 +793,24 @@ int slsDetector::setStopPort(int port_number) { FILE_LOG(logDEBUG1) << "Setting stop port " << " to " << port_number; - if (port_number >= 0 && port_number != thisDetector->stopPort) { - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto stop = sls::ClientSocket(false, thisDetector->hostname, thisDetector->stopPort); + if (port_number >= 0 && port_number != detector_shm()->stopPort) { + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto stop = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->stopPort); ret = stop.sendCommandThenRead(fnum, &port_number, sizeof(port_number), &retval, sizeof(retval)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (COULDNOT_SET_STOP_PORT)); } else { - thisDetector->stopPort = retval; + detector_shm()->stopPort = retval; FILE_LOG(logDEBUG1) << "Stop port: " << retval; } } else { - thisDetector->stopPort = port_number; + detector_shm()->stopPort = port_number; } } if (ret == FORCE_UPDATE) { ret = updateDetector(); } - return thisDetector->stopPort; + return detector_shm()->stopPort; } int slsDetector::setReceiverPort(int port_number) { @@ -927,37 +821,37 @@ int slsDetector::setReceiverPort(int port_number) { FILE_LOG(logDEBUG1) << "Setting reciever port " << " to " << port_number; - if (port_number >= 0 && port_number != thisDetector->receiverTCPPort) { - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto stop = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (port_number >= 0 && port_number != detector_shm()->receiverTCPPort) { + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto stop = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = stop.sendCommandThenRead(fnum, &port_number, sizeof(port_number), &retval, sizeof(retval)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (COULDNOT_SET_DATA_PORT)); } else { - thisDetector->receiverTCPPort = retval; + detector_shm()->receiverTCPPort = retval; FILE_LOG(logDEBUG1) << "Receiver port: " << retval; } } else { - thisDetector->receiverTCPPort = port_number; + detector_shm()->receiverTCPPort = port_number; } } if (ret == FORCE_UPDATE) { ret = updateReceiver(); } - return thisDetector->receiverTCPPort; + return detector_shm()->receiverTCPPort; } int slsDetector::getControlPort() const { - return thisDetector->controlPort; + return detector_shm()->controlPort; } int slsDetector::getStopPort() const { - return thisDetector->stopPort; + return detector_shm()->stopPort; } int slsDetector::getReceiverPort() const { - return thisDetector->receiverTCPPort; + return detector_shm()->receiverTCPPort; } int slsDetector::lockServer(int lock) { @@ -966,8 +860,8 @@ int slsDetector::lockServer(int lock) { int retval = -1; FILE_LOG(logDEBUG1) << "Setting detector server lock to " << lock; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, &lock, sizeof(lock), &retval, sizeof(retval)); // handle ret @@ -989,8 +883,8 @@ std::string slsDetector::getLastClientIP() { char retval[INET_ADDRSTRLEN] = {0}; FILE_LOG(logDEBUG1) << "Getting last client ip to detector server"; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, nullptr, 0, &retval, sizeof(retval)); // handle ret @@ -1011,8 +905,8 @@ int slsDetector::exitServer() { int ret = FAIL; FILE_LOG(logDEBUG1) << "Sending exit command to detector server"; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, nullptr, 0, nullptr, 0); // no ret handling as ret never fail FILE_LOG(logINFO) << "Shutting down the Detector server"; @@ -1028,8 +922,8 @@ int slsDetector::execCommand(const std::string &cmd) { sls::strcpy_safe(arg, cmd.c_str()); FILE_LOG(logDEBUG1) << "Sending command to detector " << arg; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, arg, sizeof(arg), retval, sizeof(retval)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); @@ -1045,112 +939,111 @@ int slsDetector::updateDetectorNoWait(sls::ClientSocket &client) { int n = 0, i32 = 0; int64_t i64 = 0; char lastClientIP[INET_ADDRSTRLEN] = {0}; - // auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + // auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); n += client.receiveData(lastClientIP, sizeof(lastClientIP)); FILE_LOG(logDEBUG1) << "Updating detector last modified by " << lastClientIP; // dr n += client.receiveData(&i32, sizeof(i32)); - thisDetector->dynamicRange = i32; + detector_shm()->dynamicRange = i32; // databytes n += client.receiveData(&i32, sizeof(i32)); - thisDetector->dataBytes = i32; + detector_shm()->dataBytes = i32; // settings - if ((thisDetector->myDetectorType != CHIPTESTBOARD) && (thisDetector->myDetectorType != MOENCH)) { + if ((detector_shm()->myDetectorType != CHIPTESTBOARD) && (detector_shm()->myDetectorType != MOENCH)) { n += client.receiveData(&i32, sizeof(i32)); - thisDetector->currentSettings = (detectorSettings)i32; + detector_shm()->currentSettings = (detectorSettings)i32; } // threshold - if (thisDetector->myDetectorType == EIGER) { + if (detector_shm()->myDetectorType == EIGER) { n += client.receiveData(&i32, sizeof(i32)); - thisDetector->currentThresholdEV = i32; + detector_shm()->currentThresholdEV = i32; } // frame number n += client.receiveData(&i64, sizeof(i64)); - thisDetector->timerValue[FRAME_NUMBER] = i64; + detector_shm()->timerValue[FRAME_NUMBER] = i64; // exptime n += client.receiveData(&i64, sizeof(i64)); - thisDetector->timerValue[ACQUISITION_TIME] = i64; + detector_shm()->timerValue[ACQUISITION_TIME] = i64; // subexptime, subdeadtime - if (thisDetector->myDetectorType == EIGER) { + if (detector_shm()->myDetectorType == EIGER) { n += client.receiveData(&i64, sizeof(i64)); - thisDetector->timerValue[SUBFRAME_ACQUISITION_TIME] = i64; + detector_shm()->timerValue[SUBFRAME_ACQUISITION_TIME] = i64; n += client.receiveData(&i64, sizeof(i64)); - thisDetector->timerValue[SUBFRAME_DEADTIME] = i64; + detector_shm()->timerValue[SUBFRAME_DEADTIME] = i64; } // period n += client.receiveData(&i64, sizeof(i64)); - thisDetector->timerValue[FRAME_PERIOD] = i64; + detector_shm()->timerValue[FRAME_PERIOD] = i64; // delay - if (thisDetector->myDetectorType != EIGER) { + if (detector_shm()->myDetectorType != EIGER) { n += client.receiveData(&i64, sizeof(i64)); - thisDetector->timerValue[DELAY_AFTER_TRIGGER] = i64; + detector_shm()->timerValue[DELAY_AFTER_TRIGGER] = i64; } - if (thisDetector->myDetectorType == JUNGFRAU) { - // storage cell - n += client.receiveData(&i64, sizeof(i64)); - thisDetector->timerValue[STORAGE_CELL_NUMBER] = i64; + if (detector_shm()->myDetectorType == JUNGFRAU) { + // storage cell + n += client.receiveData(&i64, sizeof(i64)); + detector_shm()->timerValue[STORAGE_CELL_NUMBER] = i64; - // storage cell delay - n += client.receiveData(&i64, sizeof(i64)); - thisDetector->timerValue[STORAGE_CELL_DELAY] = i64; + // storage cell delay + n += client.receiveData(&i64, sizeof(i64)); + detector_shm()->timerValue[STORAGE_CELL_DELAY] = i64; } // cycles n += client.receiveData(&i64, sizeof(i64)); - thisDetector->timerValue[CYCLES_NUMBER] = i64; + detector_shm()->timerValue[CYCLES_NUMBER] = i64; // readout flags - if (thisDetector->myDetectorType == EIGER || - thisDetector->myDetectorType == CHIPTESTBOARD) { + if (detector_shm()->myDetectorType == EIGER || + detector_shm()->myDetectorType == CHIPTESTBOARD) { n += client.receiveData(&i32, sizeof(i32)); - thisDetector->roFlags = (readOutFlags)i32; + detector_shm()->roFlags = (readOutFlags)i32; } // samples - if (thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH) { + if (detector_shm()->myDetectorType == CHIPTESTBOARD || detector_shm()->myDetectorType == MOENCH) { n += client.receiveData(&i64, sizeof(i64)); if (i64 >= 0) { - thisDetector->timerValue[SAMPLES] = i64; + detector_shm()->timerValue[SAMPLES] = i64; } } // roi - if (thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH|| thisDetector->myDetectorType == GOTTHARD) { - n += client.receiveData(&i32, sizeof(i32)); - thisDetector->nROI = i32; - for (int i = 0; i < thisDetector->nROI; ++i) { - n += client.receiveData(&i32, sizeof(i32)); - thisDetector->roiLimits[i].xmin = i32; - n += client.receiveData(&i32, sizeof(i32)); - thisDetector->roiLimits[i].xmax = i32; - n += client.receiveData(&i32, sizeof(i32)); - thisDetector->roiLimits[i].ymin = i32; - n += client.receiveData(&i32, sizeof(i32)); - thisDetector->roiLimits[i].xmax = i32; - } - // moench (send to processor) - if (thisDetector->myDetectorType == MOENCH) { - sendROIToProcessor(); - } + if (detector_shm()->myDetectorType == CHIPTESTBOARD || detector_shm()->myDetectorType == MOENCH || detector_shm()->myDetectorType == GOTTHARD) { + n += client.receiveData(&i32, sizeof(i32)); + detector_shm()->nROI = i32; + for (int i = 0; i < detector_shm()->nROI; ++i) { + n += client.receiveData(&i32, sizeof(i32)); + detector_shm()->roiLimits[i].xmin = i32; + n += client.receiveData(&i32, sizeof(i32)); + detector_shm()->roiLimits[i].xmax = i32; + n += client.receiveData(&i32, sizeof(i32)); + detector_shm()->roiLimits[i].ymin = i32; + n += client.receiveData(&i32, sizeof(i32)); + detector_shm()->roiLimits[i].xmax = i32; + } + // moench (send to processor) + if (detector_shm()->myDetectorType == MOENCH) { + sendROIToProcessor(); + } } // update #nchans and databytes, as it depends on #samples, roi, readoutflags (ctb only) - if (thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH) { - updateTotalNumberOfChannels(); + if (detector_shm()->myDetectorType == CHIPTESTBOARD || detector_shm()->myDetectorType == MOENCH) { + updateTotalNumberOfChannels(); } - if (!n) { FILE_LOG(logERROR) << "Could not update detector, received 0 bytes"; } @@ -1163,8 +1056,8 @@ int slsDetector::updateDetector() { int ret = FAIL; FILE_LOG(logDEBUG1) << "Sending update client to detector server"; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, nullptr, 0, nullptr, 0); // if it returns ok (jungfrau in programming mode), dont update if (ret == FORCE_UPDATE) { @@ -1217,7 +1110,7 @@ int slsDetector::writeConfigurationFile(std::ofstream &outfile, multiSlsDetector names.emplace_back("rx_hostname"); names.emplace_back("r_readfreq"); // detector specific config - switch (thisDetector->myDetectorType) { + switch (detector_shm()->myDetectorType) { case GOTTHARD: names.emplace_back("extsig:0"); names.emplace_back("vhighvoltage"); @@ -1240,7 +1133,7 @@ int slsDetector::writeConfigurationFile(std::ofstream &outfile, multiSlsDetector names.emplace_back("vhighvoltage"); break; default: - FILE_LOG(logERROR) << "Unknown detector type " << thisDetector->myDetectorType; + FILE_LOG(logERROR) << "Unknown detector type " << detector_shm()->myDetectorType; setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); return FAIL; } @@ -1255,14 +1148,14 @@ int slsDetector::writeConfigurationFile(std::ofstream &outfile, multiSlsDetector } std::string slsDetector::getSettingsFile() { - std::string s(thisDetector->settingsFile); + std::string s(detector_shm()->settingsFile); // return without suffix .sn[detid] if (s.length() > 6) { if (s.substr(s.length() - 6, 3) == std::string(".sn") && s.substr(s.length() - 3) != std::string("xxx")) { return s.substr(0, s.length() - 6); } } - return std::string(thisDetector->settingsFile); + return std::string(detector_shm()->settingsFile); } // int slsDetector::writeSettingsFile(const std::string &fname) { @@ -1282,15 +1175,15 @@ slsDetectorDefs::detectorSettings slsDetector::setSettings(detectorSettings iset } // eiger: only set shm, setting threshold loads the module data - if (thisDetector->myDetectorType == EIGER) { + if (detector_shm()->myDetectorType == EIGER) { switch (isettings) { case STANDARD: case HIGHGAIN: case LOWGAIN: case VERYHIGHGAIN: case VERYLOWGAIN: - thisDetector->currentSettings = isettings; - return thisDetector->currentSettings; + detector_shm()->currentSettings = isettings; + return detector_shm()->currentSettings; default: FILE_LOG(logERROR) << "Unknown settings " << getDetectorSettings(isettings) << " for this detector!"; setErrorMask((getErrorMask()) | (SETTINGS_NOT_SET)); @@ -1309,8 +1202,8 @@ slsDetectorDefs::detectorSettings slsDetector::sendSettingsOnly(detectorSettings int retval = -1; FILE_LOG(logDEBUG1) << "Setting settings to " << arg; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); client.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); // handle ret @@ -1318,31 +1211,31 @@ slsDetectorDefs::detectorSettings slsDetector::sendSettingsOnly(detectorSettings setErrorMask((getErrorMask()) | (SETTINGS_NOT_SET)); } else { FILE_LOG(logDEBUG1) << "Settings: " << retval; - thisDetector->currentSettings = (detectorSettings)retval; + detector_shm()->currentSettings = (detectorSettings)retval; } } if (ret == FORCE_UPDATE) { updateDetector(); } - return thisDetector->currentSettings; + return detector_shm()->currentSettings; } int slsDetector::getThresholdEnergy() { // moench - get threshold energy from processor (due to different clients, diff shm) - if (thisDetector->myDetectorType == MOENCH) { - // get json from rxr, parse for threshold and update shm - getAdditionalJsonHeader(); - std::string result = getAdditionalJsonParameter("threshold"); + if (detector_shm()->myDetectorType == MOENCH) { + // get json from rxr, parse for threshold and update shm + getAdditionalJsonHeader(); + std::string result = getAdditionalJsonParameter("threshold"); // convert to integer try { - // udpate shm - thisDetector->currentThresholdEV = stoi(result); - return thisDetector->currentThresholdEV; + // udpate shm + detector_shm()->currentThresholdEV = stoi(result); + return detector_shm()->currentThresholdEV; } // not found or cannot scan integer - catch(...) { + catch (...) { return -1; } } @@ -1352,8 +1245,8 @@ int slsDetector::getThresholdEnergy() { int retval = -1; FILE_LOG(logDEBUG1) << "Getting threshold energy"; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, nullptr, 0, &retval, sizeof(retval)); // handle ret @@ -1361,33 +1254,33 @@ int slsDetector::getThresholdEnergy() { setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); } else { FILE_LOG(logDEBUG1) << "Threshold: " << retval; - thisDetector->currentThresholdEV = retval; + detector_shm()->currentThresholdEV = retval; } } if (ret == FORCE_UPDATE) { ret = updateDetector(); } - return thisDetector->currentThresholdEV; + return detector_shm()->currentThresholdEV; } int slsDetector::setThresholdEnergy(int e_eV, detectorSettings isettings, int tb) { // check as there is client processing - if (thisDetector->myDetectorType == EIGER) { + if (detector_shm()->myDetectorType == EIGER) { setThresholdEnergyAndSettings(e_eV, isettings, tb); - return thisDetector->currentThresholdEV; + return detector_shm()->currentThresholdEV; } // moench - send threshold energy to processor - else if (thisDetector->myDetectorType == MOENCH) { - std::string result = setAdditionalJsonParameter("threshold", std::to_string(e_eV)); - if (result == std::to_string(e_eV)) { - // update shm - thisDetector->currentThresholdEV = e_eV; - return thisDetector->currentThresholdEV; - } - return -1; + else if (detector_shm()->myDetectorType == MOENCH) { + std::string result = setAdditionalJsonParameter("threshold", std::to_string(e_eV)); + if (result == std::to_string(e_eV)) { + // update shm + detector_shm()->currentThresholdEV = e_eV; + return detector_shm()->currentThresholdEV; + } + return -1; } FILE_LOG(logERROR) << "Set threshold energy not implemented for this detector"; @@ -1398,28 +1291,28 @@ int slsDetector::setThresholdEnergy(int e_eV, detectorSettings isettings, int tb int slsDetector::setThresholdEnergyAndSettings(int e_eV, detectorSettings isettings, int tb) { // if settings provided, use that, else use the shared memory variable - detectorSettings is = ((isettings != GET_SETTINGS) ? isettings : thisDetector->currentSettings); + detectorSettings is = ((isettings != GET_SETTINGS) ? isettings : detector_shm()->currentSettings); std::string ssettings; switch (is) { case STANDARD: ssettings = "/standard"; - thisDetector->currentSettings = STANDARD; + detector_shm()->currentSettings = STANDARD; break; case HIGHGAIN: ssettings = "/highgain"; - thisDetector->currentSettings = HIGHGAIN; + detector_shm()->currentSettings = HIGHGAIN; break; case LOWGAIN: ssettings = "/lowgain"; - thisDetector->currentSettings = LOWGAIN; + detector_shm()->currentSettings = LOWGAIN; break; case VERYHIGHGAIN: ssettings = "/veryhighgain"; - thisDetector->currentSettings = VERYHIGHGAIN; + detector_shm()->currentSettings = VERYHIGHGAIN; break; case VERYLOWGAIN: ssettings = "/verylowgain"; - thisDetector->currentSettings = VERYLOWGAIN; + detector_shm()->currentSettings = VERYLOWGAIN; break; default: FILE_LOG(logERROR) << "Unknown settings " << getDetectorSettings(is) << " for this detector!"; @@ -1428,9 +1321,9 @@ int slsDetector::setThresholdEnergyAndSettings(int e_eV, detectorSettings isetti } //verify e_eV exists in trimEneregies[] - if (!thisDetector->nTrimEn || - (e_eV < thisDetector->trimEnergies[0]) || - (e_eV > thisDetector->trimEnergies[thisDetector->nTrimEn - 1])) { + if (!detector_shm()->nTrimEn || + (e_eV < detector_shm()->trimEnergies[0]) || + (e_eV > detector_shm()->trimEnergies[detector_shm()->nTrimEn - 1])) { FILE_LOG(logERROR) << "This energy " << e_eV << " not defined for this module!"; setErrorMask((getErrorMask()) | (SETTINGS_NOT_SET)); return FAIL; @@ -1438,8 +1331,8 @@ int slsDetector::setThresholdEnergyAndSettings(int e_eV, detectorSettings isetti //find if interpolation required bool interpolate = true; - for (int i = 0; i < thisDetector->nTrimEn; ++i) { - if (thisDetector->trimEnergies[i] == e_eV) { + for (int i = 0; i < detector_shm()->nTrimEn; ++i) { + if (detector_shm()->trimEnergies[i] == e_eV) { interpolate = false; break; } @@ -1452,7 +1345,7 @@ int slsDetector::setThresholdEnergyAndSettings(int e_eV, detectorSettings isetti if (!interpolate) { //find their directory names std::ostringstream ostfn; - ostfn << thisDetector->settingsDir << ssettings << "/" << e_eV << "eV" + ostfn << detector_shm()->settingsDir << ssettings << "/" << e_eV << "eV" << "/noise.sn" << std::setfill('0') << std::setw(3) << std::dec << getId(DETECTOR_SERIAL_NUMBER) << std::setbase(10); std::string settingsfname = ostfn.str(); FILE_LOG(logDEBUG1) << "Settings File is " << settingsfname; @@ -1471,21 +1364,21 @@ int slsDetector::setThresholdEnergyAndSettings(int e_eV, detectorSettings isetti else { //find the trim values int trim1 = -1, trim2 = -1; - for (int i = 0; i < thisDetector->nTrimEn; ++i) { - if (e_eV < thisDetector->trimEnergies[i]) { - trim2 = thisDetector->trimEnergies[i]; - trim1 = thisDetector->trimEnergies[i - 1]; + for (int i = 0; i < detector_shm()->nTrimEn; ++i) { + if (e_eV < detector_shm()->trimEnergies[i]) { + trim2 = detector_shm()->trimEnergies[i]; + trim1 = detector_shm()->trimEnergies[i - 1]; break; } } //find their directory names std::ostringstream ostfn; - ostfn << thisDetector->settingsDir << ssettings << "/" << trim1 << "eV" + ostfn << detector_shm()->settingsDir << ssettings << "/" << trim1 << "eV" << "/noise.sn" << std::setfill('0') << std::setw(3) << std::dec << getId(DETECTOR_SERIAL_NUMBER) << std::setbase(10); std::string settingsfname1 = ostfn.str(); ostfn.str(""); ostfn.clear(); - ostfn << thisDetector->settingsDir << ssettings << "/" << trim2 << "eV" + ostfn << detector_shm()->settingsDir << ssettings << "/" << trim2 << "eV" << "/noise.sn" << std::setfill('0') << std::setw(3) << std::dec << getId(DETECTOR_SERIAL_NUMBER) << std::setbase(10); std::string settingsfname2 = ostfn.str(); //read the files @@ -1530,7 +1423,7 @@ int slsDetector::setThresholdEnergyAndSettings(int e_eV, detectorSettings isetti deleteModule(myMod2); } - myMod->reg = thisDetector->currentSettings; + myMod->reg = detector_shm()->currentSettings; myMod->eV = e_eV; setModule(*myMod, tb); deleteModule(myMod); @@ -1543,12 +1436,12 @@ int slsDetector::setThresholdEnergyAndSettings(int e_eV, detectorSettings isetti } std::string slsDetector::getSettingsDir() { - return std::string(thisDetector->settingsDir); + return std::string(detector_shm()->settingsDir); } std::string slsDetector::setSettingsDir(const std::string &dir) { - sls::strcpy_safe(thisDetector->settingsDir, dir.c_str()); - return thisDetector->settingsDir; + sls::strcpy_safe(detector_shm()->settingsDir, dir.c_str()); + return detector_shm()->settingsDir; } int slsDetector::loadSettingsFile(const std::string &fname) { @@ -1557,7 +1450,7 @@ int slsDetector::loadSettingsFile(const std::string &fname) { ostfn << fname; // find specific file if it has detid in file name (.snxxx) - if (thisDetector->myDetectorType == EIGER) { + if (detector_shm()->myDetectorType == EIGER) { if (fname.find(".sn") == std::string::npos && fname.find(".trim") == std::string::npos && fname.find(".settings") == std::string::npos) { ostfn << ".sn" << std::setfill('0') << std::setw(3) << std::dec << getId(DETECTOR_SERIAL_NUMBER); } @@ -1585,7 +1478,7 @@ int slsDetector::saveSettingsFile(const std::string &fname) { ostfn << fname; // find specific file if it has detid in file name (.snxxx) - if (thisDetector->myDetectorType == EIGER) { + if (detector_shm()->myDetectorType == EIGER) { ostfn << ".sn" << std::setfill('0') << std::setw(3) << std::dec << getId(DETECTOR_SERIAL_NUMBER); } fn = ostfn.str(); @@ -1606,8 +1499,8 @@ slsDetectorDefs::runStatus slsDetector::getRunStatus() { runStatus retval = ERROR; FILE_LOG(logDEBUG1) << "Getting status"; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto stop = sls::ClientSocket(false, thisDetector->hostname, thisDetector->stopPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto stop = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->stopPort); ret = stop.sendCommandThenRead(fnum, nullptr, 0, &retval, sizeof(retval)); if (ret == FAIL) { @@ -1627,8 +1520,8 @@ int slsDetector::prepareAcquisition() { int ret = FAIL; FILE_LOG(logDEBUG1) << "Preparing Detector for Acquisition"; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, nullptr, 0, nullptr, 0); // handle ret @@ -1649,9 +1542,9 @@ int slsDetector::startAcquisition() { int ret = FAIL; FILE_LOG(logDEBUG1) << "Starting Acquisition"; - thisDetector->stoppedFlag = 0; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + detector_shm()->stoppedFlag = 0; + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, nullptr, 0, nullptr, 0); // handle ret @@ -1670,7 +1563,7 @@ int slsDetector::startAcquisition() { int slsDetector::stopAcquisition() { // get status before stopping acquisition runStatus s = ERROR, r = ERROR; - if (thisDetector->receiver_upstream) { + if (detector_shm()->receiver_upstream) { s = getRunStatus(); r = getReceiverStatus(); } @@ -1678,8 +1571,8 @@ int slsDetector::stopAcquisition() { int ret = FAIL; FILE_LOG(logDEBUG1) << "Stopping Acquisition"; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto stop = sls::ClientSocket(false, thisDetector->hostname, thisDetector->stopPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto stop = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->stopPort); ret = stop.sendCommandThenRead(fnum, nullptr, 0, nullptr, 0); if (ret == FAIL) { @@ -1691,9 +1584,9 @@ int slsDetector::stopAcquisition() { } } } - thisDetector->stoppedFlag = 1; + detector_shm()->stoppedFlag = 1; // if rxr streaming and acquisition finished, restream dummy stop packet - if ((thisDetector->receiver_upstream) && (s == IDLE) && (r == IDLE)) { + if ((detector_shm()->receiver_upstream) && (s == IDLE) && (r == IDLE)) { restreamStopFromReceiver(); } return ret; @@ -1704,9 +1597,9 @@ int slsDetector::sendSoftwareTrigger() { int ret = FAIL; FILE_LOG(logDEBUG1) << "Sending software trigger"; - thisDetector->stoppedFlag = 0; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + detector_shm()->stoppedFlag = 0; + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, nullptr, 0, nullptr, 0); // handle ret @@ -1727,14 +1620,14 @@ int slsDetector::startAndReadAll() { int ret = FAIL; FILE_LOG(logDEBUG1) << "Starting and reading all frames"; - thisDetector->stoppedFlag = 0; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + detector_shm()->stoppedFlag = 0; + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, nullptr, 0, nullptr, 0); // handle ret if (ret == FAIL) { - thisDetector->stoppedFlag = 1; + detector_shm()->stoppedFlag = 1; setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); } else { FILE_LOG(logDEBUG1) << "Detector successfully finished acquisition"; @@ -1751,8 +1644,8 @@ int slsDetector::startReadOut() { int ret = FAIL; FILE_LOG(logDEBUG1) << "Starting readout"; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, nullptr, 0, nullptr, 0); // handle ret @@ -1772,13 +1665,13 @@ int slsDetector::readAll() { int fnum = F_READ_ALL; int ret = FAIL; FILE_LOG(logDEBUG1) << "Reading all frames"; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, nullptr, 0, nullptr, 0); // handle ret if (ret == FAIL) { - thisDetector->stoppedFlag = 1; + detector_shm()->stoppedFlag = 1; setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); } else { FILE_LOG(logDEBUG1) << "Detector successfully finished reading all frames"; @@ -1801,26 +1694,26 @@ int slsDetector::configureMAC() { FILE_LOG(logDEBUG1) << "Configuring MAC"; // if rx_udpip is none - if (!(strcmp(thisDetector->receiverUDPIP, "none"))) { + if (!(strcmp(detector_shm()->receiverUDPIP, "none"))) { //hostname is an ip address - if (strchr(thisDetector->receiver_hostname, '.') != nullptr) { - sls::strcpy_safe(thisDetector->receiverUDPIP, thisDetector->receiver_hostname); + if (strchr(detector_shm()->receiver_hostname, '.') != nullptr) { + sls::strcpy_safe(detector_shm()->receiverUDPIP, detector_shm()->receiver_hostname); //if hostname not ip, convert it to ip } else { struct addrinfo *result; - if (sls::ConvertHostnameToInternetAddress(thisDetector->receiver_hostname, &result) == 0) { + if (sls::ConvertHostnameToInternetAddress(detector_shm()->receiver_hostname, &result) == 0) { // on success - memset(thisDetector->receiverUDPIP, 0, MAX_STR_LENGTH); + memset(detector_shm()->receiverUDPIP, 0, MAX_STR_LENGTH); // on failure, back to none - if (sls::ConvertInternetAddresstoIpString(result, thisDetector->receiverUDPIP, MAX_STR_LENGTH)) { - sls::strcpy_safe(thisDetector->receiverUDPIP, "none"); + if (sls::ConvertInternetAddresstoIpString(result, detector_shm()->receiverUDPIP, MAX_STR_LENGTH)) { + sls::strcpy_safe(detector_shm()->receiverUDPIP, "none"); } } } } // rx_udpip and rx_udpmac is none - if ((!strcmp(thisDetector->receiverUDPIP, "none")) || - (!strcmp(thisDetector->receiverUDPMAC, "none"))) { + if ((!strcmp(detector_shm()->receiverUDPIP, "none")) || + (!strcmp(detector_shm()->receiverUDPMAC, "none"))) { FILE_LOG(logERROR) << "Configure MAC Error. IP/MAC Addresses not set"; setErrorMask((getErrorMask()) | (COULD_NOT_CONFIGURE_MAC)); return FAIL; @@ -1828,20 +1721,20 @@ int slsDetector::configureMAC() { FILE_LOG(logDEBUG1) << "rx_hostname and rx_udpip is valid "; // copy to args - sls::strcpy_safe(args[0], thisDetector->receiverUDPIP); - sls::strcpy_safe(args[1], thisDetector->receiverUDPMAC); - snprintf(args[2], array_size, "%x", thisDetector->receiverUDPPort); - sls::strcpy_safe(args[3], thisDetector->detectorMAC); - sls::strcpy_safe(args[4], thisDetector->detectorIP); - snprintf(args[5], array_size, "%x", thisDetector->receiverUDPPort2); + sls::strcpy_safe(args[0], detector_shm()->receiverUDPIP); + sls::strcpy_safe(args[1], detector_shm()->receiverUDPMAC); + snprintf(args[2], array_size, "%x", detector_shm()->receiverUDPPort); + sls::strcpy_safe(args[3], detector_shm()->detectorMAC); + sls::strcpy_safe(args[4], detector_shm()->detectorIP); + snprintf(args[5], array_size, "%x", detector_shm()->receiverUDPPort2); // 2d positions to detector to put into udp header { int pos[3] = {0, 0, 0}; - int max = thisDetector->multiSize[1]; + int max = detector_shm()->multiSize[1]; // row pos[0] = (detId % max); // col for horiz. udp ports - pos[1] = (detId / max) * ((thisDetector->myDetectorType == EIGER) ? 2 : 1); + pos[1] = (detId / max) * ((detector_shm()->myDetectorType == EIGER) ? 2 : 1); // pos[2] (z is reserved) FILE_LOG(logDEBUG1) << "Detector [" << detId << "] - (" << pos[0] << "," << pos[1] << ")"; @@ -1872,8 +1765,8 @@ int slsDetector::configureMAC() { FILE_LOG(logDEBUG1) << "reserved:" << args[8] << "-"; // send to server - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, args, sizeof(args), retvals, sizeof(retvals)); // handle ret @@ -1898,15 +1791,15 @@ int slsDetector::configureMAC() { (idetectorip >> 8) & 0xff, (idetectorip)&0xff); // update if different - if (strcasecmp(retvals[0], thisDetector->detectorMAC)) { - // memset(thisDetector->detectorMAC, 0, MAX_STR_LENGTH); - sls::strcpy_safe(thisDetector->detectorMAC, retvals[0]); - FILE_LOG(logINFO) << detId << ": Detector MAC updated to " << thisDetector->detectorMAC; + if (strcasecmp(retvals[0], detector_shm()->detectorMAC)) { + // memset(detector_shm()->detectorMAC, 0, MAX_STR_LENGTH); + sls::strcpy_safe(detector_shm()->detectorMAC, retvals[0]); + FILE_LOG(logINFO) << detId << ": Detector MAC updated to " << detector_shm()->detectorMAC; } - if (strcasecmp(retvals[1], thisDetector->detectorIP)) { - // memset(thisDetector->detectorIP, 0, MAX_STR_LENGTH); - sls::strcpy_safe(thisDetector->detectorIP, retvals[1]); - FILE_LOG(logINFO) << detId << ": Detector IP updated to " << thisDetector->detectorIP; + if (strcasecmp(retvals[1], detector_shm()->detectorIP)) { + // memset(detector_shm()->detectorIP, 0, MAX_STR_LENGTH); + sls::strcpy_safe(detector_shm()->detectorIP, retvals[1]); + FILE_LOG(logINFO) << detId << ": Detector IP updated to " << detector_shm()->detectorIP; } } } @@ -1926,27 +1819,27 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t) { // meausurement is only shm level if (index == MEASUREMENTS_NUMBER) { if (t >= 0) { - thisDetector->timerValue[index] = t; + detector_shm()->timerValue[index] = t; FILE_LOG(logDEBUG1) << getTimerType(index) << ": " << t; } - return thisDetector->timerValue[index]; + return detector_shm()->timerValue[index]; } // send to detector - int64_t oldtimer = thisDetector->timerValue[index]; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + int64_t oldtimer = detector_shm()->timerValue[index]; + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, args, sizeof(args), &retval, sizeof(retval)); // handle ret if (ret == FAIL) { setErrorMask((getErrorMask()) | (DETECTOR_TIMER_VALUE_NOT_SET)); } else { FILE_LOG(logDEBUG1) << getTimerType(index) << ": " << retval; - thisDetector->timerValue[index] = retval; + detector_shm()->timerValue[index] = retval; // update #nchans and databytes, as it depends on #samples, roi, readoutflags (ctb only) if (index == SAMPLES && - (thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH)) { - updateTotalNumberOfChannels(); + (detector_shm()->myDetectorType == CHIPTESTBOARD || detector_shm()->myDetectorType == MOENCH)) { + updateTotalNumberOfChannels(); } if (ret == FORCE_UPDATE) { client.close(); @@ -1957,10 +1850,10 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t) { // setting timers consequences (eiger (ratecorr) ) // (a get can also change timer value, hence check difference) - if (oldtimer != thisDetector->timerValue[index]) { + if (oldtimer != detector_shm()->timerValue[index]) { // eiger: change exptime/subexptime, set rate correction to update table - if (thisDetector->myDetectorType == EIGER) { - int dr = thisDetector->dynamicRange; + if (detector_shm()->myDetectorType == EIGER) { + int dr = detector_shm()->dynamicRange; if ((dr == 32 && index == SUBFRAME_ACQUISITION_TIME) || (dr == 16 && index == ACQUISITION_TIME)) { int r = getRateCorrection(); @@ -1972,8 +1865,8 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t) { } // send to reciever - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG && ret == OK) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG && ret == OK) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); // char mess[MAX_STR_LENGTH]{}; switch (index) { case FRAME_NUMBER: @@ -1987,15 +1880,15 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t) { // send fnum = F_SET_RECEIVER_TIMER; ret = FAIL; - args[1] = thisDetector->timerValue[index]; // to the value given by detector + args[1] = detector_shm()->timerValue[index]; // to the value given by detector retval = -1; // rewrite args if ((index == FRAME_NUMBER) || (index == CYCLES_NUMBER) || (index == STORAGE_CELL_NUMBER)) { - args[1] = thisDetector->timerValue[FRAME_NUMBER] * - ((thisDetector->timerValue[CYCLES_NUMBER] > 0) ? (thisDetector->timerValue[CYCLES_NUMBER]) : 1) * - ((thisDetector->timerValue[STORAGE_CELL_NUMBER] > 0) - ? (thisDetector->timerValue[STORAGE_CELL_NUMBER]) + 1 + args[1] = detector_shm()->timerValue[FRAME_NUMBER] * + ((detector_shm()->timerValue[CYCLES_NUMBER] > 0) ? (detector_shm()->timerValue[CYCLES_NUMBER]) : 1) * + ((detector_shm()->timerValue[STORAGE_CELL_NUMBER] > 0) + ? (detector_shm()->timerValue[STORAGE_CELL_NUMBER]) + 1 : 1); } FILE_LOG(logDEBUG1) << "Sending " << (((index == FRAME_NUMBER) || (index == CYCLES_NUMBER) || (index == STORAGE_CELL_NUMBER)) ? "(#Frames) * (#cycles) * (#storage cells)" : getTimerType(index)) << " to receiver: " << args[1]; @@ -2035,7 +1928,7 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t) { break; } } - return thisDetector->timerValue[index]; + return detector_shm()->timerValue[index]; } int64_t slsDetector::getTimeLeft(timerIndex index) { @@ -2044,8 +1937,8 @@ int64_t slsDetector::getTimeLeft(timerIndex index) { int64_t retval = -1; FILE_LOG(logDEBUG1) << "Getting " << getTimerType(index) << " left"; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto stop = sls::ClientSocket(false, thisDetector->hostname, thisDetector->stopPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto stop = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->stopPort); ret = stop.sendCommandThenRead(fnum, &index, sizeof(index), &retval, sizeof(retval)); // handle ret @@ -2068,8 +1961,8 @@ int slsDetector::setSpeed(speedVariable sp, int value) { int retval = -1; FILE_LOG(logDEBUG1) << "Setting speed index " << sp << " to " << value; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, args, sizeof(args), &retval, sizeof(retval)); // handle ret @@ -2092,19 +1985,19 @@ int slsDetector::setDynamicRange(int n) { FILE_LOG(logDEBUG1) << "Setting dynamic range to " << n; // send to detector - int olddr = thisDetector->dynamicRange; - if (thisDetector->onlineFlag == ONLINE_FLAG) { + int olddr = detector_shm()->dynamicRange; + if (detector_shm()->onlineFlag == ONLINE_FLAG) { // char mess[MAX_STR_LENGTH] = {}; - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, &n, sizeof(n), &retval, sizeof(retval)); - if (ret == FAIL) { //TODO (Dhanya) handle FAIL at least - setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); // may or may not be a fail, but better to have it till we introduce proper error handling + if (ret == FAIL) { //TODO (Dhanya) handle FAIL at least + setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); // may or may not be a fail, but better to have it till we introduce proper error handling } // handle ret //TODO! (Erik) handle FAIL somehow // if (ret == FAIL) { // // eiger: dr set correctly, consequent rate correction was a problem - // if ((thisDetector->myDetectorType == EIGER && + // if ((detector_shm()->myDetectorType == EIGER && // strstr(mess, "Rate Correction") != nullptr)) { // // rate correction is switched off if not 32 bit mode // if (strstr(mess, "32") != nullptr) { @@ -2120,7 +2013,7 @@ int slsDetector::setDynamicRange(int n) { // ret might be set to OK above if (ret != FAIL) { FILE_LOG(logDEBUG1) << "Dynamic Range: " << retval; - thisDetector->dynamicRange = retval; + detector_shm()->dynamicRange = retval; if (ret == FORCE_UPDATE) { client.close(); ret = updateDetector(); @@ -2131,26 +2024,26 @@ int slsDetector::setDynamicRange(int n) { // only for eiger // setting dr consequences on databytes shm // (a get can also change timer value, hence check difference) - if (olddr != thisDetector->dynamicRange) { - thisDetector->dataBytes = thisDetector->nChips * thisDetector->nChans * retval / 8; - thisDetector->dataBytesInclGapPixels = - (thisDetector->nChip[X] * thisDetector->nChan[X] + - thisDetector->gappixels * thisDetector->nGappixels[X]) * - (thisDetector->nChip[Y] * thisDetector->nChan[Y] + - thisDetector->gappixels * thisDetector->nGappixels[Y]) * + if (olddr != detector_shm()->dynamicRange) { + detector_shm()->dataBytes = detector_shm()->nChips * detector_shm()->nChans * retval / 8; + detector_shm()->dataBytesInclGapPixels = + (detector_shm()->nChip[X] * detector_shm()->nChan[X] + + detector_shm()->gappixels * detector_shm()->nGappixels[X]) * + (detector_shm()->nChip[Y] * detector_shm()->nChan[Y] + + detector_shm()->gappixels * detector_shm()->nGappixels[Y]) * retval / 8; - FILE_LOG(logDEBUG1) << "Data bytes " << thisDetector->dataBytes; - FILE_LOG(logDEBUG1) << "Data bytes including gap pixels" << thisDetector->dataBytesInclGapPixels; + FILE_LOG(logDEBUG1) << "Data bytes " << detector_shm()->dataBytes; + FILE_LOG(logDEBUG1) << "Data bytes including gap pixels" << detector_shm()->dataBytesInclGapPixels; } // send to receiver - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG && ret == OK) { + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG && ret == OK) { fnum = F_SET_RECEIVER_DYNAMIC_RANGE; ret = FAIL; - n = thisDetector->dynamicRange; + n = detector_shm()->dynamicRange; retval = -1; FILE_LOG(logDEBUG1) << "Sending dynamic range to receiver: " << n; - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, &n, sizeof(n), &retval, sizeof(retval)); // handle ret @@ -2164,15 +2057,15 @@ int slsDetector::setDynamicRange(int n) { } } } - return thisDetector->dynamicRange; + return detector_shm()->dynamicRange; } int slsDetector::getDataBytes() { - return thisDetector->dataBytes; + return detector_shm()->dataBytes; } int slsDetector::getDataBytesInclGapPixels() { - return thisDetector->dataBytesInclGapPixels; + return detector_shm()->dataBytesInclGapPixels; } int slsDetector::setDAC(int val, dacIndex index, int mV) { @@ -2182,8 +2075,8 @@ int slsDetector::setDAC(int val, dacIndex index, int mV) { int retval = -1; FILE_LOG(logDEBUG1) << "Setting DAC " << index << " to " << val << (mV ? "mV" : "dac units"); - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, args, sizeof(args), &retval, sizeof(retval)); // handle ret @@ -2207,8 +2100,8 @@ int slsDetector::getADC(dacIndex index) { int retval = -1; FILE_LOG(logDEBUG1) << "Getting ADC " << index; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); // handle ret @@ -2231,8 +2124,8 @@ slsDetectorDefs::externalCommunicationMode slsDetector::setExternalCommunication externalCommunicationMode retval = GET_EXTERNAL_COMMUNICATION_MODE; FILE_LOG(logDEBUG1) << "Setting communication to mode " << pol; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); // handle ret @@ -2256,8 +2149,8 @@ slsDetectorDefs::externalSignalFlag slsDetector::setExternalSignalFlags( externalSignalFlag retval = GET_EXTERNAL_SIGNAL_FLAG; FILE_LOG(logDEBUG1) << "Setting signal " << signalindex << " to flag " << pol; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, args, sizeof(args), &retval, sizeof(retval)); // handle ret @@ -2280,8 +2173,8 @@ int slsDetector::setReadOutFlags(readOutFlags flag) { readOutFlags retval = GET_READOUT_FLAGS; FILE_LOG(logDEBUG1) << "Setting readout flags to " << flag; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); // handle ret @@ -2289,10 +2182,10 @@ int slsDetector::setReadOutFlags(readOutFlags flag) { setErrorMask((getErrorMask()) | (COULD_NOT_SET_READOUT_FLAGS)); } else { FILE_LOG(logDEBUG1) << "Readout flag: " << retval; - thisDetector->roFlags = (readOutFlags)retval; + detector_shm()->roFlags = (readOutFlags)retval; // update #nchans and databytes, as it depends on #samples, roi, readoutflags (ctb only) - if (thisDetector->myDetectorType == CHIPTESTBOARD) { - updateTotalNumberOfChannels(); + if (detector_shm()->myDetectorType == CHIPTESTBOARD) { + updateTotalNumberOfChannels(); } } } @@ -2302,29 +2195,29 @@ int slsDetector::setReadOutFlags(readOutFlags flag) { // sending to receiver if (ret != FAIL) { - fnum = F_RECEIVER_SET_READOUT_FLAGS; - ret = FAIL; - arg = thisDetector->roFlags; - retval = (readOutFlags) -1; - FILE_LOG(logDEBUG1) << "Setting receiver readout flags to " << arg; + fnum = F_RECEIVER_SET_READOUT_FLAGS; + ret = FAIL; + arg = detector_shm()->roFlags; + retval = (readOutFlags)-1; + FILE_LOG(logDEBUG1) << "Setting receiver readout flags to " << arg; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); - ret = receiver.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); + ret = receiver.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); - // handle ret - if (ret == FAIL) { - setErrorMask((getErrorMask()) | (COULD_NOT_SET_READOUT_FLAGS)); - } else { - FILE_LOG(logDEBUG1) << "Receiver readout flag: " << retval; - } - } - if (ret == FORCE_UPDATE) { - ret = updateReceiver(); - } + // handle ret + if (ret == FAIL) { + setErrorMask((getErrorMask()) | (COULD_NOT_SET_READOUT_FLAGS)); + } else { + FILE_LOG(logDEBUG1) << "Receiver readout flag: " << retval; + } + } + if (ret == FORCE_UPDATE) { + ret = updateReceiver(); + } } - return thisDetector->roFlags; + return detector_shm()->roFlags; } uint32_t slsDetector::writeRegister(uint32_t addr, uint32_t val) { @@ -2334,8 +2227,8 @@ uint32_t slsDetector::writeRegister(uint32_t addr, uint32_t val) { uint32_t retval = -1; FILE_LOG(logDEBUG1) << "Writing to register 0x" << std::hex << addr << "data: 0x" << std::hex << val << std::dec; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, args, sizeof(args), &retval, sizeof(retval)); // handle ret @@ -2358,8 +2251,8 @@ uint32_t slsDetector::readRegister(uint32_t addr) { uint32_t retval = -1; FILE_LOG(logDEBUG1) << "Reading register 0x" << std::hex << addr << std::dec; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); // handle ret @@ -2413,18 +2306,18 @@ std::string slsDetector::setDetectorMAC(const std::string &detectorMAC) { } // valid format else { - sls::strcpy_safe(thisDetector->detectorMAC, detectorMAC.c_str()); - if (!strcmp(thisDetector->receiver_hostname, "none")) { + sls::strcpy_safe(detector_shm()->detectorMAC, detectorMAC.c_str()); + if (!strcmp(detector_shm()->receiver_hostname, "none")) { FILE_LOG(logDEBUG1) << "Receiver hostname not set yet"; } else if (setUDPConnection() == FAIL) { FILE_LOG(logWARNING) << "UDP connection set up failed"; } } - return std::string(thisDetector->detectorMAC); + return std::string(detector_shm()->detectorMAC); } std::string slsDetector::getDetectorMAC() { - return std::string(thisDetector->detectorMAC); + return std::string(detector_shm()->detectorMAC); } std::string slsDetector::setDetectorIP(const std::string &detectorIP) { @@ -2439,29 +2332,29 @@ std::string slsDetector::setDetectorIP(const std::string &detectorIP) { } // valid format else { - sls::strcpy_safe(thisDetector->detectorIP, detectorIP.c_str()); - if (!strcmp(thisDetector->receiver_hostname, "none")) { + sls::strcpy_safe(detector_shm()->detectorIP, detectorIP.c_str()); + if (!strcmp(detector_shm()->receiver_hostname, "none")) { FILE_LOG(logDEBUG1) << "Receiver hostname not set yet"; } else if (setUDPConnection() == FAIL) { FILE_LOG(logWARNING) << "UDP connection set up failed"; } } } - return std::string(thisDetector->detectorIP); + return std::string(detector_shm()->detectorIP); } std::string slsDetector::getDetectorIP() { - return std::string(thisDetector->detectorIP); + return std::string(detector_shm()->detectorIP); } std::string slsDetector::setReceiver(const std::string &receiverIP) { FILE_LOG(logDEBUG1) << "Setting up Receiver with " << receiverIP; // recieverIP is none if (receiverIP == "none") { - memset(thisDetector->receiver_hostname, 0, MAX_STR_LENGTH); - sls::strcpy_safe(thisDetector->receiver_hostname, "none"); - thisDetector->receiverOnlineFlag = OFFLINE_FLAG; - return std::string(thisDetector->receiver_hostname); + memset(detector_shm()->receiver_hostname, 0, MAX_STR_LENGTH); + sls::strcpy_safe(detector_shm()->receiver_hostname, "none"); + detector_shm()->receiverOnlineFlag = OFFLINE_FLAG; + return std::string(detector_shm()->receiver_hostname); } // stop acquisition if running if (getRunStatus() == RUNNING) { @@ -2472,76 +2365,76 @@ std::string slsDetector::setReceiver(const std::string &receiverIP) { updateDetector(); // start updating - sls::strcpy_safe(thisDetector->receiver_hostname, receiverIP.c_str()); + sls::strcpy_safe(detector_shm()->receiver_hostname, receiverIP.c_str()); if (setReceiverOnline(ONLINE_FLAG) == ONLINE_FLAG) { - FILE_LOG(logDEBUG1) << "detector type:" << (slsDetectorDefs::detectorTypeToString(thisDetector->myDetectorType)) << "\ndetector id:" << detId << "\ndetector hostname:" << thisDetector->hostname << "\nfile path:" << thisDetector->receiver_filePath << "\nfile name:" << thisDetector->receiver_fileName << "\nfile index:" << thisDetector->receiver_fileIndex << "\nfile format:" << thisDetector->receiver_fileFormatType << "\nr_framesperfile:" << thisDetector->receiver_framesPerFile << "\nr_discardpolicy:" << thisDetector->receiver_frameDiscardMode << "\nr_padding:" << thisDetector->receiver_framePadding << "\nwrite enable:" << thisDetector->receiver_fileWriteEnable << "\noverwrite enable:" << thisDetector->receiver_overWriteEnable << "\nframe index needed:" << ((thisDetector->timerValue[FRAME_NUMBER] * thisDetector->timerValue[CYCLES_NUMBER]) > 1) << "\nframe period:" << (thisDetector->timerValue[FRAME_PERIOD]) << "\nframe number:" << (thisDetector->timerValue[FRAME_NUMBER]) << "\nsub exp time:" << (thisDetector->timerValue[SUBFRAME_ACQUISITION_TIME]) << "\nsub dead time:" << (thisDetector->timerValue[SUBFRAME_DEADTIME]) << "\nsamples:" << (thisDetector->timerValue[SAMPLES]) << "\ndynamic range:" << thisDetector->dynamicRange << "\nflippeddatax:" << (thisDetector->flippedData[X]) << "\nactivated: " << thisDetector->activated << "\nreceiver deactivated padding: " << thisDetector->receiver_deactivatedPaddingEnable << "\nsilent Mode:" << thisDetector->receiver_silentMode << "\n10GbE:" << thisDetector->tenGigaEnable << "\nGap pixels: " << thisDetector->gappixels << "\nr_readfreq:" << thisDetector->receiver_read_freq << "\nrx streaming port:" << thisDetector->receiver_zmqport << "\nrx streaming source ip:" << thisDetector->receiver_zmqip << "\nrx additional json header:" << thisDetector->receiver_additionalJsonHeader << "\nrx_datastream:" << enableDataStreamingFromReceiver(-1) << std::endl; + FILE_LOG(logDEBUG1) << "detector type:" << (slsDetectorDefs::detectorTypeToString(detector_shm()->myDetectorType)) << "\ndetector id:" << detId << "\ndetector hostname:" << detector_shm()->hostname << "\nfile path:" << detector_shm()->receiver_filePath << "\nfile name:" << detector_shm()->receiver_fileName << "\nfile index:" << detector_shm()->receiver_fileIndex << "\nfile format:" << detector_shm()->receiver_fileFormatType << "\nr_framesperfile:" << detector_shm()->receiver_framesPerFile << "\nr_discardpolicy:" << detector_shm()->receiver_frameDiscardMode << "\nr_padding:" << detector_shm()->receiver_framePadding << "\nwrite enable:" << detector_shm()->receiver_fileWriteEnable << "\noverwrite enable:" << detector_shm()->receiver_overWriteEnable << "\nframe index needed:" << ((detector_shm()->timerValue[FRAME_NUMBER] * detector_shm()->timerValue[CYCLES_NUMBER]) > 1) << "\nframe period:" << (detector_shm()->timerValue[FRAME_PERIOD]) << "\nframe number:" << (detector_shm()->timerValue[FRAME_NUMBER]) << "\nsub exp time:" << (detector_shm()->timerValue[SUBFRAME_ACQUISITION_TIME]) << "\nsub dead time:" << (detector_shm()->timerValue[SUBFRAME_DEADTIME]) << "\nsamples:" << (detector_shm()->timerValue[SAMPLES]) << "\ndynamic range:" << detector_shm()->dynamicRange << "\nflippeddatax:" << (detector_shm()->flippedData[X]) << "\nactivated: " << detector_shm()->activated << "\nreceiver deactivated padding: " << detector_shm()->receiver_deactivatedPaddingEnable << "\nsilent Mode:" << detector_shm()->receiver_silentMode << "\n10GbE:" << detector_shm()->tenGigaEnable << "\nGap pixels: " << detector_shm()->gappixels << "\nr_readfreq:" << detector_shm()->receiver_read_freq << "\nrx streaming port:" << detector_shm()->receiver_zmqport << "\nrx streaming source ip:" << detector_shm()->receiver_zmqip << "\nrx additional json header:" << detector_shm()->receiver_additionalJsonHeader << "\nrx_datastream:" << enableDataStreamingFromReceiver(-1) << std::endl; - if (setDetectorType(thisDetector->myDetectorType) != GENERIC) { + if (setDetectorType(detector_shm()->myDetectorType) != GENERIC) { sendMultiDetectorSize(); setDetectorId(); setDetectorHostname(); setUDPConnection(); - setFilePath(thisDetector->receiver_filePath); - setFileName(thisDetector->receiver_fileName); - setFileIndex(thisDetector->receiver_fileIndex); - setFileFormat(thisDetector->receiver_fileFormatType); - setReceiverFramesPerFile(thisDetector->receiver_framesPerFile); - setReceiverFramesDiscardPolicy(thisDetector->receiver_frameDiscardMode); - setReceiverPartialFramesPadding(thisDetector->receiver_framePadding); - enableWriteToFile(thisDetector->receiver_fileWriteEnable); - overwriteFile(thisDetector->receiver_overWriteEnable); - setTimer(FRAME_PERIOD, thisDetector->timerValue[FRAME_PERIOD]); - setTimer(FRAME_NUMBER, thisDetector->timerValue[FRAME_NUMBER]); - setTimer(ACQUISITION_TIME, thisDetector->timerValue[ACQUISITION_TIME]); + setFilePath(detector_shm()->receiver_filePath); + setFileName(detector_shm()->receiver_fileName); + setFileIndex(detector_shm()->receiver_fileIndex); + setFileFormat(detector_shm()->receiver_fileFormatType); + setReceiverFramesPerFile(detector_shm()->receiver_framesPerFile); + setReceiverFramesDiscardPolicy(detector_shm()->receiver_frameDiscardMode); + setReceiverPartialFramesPadding(detector_shm()->receiver_framePadding); + enableWriteToFile(detector_shm()->receiver_fileWriteEnable); + overwriteFile(detector_shm()->receiver_overWriteEnable); + setTimer(FRAME_PERIOD, detector_shm()->timerValue[FRAME_PERIOD]); + setTimer(FRAME_NUMBER, detector_shm()->timerValue[FRAME_NUMBER]); + setTimer(ACQUISITION_TIME, detector_shm()->timerValue[ACQUISITION_TIME]); // detector specific - switch(thisDetector->myDetectorType) { + switch (detector_shm()->myDetectorType) { case EIGER: - setTimer(SUBFRAME_ACQUISITION_TIME, thisDetector->timerValue[SUBFRAME_ACQUISITION_TIME]); - setTimer(SUBFRAME_DEADTIME, thisDetector->timerValue[SUBFRAME_DEADTIME]); - setDynamicRange(thisDetector->dynamicRange); - setFlippedData(X, -1); - activate(-1); - setDeactivatedRxrPaddingMode(thisDetector->receiver_deactivatedPaddingEnable); - enableGapPixels(thisDetector->gappixels); - enableTenGigabitEthernet(thisDetector->tenGigaEnable); - setReadOutFlags(GET_READOUT_FLAGS); - break; + setTimer(SUBFRAME_ACQUISITION_TIME, detector_shm()->timerValue[SUBFRAME_ACQUISITION_TIME]); + setTimer(SUBFRAME_DEADTIME, detector_shm()->timerValue[SUBFRAME_DEADTIME]); + setDynamicRange(detector_shm()->dynamicRange); + setFlippedData(X, -1); + activate(-1); + setDeactivatedRxrPaddingMode(detector_shm()->receiver_deactivatedPaddingEnable); + enableGapPixels(detector_shm()->gappixels); + enableTenGigabitEthernet(detector_shm()->tenGigaEnable); + setReadOutFlags(GET_READOUT_FLAGS); + break; case CHIPTESTBOARD: - setTimer(SAMPLES, thisDetector->timerValue[SAMPLES]); - enableTenGigabitEthernet(thisDetector->tenGigaEnable); - setReadOutFlags(GET_READOUT_FLAGS); - break; + setTimer(SAMPLES, detector_shm()->timerValue[SAMPLES]); + enableTenGigabitEthernet(detector_shm()->tenGigaEnable); + setReadOutFlags(GET_READOUT_FLAGS); + break; case MOENCH: - setTimer(SAMPLES, thisDetector->timerValue[SAMPLES]); - enableTenGigabitEthernet(thisDetector->tenGigaEnable); - break; + setTimer(SAMPLES, detector_shm()->timerValue[SAMPLES]); + enableTenGigabitEthernet(detector_shm()->tenGigaEnable); + break; default: - break; + break; } - setReceiverSilentMode(thisDetector->receiver_silentMode); + setReceiverSilentMode(detector_shm()->receiver_silentMode); // data streaming - setReceiverStreamingFrequency(thisDetector->receiver_read_freq); + setReceiverStreamingFrequency(detector_shm()->receiver_read_freq); setReceiverStreamingPort(getReceiverStreamingPort()); setReceiverStreamingIP(getReceiverStreamingIP()); - setAdditionalJsonHeader(thisDetector->receiver_additionalJsonHeader); + setAdditionalJsonHeader(detector_shm()->receiver_additionalJsonHeader); enableDataStreamingFromReceiver(enableDataStreamingFromReceiver(-1)); - if (thisDetector->myDetectorType == GOTTHARD || thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH) { + if (detector_shm()->myDetectorType == GOTTHARD || detector_shm()->myDetectorType == CHIPTESTBOARD || detector_shm()->myDetectorType == MOENCH) { sendROI(-1, nullptr); } } } - return std::string(thisDetector->receiver_hostname); + return std::string(detector_shm()->receiver_hostname); } std::string slsDetector::getReceiver() { - return std::string(thisDetector->receiver_hostname); + return std::string(detector_shm()->receiver_hostname); } std::string slsDetector::setReceiverUDPIP(const std::string &udpip) { @@ -2557,19 +2450,19 @@ std::string slsDetector::setReceiverUDPIP(const std::string &udpip) { } // valid format else { - sls::strcpy_safe(thisDetector->receiverUDPIP, udpip.c_str()); - if (!strcmp(thisDetector->receiver_hostname, "none")) { + sls::strcpy_safe(detector_shm()->receiverUDPIP, udpip.c_str()); + if (!strcmp(detector_shm()->receiver_hostname, "none")) { FILE_LOG(logDEBUG1) << "Receiver hostname not set yet"; } else if (setUDPConnection() == FAIL) { FILE_LOG(logWARNING) << "UDP connection set up failed"; } } } - return std::string(thisDetector->receiverUDPIP); + return std::string(detector_shm()->receiverUDPIP); } std::string slsDetector::getReceiverUDPIP() { - return std::string(thisDetector->receiverUDPIP); + return std::string(detector_shm()->receiverUDPIP); } std::string slsDetector::setReceiverUDPMAC(const std::string &udpmac) { @@ -2582,77 +2475,77 @@ std::string slsDetector::setReceiverUDPMAC(const std::string &udpmac) { } // valid format else { - sls::strcpy_safe(thisDetector->receiverUDPMAC, udpmac.c_str()); - if (!strcmp(thisDetector->receiver_hostname, "none")) { + sls::strcpy_safe(detector_shm()->receiverUDPMAC, udpmac.c_str()); + if (!strcmp(detector_shm()->receiver_hostname, "none")) { FILE_LOG(logDEBUG1) << "Receiver hostname not set yet"; } // not doing setUDPConnection as rx_udpmac will get replaced,(must use configuremac) - sls::strcpy_safe(thisDetector->receiverUDPMAC, udpmac.c_str()); + sls::strcpy_safe(detector_shm()->receiverUDPMAC, udpmac.c_str()); } - return std::string(thisDetector->receiverUDPMAC); + return std::string(detector_shm()->receiverUDPMAC); } std::string slsDetector::getReceiverUDPMAC() { - return std::string(thisDetector->receiverUDPMAC); + return std::string(detector_shm()->receiverUDPMAC); } int slsDetector::setReceiverUDPPort(int udpport) { - thisDetector->receiverUDPPort = udpport; - if (!strcmp(thisDetector->receiver_hostname, "none")) { + detector_shm()->receiverUDPPort = udpport; + if (!strcmp(detector_shm()->receiver_hostname, "none")) { FILE_LOG(logDEBUG1) << "Receiver hostname not set yet"; } else if (setUDPConnection() == FAIL) { FILE_LOG(logWARNING) << "UDP connection set up failed"; } - return thisDetector->receiverUDPPort; + return detector_shm()->receiverUDPPort; } int slsDetector::getReceiverUDPPort() { - return thisDetector->receiverUDPPort; + return detector_shm()->receiverUDPPort; } int slsDetector::setReceiverUDPPort2(int udpport) { - if (thisDetector->myDetectorType != EIGER) { + if (detector_shm()->myDetectorType != EIGER) { return setReceiverUDPPort(udpport); } - thisDetector->receiverUDPPort2 = udpport; - if (!strcmp(thisDetector->receiver_hostname, "none")) { + detector_shm()->receiverUDPPort2 = udpport; + if (!strcmp(detector_shm()->receiver_hostname, "none")) { FILE_LOG(logDEBUG1) << "Receiver hostname not set yet"; } else if (setUDPConnection() == FAIL) { FILE_LOG(logWARNING) << "UDP connection set up failed"; } - return thisDetector->receiverUDPPort2; + return detector_shm()->receiverUDPPort2; } int slsDetector::getReceiverUDPPort2() { - return thisDetector->receiverUDPPort2; + return detector_shm()->receiverUDPPort2; } void slsDetector::setClientStreamingPort(int port) { - thisDetector->zmqport = port; + detector_shm()->zmqport = port; } int slsDetector::getClientStreamingPort() { - return thisDetector->zmqport; + return detector_shm()->zmqport; } void slsDetector::setReceiverStreamingPort(int port) { // copy now else it is lost if rx_hostname not set yet - thisDetector->receiver_zmqport = port; + detector_shm()->receiver_zmqport = port; int fnum = F_SET_RECEIVER_STREAMING_PORT; int ret = FAIL; - int arg = thisDetector->receiver_zmqport; + int arg = detector_shm()->receiver_zmqport; int retval = -1; FILE_LOG(logDEBUG1) << "Sending receiver streaming port to receiver: " << arg; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (COULDNOT_SET_NETWORK_PARAMETER)); } else { FILE_LOG(logDEBUG1) << "Receiver streaming port: " << retval; - thisDetector->receiver_zmqport = retval; + detector_shm()->receiver_zmqport = retval; } } if (ret == FORCE_UPDATE) { @@ -2661,7 +2554,7 @@ void slsDetector::setReceiverStreamingPort(int port) { } int slsDetector::getReceiverStreamingPort() { - return thisDetector->receiver_zmqport; + return detector_shm()->receiver_zmqport; } void slsDetector::setClientStreamingIP(const std::string &sourceIP) { @@ -2673,12 +2566,12 @@ void slsDetector::setClientStreamingIP(const std::string &sourceIP) { return; } // on success put IP as std::string into arg - memset(thisDetector->zmqip, 0, MAX_STR_LENGTH); - sls::ConvertInternetAddresstoIpString(result, thisDetector->zmqip, MAX_STR_LENGTH); + memset(detector_shm()->zmqip, 0, MAX_STR_LENGTH); + sls::ConvertInternetAddresstoIpString(result, detector_shm()->zmqip, MAX_STR_LENGTH); } std::string slsDetector::getClientStreamingIP() { - return std::string(thisDetector->zmqip); + return std::string(detector_shm()->zmqip); } void slsDetector::setReceiverStreamingIP(std::string sourceIP) { @@ -2690,12 +2583,12 @@ void slsDetector::setReceiverStreamingIP(std::string sourceIP) { // if empty, give rx_hostname if (sourceIP.empty()) { - if (!strcmp(thisDetector->receiver_hostname, "none")) { + if (!strcmp(detector_shm()->receiver_hostname, "none")) { FILE_LOG(logWARNING) << "Receiver hostname not set yet. Cannot create rx_zmqip from none"; setErrorMask((getErrorMask()) | (COULDNOT_SET_NETWORK_PARAMETER)); return; } - sourceIP.assign(thisDetector->receiver_hostname); + sourceIP.assign(detector_shm()->receiver_hostname); } // verify the ip @@ -2712,24 +2605,24 @@ void slsDetector::setReceiverStreamingIP(std::string sourceIP) { } // set it anyway, else it is lost if rx_hostname is not set yet - memset(thisDetector->receiver_zmqip, 0, MAX_STR_LENGTH); - sls::strcpy_safe(thisDetector->receiver_zmqip, args); + memset(detector_shm()->receiver_zmqip, 0, MAX_STR_LENGTH); + sls::strcpy_safe(detector_shm()->receiver_zmqip, args); // if zmqip is empty, update it - if (!strlen(thisDetector->zmqip)) { - sls::strcpy_safe(thisDetector->zmqip, args); + if (!strlen(detector_shm()->zmqip)) { + sls::strcpy_safe(detector_shm()->zmqip, args); } FILE_LOG(logDEBUG1) << "Sending receiver streaming IP to receiver: " << args; // send to receiver - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, args, sizeof(args), retvals, sizeof(retvals)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (COULDNOT_SET_NETWORK_PARAMETER)); } else { FILE_LOG(logDEBUG1) << "Receiver streaming port: " << retvals; - memset(thisDetector->receiver_zmqip, 0, MAX_STR_LENGTH); - sls::strcpy_safe(thisDetector->receiver_zmqip, retvals); + memset(detector_shm()->receiver_zmqip, 0, MAX_STR_LENGTH); + sls::strcpy_safe(detector_shm()->receiver_zmqip, retvals); if (ret == FORCE_UPDATE) { receiver.close(); ret = updateReceiver(); @@ -2739,7 +2632,7 @@ void slsDetector::setReceiverStreamingIP(std::string sourceIP) { } std::string slsDetector::getReceiverStreamingIP() { - return std::string(thisDetector->receiver_zmqip); + return std::string(detector_shm()->receiver_zmqip); } int slsDetector::setDetectorNetworkParameter(networkParameter index, int delay) { @@ -2749,8 +2642,8 @@ int slsDetector::setDetectorNetworkParameter(networkParameter index, int delay) int retval = -1; FILE_LOG(logDEBUG1) << "Setting network parameter index " << index << " to " << delay; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, args, sizeof(args), &retval, sizeof(retval)); // handle ret @@ -2774,23 +2667,23 @@ std::string slsDetector::setAdditionalJsonHeader(const std::string &jsonheader) sls::strcpy_safe(args, jsonheader.c_str()); FILE_LOG(logDEBUG1) << "Sending additional json header " << args; - if (thisDetector->receiverOnlineFlag != ONLINE_FLAG) { - sls::strcpy_safe(thisDetector->receiver_additionalJsonHeader, jsonheader.c_str()); + if (detector_shm()->receiverOnlineFlag != ONLINE_FLAG) { + sls::strcpy_safe(detector_shm()->receiver_additionalJsonHeader, jsonheader.c_str()); } else { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, args, sizeof(args), retvals, sizeof(retvals)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (COULDNOT_SET_NETWORK_PARAMETER)); } else { FILE_LOG(logDEBUG1) << "Additional json header: " << retvals; - memset(thisDetector->receiver_additionalJsonHeader, 0, MAX_STR_LENGTH); - sls::strcpy_safe(thisDetector->receiver_additionalJsonHeader, retvals); + memset(detector_shm()->receiver_additionalJsonHeader, 0, MAX_STR_LENGTH); + sls::strcpy_safe(detector_shm()->receiver_additionalJsonHeader, retvals); } } if (ret == FORCE_UPDATE) { ret = updateReceiver(); } - return std::string(thisDetector->receiver_additionalJsonHeader); + return std::string(detector_shm()->receiver_additionalJsonHeader); } std::string slsDetector::getAdditionalJsonHeader() { @@ -2799,24 +2692,24 @@ std::string slsDetector::getAdditionalJsonHeader() { char retvals[MAX_STR_LENGTH] = {0}; FILE_LOG(logDEBUG1) << "Getting additional json header "; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, nullptr, 0, retvals, sizeof(retvals)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (COULDNOT_SET_NETWORK_PARAMETER)); } else { FILE_LOG(logDEBUG1) << "Additional json header: " << retvals; - memset(thisDetector->receiver_additionalJsonHeader, 0, MAX_STR_LENGTH); - sls::strcpy_safe(thisDetector->receiver_additionalJsonHeader, retvals); + memset(detector_shm()->receiver_additionalJsonHeader, 0, MAX_STR_LENGTH); + sls::strcpy_safe(detector_shm()->receiver_additionalJsonHeader, retvals); } } if (ret == FORCE_UPDATE) { ret = updateReceiver(); } - return std::string(thisDetector->receiver_additionalJsonHeader); + return std::string(detector_shm()->receiver_additionalJsonHeader); } -std::string slsDetector::setAdditionalJsonParameter(const std::string& key, const std::string& value) { +std::string slsDetector::setAdditionalJsonParameter(const std::string &key, const std::string &value) { // validation (value or key is empty) if (!key.length() || !value.length()) { FILE_LOG(logERROR) << "Could not set additional json header parameter as the key or value is empty"; @@ -2824,35 +2717,32 @@ std::string slsDetector::setAdditionalJsonParameter(const std::string& key, cons return getAdditionalJsonParameter(key); } - - // validation (ignore if key or value has , : ") + // validation (ignore if key or value has , : ") if (key.find_first_of(",\":") != std::string::npos || value.find_first_of(",\":") != std::string::npos) { FILE_LOG(logERROR) << "Could not set additional json header parameter as the key or value has illegal characters (,\":)"; setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); return getAdditionalJsonParameter(key); } - // create actual key to search for and actual value to put, (key has additional ':' as value could exist the same way) std::string keyLiteral(std::string("\"") + key + std::string("\":")); std::string valueLiteral(value); // add quotations to value only if it is a string - try{ + try { stoi(valueLiteral); - } catch(...) { + } catch (...) { // add quotations if it failed to convert to integer, otherwise nothing valueLiteral.insert(0, "\""); valueLiteral.append("\""); } - - std::string header(thisDetector->receiver_additionalJsonHeader); + std::string header(detector_shm()->receiver_additionalJsonHeader); size_t keyPos = header.find(keyLiteral); // if key found, replace value if (keyPos != std::string::npos) { - size_t valueStartPos = header.find (std::string(":"), keyPos) + 1; - size_t valueEndPos = header.find (std::string(","), valueStartPos) - 1; + size_t valueStartPos = header.find(std::string(":"), keyPos) + 1; + size_t valueEndPos = header.find(std::string(","), valueStartPos) - 1; // if valueEndPos doesnt find comma (end of string), it goes anyway to end of line header.replace(valueStartPos, valueEndPos - valueStartPos + 1, valueLiteral); } @@ -2870,9 +2760,9 @@ std::string slsDetector::setAdditionalJsonParameter(const std::string& key, cons return getAdditionalJsonParameter(key); } -std::string slsDetector::getAdditionalJsonParameter(const std::string& key) { +std::string slsDetector::getAdditionalJsonParameter(const std::string &key) { // additional json header is empty - if (!strlen(thisDetector->receiver_additionalJsonHeader)) + if (!strlen(detector_shm()->receiver_additionalJsonHeader)) return std::string(""); // add quotations before and after the key value @@ -2881,13 +2771,13 @@ std::string slsDetector::getAdditionalJsonParameter(const std::string& key) { keyLiteral.append("\""); // loop through the parameters - for (const auto ¶meter : sls::split(thisDetector->receiver_additionalJsonHeader, ',')) { + for (const auto ¶meter : sls::split(detector_shm()->receiver_additionalJsonHeader, ',')) { // get a vector of key value pair for each parameter const auto &pairs = sls::split(parameter, ':'); // match for key if (pairs[0] == keyLiteral) { // return value without quotations (if it has any) - if ( pairs[1][0] == '\"') + if (pairs[1][0] == '\"') return pairs[1].substr(1, pairs[1].length() - 2); else return pairs[1]; @@ -2905,8 +2795,8 @@ uint64_t slsDetector::setReceiverUDPSocketBufferSize(uint64_t udpsockbufsize) { uint64_t retval = -1; FILE_LOG(logDEBUG1) << "Sending UDP Socket Buffer size to receiver: " << arg; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); if (ret == FAIL) { @@ -2931,8 +2821,8 @@ uint64_t slsDetector::getReceiverRealUDPSocketBufferSize() { uint64_t retval = -1; FILE_LOG(logDEBUG1) << "Getting real UDP Socket Buffer size to receiver"; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, nullptr, 0, &retval, sizeof(retval)); if (ret == FAIL) { @@ -2955,46 +2845,46 @@ int slsDetector::setUDPConnection() { FILE_LOG(logDEBUG1) << "Setting UDP Connection"; // called before set up - if (!strcmp(thisDetector->receiver_hostname, "none")) { + if (!strcmp(detector_shm()->receiver_hostname, "none")) { FILE_LOG(logDEBUG1) << "Receiver hostname not set yet."; return FAIL; } // if no udp ip given, use hostname - if (!strcmp(thisDetector->receiverUDPIP, "none")) { + if (!strcmp(detector_shm()->receiverUDPIP, "none")) { // hostname is an ip address - if (strchr(thisDetector->receiver_hostname, '.') != nullptr) { - sls::strcpy_safe(thisDetector->receiverUDPIP, thisDetector->receiver_hostname); + if (strchr(detector_shm()->receiver_hostname, '.') != nullptr) { + sls::strcpy_safe(detector_shm()->receiverUDPIP, detector_shm()->receiver_hostname); // if hostname not ip, convert it to ip } else { struct addrinfo *result; - if (sls::ConvertHostnameToInternetAddress(thisDetector->receiver_hostname, &result) == 0) { + if (sls::ConvertHostnameToInternetAddress(detector_shm()->receiver_hostname, &result) == 0) { // on success - memset(thisDetector->receiverUDPIP, 0, MAX_STR_LENGTH); + memset(detector_shm()->receiverUDPIP, 0, MAX_STR_LENGTH); // on failure, back to none - if (sls::ConvertInternetAddresstoIpString(result, thisDetector->receiverUDPIP, MAX_STR_LENGTH)) { - sls::strcpy_safe(thisDetector->receiverUDPIP, "none"); + if (sls::ConvertInternetAddresstoIpString(result, detector_shm()->receiverUDPIP, MAX_STR_LENGTH)) { + sls::strcpy_safe(detector_shm()->receiverUDPIP, "none"); } } } } //copy arguments to args[][] - sls::strcpy_safe(args[0], thisDetector->receiverUDPIP); - snprintf(args[1], sizeof(args[2]), "%d", thisDetector->receiverUDPPort); - snprintf(args[2], sizeof(args[2]), "%d", thisDetector->receiverUDPPort2); - FILE_LOG(logDEBUG1) << "Receiver udp ip address: " << thisDetector->receiverUDPIP; - FILE_LOG(logDEBUG1) << "Receiver udp port: " << thisDetector->receiverUDPPort; - FILE_LOG(logDEBUG1) << "Receiver udp port2: " << thisDetector->receiverUDPPort2; + sls::strcpy_safe(args[0], detector_shm()->receiverUDPIP); + snprintf(args[1], sizeof(args[2]), "%d", detector_shm()->receiverUDPPort); + snprintf(args[2], sizeof(args[2]), "%d", detector_shm()->receiverUDPPort2); + FILE_LOG(logDEBUG1) << "Receiver udp ip address: " << detector_shm()->receiverUDPIP; + FILE_LOG(logDEBUG1) << "Receiver udp port: " << detector_shm()->receiverUDPPort; + FILE_LOG(logDEBUG1) << "Receiver udp port2: " << detector_shm()->receiverUDPPort2; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, args, sizeof(args), retvals, sizeof(retvals)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); } else { FILE_LOG(logDEBUG1) << "Receiver UDP MAC returned : " << retvals; - memset(thisDetector->receiverUDPMAC, 0, MAX_STR_LENGTH); - sls::strcpy_safe(thisDetector->receiverUDPMAC, retvals); + memset(detector_shm()->receiverUDPMAC, 0, MAX_STR_LENGTH); + sls::strcpy_safe(detector_shm()->receiverUDPMAC, retvals); if (ret == FORCE_UPDATE) { receiver.close(); ret = updateReceiver(); @@ -3006,8 +2896,8 @@ int slsDetector::setUDPConnection() { } } } else { - ret=FAIL; - setErrorMask((getErrorMask())|(COULD_NOT_CONFIGURE_MAC)); + ret = FAIL; + setErrorMask((getErrorMask()) | (COULD_NOT_CONFIGURE_MAC)); } printReceiverConfiguration(logDEBUG1); @@ -3021,8 +2911,8 @@ int slsDetector::digitalTest(digitalTestMode mode, int ival) { int retval = -1; FILE_LOG(logDEBUG1) << "Sending digital test of mode " << mode << ", ival " << ival; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, args, sizeof(args), &retval, sizeof(retval)); // handle ret @@ -3061,8 +2951,8 @@ int slsDetector::sendImageToDetector(imageType index, int16_t imageVals[]) { int args[2] = {(int)index, nChan}; FILE_LOG(logDEBUG1) << "Sending image to detector"; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); client.sendData(&fnum, sizeof(fnum)); client.sendData(args, sizeof(args)); client.sendData(imageVals, nChan * sizeof(int16_t)); @@ -3102,8 +2992,8 @@ int slsDetector::getCounterBlock(int16_t image[], int startACQ) { int args[2] = {startACQ, nChan}; FILE_LOG(logDEBUG1) << "Reading Counter block with startacq: " << startACQ; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, args, sizeof(args), image, nChan * sizeof(int16_t)); // handle ret @@ -3123,8 +3013,8 @@ int slsDetector::resetCounterBlock(int startACQ) { int arg = startACQ; FILE_LOG(logDEBUG1) << "Resetting Counter with startacq: " << startACQ; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, &arg, sizeof(arg), nullptr, 0); if (ret == FAIL) { setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); @@ -3143,8 +3033,8 @@ int slsDetector::setCounterBit(int i) { int retval = -1; FILE_LOG(logDEBUG1) << "Sending counter bit " << arg; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); // handle ret @@ -3161,14 +3051,13 @@ int slsDetector::setCounterBit(int i) { } int slsDetector::sendROIToProcessor() { - std::ostringstream os; - os << "[" << thisDetector->roiLimits[0].xmin << ", " << thisDetector->roiLimits[0].xmax << ", " << - thisDetector->roiLimits[0].ymin << ", " << thisDetector->roiLimits[0].ymax << "]"; - std::string sroi = os.str(); - std::string result = setAdditionalJsonParameter("roi", sroi); - if (result == sroi) - return OK; - return FAIL; + std::ostringstream os; + os << "[" << detector_shm()->roiLimits[0].xmin << ", " << detector_shm()->roiLimits[0].xmax << ", " << detector_shm()->roiLimits[0].ymin << ", " << detector_shm()->roiLimits[0].ymax << "]"; + std::string sroi = os.str(); + std::string result = setAdditionalJsonParameter("roi", sroi); + if (result == sroi) + return OK; + return FAIL; } int slsDetector::setROI(int n, ROI roiLimits[]) { @@ -3193,35 +3082,35 @@ int slsDetector::setROI(int n, ROI roiLimits[]) { } int ret = sendROI(n, roiLimits); - if(ret==FAIL) - setErrorMask((getErrorMask())|(COULDNOT_SET_ROI)); + if (ret == FAIL) + setErrorMask((getErrorMask()) | (COULDNOT_SET_ROI)); // moench (send to processor) - if (thisDetector->myDetectorType == MOENCH) { - sendROIToProcessor(); + if (detector_shm()->myDetectorType == MOENCH) { + sendROIToProcessor(); } // update #nchans and databytes, as it depends on #samples, roi, readoutflags (ctb only) - if (thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH) { - updateTotalNumberOfChannels(); + if (detector_shm()->myDetectorType == CHIPTESTBOARD || detector_shm()->myDetectorType == MOENCH) { + updateTotalNumberOfChannels(); } return ret; } slsDetectorDefs::ROI *slsDetector::getROI(int &n) { - sendROI(-1, nullptr); - n = thisDetector->nROI; - // moench - get json header(due to different clients, diff shm) (get roi is from detector: updated anyway) - if (thisDetector->myDetectorType == MOENCH) { - getAdditionalJsonHeader(); - } - // update #nchans and databytes, as it depends on #samples, roi, readoutflags (ctb only) - if (thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH) { - updateTotalNumberOfChannels(); + sendROI(-1, nullptr); + n = detector_shm()->nROI; + // moench - get json header(due to different clients, diff shm) (get roi is from detector: updated anyway) + if (detector_shm()->myDetectorType == MOENCH) { + getAdditionalJsonHeader(); } - return thisDetector->roiLimits; + // update #nchans and databytes, as it depends on #samples, roi, readoutflags (ctb only) + if (detector_shm()->myDetectorType == CHIPTESTBOARD || detector_shm()->myDetectorType == MOENCH) { + updateTotalNumberOfChannels(); + } + return detector_shm()->roiLimits; } int slsDetector::getNRoi() { - return thisDetector->nROI; + return detector_shm()->nROI; } int slsDetector::sendROI(int n, ROI roiLimits[]) { @@ -3229,13 +3118,13 @@ int slsDetector::sendROI(int n, ROI roiLimits[]) { int ret = FAIL; int narg = n; // send roiLimits if given, else from shm - ROI *arg = (roiLimits != nullptr) ? roiLimits : thisDetector->roiLimits; + ROI *arg = (roiLimits != nullptr) ? roiLimits : detector_shm()->roiLimits; int nretval = 0; ROI retval[MAX_ROIS]; FILE_LOG(logDEBUG1) << "Sending ROI to detector" << narg; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); client.sendData(&fnum, sizeof(fnum)); client.sendData(&narg, sizeof(narg)); if (narg != -1) { @@ -3263,11 +3152,11 @@ int slsDetector::sendROI(int n, ROI roiLimits[]) { nrec += client.receiveData(&retval[i].ymin, sizeof(int)); nrec += client.receiveData(&retval[i].ymax, sizeof(int)); } - thisDetector->nROI = nretval; + detector_shm()->nROI = nretval; FILE_LOG(logDEBUG1) << "nRoi: " << nretval; for (int i = 0; i < nretval; ++i) { - thisDetector->roiLimits[i] = retval[i]; - FILE_LOG(logDEBUG1) << "ROI [" << i << "] (" << thisDetector->roiLimits[i].xmin << "," << thisDetector->roiLimits[i].xmax << "," << thisDetector->roiLimits[i].ymin << "," << thisDetector->roiLimits[i].ymax << ")"; + detector_shm()->roiLimits[i] = retval[i]; + FILE_LOG(logDEBUG1) << "ROI [" << i << "] (" << detector_shm()->roiLimits[i].xmin << "," << detector_shm()->roiLimits[i].xmax << "," << detector_shm()->roiLimits[i].ymin << "," << detector_shm()->roiLimits[i].ymax << ")"; } } } @@ -3275,19 +3164,19 @@ int slsDetector::sendROI(int n, ROI roiLimits[]) { ret = updateDetector(); } // old firmware requires configuremac after setting roi - if (thisDetector->myDetectorType == GOTTHARD && n != -1) { + if (detector_shm()->myDetectorType == GOTTHARD && n != -1) { ret = configureMAC(); } // update roi in receiver - if (ret == OK && thisDetector->receiverOnlineFlag == ONLINE_FLAG) { + if (ret == OK && detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { fnum = F_RECEIVER_SET_ROI; ret = FAIL; - narg = thisDetector->nROI; - arg = thisDetector->roiLimits; - FILE_LOG(logDEBUG1) << "Sending ROI to receiver: " << thisDetector->nROI; + narg = detector_shm()->nROI; + arg = detector_shm()->roiLimits; + FILE_LOG(logDEBUG1) << "Sending ROI to receiver: " << detector_shm()->nROI; - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); receiver.sendData(&fnum, sizeof(fnum)); receiver.sendData(&narg, sizeof(narg)); if (narg != -1) { @@ -3321,8 +3210,8 @@ int slsDetector::writeAdcRegister(int addr, int val) { uint32_t args[2] = {(uint32_t)addr, (uint32_t)val}; FILE_LOG(logDEBUG1) << "Writing to ADC register 0x" << std::hex << addr << "data: 0x" << std::hex << val << std::dec; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, args, sizeof(args), nullptr, 0); if (ret == FAIL) { setErrorMask((getErrorMask()) | (REGISER_WRITE_READ)); @@ -3342,8 +3231,8 @@ int slsDetector::activate(int const enable) { FILE_LOG(logDEBUG1) << "Setting activate flag to " << arg; // detector - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); // handle ret @@ -3351,7 +3240,7 @@ int slsDetector::activate(int const enable) { setErrorMask((getErrorMask()) | (DETECTOR_ACTIVATE)); } else { FILE_LOG(logDEBUG1) << "Activate: " << retval; - thisDetector->activated = retval; + detector_shm()->activated = retval; } } if (ret == FORCE_UPDATE) { @@ -3359,14 +3248,14 @@ int slsDetector::activate(int const enable) { } // receiver - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG && ret == OK) { + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG && ret == OK) { fnum = F_RECEIVER_ACTIVATE; ret = FAIL; - arg = thisDetector->activated; + arg = detector_shm()->activated; retval = -1; FILE_LOG(logDEBUG1) << "Setting activate flag " << arg << " to receiver"; - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); // handle ret @@ -3377,7 +3266,7 @@ int slsDetector::activate(int const enable) { ret = updateReceiver(); } } - return thisDetector->activated; + return detector_shm()->activated; } int slsDetector::setDeactivatedRxrPaddingMode(int padding) { @@ -3387,25 +3276,25 @@ int slsDetector::setDeactivatedRxrPaddingMode(int padding) { int retval = -1; FILE_LOG(logDEBUG1) << "Deactivated Receiver Padding Enable: " << arg; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (RECEIVER_ACTIVATE)); } else { FILE_LOG(logDEBUG1) << "Deactivated Receiver Padding Enable:" << retval; - thisDetector->receiver_deactivatedPaddingEnable = retval; + detector_shm()->receiver_deactivatedPaddingEnable = retval; } } if (ret == FORCE_UPDATE) { ret = updateReceiver(); } - return thisDetector->receiver_deactivatedPaddingEnable; + return detector_shm()->receiver_deactivatedPaddingEnable; } int slsDetector::getFlippedData(dimension d) { - return thisDetector->flippedData[d]; + return detector_shm()->flippedData[d]; } int slsDetector::setFlippedData(dimension d, int value) { @@ -3423,13 +3312,13 @@ int slsDetector::setFlippedData(dimension d, int value) { // replace get with shm value (write to shm right away as it is a det value, not rx value) if (value > -1) { - thisDetector->flippedData[d] = (value > 0) ? 1 : 0; + detector_shm()->flippedData[d] = (value > 0) ? 1 : 0; } - args[1] = thisDetector->flippedData[d]; + args[1] = detector_shm()->flippedData[d]; FILE_LOG(logDEBUG1) << "Setting flipped data across axis " << d << " with value: " << value; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, args, sizeof(args), &retval, sizeof(retval)); if (ret == FAIL) { @@ -3441,7 +3330,7 @@ int slsDetector::setFlippedData(dimension d, int value) { if (ret == FORCE_UPDATE) { ret = updateReceiver(); } - return thisDetector->flippedData[d]; + return detector_shm()->flippedData[d]; } int slsDetector::setAllTrimbits(int val) { @@ -3451,8 +3340,8 @@ int slsDetector::setAllTrimbits(int val) { int retval = -1; FILE_LOG(logDEBUG1) << "Setting all trimbits to " << val; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (ALLTIMBITS_NOT_SET)); @@ -3474,25 +3363,25 @@ int slsDetector::enableGapPixels(int val) { int retval = -1; FILE_LOG(logDEBUG1) << "Sending gap pixels enable to receiver: " << arg; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (RECEIVER_ENABLE_GAPPIXELS_NOT_SET)); } else { FILE_LOG(logDEBUG1) << "Gap pixels enable to receiver:" << retval; - thisDetector->gappixels = retval; + detector_shm()->gappixels = retval; // update databytes - thisDetector->dataBytesInclGapPixels = 0; - if (thisDetector->dynamicRange != 4) { - thisDetector->dataBytesInclGapPixels = - (thisDetector->nChip[X] * thisDetector->nChan[X] + - thisDetector->gappixels * thisDetector->nGappixels[X]) * - (thisDetector->nChip[Y] * thisDetector->nChan[Y] + - thisDetector->gappixels * thisDetector->nGappixels[Y]) * - thisDetector->dynamicRange / 8; + detector_shm()->dataBytesInclGapPixels = 0; + if (detector_shm()->dynamicRange != 4) { + detector_shm()->dataBytesInclGapPixels = + (detector_shm()->nChip[X] * detector_shm()->nChan[X] + + detector_shm()->gappixels * detector_shm()->nGappixels[X]) * + (detector_shm()->nChip[Y] * detector_shm()->nChan[Y] + + detector_shm()->gappixels * detector_shm()->nGappixels[Y]) * + detector_shm()->dynamicRange / 8; } } } @@ -3500,26 +3389,26 @@ int slsDetector::enableGapPixels(int val) { ret = updateReceiver(); } } - return thisDetector->gappixels; + return detector_shm()->gappixels; } int slsDetector::setTrimEn(int nen, int *en) { if (en) { for (int ien = 0; ien < nen; ++ien) { - thisDetector->trimEnergies[ien] = en[ien]; + detector_shm()->trimEnergies[ien] = en[ien]; } - thisDetector->nTrimEn = nen; + detector_shm()->nTrimEn = nen; } - return (thisDetector->nTrimEn); + return (detector_shm()->nTrimEn); } int slsDetector::getTrimEn(int *en) { if (en) { - for (int ien = 0; ien < thisDetector->nTrimEn; ++ien) { - en[ien] = thisDetector->trimEnergies[ien]; + for (int ien = 0; ien < detector_shm()->nTrimEn; ++ien) { + en[ien] = detector_shm()->trimEnergies[ien]; } } - return (thisDetector->nTrimEn); + return (detector_shm()->nTrimEn); } int slsDetector::pulsePixel(int n, int x, int y) { @@ -3528,8 +3417,8 @@ int slsDetector::pulsePixel(int n, int x, int y) { int args[3] = {n, x, y}; FILE_LOG(logDEBUG1) << "Pulsing pixel " << n << " number of times at (" << x << "," << y << ")"; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, args, sizeof(args), nullptr, 0); if (ret == FAIL) { setErrorMask((getErrorMask()) | (COULD_NOT_PULSE)); @@ -3547,8 +3436,8 @@ int slsDetector::pulsePixelNMove(int n, int x, int y) { int args[3] = {n, x, y}; FILE_LOG(logDEBUG1) << "Pulsing pixel " << n << " number of times and move by delta (" << x << "," << y << ")"; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, args, sizeof(args), nullptr, 0); // handle ret @@ -3568,8 +3457,8 @@ int slsDetector::pulseChip(int n) { int arg = n; FILE_LOG(logDEBUG1) << "Pulsing chip " << n << " number of times"; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, &arg, sizeof(arg), nullptr, 0); // handle ret @@ -3590,8 +3479,8 @@ int slsDetector::setThresholdTemperature(int val) { int retval = -1; FILE_LOG(logDEBUG1) << "Setting threshold temperature to " << val; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto stop = sls::ClientSocket(false, thisDetector->hostname, thisDetector->stopPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto stop = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->stopPort); ret = stop.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); // handle ret @@ -3611,8 +3500,8 @@ int slsDetector::setTemperatureControl(int val) { int retval = -1; FILE_LOG(logDEBUG1) << "Setting temperature control to " << val; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto stop = sls::ClientSocket(false, thisDetector->hostname, thisDetector->stopPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto stop = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->stopPort); ret = stop.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); // handle ret @@ -3632,8 +3521,8 @@ int slsDetector::setTemperatureEvent(int val) { int retval = -1; FILE_LOG(logDEBUG1) << "Setting temperature event to " << val; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto stop = sls::ClientSocket(false, thisDetector->hostname, thisDetector->stopPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto stop = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->stopPort); ret = stop.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); // handle ret @@ -3653,8 +3542,8 @@ int slsDetector::setStoragecellStart(int pos) { int retval = -1; FILE_LOG(logDEBUG1) << "Setting storage cell start to " << pos; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); // handle ret @@ -3672,8 +3561,8 @@ int slsDetector::setStoragecellStart(int pos) { int slsDetector::programFPGA(const std::string &fname) { // only jungfrau implemented (client processing, so check now) - if (thisDetector->myDetectorType != JUNGFRAU && - thisDetector->myDetectorType != CHIPTESTBOARD && thisDetector->myDetectorType != MOENCH) { + if (detector_shm()->myDetectorType != JUNGFRAU && + detector_shm()->myDetectorType != CHIPTESTBOARD && detector_shm()->myDetectorType != MOENCH) { FILE_LOG(logERROR) << "Not implemented for this detector"; setErrorMask((getErrorMask()) | (PROGRAMMING_ERROR)); return FAIL; @@ -3807,8 +3696,8 @@ int slsDetector::programFPGA(const std::string &fname) { char mess[MAX_STR_LENGTH] = {0}; FILE_LOG(logDEBUG1) << "Sending programming binary to detector"; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); client.sendData(&fnum, sizeof(fnum)); client.sendData(&filesize, sizeof(filesize)); client.receiveData(&ret, sizeof(ret)); @@ -3898,7 +3787,7 @@ int slsDetector::programFPGA(const std::string &fname) { (strstr(mess, "-update") == nullptr)) { fnum = F_RESET_FPGA; int stopret = FAIL; - auto stop = sls::ClientSocket(false, thisDetector->hostname, thisDetector->stopPort); + auto stop = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->stopPort); stop.sendData(&fnum, sizeof(fnum)); stop.receiveData(&stopret, sizeof(stopret)); if (stopret == FAIL) { @@ -3925,8 +3814,8 @@ int slsDetector::resetFPGA() { int ret = FAIL; FILE_LOG(logDEBUG1) << "Sending reset FPGA"; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, nullptr, 0, nullptr, 0); // handle ret @@ -3947,8 +3836,8 @@ int slsDetector::powerChip(int ival) { int retval = -1; FILE_LOG(logDEBUG1) << "Setting power chip to " << ival; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (POWER_CHIP)); @@ -3969,8 +3858,8 @@ int slsDetector::setAutoComparatorDisableMode(int ival) { int retval = -1; FILE_LOG(logDEBUG1) << "Setting auto comp disable mode to " << ival; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (AUTO_COMP_DISABLE)); @@ -3988,7 +3877,7 @@ int slsDetector::getChanRegs(double *retval) { int n = getTotalNumberOfChannels(); // update chanregs sls_detector_module *myMod = getModule(); - + //the original array has 0 initialized if (myMod->chanregs) { for (int i = 0; i < n; ++i) { @@ -4011,8 +3900,8 @@ int slsDetector::setModule(sls_detector_module module, int tb) { module.nchip = 0; } - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); client.sendData(&fnum, sizeof(fnum)); sendModule(&module); client.receiveData(&ret, sizeof(ret)); @@ -4038,16 +3927,16 @@ int slsDetector::setModule(sls_detector_module module, int tb) { // update client structure if (ret == OK) { // if (detectorModules) { - // if (thisDetector->myDetectorType == EIGER && tb && chanregs) { - // for (int ichip = 0; ichip < thisDetector->nChips; ++ichip) { - // for (int i = 0; i < thisDetector->nChans; ++i) { - // chanregs[i + ichip * thisDetector->nChans] = - // module.chanregs[ichip * thisDetector->nChans + i]; + // if (detector_shm()->myDetectorType == EIGER && tb && chanregs) { + // for (int ichip = 0; ichip < detector_shm()->nChips; ++ichip) { + // for (int i = 0; i < detector_shm()->nChans; ++i) { + // chanregs[i + ichip * detector_shm()->nChans] = + // module.chanregs[ichip * detector_shm()->nChans + i]; // } // } // } // if (dacs) { - // for (int i = 0; i < thisDetector->nDacs; ++i) { + // for (int i = 0; i < detector_shm()->nDacs; ++i) { // dacs[i] = module.dacs[i]; // } // } @@ -4058,7 +3947,7 @@ int slsDetector::setModule(sls_detector_module module, int tb) { // (detectorModules)->eV = module.eV; // } if (module.eV != -1) { - thisDetector->currentThresholdEV = module.eV; + detector_shm()->currentThresholdEV = module.eV; } } return ret; @@ -4076,8 +3965,8 @@ slsDetectorDefs::sls_detector_module *slsDetector::getModule() { return nullptr; } - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, nullptr, 0, nullptr, 0); // handle ret @@ -4094,16 +3983,16 @@ slsDetectorDefs::sls_detector_module *slsDetector::getModule() { // update client structure // if (ret == OK) { // if (detectorModules) { - // if (thisDetector->myDetectorType == EIGER && chanregs) { - // for (int ichip = 0; ichip < thisDetector->nChips; ++ichip) { - // for (int i = 0; i < thisDetector->nChans; ++i) { - // chanregs[i + ichip * thisDetector->nChans] = - // myMod->chanregs[ichip * thisDetector->nChans + i]; + // if (detector_shm()->myDetectorType == EIGER && chanregs) { + // for (int ichip = 0; ichip < detector_shm()->nChips; ++ichip) { + // for (int i = 0; i < detector_shm()->nChans; ++i) { + // chanregs[i + ichip * detector_shm()->nChans] = + // myMod->chanregs[ichip * detector_shm()->nChans + i]; // } // } // } // if (dacs) { - // for (int i = 0; i < thisDetector->nDacs; ++i) { + // for (int i = 0; i < detector_shm()->nDacs; ++i) { // dacs[i] = myMod->dacs[i]; // } // } @@ -4125,12 +4014,12 @@ int slsDetector::setRateCorrection(int64_t t) { int ret = FAIL; int64_t arg = t; FILE_LOG(logDEBUG1) << "Setting Rate Correction to " << arg; - if (thisDetector->onlineFlag == ONLINE_FLAG) { + if (detector_shm()->onlineFlag == ONLINE_FLAG) { // char mess[MAX_STR_LENGTH]{}; - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, &arg, sizeof(arg), nullptr, 0); if (ret == FAIL) { //TODO (Dhanya) handle FAIL at least until we implement proper error handling - setErrorMask((getErrorMask()) | (COULD_NOT_SET_RATE_CORRECTION)); + setErrorMask((getErrorMask()) | (COULD_NOT_SET_RATE_CORRECTION)); } // TODO! (Read error with this call) // if (ret == FAIL) { @@ -4156,8 +4045,8 @@ int64_t slsDetector::getRateCorrection() { int64_t retval = -1; FILE_LOG(logDEBUG1) << "Getting rate correction"; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, nullptr, 0, &retval, sizeof(retval)); // handle ret @@ -4181,33 +4070,33 @@ void slsDetector::printReceiverConfiguration(TLogLevel level) { int slsDetector::setReceiverOnline(int value) { if (value != GET_ONLINE_FLAG) { // no receiver - if (!strcmp(thisDetector->receiver_hostname, "none")) { - thisDetector->receiverOnlineFlag = OFFLINE_FLAG; + if (!strcmp(detector_shm()->receiver_hostname, "none")) { + detector_shm()->receiverOnlineFlag = OFFLINE_FLAG; } else { - thisDetector->receiverOnlineFlag = value; + detector_shm()->receiverOnlineFlag = value; } // set online - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { // setReceiverTCPSocket(); // error in connecting - if (thisDetector->receiverOnlineFlag == OFFLINE_FLAG) { + if (detector_shm()->receiverOnlineFlag == OFFLINE_FLAG) { FILE_LOG(logERROR) << "Cannot connect to receiver"; setErrorMask((getErrorMask()) | (CANNOT_CONNECT_TO_RECEIVER)); } } } - return thisDetector->receiverOnlineFlag; + return detector_shm()->receiverOnlineFlag; } int slsDetector::getReceiverOnline() const { - return thisDetector->receiverOnlineFlag; + return detector_shm()->receiverOnlineFlag; } std::string slsDetector::checkReceiverOnline() { std::string retval; try { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); - retval = thisDetector->receiver_hostname; + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); + retval = detector_shm()->receiver_hostname; } catch (...) { } return retval; @@ -4219,8 +4108,8 @@ int slsDetector::lockReceiver(int lock) { int retval = -1; FILE_LOG(logDEBUG1) << "Setting receiver server lock to " << lock; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, &lock, sizeof(lock), &retval, sizeof(retval)); if (ret == FAIL) { @@ -4241,8 +4130,8 @@ std::string slsDetector::getReceiverLastClientIP() { char retval[INET_ADDRSTRLEN] = {}; FILE_LOG(logDEBUG1) << "Getting last client ip to receiver server"; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, nullptr, 0, &retval, sizeof(retval)); if (ret == FAIL) { @@ -4262,8 +4151,8 @@ int slsDetector::exitReceiver() { int ret = FAIL; FILE_LOG(logDEBUG1) << "Sending exit command to receiver server"; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, nullptr, 0, nullptr, 0); // no ret handling as ret never fail FILE_LOG(logINFO) << "Shutting down the receiver server"; @@ -4279,8 +4168,8 @@ int slsDetector::execReceiverCommand(const std::string &cmd) { sls::strcpy_safe(arg, cmd.c_str()); FILE_LOG(logDEBUG1) << "Sending command to receiver: " << arg; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, arg, sizeof(arg), retval, sizeof(retval)); if (ret == FAIL) { @@ -4304,75 +4193,75 @@ int slsDetector::updateReceiverNoWait(sls::ClientSocket &receiver) { // filepath n += receiver.receiveData(cstring, sizeof(cstring)); - sls::strcpy_safe(thisDetector->receiver_filePath, cstring); + sls::strcpy_safe(detector_shm()->receiver_filePath, cstring); // filename n += receiver.receiveData(cstring, sizeof(cstring)); - sls::strcpy_safe(thisDetector->receiver_fileName, cstring); + sls::strcpy_safe(detector_shm()->receiver_fileName, cstring); // index n += receiver.receiveData(&i32, sizeof(i32)); - thisDetector->receiver_fileIndex = i32; + detector_shm()->receiver_fileIndex = i32; //file format n += receiver.receiveData(&i32, sizeof(i32)); - thisDetector->receiver_fileFormatType = (fileFormat)i32; + detector_shm()->receiver_fileFormatType = (fileFormat)i32; // frames per file n += receiver.receiveData(&i32, sizeof(i32)); - thisDetector->receiver_framesPerFile = i32; + detector_shm()->receiver_framesPerFile = i32; // frame discard policy n += receiver.receiveData(&i32, sizeof(i32)); - thisDetector->receiver_frameDiscardMode = (frameDiscardPolicy)i32; + detector_shm()->receiver_frameDiscardMode = (frameDiscardPolicy)i32; // frame padding n += receiver.receiveData(&i32, sizeof(i32)); - thisDetector->receiver_framePadding = i32; + detector_shm()->receiver_framePadding = i32; // file write enable n += receiver.receiveData(&i32, sizeof(i32)); - thisDetector->receiver_fileWriteEnable = i32; + detector_shm()->receiver_fileWriteEnable = i32; // file overwrite enable n += receiver.receiveData(&i32, sizeof(i32)); - thisDetector->receiver_overWriteEnable = i32; + detector_shm()->receiver_overWriteEnable = i32; // gap pixels n += receiver.receiveData(&i32, sizeof(i32)); - thisDetector->gappixels = i32; + detector_shm()->gappixels = i32; // receiver read frequency n += receiver.receiveData(&i32, sizeof(i32)); - thisDetector->receiver_read_freq = i32; + detector_shm()->receiver_read_freq = i32; // receiver streaming port n += receiver.receiveData(&i32, sizeof(i32)); - thisDetector->receiver_zmqport = i32; + detector_shm()->receiver_zmqport = i32; // streaming source ip n += receiver.receiveData(cstring, sizeof(cstring)); - sls::strcpy_safe(thisDetector->receiver_zmqip, cstring); + sls::strcpy_safe(detector_shm()->receiver_zmqip, cstring); // additional json header n += receiver.receiveData(cstring, sizeof(cstring)); - sls::strcpy_safe(thisDetector->receiver_additionalJsonHeader, cstring); + sls::strcpy_safe(detector_shm()->receiver_additionalJsonHeader, cstring); // receiver streaming enable n += receiver.receiveData(&i32, sizeof(i32)); - thisDetector->receiver_upstream = i32; + detector_shm()->receiver_upstream = i32; // activate n += receiver.receiveData(&i32, sizeof(i32)); - thisDetector->activated = i32; + detector_shm()->activated = i32; // deactivated padding enable n += receiver.receiveData(&i32, sizeof(i32)); - thisDetector->receiver_deactivatedPaddingEnable = i32; + detector_shm()->receiver_deactivatedPaddingEnable = i32; // silent mode n += receiver.receiveData(&i32, sizeof(i32)); - thisDetector->receiver_silentMode = i32; + detector_shm()->receiver_silentMode = i32; if (!n) { FILE_LOG(logERROR) << "Could not update receiver, received 0 bytes\n"; @@ -4385,8 +4274,8 @@ int slsDetector::updateReceiver() { int ret = FAIL; FILE_LOG(logDEBUG1) << "Sending update client to receiver server"; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, nullptr, 0, nullptr, 0); if (ret == FAIL) { setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); @@ -4400,12 +4289,12 @@ int slsDetector::updateReceiver() { void slsDetector::sendMultiDetectorSize() { int fnum = F_SEND_RECEIVER_MULTIDETSIZE; int ret = FAIL; - int args[2] = {thisDetector->multiSize[0], thisDetector->multiSize[1]}; + int args[2] = {detector_shm()->multiSize[0], detector_shm()->multiSize[1]}; int retval = -1; - FILE_LOG(logDEBUG1) << "Sending multi detector size to receiver: (" << thisDetector->multiSize[0] << "," << thisDetector->multiSize[1] << ")"; + FILE_LOG(logDEBUG1) << "Sending multi detector size to receiver: (" << detector_shm()->multiSize[0] << "," << detector_shm()->multiSize[1] << ")"; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, args, sizeof(args), &retval, sizeof(retval)); if (ret == FAIL) { @@ -4426,8 +4315,8 @@ void slsDetector::setDetectorId() { int retval = -1; FILE_LOG(logDEBUG1) << "Sending detector pos id to receiver: " << detId; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); if (ret == FAIL) { @@ -4446,11 +4335,11 @@ void slsDetector::setDetectorHostname() { int ret = FAIL; char args[MAX_STR_LENGTH] = {}; char retvals[MAX_STR_LENGTH] = {}; - sls::strcpy_safe(args, thisDetector->hostname); + sls::strcpy_safe(args, detector_shm()->hostname); FILE_LOG(logDEBUG1) << "Sending detector hostname to receiver: " << args; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, args, sizeof(args), retvals, sizeof(retvals)); if (ret == FAIL) { @@ -4465,7 +4354,7 @@ void slsDetector::setDetectorHostname() { } std::string slsDetector::getFilePath() { - return thisDetector->receiver_filePath; + return detector_shm()->receiver_filePath; } std::string slsDetector::setFilePath(const std::string &path) { @@ -4477,8 +4366,8 @@ std::string slsDetector::setFilePath(const std::string &path) { sls::strcpy_safe(args, path.c_str()); FILE_LOG(logDEBUG1) << "Sending file path to receiver: " << args; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, args, sizeof(args), retvals, sizeof(retvals)); if (ret == FAIL) { @@ -4490,18 +4379,18 @@ std::string slsDetector::setFilePath(const std::string &path) { } } else { FILE_LOG(logDEBUG1) << "Receiver file path: " << retvals; - sls::strcpy_safe(thisDetector->receiver_filePath, retvals); + sls::strcpy_safe(detector_shm()->receiver_filePath, retvals); } } if (ret == FORCE_UPDATE) { ret = updateReceiver(); } } - return thisDetector->receiver_filePath; + return detector_shm()->receiver_filePath; } std::string slsDetector::getFileName() { - return thisDetector->receiver_fileName; + return detector_shm()->receiver_fileName; } std::string slsDetector::setFileName(const std::string &fname) { @@ -4513,22 +4402,22 @@ std::string slsDetector::setFileName(const std::string &fname) { sls::strcpy_safe(args, fname.c_str()); FILE_LOG(logDEBUG1) << "Sending file name to receiver: " << args; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, args, sizeof(args), retvals, sizeof(retvals)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (RECEIVER_PARAMETER_NOT_SET)); } else { FILE_LOG(logDEBUG1) << "Receiver file name: " << retvals; - sls::strcpy_safe(thisDetector->receiver_fileName, retvals); + sls::strcpy_safe(detector_shm()->receiver_fileName, retvals); } } if (ret == FORCE_UPDATE) { ret = updateReceiver(); } } - return thisDetector->receiver_fileName; + return detector_shm()->receiver_fileName; } int slsDetector::setReceiverFramesPerFile(int f) { @@ -4539,8 +4428,8 @@ int slsDetector::setReceiverFramesPerFile(int f) { int retval = -1; FILE_LOG(logDEBUG1) << "Setting receiver frames per file to " << arg; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); // handle ret @@ -4548,14 +4437,14 @@ int slsDetector::setReceiverFramesPerFile(int f) { setErrorMask((getErrorMask()) | (RECEIVER_PARAMETER_NOT_SET)); } else { FILE_LOG(logDEBUG1) << "Receiver frames per file: " << retval; - thisDetector->receiver_framesPerFile = retval; + detector_shm()->receiver_framesPerFile = retval; } } if (ret == FORCE_UPDATE) { ret = updateReceiver(); } } - return thisDetector->receiver_framesPerFile; + return detector_shm()->receiver_framesPerFile; } slsDetectorDefs::frameDiscardPolicy slsDetector::setReceiverFramesDiscardPolicy(frameDiscardPolicy f) { @@ -4565,20 +4454,20 @@ slsDetectorDefs::frameDiscardPolicy slsDetector::setReceiverFramesDiscardPolicy( auto retval = (frameDiscardPolicy)-1; FILE_LOG(logDEBUG1) << "Setting receiver frames discard policy to " << arg; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (RECEIVER_PARAMETER_NOT_SET)); } else { FILE_LOG(logDEBUG1) << "Receiver frames discard policy: " << retval; - thisDetector->receiver_frameDiscardMode = retval; + detector_shm()->receiver_frameDiscardMode = retval; } } if (ret == FORCE_UPDATE) { ret = updateReceiver(); } - return thisDetector->receiver_frameDiscardMode; + return detector_shm()->receiver_frameDiscardMode; } int slsDetector::setReceiverPartialFramesPadding(int f) { @@ -4588,8 +4477,8 @@ int slsDetector::setReceiverPartialFramesPadding(int f) { int retval = -1; FILE_LOG(logDEBUG1) << "Setting receiver partial frames enable to " << arg; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); // handle ret @@ -4597,13 +4486,13 @@ int slsDetector::setReceiverPartialFramesPadding(int f) { setErrorMask((getErrorMask()) | (RECEIVER_PARAMETER_NOT_SET)); } else { FILE_LOG(logDEBUG1) << "Receiver partial frames enable: " << retval; - thisDetector->receiver_framePadding = retval; + detector_shm()->receiver_framePadding = retval; } } if (ret == FORCE_UPDATE) { ret = updateReceiver(); } - return thisDetector->receiver_framePadding; + return detector_shm()->receiver_framePadding; } slsDetectorDefs::fileFormat slsDetector::setFileFormat(fileFormat f) { @@ -4614,8 +4503,8 @@ slsDetectorDefs::fileFormat slsDetector::setFileFormat(fileFormat f) { auto retval = (fileFormat)-1; FILE_LOG(logDEBUG1) << "Setting receiver file format to " << arg; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); // handle ret @@ -4623,7 +4512,7 @@ slsDetectorDefs::fileFormat slsDetector::setFileFormat(fileFormat f) { setErrorMask((getErrorMask()) | (RECEIVER_PARAMETER_NOT_SET)); } else { FILE_LOG(logDEBUG1) << "Receiver file format: " << retval; - thisDetector->receiver_fileFormatType = retval; + detector_shm()->receiver_fileFormatType = retval; } } if (ret == FORCE_UPDATE) { @@ -4634,11 +4523,11 @@ slsDetectorDefs::fileFormat slsDetector::setFileFormat(fileFormat f) { } slsDetectorDefs::fileFormat slsDetector::getFileFormat() { - return thisDetector->receiver_fileFormatType; + return detector_shm()->receiver_fileFormatType; } int slsDetector::getFileIndex() { - return thisDetector->receiver_fileIndex; + return detector_shm()->receiver_fileIndex; } int slsDetector::setFileIndex(int i) { @@ -4649,8 +4538,8 @@ int slsDetector::setFileIndex(int i) { int retval = -1; FILE_LOG(logDEBUG1) << "Setting file index to " << arg; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); // handle ret @@ -4658,21 +4547,21 @@ int slsDetector::setFileIndex(int i) { setErrorMask((getErrorMask()) | (RECEIVER_PARAMETER_NOT_SET)); } else { FILE_LOG(logDEBUG1) << "Receiver file index: " << retval; - thisDetector->receiver_fileIndex = retval; + detector_shm()->receiver_fileIndex = retval; } } if (ret == FORCE_UPDATE) { updateReceiver(); } } - return thisDetector->receiver_fileIndex; + return detector_shm()->receiver_fileIndex; } int slsDetector::incrementFileIndex() { - if (thisDetector->receiver_fileWriteEnable) { - return setFileIndex(thisDetector->receiver_fileIndex + 1); + if (detector_shm()->receiver_fileWriteEnable) { + return setFileIndex(detector_shm()->receiver_fileIndex + 1); } - return thisDetector->receiver_fileIndex; + return detector_shm()->receiver_fileIndex; } int slsDetector::startReceiver() { @@ -4680,11 +4569,11 @@ int slsDetector::startReceiver() { int ret = FAIL; // char mess[MAX_STR_LENGTH]{}; FILE_LOG(logDEBUG1) << "Starting Receiver"; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, nullptr, 0, nullptr, 0); if (ret == FAIL) { - setErrorMask((getErrorMask()) | (COULDNOT_START_RECEIVER)); //TODO (Dhanya) Atleast put an error code for now + setErrorMask((getErrorMask()) | (COULDNOT_START_RECEIVER)); //TODO (Dhanya) Atleast put an error code for now } //TODO! (Erik) mess should be enum now ignoring // if (ret == FAIL) { @@ -4707,8 +4596,8 @@ int slsDetector::stopReceiver() { int fnum = F_STOP_RECEIVER; int ret = FAIL; FILE_LOG(logDEBUG1) << "Stopping Receiver"; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, nullptr, 0, nullptr, 0); // handle ret @@ -4728,8 +4617,8 @@ slsDetectorDefs::runStatus slsDetector::getReceiverStatus() { runStatus retval = ERROR; FILE_LOG(logDEBUG1) << "Getting Receiver Status"; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, nullptr, 0, &retval, sizeof(retval)); // handle ret @@ -4751,8 +4640,8 @@ int slsDetector::getFramesCaughtByReceiver() { int retval = -1; FILE_LOG(logDEBUG1) << "Getting Frames Caught by Receiver"; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, nullptr, 0, &retval, sizeof(retval)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); @@ -4771,8 +4660,8 @@ int slsDetector::getReceiverCurrentFrameIndex() { int ret = FAIL; int retval = -1; FILE_LOG(logDEBUG1) << "Getting Current Frame Index of Receiver"; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, nullptr, 0, &retval, sizeof(retval)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); @@ -4791,8 +4680,8 @@ int slsDetector::resetFramesCaught() { int ret = FAIL; FILE_LOG(logDEBUG1) << "Reset Frames Caught by Receiver"; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, nullptr, 0, nullptr, 0); if (ret == FAIL) { setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); @@ -4811,21 +4700,21 @@ int slsDetector::enableWriteToFile(int enable) { int arg = enable; int retval = -1; FILE_LOG(logDEBUG1) << "Sending enable file write to receiver: " << arg; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (RECEIVER_PARAMETER_NOT_SET)); } else { FILE_LOG(logDEBUG1) << "Receiver file write enable: " << retval; - thisDetector->receiver_fileWriteEnable = retval; + detector_shm()->receiver_fileWriteEnable = retval; } } if (ret == FORCE_UPDATE) { ret = updateReceiver(); } } - return thisDetector->receiver_fileWriteEnable; + return detector_shm()->receiver_fileWriteEnable; } int slsDetector::overwriteFile(int enable) { @@ -4836,21 +4725,21 @@ int slsDetector::overwriteFile(int enable) { int retval = -1; FILE_LOG(logDEBUG1) << "Sending enable file overwrite to receiver: " << arg; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (RECEIVER_PARAMETER_NOT_SET)); } else { FILE_LOG(logDEBUG1) << "Receiver file overwrite enable: " << retval; - thisDetector->receiver_overWriteEnable = retval; + detector_shm()->receiver_overWriteEnable = retval; } } if (ret == FORCE_UPDATE) { ret = updateReceiver(); } } - return thisDetector->receiver_overWriteEnable; + return detector_shm()->receiver_overWriteEnable; } int slsDetector::setReceiverStreamingFrequency(int freq) { @@ -4861,21 +4750,21 @@ int slsDetector::setReceiverStreamingFrequency(int freq) { int retval = -1; FILE_LOG(logDEBUG1) << "Sending read frequency to receiver: " << arg; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (RECEIVER_STREAMING_FREQUENCY)); } else { FILE_LOG(logDEBUG1) << "Receiver read frequency: " << retval; - thisDetector->receiver_read_freq = retval; + detector_shm()->receiver_read_freq = retval; } } if (ret == FORCE_UPDATE) { ret = updateReceiver(); } } - return thisDetector->receiver_read_freq; + return detector_shm()->receiver_read_freq; } int slsDetector::setReceiverStreamingTimer(int time_in_ms) { @@ -4885,8 +4774,8 @@ int slsDetector::setReceiverStreamingTimer(int time_in_ms) { int retval = -1; FILE_LOG(logDEBUG1) << "Sending read timer to receiver: " << arg; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (RECEIVER_STREAMING_TIMER)); @@ -4908,21 +4797,21 @@ int slsDetector::enableDataStreamingFromReceiver(int enable) { int retval = -1; FILE_LOG(logDEBUG1) << "Sending Data Streaming to receiver: " << arg; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (DATA_STREAMING)); } else { FILE_LOG(logDEBUG1) << "Receiver Data Streaming: " << retval; - thisDetector->receiver_upstream = retval; + detector_shm()->receiver_upstream = retval; } } if (ret == FORCE_UPDATE) { ret = updateReceiver(); } } - return thisDetector->receiver_upstream; + return detector_shm()->receiver_upstream; } int slsDetector::enableTenGigabitEthernet(int i) { @@ -4932,14 +4821,14 @@ int slsDetector::enableTenGigabitEthernet(int i) { int retval = -1; FILE_LOG(logDEBUG1) << "Enabling / Disabling 10Gbe: " << arg; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (DETECTOR_TEN_GIGA)); } else { FILE_LOG(logDEBUG1) << "10Gbe: " << retval; - thisDetector->tenGigaEnable = retval; + detector_shm()->tenGigaEnable = retval; client.close(); if (ret == FORCE_UPDATE) { ret = updateDetector(); @@ -4949,14 +4838,14 @@ int slsDetector::enableTenGigabitEthernet(int i) { } // receiver - if ((thisDetector->receiverOnlineFlag == ONLINE_FLAG) && ret == OK) { + if ((detector_shm()->receiverOnlineFlag == ONLINE_FLAG) && ret == OK) { fnum = F_ENABLE_RECEIVER_TEN_GIGA; ret = FAIL; - arg = thisDetector->tenGigaEnable; + arg = detector_shm()->tenGigaEnable; retval = -1; FILE_LOG(logDEBUG1) << "Sending 10Gbe enable to receiver: " << arg; - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (RECEIVER_TEN_GIGA)); @@ -4968,7 +4857,7 @@ int slsDetector::enableTenGigabitEthernet(int i) { } } } - return thisDetector->tenGigaEnable; + return detector_shm()->tenGigaEnable; } int slsDetector::setReceiverFifoDepth(int i) { @@ -4978,8 +4867,8 @@ int slsDetector::setReceiverFifoDepth(int i) { int retval = -1; FILE_LOG(logDEBUG1) << "Sending Receiver Fifo Depth: " << arg; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); // handle ret @@ -5002,8 +4891,8 @@ int slsDetector::setReceiverSilentMode(int i) { int retval = -1; FILE_LOG(logDEBUG1) << "Sending Receiver Silent Mode: " << arg; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); // handle ret @@ -5011,13 +4900,13 @@ int slsDetector::setReceiverSilentMode(int i) { setErrorMask((getErrorMask()) | (RECEIVER_PARAMETER_NOT_SET)); } else { FILE_LOG(logDEBUG1) << "Receiver Data Streaming: " << retval; - thisDetector->receiver_silentMode = retval; + detector_shm()->receiver_silentMode = retval; } } if (ret == FORCE_UPDATE) { ret = updateReceiver(); } - return thisDetector->receiver_silentMode; + return detector_shm()->receiver_silentMode; } int slsDetector::restreamStopFromReceiver() { @@ -5025,8 +4914,8 @@ int slsDetector::restreamStopFromReceiver() { int ret = FAIL; FILE_LOG(logDEBUG1) << "Restream stop dummy from Receiver via zmq"; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, thisDetector->receiver_hostname, thisDetector->receiverTCPPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, nullptr, 0, nullptr, 0); // handle ret @@ -5064,8 +4953,8 @@ uint64_t slsDetector::setPatternWord(int addr, uint64_t word) { uint64_t retval = -1; FILE_LOG(logDEBUG1) << "Setting Pattern word, addr: 0x" << std::hex << addr << ", word: 0x" << word << std::dec; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, args, sizeof(args), &retval, sizeof(retval)); if (ret == FAIL) { setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); @@ -5089,8 +4978,8 @@ int slsDetector::setPatternLoops(int level, int &start, int &stop, int &n) { "level: " << level << ", start: " << start << ", stop: " << stop << ", n: " << n; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, args, sizeof(args), retvals, sizeof(retvals)); // handle ret @@ -5119,8 +5008,8 @@ int slsDetector::setPatternWaitAddr(uint64_t level, uint64_t addr) { "level: " << level << ", addr: 0x" << std::hex << addr << std::dec; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, args.data(), sizeof(args), &retval, sizeof(retval)); // handle ret @@ -5144,8 +5033,8 @@ uint64_t slsDetector::setPatternWaitTime(uint64_t level, uint64_t t) { std::array args{mode, level, t}; FILE_LOG(logDEBUG1) << "Setting Pat Wait Time, level: " << level << ", t: " << t; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, args.data(), sizeof(args), &retval, sizeof(retval)); // handle ret @@ -5162,36 +5051,36 @@ uint64_t slsDetector::setPatternWaitTime(uint64_t level, uint64_t t) { } int slsDetector::setPatternMask(uint64_t mask) { - int fnum = F_SET_PATTERN_MASK; - int ret = FAIL; - uint64_t arg = mask; - FILE_LOG(logDEBUG1) << "Setting Pattern Mask " << std::hex << mask << std::dec; + int fnum = F_SET_PATTERN_MASK; + int ret = FAIL; + uint64_t arg = mask; + FILE_LOG(logDEBUG1) << "Setting Pattern Mask " << std::hex << mask << std::dec; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); - ret = client.sendCommandThenRead(fnum, &arg, sizeof(arg), nullptr, 0); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); + ret = client.sendCommandThenRead(fnum, &arg, sizeof(arg), nullptr, 0); - // handle ret - if (ret == FAIL) { - setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); - } else { - FILE_LOG(logDEBUG1) << "Pattern Mask successful"; - } - } - if (ret == FORCE_UPDATE) { - ret = updateDetector(); - } - return ret; + // handle ret + if (ret == FAIL) { + setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); + } else { + FILE_LOG(logDEBUG1) << "Pattern Mask successful"; + } + } + if (ret == FORCE_UPDATE) { + ret = updateDetector(); + } + return ret; } uint64_t slsDetector::getPatternMask() { int fnum = F_GET_PATTERN_MASK; int ret = FAIL; uint64_t retval = -1; - FILE_LOG(logDEBUG1) << "Getting Pattern Mask " ; + FILE_LOG(logDEBUG1) << "Getting Pattern Mask "; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, nullptr, 0, &retval, sizeof(retval)); // handle ret @@ -5208,49 +5097,49 @@ uint64_t slsDetector::getPatternMask() { } int slsDetector::setPatternBitMask(uint64_t mask) { - int fnum = F_SET_PATTERN_BIT_MASK; - int ret = FAIL; - uint64_t arg = mask; - FILE_LOG(logDEBUG1) << "Setting Pattern Bit Mask " << std::hex << mask << std::dec; + int fnum = F_SET_PATTERN_BIT_MASK; + int ret = FAIL; + uint64_t arg = mask; + FILE_LOG(logDEBUG1) << "Setting Pattern Bit Mask " << std::hex << mask << std::dec; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); - ret = client.sendCommandThenRead(fnum, &arg, sizeof(arg), nullptr, 0); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); + ret = client.sendCommandThenRead(fnum, &arg, sizeof(arg), nullptr, 0); - // handle ret - if (ret == FAIL) { - setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); - } else { - FILE_LOG(logDEBUG1) << "Pattern Bit Mask successful"; - } - } - if (ret == FORCE_UPDATE) { - ret = updateDetector(); - } - return ret; + // handle ret + if (ret == FAIL) { + setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); + } else { + FILE_LOG(logDEBUG1) << "Pattern Bit Mask successful"; + } + } + if (ret == FORCE_UPDATE) { + ret = updateDetector(); + } + return ret; } uint64_t slsDetector::getPatternBitMask() { - int fnum = F_GET_PATTERN_BIT_MASK; - int ret = FAIL; - uint64_t retval = -1; - FILE_LOG(logDEBUG1) << "Getting Pattern Bit Mask " ; + int fnum = F_GET_PATTERN_BIT_MASK; + int ret = FAIL; + uint64_t retval = -1; + FILE_LOG(logDEBUG1) << "Getting Pattern Bit Mask "; - if (thisDetector->onlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); - ret = client.sendCommandThenRead(fnum, nullptr, 0, &retval, sizeof(retval)); + if (detector_shm()->onlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); + ret = client.sendCommandThenRead(fnum, nullptr, 0, &retval, sizeof(retval)); - // handle ret - if (ret == FAIL) { - setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); - } else { - FILE_LOG(logDEBUG1) << "Pattern Bit Mask:" << retval; - } - } - if (ret == FORCE_UPDATE) { - ret = updateDetector(); - } - return retval; + // handle ret + if (ret == FAIL) { + setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); + } else { + FILE_LOG(logDEBUG1) << "Pattern Bit Mask:" << retval; + } + } + if (ret == FORCE_UPDATE) { + ret = updateDetector(); + } + return retval; } int slsDetector::setLEDEnable(int enable) { @@ -5260,8 +5149,8 @@ int slsDetector::setLEDEnable(int enable) { int retval = -1; FILE_LOG(logDEBUG1) << "Sending LED Enable: " << arg; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval)); // handle ret @@ -5282,10 +5171,10 @@ int slsDetector::setDigitalIODelay(uint64_t pinMask, int delay) { int ret = FAIL; uint64_t args[2] = {pinMask, (uint64_t)delay}; FILE_LOG(logDEBUG1) << "Sending Digital IO Delay, pin mask: " << std::hex << args[0] - << ", delay: " << std::dec << args[1] << " ps"; + << ", delay: " << std::dec << args[1] << " ps"; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { - auto client = sls::ClientSocket(false, thisDetector->hostname, thisDetector->controlPort); + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort); ret = client.sendCommandThenRead(fnum, args, sizeof(args), nullptr, 0); // handle ret @@ -5306,13 +5195,13 @@ slsDetectorDefs::sls_detector_module *slsDetector::interpolateTrim( const int energy, const int e1, const int e2, int tb) { // only implemented for eiger currently (in terms of which dacs) - if (thisDetector->myDetectorType != EIGER) { + if (detector_shm()->myDetectorType != EIGER) { FILE_LOG(logERROR) << "Interpolation of Trim values not implemented for this detector!"; setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); return nullptr; } - sls_detector_module *myMod = createModule(thisDetector->myDetectorType); + sls_detector_module *myMod = createModule(detector_shm()->myDetectorType); if (myMod == nullptr) { FILE_LOG(logERROR) << "Could not create module"; setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); @@ -5381,7 +5270,7 @@ slsDetectorDefs::sls_detector_module *slsDetector::readSettingsFile(const std::s // flag creating module to delete later bool modCreated = false; if (myMod == nullptr) { - myMod = createModule(thisDetector->myDetectorType); + myMod = createModule(detector_shm()->myDetectorType); if (myMod == nullptr) { FILE_LOG(logERROR) << "Could not create module"; setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE)); @@ -5391,7 +5280,7 @@ slsDetectorDefs::sls_detector_module *slsDetector::readSettingsFile(const std::s } std::vector names; - switch (thisDetector->myDetectorType) { + switch (detector_shm()->myDetectorType) { case GOTTHARD: names.emplace_back("Vref"); names.emplace_back("VcascN"); @@ -5427,7 +5316,7 @@ slsDetectorDefs::sls_detector_module *slsDetector::readSettingsFile(const std::s // open file std::ifstream infile; - if (thisDetector->myDetectorType == EIGER) { + if (detector_shm()->myDetectorType == EIGER) { infile.open(fname.c_str(), std::ifstream::binary); } else { infile.open(fname.c_str(), std::ios_base::in); @@ -5442,7 +5331,7 @@ slsDetectorDefs::sls_detector_module *slsDetector::readSettingsFile(const std::s } // eiger - if (thisDetector->myDetectorType == EIGER) { + if (detector_shm()->myDetectorType == EIGER) { bool allread = false; infile.read((char *)myMod->dacs, sizeof(int) * (myMod->ndac)); if (infile.good()) { @@ -5523,17 +5412,17 @@ slsDetectorDefs::sls_detector_module *slsDetector::readSettingsFile(const std::s } infile.close(); - sls::strcpy_safe(thisDetector->settingsFile, fname.c_str()); - FILE_LOG(logINFO) << "Settings file loaded: " << thisDetector->settingsFile; + sls::strcpy_safe(detector_shm()->settingsFile, fname.c_str()); + FILE_LOG(logINFO) << "Settings file loaded: " << detector_shm()->settingsFile; return myMod; } -int slsDetector::writeSettingsFile(const std::string &fname, sls_detector_module& mod) { +int slsDetector::writeSettingsFile(const std::string &fname, sls_detector_module &mod) { FILE_LOG(logDEBUG1) << "Write settings file " << fname; std::vector names; - switch (thisDetector->myDetectorType) { + switch (detector_shm()->myDetectorType) { case GOTTHARD: names.emplace_back("Vref"); names.emplace_back("VcascN"); @@ -5572,7 +5461,7 @@ int slsDetector::writeSettingsFile(const std::string &fname, sls_detector_module // open file std::ofstream outfile; - if (thisDetector->myDetectorType == EIGER) { + if (detector_shm()->myDetectorType == EIGER) { outfile.open(fname.c_str(), std::ofstream::binary); } else { outfile.open(fname.c_str(), std::ios_base::out); @@ -5584,7 +5473,7 @@ int slsDetector::writeSettingsFile(const std::string &fname, sls_detector_module } // eiger - if (thisDetector->myDetectorType == EIGER) { + if (detector_shm()->myDetectorType == EIGER) { for (int i = 0; i < mod.ndac; ++i) { FILE_LOG(logINFO) << "dac " << i << ":" << mod.dacs[i]; } diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index 4095db4c6..e584989b9 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -29,7 +29,7 @@ class MySocketTCP; /** * parameter list that has to be initialized depending on the detector type */ -typedef struct detParameterList { +struct detParameterList { int nChanX; int nChanY; int nChipX; @@ -38,7 +38,7 @@ typedef struct detParameterList { int dynamicRange; int nGappixelsX; int nGappixelsY; -} detParameterList; +}; /** * @short structure allocated in shared memory to store detector settings for IPC and cache @@ -134,15 +134,6 @@ struct sharedSlsDetector { /** timer values */ int64_t timerValue[slsDetectorDefs::timerIndex::MAX_TIMERS]; - /** memory offsets for the module structures */ - int modoff; - - /** memory offsets for the dac arrays */ - int dacoff; - - /** memory offsets for the channel register arrays -trimbits*/ - int chanoff; - /** ip address/hostname of the receiver for client control via TCP */ char receiver_hostname[MAX_STR_LENGTH]; @@ -1648,7 +1639,7 @@ class slsDetector : public virtual slsDetectorDefs, public virtual errorDefs { * @param verify true to verify if shm size matches existing one * @returns true if the shared memory was created now */ - void initSharedMemory(bool created, detectorType type, int multiId, bool verify = true); + void initSharedMemory(detectorType type, int multiId, bool verify = true); /** * Sets detector parameters depending detector type @@ -1657,13 +1648,6 @@ class slsDetector : public virtual slsDetectorDefs, public virtual errorDefs { */ void setDetectorSpecificParameters(detectorType type, detParameterList &list); - /** - * Calculate shared memory size based on detector type - * @param type type of detector - * @returns size of shared memory of sharedSlsDetector structure - */ - int calculateSharedMemorySize(detectorType type); - /** * Initialize detector structure to defaults * Called when new shared memory is created @@ -1671,24 +1655,10 @@ class slsDetector : public virtual slsDetectorDefs, public virtual errorDefs { */ void initializeDetectorStructure(detectorType type); - /** - * Initialize class members (and from parent classes) - * Also connect member pointers to detector structure pointers - * Called when shared memory created/existed - */ - void initializeMembers(); - - /** - * Initialize detector structure - * Called when new shared memory created - * Initializes the member pointers to defaults as well - */ - void initializeDetectorStructurePointers(); - /** * Allocates the memory for a sls_detector_module structure and initializes it * Uses current detector type - * @returns myMod the pointer to the allocate dmemory location + * @returns myMod the pointer to the allocate memory location */ sls_detector_module *createModule(); @@ -1775,19 +1745,8 @@ class slsDetector : public virtual slsDetectorDefs, public virtual errorDefs { int detId; /** Shared Memory object */ - SharedMemory *sharedMemory{nullptr}; + SharedMemory detector_shm{0,0}; - /** Shared memory structure */ - sharedSlsDetector *thisDetector{nullptr}; - - /** pointer to detector module structures in shared memory */ - // sls_detector_module *detectorModules{nullptr}; - - /** pointer to dac valuse in shared memory */ - // int *dacs{nullptr}; - - /** pointer to channel registers in shared memory */ - // int *chanregs{nullptr}; }; #endif From d21ceb0e75d314c49e680360a4afb503f226bed0 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Wed, 13 Mar 2019 17:43:48 +0100 Subject: [PATCH 3/4] only construct shared memory from a type with exact size --- .../sharedMemory/SharedMemory.h | 24 +++++++------------ 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/slsDetectorSoftware/sharedMemory/SharedMemory.h b/slsDetectorSoftware/sharedMemory/SharedMemory.h index 3cc1f4500..6fc0b9cbf 100644 --- a/slsDetectorSoftware/sharedMemory/SharedMemory.h +++ b/slsDetectorSoftware/sharedMemory/SharedMemory.h @@ -121,25 +121,21 @@ class SharedMemory { * throws a SharedMemoryException exception on failure to create, ftruncate or map * @param sz of shared memory */ - void CreateSharedMemory(size_t sz = 0) { - if (sz == 0) { - sz = sizeof(T); - } - + void CreateSharedMemory() { fd = shm_open(name.c_str(), O_CREAT | O_TRUNC | O_EXCL | O_RDWR, S_IRUSR | S_IWUSR); if (fd < 0) { FILE_LOG(logERROR) << "Create shared memory " << name << " failed: " << strerror(errno); throw SharedMemoryException(); } - if (ftruncate(fd, sz) < 0) { + if (ftruncate(fd, sizeof(T)) < 0) { FILE_LOG(logERROR) << "Create shared memory " << name << " failed at ftruncate: " << strerror(errno); close(fd); RemoveSharedMemory(); throw SharedMemoryException(); } - shared_struct = MapSharedMemory(sz); + shared_struct = MapSharedMemory(); FILE_LOG(logINFO) << "Shared memory created " << name; } @@ -148,18 +144,14 @@ class SharedMemory { * throws a SharedMemoryException exception on failure to open or map * @param sz of shared memory */ - void OpenSharedMemory(size_t sz = 0) { - if (sz == 0) { - sz = sizeof(T); - } - + void OpenSharedMemory() { fd = shm_open(name.c_str(), O_RDWR, 0); if (fd < 0) { FILE_LOG(logERROR) << "Open existing shared memory " << name << " failed: " << strerror(errno); throw SharedMemoryException(); } - shared_struct = MapSharedMemory(sz); + shared_struct = MapSharedMemory(); } /** @@ -251,14 +243,14 @@ class SharedMemory { * @param sz of shared memory */ - T *MapSharedMemory(size_t sz) { - void *addr = mmap(nullptr, sz, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + T *MapSharedMemory() { + void *addr = mmap(nullptr, sizeof(T), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (addr == MAP_FAILED) { FILE_LOG(logERROR) << "Mapping shared memory " << name << " failed: " << strerror(errno); close(fd); throw SharedMemoryException(); } - shmSize = sz; + shmSize = sizeof(T); close(fd); return (T *)addr; } From 327d08a016dc0dbc7023d05c138cf32aed5e96b9 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Thu, 14 Mar 2019 12:40:01 +0100 Subject: [PATCH 4/4] removing comments, added one check for nullptr, updated current threshold when getting module, removing unsued function from header file (writesettingsfile) --- .../slsDetector/slsDetector.cpp | 69 ++++--------------- slsDetectorSoftware/slsDetector/slsDetector.h | 9 --- 2 files changed, 13 insertions(+), 65 deletions(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 9cb55a4c2..09b1bb297 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -1158,11 +1158,6 @@ std::string slsDetector::getSettingsFile() { return std::string(detector_shm()->settingsFile); } -// int slsDetector::writeSettingsFile(const std::string &fname) { -// //TODO should read module from detector... -// return writeSettingsFile(fname, getModule()); -// } - slsDetectorDefs::detectorSettings slsDetector::getSettings() { return sendSettingsOnly(GET_SETTINGS); } @@ -3878,13 +3873,15 @@ int slsDetector::getChanRegs(double *retval) { // update chanregs sls_detector_module *myMod = getModule(); - //the original array has 0 initialized - if (myMod->chanregs) { - for (int i = 0; i < n; ++i) { - retval[i] = (double)(myMod->chanregs[i] & TRIMBITMASK); - } + if (myMod != nullptr) { + //the original array has 0 initialized + if (myMod->chanregs) { + for (int i = 0; i < n; ++i) { + retval[i] = (double)(myMod->chanregs[i] & TRIMBITMASK); + } + } + deleteModule(myMod); } - deleteModule(myMod); return n; } @@ -3926,26 +3923,6 @@ int slsDetector::setModule(sls_detector_module module, int tb) { // update client structure if (ret == OK) { - // if (detectorModules) { - // if (detector_shm()->myDetectorType == EIGER && tb && chanregs) { - // for (int ichip = 0; ichip < detector_shm()->nChips; ++ichip) { - // for (int i = 0; i < detector_shm()->nChans; ++i) { - // chanregs[i + ichip * detector_shm()->nChans] = - // module.chanregs[ichip * detector_shm()->nChans + i]; - // } - // } - // } - // if (dacs) { - // for (int i = 0; i < detector_shm()->nDacs; ++i) { - // dacs[i] = module.dacs[i]; - // } - // } - // (detectorModules)->serialnumber = module.serialnumber; - // (detectorModules)->reg = module.reg; - // (detectorModules)->iodelay = module.iodelay; - // (detectorModules)->tau = module.tau; - // (detectorModules)->eV = module.eV; - // } if (module.eV != -1) { detector_shm()->currentThresholdEV = module.eV; } @@ -3981,31 +3958,11 @@ slsDetectorDefs::sls_detector_module *slsDetector::getModule() { } // update client structure - // if (ret == OK) { - // if (detectorModules) { - // if (detector_shm()->myDetectorType == EIGER && chanregs) { - // for (int ichip = 0; ichip < detector_shm()->nChips; ++ichip) { - // for (int i = 0; i < detector_shm()->nChans; ++i) { - // chanregs[i + ichip * detector_shm()->nChans] = - // myMod->chanregs[ichip * detector_shm()->nChans + i]; - // } - // } - // } - // if (dacs) { - // for (int i = 0; i < detector_shm()->nDacs; ++i) { - // dacs[i] = myMod->dacs[i]; - // } - // } - // (detectorModules)->serialnumber = myMod->serialnumber; - // (detectorModules)->reg = myMod->reg; - // (detectorModules)->iodelay = myMod->iodelay; - // (detectorModules)->tau = myMod->tau; - // (detectorModules)->eV = myMod->eV; - // } - // } else { - // deleteModule(myMod); - // myMod = nullptr; - // } + if (ret == OK) { + if (myMod->eV != -1) { + detector_shm()->currentThresholdEV = myMod->eV; + } + } return myMod; } diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index e584989b9..1bebc74dc 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -539,15 +539,6 @@ class slsDetector : public virtual slsDetectorDefs, public virtual errorDefs { */ std::string getSettingsFile(); - /** - * Writes a trim/settings file for module number - * the values will be read from the current detector structure - * @param fname name of the file to be written - * @returns OK or FAIL if the file could not be written - * \sa ::sls_detector_module sharedSlsDetector mythenDetector::writeSettingsFile(string, int) - */ - int writeSettingsFile(const std::string &fname); - /** * Get detector settings * @returns current settings