From 0c045f0faa15660e0b8592f1c38b3499f5693f5b Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 29 Jun 2020 17:40:41 +0200 Subject: [PATCH] WIP --- .../slsDetectorFunctionList.c | 90 ++--- .../slsDetectorFunctionList.c | 137 ++++---- .../slsDetectorFunctionList.c | 75 +++-- .../slsDetectorFunctionList.c | 7 +- .../slsDetectorFunctionList.c | 7 +- .../include/slsDetectorServer_funcs.h | 2 + .../src/slsDetectorServer_funcs.c | 309 ++++++++---------- slsDetectorSoftware/src/CmdProxy.cpp | 16 +- slsDetectorSoftware/src/Detector.cpp | 13 +- slsDetectorSoftware/src/Module.cpp | 4 +- slsDetectorSoftware/src/Module.h | 4 +- 11 files changed, 318 insertions(+), 346 deletions(-) diff --git a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c index 7e0e11c00..f77fce23c 100644 --- a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c @@ -45,6 +45,7 @@ pthread_t pthread_virtual_tid; int virtual_status = 0; int virtual_stop = 0; uint64_t virtual_pattern[MAX_PATTERN_LENGTH]; +int64_t virtual_currentFrameNumber = 2; #endif // 1g readout @@ -2304,60 +2305,59 @@ void *start_timer(void *arg) { } // Send data - { - // loop over number of frames - for (int frameNr = 0; frameNr != numFrames; ++frameNr) { + // loop over number of frames + for (int frameNr = 0; frameNr != numFrames; ++frameNr) { - // update the virtual stop from stop server - lockSharedMemory(thisMem); - virtual_stop = thisMem->stop; - unlockSharedMemory(thisMem); - // check if virtual_stop is high - if (virtual_stop == 1) { - break; - } + // update the virtual stop from stop server + lockSharedMemory(thisMem); + virtual_stop = thisMem->stop; + unlockSharedMemory(thisMem); + // check if virtual_stop is high + if (virtual_stop == 1) { + break; + } - // sleep for exposure time - struct timespec begin, end; - clock_gettime(CLOCK_REALTIME, &begin); - usleep(expUs); + // sleep for exposure time + struct timespec begin, end; + clock_gettime(CLOCK_REALTIME, &begin); + usleep(expUs); - int srcOffset = 0; - // loop packet - for (int i = 0; i != packetsPerFrame; ++i) { + int srcOffset = 0; + // loop packet + for (int i = 0; i != packetsPerFrame; ++i) { - char packetData[packetSize]; - memset(packetData, 0, packetSize); - // set header - sls_detector_header *header = - (sls_detector_header *)(packetData); - header->detType = (uint16_t)myDetectorType; - header->version = SLS_DETECTOR_HEADER_VERSION - 1; - header->frameNumber = frameNr; - header->packetNumber = i; - header->modId = 0; - header->row = detPos[X]; - header->column = detPos[Y]; + char packetData[packetSize]; + memset(packetData, 0, packetSize); + // set header + sls_detector_header *header = (sls_detector_header *)(packetData); + header->detType = (uint16_t)myDetectorType; + header->version = SLS_DETECTOR_HEADER_VERSION - 1; + header->frameNumber = virtual_currentFrameNumber; + header->packetNumber = i; + header->modId = 0; + header->row = detPos[X]; + header->column = detPos[Y]; - // fill data - memcpy(packetData + sizeof(sls_detector_header), - imageData + srcOffset, dataSize); - srcOffset += dataSize; + // fill data + memcpy(packetData + sizeof(sls_detector_header), + imageData + srcOffset, dataSize); + srcOffset += dataSize; - sendUDPPacket(0, packetData, packetSize); - } - LOG(logINFO, ("Sent frame: %d\n", frameNr)); - clock_gettime(CLOCK_REALTIME, &end); - int64_t timeNs = ((end.tv_sec - begin.tv_sec) * 1E9 + - (end.tv_nsec - begin.tv_nsec)); + sendUDPPacket(0, packetData, packetSize); + } + LOG(logINFO, ("Sent frame: %d [%lld]\n", frameNr, + (long long unsigned int)virtual_currentFrameNumber)); + clock_gettime(CLOCK_REALTIME, &end); + int64_t timeNs = + ((end.tv_sec - begin.tv_sec) * 1E9 + (end.tv_nsec - begin.tv_nsec)); - // sleep for (period - exptime) - if (frameNr < numFrames) { // if there is a next frame - if (periodNs > timeNs) { - usleep((periodNs - timeNs) / 1000); - } + // sleep for (period - exptime) + if (frameNr < numFrames) { // if there is a next frame + if (periodNs > timeNs) { + usleep((periodNs - timeNs) / 1000); } } + ++virtual_currentFrameNumber; } closeUDPSocket(0); diff --git a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c index 76e97b4b6..80b38c502 100644 --- a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c @@ -40,6 +40,7 @@ sharedMem *thisMem; pthread_t pthread_virtual_tid; int virtual_status = 0; int virtual_stop = 0; +int64_t virtual_currentFrameNumber = 2; #endif enum detectorSettings thisSettings = UNINITIALIZED; @@ -2321,88 +2322,84 @@ void *start_timer(void *arg) { *((uint16_t *)(vetoData + i)) = i; } - { - int frameHeaderNr = 0; - // loop over number of repeats - for (int repeatNr = 0; repeatNr != numRepeats; ++repeatNr) { + // loop over number of repeats + for (int repeatNr = 0; repeatNr != numRepeats; ++repeatNr) { - struct timespec rbegin, rend; - clock_gettime(CLOCK_REALTIME, &rbegin); + struct timespec rbegin, rend; + clock_gettime(CLOCK_REALTIME, &rbegin); - // loop over number of frames - for (int frameNr = 0; frameNr != numFrames; ++frameNr) { + // loop over number of frames + for (int frameNr = 0; frameNr != numFrames; ++frameNr) { - // update the virtual stop from stop server - lockSharedMemory(thisMem); - virtual_stop = thisMem->stop; - unlockSharedMemory(thisMem); - // check if virtual_stop is high - if (virtual_stop == 1) { - break; - } + // update the virtual stop from stop server + lockSharedMemory(thisMem); + virtual_stop = thisMem->stop; + unlockSharedMemory(thisMem); + // check if virtual_stop is high + if (virtual_stop == 1) { + break; + } - // sleep for exposure time - struct timespec begin, end; - clock_gettime(CLOCK_REALTIME, &begin); - usleep(expUs); + // sleep for exposure time + struct timespec begin, end; + clock_gettime(CLOCK_REALTIME, &begin); + usleep(expUs); - // first interface - char packetData[packetsize]; - memset(packetData, 0, packetsize); + // first interface + char packetData[packetsize]; + memset(packetData, 0, packetsize); + // set header + sls_detector_header *header = (sls_detector_header *)(packetData); + header->detType = (uint16_t)myDetectorType; + header->version = SLS_DETECTOR_HEADER_VERSION - 1; + header->frameNumber = virtual_currentFrameNumber; + header->packetNumber = 0; + header->modId = 0; + header->row = detPos[X]; + header->column = detPos[Y]; + // fill data + memcpy(packetData + sizeof(sls_detector_header), imageData, + datasize); + // send 1 packet = 1 frame + sendUDPPacket(0, packetData, packetsize); + + // second interface (veto) + char packetData2[vetopacketsize]; + memset(packetData2, 0, vetopacketsize); + if (vetoEnabled && numInterfaces == 2) { // set header - sls_detector_header *header = - (sls_detector_header *)(packetData); - header->detType = (uint16_t)myDetectorType; - header->version = SLS_DETECTOR_HEADER_VERSION - 1; - header->frameNumber = frameHeaderNr; - header->packetNumber = 0; - header->modId = 0; - header->row = detPos[X]; - header->column = detPos[Y]; + veto_header *header = (veto_header *)(packetData2); + header->frameNumber = virtual_currentFrameNumber; + header->bunchId = 0; // fill data - memcpy(packetData + sizeof(sls_detector_header), imageData, - datasize); + memcpy(packetData2 + sizeof(veto_header), vetoData, + vetodatasize); // send 1 packet = 1 frame - sendUDPPacket(0, packetData, packetsize); + sendUDPPacket(1, packetData2, vetopacketsize); + } + LOG(logINFO, + ("Sent frame: %d (bursts: %d) [%lld]\n", frameNr, repeatNr, + (long long unsigned int)virtual_currentFrameNumber)); + clock_gettime(CLOCK_REALTIME, &end); + int64_t timeNs = ((end.tv_sec - begin.tv_sec) * 1E9 + + (end.tv_nsec - begin.tv_nsec)); - // second interface (veto) - char packetData2[vetopacketsize]; - memset(packetData2, 0, vetopacketsize); - if (vetoEnabled && numInterfaces == 2) { - // set header - veto_header *header = (veto_header *)(packetData2); - header->frameNumber = frameHeaderNr; - header->bunchId = 0; - // fill data - memcpy(packetData2 + sizeof(veto_header), vetoData, - vetodatasize); - // send 1 packet = 1 frame - sendUDPPacket(1, packetData2, vetopacketsize); - } - ++frameHeaderNr; - - clock_gettime(CLOCK_REALTIME, &end); - LOG(logINFO, - ("Sent frame: %d (bursts: %d)\n", frameNr, repeatNr)); - int64_t timeNs = ((end.tv_sec - begin.tv_sec) * 1E9 + - (end.tv_nsec - begin.tv_nsec)); - - // sleep for (period - exptime) - if (frameNr < numFrames) { // if there is a next frame - if (periodNs > timeNs) { - usleep((periodNs - timeNs) / 1000); - } + // sleep for (period - exptime) + if (frameNr < numFrames) { // if there is a next frame + if (periodNs > timeNs) { + usleep((periodNs - timeNs) / 1000); } } - clock_gettime(CLOCK_REALTIME, &rend); - int64_t timeNs = ((rend.tv_sec - rbegin.tv_sec) * 1E9 + - (rend.tv_nsec - rbegin.tv_nsec)); + ++virtual_currentFrameNumber; + } + clock_gettime(CLOCK_REALTIME, &rend); + int64_t timeNs = ((rend.tv_sec - rbegin.tv_sec) * 1E9 + + (rend.tv_nsec - rbegin.tv_nsec)); - // sleep for (repeatPeriodNs - time remaining) - if (repeatNr < numRepeats) { // if there is a next repeat - if (repeatPeriodNs > timeNs) { - usleep((repeatPeriodNs - timeNs) / 1000); - } + // sleep for (repeatPeriodNs - time remaining) + if (repeatNr < numRepeats) { // if there is a next repeat + if (repeatPeriodNs > timeNs) { + usleep((repeatPeriodNs - timeNs) / 1000); } } } diff --git a/slsDetectorServers/gotthardDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/gotthardDetectorServer/slsDetectorFunctionList.c index d21a41f1b..142425524 100644 --- a/slsDetectorServers/gotthardDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/gotthardDetectorServer/slsDetectorFunctionList.c @@ -38,6 +38,7 @@ pthread_t pthread_virtual_tid; int virtual_status = 0; int virtual_stop = 0; int highvoltage = 0; +int64_t virtual_currentFrameNumber = 2; #endif int detPos[2] = {}; @@ -1587,51 +1588,49 @@ void *start_timer(void *arg) { } // Send data - { - uint16_t frameHeaderNr = 2; - // loop over number of frames - for (int frameNr = 0; frameNr != numFrames; ++frameNr) { + // loop over number of frames + for (int frameNr = 0; frameNr != numFrames; ++frameNr) { - // update the virtual stop from stop server - lockSharedMemory(thisMem); - virtual_stop = thisMem->stop; - unlockSharedMemory(thisMem); - // check if virtual_stop is high - if (virtual_stop == 1) { - break; - } + // update the virtual stop from stop server + lockSharedMemory(thisMem); + virtual_stop = thisMem->stop; + unlockSharedMemory(thisMem); + // check if virtual_stop is high + if (virtual_stop == 1) { + break; + } - // sleep for exposure time - struct timespec begin, end; - clock_gettime(CLOCK_REALTIME, &begin); - usleep(expUs); + // sleep for exposure time + struct timespec begin, end; + clock_gettime(CLOCK_REALTIME, &begin); + usleep(expUs); - int srcOffset = 0; - // loop packet - for (int i = 0; i != packetsPerFrame; ++i) { + int srcOffset = 0; + // loop packet + for (int i = 0; i != packetsPerFrame; ++i) { - char packetData[packetSize]; - memset(packetData, 0, packetSize); - // set header - *((uint16_t *)(packetData)) = frameHeaderNr; - ++frameHeaderNr; + char packetData[packetSize]; + memset(packetData, 0, packetSize); + // set header + *((uint16_t *)(packetData)) = virtual_currentFrameNumber; + ++virtual_currentFrameNumber; - // fill data - memcpy(packetData + 4, imageData + srcOffset, dataSize); - srcOffset += dataSize; + // fill data + memcpy(packetData + 4, imageData + srcOffset, dataSize); + srcOffset += dataSize; - sendUDPPacket(0, packetData, packetSize); - } - LOG(logINFO, ("Sent frame: %d\n", frameNr)); - clock_gettime(CLOCK_REALTIME, &end); - int64_t timeNs = ((end.tv_sec - begin.tv_sec) * 1E9 + - (end.tv_nsec - begin.tv_nsec)); + sendUDPPacket(0, packetData, packetSize); + } + LOG(logINFO, + ("Sent frame: %d [%d]\n", frameNr, virtual_currentFrameNumber)); + clock_gettime(CLOCK_REALTIME, &end); + int64_t timeNs = + ((end.tv_sec - begin.tv_sec) * 1E9 + (end.tv_nsec - begin.tv_nsec)); - // sleep for (period - exptime) - if (frameNr < numFrames) { // if there is a next frame - if (periodNs > timeNs) { - usleep((periodNs - timeNs) / 1000); - } + // sleep for (period - exptime) + if (frameNr < numFrames) { // if there is a next frame + if (periodNs > timeNs) { + usleep((periodNs - timeNs) / 1000); } } } diff --git a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c index 82eb3d6a9..cbd62184c 100644 --- a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c @@ -43,6 +43,7 @@ pthread_t pthread_virtual_tid; int virtual_status = 0; int virtual_stop = 0; uint64_t virtual_pattern[MAX_PATTERN_LENGTH]; +int64_t virtual_currentFrameNumber = 2; #endif // 1g readout @@ -1963,7 +1964,7 @@ void *start_timer(void *arg) { sls_detector_header *header = (sls_detector_header *)(packetData); header->detType = (uint16_t)myDetectorType; header->version = SLS_DETECTOR_HEADER_VERSION - 1; - header->frameNumber = frameNr; + header->frameNumber = virtual_currentFrameNumber; header->packetNumber = i; header->modId = 0; header->row = detPos[X]; @@ -1976,7 +1977,8 @@ void *start_timer(void *arg) { sendUDPPacket(0, packetData, packetSize); } - LOG(logINFO, ("Sent frame: %d\n", frameNr)); + LOG(logINFO, ("Sent frame: %d [%lld]\n", frameNr, + (long long unsigned int)virtual_currentFrameNumber)); clock_gettime(CLOCK_REALTIME, &end); int64_t timeNs = ((end.tv_sec - begin.tv_sec) * 1E9 + (end.tv_nsec - begin.tv_nsec)); @@ -1987,6 +1989,7 @@ void *start_timer(void *arg) { usleep((periodNs - timeNs) / 1000); } } + ++virtual_currentFrameNumber; } closeUDPSocket(0); diff --git a/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c index 482f0694d..188dfd55a 100644 --- a/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c @@ -38,6 +38,7 @@ sharedMem *thisMem; pthread_t pthread_virtual_tid; int virtual_status = 0; int virtual_stop = 0; +int64_t virtual_currentFrameNumber = 2; #endif sls_detector_module *detectorModules = NULL; @@ -2073,7 +2074,7 @@ void *start_timer(void *arg) { sls_detector_header *header = (sls_detector_header *)(packetData); header->detType = (uint16_t)myDetectorType; header->version = SLS_DETECTOR_HEADER_VERSION - 1; - header->frameNumber = frameNr + 1; + header->frameNumber = virtual_currentFrameNumber; header->packetNumber = i; header->modId = 0; header->row = detPos[X]; @@ -2086,7 +2087,8 @@ void *start_timer(void *arg) { sendUDPPacket(0, packetData, packetSize); } - LOG(logINFO, ("Sent frame: %d\n", frameNr)); + LOG(logINFO, ("Sent frame: %d [%lld]\n", frameNr, + (long long unsigned int)virtual_currentFrameNumber)); clock_gettime(CLOCK_REALTIME, &end); int64_t timeNs = ((end.tv_sec - begin.tv_sec) * 1E9 + (end.tv_nsec - begin.tv_nsec)); @@ -2097,6 +2099,7 @@ void *start_timer(void *arg) { usleep((periodNs - timeNs) / 1000); } } + ++virtual_currentFrameNumber; } closeUDPSocket(0); diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h index 4ce30de56..d0dd2d864 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h @@ -36,6 +36,7 @@ int set_firmware_test(int); int set_bus_test(int); int set_image_test_mode(int); int get_image_test_mode(int); +enum DACINDEX getDACIndex(enum dacIndex ind); int set_dac(int); int get_adc(int); int write_register(int); @@ -43,6 +44,7 @@ int read_register(int); int set_module(int); int set_settings(int); int get_threshold_energy(int); +int start_state_machine(int blocking, int file_des); int start_acquisition(int); int stop_acquisition(int); int get_run_status(int); diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index b20a26981..d2b6c5d56 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -710,20 +710,8 @@ int get_image_test_mode(int file_des) { return Server_SendResult(file_des, INT32, &retval, sizeof(retval)); } -int set_dac(int file_des) { - ret = OK; - memset(mess, 0, sizeof(mess)); - int args[3] = {-1, -1, -1}; - int retval = -1; - - if (receiveData(file_des, args, sizeof(args), INT32) < 0) - return printSocketReadError(); - - enum dacIndex ind = args[0]; - int mV = args[1]; - int val = args[2]; +enum DACINDEX getDACIndex(enum dacIndex ind) { enum DACINDEX serverDacIndex = 0; - // check if dac exists for this detector switch (ind) { #ifdef GOTTHARDD @@ -1000,6 +988,22 @@ int set_dac(int file_des) { modeNotImplemented("Dac Index", (int)ind); break; } + return serverDacIndex; +} + +int set_dac(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + int args[3] = {-1, -1, -1}; + int retval = -1; + + if (receiveData(file_des, args, sizeof(args), INT32) < 0) + return printSocketReadError(); + + enum dacIndex ind = args[0]; + int mV = args[1]; + int val = args[2]; + enum DACINDEX serverDacIndex = getDACIndex(ind); // index exists if (ret == OK) { @@ -1647,11 +1651,14 @@ int get_threshold_energy(int file_des) { return Server_SendResult(file_des, INT32, &retval, sizeof(retval)); } -int start_acquisition(int file_des) { +int start_state_machine(int blocking, int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); - - LOG(logDEBUG1, ("Starting Acquisition\n")); + if (blocking) { + LOG(logINFOBLUE, ("Blocking Acquisition\n")); + } else { + LOG(logINFOBLUE, ("Unblocking Acquisition\n")); + } // only set if (Server_VerifyLock() == OK) { #if defined(MOENCHD) @@ -1723,21 +1730,27 @@ int start_acquisition(int file_des) { } for (int i = 0; i != times; ++i) { if (scanTrimbits) { + LOG(logINFOBLUE, ("Trimbits scan %d/%d: [%d]\n", i, times, + scanSteps[i])); #ifdef EIGERD setAllTrimbits(scanSteps[i]); #else LOG(logERROR, ("trimbit scan not implemented!\n")); #endif - } else { - setDac(scanDac, scanSteps[i], 0); + } else if (numScanSteps > 0) { + LOG(logINFOBLUE, ("Dac [%d] scan %d/%d: [%d]\n", scanDac, i, + times, scanSteps[i])); + setDAC(scanDac, scanSteps[i], 0); int retval = getDAC(scanDac, 0); - if (abs(retval - val) > 5) { + if (abs(retval - scanSteps[i]) > 5) { ret = FAIL; sprintf(mess, "Setting dac %d : wrote %d but read %d\n", - dacIndex, scanSteps[i], retval); + scanDac, scanSteps[i], scanSteps[i]); LOG(logERROR, (mess)); break; } + } else { + LOG(logINFOBLUE, ("Normal Acquisition (not scan)\n")); } ret = startStateMachine(); if (ret == FAIL) { @@ -1752,6 +1765,10 @@ int start_acquisition(int file_des) { LOG(logERROR, (mess)); break; } + // blocking or scan + if (blocking || times > 1) { + readFrame(&ret, mess); + } } } LOG(logDEBUG2, ("Starting Acquisition ret: %d\n", ret)); @@ -1759,6 +1776,8 @@ int start_acquisition(int file_des) { return Server_SendResult(file_des, INT32, NULL, 0); } +int start_acquisition(int file_des) { return start_state_machine(0, file_des); } + int stop_acquisition(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); @@ -1789,98 +1808,7 @@ int get_run_status(int file_des) { } int start_and_read_all(int file_des) { - ret = OK; - memset(mess, 0, sizeof(mess)); - - LOG(logDEBUG1, ("Starting Acquisition and read all frames\n")); - // start state machine - LOG(logDEBUG1, ("Starting Acquisition\n")); - // only set - if (Server_VerifyLock() == OK) { -#if defined(MOENCHD) - if (getNumAnalogSamples() <= 0) { - ret = FAIL; - sprintf(mess, - "Could not start acquisition. Invalid number of analog " - "samples: %d.\n", - getNumAnalogSamples()); - LOG(logERROR, (mess)); - } else -#endif -#if defined(CHIPTESTBOARDD) - if ((getReadoutMode() == ANALOG_AND_DIGITAL || - getReadoutMode() == ANALOG_ONLY) && - (getNumAnalogSamples() <= 0)) { - ret = FAIL; - sprintf(mess, - "Could not start acquisition. Invalid number of analog " - "samples: %d.\n", - getNumAnalogSamples()); - LOG(logERROR, (mess)); - } else if ((getReadoutMode() == ANALOG_AND_DIGITAL || - getReadoutMode() == DIGITAL_ONLY) && - (getNumDigitalSamples() <= 0)) { - ret = FAIL; - sprintf(mess, - "Could not start acquisition. Invalid number of digital " - "samples: %d.\n", - getNumDigitalSamples()); - LOG(logERROR, (mess)); - } else -#endif -#ifdef EIGERD - // check for hardware mac and hardware ip - if (udpDetails.srcmac != getDetectorMAC()) { - ret = FAIL; - uint64_t sourcemac = getDetectorMAC(); - char src_mac[50]; - getMacAddressinString(src_mac, 50, 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.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 -#endif - if (configured == FAIL) { - ret = FAIL; - strcpy(mess, "Could not start acquisition because "); - strcat(mess, configureMessage); - LOG(logERROR, (mess)); - } else { - ret = startStateMachine(); - if (ret == FAIL) { -#if defined(VIRTUAL) || defined(CHIPTESTBOARDD) || defined(MOENCHD) - sprintf(mess, - "Could not start acquisition. Could not create udp " - "socket in server. Check udp_dstip & udp_dstport.\n"); -#else - sprintf(mess, "Could not start acquisition\n"); -#endif - LOG(logERROR, (mess)); - } - } - LOG(logDEBUG2, ("Starting Acquisition ret: %d\n", ret)); - } - - // lock or acquisition start error - if (ret == FAIL) - return Server_SendResult(file_des, INT32, NULL, 0); - - // read all (again validate lock, but should pass and not fail) - return read_all(file_des); + return start_state_machine(1, file_des); } int read_all(int file_des) { @@ -7542,7 +7470,8 @@ int disable_scan(int file_des) { free(scanSteps); scanSteps = NULL; } - setNumFrames(1); + int64_t arg = 1; + setNumFrames(arg); int64_t retval = getNumFrames(); LOG(logDEBUG1, ("retval num frames %lld\n", (long long int)retval)); validate64(arg, retval, "set number of frames", DEC); @@ -7564,89 +7493,125 @@ int enable_scan(int file_des) { int endOffset = args[2]; int stepSize = args[3]; scanTrimbits = 0; - // trimbit scan - if (args[0] == TRIMBIT_SCAN) { -#ifdef EIGERD - if (startOffset < 0 || startOffset > MAX_TRIMBITS_VALUE || - endOffset < 0 || endOffset > MAX_TRIMBITS_VALUE) { - ret = FAIL; - sprintf(mess, "Invalid trimbits scan values\n"); - LOG(logERROR, (mess)); - } else { - scanTrimbits = 1; - // changes settings to undefined - setSettings(UNDEFINED); - LOG(logERROR, - ("Settings has been changed to undefined (change all " - "trimbits)\n")); - } -#else + + if ((startOffset < endOffset && stepSize <= 0) || + (endOffset < startOffset && stepSize >= 0)) { ret = FAIL; - sprintf(mess, "Cannot enable trimbit scan. Not implemented for " - "this detector\n"); + sprintf(mess, "Invalid scan parameters\n"); LOG(logERROR, (mess)); -#endif } else { - ret = converttodac(args[0], &scanDac); - if (ret == FAIL) { - sprintf(mess, - "Cannot enable scan. Dac index %d not implemented for " - "this detector\n", - args[0]); - LOG(logERROR, (mess)); - } else if (startOffset < 0 || startOffset > getMaxDacSteps() || - endOffset < 0 || endOffset > getMaxDacSteps()) { - ret = FAIL; - sprintf(mess, "Invalid dac scan values\n"); - LOG(logERROR, (mess)); - } -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) - else if (checkVLimitDacCompliant(startOffset) == FAIL || - checkVLimitDacCompliant(endOffset) == FAIL) { - ret = FAIL; - sprintf(mess, - "Invalid scan dac values." - "Exceeds voltage limit %d.\n", - getVLimit()); - LOG(logERROR, (mess)); - } -#endif + // trimbit scan + if (args[0] == TRIMBIT_SCAN) { #ifdef EIGERD - if (ret == OK) { - // changing dac changes settings to undefined - switch (scanDac) { - case E_VCMP_LL: - case E_VCMP_LR: - case E_VCMP_RL: - case E_VCMP_RR: - case E_VRPREAMP: - case E_VCP: + if (startOffset < 0 || startOffset > MAX_TRIMBITS_VALUE || + endOffset < 0 || endOffset > MAX_TRIMBITS_VALUE) { + ret = FAIL; + sprintf(mess, "Invalid trimbits scan values\n"); + LOG(logERROR, (mess)); + } else { + scanTrimbits = 1; + LOG(logINFOBLUE, ("Trimbit scan enabled\n")); + // changes settings to undefined setSettings(UNDEFINED); - LOG(logERROR, ("Settings has been changed " - "to undefined (changed specific dacs)\n")); + LOG(logERROR, + ("Settings has been changed to undefined (change all " + "trimbits)\n")); + } +#else + ret = FAIL; + sprintf(mess, "Cannot enable trimbit scan. Not implemented for " + "this detector\n"); + LOG(logERROR, (mess)); +#endif + } else { + switch ((enum dacIndex)args[0]) { + case HIGH_VOLTAGE: +#ifdef EIGERD + case IO_DELAY: +#elif CHIPTESTBOARDD + case ADC_VPP: + case V_POWER_A: + case V_POWER_B: + case V_POWER_C: + case V_POWER_D: + case V_POWER_IO: + case V_POWER_CHIP: + case V_LIMIT: +#elif MOENCHD + case ADC_VPP: + case V_LIMIT: +#endif + modeNotImplemented("Scan Dac Index", args[0]); break; default: break; } - } + scanDac = getDACIndex(args[0]); + if (ret == FAIL) { + sprintf( + mess, + "Cannot enable scan. Dac index %d not implemented for " + "this detector for scanning\n", + args[0]); + LOG(logERROR, (mess)); + } else if (startOffset < 0 || startOffset > getMaxDacSteps() || + endOffset < 0 || endOffset > getMaxDacSteps()) { + ret = FAIL; + sprintf(mess, "Invalid dac scan values\n"); + LOG(logERROR, (mess)); + } +#if defined(CHIPTESTBOARDD) || defined(MOENCHD) + else if (checkVLimitDacCompliant(startOffset) == FAIL || + checkVLimitDacCompliant(endOffset) == FAIL) { + ret = FAIL; + sprintf(mess, + "Invalid scan dac values." + "Exceeds voltage limit %d.\n", + getVLimit()); + LOG(logERROR, (mess)); + } #endif + if (ret == OK) { +#ifdef EIGERD + // changing dac changes settings to undefined + switch (scanDac) { + case E_VCMP_LL: + case E_VCMP_LR: + case E_VCMP_RL: + case E_VCMP_RR: + case E_VRPREAMP: + case E_VCP: + setSettings(UNDEFINED); + LOG(logERROR, + ("Settings has been changed " + "to undefined (changed specific dacs)\n")); + break; + default: + break; + } +#endif + LOG(logINFOBLUE, ("Dac [%d] scan enabled\n", scanDac)); + } + } } if (ret == OK) { scan = 1; - numScanSteps = ((startOffset - endOffset) / stepSize) + 1; + numScanSteps = (abs(endOffset - startOffset) / abs(stepSize)) + 1; if (scanSteps != NULL) { free(scanSteps); } scanSteps = malloc(numScanSteps * sizeof(int)); for (int i = 0; i != numScanSteps; ++i) { scanSteps[i] = startOffset + i * stepSize; + LOG(logDEBUG1, ("scansteps[%d]:%d\n", i, scanSteps[i])); } LOG(logINFOBLUE, ("Enabling scan for dac[%d], start[%d], end[%d], " "stepsize[%d], nsteps[%d]\n", - ind, startOffset, endOffset, stepSize, numScanSteps)); - setNumFrames(1); + scanDac, startOffset, endOffset, stepSize, numScanSteps)); + int64_t arg = 1; + setNumFrames(arg); int64_t retval = getNumFrames(); LOG(logDEBUG1, ("retval num frames %lld\n", (long long int)retval)); validate64(arg, retval, "set number of frames", DEC); diff --git a/slsDetectorSoftware/src/CmdProxy.cpp b/slsDetectorSoftware/src/CmdProxy.cpp index 05274d7ff..bfbafacb9 100644 --- a/slsDetectorSoftware/src/CmdProxy.cpp +++ b/slsDetectorSoftware/src/CmdProxy.cpp @@ -997,8 +997,10 @@ std::string CmdProxy::Scan(int action) { if (action == defs::HELP_ACTION) { os << "[dac_name|0|trimbit_scan] [start_val] [stop_val] " "[step_size]\n\tConfigures to scan " - "dac. Must acquire after this. To cancel the scan configuration " - "set dac to '0' without further arguments." + "dac and sets number of frames to number of steps. Must acquire " + "after this. To cancel the scan configuration " + "set dac to '0' without further arguments. This also sets number " + "of frames back to 1." "\n\t[Eiger]Use trimbit_scan as dac name for a trimbit scan." << '\n'; } else if (action == defs::GET_ACTION) { @@ -1014,12 +1016,12 @@ std::string CmdProxy::Scan(int action) { } else if (args.size() != 4) { WrongNumberOfParameters(4); } else { - auto t = det->enableScan( - StringTo(args[0]), StringTo(args[1]), - StringTo(args[2]), StringTo(args[3])); - auto nsteps = det->getNumScanSteps().tsquash( + det->enableScan(StringTo(args[0]), + StringTo(args[1]), StringTo(args[2]), + StringTo(args[3])); + auto nsteps = det->getNumberOfScanSteps().tsquash( "inconsistent number of scan steps"); - os << "scan enabled for " << nsteps << "steps" << '\n'; + os << "scan enabled for " << nsteps << " steps" << '\n'; } } else { throw sls::RuntimeError("Unknown action"); diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index eeb01c040..683c7212e 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -562,25 +562,26 @@ void Detector::sendSoftwareTrigger(Positions pos) { pimpl->Parallel(&Module::sendSoftwareTrigger, pos); } -Result getScan(Positions pos = {}) const { +Result Detector::getScan(Positions pos) const { return pimpl->Parallel(&Module::getScan, pos); } -Result getNumberOfScanSteps(Positions pos = {}) const { +Result Detector::getNumberOfScanSteps(Positions pos) const { return pimpl->Parallel(&Module::getNumberOfScanSteps, pos); } -void disableScan() { - pimpl->Parallel(&Module::disableScan); +void Detector::disableScan() { + pimpl->Parallel(&Module::disableScan, {}); setNumberOfFrames(1); } void Detector::enableScan(const defs::dacIndex dac, const int start_offset, const int end_offset, const int step_size) { - pimpl->Parallel(&Module::scan, start_offset, end_offset, step_size, {-1}); + pimpl->Parallel(&Module::enableScan, {}, dac, start_offset, end_offset, + step_size); auto t = getNumberOfScanSteps().tsquash("inconsistent number of scan steps"); - setNumberOfFrames(nsteps); + setNumberOfFrames(t); } // Network Configuration (Detector<->Receiver) diff --git a/slsDetectorSoftware/src/Module.cpp b/slsDetectorSoftware/src/Module.cpp index 48c7d1939..d4062e7d6 100644 --- a/slsDetectorSoftware/src/Module.cpp +++ b/slsDetectorSoftware/src/Module.cpp @@ -451,11 +451,11 @@ void Module::setStartingFrameNumber(uint64_t value) { void Module::sendSoftwareTrigger() { sendToDetectorStop(F_SOFTWARE_TRIGGER); } -bool Module::getScan() const { +bool Module::getScan() { return static_cast(sendToDetector(F_GET_SCAN)); } -int Module::getNumberOfScanSteps() const { +int Module::getNumberOfScanSteps() { return sendToDetector(F_GET_NUM_SCAN_STEPS); } diff --git a/slsDetectorSoftware/src/Module.h b/slsDetectorSoftware/src/Module.h index 18496839a..0e271cbc1 100644 --- a/slsDetectorSoftware/src/Module.h +++ b/slsDetectorSoftware/src/Module.h @@ -167,8 +167,8 @@ class Module : public virtual slsDetectorDefs { uint64_t getStartingFrameNumber(); void setStartingFrameNumber(uint64_t value); void sendSoftwareTrigger(); - bool getScan() const; - int getNumberOfScanSteps() const; + bool getScan(); + int getNumberOfScanSteps(); void disableScan(); void enableScan(const defs::dacIndex dac, const int start_offset, const int end_offset, const int step_size);