Merge branch 'refactor' of github.com:slsdetectorgroup/slsDetectorPackage into refactor

This commit is contained in:
maliakal_d 2019-03-19 17:32:17 +01:00
commit 430e0e3fb5
9 changed files with 253 additions and 211 deletions

View File

@ -19,43 +19,56 @@ using sls::SocketError;
int main() { 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 // const std::string hostname = "beb083";
try { // auto type = slsDetector::getTypeFromDetector(hostname);
throw SharedMemoryError("Could not create shared memory"); // slsDetector d(type);
} catch (RuntimeError &e) { // d.setHostname(hostname);
std::cout << "Caught: " << e.what() << '\n'; // 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 // //Catch base class
try { // try {
throw SharedMemoryError("Could not create shared memory"); // throw SharedMemoryError("Could not create shared memory");
} catch (SocketError &e) { // } 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 Socket error: " << e.what() << '\n';
std::cout << "Caught base class: " << e.what() << '\n';
}
//Catch any after looking for something else // } catch (RuntimeError &e) {
try { // std::cout << "Caught base class: " << e.what() << '\n';
throw SharedMemoryError("Could not create shared memory"); // }
} catch (SocketError &e) {
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 Socket error: " << e.what() << '\n';
std::cout << "Caught Something else probably should have let me crash\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; return 0;
} }

View File

@ -176,6 +176,15 @@ int64_t multiSlsDetector::getId(idMode mode, int detPos) {
return sls::minusOneIfDifferent(r); 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<int64_t> multiSlsDetector::getDetectorNumber() { std::vector<int64_t> multiSlsDetector::getDetectorNumber() {
return parallelCall(&slsDetector::getId, slsDetectorDefs::DETECTOR_SERIAL_NUMBER); return parallelCall(&slsDetector::getId, slsDetectorDefs::DETECTOR_SERIAL_NUMBER);
} }

View File

@ -9,6 +9,7 @@
*/ */
#include "SharedMemory.h" #include "SharedMemory.h"
#include "error_defs.h" #include "error_defs.h"
#include "gitInfoLib.h"
#include "logger.h" #include "logger.h"
#include "sls_detector_defs.h" #include "sls_detector_defs.h"
class slsDetector; class slsDetector;
@ -225,7 +226,13 @@ class multiSlsDetector : public virtual slsDetectorDefs,
*/ */
int64_t getId(idMode mode, int detPos = -1); int64_t getId(idMode mode, int detPos = -1);
std::vector<int64_t> getDetectorNumber(); int64_t getClientSoftwareVersion() const {
return GITDATE;
}
int64_t getReceiverSoftwareVersion(int detPos = -1) const;
std::vector<int64_t> getDetectorNumber();
/** /**
* Free shared memory from the command line * Free shared memory from the command line
* avoiding creating the constructor classes and mapping * avoiding creating the constructor classes and mapping

View File

@ -24,6 +24,7 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/types.h> #include <sys/types.h>
using sls::NotImplementedError;
using sls::RuntimeError; using sls::RuntimeError;
using sls::SharedMemory; using sls::SharedMemory;
using sls::SharedMemoryError; using sls::SharedMemoryError;
@ -63,7 +64,6 @@ slsDetector::~slsDetector() = default;
int slsDetector::checkDetectorVersionCompatibility() { int slsDetector::checkDetectorVersionCompatibility() {
int fnum = F_CHECK_VERSION; int fnum = F_CHECK_VERSION;
int ret = FAIL; int ret = FAIL;
// char mess[MAX_STR_LENGTH]{};
int64_t arg = 0; int64_t arg = 0;
// get api version number for detector server // get api version number for detector server
@ -153,39 +153,46 @@ int slsDetector::checkReceiverVersionCompatibility() {
return ret; return ret;
} }
int64_t slsDetector::getId(idMode mode){ int64_t slsDetector::getId(idMode mode) {
int arg = (int)mode; int arg = (int)mode;
int64_t retval = -1; int64_t retval = -1;
FILE_LOG(logDEBUG1) << "Getting id type " << mode; FILE_LOG(logDEBUG1) << "Getting id type " << mode;
if (mode == THIS_SOFTWARE_VERSION) { //These four should not go to detector...
return GITDATE; assert(mode != THIS_SOFTWARE_VERSION);
} else if (mode == RECEIVER_VERSION) { assert(mode != RECEIVER_VERSION);
int ret = FAIL; assert(mode != CLIENT_SOFTWARE_API_VERSION);
if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { assert(mode != CLIENT_RECEIVER_API_VERSION);
int fnum = F_GET_RECEIVER_ID;
auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); int fnum = F_GET_ID;
ret = receiver.sendCommandThenRead(fnum, nullptr, 0, &retval, sizeof(retval)); int ret = FAIL;
} if (detector_shm()->onlineFlag == ONLINE_FLAG) {
if (ret == FORCE_UPDATE) { auto client = sls::ClientSocket(false, detector_shm()->hostname, detector_shm()->controlPort);
ret = updateReceiver(); ret = client.sendCommandThenRead(fnum, &arg, sizeof(arg), &retval, sizeof(retval));
}
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;
} }
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) { void slsDetector::freeSharedMemory(int multi_id, int slsId) {
@ -224,8 +231,8 @@ void slsDetector::initSharedMemory(detectorType type,
FILE_LOG(logERROR) << "Single shared memory " FILE_LOG(logERROR) << "Single shared memory "
"(" "("
<< multi_id << "-" << detId << ":) " << multi_id << "-" << detId << ":) "
"version mismatch " "version mismatch "
"(expected 0x" "(expected 0x"
<< std::hex << SLS_SHMVERSION << " but got 0x" << detector_shm()->shmversion << ")" << std::dec; << std::hex << SLS_SHMVERSION << " but got 0x" << detector_shm()->shmversion << ")" << std::dec;
throw SharedMemoryError("Shared memory version mismatch (det)"); 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) { slsDetectorDefs::detectorType slsDetector::getDetectorTypeFromShm(int multi_id, bool verify) {
if (!detector_shm.IsExisting()) { if (!detector_shm.IsExisting()) {
FILE_LOG(logERROR) << "Shared memory " << detector_shm.GetName() << " does not exist.\n" 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."); throw SharedMemoryError("Corrupted multi shared memory.");
} }
@ -542,7 +549,7 @@ slsDetectorDefs::detectorType slsDetector::getDetectorTypeFromShm(int multi_id,
FILE_LOG(logERROR) << "Single shared memory " FILE_LOG(logERROR) << "Single shared memory "
"(" "("
<< multi_id << "-" << detId << ":)version mismatch " << multi_id << "-" << detId << ":)version mismatch "
"(expected 0x" "(expected 0x"
<< std::hex << SLS_SHMVERSION << " but got 0x" << detector_shm()->shmversion << ")" << std::dec; << std::hex << SLS_SHMVERSION << " but got 0x" << detector_shm()->shmversion << ")" << std::dec;
// unmap and throw // unmap and throw
detector_shm.UnmapSharedMemory(); detector_shm.UnmapSharedMemory();
@ -621,7 +628,7 @@ int slsDetector::setDetectorType(detectorType const type) {
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
receiver.close(); //need to find a better solution 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) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
return detector_shm()->receiverTCPPort; return detector_shm()->receiverTCPPort;
} }
int slsDetector::getReceiverPort() const{ int slsDetector::getReceiverPort() const {
return detector_shm()->receiverTCPPort; return detector_shm()->receiverTCPPort;
} }
@ -847,7 +854,6 @@ int slsDetector::getStopPort() const {
return detector_shm()->stopPort; return detector_shm()->stopPort;
} }
int slsDetector::lockServer(int lock) { int slsDetector::lockServer(int lock) {
int fnum = F_LOCK_SERVER; int fnum = F_LOCK_SERVER;
int ret = FAIL; int ret = FAIL;
@ -1395,8 +1401,6 @@ int slsDetector::setThresholdEnergyAndSettings(int e_eV, detectorSettings isetti
// myMod = createModule(); // myMod = createModule();
// myMod->iodelay = myMod1->iodelay; // myMod->iodelay = myMod1->iodelay;
//interpolate module //interpolate module
myMod = interpolateTrim(myMod1, myMod2, e_eV, trim1, trim2, tb); myMod = interpolateTrim(myMod1, myMod2, e_eV, trim1, trim2, tb);
if (myMod == nullptr) { if (myMod == nullptr) {
@ -1912,7 +1916,7 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t) {
} }
} else if (ret == FORCE_UPDATE) { } else if (ret == FORCE_UPDATE) {
receiver.close(); receiver.close();
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
break; break;
@ -2045,7 +2049,7 @@ int slsDetector::setDynamicRange(int n) {
FILE_LOG(logDEBUG1) << "Receiver Dynamic range: " << retval; FILE_LOG(logDEBUG1) << "Receiver Dynamic range: " << retval;
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
receiver.close(); receiver.close();
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
} }
} }
@ -2205,7 +2209,7 @@ int slsDetector::setReadOutFlags(readOutFlags flag) {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
} }
@ -2541,7 +2545,7 @@ void slsDetector::setReceiverStreamingPort(int port) {
} }
} }
if (ret == FORCE_UPDATE) { 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); sls::strcpy_safe(detector_shm()->receiver_zmqip, retvals);
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
receiver.close(); receiver.close();
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
} }
} }
@ -2673,7 +2677,7 @@ std::string slsDetector::setAdditionalJsonHeader(const std::string &jsonheader)
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
return std::string(detector_shm()->receiver_additionalJsonHeader); return std::string(detector_shm()->receiver_additionalJsonHeader);
} }
@ -2696,7 +2700,7 @@ std::string slsDetector::getAdditionalJsonHeader() {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
return std::string(detector_shm()->receiver_additionalJsonHeader); return std::string(detector_shm()->receiver_additionalJsonHeader);
} }
@ -2798,7 +2802,7 @@ int64_t slsDetector::setReceiverUDPSocketBufferSize(int64_t udpsockbufsize) {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
return retval; return retval;
} }
@ -2824,7 +2828,7 @@ int64_t slsDetector::getReceiverRealUDPSocketBufferSize() {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
return retval; return retval;
} }
@ -2879,7 +2883,7 @@ int slsDetector::setUDPConnection() {
sls::strcpy_safe(detector_shm()->receiverUDPMAC, retvals); sls::strcpy_safe(detector_shm()->receiverUDPMAC, retvals);
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
receiver.close(); receiver.close();
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
//configure detector with udp details //configure detector with udp details
@ -3190,7 +3194,7 @@ int slsDetector::sendROI(int n, ROI roiLimits[]) {
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
} }
return ret; return ret;
@ -3255,7 +3259,7 @@ int slsDetector::activate(int const enable) {
setErrorMask((getErrorMask()) | (RECEIVER_ACTIVATE)); setErrorMask((getErrorMask()) | (RECEIVER_ACTIVATE));
} else if (ret == FORCE_UPDATE) { } else if (ret == FORCE_UPDATE) {
receiver.close(); receiver.close();
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
} }
return detector_shm()->activated; return detector_shm()->activated;
@ -3280,7 +3284,7 @@ int slsDetector::setDeactivatedRxrPaddingMode(int padding) {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
return detector_shm()->receiver_deactivatedPaddingEnable; return detector_shm()->receiver_deactivatedPaddingEnable;
} }
@ -3320,7 +3324,7 @@ int slsDetector::setFlippedData(dimension d, int value) {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
return detector_shm()->flippedData[d]; return detector_shm()->flippedData[d];
} }
@ -3378,7 +3382,7 @@ int slsDetector::enableGapPixels(int val) {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
} }
return detector_shm()->gappixels; return detector_shm()->gappixels;
@ -4075,7 +4079,7 @@ int slsDetector::lockReceiver(int lock) {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
return retval; return retval;
} }
@ -4097,7 +4101,7 @@ std::string slsDetector::getReceiverLastClientIP() {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
return retval; return retval;
} }
@ -4138,105 +4142,107 @@ int slsDetector::execReceiverCommand(const std::string &cmd) {
return ret; return ret;
} }
int slsDetector::updateReceiverNoWait(sls::ClientSocket &receiver) { int slsDetector::updateCachedReceiverVariables() const {
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 fnum = F_UPDATE_RECEIVER_CLIENT; int fnum = F_UPDATE_RECEIVER_CLIENT;
int ret = FAIL; int ret = FAIL;
FILE_LOG(logDEBUG1) << "Sending update client to receiver server"; FILE_LOG(logDEBUG1) << "Sending update client to receiver server";
if (detector_shm()->receiverOnlineFlag == ONLINE_FLAG) { 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); ret = receiver.sendCommandThenRead(fnum, nullptr, 0, nullptr, 0);
if (ret == FAIL) { 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 { } 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; return ret;
@ -4260,7 +4266,7 @@ void slsDetector::sendMultiDetectorSize() {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
} }
@ -4282,7 +4288,7 @@ void slsDetector::setDetectorId() {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
} }
@ -4305,7 +4311,7 @@ void slsDetector::setDetectorHostname() {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
} }
@ -4339,7 +4345,7 @@ std::string slsDetector::setFilePath(const std::string &path) {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
} }
return detector_shm()->receiver_filePath; return detector_shm()->receiver_filePath;
@ -4370,7 +4376,7 @@ std::string slsDetector::setFileName(const std::string &fname) {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
} }
return detector_shm()->receiver_fileName; return detector_shm()->receiver_fileName;
@ -4397,7 +4403,7 @@ int slsDetector::setReceiverFramesPerFile(int f) {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
} }
return detector_shm()->receiver_framesPerFile; return detector_shm()->receiver_framesPerFile;
@ -4421,7 +4427,7 @@ slsDetectorDefs::frameDiscardPolicy slsDetector::setReceiverFramesDiscardPolicy(
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
return detector_shm()->receiver_frameDiscardMode; return detector_shm()->receiver_frameDiscardMode;
} }
@ -4446,7 +4452,7 @@ int slsDetector::setReceiverPartialFramesPadding(int f) {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
return detector_shm()->receiver_framePadding; return detector_shm()->receiver_framePadding;
} }
@ -4472,7 +4478,7 @@ slsDetectorDefs::fileFormat slsDetector::setFileFormat(fileFormat f) {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
} }
return getFileFormat(); return getFileFormat();
@ -4507,7 +4513,7 @@ int slsDetector::setFileIndex(int i) {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
updateReceiver(); updateCachedReceiverVariables();
} }
} }
return detector_shm()->receiver_fileIndex; return detector_shm()->receiver_fileIndex;
@ -4543,7 +4549,7 @@ int slsDetector::startReceiver() {
// } // }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
updateReceiver(); updateCachedReceiverVariables();
} }
return ret; return ret;
} }
@ -4562,7 +4568,7 @@ int slsDetector::stopReceiver() {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
return ret; return ret;
} }
@ -4585,7 +4591,7 @@ slsDetectorDefs::runStatus slsDetector::getReceiverStatus() {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
updateReceiver(); //Do we need to handle this ret? updateCachedReceiverVariables(); //Do we need to handle this ret?
} }
return retval; return retval;
} }
@ -4606,7 +4612,7 @@ int slsDetector::getFramesCaughtByReceiver() {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
updateReceiver(); updateCachedReceiverVariables();
} }
return retval; return retval;
} }
@ -4626,7 +4632,7 @@ int slsDetector::getReceiverCurrentFrameIndex() {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
updateReceiver(); updateCachedReceiverVariables();
} }
return retval; return retval;
} }
@ -4644,7 +4650,7 @@ int slsDetector::resetFramesCaught() {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
updateReceiver(); updateCachedReceiverVariables();
} }
return ret; return ret;
} }
@ -4667,7 +4673,7 @@ int slsDetector::enableWriteToFile(int enable) {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
} }
return detector_shm()->receiver_fileWriteEnable; return detector_shm()->receiver_fileWriteEnable;
@ -4692,7 +4698,7 @@ int slsDetector::overwriteFile(int enable) {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
} }
return detector_shm()->receiver_overWriteEnable; return detector_shm()->receiver_overWriteEnable;
@ -4717,7 +4723,7 @@ int slsDetector::setReceiverStreamingFrequency(int freq) {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
} }
return detector_shm()->receiver_read_freq; return detector_shm()->receiver_read_freq;
@ -4740,7 +4746,7 @@ int slsDetector::setReceiverStreamingTimer(int time_in_ms) {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
return retval; return retval;
} }
@ -4764,7 +4770,7 @@ int slsDetector::enableDataStreamingFromReceiver(int enable) {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
} }
return detector_shm()->receiver_upstream; return detector_shm()->receiver_upstream;
@ -4809,7 +4815,7 @@ int slsDetector::enableTenGigabitEthernet(int i) {
FILE_LOG(logDEBUG1) << "Receiver 10Gbe enable: " << retval; FILE_LOG(logDEBUG1) << "Receiver 10Gbe enable: " << retval;
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
receiver.close(); receiver.close();
updateReceiver(); updateCachedReceiverVariables();
} }
} }
} }
@ -4835,7 +4841,7 @@ int slsDetector::setReceiverFifoDepth(int i) {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
updateReceiver(); updateCachedReceiverVariables();
} }
return retval; return retval;
} }
@ -4860,7 +4866,7 @@ int slsDetector::setReceiverSilentMode(int i) {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
return detector_shm()->receiver_silentMode; return detector_shm()->receiver_silentMode;
} }
@ -4880,7 +4886,7 @@ int slsDetector::restreamStopFromReceiver() {
} }
} }
if (ret == FORCE_UPDATE) { if (ret == FORCE_UPDATE) {
ret = updateReceiver(); ret = updateCachedReceiverVariables();
} }
return ret; return ret;
} }

View File

@ -295,6 +295,9 @@ class slsDetector : public virtual slsDetectorDefs, public virtual errorDefs {
*/ */
int64_t getId(idMode mode); int64_t getId(idMode mode);
int64_t getReceiverSoftwareVersion() const;
/** /**
* Free shared memory without creating objects * Free shared memory without creating objects
* If this is called, must take care to update * 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 updates the shared memory receiving the data from the detector (without asking and closing the connection
/returns OK /returns OK
*/ */
int updateReceiverNoWait(sls::ClientSocket &receiver); // int updateReceiverNoWait(sls::ClientSocket &receiver);
/** /**
* Updates the shared memory receiving the data from the detector * Updates the shared memory receiving the data from the detector
* @returns OK or FAIL * @returns OK or FAIL
*/ */
int updateReceiver(); int updateCachedReceiverVariables() const;
/** /**
* Send the multi detector size to the detector * Send the multi detector size to the detector
@ -1736,7 +1739,7 @@ class slsDetector : public virtual slsDetectorDefs, public virtual errorDefs {
const int detId; const int detId;
/** Shared Memory object */ /** Shared Memory object */
sls::SharedMemory<sharedSlsDetector> detector_shm{0,0}; mutable sls::SharedMemory<sharedSlsDetector> detector_shm{0,0};
}; };

