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() {
//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;
}

View File

@ -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<int64_t> multiSlsDetector::getDetectorNumber() {
return parallelCall(&slsDetector::getId, slsDetectorDefs::DETECTOR_SERIAL_NUMBER);
}

View File

@ -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,6 +226,12 @@ class multiSlsDetector : public virtual slsDetectorDefs,
*/
int64_t getId(idMode mode, int detPos = -1);
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

View File

@ -24,6 +24,7 @@
#include <sys/stat.h>
#include <sys/types.h>
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,25 +153,17 @@ 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 {
//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) {
@ -185,7 +177,22 @@ int64_t slsDetector::getId(idMode mode){
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) {
@ -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,8 +4142,20 @@ int slsDetector::execReceiverCommand(const std::string &cmd) {
return ret;
}
int slsDetector::updateReceiverNoWait(sls::ClientSocket &receiver) {
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);
ret = receiver.sendCommandThenRead(fnum, nullptr, 0, nullptr, 0);
if (ret == FAIL) {
std::string msg = "Could not update receiver: " + std::string(detector_shm()->receiver_hostname);
throw RuntimeError(msg);
} else {
int n = 0, i32 = 0;
char cstring[MAX_STR_LENGTH] = {};
char lastClientIP[INET_ADDRSTRLEN] = {};
@ -4220,23 +4236,13 @@ int slsDetector::updateReceiverNoWait(sls::ClientSocket &receiver) {
detector_shm()->receiver_silentMode = i32;
if (!n) {
FILE_LOG(logERROR) << "Could not update receiver, received 0 bytes\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;
}
int slsDetector::updateReceiver() {
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);
ret = receiver.sendCommandThenRead(fnum, nullptr, 0, nullptr, 0);
if (ret == FAIL) {
setErrorMask((getErrorMask()) | (OTHER_ERROR_CODE));
} else {
updateReceiverNoWait(receiver);
}
}
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;
}

View File

@ -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<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);
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

View File

@ -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){

View File

@ -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

View File

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