From d72b6c365914458771f48573ae0f67a0770a0345 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil <33750417+thattil@users.noreply.github.com> Date: Tue, 6 Aug 2019 10:12:34 +0200 Subject: [PATCH] eiger server: quad, interrupt subframe, reg left and right (#45) * eiger server: quad, interrupt subframe, reg left and right * eiger server: beb can fail in setting up quad, quad and gap pixels --- slsDetectorGui/src/qDrawPlot.cpp | 2 +- slsDetectorServers/eigerDetectorServer/Beb.c | 11 +- slsDetectorServers/eigerDetectorServer/Beb.h | 2 +- .../eigerDetectorServer/FebControl.c | 208 +++++++++++++----- .../eigerDetectorServer/FebControl.h | 8 +- .../eigerDetectorServer/FebRegisterDefs.h | 10 +- .../bin/eigerDetectorServer_developer | Bin 293851 -> 298233 bytes .../slsDetectorFunctionList.c | 50 ++++- .../slsDetectorServer_defs.h | 2 +- .../slsDetectorFunctionList.h | 8 +- .../slsDetectorServer_funcs.c | 93 +++++++- .../slsDetectorServer_funcs.h | 4 +- .../include/multiSlsDetector.h | 14 ++ slsDetectorSoftware/include/slsDetector.h | 12 + slsDetectorSoftware/src/multiSlsDetector.cpp | 21 ++ slsDetectorSoftware/src/slsDetector.cpp | 15 ++ .../src/slsDetectorCommand.cpp | 20 +- slsReceiverSoftware/include/DataProcessor.h | 6 +- slsReceiverSoftware/include/GeneralData.h | 10 +- .../include/slsReceiverImplementation.h | 3 +- slsReceiverSoftware/src/DataProcessor.cpp | 39 ++-- .../src/slsReceiverImplementation.cpp | 19 +- .../src/slsReceiverTCPIPInterface.cpp | 5 +- slsSupportLib/include/sls_detector_funcs.h | 4 + slsSupportLib/include/versionAPI.h | 2 +- 25 files changed, 463 insertions(+), 105 deletions(-) diff --git a/slsDetectorGui/src/qDrawPlot.cpp b/slsDetectorGui/src/qDrawPlot.cpp index 6558f3eee..2784f9e0a 100755 --- a/slsDetectorGui/src/qDrawPlot.cpp +++ b/slsDetectorGui/src/qDrawPlot.cpp @@ -90,7 +90,7 @@ void qDrawPlot::SetupPlots() { break; case slsDetectorDefs::EIGER: if (myDet->getQuad()) { - nPixelsX = myDet->getTotalNumberOfChannelsInclGapPixels(slsDetectorDefs::X) / 2; + nPixelsX = (myDet->getTotalNumberOfChannelsInclGapPixels(slsDetectorDefs::X) / 2) - 1; nPixelsY = myDet->getTotalNumberOfChannelsInclGapPixels(slsDetectorDefs::Y) * 2; } break; diff --git a/slsDetectorServers/eigerDetectorServer/Beb.c b/slsDetectorServers/eigerDetectorServer/Beb.c index 605b904ce..d3585e56d 100755 --- a/slsDetectorServers/eigerDetectorServer/Beb.c +++ b/slsDetectorServers/eigerDetectorServer/Beb.c @@ -1190,11 +1190,12 @@ void Beb_SetDetectorNumber(uint32_t detid) { FILE_LOG(logINFO, ("Detector id %d set in UDP Header\n\n", detid)); } -void Beb_SetQuad(int value) { - if (value >= 0) { - Beb_quadEnable = (value == 0 ? 0 : 1); - Beb_SetDetectorPosition(Beb_positions); - } +int Beb_SetQuad(int value) { + if (value < 0) + return OK; + FILE_LOG(logINFO, ("Setting Quad to %d in Beb\n", value)); + Beb_quadEnable = (value == 0 ? 0 : 1); + return Beb_SetDetectorPosition(Beb_positions); } int Beb_GetQuad() { diff --git a/slsDetectorServers/eigerDetectorServer/Beb.h b/slsDetectorServers/eigerDetectorServer/Beb.h index 36d2c0ca7..fd9b280c2 100755 --- a/slsDetectorServers/eigerDetectorServer/Beb.h +++ b/slsDetectorServers/eigerDetectorServer/Beb.h @@ -74,7 +74,7 @@ int Beb_Test(unsigned int beb_number); int Beb_GetBebFPGATemp(); void Beb_SetDetectorNumber(uint32_t detid); -void Beb_SetQuad(int value); +int Beb_SetQuad(int value); int Beb_GetQuad(); int Beb_SetDetectorPosition(int pos[]); int Beb_SetStartingFrameNumber(uint64_t value); diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.c b/slsDetectorServers/eigerDetectorServer/FebControl.c index 8babb7aa0..a66a540b0 100755 --- a/slsDetectorServers/eigerDetectorServer/FebControl.c +++ b/slsDetectorServers/eigerDetectorServer/FebControl.c @@ -2014,61 +2014,171 @@ int Feb_Control_SoftwareTrigger() { return 1; } +int Feb_Control_SetInterruptSubframe(int val) { + FILE_LOG(logINFO, ("Setting Interrupt Subframe to %d\n", val)); -uint32_t Feb_Control_WriteRegister(uint32_t offset, uint32_t data) { - uint32_t value=0; - if (Module_TopAddressIsValid(&modules[1])) { - if (!Feb_Interface_WriteRegister(Module_GetTopRightAddress (&modules[1]),offset, data,0, 0)) { - FILE_LOG(logERROR, ("Could not read tr value. Value read:%d\n", value)); - value = 0; + // they need to be written separately because the left and right registers have different values for this particular register + uint32_t offset = DAQ_REG_HRDWRE; + uint32_t regVal = 0; + char side[2][10] = {"right", "left"}; + char isTop[10]; strcpy(isTop, Module_TopAddressIsValid(&modules[1]) ? "top" : "bottom"); + unsigned int addr[2]; + addr[0] = Module_TopAddressIsValid(&modules[1]) ? Module_GetTopRightAddress (&modules[1]) : Module_GetBottomRightAddress (&modules[1]); + addr[1] = Module_TopAddressIsValid(&modules[1]) ? Module_GetTopLeftAddress (&modules[1]) : Module_GetBottomLeftAddress (&modules[1]); + + int iloop = 0; + for(iloop = 0; iloop < 2; ++iloop) { + // get previous value to keep it + if(!Feb_Interface_ReadRegister(addr[iloop], offset, ®Val)) { + FILE_LOG(logERROR, ("Could not read %s %s interrupt subframe\n", isTop, side[iloop])); + return 0; } - if(!Feb_Interface_WriteRegister(Module_GetTopLeftAddress (&modules[1]),offset, data,0, 0)) { - FILE_LOG(logERROR, ("Could not read tl value. Value read:%d\n", value)); - value = 0; - } - } else { - if (!Feb_Interface_WriteRegister(Module_GetBottomRightAddress (&modules[1]),offset, data,0, 0)) { - FILE_LOG(logERROR, ("Could not read br value. Value read:%d\n", value)); - value = 0; + uint32_t data = ((val == 0) ? (regVal &~ DAQ_REG_HRDWRE_INTRRPT_SF_MSK) : (regVal | DAQ_REG_HRDWRE_INTRRPT_SF_MSK)); + if(!Feb_Interface_WriteRegister(addr[iloop], offset, data, 0, 0)) { + FILE_LOG(logERROR, ("Could not write 0x%x to %s %s interrupt subframe addr 0x%x\n", data, isTop, side[iloop], offset)); + return 0; } - if(!Feb_Interface_WriteRegister(Module_GetBottomLeftAddress (&modules[1]),offset, data,0, 0)) { - FILE_LOG(logERROR, ("Could not read bl value. Value read:%d\n", value)); - value = 0; - } } - return Feb_Control_ReadRegister(offset); + return 1; +} + +int Feb_Control_GetInterruptSubframe() { + // they need to be written separately because the left and right registers have different values for this particular register + uint32_t offset = DAQ_REG_HRDWRE; + uint32_t regVal = 0; + + char side[2][10] = {"right", "left"}; + char isTop[10]; strcpy(isTop, Module_TopAddressIsValid(&modules[1]) ? "top" : "bottom"); + unsigned int addr[2]; + addr[0] = Module_TopAddressIsValid(&modules[1]) ? Module_GetTopRightAddress (&modules[1]) : Module_GetBottomRightAddress (&modules[1]); + addr[1] = Module_TopAddressIsValid(&modules[1]) ? Module_GetTopLeftAddress (&modules[1]) : Module_GetBottomLeftAddress (&modules[1]); + uint32_t value[2] = {0, 0}; + + int iloop = 0; + for(iloop = 0; iloop < 2; ++iloop) { + if(!Feb_Interface_ReadRegister(addr[iloop], offset, ®Val)) { + FILE_LOG(logERROR, ("Could not read back %s %s interrupt subframe\n", isTop, side[iloop])); + return -1; + } + value[iloop] = (regVal & DAQ_REG_HRDWRE_INTRRPT_SF_MSK) >> DAQ_REG_HRDWRE_INTRRPT_SF_OFST; + } + + // inconsistent + if (value[0] != value[1]) { + FILE_LOG(logERROR, ("Inconsistent values of interrupt subframe betweeen left %d and right %d\n", value[0], value[1])); + return -1; + } + return value[0]; +} + +int Feb_Control_SetQuad(int val) { + // no bottom for quad + if (!Module_TopAddressIsValid(&modules[1])) { + return 1; + } + uint32_t offset = DAQ_REG_HRDWRE; + FILE_LOG(logINFO, ("Setting Quad to %d in Feb\n", val)); + unsigned int addr = Module_GetTopRightAddress (&modules[1]); + uint32_t regVal = 0; + if(!Feb_Interface_ReadRegister(addr, offset, ®Val)) { + FILE_LOG(logERROR, ("Could not read top right quad reg\n")); + return 0; + } + uint32_t data = ((val == 0) ? (regVal &~ DAQ_REG_HRDWRE_OW_MSK) : ((regVal | DAQ_REG_HRDWRE_OW_MSK) &~ DAQ_REG_HRDWRE_TOP_MSK)); + if(!Feb_Interface_WriteRegister(addr, offset, data, 0, 0)) { + FILE_LOG(logERROR, ("Could not write 0x%x to top right quad addr 0x%x\n", data, offset)); + return 0; + } + return 1; } -uint32_t Feb_Control_ReadRegister(uint32_t offset) { - uint32_t value=0; - uint32_t value1=0; - if (Module_TopAddressIsValid(&modules[1])) { - if (!Feb_Interface_ReadRegister(Module_GetTopRightAddress (&modules[1]),offset, &value)) { - FILE_LOG(logERROR, ("Could not read value. Value read:%d\n", value)); - value = 0; - } - printf("Read top right addr: 0x%08x\n", value); - if(!Feb_Interface_ReadRegister(Module_GetTopLeftAddress (&modules[1]),offset, &value1)) { - FILE_LOG(logERROR, (RED,"Could not read value. Value read:%d\n", value1)); - value1 = 0; - } - printf("Read top left addr: 0x%08x\n", value1); - if (value != value1) - value = -1; - } else { - if (!Feb_Interface_ReadRegister(Module_GetBottomRightAddress (&modules[1]),offset, &value)) { - FILE_LOG(logERROR, ("Could not read value. Value read:%d\n", value)); - value = 0; - } - printf("Read bottom right addr: 0x%08x\n", value); - if(!Feb_Interface_ReadRegister(Module_GetBottomLeftAddress (&modules[1]),offset, &value1)) { - FILE_LOG(logERROR, (RED,"Could not read value. Value read:%d\n", value1)); - value1 = 0; - } - printf("Read bottom left addr: 0x%08x\n", value1); - if (value != value1) - value = -1; +int Feb_Control_WriteRegister(uint32_t offset, uint32_t data) { + uint32_t actualOffset = offset; + char side[2][10] = {"right", "left"}; + char isTop[10]; strcpy(isTop, Module_TopAddressIsValid(&modules[1]) ? "top" : "bottom"); + unsigned int addr[2]; + addr[0] = Module_TopAddressIsValid(&modules[1]) ? Module_GetTopRightAddress (&modules[1]) : Module_GetBottomRightAddress (&modules[1]); + addr[1] = Module_TopAddressIsValid(&modules[1]) ? Module_GetTopLeftAddress (&modules[1]) : Module_GetBottomLeftAddress (&modules[1]); + + int run[2] = {0, 0}; + // both registers + if (offset < 0x100) { + run[0] = 1; + run[1] = 1; + } + // right registers only + else if (offset >= 0x200) { + run[0] = 1; + actualOffset = offset - 0x200; + } + // left registers only + else { + run[1] = 1; + actualOffset = offset - 0x100; } - return value; + + int iloop = 0; + for(iloop = 0; iloop < 2; ++iloop) { + if(run[iloop]) { + FILE_LOG(logINFO, ("Writing 0x%x to %s %s 0x%x\n", data, isTop, side[iloop], actualOffset)); + if(!Feb_Interface_WriteRegister(addr[iloop],actualOffset, data, 0, 0)) { + FILE_LOG(logERROR, ("Could not write 0x%x to %s %s addr 0x%x\n", data, isTop, side[iloop], actualOffset)); + return 0; + } + } + } + + return 1; +} + + +int Feb_Control_ReadRegister(uint32_t offset, uint32_t* retval) { + uint32_t actualOffset = offset; + char side[2][10] = {"right", "left"}; + char isTop[10]; strcpy(isTop, Module_TopAddressIsValid(&modules[1]) ? "top" : "bottom"); + unsigned int addr[2]; + addr[0] = Module_TopAddressIsValid(&modules[1]) ? Module_GetTopRightAddress (&modules[1]) : Module_GetBottomRightAddress (&modules[1]); + addr[1] = Module_TopAddressIsValid(&modules[1]) ? Module_GetTopLeftAddress (&modules[1]) : Module_GetBottomLeftAddress (&modules[1]); + uint32_t value[2] = {0, 0}; + + int run[2] = {0, 0}; + // both registers + if (offset < 0x100) { + run[0] = 1; + run[1] = 1; + } + // right registers only + else if (offset >= 0x200) { + run[0] = 1; + actualOffset = offset - 0x200; + } + // left registers only + else { + run[1] = 1; + actualOffset = offset - 0x100; + } + + int iloop = 0; + for(iloop = 0; iloop < 2; ++iloop) { + if(run[iloop]) { + if(!Feb_Interface_ReadRegister(addr[iloop],actualOffset, &value[iloop])) { + FILE_LOG(logERROR, ("Could not read from %s %s addr 0x%x\n", isTop, side[iloop], actualOffset)); + return 0; + } + FILE_LOG(logINFO, ("Read 0x%x from %s %s 0x%x\n", value[iloop], isTop, side[iloop], actualOffset)); + *retval = value[iloop]; + // if not the other (left, not right OR right, not left), return the value + if (!run[iloop ? 0 : 1]) { + return 1; + } + } + } + + // Inconsistent values + if (value[0] != value[1]) { + FILE_LOG(logERROR, ("Inconsistent values read from left 0x%x and right 0x%x\n", value[0], value[1])); + return 0; + } + return 1; } diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.h b/slsDetectorServers/eigerDetectorServer/FebControl.h index 2e65666fd..dc46431d5 100755 --- a/slsDetectorServers/eigerDetectorServer/FebControl.h +++ b/slsDetectorServers/eigerDetectorServer/FebControl.h @@ -151,7 +151,11 @@ int64_t Feb_Control_GetMeasuredPeriod(); int64_t Feb_Control_GetSubMeasuredPeriod(); int Feb_Control_SoftwareTrigger(); +int Feb_Control_SetInterruptSubframe(int val); +int Feb_Control_GetInterruptSubframe(); +int Feb_Control_SetQuad(int val); -uint32_t Feb_Control_WriteRegister(uint32_t offset, uint32_t data); -uint32_t Feb_Control_ReadRegister(uint32_t offset); + +int Feb_Control_WriteRegister(uint32_t offset, uint32_t data); +int Feb_Control_ReadRegister(uint32_t offset, uint32_t* retval); diff --git a/slsDetectorServers/eigerDetectorServer/FebRegisterDefs.h b/slsDetectorServers/eigerDetectorServer/FebRegisterDefs.h index 686771347..87e78dacc 100755 --- a/slsDetectorServers/eigerDetectorServer/FebRegisterDefs.h +++ b/slsDetectorServers/eigerDetectorServer/FebRegisterDefs.h @@ -14,8 +14,16 @@ #define DAQ_REG_SUBFRAME_EXPOSURES 6 #define DAQ_REG_SUBFRAME_PERIOD 7 //also pg and fifo status register +#define DAQ_REG_HRDWRE 12 -#define DAQ_REG_RO_OFFSET 12 +#define DAQ_REG_HRDWRE_OW_OFST (0) +#define DAQ_REG_HRDWRE_OW_MSK (0x00000001 << DAQ_REG_HRDWRE_OW_OFST) +#define DAQ_REG_HRDWRE_TOP_OFST (1) +#define DAQ_REG_HRDWRE_TOP_MSK (0x00000001 << DAQ_REG_HRDWRE_TOP_OFST) +#define DAQ_REG_HRDWRE_INTRRPT_SF_OFST (3) +#define DAQ_REG_HRDWRE_INTRRPT_SF_MSK (0x00000001 << DAQ_REG_HRDWRE_INTRRPT_SF_OFST) + +#define DAQ_REG_RO_OFFSET 20 #define DAQ_REG_STATUS (DAQ_REG_RO_OFFSET + 0) //also pg and fifo status register #define FEB_REG_STATUS (DAQ_REG_RO_OFFSET + 3) #define MEAS_SUBPERIOD_REG (DAQ_REG_RO_OFFSET + 4) diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer index 9d18f2e85057effe398576ed5ad417256558049d..f86126441c96742d9edcae9e6cc12ee65e321cac 100755 GIT binary patch delta 75164 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 diff --git a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c index e8e80bcad..c08edbe7e 100755 --- a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c @@ -464,19 +464,25 @@ void setupDetector() { /* advanced read/write reg */ -uint32_t writeRegister(uint32_t offset, uint32_t data) { +int writeRegister(uint32_t offset, uint32_t data) { #ifdef VIRTUAL - return 0; + return OK; #else - return Feb_Control_WriteRegister(offset, data); + if(!Feb_Control_WriteRegister(offset, data)) { + return FAIL; + } + return OK; #endif } -uint32_t readRegister(uint32_t offset) { +int readRegister(uint32_t offset, uint32_t* retval) { #ifdef VIRTUAL - return 0; + return OK; #else - return Feb_Control_ReadRegister(offset); + if(!Feb_Control_ReadRegister(offset, retval)) { + return FAIL; + } + return OK; #endif } @@ -1310,10 +1316,19 @@ int setDetectorPosition(int pos[]) { #endif } -void setQuad(int value) { +int setQuad(int value) { + if (value < 0) { + return OK; + } #ifndef VIRTUAL - Beb_SetQuad(value); + if (Beb_SetQuad(value) == FAIL) { + return FAIL; + } + if (!Feb_Control_SetQuad(value)) { + return FAIL; + } #endif + return OK; } int getQuad() { @@ -1324,6 +1339,25 @@ int getQuad() { #endif } +int setInterruptSubframe(int value) { + if(value < 0) + return FAIL; +#ifndef VIRTUAL + if(!Feb_Control_SetInterruptSubframe(value)) { + return FAIL; + } + return OK; +#endif +} + +int getInterruptSubframe() { +#ifdef VIRTUAL + return 0; +#else + return Feb_Control_GetInterruptSubframe(); +#endif +} + int enableTenGigabitEthernet(int val) { if (val!=-1) { FILE_LOG(logINFO, ("Setting 10Gbe: %d\n", (val > 0) ? 1 : 0)); diff --git a/slsDetectorServers/eigerDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/eigerDetectorServer/slsDetectorServer_defs.h index 7939cc0b4..7eb16292e 100755 --- a/slsDetectorServers/eigerDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/eigerDetectorServer/slsDetectorServer_defs.h @@ -1,7 +1,7 @@ #pragma once #include "sls_detector_defs.h" -#define REQUIRED_FIRMWARE_VERSION (22) +#define REQUIRED_FIRMWARE_VERSION (24) #define IDFILECOMMAND "more /home/root/executables/detid.txt" #define STATUS_IDLE 0 diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h index 62df10a67..ff45791f7 100755 --- a/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h @@ -74,8 +74,8 @@ int setDefaultDacs(); // advanced read/write reg #ifdef EIGERD -uint32_t writeRegister(uint32_t offset, uint32_t data); -uint32_t readRegister(uint32_t offset); +int writeRegister(uint32_t offset, uint32_t data); +int readRegister(uint32_t offset, uint32_t* retval); #elif GOTTHARDD uint32_t writeRegister16And32(uint32_t offset, uint32_t data); //FIXME its not there in ctb or moench? uint32_t readRegister16And32(uint32_t offset); @@ -250,8 +250,10 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32 int setDetectorPosition(int pos[]); #endif #ifdef EIGERD -void setQuad(int value); +int setQuad(int value); int getQuad(); +int setInterruptSubframe(int value); +int getInterruptSubframe(); #endif #if defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(EIGERD) int enableTenGigabitEthernet(int val); diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c index 98b56c868..4bfa279da 100755 --- a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c @@ -246,6 +246,8 @@ const char* getFunctionName(enum detFuncs func) { case F_GET_STARTING_FRAME_NUMBER: return "F_GET_STARTING_FRAME_NUMBER"; case F_SET_QUAD: return "F_SET_QUAD"; case F_GET_QUAD: return "F_GET_QUAD"; + case F_SET_INTERRUPT_SUBFRAME: return "F_SET_INTERRUPT_SUBFRAME"; + case F_GET_INTERRUPT_SUBFRAME: return "F_GET_INTERRUPT_SUBFRAME"; default: return "Unknown Function"; } } @@ -332,6 +334,8 @@ void function_table() { flist[F_GET_STARTING_FRAME_NUMBER] = &get_starting_frame_number; flist[F_SET_QUAD] = &set_quad; flist[F_GET_QUAD] = &get_quad; + flist[F_SET_INTERRUPT_SUBFRAME] = &set_interrupt_subframe; + flist[F_GET_INTERRUPT_SUBFRAME] = &get_interrupt_subframe; // check if (NUM_DET_FUNCTIONS >= RECEIVER_ENUM_START) { @@ -1116,11 +1120,23 @@ int write_register(int file_des) { if (Server_VerifyLock() == OK) { #ifdef GOTTHARDD retval = writeRegister16And32(addr, val); +#elif EIGERD + if(writeRegister(addr, val) == FAIL) { + ret = FAIL; + sprintf(mess,"Could not write to register 0x%x.\n", addr); + FILE_LOG(logERROR,(mess)); + } else { + if(readRegister(addr, &retval) == FAIL) { + ret = FAIL; + sprintf(mess,"Could not read register 0x%x.\n", addr); + FILE_LOG(logERROR,(mess)); + } + } #else retval = writeRegister(addr, val); #endif // validate - if (retval != val) { + if (ret == OK && retval != val) { ret = FAIL; sprintf(mess,"Could not write to register 0x%x. Wrote 0x%x but read 0x%x\n", addr, val, retval); FILE_LOG(logERROR,(mess)); @@ -1148,6 +1164,12 @@ int read_register(int file_des) { // get #ifdef GOTTHARDD retval = readRegister16And32(addr); +#elif EIGERD + if(readRegister(addr, &retval) == FAIL) { + ret = FAIL; + sprintf(mess,"Could not read register 0x%x.\n", addr); + FILE_LOG(logERROR,(mess)); + } #else retval = readRegister(addr); #endif @@ -4103,13 +4125,18 @@ int set_quad(int file_des) { #else // only set if (Server_VerifyLock() == OK) { - setQuad(arg); - int retval = getQuad(); - if (arg != retval) { + if (setQuad(arg) == FAIL) { ret = FAIL; - sprintf(mess, "Could not set quad. Set %d, but read %d\n", retval, arg); + sprintf(mess, "Could not set quad.\n"); FILE_LOG(logERROR,(mess)); - } + } else { + int retval = getQuad(); + if (arg != retval) { + ret = FAIL; + sprintf(mess, "Could not set quad. Set %d, but read %d\n", retval, arg); + FILE_LOG(logERROR,(mess)); + } + } } #endif return Server_SendResult(file_des, INT32, UPDATE, NULL, 0); @@ -4130,4 +4157,58 @@ int get_quad(int file_des) { FILE_LOG(logDEBUG1, ("Quad retval: %u\n", retval)); #endif return Server_SendResult(file_des, INT32, UPDATE, &retval, sizeof(retval)); +} + +int set_interrupt_subframe(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + int arg = 0; + + if (receiveData(file_des, &arg, sizeof(arg), INT32) < 0) + return printSocketReadError(); + FILE_LOG(logINFO, ("Setting interrupt subframe: %u\n", arg)); + +#ifndef EIGERD + functionNotImplemented(); +#else + // only set + if (Server_VerifyLock() == OK) { + if(setInterruptSubframe(arg) == FAIL) { + ret = FAIL; + sprintf(mess, "Could not set Intertupt Subframe in FEB.\n"); + FILE_LOG(logERROR,(mess)); + } else { + int retval = getInterruptSubframe(); + if (arg != retval) { + ret = FAIL; + sprintf(mess, "Could not set Intertupt Subframe. Set %d, but read %d\n", retval, arg); + FILE_LOG(logERROR,(mess)); + } + } + } +#endif + return Server_SendResult(file_des, INT32, UPDATE, NULL, 0); +} + +int get_interrupt_subframe(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + int retval = -1; + + FILE_LOG(logDEBUG1, ("Getting interrupt subframe\n")); + +#ifndef EIGERD + functionNotImplemented(); +#else + // get only + retval = getInterruptSubframe(); + if (retval == -1) { + ret = FAIL; + sprintf(mess, "Could not get Intertupt Subframe or inconsistent values between left and right. \n"); + FILE_LOG(logERROR,(mess)); + } else { + FILE_LOG(logDEBUG1, ("Interrupt subframe retval: %u\n", retval)); + } +#endif + return Server_SendResult(file_des, INT32, UPDATE, &retval, sizeof(retval)); } \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.h b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.h index f7f8c7fb5..25feabf82 100755 --- a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.h +++ b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.h @@ -106,4 +106,6 @@ int set_external_sampling(int); int set_starting_frame_number(int); int get_starting_frame_number(int); int set_quad(int); -int get_quad(int); \ No newline at end of file +int get_quad(int); +int set_interrupt_subframe(int); +int get_interrupt_subframe(int); \ No newline at end of file diff --git a/slsDetectorSoftware/include/multiSlsDetector.h b/slsDetectorSoftware/include/multiSlsDetector.h index f4598817a..3d90a48fe 100755 --- a/slsDetectorSoftware/include/multiSlsDetector.h +++ b/slsDetectorSoftware/include/multiSlsDetector.h @@ -819,6 +819,20 @@ class multiSlsDetector : public virtual slsDetectorDefs { */ int setReadOutFlags(readOutFlags flag = GET_READOUT_FLAGS, int detPos = -1); + /** + * Set Interrupt last sub frame (Only for Eiger) + * @param enable true if interrupt last subframe set, else false + * @param detPos -1 for all detectors in list or specific detector position + */ + void setInterruptSubframe(const bool enable, int detPos = -1); + + /** + * Get Interrupt last sub frame (Only for Eiger) + * @param detPos -1 for all detectors in list or specific detector position + * @returns 1 if interrupt last subframe set, else 0, -1 different values + */ + int getInterruptSubframe(int detPos = -1); + /** * Write in a register. For Advanced users * @param addr address of register diff --git a/slsDetectorSoftware/include/slsDetector.h b/slsDetectorSoftware/include/slsDetector.h index 7b7529e59..eae096901 100755 --- a/slsDetectorSoftware/include/slsDetector.h +++ b/slsDetectorSoftware/include/slsDetector.h @@ -758,6 +758,18 @@ class slsDetector : public virtual slsDetectorDefs{ */ int setReadOutFlags(readOutFlags flag = GET_READOUT_FLAGS); + /** + * Set Interrupt last sub frame (Only for Eiger) + * @param enable true if interrupt last subframe set, else false + */ + void setInterruptSubframe(const bool enable); + + /** + * Get Interrupt last sub frame (Only for Eiger) + * @returns true if interrupt last subframe set, else false + */ + bool getInterruptSubframe(); + /** * Write in a register. For Advanced users * @param addr address of register diff --git a/slsDetectorSoftware/src/multiSlsDetector.cpp b/slsDetectorSoftware/src/multiSlsDetector.cpp index ce38c7d90..c7b7dfab0 100755 --- a/slsDetectorSoftware/src/multiSlsDetector.cpp +++ b/slsDetectorSoftware/src/multiSlsDetector.cpp @@ -1374,6 +1374,27 @@ int multiSlsDetector::setReadOutFlags(readOutFlags flag, int detPos) { return sls::minusOneIfDifferent(r); } +void multiSlsDetector::setInterruptSubframe(const bool enable, int detPos) { + // single + if (detPos >= 0) { + detectors[detPos]->setInterruptSubframe(enable); + } + + // multi + parallelCall(&slsDetector::setInterruptSubframe, enable); +} + +int multiSlsDetector::getInterruptSubframe(int detPos) { + // single + if (detPos >= 0) { + return static_cast(detectors[detPos]->getInterruptSubframe()); + } + + // multi + auto r = parallelCall(&slsDetector::getInterruptSubframe); + return sls::minusOneIfDifferent(r); +} + uint32_t multiSlsDetector::writeRegister(uint32_t addr, uint32_t val, int detPos) { // single diff --git a/slsDetectorSoftware/src/slsDetector.cpp b/slsDetectorSoftware/src/slsDetector.cpp index f439f7861..213d428d6 100755 --- a/slsDetectorSoftware/src/slsDetector.cpp +++ b/slsDetectorSoftware/src/slsDetector.cpp @@ -1526,6 +1526,21 @@ int slsDetector::setReadOutFlags(readOutFlags flag) { return shm()->roFlags; } +void slsDetector::setInterruptSubframe(const bool enable) { + int arg = static_cast(enable); + FILE_LOG(logDEBUG1) << "Setting Interrupt subframe to " << arg; + sendToDetector(F_SET_INTERRUPT_SUBFRAME, arg, nullptr); +} + +bool slsDetector::getInterruptSubframe() { + int retval = -1; + FILE_LOG(logDEBUG1) << "Getting Interrupt subframe"; + sendToDetector(F_GET_INTERRUPT_SUBFRAME, nullptr, retval); + FILE_LOG(logDEBUG1) << "Interrupt subframe: " << retval; + return static_cast(retval); +} + + uint32_t slsDetector::writeRegister(uint32_t addr, uint32_t val) { uint32_t args[]{addr, val}; uint32_t retval = -1; diff --git a/slsDetectorSoftware/src/slsDetectorCommand.cpp b/slsDetectorSoftware/src/slsDetectorCommand.cpp index 8c4831cd8..423af2813 100755 --- a/slsDetectorSoftware/src/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/src/slsDetectorCommand.cpp @@ -383,6 +383,13 @@ slsDetectorCommand::slsDetectorCommand(multiSlsDetector *det) { descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdAdvanced; ++i; + /*! \page config + - interruptsubframe [i] sets/gets the interrupt subframe flag. Setting it to 1 will interrupt the last subframe at the required exposure time. By default, this is disabled and set to 0, ie. it will wait for the last sub frame to finish exposing. Used for EIGER in 32 bit mode only. \c Returns \c (int). + */ + descrToFuncMap[i].m_pFuncName="interruptsubframe"; + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdvanced; + ++i; + /*! \page config - extsig [flag] sets/gets the mode of the external signal. Options: \c off, \c gate_in_active_high, \c gate_in_active_low, \c trigger_in_rising_edge, \c trigger_in_falling_edge, \c ro_trigger_in_rising_edge, \c ro_trigger_in_falling_edge, \c gate_out_active_high, \c gate_out_active_low, \c trigger_out_rising_edge, \c trigger_out_falling_edge, \c ro_trigger_out_rising_edge, @@ -4737,7 +4744,15 @@ std::string slsDetectorCommand::cmdAdvanced(int narg, const char * const args[], return std::string("unknown"); - } else if (cmd == "extsig") { + } else if (cmd=="interruptsubframe") { + if (action==PUT_ACTION) { + int ival = -1; + if (!sscanf(args[1],"%d",&ival)) + return std::string("could not scan interrupt sub frame parameter ") + std::string(args[1]); + myDet->setInterruptSubframe(ival > 0 ? true : false); + } + return std::to_string(myDet->getInterruptSubframe()); + } else if (cmd == "extsig") { externalSignalFlag flag = GET_EXTERNAL_SIGNAL_FLAG; if (action == PUT_ACTION) { @@ -4858,7 +4873,7 @@ std::string slsDetectorCommand::helpAdvanced(int action) { os << "extsig mode \t sets the mode of the external signal. can be \n \t \t \t off, \n \t \t \t gate_in_active_high, \n \t \t \t gate_in_active_low, \n \t \t \t trigger_in_rising_edge, \n \t \t \t trigger_in_falling_edge, \n \t \t \t ro_trigger_in_rising_edge, \n \t \t \t ro_trigger_in_falling_edge, \n \t \t \t gate_out_active_high, \n \t \t \t gate_out_active_low, \n \t \t \t trigger_out_rising_edge, \n \t \t \t trigger_out_falling_edge, \n \t \t \t ro_trigger_out_rising_edge, \n \t \t \t ro_trigger_out_falling_edge" << std::endl; os << "flags mode \t sets the readout flags to mode. can be none, storeinram, tot, continous, parallel, nonparallel, digital, analog_digital, overlow, nooverflow, unknown." << std::endl; - + os << "interruptsubframe flag \t sets the interrupt subframe flag. Setting it to 1 will interrupt the last subframe at the required exposure time. By default, this is disabled and set to 0, ie. it will wait for the last sub frame to finish exposing. Used for EIGER in 32 bit mode only." << std::endl; os << "programfpga f \t programs the fpga with file f (with .pof extension)." << std::endl; os << "resetfpga f \t resets fpga, f can be any value" << std::endl; os << "copydetectorserver s p \t copies the detector server s via tftp from pc with hostname p and changes respawn server. Not for Eiger. " << std::endl; @@ -4874,6 +4889,7 @@ std::string slsDetectorCommand::helpAdvanced(int action) { os << "extsig \t gets the mode of the external signal. can be \n \t \t \t off, \n \t \t \t gate_in_active_high, \n \t \t \t gate_in_active_low, \n \t \t \t trigger_in_rising_edge, \n \t \t \t trigger_in_falling_edge, \n \t \t \t ro_trigger_in_rising_edge, \n \t \t \t ro_trigger_in_falling_edge, \n \t \t \t gate_out_active_high, \n \t \t \t gate_out_active_low, \n \t \t \t trigger_out_rising_edge, \n \t \t \t trigger_out_falling_edge, \n \t \t \t ro_trigger_out_rising_edge, \n \t \t \t ro_trigger_out_falling_edge" << std::endl; os << "flags \t gets the readout flags. can be none, storeinram, tot, continous, parallel, nonparallel, digital, analog_digital, overflow, nooverflow, unknown" << std::endl; + os << "interruptsubframe \t gets the interrupt subframe flag. Setting it to 1 will interrupt the last subframe at the required exposure time. By default, this is disabled and set to 0, ie. it will wait for the last sub frame to finish exposing. Used for EIGER in 32 bit mode only." << std::endl; os << "led \t returns led status (0 off, 1 on)" << std::endl; os << "powerchip \t gets if the chip has been powered on or off" << std::endl; os << "auto_comp_disable \t Currently not implemented. gets if the automatic comparator diable mode is enabled/disabled" << std::endl; diff --git a/slsReceiverSoftware/include/DataProcessor.h b/slsReceiverSoftware/include/DataProcessor.h index 678a3ff25..9c5febfdb 100755 --- a/slsReceiverSoftware/include/DataProcessor.h +++ b/slsReceiverSoftware/include/DataProcessor.h @@ -39,6 +39,7 @@ class DataProcessor : private virtual slsDetectorDefs, public ThreadObject { * @param act pointer to activated * @param depaden pointer to deactivated padding enable * @param sm pointer to silent mode + * @param qe pointer to quad Enable * @param cdl pointer to vector or ctb digital bits enable * @param cdo pointer to digital bits offset * @param cad pointer to ctb analog databytes @@ -46,7 +47,7 @@ class DataProcessor : private virtual slsDetectorDefs, public ThreadObject { DataProcessor(int ind, detectorType dtype, Fifo* f, fileFormat* ftype, bool fwenable, bool* mfwenable, bool* dsEnable, bool* gpEnable, uint32_t* dr, uint32_t* freq, uint32_t* timer, - bool* fp, bool* act, bool* depaden, bool* sm, + bool* fp, bool* act, bool* depaden, bool* sm, bool* qe, std::vector * cdl, int* cdo, int* cad); /** @@ -368,6 +369,9 @@ class DataProcessor : private virtual slsDetectorDefs, public ThreadObject { /** Silent Mode */ bool* silentMode; + /** quad enable */ + bool* quadEnable; + /** frame padding */ bool* framePadding; diff --git a/slsReceiverSoftware/include/GeneralData.h b/slsReceiverSoftware/include/GeneralData.h index 464ffe544..87ad410d0 100755 --- a/slsReceiverSoftware/include/GeneralData.h +++ b/slsReceiverSoftware/include/GeneralData.h @@ -178,8 +178,10 @@ public: /** * Enable Gap Pixels changes member variables * @param enable true if gap pixels enable, else false + * @param dr dynamic range + * @param q quad enable */ - virtual void SetGapPixelsEnable(bool b, int dr) { + virtual void SetGapPixelsEnable(bool b, int dr, bool q) { FILE_LOG(logERROR) << "SetGapPixelsEnable is a generic function that should be overloaded by a derived class"; }; @@ -463,13 +465,17 @@ class EigerData : public GeneralData { * Enable Gap Pixels changes member variables * @param enable true if gap pixels enable, else false * @param dr dynamic range + * @param q quad enable */ - void SetGapPixelsEnable(bool b, int dr) { + void SetGapPixelsEnable(bool b, int dr, bool q) { if (dr == 4) b = 0; switch((int)b) { case 1: nPixelsX = (256 * 2) + 3; + if (q) { + nPixelsX = (256 * 2) + 2; + } nPixelsY = 256 + 1; imageSize = nPixelsX * nPixelsY * ((dr > 16) ? 4 : // 32 bit ((dr > 8) ? 2 : // 16 bit diff --git a/slsReceiverSoftware/include/slsReceiverImplementation.h b/slsReceiverSoftware/include/slsReceiverImplementation.h index b50f1309b..1ffd04a46 100755 --- a/slsReceiverSoftware/include/slsReceiverImplementation.h +++ b/slsReceiverSoftware/include/slsReceiverImplementation.h @@ -399,8 +399,9 @@ class slsReceiverImplementation : private virtual slsDetectorDefs { /** * Set Quad type Enable (eiger and hardware specific) * @param true if quad enabled, else false + * @return OK or FAIL */ - void setQuad(const bool b); + int setQuad(const bool b); /** * Set readout flags (eiger, chiptestboard, moench) diff --git a/slsReceiverSoftware/src/DataProcessor.cpp b/slsReceiverSoftware/src/DataProcessor.cpp index ea0a9bc37..766a3d72e 100755 --- a/slsReceiverSoftware/src/DataProcessor.cpp +++ b/slsReceiverSoftware/src/DataProcessor.cpp @@ -27,7 +27,7 @@ DataProcessor::DataProcessor(int ind, detectorType dtype, Fifo* f, fileFormat* ftype, bool fwenable, bool* mfwenable, bool* dsEnable, bool* gpEnable, uint32_t* dr, uint32_t* freq, uint32_t* timer, - bool* fp, bool* act, bool* depaden, bool* sm, + bool* fp, bool* act, bool* depaden, bool* sm, bool* qe, std::vector * cdl, int* cdo, int* cad) : ThreadObject(ind), @@ -49,6 +49,7 @@ DataProcessor::DataProcessor(int ind, detectorType dtype, Fifo* f, activated(act), deactivatedPaddingEnable(depaden), silentMode(sm), + quadEnable(qe), framePadding(fp), ctbDbitList(cdl), ctbDbitOffset(cdo), @@ -558,29 +559,31 @@ void DataProcessor::InsertGapPixels(char* buf, uint32_t dr) { memset(tempBuffer, 0xFF, generalData->imageSize); + int rightChip = ((*quadEnable) ? 0 : index); // quad enable, then faking both to be left chips const uint32_t nx = generalData->nPixelsX; const uint32_t ny = generalData->nPixelsY; const uint32_t npx = nx * ny; - + bool group3 = (*quadEnable) ? false : true; // if quad enabled, no last line for left chips char* srcptr = nullptr; char* dstptr = nullptr; const uint32_t b1px = generalData->imageSize / (npx); // not double as not dealing with 4 bit mode const uint32_t b2px = 2 * b1px; - const uint32_t b1pxofst = (index != 0 ? b1px : 0); // left fpga (index 0) has no extra 1px offset, but right fpga has + const uint32_t b1pxofst = (rightChip == 0 ? 0 : b1px); // left fpga (rightChip 0) has no extra 1px offset, but right fpga has const uint32_t b1chip = 256 * b1px; const uint32_t b1line = (nx * b1px); + const uint32_t bgroup3chip = b1chip + (group3 ? b1px : 0); // copying line by line srcptr = buf; - dstptr = tempBuffer + b1line + b1pxofst; // left fpga (index 0) has no extra 1px offset, but right fpga has + dstptr = tempBuffer + b1line + b1pxofst; // left fpga (rightChip 0) has no extra 1px offset, but right fpga has for (uint32_t i = 0; i < (ny-1); ++i) { memcpy(dstptr, srcptr, b1chip); srcptr += b1chip; dstptr += (b1chip + b2px); memcpy(dstptr, srcptr, b1chip); srcptr += b1chip; - dstptr += (b1chip + b1px); + dstptr += bgroup3chip; } // vertical filling of values @@ -597,28 +600,36 @@ void DataProcessor::InsertGapPixels(char* buf, uint32_t dr) { dstgp1 = srcgp1 + b1px; srcgp2 = srcgp1 + b3px; dstgp2 = dstgp1 + b1px; - if (index == 0u) { - srcgp3 = srcptr + b1line - b2px; - dstgp3 = srcgp3 + b1px; - } else { - srcgp3 = srcptr + b1px; - dstgp3 = srcptr; + if (group3) { + if (rightChip == 0u) { + srcgp3 = srcptr + b1line - b2px; + dstgp3 = srcgp3 + b1px; + } else { + srcgp3 = srcptr + b1px; + dstgp3 = srcptr; + } } switch (dr) { case 8: (*((uint8_t*)srcgp1)) = (*((uint8_t*)srcgp1))/2; (*((uint8_t*)dstgp1)) = (*((uint8_t*)srcgp1)); (*((uint8_t*)srcgp2)) = (*((uint8_t*)srcgp2))/2; (*((uint8_t*)dstgp2)) = (*((uint8_t*)srcgp2)); - (*((uint8_t*)srcgp3)) = (*((uint8_t*)srcgp3))/2; (*((uint8_t*)dstgp3)) = (*((uint8_t*)srcgp3)); + if (group3) { + (*((uint8_t*)srcgp3)) = (*((uint8_t*)srcgp3))/2; (*((uint8_t*)dstgp3)) = (*((uint8_t*)srcgp3)); + } break; case 16: (*((uint16_t*)srcgp1)) = (*((uint16_t*)srcgp1))/2; (*((uint16_t*)dstgp1)) = (*((uint16_t*)srcgp1)); (*((uint16_t*)srcgp2)) = (*((uint16_t*)srcgp2))/2; (*((uint16_t*)dstgp2)) = (*((uint16_t*)srcgp2)); - (*((uint16_t*)srcgp3)) = (*((uint16_t*)srcgp3))/2; (*((uint16_t*)dstgp3)) = (*((uint16_t*)srcgp3)); + if (group3) { + (*((uint16_t*)srcgp3)) = (*((uint16_t*)srcgp3))/2; (*((uint16_t*)dstgp3)) = (*((uint16_t*)srcgp3)); + } break; default: (*((uint32_t*)srcgp1)) = (*((uint32_t*)srcgp1))/2; (*((uint32_t*)dstgp1)) = (*((uint32_t*)srcgp1)); (*((uint32_t*)srcgp2)) = (*((uint32_t*)srcgp2))/2; (*((uint32_t*)dstgp2)) = (*((uint32_t*)srcgp2)); - (*((uint32_t*)srcgp3)) = (*((uint32_t*)srcgp3))/2; (*((uint32_t*)dstgp3)) = (*((uint32_t*)srcgp3)); + if (group3) { + (*((uint32_t*)srcgp3)) = (*((uint32_t*)srcgp3))/2; (*((uint32_t*)dstgp3)) = (*((uint32_t*)srcgp3)); + } break; } srcptr += b1line; diff --git a/slsReceiverSoftware/src/slsReceiverImplementation.cpp b/slsReceiverSoftware/src/slsReceiverImplementation.cpp index 33b65a213..e78f25f9e 100755 --- a/slsReceiverSoftware/src/slsReceiverImplementation.cpp +++ b/slsReceiverSoftware/src/slsReceiverImplementation.cpp @@ -501,7 +501,7 @@ int slsReceiverImplementation::setGapPixelsEnable(const bool b) { gapPixelsEnable = b; // side effects - generalData->SetGapPixelsEnable(b, dynamicRange); + generalData->SetGapPixelsEnable(b, dynamicRange, quadEnable); for (const auto &it : dataProcessor) it->SetPixelDimension(); if (SetupFifoStructure() == FAIL) @@ -512,10 +512,17 @@ int slsReceiverImplementation::setGapPixelsEnable(const bool b) { } -void slsReceiverImplementation::setQuad(const bool b) { +int slsReceiverImplementation::setQuad(const bool b) { if (quadEnable != b) { quadEnable = b; + generalData->SetGapPixelsEnable(gapPixelsEnable, dynamicRange, b); + // to update npixelsx, npixelsy in file writer + for (const auto &it : dataProcessor) + it->SetPixelDimension(); + if (SetupFifoStructure() == FAIL) + return FAIL; + if (!quadEnable) { for (const auto &it : dataStreamer) { it->SetNumberofDetectors(numDet); @@ -533,6 +540,7 @@ void slsReceiverImplementation::setQuad(const bool b) { } } FILE_LOG(logINFO) << "Quad Enable: " << quadEnable; + return OK; } int slsReceiverImplementation::setReadOutFlags(const readOutFlags f) { @@ -750,7 +758,7 @@ int slsReceiverImplementation::setNumberofUDPInterfaces(const int n) { fileWriteEnable, &masterFileWriteEnable, &dataStreamEnable, &gapPixelsEnable, &dynamicRange, &streamingFrequency, &streamingTimerInMs, &framePadding, &activated, - &deactivatedPaddingEnable, &silentMode, &ctbDbitList, + &deactivatedPaddingEnable, &silentMode, &quadEnable, &ctbDbitList, &ctbDbitOffset, &ctbAnalogDataBytes)); dataProcessor[i]->SetGeneralData(generalData); } catch (...) { @@ -1085,7 +1093,7 @@ int slsReceiverImplementation::setDynamicRange(const uint32_t i) { if (dynamicRange != i) { dynamicRange = i; generalData->SetDynamicRange(i, tengigaEnable); - generalData->SetGapPixelsEnable(gapPixelsEnable, dynamicRange); + generalData->SetGapPixelsEnable(gapPixelsEnable, dynamicRange, quadEnable); // to update npixelsx, npixelsy in file writer for (const auto &it : dataProcessor) it->SetPixelDimension(); @@ -1103,6 +1111,7 @@ int slsReceiverImplementation::setTenGigaEnable(const bool b) { switch (myDetectorType) { case EIGER: generalData->SetTenGigaEnable(b, dynamicRange); + generalData->SetGapPixelsEnable(gapPixelsEnable, dynamicRange, quadEnable); break; case MOENCH: generalData->setImageSize(adcEnableMask, numberOfAnalogSamples, @@ -1240,7 +1249,7 @@ int slsReceiverImplementation::setDetectorType(const detectorType d) { &masterFileWriteEnable, &dataStreamEnable, &gapPixelsEnable, &dynamicRange, &streamingFrequency, &streamingTimerInMs, &framePadding, &activated, &deactivatedPaddingEnable, - &silentMode, &ctbDbitList, &ctbDbitOffset, + &silentMode, &quadEnable, &ctbDbitList, &ctbDbitOffset, &ctbAnalogDataBytes)); } catch (...) { FILE_LOG(logERROR) diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp index d773613f4..b7bc792d5 100755 --- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp +++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp @@ -1314,7 +1314,10 @@ int slsReceiverTCPIPInterface::set_quad_type(Interface &socket) { if (quadEnable >= 0) { VerifyIdle(socket); FILE_LOG(logDEBUG1) << "Setting quad:" << quadEnable; - impl()->setQuad(quadEnable == 0 ? false : true); + ret = impl()->setQuad(quadEnable == 0 ? false : true); + if (ret == FAIL) { + throw RuntimeError("Could not set Quad due to fifo structure"); + } } int retval = impl()->getQuad() ? 1 : 0; validate(quadEnable, retval, "set quad", DEC); diff --git a/slsSupportLib/include/sls_detector_funcs.h b/slsSupportLib/include/sls_detector_funcs.h index e1bf69644..593d4110a 100755 --- a/slsSupportLib/include/sls_detector_funcs.h +++ b/slsSupportLib/include/sls_detector_funcs.h @@ -91,6 +91,8 @@ enum detFuncs{ F_GET_STARTING_FRAME_NUMBER, F_SET_QUAD, F_GET_QUAD, + F_SET_INTERRUPT_SUBFRAME, + F_GET_INTERRUPT_SUBFRAME, NUM_DET_FUNCTIONS, RECEIVER_ENUM_START = 128, /**< detector function should not exceed this (detector server should not compile anyway) */ @@ -236,6 +238,8 @@ static const char* getFunctionNameFromEnum(enum detFuncs func) { case F_GET_STARTING_FRAME_NUMBER: return "F_GET_STARTING_FRAME_NUMBER"; case F_SET_QUAD: return "F_SET_QUAD"; case F_GET_QUAD: return "F_GET_QUAD"; + case F_SET_INTERRUPT_SUBFRAME: return "F_SET_INTERRUPT_SUBFRAME"; + case F_GET_INTERRUPT_SUBFRAME: return "F_GET_INTERRUPT_SUBFRAME"; 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 4f9d99b0f..21f7c5e05 100644 --- a/slsSupportLib/include/versionAPI.h +++ b/slsSupportLib/include/versionAPI.h @@ -3,8 +3,8 @@ #define APIMOENCH 0x181108 #define APICTB 0x190604 #define APIGOTTHARD 0x190715 -#define APIEIGER 0x190723 #define APILIB 0x190723 #define APIRECEIVER 0x190722 #define APIGUI 0x190723 #define APIJUNGFRAU 0x190730 +#define APIEIGER 0x190731