diff --git a/integrationTests/src/a.cpp b/integrationTests/src/a.cpp index 0bb15c956..afbf0e58e 100644 --- a/integrationTests/src/a.cpp +++ b/integrationTests/src/a.cpp @@ -19,43 +19,56 @@ using sls::SocketError; int main() { - //Catch exception - try { - throw RuntimeError("something went wrong"); - } catch (RuntimeError &e) { - std::cout << "Caught RuntimeError with message : " << e.what() << '\n'; - } - //Catch base class - try { - throw SharedMemoryError("Could not create shared memory"); - } catch (RuntimeError &e) { - std::cout << "Caught: " << e.what() << '\n'; - } + // const std::string hostname = "beb083"; + // auto type = slsDetector::getTypeFromDetector(hostname); + // slsDetector d(type); + // d.setHostname(hostname); + // d.setReceiverHostname("mpc2408"); + // std::cout << "hostname: " << d.getHostname() << '\n'; + // std::cout << "port: " << d.getControlPort() << '\n'; + // d.setOnline(true); + // d.setReceiverOnline(true); + // std::cout << "reciver version: " << std::hex << d.getReceiverVersion() << '\n'; + // // std::cout << "version: " << d.getId(slsDetectorDefs::CLIENT_RECEIVER_API_VERSION) << '\n'; + // d.freeSharedMemory(); + // //Catch exception + // try { + // throw RuntimeError("something went wrong"); + // } catch (RuntimeError &e) { + // std::cout << "Caught RuntimeError with message : " << e.what() << '\n'; + // } - //Catch base class after looking for something else - try { - throw SharedMemoryError("Could not create shared memory"); - } catch (SocketError &e) { + // //Catch base class + // try { + // throw SharedMemoryError("Could not create shared memory"); + // } catch (RuntimeError &e) { + // std::cout << "Caught: " << e.what() << '\n'; + // } - std::cout << "Caught Socket error: " << e.what() << '\n'; + // //Catch base class after looking for something else + // try { + // throw SharedMemoryError("Could not create shared memory"); + // } catch (SocketError &e) { - } catch (RuntimeError &e) { - std::cout << "Caught base class: " << e.what() << '\n'; - } + // std::cout << "Caught Socket error: " << e.what() << '\n'; - //Catch any after looking for something else - try { - throw SharedMemoryError("Could not create shared memory"); - } catch (SocketError &e) { + // } catch (RuntimeError &e) { + // std::cout << "Caught base class: " << e.what() << '\n'; + // } - std::cout << "Caught Socket error: " << e.what() << '\n'; + // //Catch any after looking for something else + // try { + // throw SharedMemoryError("Could not create shared memory"); + // } catch (SocketError &e) { - } catch (...) { - std::cout << "Caught Something else probably should have let me crash\n"; - } + // std::cout << "Caught Socket error: " << e.what() << '\n'; + + // } catch (...) { + // std::cout << "Caught Something else probably should have let me crash\n"; + // } - throw RuntimeError("This one we missed"); + // throw RuntimeError("This one we missed"); return 0; } diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 8a6a4e9db..3463eb34b 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -176,6 +176,15 @@ int64_t multiSlsDetector::getId(idMode mode, int detPos) { return sls::minusOneIfDifferent(r); } +int64_t multiSlsDetector::getReceiverSoftwareVersion(int detPos) const { + if (detPos >= 0) { + return detectors[detPos]->getReceiverSoftwareVersion(); + } + + auto r = parallelCall(&slsDetector::getReceiverSoftwareVersion); + return sls::minusOneIfDifferent(r); +} + std::vector multiSlsDetector::getDetectorNumber() { return parallelCall(&slsDetector::getId, slsDetectorDefs::DETECTOR_SERIAL_NUMBER); } diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index 3b5c93b6d..59bcb90b1 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -9,6 +9,7 @@ */ #include "SharedMemory.h" #include "error_defs.h" +#include "gitInfoLib.h" #include "logger.h" #include "sls_detector_defs.h" class slsDetector; @@ -225,7 +226,13 @@ class multiSlsDetector : public virtual slsDetectorDefs, */ int64_t getId(idMode mode, int detPos = -1); - std::vector getDetectorNumber(); + int64_t getClientSoftwareVersion() const { + return GITDATE; + } + + int64_t getReceiverSoftwareVersion(int detPos = -1) const; + + std::vector getDetectorNumber(); /** * Free shared memory from the command line * avoiding creating the constructor classes and mapping diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 5b0dd2552..3e004a473 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -24,6 +24,7 @@ #include #include +using sls::NotImplementedError; using sls::RuntimeError; using sls::SharedMemory; using sls::SharedMemoryError; @@ -63,7 +64,6 @@ slsDetector::~slsDetector() = default; int slsDetector::checkDetectorVersionCompatibility() { int fnum = F_CHECK_VERSION; int ret = FAIL; - // char mess[MAX_STR_LENGTH]{}; int64_t arg = 0; // get api version number for detector server @@ -153,39 +153,46 @@ int slsDetector::checkReceiverVersionCompatibility() { return ret; } -int64_t slsDetector::getId(idMode mode){ +int64_t slsDetector::getId(idMode mode) { int arg = (int)mode; int64_t retval = -1; FILE_LOG(logDEBUG1) << "Getting id type " << mode; - if (mode == THIS_SOFTWARE_VERSION) { - return GITDATE; - } else if (mode == RECEIVER_VERSION) { - int ret = FAIL; - if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { - int fnum = F_GET_RECEIVER_ID; - auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); - ret = receiver.sendCommandThenRead(fnum, nullptr, 0, &retval, sizeof(retval)); - } - if (ret == FORCE_UPDATE) { - ret = updateReceiver(); - } - return retval; - } else { - int fnum = F_GET_ID; - int ret = FAIL; - 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) { - FILE_LOG(logDEBUG1) << "Id (" << mode << "): 0x" << std::hex << retval << std::dec; - } - if (ret == FORCE_UPDATE) { - updateDetector(); - } - return retval; + //These four should not go to detector... + assert(mode != THIS_SOFTWARE_VERSION); + assert(mode != RECEIVER_VERSION); + assert(mode != CLIENT_SOFTWARE_API_VERSION); + assert(mode != CLIENT_RECEIVER_API_VERSION); + + int fnum = F_GET_ID; + int ret = FAIL; + 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) { + FILE_LOG(logDEBUG1) << "Id (" << mode << "): 0x" << std::hex << retval << std::dec; + } + if (ret == FORCE_UPDATE) { + updateDetector(); + } + return retval; +} + +int64_t slsDetector::getReceiverSoftwareVersion() const { + int ret = FAIL; + int arg = RECEIVER_VERSION; + int64_t retval = -1; + FILE_LOG(logDEBUG1) << "Getting id type " << arg; + if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { + int fnum = F_GET_RECEIVER_ID; + auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); + ret = receiver.sendCommandThenRead(fnum, nullptr, 0, &retval, sizeof(retval)); + } + if (ret == FORCE_UPDATE) { + ret = updateCachedReceiverVariables(); + } + return retval; } void slsDetector::freeSharedMemory(int multi_id, int slsId) { @@ -224,8 +231,8 @@ void slsDetector::initSharedMemory(detectorType type, FILE_LOG(logERROR) << "Single shared memory " "(" << multi_id << "-" << detId << ":) " - "version mismatch " - "(expected 0x" + "version mismatch " + "(expected 0x" << std::hex << SLS_SHMVERSION << " but got 0x" << detector_shm()->shmversion << ")" << std::dec; throw SharedMemoryError("Shared memory version mismatch (det)"); } @@ -531,7 +538,7 @@ int slsDetector::receiveModule(sls_detector_module *myMod, sls::ClientSocket &cl slsDetectorDefs::detectorType slsDetector::getDetectorTypeFromShm(int multi_id, bool verify) { if (!detector_shm.IsExisting()) { FILE_LOG(logERROR) << "Shared memory " << detector_shm.GetName() << " does not exist.\n" - "Corrupted Multi Shared memory. Please free shared memory."; + "Corrupted Multi Shared memory. Please free shared memory."; throw SharedMemoryError("Corrupted multi shared memory."); } @@ -542,7 +549,7 @@ slsDetectorDefs::detectorType slsDetector::getDetectorTypeFromShm(int multi_id, FILE_LOG(logERROR) << "Single shared memory " "(" << multi_id << "-" << detId << ":)version mismatch " - "(expected 0x" + "(expected 0x" << std::hex << SLS_SHMVERSION << " but got 0x" << detector_shm()->shmversion << ")" << std::dec; // unmap and throw detector_shm.UnmapSharedMemory(); @@ -621,7 +628,7 @@ int slsDetector::setDetectorType(detectorType const type) { if (ret == FORCE_UPDATE) { receiver.close(); //need to find a better solution - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } } } @@ -830,12 +837,12 @@ int slsDetector::setReceiverPort(int port_number) { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } return detector_shm()->receiverTCPPort; } -int slsDetector::getReceiverPort() const{ +int slsDetector::getReceiverPort() const { return detector_shm()->receiverTCPPort; } @@ -847,7 +854,6 @@ int slsDetector::getStopPort() const { return detector_shm()->stopPort; } - int slsDetector::lockServer(int lock) { int fnum = F_LOCK_SERVER; int ret = FAIL; @@ -1395,8 +1401,6 @@ int slsDetector::setThresholdEnergyAndSettings(int e_eV, detectorSettings isetti // myMod = createModule(); // myMod->iodelay = myMod1->iodelay; - - //interpolate module myMod = interpolateTrim(myMod1, myMod2, e_eV, trim1, trim2, tb); if (myMod == nullptr) { @@ -1912,7 +1916,7 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t) { } } else if (ret == FORCE_UPDATE) { receiver.close(); - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } break; @@ -2045,7 +2049,7 @@ int slsDetector::setDynamicRange(int n) { FILE_LOG(logDEBUG1) << "Receiver Dynamic range: " << retval; if (ret == FORCE_UPDATE) { receiver.close(); - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } } } @@ -2205,7 +2209,7 @@ int slsDetector::setReadOutFlags(readOutFlags flag) { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } } @@ -2541,7 +2545,7 @@ void slsDetector::setReceiverStreamingPort(int port) { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } } @@ -2617,7 +2621,7 @@ void slsDetector::setReceiverStreamingIP(std::string sourceIP) { sls::strcpy_safe(detector_shm()->receiver_zmqip, retvals); if (ret == FORCE_UPDATE) { receiver.close(); - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } } } @@ -2673,7 +2677,7 @@ std::string slsDetector::setAdditionalJsonHeader(const std::string &jsonheader) } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } return std::string(detector_shm()->receiver_additionalJsonHeader); } @@ -2696,7 +2700,7 @@ std::string slsDetector::getAdditionalJsonHeader() { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } return std::string(detector_shm()->receiver_additionalJsonHeader); } @@ -2798,7 +2802,7 @@ int64_t slsDetector::setReceiverUDPSocketBufferSize(int64_t udpsockbufsize) { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } return retval; } @@ -2824,7 +2828,7 @@ int64_t slsDetector::getReceiverRealUDPSocketBufferSize() { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } return retval; } @@ -2879,7 +2883,7 @@ int slsDetector::setUDPConnection() { sls::strcpy_safe(detector_shm()->receiverUDPMAC, retvals); if (ret == FORCE_UPDATE) { receiver.close(); - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } //configure detector with udp details @@ -3190,7 +3194,7 @@ int slsDetector::sendROI(int n, ROI roiLimits[]) { } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } } return ret; @@ -3255,7 +3259,7 @@ int slsDetector::activate(int const enable) { setErrorMask((getErrorMask()) | (RECEIVER_ACTIVATE)); } else if (ret == FORCE_UPDATE) { receiver.close(); - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } } return detector_shm()->activated; @@ -3280,7 +3284,7 @@ int slsDetector::setDeactivatedRxrPaddingMode(int padding) { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } return detector_shm()->receiver_deactivatedPaddingEnable; } @@ -3320,7 +3324,7 @@ int slsDetector::setFlippedData(dimension d, int value) { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } return detector_shm()->flippedData[d]; } @@ -3378,7 +3382,7 @@ int slsDetector::enableGapPixels(int val) { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } } return detector_shm()->gappixels; @@ -4075,7 +4079,7 @@ int slsDetector::lockReceiver(int lock) { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } return retval; } @@ -4097,7 +4101,7 @@ std::string slsDetector::getReceiverLastClientIP() { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } return retval; } @@ -4138,105 +4142,107 @@ int slsDetector::execReceiverCommand(const std::string &cmd) { return ret; } -int slsDetector::updateReceiverNoWait(sls::ClientSocket &receiver) { - - int n = 0, i32 = 0; - char cstring[MAX_STR_LENGTH] = {}; - char lastClientIP[INET_ADDRSTRLEN] = {}; - - n += receiver.receiveData(lastClientIP, sizeof(lastClientIP)); - FILE_LOG(logDEBUG1) << "Updating receiver last modified by " << lastClientIP; - - // filepath - n += receiver.receiveData(cstring, sizeof(cstring)); - sls::strcpy_safe(detector_shm()->receiver_filePath, cstring); - - // filename - n += receiver.receiveData(cstring, sizeof(cstring)); - sls::strcpy_safe(detector_shm()->receiver_fileName, cstring); - - // index - n += receiver.receiveData(&i32, sizeof(i32)); - detector_shm()->receiver_fileIndex = i32; - - //file format - n += receiver.receiveData(&i32, sizeof(i32)); - detector_shm()->receiver_fileFormatType = (fileFormat)i32; - - // frames per file - n += receiver.receiveData(&i32, sizeof(i32)); - detector_shm()->receiver_framesPerFile = i32; - - // frame discard policy - n += receiver.receiveData(&i32, sizeof(i32)); - detector_shm()->receiver_frameDiscardMode = (frameDiscardPolicy)i32; - - // frame padding - n += receiver.receiveData(&i32, sizeof(i32)); - detector_shm()->receiver_framePadding = i32; - - // file write enable - n += receiver.receiveData(&i32, sizeof(i32)); - detector_shm()->receiver_fileWriteEnable = i32; - - // file overwrite enable - n += receiver.receiveData(&i32, sizeof(i32)); - detector_shm()->receiver_overWriteEnable = i32; - - // gap pixels - n += receiver.receiveData(&i32, sizeof(i32)); - detector_shm()->gappixels = i32; - - // receiver read frequency - n += receiver.receiveData(&i32, sizeof(i32)); - detector_shm()->receiver_read_freq = i32; - - // receiver streaming port - n += receiver.receiveData(&i32, sizeof(i32)); - detector_shm()->receiver_zmqport = i32; - - // streaming source ip - n += receiver.receiveData(cstring, sizeof(cstring)); - sls::strcpy_safe(detector_shm()->receiver_zmqip, cstring); - - // additional json header - n += receiver.receiveData(cstring, sizeof(cstring)); - sls::strcpy_safe(detector_shm()->receiver_additionalJsonHeader, cstring); - - // receiver streaming enable - n += receiver.receiveData(&i32, sizeof(i32)); - detector_shm()->receiver_upstream = i32; - - // activate - n += receiver.receiveData(&i32, sizeof(i32)); - detector_shm()->activated = i32; - - // deactivated padding enable - n += receiver.receiveData(&i32, sizeof(i32)); - detector_shm()->receiver_deactivatedPaddingEnable = i32; - - // silent mode - n += receiver.receiveData(&i32, sizeof(i32)); - detector_shm()->receiver_silentMode = i32; - - if (!n) { - FILE_LOG(logERROR) << "Could not update receiver, received 0 bytes\n"; - } - return OK; -} - -int slsDetector::updateReceiver() { +int slsDetector::updateCachedReceiverVariables() const { int fnum = F_UPDATE_RECEIVER_CLIENT; int ret = FAIL; FILE_LOG(logDEBUG1) << "Sending update client to receiver server"; if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { - auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); + 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)); + std::string msg = "Could not update receiver: " + std::string(detector_shm()->receiver_hostname); + throw RuntimeError(msg); } else { - updateReceiverNoWait(receiver); + int n = 0, i32 = 0; + char cstring[MAX_STR_LENGTH] = {}; + char lastClientIP[INET_ADDRSTRLEN] = {}; + + n += receiver.receiveData(lastClientIP, sizeof(lastClientIP)); + FILE_LOG(logDEBUG1) << "Updating receiver last modified by " << lastClientIP; + + // filepath + n += receiver.receiveData(cstring, sizeof(cstring)); + sls::strcpy_safe(detector_shm()->receiver_filePath, cstring); + + // filename + n += receiver.receiveData(cstring, sizeof(cstring)); + sls::strcpy_safe(detector_shm()->receiver_fileName, cstring); + + // index + n += receiver.receiveData(&i32, sizeof(i32)); + detector_shm()->receiver_fileIndex = i32; + + //file format + n += receiver.receiveData(&i32, sizeof(i32)); + detector_shm()->receiver_fileFormatType = (fileFormat)i32; + + // frames per file + n += receiver.receiveData(&i32, sizeof(i32)); + detector_shm()->receiver_framesPerFile = i32; + + // frame discard policy + n += receiver.receiveData(&i32, sizeof(i32)); + detector_shm()->receiver_frameDiscardMode = (frameDiscardPolicy)i32; + + // frame padding + n += receiver.receiveData(&i32, sizeof(i32)); + detector_shm()->receiver_framePadding = i32; + + // file write enable + n += receiver.receiveData(&i32, sizeof(i32)); + detector_shm()->receiver_fileWriteEnable = i32; + + // file overwrite enable + n += receiver.receiveData(&i32, sizeof(i32)); + detector_shm()->receiver_overWriteEnable = i32; + + // gap pixels + n += receiver.receiveData(&i32, sizeof(i32)); + detector_shm()->gappixels = i32; + + // receiver read frequency + n += receiver.receiveData(&i32, sizeof(i32)); + detector_shm()->receiver_read_freq = i32; + + // receiver streaming port + n += receiver.receiveData(&i32, sizeof(i32)); + detector_shm()->receiver_zmqport = i32; + + // streaming source ip + n += receiver.receiveData(cstring, sizeof(cstring)); + sls::strcpy_safe(detector_shm()->receiver_zmqip, cstring); + + // additional json header + n += receiver.receiveData(cstring, sizeof(cstring)); + sls::strcpy_safe(detector_shm()->receiver_additionalJsonHeader, cstring); + + // receiver streaming enable + n += receiver.receiveData(&i32, sizeof(i32)); + detector_shm()->receiver_upstream = i32; + + // activate + n += receiver.receiveData(&i32, sizeof(i32)); + detector_shm()->activated = i32; + + // deactivated padding enable + n += receiver.receiveData(&i32, sizeof(i32)); + detector_shm()->receiver_deactivatedPaddingEnable = i32; + + // silent mode + n += receiver.receiveData(&i32, sizeof(i32)); + detector_shm()->receiver_silentMode = i32; + + if (!n) { + std::string msg = "Could not update receiver: " + + std::string(detector_shm()->receiver_hostname) + + ", received 0 bytes\n"; + FILE_LOG(logERROR) << msg; + throw RuntimeError(msg); + } + return OK; } } return ret; @@ -4260,7 +4266,7 @@ void slsDetector::sendMultiDetectorSize() { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } } @@ -4282,7 +4288,7 @@ void slsDetector::setDetectorId() { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } } @@ -4305,7 +4311,7 @@ void slsDetector::setDetectorHostname() { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } } @@ -4339,7 +4345,7 @@ std::string slsDetector::setFilePath(const std::string &path) { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } } return detector_shm()->receiver_filePath; @@ -4370,7 +4376,7 @@ std::string slsDetector::setFileName(const std::string &fname) { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } } return detector_shm()->receiver_fileName; @@ -4397,7 +4403,7 @@ int slsDetector::setReceiverFramesPerFile(int f) { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } } return detector_shm()->receiver_framesPerFile; @@ -4421,7 +4427,7 @@ slsDetectorDefs::frameDiscardPolicy slsDetector::setReceiverFramesDiscardPolicy( } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } return detector_shm()->receiver_frameDiscardMode; } @@ -4446,7 +4452,7 @@ int slsDetector::setReceiverPartialFramesPadding(int f) { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } return detector_shm()->receiver_framePadding; } @@ -4472,7 +4478,7 @@ slsDetectorDefs::fileFormat slsDetector::setFileFormat(fileFormat f) { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } } return getFileFormat(); @@ -4507,7 +4513,7 @@ int slsDetector::setFileIndex(int i) { } } if (ret == FORCE_UPDATE) { - updateReceiver(); + updateCachedReceiverVariables(); } } return detector_shm()->receiver_fileIndex; @@ -4543,7 +4549,7 @@ int slsDetector::startReceiver() { // } } if (ret == FORCE_UPDATE) { - updateReceiver(); + updateCachedReceiverVariables(); } return ret; } @@ -4562,7 +4568,7 @@ int slsDetector::stopReceiver() { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } return ret; } @@ -4585,7 +4591,7 @@ slsDetectorDefs::runStatus slsDetector::getReceiverStatus() { } } if (ret == FORCE_UPDATE) { - updateReceiver(); //Do we need to handle this ret? + updateCachedReceiverVariables(); //Do we need to handle this ret? } return retval; } @@ -4606,7 +4612,7 @@ int slsDetector::getFramesCaughtByReceiver() { } } if (ret == FORCE_UPDATE) { - updateReceiver(); + updateCachedReceiverVariables(); } return retval; } @@ -4626,7 +4632,7 @@ int slsDetector::getReceiverCurrentFrameIndex() { } } if (ret == FORCE_UPDATE) { - updateReceiver(); + updateCachedReceiverVariables(); } return retval; } @@ -4644,7 +4650,7 @@ int slsDetector::resetFramesCaught() { } } if (ret == FORCE_UPDATE) { - updateReceiver(); + updateCachedReceiverVariables(); } return ret; } @@ -4667,7 +4673,7 @@ int slsDetector::enableWriteToFile(int enable) { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } } return detector_shm()->receiver_fileWriteEnable; @@ -4692,7 +4698,7 @@ int slsDetector::overwriteFile(int enable) { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } } return detector_shm()->receiver_overWriteEnable; @@ -4717,7 +4723,7 @@ int slsDetector::setReceiverStreamingFrequency(int freq) { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } } return detector_shm()->receiver_read_freq; @@ -4740,7 +4746,7 @@ int slsDetector::setReceiverStreamingTimer(int time_in_ms) { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } return retval; } @@ -4764,7 +4770,7 @@ int slsDetector::enableDataStreamingFromReceiver(int enable) { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } } return detector_shm()->receiver_upstream; @@ -4809,7 +4815,7 @@ int slsDetector::enableTenGigabitEthernet(int i) { FILE_LOG(logDEBUG1) << "Receiver 10Gbe enable: " << retval; if (ret == FORCE_UPDATE) { receiver.close(); - updateReceiver(); + updateCachedReceiverVariables(); } } } @@ -4835,7 +4841,7 @@ int slsDetector::setReceiverFifoDepth(int i) { } } if (ret == FORCE_UPDATE) { - updateReceiver(); + updateCachedReceiverVariables(); } return retval; } @@ -4860,7 +4866,7 @@ int slsDetector::setReceiverSilentMode(int i) { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } return detector_shm()->receiver_silentMode; } @@ -4880,7 +4886,7 @@ int slsDetector::restreamStopFromReceiver() { } } if (ret == FORCE_UPDATE) { - ret = updateReceiver(); + ret = updateCachedReceiverVariables(); } return ret; } diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index 5fca8e28a..433d7a7e0 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -295,6 +295,9 @@ class slsDetector : public virtual slsDetectorDefs, public virtual errorDefs { */ int64_t getId(idMode mode); + + int64_t getReceiverSoftwareVersion() const; + /** * Free shared memory without creating objects * If this is called, must take care to update @@ -1318,13 +1321,13 @@ class slsDetector : public virtual slsDetectorDefs, public virtual errorDefs { updates the shared memory receiving the data from the detector (without asking and closing the connection /returns OK */ - int updateReceiverNoWait(sls::ClientSocket &receiver); + // int updateReceiverNoWait(sls::ClientSocket &receiver); /** * Updates the shared memory receiving the data from the detector * @returns OK or FAIL */ - int updateReceiver(); + int updateCachedReceiverVariables() const; /** * Send the multi detector size to the detector @@ -1736,7 +1739,7 @@ class slsDetector : public virtual slsDetectorDefs, public virtual errorDefs { const int detId; /** Shared Memory object */ - sls::SharedMemory detector_shm{0,0}; + mutable sls::SharedMemory detector_shm{0,0}; }; diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index bdb8cc41b..539aba522 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -3465,7 +3465,7 @@ std::string slsDetectorCommand::cmdSN(int narg, char *args[], int action, int de return helpSN(action); if (cmd == "thisversion") { - int64_t retval = myDet->getId(THIS_SOFTWARE_VERSION, detPos); + int64_t retval = myDet->getClientSoftwareVersion(); if (retval < 0) sprintf(answer, "%d", -1); else @@ -3504,7 +3504,7 @@ std::string slsDetectorCommand::cmdSN(int narg, char *args[], int action, int de if (cmd == "receiverversion") { myDet->setReceiverOnline(ONLINE_FLAG, detPos); - int64_t retval = myDet->getId(RECEIVER_VERSION, detPos); + int64_t retval = myDet->getReceiverSoftwareVersion(detPos); if (retval < 0) sprintf(answer, "%d", -1); else diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp b/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp index 5707be53c..d1a5b4b1f 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp @@ -66,8 +66,8 @@ int64_t slsDetectorUsers::getDetectorSoftwareVersion(int detPos){ return detector.getId(slsDetectorDefs::DETECTOR_SOFTWARE_VERSION, detPos); } -int64_t slsDetectorUsers::getClientSoftwareVersion(int detPos){ - return detector.getId(slsDetectorDefs::THIS_SOFTWARE_VERSION, detPos); +int64_t slsDetectorUsers::getClientSoftwareVersion(){ + return detector.getClientSoftwareVersion(); } int64_t slsDetectorUsers::getReceiverSoftwareVersion(int detPos){ diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUsers.h b/slsDetectorSoftware/slsDetector/slsDetectorUsers.h index 6d701392e..1aea31f81 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUsers.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUsers.h @@ -199,10 +199,9 @@ public: /** * (previously getThisSoftwareVersion) * Get client software version - * @param detPos -1 for all detectors in list or specific detector position * @returns client software version */ - int64_t getClientSoftwareVersion(int detPos = -1); + int64_t getClientSoftwareVersion(); /** * Get receiver software version diff --git a/slsSupportLib/include/sls_detector_exceptions.h b/slsSupportLib/include/sls_detector_exceptions.h index 8819d9911..7f8a92376 100644 --- a/slsSupportLib/include/sls_detector_exceptions.h +++ b/slsSupportLib/include/sls_detector_exceptions.h @@ -36,6 +36,11 @@ public: }; +struct NotImplementedError : public RuntimeError { +public: + NotImplementedError(std::string msg):RuntimeError(msg) {} + +}; }