diff --git a/slsDetectorServers/eigerDetectorServer/Beb.c b/slsDetectorServers/eigerDetectorServer/Beb.c index 4b7ae520d..82d82f697 100644 --- a/slsDetectorServers/eigerDetectorServer/Beb.c +++ b/slsDetectorServers/eigerDetectorServer/Beb.c @@ -1106,7 +1106,9 @@ int Beb_SetDetectorPosition(int pos[]) { int posRight[2] = {Beb_top ? pos[X] + 1 : pos[X], pos[Y]}; if (Beb_quadEnable) { - posRight[Y] = 1; // right is next row + posLeft[Y] = 1; // left is next row + posLeft[X] = 0; // left same first row + posRight[Y] = 0; // right same first row posRight[X] = 0; // right same first column } diff --git a/slsDetectorServers/eigerDetectorServer/CMakeLists.txt b/slsDetectorServers/eigerDetectorServer/CMakeLists.txt index 39f0aea23..ddba9e4a4 100644 --- a/slsDetectorServers/eigerDetectorServer/CMakeLists.txt +++ b/slsDetectorServers/eigerDetectorServer/CMakeLists.txt @@ -25,7 +25,7 @@ target_include_directories(eigerDetectorServer_virtual ) target_compile_definitions(eigerDetectorServer_virtual - PUBLIC EIGERD PCCOMPILE STOP_SERVER + PUBLIC EIGERD PCCOMPILE STOP_SERVER #TEST_MOD_GEOMETRY PUBLIC VIRTUAL #VIRTUAL_9M ) diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.c b/slsDetectorServers/eigerDetectorServer/FebControl.c index c37ce2ced..e99e86891 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.c +++ b/slsDetectorServers/eigerDetectorServer/FebControl.c @@ -1240,19 +1240,16 @@ int Feb_Control_GetDynamicRange(int *retval) { int Feb_Control_Disable16bitConversion(int disable) { LOG(logINFO, ("%s 16 bit expansion\n", disable ? "Disabling" : "Enabling")); + + uint32_t bitmask = DAQ_REG_HRDWRE_DSBL_16BIT_MSK; unsigned int regval = 0; - if (!Feb_Control_ReadRegister(DAQ_REG_HRDWRE, ®val)) { - LOG(logERROR, ("Could not %s 16 bit expansion (bit mode)\n", - (disable ? "disable" : "enable"))); - return 0; - } if (disable) { - regval |= DAQ_REG_HRDWRE_DSBL_16BIT_MSK; + regval |= bitmask; } else { - regval &= ~DAQ_REG_HRDWRE_DSBL_16BIT_MSK; + regval &= ~bitmask; } - if (!Feb_Control_WriteRegister(DAQ_REG_HRDWRE, regval)) { + if (!Feb_Control_WriteRegister_BitMask(DAQ_REG_HRDWRE, regval, bitmask)) { LOG(logERROR, ("Could not %s 16 bit expansion (bit mode)\n", (disable ? "disable" : "enable"))); return 0; @@ -1262,11 +1259,12 @@ int Feb_Control_Disable16bitConversion(int disable) { int Feb_Control_Get16bitConversionDisabled(int *ret) { unsigned int regval = 0; - if (!Feb_Control_ReadRegister(DAQ_REG_HRDWRE, ®val)) { + if (!Feb_Control_ReadRegister_BitMask(DAQ_REG_HRDWRE, ®val, + DAQ_REG_HRDWRE_DSBL_16BIT_MSK)) { LOG(logERROR, ("Could not get 16 bit expansion (bit mode)\n")); return 0; } - if (regval & DAQ_REG_HRDWRE_DSBL_16BIT_MSK) { + if (regval) { *ret = 1; } else { *ret = 0; @@ -1667,6 +1665,15 @@ int Feb_Control_GetReadNRows() { } int Feb_Control_WriteRegister(uint32_t offset, uint32_t data) { + return Feb_Control_WriteRegister_BitMask(offset, data, BIT32_MSK); +} + +int Feb_Control_ReadRegister(uint32_t offset, uint32_t *retval) { + return Feb_Control_ReadRegister_BitMask(offset, retval, BIT32_MASK); +} + +int Feb_Control_WriteRegister_BitMask(uint32_t offset, uint32_t data, + uint32_t bitmask) { uint32_t actualOffset = offset; char side[2][10] = {"right", "left"}; unsigned int addr[2] = {Feb_Control_rightAddress, Feb_Control_leftAddress}; @@ -1690,24 +1697,41 @@ int Feb_Control_WriteRegister(uint32_t offset, uint32_t data) { for (int iloop = 0; iloop < 2; ++iloop) { if (run[iloop]) { - LOG(logDEBUG1, - ("Writing 0x%x to %s 0x%x\n", data, side[iloop], actualOffset)); - if (!Feb_Interface_WriteRegister(addr[iloop], actualOffset, data, 0, - 0)) { - LOG(logERROR, ("Could not write 0x%x to %s addr 0x%x\n", data, + LOG(logDEBUG1, ("Writing 0x%x to %s 0x%x (mask:0x%x)\n", data, + side[iloop], actualOffset, bitmask)); + + uint32_t writeVal = 0; + if (!Feb_Interface_ReadRegister(addr[iloop], actualOffset, + &writeVal)) { + LOG(logERROR, ("Could not read %s addr 0x%x register\n", side[iloop], actualOffset)); return 0; } - uint32_t regVal = 0; - if (!Feb_Interface_ReadRegister(addr[iloop], actualOffset, - ®Val)) { - LOG(logERROR, ("Could not read %s register\n", addr[iloop])); + // set only the bits in the mask + writeVal &= ~(bitmask); + writeVal |= (data & bitmask); + + LOG(logDEBUG1, ("writing 0x%x to 0x%x\n", writeVal, actualOffset)); + if (!Feb_Interface_WriteRegister(addr[iloop], actualOffset, + writeVal, 0, 0)) { + LOG(logERROR, ("Could not write 0x%x to %s addr 0x%x\n", + writeVal, side[iloop], actualOffset)); return 0; } - if (regVal != data) { + writeVal &= bitmask; + + uint32_t readVal = 0; + if (!Feb_Interface_ReadRegister(addr[iloop], actualOffset, + &readVal)) { + return 0; + } + readVal &= bitmask; + + if (writeVal != readVal) { LOG(logERROR, - ("Could not write %s register. Write 0x%x, read 0x%x\n", - addr[iloop], data, regVal)); + ("Could not write %s addr 0x%x register. Wrote " + "0x%x, read 0x%x (mask:0x%x)\n", + side[iloop], actualOffset, writeVal, readVal, bitmask)); return 0; } } @@ -1716,7 +1740,8 @@ int Feb_Control_WriteRegister(uint32_t offset, uint32_t data) { return 1; } -int Feb_Control_ReadRegister(uint32_t offset, uint32_t *retval) { +int Feb_Control_ReadRegister_BitMask(uint32_t offset, uint32_t *retval, + uint32_t bitmask) { uint32_t actualOffset = offset; char side[2][10] = {"right", "left"}; unsigned int addr[2] = {Feb_Control_rightAddress, Feb_Control_leftAddress}; @@ -1746,8 +1771,9 @@ int Feb_Control_ReadRegister(uint32_t offset, uint32_t *retval) { side[iloop], actualOffset)); return 0; } - LOG(logDEBUG1, ("Read 0x%x from %s 0x%x\n", value[iloop], - side[iloop], actualOffset)); + value[iloop] &= bitmask; + LOG(logDEBUG1, ("Read 0x%x from %s 0x%x (mask:0x%x)\n", + value[iloop], side[iloop], actualOffset, bitmask)); *retval = value[iloop]; // if not the other (left, not right OR right, not left), return the // value @@ -1758,7 +1784,7 @@ int Feb_Control_ReadRegister(uint32_t offset, uint32_t *retval) { } // Inconsistent values when reading both registers if ((run[0] & run[1]) & (value[0] != value[1])) { - LOG(logERROR, ("Inconsistent values read from %s 0x%x and %s 0x%x\n", + LOG(logERROR, ("Inconsistent values read from %s: 0x%x and %s: 0x%x\n", side[0], value[0], side[1], value[1])); return 0; } diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.h b/slsDetectorServers/eigerDetectorServer/FebControl.h index 325c4af44..9c439720c 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.h +++ b/slsDetectorServers/eigerDetectorServer/FebControl.h @@ -95,7 +95,10 @@ int Feb_Control_SetReadNRows(int value); int Feb_Control_GetReadNRows(); int Feb_Control_WriteRegister(uint32_t offset, uint32_t data); int Feb_Control_ReadRegister(uint32_t offset, uint32_t *retval); - +int Feb_Control_WriteRegister_BitMask(uint32_t offset, uint32_t data, + uint32_t bitmask); +int Feb_Control_ReadRegister_BitMask(uint32_t offset, uint32_t *retval, + uint32_t bitmask); // pulsing int Feb_Control_Pulse_Pixel(int npulses, int x, int y); int Feb_Control_PulsePixelNMove(int npulses, int inc_x_pos, int inc_y_pos); diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServerv7.0.0.rc3 b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServerv7.0.0.rc3 index ffc126668..291a541d0 100755 Binary files a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServerv7.0.0.rc3 and b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServerv7.0.0.rc3 differ diff --git a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c index 815db9050..1686ced7b 100644 --- a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c @@ -861,12 +861,15 @@ int setDynamicRange(int dr) { LOG(logINFO, ("Setting dynamic range: %d\n", dr)); #else sharedMemory_lockLocalLink(); - if (Feb_Control_SetDynamicRange(dr)) { - if (!Beb_SetUpTransferParameters(dr)) { - LOG(logERROR, ("Could not set bit mode in the back end\n")); - sharedMemory_unlockLocalLink(); - return eiger_dynamicrange; - } + if (!Feb_Control_SetDynamicRange(dr)) { + LOG(logERROR, ("Could not set dynamic range in feb\n")); + sharedMemory_unlockLocalLink(); + return FAIL; + } + if (!Beb_SetUpTransferParameters(dr)) { + LOG(logERROR, ("Could not set bit mode in the back end\n")); + sharedMemory_unlockLocalLink(); + return eiger_dynamicrange; } sharedMemory_unlockLocalLink(); #endif @@ -2664,6 +2667,10 @@ void *start_timer(void *arg) { header->modId = eiger_virtual_module_id; header->row = row; header->column = colLeft; + if (eiger_virtual_quad_mode) { + header->row = 1; // left is next row + header->column = 0; // left same first column + } char packetData2[packetsize]; memset(packetData2, 0, packetsize); @@ -2672,11 +2679,11 @@ void *start_timer(void *arg) { header->version = SLS_DETECTOR_HEADER_VERSION; header->frameNumber = frameNr + iframes; header->packetNumber = i; - header->modId = eiger_virtual_module_id; + header->modId = eiger_virtual_module_id + 1; header->row = row; header->column = colRight; if (eiger_virtual_quad_mode) { - header->row = 1; // right is next row + header->row = 0; // right is next row header->column = 0; // right same first column } diff --git a/slsDetectorServers/eigerDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/eigerDetectorServer/slsDetectorServer_defs.h index cca94c3fd..8024f00c5 100644 --- a/slsDetectorServers/eigerDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/eigerDetectorServer/slsDetectorServer_defs.h @@ -137,6 +137,7 @@ enum MASTERINDEX { MASTER_HARDWARE, OW_MASTER, OW_SLAVE }; #define UDP_HEADER_MAX_FRAME_VALUE (0xFFFFFFFFFFFF) #define BIT16_MASK (0xFFFF) +#define BIT32_MSK (0xFFFFFFFF) #define DAC_MIN_MV (0) #define DAC_MAX_MV (2048) diff --git a/slsReceiverSoftware/src/Implementation.cpp b/slsReceiverSoftware/src/Implementation.cpp index 7951e922f..9227c7676 100644 --- a/slsReceiverSoftware/src/Implementation.cpp +++ b/slsReceiverSoftware/src/Implementation.cpp @@ -212,6 +212,7 @@ void Implementation::SetupDataStreamer(int i) { streamingHwm); dataStreamer[i]->SetAdditionalJsonHeader(additionalJsonHeader); dataStreamer[i]->SetFileIndex(fileIndex); + dataStreamer[i]->SetQuadEnable(quadEnable); dataStreamer[i]->SetFlipRows(flipRows); dataStreamer[i]->SetNumberofPorts(numPorts); dataStreamer[i]->SetQuadEnable(quadEnable); @@ -357,7 +358,9 @@ std::array Implementation::getThreadIds() const { bool Implementation::getArping() const { return arping.IsRunning(); } -pid_t Implementation::getArpingProcessId() const { return arping.GetProcessId(); } +pid_t Implementation::getArpingProcessId() const { + return arping.GetProcessId(); +} void Implementation::setArping(const bool i, const std::vector ips) {