From 5a69c60205838711703b8f8ba13b64a44d8f4af0 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 28 Jan 2022 11:32:27 +0100 Subject: [PATCH] added nextframenumber for moench, ctb (also for virtual servers) --- RELEASE.txt | 1 + python/slsdet/detector.py | 2 +- .../ctbDetectorServer/RegisterDefs.h | 8 ++--- .../slsDetectorFunctionList.c | 29 ++++++++++++---- .../slsDetectorServer_defs.h | 33 ++++++++++--------- .../moenchDetectorServer/RegisterDefs.h | 8 ++--- .../slsDetectorFunctionList.c | 30 +++++++++++++---- .../slsDetectorServer_defs.h | 27 ++++++++------- .../include/slsDetectorFunctionList.h | 3 +- .../src/slsDetectorServer_funcs.c | 22 ++++++++----- slsDetectorSoftware/include/sls/Detector.h | 6 ++-- slsDetectorSoftware/src/CmdProxy.h | 11 ++++--- 12 files changed, 110 insertions(+), 70 deletions(-) diff --git a/RELEASE.txt b/RELEASE.txt index 20e2d0fcb..ac8c2595a 100755 --- a/RELEASE.txt +++ b/RELEASE.txt @@ -26,6 +26,7 @@ This document describes the differences between v6.1.0 and v6.0.0. - refactoring (rxr) - fixed patsetbit and patsetmask for moench - changed default vref of adc9257 to 2V for moench (from 1.33V) +- moench and ctb - can set the starting frame number of next acquisition diff --git a/python/slsdet/detector.py b/python/slsdet/detector.py index 7b1652f2f..0a16ab8b0 100755 --- a/python/slsdet/detector.py +++ b/python/slsdet/detector.py @@ -594,7 +594,7 @@ class Detector(CppDetectorApi): @property @element def nextframenumber(self): - """[Eiger][Jungfrau] Next frame number. Stopping acquisition might result in different frame numbers for different modules. """ + """[Eiger][Jungfrau][Moench][CTB] Next frame number. Stopping acquisition might result in different frame numbers for different modules. """ return self.getNextFrameNumber() @nextframenumber.setter diff --git a/slsDetectorServers/ctbDetectorServer/RegisterDefs.h b/slsDetectorServers/ctbDetectorServer/RegisterDefs.h index ce7fa1337..0815d185f 100644 --- a/slsDetectorServers/ctbDetectorServer/RegisterDefs.h +++ b/slsDetectorServers/ctbDetectorServer/RegisterDefs.h @@ -165,11 +165,9 @@ #define PATTERN_OUT_LSB_REG (0x20 << MEM_MAP_SHIFT) #define PATTERN_OUT_MSB_REG (0x21 << MEM_MAP_SHIFT) -/* Frames From Start 64 bit RO register TODO */ -//#define FRAMES_FROM_START_LSB_REG (0x22 << MEM_MAP_SHIFT) // Not -// used in FW #define FRAMES_FROM_START_MSB_REG (0x23 << -// MEM_MAP_SHIFT) -//// Not used in FW +/* Frame number of next acquisition register (64 bit register) */ +#define NEXT_FRAME_NUMB_LOCAL_LSB_REG (0x22 << MEM_MAP_SHIFT) +#define NEXT_FRAME_NUMB_LOCAL_MSB_REG (0x23 << MEM_MAP_SHIFT) /* Frames From Start PG 64 bit RO register. Reset using CONTROL_CRST. TODO */ #define FRAMES_FROM_START_PG_LSB_REG (0x24 << MEM_MAP_SHIFT) diff --git a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c index 32a5241e0..a26d40f39 100644 --- a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c @@ -45,7 +45,6 @@ char initErrorMessage[MAX_STR_LENGTH]; #ifdef VIRTUAL pthread_t pthread_virtual_tid; -int64_t virtual_currentFrameNumber = 2; #endif // 1g readout @@ -898,6 +897,20 @@ int getReadoutMode() { } /* parameters - timer */ +int setNextFrameNumber(uint64_t value) { + LOG(logINFO, + ("Setting next frame number: %llu\n", (long long unsigned int)value)); + setU64BitReg(value, NEXT_FRAME_NUMB_LOCAL_LSB_REG, + NEXT_FRAME_NUMB_LOCAL_MSB_REG); + return OK; +} + +int getNextFrameNumber(uint64_t *retval) { + *retval = getU64BitReg(NEXT_FRAME_NUMB_LOCAL_LSB_REG, + NEXT_FRAME_NUMB_LOCAL_MSB_REG); + return OK; +} + void setNumFrames(int64_t val) { if (val > 0) { LOG(logINFO, ("Setting number of frames %lld\n", (long long int)val)); @@ -2000,11 +2013,14 @@ void *start_timer(void *arg) { } // Send data + uint64_t frameNr = 0; + getNextFrameNumber(&frameNr); // loop over number of frames - for (int frameNr = 0; frameNr != numFrames; ++frameNr) { + for (int iframes = 0; iframes != numFrames; ++iframes) { // check if manual stop if (sharedMemory_getStop() == 1) { + setNextFrameNumber(frameNr + iframes + 1); break; } @@ -2023,7 +2039,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 = virtual_currentFrameNumber; + header->frameNumber = frameNr + iframes; header->packetNumber = i; header->modId = 0; header->row = detPos[X]; @@ -2036,19 +2052,18 @@ void *start_timer(void *arg) { sendUDPPacket(0, 0, packetData, packetSize); } - LOG(logINFO, ("Sent frame: %d [%lld]\n", frameNr, - (long long unsigned int)virtual_currentFrameNumber)); + LOG(logINFO, ("Sent frame: %d [%lld]\n", iframes, frameNr + iframes)); 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 (iframes < numFrames) { // if there is a next frame if (periodNs > timeNs) { usleep((periodNs - timeNs) / 1000); } } - ++virtual_currentFrameNumber; + setNextFrameNumber(frameNr + numFrames); } closeUDPSocket(0); diff --git a/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h index 93d7569cb..0d8b15aaf 100644 --- a/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h @@ -108,21 +108,24 @@ enum CLKINDEX { RUN_CLK, ADC_CLK, SYNC_CLK, DBIT_CLK, NUM_CLOCKS }; #define I2C_SHUNT_RESISTER_OHMS (0.005) /** Default Parameters */ -#define DEFAULT_DATA_BYTES (NCHIP * NCHAN * NUM_BITS_PER_PIXEL) -#define DEFAULT_NUM_SAMPLES (1) -#define DEFAULT_NUM_FRAMES (1) -#define DEFAULT_EXPTIME (0) -#define DEFAULT_NUM_CYCLES (1) -#define DEFAULT_PERIOD (1 * 1000 * 1000) // ns -#define DEFAULT_DELAY (0) -#define DEFAULT_HIGH_VOLTAGE (0) -#define DEFAULT_VLIMIT (-100) -#define DEFAULT_TIMING_MODE (AUTO_TIMING) -#define DEFAULT_TX_UDP_PORT (0x7e9a) -#define DEFAULT_RUN_CLK (200) // 40 -#define DEFAULT_ADC_CLK (40) // 20 -#define DEFAULT_SYNC_CLK (40) // 20 -#define DEFAULT_DBIT_CLK (200) +#define DEFAULT_DATA_BYTES (NCHIP * NCHAN * NUM_BITS_PER_PIXEL) +#define DEFAULT_STARTING_FRAME_NUMBER (1) +#define DEFAULT_NUM_SAMPLES (1) +#define DEFAULT_NUM_FRAMES (1) +#define DEFAULT_EXPTIME (0) +#define DEFAULT_NUM_CYCLES (1) +#define DEFAULT_PERIOD (1 * 1000 * 1000) // ns +#define DEFAULT_DELAY (0) +#define DEFAULT_HIGH_VOLTAGE (0) +#define DEFAULT_VLIMIT (-100) +#define DEFAULT_TIMING_MODE (AUTO_TIMING) +#define DEFAULT_TX_UDP_PORT (0x7e9a) +#define DEFAULT_RUN_CLK (200) // 40 +#define DEFAULT_ADC_CLK (40) // 20 +#define DEFAULT_SYNC_CLK (40) // 20 +#define DEFAULT_DBIT_CLK (200) + +#define UDP_HEADER_MAX_FRAME_VALUE (0xFFFFFFFFFFFF) #define HIGHVOLTAGE_MIN (60) #define HIGHVOLTAGE_MAX (200) // min dac val diff --git a/slsDetectorServers/moenchDetectorServer/RegisterDefs.h b/slsDetectorServers/moenchDetectorServer/RegisterDefs.h index 26718e885..14f8c9c40 100644 --- a/slsDetectorServers/moenchDetectorServer/RegisterDefs.h +++ b/slsDetectorServers/moenchDetectorServer/RegisterDefs.h @@ -165,11 +165,9 @@ #define PATTERN_OUT_LSB_REG (0x20 << MEM_MAP_SHIFT) #define PATTERN_OUT_MSB_REG (0x21 << MEM_MAP_SHIFT) -/* Frames From Start 64 bit RO register TODO */ -//#define FRAMES_FROM_START_LSB_REG (0x22 << MEM_MAP_SHIFT) // Not -// used in FW #define FRAMES_FROM_START_MSB_REG (0x23 << -// MEM_MAP_SHIFT) -//// Not used in FW +/* Frame number of next acquisition register (64 bit register) */ +#define NEXT_FRAME_NUMB_LOCAL_LSB_REG (0x22 << MEM_MAP_SHIFT) +#define NEXT_FRAME_NUMB_LOCAL_MSB_REG (0x23 << MEM_MAP_SHIFT) /* Frames From Start PG 64 bit RO register. Reset using CONTROL_CRST. TODO */ #define FRAMES_FROM_START_PG_LSB_REG (0x24 << MEM_MAP_SHIFT) diff --git a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c index 9506e619f..883eb231b 100644 --- a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c @@ -43,7 +43,6 @@ char initErrorMessage[MAX_STR_LENGTH]; #ifdef VIRTUAL pthread_t pthread_virtual_tid; -int64_t virtual_currentFrameNumber = 2; #endif // 1g readout @@ -569,6 +568,7 @@ void setupDetector() { setFrequency(ADC_CLK, DEFAULT_ADC_CLK); setFrequency(DBIT_CLK, DEFAULT_DBIT_CLK); setPhase(ADC_CLK, DEFAULT_ADC_PHASE_DEG, 1); + setNextFrameNumber(DEFAULT_STARTING_FRAME_NUMBER); } int updateDatabytesandAllocateRAM() { @@ -800,6 +800,20 @@ uint32_t getADCInvertRegister() { } /* parameters - timer */ +int setNextFrameNumber(uint64_t value) { + LOG(logINFO, + ("Setting next frame number: %llu\n", (long long unsigned int)value)); + setU64BitReg(value, NEXT_FRAME_NUMB_LOCAL_LSB_REG, + NEXT_FRAME_NUMB_LOCAL_MSB_REG); + return OK; +} + +int getNextFrameNumber(uint64_t *retval) { + *retval = getU64BitReg(NEXT_FRAME_NUMB_LOCAL_LSB_REG, + NEXT_FRAME_NUMB_LOCAL_MSB_REG); + return OK; +} + void setNumFrames(int64_t val) { if (val > 0) { LOG(logINFO, ("Setting number of frames %lld\n", (long long int)val)); @@ -1664,11 +1678,14 @@ void *start_timer(void *arg) { } // Send data + uint64_t frameNr = 0; + getNextFrameNumber(&frameNr); // loop over number of frames - for (int frameNr = 0; frameNr != numFrames; ++frameNr) { + for (int iframes = 0; iframes != numFrames; ++iframes) { // check if manual stop if (sharedMemory_getStop() == 1) { + setNextFrameNumber(frameNr + iframes + 1); break; } @@ -1686,7 +1703,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 = virtual_currentFrameNumber; + header->frameNumber = frameNr + iframes; header->packetNumber = i; header->modId = 0; header->row = detPos[X]; @@ -1699,19 +1716,18 @@ void *start_timer(void *arg) { sendUDPPacket(0, 0, packetData, packetSize); } - LOG(logINFO, ("Sent frame: %d [%lld]\n", frameNr, - (long long unsigned int)virtual_currentFrameNumber)); + LOG(logINFO, ("Sent frame: %d [%lld]\n", iframes, frameNr + iframes)); 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 (iframes < numFrames) { // if there is a next frame if (periodNs > timeNs) { usleep((periodNs - timeNs) / 1000); } } - ++virtual_currentFrameNumber; + setNextFrameNumber(frameNr + numFrames); } closeUDPSocket(0); diff --git a/slsDetectorServers/moenchDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/moenchDetectorServer/slsDetectorServer_defs.h index 4a1635b9b..5dfed1929 100644 --- a/slsDetectorServers/moenchDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/moenchDetectorServer/slsDetectorServer_defs.h @@ -78,18 +78,19 @@ enum CLKINDEX { RUN_CLK, ADC_CLK, SYNC_CLK, DBIT_CLK, NUM_CLOCKS }; #define NCHANS_PER_ADC (25) /** Default Parameters */ -#define DEFAULT_PATTERN_FILE ("DefaultPattern_moench.txt") -#define DEFAULT_DATA_BYTES (NCHIP * NCHAN * NUM_BITS_PER_PIXEL) -#define DEFAULT_NUM_SAMPLES (5000) -#define DEFAULT_EXPTIME (0) -#define DEFAULT_NUM_FRAMES (1) -#define DEFAULT_NUM_CYCLES (1) -#define DEFAULT_PERIOD (1 * 1000 * 1000) // ns -#define DEFAULT_DELAY (0) -#define DEFAULT_HIGH_VOLTAGE (0) -#define DEFAULT_VLIMIT (-100) -#define DEFAULT_TIMING_MODE (AUTO_TIMING) -#define DEFAULT_TX_UDP_PORT (0x7e9a) +#define DEFAULT_PATTERN_FILE ("DefaultPattern_moench.txt") +#define DEFAULT_STARTING_FRAME_NUMBER (1) +#define DEFAULT_DATA_BYTES (NCHIP * NCHAN * NUM_BITS_PER_PIXEL) +#define DEFAULT_NUM_SAMPLES (5000) +#define DEFAULT_EXPTIME (0) +#define DEFAULT_NUM_FRAMES (1) +#define DEFAULT_NUM_CYCLES (1) +#define DEFAULT_PERIOD (1 * 1000 * 1000) // ns +#define DEFAULT_DELAY (0) +#define DEFAULT_HIGH_VOLTAGE (0) +#define DEFAULT_VLIMIT (-100) +#define DEFAULT_TIMING_MODE (AUTO_TIMING) +#define DEFAULT_TX_UDP_PORT (0x7e9a) #define DEFAULT_RUN_CLK_AT_STARTUP (200) // 40 #define DEFAULT_ADC_CLK_AT_STARTUP (40) // 20 @@ -104,6 +105,8 @@ enum CLKINDEX { RUN_CLK, ADC_CLK, SYNC_CLK, DBIT_CLK, NUM_CLOCKS }; #define DEFAULT_PIPELINE (15) #define DEFAULT_SETTINGS (G4_HIGHGAIN) +#define UDP_HEADER_MAX_FRAME_VALUE (0xFFFFFFFFFFFF) + // settings #define DEFAULT_PATMASK (0x00000C800000800AULL) #define G1_HIGHGAIN_PATSETBIT (0x00000C0000008008ULL) diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index a868f46a4..955f35e6b 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -213,7 +213,8 @@ int getReadoutMode(); int selectStoragecellStart(int pos); int getMaxStoragecellStart(); #endif -#if defined(JUNGFRAUD) || defined(EIGERD) +#if defined(JUNGFRAUD) || defined(EIGERD) || defined(MOENCHD) || \ + defined(CHIPTESTBOARDD) int setNextFrameNumber(uint64_t value); int getNextFrameNumber(uint64_t *value); #endif diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index a76b7e5e0..c90d21828 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -4413,7 +4413,8 @@ int set_next_frame_number(int file_des) { return printSocketReadError(); LOG(logINFO, ("Setting next frame number to %llu\n", arg)); -#if (!defined(EIGERD)) && (!defined(JUNGFRAUD)) +#if (!defined(EIGERD)) && (!defined(JUNGFRAUD)) && (!defined(MOENCHD)) && \ + (!defined(CHIPTESTBOARDD)) functionNotImplemented(); #else // only set @@ -4423,7 +4424,7 @@ int set_next_frame_number(int file_des) { sprintf(mess, "Could not set next frame number. Cannot be 0.\n"); LOG(logERROR, (mess)); } -#ifdef EIGERD +#if (defined(EIGERD)) || (defined(MOENCHD)) || (defined(CHIPTESTBOARDD)) else if (arg > UDP_HEADER_MAX_FRAME_VALUE) { ret = FAIL; #ifdef VIRTUAL @@ -4443,16 +4444,18 @@ int set_next_frame_number(int file_des) { else { ret = setNextFrameNumber(arg); if (ret == FAIL) { - sprintf(mess, "Could not set next frame number. Failed to " - "map address.\n"); + sprintf( + mess, "Could not set next frame number. %s\n", + (myDetectorType == EIGER ? "Failed to map address" : "")); LOG(logERROR, (mess)); } if (ret == OK) { uint64_t retval = 0; ret = getNextFrameNumber(&retval); if (ret == FAIL) { - sprintf(mess, "Could not get next frame number. Failed " - "to map address.\n"); + sprintf(mess, "Could not set next frame number. %s\n", + (myDetectorType == EIGER ? "Failed to map address" + : "")); LOG(logERROR, (mess)); } else if (ret == -2) { sprintf(mess, "Inconsistent next frame number from " @@ -4489,14 +4492,15 @@ int get_next_frame_number(int file_des) { LOG(logDEBUG1, ("Getting next frame number \n")); -#if (!defined(EIGERD)) && (!defined(JUNGFRAUD)) +#if (!defined(EIGERD)) && (!defined(JUNGFRAUD)) && (!defined(MOENCHD)) && \ + (!defined(CHIPTESTBOARDD)) functionNotImplemented(); #else // get ret = getNextFrameNumber(&retval); if (ret == FAIL) { - sprintf(mess, "Could not get next frame number. Failed to map " - "address.\n"); + sprintf(mess, "Could not set next frame number. %s\n", + (myDetectorType == EIGER ? "Failed to map address" : "")); LOG(logERROR, (mess)); } else if (ret == -2) { sprintf(mess, "Inconsistent next frame number from left and right " diff --git a/slsDetectorSoftware/include/sls/Detector.h b/slsDetectorSoftware/include/sls/Detector.h index 5de20a3eb..bc62319e8 100644 --- a/slsDetectorSoftware/include/sls/Detector.h +++ b/slsDetectorSoftware/include/sls/Detector.h @@ -594,11 +594,11 @@ class Detector { Result> getNumMissingPackets(Positions pos = {}) const; - /** [Eiger][Jungfrau] */ + /** [Eiger][Jungfrau][Moench][CTB] */ Result getNextFrameNumber(Positions pos = {}) const; - /** [Eiger][Jungfrau] Stopping acquisition might result in different frame - * numbers for different modules.*/ + /** [Eiger][Jungfrau][Moench][CTB] Stopping acquisition might result in + * different frame numbers for different modules.*/ void setNextFrameNumber(uint64_t value, Positions pos = {}); /** [Eiger][Mythen3] Sends an internal software trigger to the detector diff --git a/slsDetectorSoftware/src/CmdProxy.h b/slsDetectorSoftware/src/CmdProxy.h index ba87f3514..673fd5fd8 100644 --- a/slsDetectorSoftware/src/CmdProxy.h +++ b/slsDetectorSoftware/src/CmdProxy.h @@ -1537,11 +1537,12 @@ class CmdProxy { GET_COMMAND(rx_missingpackets, getNumMissingPackets, "\n\tNumber of missing packets for each port in receiver."); - INTEGER_COMMAND_VEC_ID(nextframenumber, getNextFrameNumber, - setNextFrameNumber, StringTo, - "[n_value]\n\t[Eiger][Jungfrau] Next frame number. " - "Stopping acquisition might result in " - "different frame numbers for different modules."); + INTEGER_COMMAND_VEC_ID( + nextframenumber, getNextFrameNumber, setNextFrameNumber, + StringTo, + "[n_value]\n\t[Eiger][Jungfrau][Moench][CTB] Next frame number. " + "Stopping acquisition might result in different frame numbers for " + "different modules."); GET_COMMAND(scanerrmsg, getScanErrorMessage, "\n\tGets Scan error message if scan ended in error for non "