diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_refactor b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_refactor index 309c2a2b5..74a53b486 100755 Binary files a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_refactor and b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_refactor differ diff --git a/slsDetectorServers/eigerDetectorServer/gitInfo.txt b/slsDetectorServers/eigerDetectorServer/gitInfo.txt index 71e6197f5..4a092bf1d 100644 --- a/slsDetectorServers/eigerDetectorServer/gitInfo.txt +++ b/slsDetectorServers/eigerDetectorServer/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorPackage/slsDetectorServers/eigerDetectorServer URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: 9d9251293d1a0b5300b8d7191949cf01de1c7b81 -Revision: 21 +Repsitory UUID: 031a11c4f7b25e8c14532976731aebdc0bb56fe7 +Revision: 23 Branch: refactor Last Changed Author: Dhanya_Thattil -Last Changed Rev: 4255 -Last Changed Date: 2019-01-15 10:22:16.000000002 +0100 ./xparameters.h +Last Changed Rev: 4307 +Last Changed Date: 2019-02-11 14:53:03.000000002 +0100 ./xparameters.h diff --git a/slsDetectorServers/eigerDetectorServer/gitInfoEiger.h b/slsDetectorServers/eigerDetectorServer/gitInfoEiger.h index 2ec106b03..fbdd58206 100644 --- a/slsDetectorServers/eigerDetectorServer/gitInfoEiger.h +++ b/slsDetectorServers/eigerDetectorServer/gitInfoEiger.h @@ -1,6 +1,6 @@ #define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "9d9251293d1a0b5300b8d7191949cf01de1c7b81" +#define GITREPUUID "031a11c4f7b25e8c14532976731aebdc0bb56fe7" #define GITAUTH "Dhanya_Thattil" -#define GITREV 0x4255 -#define GITDATE 0x20190115 +#define GITREV 0x4307 +#define GITDATE 0x20190211 #define GITBRANCH "refactor" diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c index 5eae05cb0..39e03d718 100755 --- a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c @@ -1359,7 +1359,9 @@ int start_acquisition(int file_des) { FILE_LOG(logDEBUG1, ("Starting Acquisition\n")); // only set if (Server_VerifyLock() == OK) { +#if defined(CHIPTESTBOARDD) || defined(MOENCHD) nframes = 0; +#endif ret = startStateMachine(); if (ret == FAIL) { sprintf(mess, "Could not start acquisition\n"); @@ -1444,7 +1446,9 @@ int start_and_read_all(int file_des) { FILE_LOG(logDEBUG1, ("Stopping Acquisition\n")); // only set if (Server_VerifyLock() == OK) { +#if defined(CHIPTESTBOARDD) || defined(MOENCHD) nframes = 0; +#endif ret = startStateMachine(); if (ret == FAIL) { sprintf(mess, "Could not start acquisition\n"); @@ -2505,14 +2509,15 @@ int set_ctb_pattern(int file_des) { uint64_t args[2] = {-1, -1}; if (receiveData(file_des, args, sizeof(args), INT64) < 0) return printSocketReadError(); - int addr = (int)args[0]; - uint64_t word = args[1]; int64_t retval64 = -1; #if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) functionNotImplemented(); return Server_SendResult(file_des, INT32, UPDATE, NULL, 0); #else + int addr = (int)args[0]; + uint64_t word = args[1]; + if ((word == -1) || (Server_VerifyLock() == OK)) { // address for set word should be valid (if not -1 or -2, it goes to setword) @@ -2558,16 +2563,17 @@ int set_ctb_pattern(int file_des) { uint64_t args[4] = {-1, -1, -1, -1}; if (receiveData(file_des, args, sizeof(args), INT64) < 0) return printSocketReadError(); - int loopLevel = (int)args[0]; - int startAddr = (int)args[1]; - int stopAddr = (int)args[2]; - int numLoops = (int)args[3]; int retvals[3] = {-1, -1, -1}; #if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) functionNotImplemented(); return Server_SendResult(file_des, INT32, UPDATE, NULL, 0); #else + int loopLevel = (int)args[0]; + int startAddr = (int)args[1]; + int stopAddr = (int)args[2]; + int numLoops = (int)args[3]; + if (loopLevel < -1 || loopLevel > 2) { // -1 complete pattern ret = FAIL; sprintf(mess, "Pattern (Pattern Loop) Level (%d) is not implemented for this detector\n", loopLevel); @@ -2610,14 +2616,15 @@ int set_ctb_pattern(int file_des) { uint64_t args[2] = {-1, -1}; if (receiveData(file_des, args, sizeof(args), INT64) < 0) return printSocketReadError(); - int loopLevel = (int)args[0]; - int addr = (int)args[1]; int retval32 = -1; #if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) functionNotImplemented(); return Server_SendResult(file_des, INT32, UPDATE, NULL, 0); #else + int loopLevel = (int)args[0]; + int addr = (int)args[1]; + if ((addr == -1) || (Server_VerifyLock() == OK)) { if (loopLevel < 0 || loopLevel > 2) { ret = FAIL; @@ -2651,14 +2658,15 @@ int set_ctb_pattern(int file_des) { uint64_t args[2] = {-1, -1}; if (receiveData(file_des, args, sizeof(args), INT64) < 0) return printSocketReadError(); - int loopLevel = (int)args[1]; - uint64_t timeval = (int)args[2]; int64_t retval64 = -1; #if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) functionNotImplemented(); return Server_SendResult(file_des, INT32, UPDATE, NULL, 0); #else + int loopLevel = (int)args[1]; + uint64_t timeval = (int)args[2]; + if ((timeval == -1) || (Server_VerifyLock() == OK)) { if (loopLevel < 0 || loopLevel > 2) { ret = FAIL; diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index f8eb13484..1eb58798f 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -1934,6 +1934,29 @@ std::string multiSlsDetector::getAdditionalJsonHeader(int detPos) { return sls::concatenateIfDifferent(r); } +std::string multiSlsDetector::setAdditionalJsonParameter(const std::string& key, const std::string& value, int detPos) { + // single + if (detPos >= 0) { + return detectors[detPos]->setAdditionalJsonParameter(key, value); + } + + // multi + auto r = parallelCall(&slsDetector::setAdditionalJsonParameter, key, value); + return sls::concatenateIfDifferent(r); +} + +std::string multiSlsDetector::getAdditionalJsonParameter(const std::string& key, int detPos) { + // single + if (detPos >= 0) { + return detectors[detPos]->getAdditionalJsonParameter(key); + } + + // multi + auto r = serialCall(&slsDetector::getAdditionalJsonParameter, key); + return sls::concatenateIfDifferent(r); +} + + int multiSlsDetector::setReceiverUDPSocketBufferSize(int udpsockbufsize, int detPos) { // single if (detPos >= 0) { diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index 836de2513..fc17bcc50 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -1057,17 +1057,36 @@ class multiSlsDetector : public virtual slsDetectorDefs, * Sets the additional json header * @param jsonheader additional json header * @param detPos -1 for all detectors in list or specific detector position - * @returns additional json header, returns "none" if default setting and no custom ip set + * @returns additional json header, default is empty */ std::string setAdditionalJsonHeader(const std::string& jsonheader, int detPos = -1); /** * Returns the additional json header * @param detPos -1 for all detectors in list or specific detector position - * @returns the additional json header, returns "none" if default setting and no custom ip set + * @returns the additional json header, default is empty */ std::string getAdditionalJsonHeader(int detPos = -1); + /** + * Sets the value for the additional json header parameter if found, else append it + * @param key additional json header parameter + * @param value additional json header parameter value (cannot be empty) + * @param detPos -1 for all detectors in list or specific detector position + * @returns the additional json header parameter value, + * empty if no parameter found in additional json header + */ + std::string setAdditionalJsonParameter(const std::string& key, const std::string& value, int detPos = -1); + + /** + * Returns the additional json header parameter value + * @param key additional json header parameter + * @param detPos -1 for all detectors in list or specific detector position + * @returns the additional json header parameter value, + * empty if no parameter found in additional json header + */ + std::string getAdditionalJsonParameter(const std::string& key, int detPos = -1); + /** * Sets the receiver UDP socket buffer size * @param udpsockbufsize additional json header diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 671baf540..ba027d9b9 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -310,7 +310,7 @@ void slsDetector::setDetectorSpecificParameters(detectorType type, detParameterL list.nGappixelsY = 1; break; default: - FILE_LOG(logERROR) << "Unknown detector type!"; + FILE_LOG(logERROR) << "Unknown detector type! " << type; throw std::exception(); } } @@ -2625,7 +2625,7 @@ std::string slsDetector::setAdditionalJsonHeader(const std::string &jsonheader) sls::strcpy_safe(args, jsonheader.c_str()); FILE_LOG(logDEBUG1) << "Sending additional json header " << args; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { + if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { auto receiver = sls::ClientSocket(thisDetector->receiver_hostname, thisDetector->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, args, sizeof(args), retvals, sizeof(retvals)); if (ret == FAIL) { @@ -2646,6 +2646,65 @@ std::string slsDetector::getAdditionalJsonHeader() { return std::string(thisDetector->receiver_additionalJsonHeader); } +std::string slsDetector::setAdditionalJsonParameter(const std::string& key, const std::string& value) { + + // validation (ignore if key or value has , : ") + if (key.find_first_of(",\":") != std::string::npos || value.find_first_of(",\":") != std::string::npos) { + FILE_LOG(logERROR) << "Could not set additional json header parameter as the key or value has illegal characters (,\":)"; + return getAdditionalJsonParameter(key); + } + + std::string header(thisDetector->receiver_additionalJsonHeader); + size_t keyPos = header.find(std::string("\"") + key + std::string("\":") ); + + // if key found, replace value + if (keyPos != std::string::npos) { + size_t valuePosStart = header.find (std::string(":\""), keyPos) + 2; + size_t valuePosEnd = header.find (std::string("\""), valuePosStart) - 1; + header.replace(valuePosStart, valuePosEnd - valuePosStart + 1, value); + } + + // key not found, append key value pair + else { + if (header.length()) { + header.append(","); + } + // put it in formula \"key\":\"value\" + header.append(std::string("\"") + key + std::string("\"") + std::string(":") + + std::string("\"") + value + std::string("\"")); + } + + // update additional json header + setAdditionalJsonHeader(header); + return getAdditionalJsonParameter(key); +} + +std::string slsDetector::getAdditionalJsonParameter(const std::string& key) { + // additional json header is empty + if (!strlen(thisDetector->receiver_additionalJsonHeader)) + return std::string(""); + + // add quotations before and after the key value + std::string keyLiteral = key; + keyLiteral.insert(0, "\""); + keyLiteral.append("\""); + + // loop through the parameters + for (const auto ¶meter : sls::split(thisDetector->receiver_additionalJsonHeader, ',')) { + // get a vector of key value pair for each parameter + const auto &pairs = sls::split(parameter, ':'); + // match for key + if (pairs[0] == keyLiteral) { + // return value without quotations + return pairs[1].substr(1, pairs[1].length() - 2); + } + } + + // return empty string as no match found with key + return std::string(""); + +} + int slsDetector::setReceiverUDPSocketBufferSize(int udpsockbufsize) { int fnum = F_RECEIVER_UDP_SOCK_BUF_SIZE; int ret = FAIL; diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index e3d744cea..0ba9c9562 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -977,6 +977,23 @@ public: */ std::string getAdditionalJsonHeader(); + /** + * Sets the value for the additional json header parameter if found, else append it + * @param key additional json header parameter + * @param value additional json header parameter value (cannot be empty) + * @returns the additional json header parameter value, + * empty if no parameter found in additional json header + */ + std::string setAdditionalJsonParameter(const std::string& key, const std::string& value); + + /** + * Returns the additional json header parameter value + * @param key additional json header parameter + * @returns the additional json header parameter value, + * empty if no parameter found in additional json header + */ + std::string getAdditionalJsonParameter(const std::string& key); + /** * Sets the receiver UDP socket buffer size * @param udpsockbufsize additional json header diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index bb1aaacbe..4ddf452c6 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -1640,6 +1640,13 @@ slsDetectorCommand::slsDetectorCommand(multiSlsDetector *det) { descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdNetworkParameter; i++; + /*! \page network + - rx_jsonpara [k] [v] sets/gets value v for additional json header parameter k to be streamed out with the zmq from receiver. If empty, then no parameter found Use only if it needs to be processed by an intermediate process. \c Returns \c (string) + */ + descrToFuncMap[i].m_pFuncName = "rx_jsonpara"; // + descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdNetworkParameter; + i++; + /*! \page network - configuremac [i] configures the MAC of the detector with these parameters: detectorip, detectormac, rx_udpip, rx_udpmac, rx_udpport, rx_udpport2 (if applicable). This command is already included in \c rx_hsotname. Only put!. \c Returns \c (int) */ @@ -2844,6 +2851,11 @@ std::string slsDetectorCommand::cmdNetworkParameter(int narg, char *args[], int myDet->setAdditionalJsonHeader(args[1], detPos); } return myDet->getAdditionalJsonHeader(detPos); + } else if (cmd == "rx_jsonpara") { + if (action == PUT_ACTION) { + myDet->setAdditionalJsonParameter(args[1], args[2], detPos); + } + return myDet->getAdditionalJsonParameter(args[1]); } return ("unknown network parameter") + cmd; @@ -2884,6 +2896,7 @@ std::string slsDetectorCommand::helpNetworkParameter(int action) { "out with the zmq from receiver. Default is empty. t must be in the format '\"label1\":\"value1\",\"label2\":\"value2\"' etc." "Use only if it needs to be processed by an intermediate process." << std::endl; + os << "rx_jsonpara [k v]\n sets value to v for additional json header parameter k to be streamed out with the zmq from receiver. Use only if it needs to be processed by an intermediate process." << std::endl; os << "rx_udpsocksize [t]\n sets the UDP socket buffer size. Different defaults for Jungfrau. " "Does not remember in client shared memory, " "so must be initialized each time after setting receiver " @@ -2908,6 +2921,7 @@ std::string slsDetectorCommand::helpNetworkParameter(int action) { os << "rx_jsonaddheader \n gets additional json header to be streamed " "out with the zmq from receiver." << std::endl; + os << "rx_jsonpara [k] \n gets value of additional json header parameter k to be streamed out with the zmq from receiver. If empty, then no parameter found. Use only if it needs to be processed by an intermediate process." << std::endl; os << "rx_udpsocksize \n gets the UDP socket buffer size." << std::endl; os << "rx_realudpsocksize \n gets the actual UDP socket buffer size. Usually double the set udp socket buffer size due to kernel bookkeeping." << std::endl; }