From 47018b61cd838f313236fe067f949cff2f94a833 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil <33750417+thattil@users.noreply.github.com> Date: Mon, 26 Oct 2020 16:13:48 +0100 Subject: [PATCH] M3readout (#209) * m3: readout command --- .../mythen3DetectorServer/RegisterDefs.h | 2 +- .../bin/mythen3DetectorServer_developer | Bin 216168 -> 216224 bytes .../slsDetectorFunctionList.c | 16 +++++++ .../include/slsDetectorFunctionList.h | 3 +- .../include/slsDetectorServer_funcs.h | 3 +- .../src/slsDetectorServer_funcs.c | 43 +++++++++++++++++- slsDetectorSoftware/include/Detector.h | 5 ++ slsDetectorSoftware/src/CmdProxy.h | 10 +++- slsDetectorSoftware/src/Detector.cpp | 4 ++ slsDetectorSoftware/src/Module.cpp | 5 ++ slsDetectorSoftware/src/Module.h | 1 + .../tests/test-CmdProxy-mythen3.cpp | 17 +++++++ slsSupportLib/include/sls_detector_funcs.h | 2 + slsSupportLib/include/versionAPI.h | 2 +- 14 files changed, 106 insertions(+), 7 deletions(-) diff --git a/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h b/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h index 4cd7ddc9f..847d396e6 100644 --- a/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h +++ b/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h @@ -132,7 +132,7 @@ #define CONTROL_STP_ACQSTN_MSK (0x00000001 << CONTROL_STP_ACQSTN_OFST) #define CONTROL_STRT_PATTERN_OFST (2) #define CONTROL_STRT_PATTERN_MSK (0x00000001 << CONTROL_STRT_PATTERN_OFST) -#define CONTROL_STRT_READOUT_OFST (3) // not connected in software yet +#define CONTROL_STRT_READOUT_OFST (3) #define CONTROL_STRT_READOUT_MSK (0x00000001 << CONTROL_STRT_READOUT_OFST) #define CONTROL_STRT_SW_TRIGGER_OFST (4) #define CONTROL_STRT_SW_TRIGGER_MSK (0x00000001 << CONTROL_STRT_SW_TRIGGER_OFST) diff --git a/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer b/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer index fedf3ee7fb4fcc2e6661c862b8dc0b017d4544eb..7e66b07c4147a0f774e49a2804207db99440e5af 100755 GIT binary patch delta 50832 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 Q5`nJF3_iesh5;B805+r*1poj5 diff --git a/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c index c2644a1eb..0e89c7811 100644 --- a/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c @@ -2407,6 +2407,22 @@ int softwareTrigger() { return OK; } +int startReadOut() { + LOG(logINFOBLUE, ("Starting Readout\n")); +#ifdef VIRTUAL + // cannot set #frames and exptiem temporarily to 1 and 0, + // because have to set it back after readout (but this is non blocking) + return startStateMachine(); +#endif + cleanFifos(); + + // start readout + bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_STRT_READOUT_MSK); + + LOG(logINFO, ("Status Register: %08x\n", bus_r(STATUS_REG))); + 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 e2b0b3b67..c63064d9f 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -567,8 +567,7 @@ int stopStateMachine(); #if defined(EIGERD) || defined(MYTHEN3D) int softwareTrigger(); #endif - -#ifdef EIGERD +#if defined(EIGERD) || defined(MYTHEN3D) int startReadOut(); #endif enum runStatus getRunStatus(); diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h index 9bccf5a23..a445323ee 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h @@ -239,4 +239,5 @@ int get_bad_channels(int); int set_bad_channels(int); int reconfigure_udp(int); int validate_udp_configuration(int); -int get_bursts_left(int); \ No newline at end of file +int get_bursts_left(int); +int start_readout(int); \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 436084fa1..3a39ad220 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -358,6 +358,7 @@ void function_table() { flist[F_RECONFIGURE_UDP] = &reconfigure_udp; flist[F_VALIDATE_UDP_CONFIG] = &validate_udp_configuration; flist[F_GET_BURSTS_LEFT] = &get_bursts_left; + flist[F_START_READOUT] = &start_readout; // check if (NUM_DET_FUNCTIONS >= RECEIVER_ENUM_START) { @@ -8103,4 +8104,44 @@ int get_bursts_left(int file_des) { LOG(logDEBUG1, ("retval num bursts left %lld\n", (long long int)retval)); #endif return Server_SendResult(file_des, INT64, &retval, sizeof(retval)); -} \ No newline at end of file +} + +int start_readout(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); +#ifndef MYTHEN3D + functionNotImplemented(); +#else + if (Server_VerifyLock() == OK) { + enum runStatus s = getRunStatus(); + if (s == RUNNING || s == WAITING) { + ret = FAIL; + strcpy(mess, "Could not start readout because the detector is " + "already running!\n"); + LOG(logERROR, (mess)); + } else if (configured == FAIL) { + ret = FAIL; + strcpy(mess, "Could not start readout because "); + strcat(mess, configureMessage); + LOG(logERROR, (mess)); + } else { + memset(scanErrMessage, 0, MAX_STR_LENGTH); + sharedMemory_setScanStop(0); + sharedMemory_setScanStatus(IDLE); // if it was error + // start readout + ret = startReadOut(); + if (ret == FAIL) { +#ifdef VIRTUAL + sprintf(mess, + "Could not start readout. Could not create udp " + "socket in server. Check udp_dstip & udp_dstport.\n"); +#else + sprintf(mess, "Could not start readout\n"); +#endif + LOG(logERROR, (mess)); + } + } + } +#endif + return Server_SendResult(file_des, INT32, NULL, 0); +} diff --git a/slsDetectorSoftware/include/Detector.h b/slsDetectorSoftware/include/Detector.h index b91bc058e..0947733d2 100644 --- a/slsDetectorSoftware/include/Detector.h +++ b/slsDetectorSoftware/include/Detector.h @@ -456,6 +456,11 @@ class Detector { * WAITING and automatically returns to idle at the end of acquisition. */ void startDetector(); + /** [Mythen3] Non blocking: start detector readout of counters in chip. + * Status changes to TRANSMITTING and automatically returns to idle at the + * end of readout. */ + void startDetectorReadout(); + /** Non blocking: Abort detector acquisition. Status changes to IDLE or * STOPPED. Goes to stop server. */ void stopDetector(); diff --git a/slsDetectorSoftware/src/CmdProxy.h b/slsDetectorSoftware/src/CmdProxy.h index daaf7588f..4df0a4c98 100644 --- a/slsDetectorSoftware/src/CmdProxy.h +++ b/slsDetectorSoftware/src/CmdProxy.h @@ -835,6 +835,7 @@ class CmdProxy { {"rx_start", &CmdProxy::rx_start}, {"rx_stop", &CmdProxy::rx_stop}, {"start", &CmdProxy::start}, + {"readout", &CmdProxy::readout}, {"stop", &CmdProxy::stop}, {"rx_status", &CmdProxy::ReceiverStatus}, {"status", &CmdProxy::DetectorStatus}, @@ -1429,7 +1430,14 @@ class CmdProxy { EXECUTE_SET_COMMAND_NOID( start, startDetector, "\n\tStarts detector acquisition. Status changes to RUNNING or WAITING " - "and automatically returns to idle at the end of acquisition."); + "and automatically returns to idle at the end of acquisition. If the " + "acquisition was abruptly stopped, some detectors come back to " + "STOPPED."); + + EXECUTE_SET_COMMAND_NOID( + readout, startDetectorReadout, + "\n\t[Mythen3] Starts detector readout. Status changes to TRANSMITTING " + "and automatically returns to idle at the end of readout."); EXECUTE_SET_COMMAND_NOID(stop, stopDetector, "\n\tAbort detector acquisition. Status changes " diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index 296293cd4..2186531b2 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -593,6 +593,10 @@ void Detector::startDetector() { pimpl->Parallel(&Module::startAcquisition, {}); } +void Detector::startDetectorReadout() { + pimpl->Parallel(&Module::startReadout, {}); +} + void Detector::stopDetector() { pimpl->Parallel(&Module::stopAcquisition, {}); } Result Detector::getDetectorStatus(Positions pos) const { diff --git a/slsDetectorSoftware/src/Module.cpp b/slsDetectorSoftware/src/Module.cpp index 82bc848fb..a856fe145 100644 --- a/slsDetectorSoftware/src/Module.cpp +++ b/slsDetectorSoftware/src/Module.cpp @@ -407,6 +407,11 @@ void Module::startAcquisition() { sendToDetector(F_START_ACQUISITION); } +void Module::startReadout() { + shm()->stoppedFlag = false; + sendToDetector(F_START_READOUT); +} + void Module::stopAcquisition() { // get status before stopping acquisition runStatus s = ERROR, r = ERROR; diff --git a/slsDetectorSoftware/src/Module.h b/slsDetectorSoftware/src/Module.h index 2d8ae07af..f9f808750 100644 --- a/slsDetectorSoftware/src/Module.h +++ b/slsDetectorSoftware/src/Module.h @@ -160,6 +160,7 @@ class Module : public virtual slsDetectorDefs { void startReceiver(); void stopReceiver(); void startAcquisition(); + void startReadout(); void stopAcquisition(); void restreamStopFromReceiver(); void startAndReadAll(); diff --git a/slsDetectorSoftware/tests/test-CmdProxy-mythen3.cpp b/slsDetectorSoftware/tests/test-CmdProxy-mythen3.cpp index 8f10e628d..e63417664 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-mythen3.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy-mythen3.cpp @@ -115,6 +115,23 @@ TEST_CASE("Setting and reading back MYTHEN3 dacs", "[.cmd][.dacs][.new]") { } } +/* acquisition */ + +TEST_CASE("readout", "[.cmd][.new]") { + Detector det; + CmdProxy proxy(&det); + // PUT only command + REQUIRE_THROWS(proxy.Call("readout", {}, -1, GET)); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::MYTHEN3) { + REQUIRE_THROWS(proxy.Call("readout", {}, -1, GET)); + } else { + std::ostringstream oss; + proxy.Call("readout", {}, -1, PUT, oss); + REQUIRE(oss.str() == "readout successful\n"); + } +} + /* Mythen3 Specific */ TEST_CASE("counters", "[.cmd][.new]") { diff --git a/slsSupportLib/include/sls_detector_funcs.h b/slsSupportLib/include/sls_detector_funcs.h index 3d38dccf1..bda81ab11 100755 --- a/slsSupportLib/include/sls_detector_funcs.h +++ b/slsSupportLib/include/sls_detector_funcs.h @@ -214,6 +214,7 @@ enum detFuncs { F_RECONFIGURE_UDP, F_VALIDATE_UDP_CONFIG, F_GET_BURSTS_LEFT, + F_START_READOUT, NUM_DET_FUNCTIONS, RECEIVER_ENUM_START = 256, /**< detector function should not exceed this @@ -533,6 +534,7 @@ const char* getFunctionNameFromEnum(enum detFuncs func) { case F_RECONFIGURE_UDP: return "F_RECONFIGURE_UDP"; case F_VALIDATE_UDP_CONFIG: return "F_VALIDATE_UDP_CONFIG"; case F_GET_BURSTS_LEFT: return "F_GET_BURSTS_LEFT"; + case F_START_READOUT: return "F_START_READOUT"; case NUM_DET_FUNCTIONS: return "NUM_DET_FUNCTIONS"; case RECEIVER_ENUM_START: return "RECEIVER_ENUM_START"; diff --git a/slsSupportLib/include/versionAPI.h b/slsSupportLib/include/versionAPI.h index ced7db62a..ed09b5851 100644 --- a/slsSupportLib/include/versionAPI.h +++ b/slsSupportLib/include/versionAPI.h @@ -9,4 +9,4 @@ #define APIGOTTHARD2 0x201016 #define APIJUNGFRAU 0x201016 #define APIMOENCH 0x201013 -#define APIMYTHEN3 0x201020 +#define APIMYTHEN3 0x201026