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;
}