diff --git a/RELEASE.txt b/RELEASE.txt index 22ade5651..7b216ffd1 100755 --- a/RELEASE.txt +++ b/RELEASE.txt @@ -89,6 +89,7 @@ This document describes the differences between v7.0.0 and v6.x.x - rx udp socket refactored (maybe resolves getting stuck?)remove check for eiger header and isntead checks for malformed packets for every detector - jungfrau sw trigger , blocking trigger -help should not create a new object +- jungfrau master - g2 parallel command 2. Resolved Issues diff --git a/python/slsdet/detector.py b/python/slsdet/detector.py index 37dbe7002..602dbc452 100755 --- a/python/slsdet/detector.py +++ b/python/slsdet/detector.py @@ -1479,8 +1479,8 @@ class Detector(CppDetectorApi): @element def master(self): """ - [Eiger][Gotthard2] Sets (half) module to master and other(s) to slaves.\n - [Gotthard][Gotthard2][Mythen3][Eiger] Gets if the current (half) module is master. + [Eiger][Gotthard2][Jungfrau] Sets (half) module to master and other(s) to slaves.\n + [Gotthard][Gotthard2][Mythen3][Eiger][Jungfrau] Gets if the current (half) module is master. """ return self.getMaster() diff --git a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c index 976ef486d..80868bbb5 100644 --- a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c @@ -2412,7 +2412,7 @@ int calculateDataBytes() { return dataBytes; } int getTotalNumberOfChannels() { int nchanx = 0, nchany = 0; - getTotalNumberOfChannels(&nchanx, &nchany); + getNumberOfChannels(&nchanx, &nchany); return nchanx * nchany; } diff --git a/slsDetectorServers/jungfrauDetectorServer/RegisterDefs.h b/slsDetectorServers/jungfrauDetectorServer/RegisterDefs.h index 8927b03d8..61e3b3b7b 100644 --- a/slsDetectorServers/jungfrauDetectorServer/RegisterDefs.h +++ b/slsDetectorServers/jungfrauDetectorServer/RegisterDefs.h @@ -228,6 +228,8 @@ #define CONTROL_DDR3_MEM_RST_MSK (0x00000001 << CONTROL_DDR3_MEM_RST_OFST) // only PHY, not DDR3 PLL ,Not used in software #define CONTROL_ACQ_FIFO_CLR_OFST (14) #define CONTROL_ACQ_FIFO_CLR_MSK (0x00000001 << CONTROL_ACQ_FIFO_CLR_OFST) +#define CONTROL_MASTER_OFST (15) +#define CONTROL_MASTER_MSK (0x00000001 << CONTROL_MASTER_OFST) #define CONTROL_STORAGE_CELL_NUM_OFST (16) #define CONTROL_STORAGE_CELL_NUM_MSK (0x0000000F << CONTROL_STORAGE_CELL_NUM_OFST) #define CONTROL_RX_ADDTNL_ENDPTS_NUM_OFST (20) diff --git a/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer b/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer index 9ea70f61a..d6c978eb0 100755 Binary files a/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer and b/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer differ diff --git a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c index e4351e5a4..679b47cb7 100644 --- a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c @@ -763,6 +763,15 @@ int readConfigFile() { setChipVersion(version); } + // other commands + else { + sprintf(initErrorMessage, + "Could not scan command from on-board server " + "config file. Line:[%s].\n", + line); + break; + } + memset(line, 0, LZ); } fclose(fd); @@ -1335,6 +1344,42 @@ int setHighVoltage(int val) { /* parameters - timing, extsig */ +int setMaster(enum MASTERINDEX m) { + char *master_names[] = {MASTER_NAMES}; + LOG(logINFOBLUE, ("Setting up as %s in (%s server)\n", master_names[m], + (isControlServer ? "control" : "stop"))); + int retval = -1; + switch (m) { + case OW_MASTER: + bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_MASTER_MSK); + isMaster(&retval); + if (retval != 1) { + LOG(logERROR, ("Could not set master\n")); + return FAIL; + } + break; + case OW_SLAVE: + bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_MASTER_MSK); + isMaster(&retval); + if (retval != 0) { + LOG(logERROR, ("Could not set slave\n")); + return FAIL; + } + break; + default: + LOG(logERROR, ("Cannot reset to hardware settings from client. Restart " + "detector server.\n")); + return FAIL; + } + return OK; +} + +int isMaster(int *retval) { + *retval = + ((bus_r(CONTROL_REG) & CONTROL_MASTER_MSK) >> CONTROL_MASTER_OFST); + return OK; +} + void setTiming(enum timingMode arg) { switch (arg) { case AUTO_TIMING: diff --git a/slsDetectorServers/jungfrauDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/jungfrauDetectorServer/slsDetectorServer_defs.h index 986717c6d..2e7e7a61a 100644 --- a/slsDetectorServers/jungfrauDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/jungfrauDetectorServer/slsDetectorServer_defs.h @@ -67,6 +67,9 @@ enum DACINDEX { 420 /* J_VREF_COMP */ \ }; +enum MASTERINDEX { MASTER_HARDWARE, OW_MASTER, OW_SLAVE }; +#define MASTER_NAMES "hardware", "master", "slave" + #define NUMSETTINGS (2) #define NSPECIALDACS (3) #define SPECIALDACINDEX {J_VREF_PRECH, J_VREF_DS, J_VREF_COMP}; diff --git a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c index 4d3a9df81..4c5862547 100644 --- a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c @@ -2043,7 +2043,7 @@ int calculateDataBytes() { return dataBytes; } int getTotalNumberOfChannels() { int nchanx = 0, nchany = 0; - getTotalNumberOfChannels(&nchanx, &nchany); + getNumberOfChannels(&nchanx, &nchany); return nchanx * nchany; } diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index c4af36d4f..2b254c854 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -385,7 +385,7 @@ int getADC(enum ADCINDEX ind); int setHighVoltage(int val); // parameters - timing, extsig -#if defined(EIGERD) || defined(GOTTHARD2D) +#if defined(EIGERD) || defined(GOTTHARD2D) || defined(JUNGFRAUD) int setMaster(enum MASTERINDEX m); #endif #ifdef EIGERD @@ -393,7 +393,7 @@ int setTop(enum TOPINDEX t); int isTop(int *retval); #endif #if defined(MYTHEN3D) || defined(EIGERD) || defined(GOTTHARDD) || \ - defined(GOTTHARD2D) + defined(GOTTHARD2D) || defined(JUNGFRAUD) int isMaster(int *retval); #endif diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer.c index 659166071..c60acd3a4 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer.c @@ -215,8 +215,7 @@ int main(int argc, char *argv[]) { break; case 'm': -#if (defined(MYTHEN3D) || defined(GOTTHARDD) || defined(GOTTHARD2D)) && \ - !defined(VIRTUAL) +#if !defined(VIRTUAL) && !defined(EIGERD) LOG(logERROR, ("Cannot set master via the detector server for this " "detector\n")); exit(EXIT_FAILURE); diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 7809b681a..0f0d52863 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -1880,55 +1880,57 @@ int acquire(int blocking, int file_des) { #ifdef EIGERD // check for hardware mac and hardware ip if (udpDetails[0].srcmac != getDetectorMAC()) { - ret = FAIL; - uint64_t sourcemac = getDetectorMAC(); - char src_mac[MAC_ADDRESS_SIZE]; - getMacAddressinString(src_mac, MAC_ADDRESS_SIZE, sourcemac); - sprintf(mess, + ret = FAIL; + uint64_t sourcemac = getDetectorMAC(); + char src_mac[MAC_ADDRESS_SIZE]; + getMacAddressinString(src_mac, MAC_ADDRESS_SIZE, sourcemac); + sprintf( + mess, "Invalid udp source mac address for this detector. Must be " "same as hardware detector mac address %s\n", src_mac); - LOG(logERROR, (mess)); - } else if (!enableTenGigabitEthernet(GET_FLAG) && - (udpDetails[0].srcip != getDetectorIP())) { - ret = FAIL; - uint32_t sourceip = getDetectorIP(); - char src_ip[INET_ADDRSTRLEN]; - getIpAddressinString(src_ip, sourceip); - sprintf(mess, + LOG(logERROR, (mess)); + } else if (!enableTenGigabitEthernet(GET_FLAG) && + (udpDetails[0].srcip != getDetectorIP())) { + ret = FAIL; + uint32_t sourceip = getDetectorIP(); + char src_ip[INET_ADDRSTRLEN]; + getIpAddressinString(src_ip, sourceip); + sprintf( + mess, "Invalid udp source ip address for this detector. Must be " "same " "as hardware detector ip address %s in 1G readout mode \n", src_ip); - LOG(logERROR, (mess)); - } else + LOG(logERROR, (mess)); + } else #endif - if (configured == FAIL) { - ret = FAIL; - strcpy(mess, "Could not start acquisition because "); - strcat(mess, configureMessage); - LOG(logERROR, (mess)); - } else if (sharedMemory_getScanStatus() == RUNNING) { - ret = FAIL; - strcpy(mess, "Could not start acquisition because a scan is " - "already running!\n"); - LOG(logERROR, (mess)); - } else { - memset(scanErrMessage, 0, MAX_STR_LENGTH); - sharedMemory_setScanStop(0); - sharedMemory_setScanStatus(IDLE); // if it was error - if (pthread_create(&pthread_tid, NULL, &start_state_machine, - &blocking)) { + if (configured == FAIL) { ret = FAIL; - strcpy(mess, "Could not start acquisition thread!\n"); + strcpy(mess, "Could not start acquisition because "); + strcat(mess, configureMessage); + LOG(logERROR, (mess)); + } else if (sharedMemory_getScanStatus() == RUNNING) { + ret = FAIL; + strcpy(mess, "Could not start acquisition because a scan is " + "already running!\n"); LOG(logERROR, (mess)); } else { - // only does not wait for non blocking and scan - if (blocking || !scan) { - pthread_join(pthread_tid, NULL); + memset(scanErrMessage, 0, MAX_STR_LENGTH); + sharedMemory_setScanStop(0); + sharedMemory_setScanStatus(IDLE); // if it was error + if (pthread_create(&pthread_tid, NULL, &start_state_machine, + &blocking)) { + ret = FAIL; + strcpy(mess, "Could not start acquisition thread!\n"); + LOG(logERROR, (mess)); + } else { + // only does not wait for non blocking and scan + if (blocking || !scan) { + pthread_join(pthread_tid, NULL); + } } } - } } return Server_SendResult(file_des, INT32, NULL, 0); } @@ -8234,7 +8236,7 @@ int get_master(int file_des) { LOG(logDEBUG1, ("Getting master\n")); #if !defined(MYTHEN3D) && !defined(EIGERD) && !defined(GOTTHARDD) && \ - !defined(GOTTHARD2D) + !defined(GOTTHARD2D) && !defined(JUNGFRAUD) functionNotImplemented(); #else ret = isMaster(&retval); @@ -8255,7 +8257,7 @@ int set_master(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting master: %u\n", (int)arg)); -#if !defined(EIGERD) && !defined(GOTTHARD2D) +#if !defined(EIGERD) && !defined(GOTTHARD2D) && !defined(JUNGFRAUD) functionNotImplemented(); #else // only set diff --git a/slsDetectorSoftware/src/CmdProxy.h b/slsDetectorSoftware/src/CmdProxy.h index 3af991029..07a9deeda 100644 --- a/slsDetectorSoftware/src/CmdProxy.h +++ b/slsDetectorSoftware/src/CmdProxy.h @@ -1298,9 +1298,10 @@ class CmdProxy { INTEGER_COMMAND_VEC_ID_GET( master, getMaster, setMaster, StringTo, - "[0, 1]\n\t[Eiger][Gotthard2] Sets (half) module to master and " - "other(s) to slaves.\n\t[Gotthard][Gotthard2][Mythen3][Eiger] " - "Gets if the current (half) module is master."); + "[0, 1]\n\t[Eiger][Gotthard2][Jungfrau] Sets (half) module to master " + "and other(s) to " + "slaves.\n\t[Gotthard][Gotthard2][Mythen3][Eiger][Jungfrau] Gets if " + "the current (half) module is master."); /* acquisition parameters */ diff --git a/slsDetectorSoftware/tests/test-CmdProxy.cpp b/slsDetectorSoftware/tests/test-CmdProxy.cpp index 5a72aaf59..586485a79 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy.cpp @@ -584,9 +584,11 @@ TEST_CASE("master", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER || det_type == defs::MYTHEN3 || - det_type == defs::GOTTHARD || det_type == defs::GOTTHARD2) { + det_type == defs::GOTTHARD || det_type == defs::GOTTHARD2 || + det_type == defs::JUNGFRAU) { REQUIRE_NOTHROW(proxy.Call("master", {}, -1, GET)); - if (det_type == defs::EIGER || det_type == defs::GOTTHARD2) { + if (det_type == defs::EIGER || det_type == defs::GOTTHARD2 || + det_type == defs::JUNGFRAU) { // get previous master int prevMaster = 0; { diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index 5442ff4ca..a5074bcdf 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -5,10 +5,10 @@ #define APILIB 0x220609 #define APIRECEIVER 0x220609 #define APIGUI 0x220609 -#define APICTB 0x220816 -#define APIGOTTHARD 0x220816 -#define APIMYTHEN3 0x220816 -#define APIMOENCH 0x220816 -#define APIEIGER 0x220816 +#define APICTB 0x220816 +#define APIGOTTHARD 0x220816 +#define APIMYTHEN3 0x220816 +#define APIMOENCH 0x220816 +#define APIEIGER 0x220816 #define APIGOTTHARD2 0x220816 #define APIJUNGFRAU 0x220816