View File

@ -3465,7 +3465,7 @@ std::string slsDetectorCommand::cmdSN(int narg, char *args[], int action, int de
return helpSN(action); return helpSN(action);
if (cmd == "thisversion") { if (cmd == "thisversion") {
int64_t retval = myDet->getId(THIS_SOFTWARE_VERSION, detPos); int64_t retval = myDet->getClientSoftwareVersion();
if (retval < 0) if (retval < 0)
sprintf(answer, "%d", -1); sprintf(answer, "%d", -1);
else else
@ -3504,7 +3504,7 @@ std::string slsDetectorCommand::cmdSN(int narg, char *args[], int action, int de
if (cmd == "receiverversion") { if (cmd == "receiverversion") {
myDet->setReceiverOnline(ONLINE_FLAG, detPos); myDet->setReceiverOnline(ONLINE_FLAG, detPos);
int64_t retval = myDet->getId(RECEIVER_VERSION, detPos); int64_t retval = myDet->getReceiverSoftwareVersion(detPos);
if (retval < 0) if (retval < 0)
sprintf(answer, "%d", -1); sprintf(answer, "%d", -1);
else else

View File

@ -66,8 +66,8 @@ int64_t slsDetectorUsers::getDetectorSoftwareVersion(int detPos){
return detector.getId(slsDetectorDefs::DETECTOR_SOFTWARE_VERSION, detPos); return detector.getId(slsDetectorDefs::DETECTOR_SOFTWARE_VERSION, detPos);
} }
int64_t slsDetectorUsers::getClientSoftwareVersion(int detPos){ int64_t slsDetectorUsers::getClientSoftwareVersion(){
return detector.getId(slsDetectorDefs::THIS_SOFTWARE_VERSION, detPos); return detector.getClientSoftwareVersion();
} }
int64_t slsDetectorUsers::getReceiverSoftwareVersion(int detPos){ int64_t slsDetectorUsers::getReceiverSoftwareVersion(int detPos){

View File

@ -199,10 +199,9 @@ public:
/** /**
* (previously getThisSoftwareVersion) * (previously getThisSoftwareVersion)
* Get client software version * Get client software version
* @param detPos -1 for all detectors in list or specific detector position
* @returns client software version * @returns client software version
*/ */
int64_t getClientSoftwareVersion(int detPos = -1); int64_t getClientSoftwareVersion();
/** /**
* Get receiver software version * Get receiver software version

View File

@ -36,6 +36,11 @@ public:
}; };
struct NotImplementedError : public RuntimeError {
public:
NotImplementedError(std::string msg):RuntimeError(msg) {}
};
} }