diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index a46542c7d..6d5ea088f 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -29,8 +29,9 @@ using sls::SharedMemory; using sls::SharedMemoryError; -multiSlsDetector::multiSlsDetector(int id, bool verify, bool update) - : detId(id) { +multiSlsDetector::multiSlsDetector(int multi_id, bool verify, bool update) + : multiId(multi_id), + multi_shm(multi_id, -1) { setupMultiDetector(verify, update); } @@ -302,20 +303,15 @@ std::string multiSlsDetector::getUserDetails() { return sstream.str(); } -/* - * pre: multi_shm=0, multi_shm() = 0, detectors.size() = 0 - */ void multiSlsDetector::initSharedMemory(bool verify) { - multi_shm = SharedMemory(detId, -1); if (!multi_shm.IsExisting()) { multi_shm.CreateSharedMemory(); initializeDetectorStructure(); - } - else { + } else { multi_shm.OpenSharedMemory(); if (verify && multi_shm()->shmversion != MULTI_SHMVERSION) { - FILE_LOG(logERROR) << "Multi shared memory (" << detId << ") version mismatch " - "(expected 0x" + FILE_LOG(logERROR) << "Multi shared memory (" << multiId << ") version mismatch " + "(expected 0x" << std::hex << MULTI_SHMVERSION << " but got 0x" << multi_shm()->shmversion << std::dec; throw SharedMemoryError("Shared memory version mismatch!"); } @@ -355,7 +351,7 @@ void multiSlsDetector::initializeMembers(bool verify) { for (int i = 0; i < multi_shm()->numberOfDetectors; i++) { try { detectors.push_back( - sls::make_unique(detId, i, verify)); + sls::make_unique(multiId, i, verify)); } catch (...) { detectors.clear(); throw; @@ -463,7 +459,7 @@ void multiSlsDetector::addSlsDetector(const std::string &hostname) { } int pos = (int)detectors.size(); - detectors.push_back(sls::make_unique(type, detId, pos, false)); + detectors.push_back(sls::make_unique(type, multiId, pos, false)); multi_shm()->numberOfDetectors = detectors.size(); multi_shm()->dataBytes += detectors[pos]->getDataBytes(); multi_shm()->dataBytesInclGapPixels += diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index 7162d1098..903b81dba 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -120,7 +120,7 @@ class multiSlsDetector : public virtual slsDetectorDefs, * one * @param update true to update last user pid, date etc */ - explicit multiSlsDetector(int id = 0, bool verify = true, bool update = true); + explicit multiSlsDetector(int multi_id = 0, bool verify = true, bool update = true); /** * Destructor @@ -1956,7 +1956,7 @@ class multiSlsDetector : public virtual slsDetectorDefs, int kbhit(); /** Multi detector Id */ - int detId; + const int multiId; /** Shared Memory object */ sls::SharedMemory multi_shm{0, -1}; diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index afd0df94a..ae462ac40 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -22,39 +23,39 @@ #include #include #include -#include +using sls::RuntimeError; using sls::SharedMemory; using sls::SharedMemoryError; -using sls::RuntimeError; #define DEFAULT_HOSTNAME "localhost" -slsDetector::slsDetector(detectorType type, int multiId, int id, bool verify) - : detId(id) { +slsDetector::slsDetector(detectorType type, int multi_id, int det_id, bool verify) + : detId(det_id), + detector_shm(multi_id, det_id) { /* called from put hostname command, * so sls shared memory will be created */ // ensure shared memory was not created before - SharedMemory shm(multiId, id); - if (shm.IsExisting()) { + if (detector_shm.IsExisting()) { FILE_LOG(logWARNING) << "This shared memory should have been " "deleted before! " - << shm.GetName() << ". Freeing it again"; - freeSharedMemory(multiId, id); + << detector_shm.GetName() << ". Freeing it again"; + freeSharedMemory(multi_id, det_id); } - initSharedMemory(type, multiId, verify); + initSharedMemory(type, multi_id, verify); } -slsDetector::slsDetector(int multiId, int id, bool verify) - : detId(id) { +slsDetector::slsDetector(int multi_id, int det_id, bool verify) + : detId(det_id), + detector_shm(multi_id, det_id) { /* called from multi constructor to populate structure, * so sls shared memory will be opened, not created */ // getDetectorType From shm will check if it was already existing - detectorType type = getDetectorTypeFromShm(multiId, verify); - initSharedMemory(type, multiId, verify); + detectorType type = getDetectorTypeFromShm(multi_id, verify); + initSharedMemory(type, multi_id, verify); } slsDetector::~slsDetector() = default; @@ -196,8 +197,8 @@ int64_t slsDetector::getId(idMode mode) { } } -void slsDetector::freeSharedMemory(int multiId, int slsId) { - SharedMemory shm(multiId, slsId); +void slsDetector::freeSharedMemory(int multi_id, int slsId) { + SharedMemory shm(multi_id, slsId); if (shm.IsExisting()) { shm.RemoveSharedMemory(); } @@ -219,10 +220,10 @@ std::string slsDetector::getHostname() { } void slsDetector::initSharedMemory(detectorType type, - int multiId, + int multi_id, bool verify) { - detector_shm = SharedMemory(multiId, detId); + detector_shm = SharedMemory(multi_id, detId); if (!detector_shm.IsExisting()) { detector_shm.CreateSharedMemory(); initializeDetectorStructure(type); @@ -231,9 +232,9 @@ void slsDetector::initSharedMemory(detectorType type, if (verify && detector_shm()->shmversion != SLS_SHMVERSION) { FILE_LOG(logERROR) << "Single shared memory " "(" - << multiId << "-" << detId << ":) " - "version mismatch " - "(expected 0x" + << multi_id << "-" << detId << ":) " + "version mismatch " + "(expected 0x" << std::hex << SLS_SHMVERSION << " but got 0x" << detector_shm()->shmversion << ")" << std::dec; throw SharedMemoryError("Shared memory version mismatch (det)"); } @@ -423,7 +424,6 @@ void slsDetector::initializeDetectorStructure(detectorType type) { if (detector_shm()->myDetectorType == CHIPTESTBOARD || detector_shm()->myDetectorType == MOENCH) { updateTotalNumberOfChannels(); } - } slsDetectorDefs::sls_detector_module *slsDetector::createModule() { @@ -465,7 +465,7 @@ void slsDetector::connectDataError() { setErrorMask((getErrorMask()) | (CANNOT_CONNECT_TO_RECEIVER)); } -int slsDetector::sendModule(sls_detector_module *myMod, sls::ClientSocket& client) { +int slsDetector::sendModule(sls_detector_module *myMod, sls::ClientSocket &client) { TLogLevel level = logDEBUG1; FILE_LOG(level) << "Sending Module"; int ts = 0; @@ -514,7 +514,7 @@ int slsDetector::sendModule(sls_detector_module *myMod, sls::ClientSocket& clien return ts; } -int slsDetector::receiveModule(sls_detector_module *myMod, sls::ClientSocket& client) { +int slsDetector::receiveModule(sls_detector_module *myMod, sls::ClientSocket &client) { int ts = 0; ts += client.receiveData(&(myMod->serialnumber), sizeof(myMod->serialnumber)); ts += client.receiveData(&(myMod->nchan), sizeof(myMod->nchan)); @@ -537,28 +537,27 @@ int slsDetector::receiveModule(sls_detector_module *myMod, sls::ClientSocket& cl return ts; } -slsDetectorDefs::detectorType slsDetector::getDetectorTypeFromShm(int multiId, bool verify) { - SharedMemory shm(multiId, detId); - if (!shm.IsExisting()) { - FILE_LOG(logERROR) << "Shared memory " << shm.GetName() << " does not exist.\n" +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."; throw SharedMemoryError("Could not read detector type from shared memory"); } // open, map, verify version - shm.OpenSharedMemory(); + detector_shm.OpenSharedMemory(); - if (verify && shm()->shmversion != SLS_SHMVERSION) { + 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" << shm()->shmversion << ")" << std::dec; + << multi_id << "-" << detId << ":)version mismatch " + "(expected 0x" + << std::hex << SLS_SHMVERSION << " but got 0x" << detector_shm()->shmversion << ")" << std::dec; // unmap and throw detector_shm.UnmapSharedMemory(); throw SharedMemoryError("Shared memory version mismatch"); } - auto type = shm()->myDetectorType; + auto type = detector_shm()->myDetectorType; return type; } @@ -3877,13 +3876,13 @@ int slsDetector::getChanRegs(double *retval) { sls_detector_module *myMod = getModule(); 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); + //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; } @@ -4058,7 +4057,7 @@ std::string slsDetector::checkReceiverOnline() { auto receiver = sls::ClientSocket(true, detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort); detector_shm()->receiverOnlineFlag = ONLINE_FLAG; } catch (...) { - detector_shm()->receiverOnlineFlag = OFFLINE_FLAG; + detector_shm()->receiverOnlineFlag = OFFLINE_FLAG; retval = detector_shm()->receiver_hostname; } return retval; diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index 0b60ddba0..1e7cf8f1b 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -250,23 +250,23 @@ class slsDetector : public virtual slsDetectorDefs, public virtual errorDefs { /** * Constructor called when creating new shared memory * @param type detector type - * @param multiId multi detector shared memory id + * @param multi_id multi detector shared memory id * @param id sls detector id (position in detectors list) * @param verify true to verify if shared memory version matches existing one */ explicit slsDetector(detectorType type, - int multiId = 0, - int id = 0, + int multi_id = 0, + int det_id = 0, bool verify = true); /** * Constructor called when opening existing shared memory - * @param multiId multi detector shared memory id + * @param multi_id multi detector shared memory id * @param id sls detector id (position in detectors list) * @param verify true to verify if shared memory version matches existing one */ - explicit slsDetector(int multiId = 0, - int id = 0, + explicit slsDetector(int multi_id = 0, + int det_id = 0, bool verify = true); /** @@ -300,10 +300,10 @@ class slsDetector : public virtual slsDetectorDefs, public virtual errorDefs { * If this is called, must take care to update * multiSlsDetectors thisMultiDetector->numberofDetectors * avoiding creating the constructor classes and mapping - * @param multiId multi detector Id + * @param multi_id multi detector Id * @param slsId slsDetectorId or position of slsDetector in detectors list */ - static void freeSharedMemory(int multiId, int slsId); + static void freeSharedMemory(int multi_id, int slsId); /** * Free shared memory and delete shared memory structure @@ -1616,21 +1616,21 @@ class slsDetector : public virtual slsDetectorDefs, public virtual errorDefs { private: /** * Get Detector Type from Shared Memory (opening shm without verifying size) - * @param multiId multi detector Id + * @param multi_id multi detector Id * @param verify true to verify if shm size matches existing one * @returns detector type */ - detectorType getDetectorTypeFromShm(int multiId, bool verify = true); + detectorType getDetectorTypeFromShm(int multi_id, bool verify = true); /** * Initialize shared memory * @param created true if shared memory must be created, else false to open * @param type type of detector - * @param multiId multi detector Id + * @param multi_id multi detector Id * @param verify true to verify if shm size matches existing one * @returns true if the shared memory was created now */ - void initSharedMemory(detectorType type, int multiId, bool verify = true); + void initSharedMemory(detectorType type, int multi_id, bool verify = true); /** * Sets detector parameters depending detector type @@ -1733,7 +1733,7 @@ class slsDetector : public virtual slsDetectorDefs, public virtual errorDefs { int writeSettingsFile(const std::string &fname, sls_detector_module& mod); /** slsDetector Id or position in the detectors list */ - int detId; + const int detId; /** Shared Memory object */ sls::SharedMemory detector_shm{0,0}; diff --git a/slsSupportLib/src/ClientSocket.cpp b/slsSupportLib/src/ClientSocket.cpp index 58c8d0781..7fa36aeed 100644 --- a/slsSupportLib/src/ClientSocket.cpp +++ b/slsSupportLib/src/ClientSocket.cpp @@ -6,6 +6,8 @@ #include #include #include "sls_detector_defs.h" +#include "sls_detector_exceptions.h" +#include "logger.h" namespace sls { ClientSocket::ClientSocket(const bool isRx, const std::string &host, uint16_t port) : DataSocket(socket(AF_INET, SOCK_STREAM, 0)), isReceiver(isRx) { @@ -17,7 +19,8 @@ ClientSocket::ClientSocket(const bool isRx, const std::string &host, uint16_t po hints.ai_flags |= AI_CANONNAME; if (getaddrinfo(host.c_str(), NULL, &hints, &result) != 0) { - throw std::runtime_error("ClientSocket ERROR: cannot decode host\n"); + std::string msg = "ClientSocket ERROR: decode host:" + host + " on port " + std::to_string(port)+ "\n"; + throw std::runtime_error(msg); } //TODO! Erik, results could have multiple entries do we need to loop through them? @@ -29,7 +32,9 @@ ClientSocket::ClientSocket(const bool isRx, const std::string &host, uint16_t po if (::connect(getSocketId(), (struct sockaddr *)&serverAddr, sizeof(serverAddr)) != 0) { freeaddrinfo(result); - throw std::runtime_error("ClientSocket ERROR: cannot connect to host\n"); + std::string msg = "ClientSocket ERROR: cannot connect to host:" + host + " on port " + std::to_string(port)+ "\n"; + FILE_LOG(logERROR) << msg; + throw SocketError(msg); } freeaddrinfo(result); }