diff --git a/RELEASE.txt b/RELEASE.txt index b7223a41d..22ade5651 100755 --- a/RELEASE.txt +++ b/RELEASE.txt @@ -87,6 +87,7 @@ This document describes the differences between v7.0.0 and v6.x.x - callback modified to have rx header and not rx header pointer - adapted for g2 hdi v2.0. able to set master from server command line, server config file, and client. - 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 - g2 parallel command diff --git a/slsDetectorServers/jungfrauDetectorServer/RegisterDefs.h b/slsDetectorServers/jungfrauDetectorServer/RegisterDefs.h index 5db0ac0d5..8927b03d8 100644 --- a/slsDetectorServers/jungfrauDetectorServer/RegisterDefs.h +++ b/slsDetectorServers/jungfrauDetectorServer/RegisterDefs.h @@ -218,6 +218,8 @@ #define CONTROL_START_ACQ_MSK (0x00000001 << CONTROL_START_ACQ_OFST) #define CONTROL_STOP_ACQ_OFST (1) #define CONTROL_STOP_ACQ_MSK (0x00000001 << CONTROL_STOP_ACQ_OFST) +#define CONTROL_SOFTWARE_TRIGGER_OFST (2) +#define CONTROL_SOFTWARE_TRIGGER_MSK (0x00000001 << CONTROL_SOFTWARE_TRIGGER_OFST) #define CONTROL_CORE_RST_OFST (10) #define CONTROL_CORE_RST_MSK (0x00000001 << CONTROL_CORE_RST_OFST) #define CONTROL_PERIPHERAL_RST_OFST (11) // DDR3 HMem Ctrlr, GBE, Temp diff --git a/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer b/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer index a9225da3d..9ea70f61a 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 9c9954d7c..e4351e5a4 100644 --- a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c @@ -2686,6 +2686,33 @@ int stopStateMachine() { return OK; } +int softwareTrigger(int block) { +#ifndef VIRTUAL + // ready for trigger + if (getRunStatus() != WAITING) { + LOG(logWARNING, ("Not yet ready for trigger!\n")); + return 0; + } +#endif + + LOG(logINFO, ("Sending Software Trigger\n")); + bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_SOFTWARE_TRIGGER_MSK); + +#ifndef VIRTUAL + // block till frame is sent out + if (block) { + enum runStatus s = getRunStatus(); + while (s == RUNNING || s == TRANSMITTING) { + usleep(5000); + s = getRunStatus(); + } + } + LOG(logINFO, ("Ready for Next Trigger...\n")); +#endif + + return OK; +} + enum runStatus getRunStatus() { LOG(logDEBUG1, ("Getting status\n")); // scan error or running diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index c529f644e..c4af36d4f 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -650,7 +650,7 @@ int stopStateMachine(); #ifdef MYTHEN3D int softwareTrigger(); #endif -#ifdef EIGERD +#if defined(EIGERD) || defined(JUNGFRAUD) int softwareTrigger(int block); #endif #if defined(EIGERD) || defined(MYTHEN3D) diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index f38863163..7809b681a 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -1880,57 +1880,55 @@ 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) { + 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)) { 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"); + strcpy(mess, "Could not start acquisition thread!\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)) { - 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); - } + // 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); } @@ -4129,18 +4127,19 @@ int software_trigger(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Software Trigger (block: %d\n", arg)); -#if !defined(EIGERD) && !defined(MYTHEN3D) +#if !defined(EIGERD) && !defined(MYTHEN3D) && !defined(JUNGFRAUD) functionNotImplemented(); #else if (arg && myDetectorType == MYTHEN3) { ret = FAIL; - strcpy(mess, "Blocking trigger not implemented for Mythen3. Please use " + strcpy(mess, "Blocking trigger not implemented for this detector. " + "Please use " "non blocking trigger.\n"); LOG(logERROR, (mess)); } // only set else if (Server_VerifyLock() == OK) { -#ifdef MYTHEN3 +#ifdef MYTHEN3D ret = softwareTrigger(); #else ret = softwareTrigger(arg); diff --git a/slsDetectorSoftware/include/sls/Detector.h b/slsDetectorSoftware/include/sls/Detector.h index 5a5340cda..3b5458112 100644 --- a/slsDetectorSoftware/include/sls/Detector.h +++ b/slsDetectorSoftware/include/sls/Detector.h @@ -618,8 +618,10 @@ class Detector { * different frame numbers for different modules.*/ void setNextFrameNumber(uint64_t value, Positions pos = {}); - /** [Eiger][Mythen3] Sends an internal software trigger to the detector - * block true if command blocks till frames are sent out from that trigger + /** [Eiger][Mythen3][Jungfrau] Sends an internal software trigger to the + * detector block true if command blocks till frames are sent out from that + * trigger + * [Eiger][Jungfrau] Block can be true */ void sendSoftwareTrigger(const bool block = false, Positions pos = {}); diff --git a/slsDetectorSoftware/src/CmdProxy.cpp b/slsDetectorSoftware/src/CmdProxy.cpp index d852b8f3e..c7d4df0c3 100644 --- a/slsDetectorSoftware/src/CmdProxy.cpp +++ b/slsDetectorSoftware/src/CmdProxy.cpp @@ -1402,12 +1402,12 @@ std::string CmdProxy::Trigger(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { if (cmd == "trigger") { - os << "\n\t[Eiger][Mythen3] Sends software trigger signal to " - "detector"; + os << "\n\t[Eiger][Mythen3][Jungfrau] Sends software trigger " + "signal to detector"; } else if (cmd == "blockingtrigger") { - os << "\n\t[Eiger] Sends software trigger signal to detector and " - "blocks till " - "the frames are sent out for that trigger."; + os << "\n\t[Eiger][Jungfrau] Sends software trigger signal to " + "detector and blocks till the frames are sent out for that " + "trigger."; } else { throw RuntimeError("unknown command " + cmd); } diff --git a/slsDetectorSoftware/tests/test-CmdProxy-mythen3.cpp b/slsDetectorSoftware/tests/test-CmdProxy-mythen3.cpp index 102808dd2..dec3ab04c 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-mythen3.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy-mythen3.cpp @@ -523,7 +523,7 @@ TEST_CASE("interpolation", "[.cmd]") { REQUIRE(oss.str() == "interpolation 0\n"); REQUIRE(det.getCounterMask().tsquash( "inconsistent counter mask") == fixedMask[i]); - uint32_t expectedVth3DacVal = + int expectedVth3DacVal = (fixedMask[i] & 0x4 ? fixedVth3DacVal : disabledDacValue); REQUIRE(det.getDAC(defs::VTH3, 0, {0}) .tsquash("inconsistent vth3 dac value") == diff --git a/slsDetectorSoftware/tests/test-CmdProxy.cpp b/slsDetectorSoftware/tests/test-CmdProxy.cpp index 700f4b458..5a72aaf59 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy.cpp @@ -1943,11 +1943,9 @@ TEST_CASE("trigger", "[.cmd]") { CmdProxy proxy(&det); REQUIRE_THROWS(proxy.Call("trigger", {}, -1, GET)); auto det_type = det.getDetectorType().squash(); - if (det_type != defs::EIGER && det_type != defs::MYTHEN3) { - REQUIRE_THROWS(proxy.Call("trigger", {}, -1, PUT)); - } else if (det_type == defs::MYTHEN3) { + if (det_type == defs::MYTHEN3) { REQUIRE_NOTHROW(proxy.Call("trigger", {}, -1, PUT)); - } else if (det_type == defs::EIGER) { + } else if (det_type == defs::EIGER || det_type == defs::JUNGFRAU) { auto prev_timing = det.getTimingMode().tsquash("inconsistent timing mode in test"); auto prev_frames = @@ -1977,6 +1975,8 @@ TEST_CASE("trigger", "[.cmd]") { det.setNumberOfFrames(prev_frames); det.setExptime(prev_exptime); det.setPeriod(prev_period); + } else { + REQUIRE_THROWS(proxy.Call("trigger", {}, -1, PUT)); } } @@ -1985,9 +1985,7 @@ TEST_CASE("blockingtrigger", "[.cmd]") { CmdProxy proxy(&det); REQUIRE_THROWS(proxy.Call("blockingtrigger", {}, -1, GET)); auto det_type = det.getDetectorType().squash(); - if (det_type != defs::EIGER) { - REQUIRE_THROWS(proxy.Call("blockingtrigger", {}, -1, PUT)); - } else if (det_type == defs::EIGER) { + if (det_type == defs::EIGER || det_type == defs::JUNGFRAU) { auto prev_timing = det.getTimingMode().tsquash("inconsistent timing mode in test"); auto prev_frames = @@ -2020,6 +2018,8 @@ TEST_CASE("blockingtrigger", "[.cmd]") { det.setNumberOfFrames(prev_frames); det.setExptime(prev_exptime); det.setPeriod(prev_period); + } else { + REQUIRE_THROWS(proxy.Call("blockingtrigger", {}, -1, PUT)); } } diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index 62ead04a5..5442ff4ca 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -7,8 +7,8 @@ #define APIGUI 0x220609 #define APICTB 0x220816 #define APIGOTTHARD 0x220816 -#define APIJUNGFRAU 0x220816 #define APIMYTHEN3 0x220816 #define APIMOENCH 0x220816 #define APIEIGER 0x220816 #define APIGOTTHARD2 0x220816 +#define APIJUNGFRAU 0x220816