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/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; } diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index d86d5f1bf..4580f021c 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) { @@ -604,7 +501,7 @@ int slsDetector::sendModule(sls_detector_module *myMod, sls::ClientSocket& clien 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"; @@ -625,9 +522,9 @@ int slsDetector::receiveModule(sls_detector_module *myMod, sls::ClientSocket& cl 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; } @@ -645,21 +542,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; } @@ -690,18 +584,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; } } @@ -713,14 +607,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 @@ -740,7 +634,7 @@ int slsDetector::setDetectorType(detectorType const type) { } slsDetectorDefs::detectorType slsDetector::getDetectorTypeAsEnum() { - return thisDetector->myDetectorType; + return detector_shm()->myDetectorType; } std::string slsDetector::getDetectorTypeAsString() { @@ -748,146 +642,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) { @@ -897,24 +791,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) { @@ -925,37 +819,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) { @@ -964,8 +858,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 @@ -987,8 +881,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 @@ -1009,8 +903,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"; @@ -1026,8 +920,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)); @@ -1043,112 +937,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"; } @@ -1161,8 +1054,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) { @@ -1215,7 +1108,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"); @@ -1238,7 +1131,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; } @@ -1253,18 +1146,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); -} - -int slsDetector::writeSettingsFile(const std::string &fname) { - return writeSettingsFile(fname, detectorModules[0]); + return std::string(detector_shm()->settingsFile); } slsDetectorDefs::detectorSettings slsDetector::getSettings() { @@ -1279,15 +1168,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)); @@ -1306,8 +1195,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 @@ -1315,31 +1204,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; } } @@ -1349,8 +1238,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 @@ -1358,33 +1247,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"; @@ -1395,28 +1284,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!"; @@ -1425,9 +1314,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; @@ -1435,8 +1324,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; } @@ -1449,7 +1338,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; @@ -1468,21 +1357,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 @@ -1527,7 +1416,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); @@ -1540,12 +1429,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) { @@ -1554,7 +1443,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); } @@ -1582,15 +1471,15 @@ 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(); // 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); } @@ -1603,8 +1492,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) { @@ -1624,8 +1513,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 @@ -1646,9 +1535,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 @@ -1667,7 +1556,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(); } @@ -1675,8 +1564,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) { @@ -1688,9 +1577,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; @@ -1701,9 +1590,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 @@ -1724,14 +1613,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"; @@ -1748,8 +1637,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 @@ -1769,13 +1658,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"; @@ -1798,26 +1687,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; @@ -1825,20 +1714,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] << ")"; @@ -1869,8 +1758,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 @@ -1895,15 +1784,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; } } } @@ -1923,27 +1812,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(); @@ -1954,10 +1843,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(); @@ -1969,8 +1858,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: @@ -1984,15 +1873,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]; @@ -2032,7 +1921,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) { @@ -2041,8 +1930,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 @@ -2065,8 +1954,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 @@ -2089,19 +1978,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) { @@ -2117,7 +2006,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(); @@ -2128,26 +2017,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 @@ -2161,15 +2050,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) { @@ -2179,8 +2068,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 @@ -2204,8 +2093,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 @@ -2228,8 +2117,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 @@ -2253,8 +2142,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 @@ -2277,8 +2166,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 @@ -2286,10 +2175,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(); } } } @@ -2299,29 +2188,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) { @@ -2331,8 +2220,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 @@ -2355,8 +2244,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 @@ -2410,18 +2299,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) { @@ -2436,29 +2325,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) { @@ -2469,76 +2358,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) { @@ -2554,19 +2443,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) { @@ -2579,77 +2468,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) { @@ -2658,7 +2547,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) { @@ -2670,12 +2559,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) { @@ -2687,12 +2576,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 @@ -2709,24 +2598,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(); @@ -2736,7 +2625,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) { @@ -2746,8 +2635,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 @@ -2771,23 +2660,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() { @@ -2796,24 +2685,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"; @@ -2821,35 +2710,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); } @@ -2867,9 +2753,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 @@ -2878,13 +2764,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]; @@ -2902,8 +2788,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) { @@ -2928,8 +2814,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) { @@ -2952,46 +2838,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(); @@ -3003,8 +2889,8 @@ int slsDetector::setUDPConnection() { } } } else { - ret=FAIL; - setErrorMask((getErrorMask())|(COULD_NOT_CONFIGURE_MAC)); + ret = FAIL; + setErrorMask((getErrorMask()) | (COULD_NOT_CONFIGURE_MAC)); } printReceiverConfiguration(logDEBUG1); @@ -3018,8 +2904,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 @@ -3058,8 +2944,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)); @@ -3099,8 +2985,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 @@ -3120,8 +3006,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)); @@ -3140,8 +3026,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 @@ -3158,14 +3044,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[]) { @@ -3190,35 +3075,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[]) { @@ -3226,13 +3111,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) { @@ -3260,11 +3145,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 << ")"; } } } @@ -3272,19 +3157,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) { @@ -3318,8 +3203,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)); @@ -3339,8 +3224,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 @@ -3348,7 +3233,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) { @@ -3356,14 +3241,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 @@ -3374,7 +3259,7 @@ int slsDetector::activate(int const enable) { ret = updateReceiver(); } } - return thisDetector->activated; + return detector_shm()->activated; } int slsDetector::setDeactivatedRxrPaddingMode(int padding) { @@ -3384,25 +3269,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) { @@ -3420,13 +3305,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) { @@ -3438,7 +3323,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) { @@ -3448,8 +3333,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)); @@ -3471,25 +3356,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; } } } @@ -3497,26 +3382,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) { @@ -3525,8 +3410,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)); @@ -3544,8 +3429,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 @@ -3565,8 +3450,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 @@ -3587,8 +3472,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 @@ -3608,8 +3493,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 @@ -3629,8 +3514,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 @@ -3650,8 +3535,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 @@ -3669,8 +3554,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; @@ -3804,8 +3689,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)); @@ -3895,7 +3780,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) { @@ -3922,8 +3807,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 @@ -3944,8 +3829,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)); @@ -3966,8 +3851,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)); @@ -3985,12 +3870,15 @@ 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) { - for (int i = 0; i < n; ++i) { - retval[i] = (double)(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); } return n; } @@ -4007,8 +3895,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); client.receiveData(&ret, sizeof(ret)); @@ -4033,28 +3921,8 @@ 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 (module.eV != -1) { - thisDetector->currentThresholdEV = module.eV; + detector_shm()->currentThresholdEV = module.eV; } } return ret; @@ -4072,8 +3940,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 @@ -4089,29 +3957,9 @@ 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; + if (myMod->eV != -1) { + detector_shm()->currentThresholdEV = myMod->eV; } - } else { - deleteModule(myMod); - myMod = nullptr; } return myMod; } @@ -4121,12 +3969,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) { @@ -4152,8 +4000,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 @@ -4177,33 +4025,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; @@ -4215,8 +4063,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) { @@ -4237,8 +4085,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) { @@ -4258,8 +4106,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"; @@ -4275,8 +4123,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) { @@ -4300,75 +4148,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"; @@ -4381,8 +4229,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)); @@ -4396,12 +4244,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) { @@ -4422,8 +4270,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) { @@ -4442,11 +4290,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) { @@ -4461,7 +4309,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) { @@ -4473,8 +4321,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) { @@ -4486,18 +4334,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) { @@ -4509,22 +4357,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) { @@ -4535,8 +4383,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 @@ -4544,14 +4392,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) { @@ -4561,20 +4409,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) { @@ -4584,8 +4432,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 @@ -4593,13 +4441,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) { @@ -4610,8 +4458,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 @@ -4619,7 +4467,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) { @@ -4630,11 +4478,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) { @@ -4645,8 +4493,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 @@ -4654,21 +4502,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() { @@ -4676,11 +4524,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) { @@ -4703,8 +4551,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 @@ -4724,8 +4572,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 @@ -4747,8 +4595,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)); @@ -4767,8 +4615,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)); @@ -4787,8 +4635,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)); @@ -4807,21 +4655,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) { @@ -4832,21 +4680,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) { @@ -4857,21 +4705,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) { @@ -4881,8 +4729,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)); @@ -4904,21 +4752,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) { @@ -4928,14 +4776,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(); @@ -4945,14 +4793,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)); @@ -4964,7 +4812,7 @@ int slsDetector::enableTenGigabitEthernet(int i) { } } } - return thisDetector->tenGigaEnable; + return detector_shm()->tenGigaEnable; } int slsDetector::setReceiverFifoDepth(int i) { @@ -4974,8 +4822,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 @@ -4998,8 +4846,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 @@ -5007,13 +4855,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() { @@ -5021,8 +4869,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 @@ -5060,8 +4908,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)); @@ -5085,8 +4933,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 @@ -5115,8 +4963,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 @@ -5140,8 +4988,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 @@ -5158,36 +5006,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 @@ -5204,49 +5052,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) { @@ -5256,8 +5104,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 @@ -5278,10 +5126,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 @@ -5302,13 +5150,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)); @@ -5377,7 +5225,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)); @@ -5387,7 +5235,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"); @@ -5423,7 +5271,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); @@ -5438,7 +5286,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()) { @@ -5519,17 +5367,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"); @@ -5568,7 +5416,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); @@ -5580,7 +5428,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 043d34ac8..713e3d228 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]; @@ -548,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 @@ -1648,7 +1630,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 +1639,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 +1646,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(); @@ -1769,25 +1730,14 @@ 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; /** 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