diff --git a/RELEASE.txt b/RELEASE.txt index 074734745..ade2e3a0d 100755 --- a/RELEASE.txt +++ b/RELEASE.txt @@ -67,7 +67,8 @@ This document describes the differences between v7.0.0 and v6.x.x - registerCallBackStartAcquisition gave incorrect imagesize (+120 bytes). corrected. - registerCallBackStartAcquisition parameter is a const string reference - m3 (runnig config second time with tengiga 0, dr !=32, counters !=0x7) calculated incorrect image size expected - +- fixed row column indexing (mainly for multi module Jungfrau 2 interfaces ) +- eiger gui row indices not flipped anymore (fix in config) 2. Resolved Issues ================== diff --git a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer index 599d9dfc6..cd8e48e77 100755 Binary files a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer and b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer differ diff --git a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c index 06db979c0..d2f416637 100644 --- a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c @@ -2060,8 +2060,8 @@ void *start_timer(void *arg) { header->frameNumber = frameNr + iframes; header->packetNumber = i; header->modId = 0; - header->row = detPos[X]; - header->column = detPos[Y]; + header->row = detPos[Y]; + header->column = detPos[X]; // fill data memcpy(packetData + sizeof(sls_detector_header), diff --git a/slsDetectorServers/eigerDetectorServer/Beb.c b/slsDetectorServers/eigerDetectorServer/Beb.c index 1691ee406..4b7ae520d 100644 --- a/slsDetectorServers/eigerDetectorServer/Beb.c +++ b/slsDetectorServers/eigerDetectorServer/Beb.c @@ -1095,19 +1095,19 @@ int *Beb_GetDetectorPosition() { return Beb_positions; } int Beb_SetDetectorPosition(int pos[]) { if (!Beb_activated) return OK; - LOG(logINFO, ("Got Position values %d %d...\n", pos[0], pos[1])); + LOG(logINFO, ("Setting Position: (%d, %d)\n", pos[X], pos[Y])); // save positions - Beb_positions[0] = pos[0]; - Beb_positions[1] = pos[1]; + Beb_positions[Y] = pos[Y]; + Beb_positions[X] = pos[X]; // get left and right - int posLeft[2] = {pos[0], Beb_top ? pos[1] : pos[1] + 1}; - int posRight[2] = {pos[0], Beb_top ? pos[1] + 1 : pos[1]}; + int posLeft[2] = {Beb_top ? pos[X] : pos[X] + 1, pos[Y]}; + int posRight[2] = {Beb_top ? pos[X] + 1 : pos[X], pos[Y]}; if (Beb_quadEnable) { - posRight[0] = 1; // right is next row - posRight[1] = 0; // right same first column + posRight[Y] = 1; // right is next row + posRight[X] = 0; // right same first column } int ret = FAIL; @@ -1122,7 +1122,7 @@ int Beb_SetDetectorPosition(int pos[]) { uint32_t value = 0; ret = OK; // x left - int posval = Beb_swap_uint16(posLeft[0]); + int posval = Beb_swap_uint16(posLeft[Y]); value = Beb_Read32(csp0base, UDP_HEADER_A_LEFT_OFST); value &= UDP_HEADER_ID_MSK; // to keep previous id value Beb_Write32(csp0base, UDP_HEADER_A_LEFT_OFST, @@ -1134,7 +1134,7 @@ int Beb_SetDetectorPosition(int pos[]) { ret = FAIL; } // x right - posval = Beb_swap_uint16(posRight[0]); + posval = Beb_swap_uint16(posRight[Y]); value = Beb_Read32(csp0base, UDP_HEADER_A_RIGHT_OFST); value &= UDP_HEADER_ID_MSK; // to keep previous id value Beb_Write32(csp0base, UDP_HEADER_A_RIGHT_OFST, @@ -1147,7 +1147,7 @@ int Beb_SetDetectorPosition(int pos[]) { } // y left (column) - posval = Beb_swap_uint16(posLeft[1]); + posval = Beb_swap_uint16(posLeft[X]); value = Beb_Read32(csp0base, UDP_HEADER_B_LEFT_OFST); value &= UDP_HEADER_Z_MSK; // to keep previous z value Beb_Write32(csp0base, UDP_HEADER_B_LEFT_OFST, @@ -1160,7 +1160,7 @@ int Beb_SetDetectorPosition(int pos[]) { } // y right - posval = Beb_swap_uint16(posRight[1]); + posval = Beb_swap_uint16(posRight[X]); value = Beb_Read32(csp0base, UDP_HEADER_B_RIGHT_OFST); value &= UDP_HEADER_Z_MSK; // to keep previous z value Beb_Write32(csp0base, UDP_HEADER_B_RIGHT_OFST, @@ -1176,10 +1176,10 @@ int Beb_SetDetectorPosition(int pos[]) { Beb_close(fd, csp0base); } if (ret == OK) { - LOG(logINFO, ("Position set to...\n" + LOG(logINFO, ("Position set to (col, row):\n" "\tLeft: [%d, %d]\n" "\tRight:[%d, %d]\n", - posLeft[0], posLeft[1], posRight[0], posRight[1])); + posLeft[X], posLeft[Y], posRight[X], posRight[Y])); } return ret; diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer index 58cbd44fd..2976a57c4 100755 Binary files a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer and b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer differ diff --git a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c index 45c5600ee..dc3600911 100644 --- a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c @@ -19,7 +19,7 @@ #include #include #endif - +extern int portno; // Global variable from slsDetectorServer_funcs extern int debugflag; extern int updateFlag; @@ -2473,9 +2473,9 @@ void *start_timer(void *arg) { int maxPacketsPerFrame = (tgEnable ? 4 : 16) * dr; int npixelsx = 256 * 2 * bytesPerPixel; int databytes = 256 * 256 * 2 * bytesPerPixel; - int row = eiger_virtual_detPos[0]; - int colLeft = top ? eiger_virtual_detPos[1] : eiger_virtual_detPos[1] + 1; - int colRight = top ? eiger_virtual_detPos[1] + 1 : eiger_virtual_detPos[1]; + int row = eiger_virtual_detPos[Y]; + int colLeft = top ? eiger_virtual_detPos[X] : eiger_virtual_detPos[X] + 1; + int colRight = top ? eiger_virtual_detPos[X] + 1 : eiger_virtual_detPos[X]; int readNRows = getReadNRows(); if (readNRows == -1) { @@ -2548,8 +2548,20 @@ void *start_timer(void *arg) { } break; case 16: +// to debug multi module geometry (row, column) in virtual servers (all pixels +// in a module set to particular value) +#ifdef TEST_MOD_GEOMETRY + if ((i % 1024) < 512) { + *((uint16_t *)(imageData + i * sizeof(uint16_t))) = + top ? (portno % 1900) : ((portno % 1900) + 1); + } else { + *((uint16_t *)(imageData + i * sizeof(uint16_t))) = + top ? ((portno % 1900) + 1) : (portno % 1900); + } +#else *((uint16_t *)(imageData + i * sizeof(uint16_t))) = eiger_virtual_test_mode ? 0xFFE : (uint16_t)pixelVal; +#endif break; case 32: *((uint32_t *)(imageData + i * sizeof(uint32_t))) = diff --git a/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer b/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer index 1691e88cd..db6c4ef0c 100755 Binary files a/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer and b/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer differ diff --git a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c index 44c025b89..e43d711ea 100644 --- a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c @@ -1917,7 +1917,7 @@ int setDetectorPosition(int pos[]) { int ret = OK; // row - value = detPos[X]; + value = detPos[Y]; bus_w(addr, (bus_r(addr) & ~COORD_ROW_MSK) | ((value << COORD_ROW_OFST) & COORD_ROW_MSK)); valueRead = ((bus_r(addr) & COORD_ROW_MSK) >> COORD_ROW_OFST); @@ -1928,7 +1928,7 @@ int setDetectorPosition(int pos[]) { } // col - value = detPos[Y]; + value = detPos[X]; bus_w(addr, (bus_r(addr) & ~COORD_COL_MSK) | ((value << COORD_COL_OFST) & COORD_COL_MSK)); valueRead = ((bus_r(addr) & COORD_COL_MSK) >> COORD_COL_OFST); @@ -1939,7 +1939,8 @@ int setDetectorPosition(int pos[]) { } if (ret == OK) { - LOG(logINFO, ("\tPosition set to [%d, %d]\n", detPos[X], detPos[Y])); + LOG(logINFO, + ("\tPosition set to [%d, %d] #(col, row)\n", detPos[X], detPos[Y])); } return ret; @@ -3095,8 +3096,8 @@ void *start_timer(void *arg) { header->frameNumber = virtual_currentFrameNumber; header->packetNumber = 0; header->modId = virtual_moduleid; - header->row = detPos[X]; - header->column = detPos[Y]; + header->row = detPos[Y]; + header->column = detPos[X]; // fill data memcpy(packetData + sizeof(sls_detector_header), imageData, datasize); diff --git a/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer b/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer index f29f5432f..cffb0ca10 100755 Binary files a/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer and b/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer differ diff --git a/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer b/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer index 82185e43b..1bfb1843b 100755 Binary files a/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer and b/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer differ diff --git a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c index 46f8fa9a2..0a4e6fe89 100644 --- a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c @@ -21,7 +21,7 @@ #include #include #endif - +extern int portno; // Global variable from slsDetectorServer_funcs extern int debugflag; extern int updateFlag; @@ -1621,6 +1621,7 @@ int configureMAC() { int setDetectorPosition(int pos[]) { int ret = OK; + // row, col uint32_t innerPos[2] = {pos[X], pos[Y]}; uint32_t outerPos[2] = {pos[X], pos[Y]}; int selInterface = getPrimaryInterface(); @@ -1630,15 +1631,16 @@ int setDetectorPosition(int pos[]) { ("Setting detector position: 1 Interface %s \n(%d, %d)\n", (selInterface ? "Inner" : "Outer"), innerPos[X], innerPos[Y])); } else { - ++outerPos[X]; + // top has row incremented by 1 + ++innerPos[Y]; LOG(logDEBUG, ("Setting detector position: 2 Interfaces \n" " inner top(%d, %d), outer bottom(%d, %d)\n", innerPos[X], innerPos[Y], outerPos[X], outerPos[Y])); } - detPos[0] = innerPos[0]; - detPos[1] = innerPos[1]; - detPos[2] = outerPos[0]; - detPos[3] = outerPos[1]; + detPos[0] = innerPos[X]; + detPos[1] = innerPos[Y]; + detPos[2] = outerPos[X]; + detPos[3] = outerPos[Y]; // row // outer @@ -1676,8 +1678,8 @@ int setDetectorPosition(int pos[]) { if (ret == OK) { if (getNumberofUDPInterfaces() == 1) { - LOG(logINFOBLUE, - ("Position set to [%d, %d]\n", innerPos[X], innerPos[Y])); + LOG(logINFOBLUE, ("Position set to [%d, %d] #(col, row)\n", + innerPos[X], innerPos[Y])); } else { LOG(logINFOBLUE, (" Inner (top) position set to [%d, %d]\n", innerPos[X], innerPos[Y])); @@ -2531,8 +2533,16 @@ void *start_timer(void *arg) { if (i > 0 && i % pixelsPerPacket == 0) { ++pixelVal; } +// to debug multi module geometry (row, column) in virtual servers (all pixels +// in a module set to particular value) +#ifdef TEST_MOD_GEOMETRY + *((uint16_t *)(imageData + i * sizeof(uint16_t))) = + portno % 1900 + (i >= npixels / 2 ? 1 : 0); +#else *((uint16_t *)(imageData + i * sizeof(uint16_t))) = virtual_image_test_mode ? 0x0FFE : (uint16_t)pixelVal; + +#endif } } @@ -2557,6 +2567,10 @@ void *start_timer(void *arg) { int srcOffset = 0; int srcOffset2 = DATA_BYTES / 2; + int row0 = (numInterfaces == 1 ? detPos[1] : detPos[3]); + int col0 = (numInterfaces == 1 ? detPos[0] : detPos[2]); + int row1 = detPos[1]; + int col1 = detPos[0]; // loop packet (128 packets) for (int i = 0; i != maxPacketsPerFrame; ++i) { @@ -2576,8 +2590,8 @@ void *start_timer(void *arg) { header->frameNumber = frameNr + iframes; header->packetNumber = pnum; header->modId = 0; - header->row = detPos[0]; - header->column = detPos[1]; + header->row = row0; + header->column = col0; // fill data memcpy(packetData + sizeof(sls_detector_header), @@ -2603,8 +2617,8 @@ void *start_timer(void *arg) { header->frameNumber = frameNr + iframes; header->packetNumber = pnum; header->modId = 0; - header->row = detPos[2]; - header->column = detPos[3]; + header->row = row1; + header->column = col1; // fill data memcpy(packetData2 + sizeof(sls_detector_header), diff --git a/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer b/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer index b8339f180..0edac6314 100755 Binary files a/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer and b/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer differ diff --git a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c index 99b2f2fe0..dc8c0d9b8 100644 --- a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c @@ -1731,8 +1731,8 @@ void *start_timer(void *arg) { header->frameNumber = frameNr + iframes; header->packetNumber = i; header->modId = 0; - header->row = detPos[X]; - header->column = detPos[Y]; + header->row = detPos[Y]; + header->column = detPos[X]; // fill data memcpy(packetData + sizeof(sls_detector_header), diff --git a/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer b/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer index 9f01815c4..186517f11 100755 Binary files a/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer and b/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer differ diff --git a/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c index 76026462b..21d7fd341 100644 --- a/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c @@ -1941,7 +1941,7 @@ int setDetectorPosition(int pos[]) { int ret = OK; // row - value = detPos[X]; + value = detPos[Y]; bus_w(addr, (bus_r(addr) & ~COORD_ROW_MSK) | ((value << COORD_ROW_OFST) & COORD_ROW_MSK)); valueRead = ((bus_r(addr) & COORD_ROW_MSK) >> COORD_ROW_OFST); @@ -1952,7 +1952,7 @@ int setDetectorPosition(int pos[]) { } // col - value = detPos[Y]; + value = detPos[X]; bus_w(addr, (bus_r(addr) & ~COORD_COL_MSK) | ((value << COORD_COL_OFST) & COORD_COL_MSK)); valueRead = ((bus_r(addr) & COORD_COL_MSK) >> COORD_COL_OFST); @@ -1963,7 +1963,8 @@ int setDetectorPosition(int pos[]) { } if (ret == OK) { - LOG(logINFO, ("\tPosition set to [%d, %d]\n", detPos[X], detPos[Y])); + LOG(logINFO, + ("\tPosition set to [%d, %d] #(col, row)\n", detPos[X], detPos[Y])); } return ret; @@ -2385,8 +2386,8 @@ void *start_timer(void *arg) { header->frameNumber = virtual_currentFrameNumber; header->packetNumber = i; header->modId = virtual_moduleid; - header->row = detPos[X]; - header->column = detPos[Y]; + header->row = detPos[Y]; + header->column = detPos[X]; // fill data memcpy(packetData + sizeof(sls_detector_header), diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer.c index f9c832bb5..659166071 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer.c @@ -39,6 +39,7 @@ extern int masterCommandLine; #ifdef EIGERD extern int topCommandLine; #endif +int portno = DEFAULT_PORTNO; void error(char *msg) { perror(msg); } @@ -50,7 +51,6 @@ void sigInterruptHandler(int p) { int main(int argc, char *argv[]) { // options - int portno = DEFAULT_PORTNO; isControlServer = 1; debugflag = 0; updateFlag = 0; diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 212d6f4dc..9798c9cf2 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -62,8 +62,8 @@ int firstUDPDestination = 0; int configured = FAIL; char configureMessage[MAX_STR_LENGTH] = "udp parameters not configured yet"; -int maxydet = -1; -int detectorId = -1; +int maxYMods = -1; +int moduleIndex = -1; // Local variables int (*flist[NUM_DET_FUNCTIONS])(int); @@ -81,27 +81,14 @@ char scanErrMessage[MAX_STR_LENGTH] = ""; /* initialization functions */ int updateModeAllowedFunction(int file_des) { - enum detFuncs allowedFuncs[] = {F_EXEC_COMMAND, - F_GET_DETECTOR_TYPE, - F_GET_FIRMWARE_VERSION, - F_GET_SERVER_VERSION, - F_GET_SERIAL_NUMBER, - F_WRITE_REGISTER, - F_READ_REGISTER, - F_LOCK_SERVER, - F_GET_LAST_CLIENT_IP, - F_PROGRAM_FPGA, - F_RESET_FPGA, - F_CHECK_VERSION, - F_REBOOT_CONTROLLER, - F_GET_KERNEL_VERSION, - F_UPDATE_KERNEL, - F_UPDATE_DETECTOR_SERVER, - F_GET_UPDATE_MODE, - F_SET_UPDATE_MODE, - F_GET_NUM_CHANNELS, - F_GET_NUM_INTERFACES, - F_ACTIVATE}; + enum detFuncs allowedFuncs[] = { + F_EXEC_COMMAND, F_GET_DETECTOR_TYPE, F_GET_FIRMWARE_VERSION, + F_GET_SERVER_VERSION, F_GET_SERIAL_NUMBER, F_WRITE_REGISTER, + F_READ_REGISTER, F_LOCK_SERVER, F_GET_LAST_CLIENT_IP, + F_PROGRAM_FPGA, F_RESET_FPGA, F_CHECK_VERSION, + F_REBOOT_CONTROLLER, F_GET_KERNEL_VERSION, F_UPDATE_KERNEL, + F_UPDATE_DETECTOR_SERVER, F_GET_UPDATE_MODE, F_SET_UPDATE_MODE, + F_GET_NUM_CHANNELS, F_GET_NUM_INTERFACES, F_ACTIVATE}; size_t allowedFuncsSize = sizeof(allowedFuncs) / sizeof(enum detFuncs); for (unsigned int i = 0; i < allowedFuncsSize; ++i) { @@ -129,6 +116,7 @@ void init_detector() { #ifdef VIRTUAL LOG(logINFO, ("This is a VIRTUAL detector\n")); udpDetails[0].srcip = LOCALHOSTIP_INT; + udpDetails[0].srcip2 = LOCALHOSTIP_INT; #endif udpDetails[0].srcport = DEFAULT_UDP_SRC_PORTNO; udpDetails[0].dstport = DEFAULT_UDP_DST_PORTNO; @@ -4700,7 +4688,7 @@ int get_read_n_rows(int file_des) { } void calculate_and_set_position() { - if (maxydet == -1 || detectorId == -1) { + if (maxYMods == -1 || moduleIndex == -1) { ret = FAIL; sprintf(mess, "Could not set detector position (did not get multi size).\n"); @@ -4709,21 +4697,20 @@ void calculate_and_set_position() { } // calculating new position - int modulePorts[2] = {1, 1}; + int pos[2] = {0, 0}; + + int portGeometry[2] = {1, 1}; // position does change for eiger and jungfrau (2 interfaces) #if defined(EIGERD) - modulePorts[1] = getNumberofUDPInterfaces(); // horz + portGeometry[X] = getNumberofUDPInterfaces(); // horz #elif defined(JUNGFRAUD) - modulePorts[0] = getNumberofUDPInterfaces(); // vert + portGeometry[Y] = getNumberofUDPInterfaces(); // vert #endif - int maxy = maxydet * modulePorts[0]; - int pos[2] = {0, 0}; - // row - pos[0] = (detectorId % maxy); - // col for horiz. udp ports - pos[1] = (detectorId / maxy) * modulePorts[1]; - - LOG(logDEBUG, ("Setting Positions (%d,%d)\n", pos[0], pos[1])); + LOG(logDEBUG1, ("moduleIndex:%d maxymods:%d portGeo.x:%d portgeo.y:%d\n", + moduleIndex, maxYMods, portGeometry[X], portGeometry[Y])); + pos[Y] = (moduleIndex % maxYMods) * portGeometry[Y]; + pos[X] = (moduleIndex / maxYMods) * portGeometry[X]; + LOG(logINFO, ("Setting Positions (%d,%d) #(col, row)\n", pos[X], pos[Y])); if (setDetectorPosition(pos) == FAIL) { ret = FAIL; sprintf(mess, "Could not set detector position.\n"); @@ -4735,8 +4722,8 @@ void calculate_and_set_position() { if (udpDetails[0].srcmac == 0) { char dmac[MAC_ADDRESS_SIZE]; memset(dmac, 0, MAC_ADDRESS_SIZE); - sprintf(dmac, "aa:bb:cc:dd:%02x:%02x", pos[0] & 0xFF, - pos[1] & 0xFF); + sprintf(dmac, "aa:bb:cc:dd:%02x:%02x", pos[X] & 0xFF, + pos[Y] & 0xFF); LOG(logINFO, ("Udp source mac address created: %s\n", dmac)); unsigned char a[6]; sscanf(dmac, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", &a[0], &a[1], &a[2], @@ -4755,8 +4742,8 @@ void calculate_and_set_position() { if (udpDetails[0].srcmac2 == 0) { char dmac2[MAC_ADDRESS_SIZE]; memset(dmac2, 0, MAC_ADDRESS_SIZE); - sprintf(dmac2, "aa:bb:cc:dd:%02x:%02x", (pos[0] + 1) & 0xFF, - pos[1] & 0xFF); + sprintf(dmac2, "aa:bb:cc:dd:%02x:%02x", (pos[X] + 1) & 0xFF, + pos[Y] & 0xFF); LOG(logINFO, ("Udp source mac address2 created: %s\n", dmac2)); unsigned char a[6]; sscanf(dmac2, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", &a[0], &a[1], @@ -4784,15 +4771,16 @@ int set_detector_position(int file_des) { if (receiveData(file_des, args, sizeof(args), INT32) < 0) return printSocketReadError(); - LOG(logINFO, ("Setting detector positions: [%u, %u]\n", args[0], args[1])); + LOG(logDEBUG, ("Setting detector positions: [maxy:%u, modIndex:%u]\n", + args[0], args[1])); // only set if (Server_VerifyLock() == OK) { // if in update mode, there is no need to do this (also detector not set // up) if (!updateFlag && check_detector_idle("configure mac") == OK) { - maxydet = args[0]; - detectorId = args[1]; + maxYMods = args[0]; + moduleIndex = args[1]; calculate_and_set_position(); } } diff --git a/slsDetectorSoftware/src/DetectorImpl.cpp b/slsDetectorSoftware/src/DetectorImpl.cpp index dc3fefac6..0edf633a9 100644 --- a/slsDetectorSoftware/src/DetectorImpl.cpp +++ b/slsDetectorSoftware/src/DetectorImpl.cpp @@ -602,14 +602,12 @@ void DetectorImpl::readFrameFromReceiver() { currentSubFrameIndex = zHeader.expLength; coordY = zHeader.row; coordX = zHeader.column; - if (eiger) { - coordY = (nY - 1) - coordY; - } flipRows = zHeader.flipRows; if (zHeader.completeImage == 0) { completeImage = false; } LOG(logDEBUG1) + << zmqSocket[isocket]->GetPortNumber() << " " << "Header Info:" "\n\tcurrentFileName: " << currentFileName << "\n\tcurrentAcquisitionIndex: " diff --git a/slsReceiverSoftware/src/DataStreamer.cpp b/slsReceiverSoftware/src/DataStreamer.cpp index cef26f302..336120322 100644 --- a/slsReceiverSoftware/src/DataStreamer.cpp +++ b/slsReceiverSoftware/src/DataStreamer.cpp @@ -17,12 +17,11 @@ const std::string DataStreamer::TypeName = "DataStreamer"; DataStreamer::DataStreamer(int ind, Fifo *f, uint32_t *dr, ROI *r, uint64_t *fi, - bool fr, slsDetectorDefs::xy nm, bool *qe, + bool fr, slsDetectorDefs::xy np, bool *qe, uint64_t *tot) : ThreadObject(ind, TypeName), fifo(f), dynamicRange(dr), roi(r), - fileIndex(fi), flipRows(fr), quadEnable(qe), totalNumFrames(tot) { - numMods.x = nm.x; - numMods.y = nm.y; + fileIndex(fi), flipRows(fr), numPorts(np), quadEnable(qe), + totalNumFrames(tot) { LOG(logDEBUG) << "DataStreamer " << ind << " created"; } @@ -63,10 +62,7 @@ void DataStreamer::RecordFirstIndex(uint64_t fnum, char *buf) { void DataStreamer::SetGeneralData(GeneralData *g) { generalData = g; } -void DataStreamer::SetNumberofModules(xy nm) { - numMods.x = nm.x; - numMods.y = nm.y; -} +void DataStreamer::SetNumberofPorts(xy np) { numPorts = np; } void DataStreamer::SetFlipRows(bool fd) { flipRows = fd; } @@ -220,8 +216,8 @@ int DataStreamer::SendHeader(sls_receiver_header *rheader, uint32_t size, zHeader.dynamicRange = *dynamicRange; zHeader.fileIndex = *fileIndex; - zHeader.ndetx = numMods.x; - zHeader.ndety = numMods.y; + zHeader.ndetx = numPorts.x; + zHeader.ndety = numPorts.y; zHeader.npixelsx = nx; zHeader.npixelsy = ny; zHeader.imageSize = size; diff --git a/slsReceiverSoftware/src/DataStreamer.h b/slsReceiverSoftware/src/DataStreamer.h index 773986da3..e838a790e 100644 --- a/slsReceiverSoftware/src/DataStreamer.h +++ b/slsReceiverSoftware/src/DataStreamer.h @@ -33,12 +33,12 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject { * @param r roi * @param fi pointer to file index * @param fr flip rows - * @param nm number of modules in each dimension + * @param nm number of ports in each dimension * @param qe pointer to quad Enable * @param tot pointer to total number of frames */ DataStreamer(int ind, Fifo *f, uint32_t *dr, ROI *r, uint64_t *fi, bool fr, - xy nm, bool *qe, uint64_t *tot); + xy np, bool *qe, uint64_t *tot); /** * Destructor @@ -46,39 +46,11 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject { */ ~DataStreamer(); - /** - * Set Fifo pointer to the one given - * @param f address of Fifo pointer - */ void SetFifo(Fifo *f); - - /** - * Reset parameters for new acquisition - */ void ResetParametersforNewAcquisition(const std::string &fname); - - /** - * Set GeneralData pointer to the one given - * @param g address of GeneralData (Detector Data) pointer - */ void SetGeneralData(GeneralData *g); - - /** - * Set number of detectors - * @param nm number of modules/ports in both dimensions - */ - void SetNumberofModules(xy nm); - - /** - * Set Flipped rows - * @param fd flip rows enable - */ + void SetNumberofPorts(xy np); void SetFlipRows(bool fd); - - /** - * Set additional json header - * @param json additional json header - */ void SetAdditionalJsonHeader(const std::map &json); @@ -143,34 +115,16 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject { int SendHeader(sls_receiver_header *rheader, uint32_t size = 0, uint32_t nx = 0, uint32_t ny = 0, bool dummy = true); - /** type of thread */ static const std::string TypeName; - - /** GeneralData (Detector Data) object */ const GeneralData *generalData{nullptr}; - - /** Fifo structure */ Fifo *fifo; - - /** ZMQ Socket - Receiver to Client */ ZmqSocket *zmqSocket{nullptr}; - - /** Pointer to dynamic range */ uint32_t *dynamicRange; - - /** ROI */ ROI *roi; - - /** adc Configured */ int adcConfigured{-1}; - - /** Pointer to file index */ uint64_t *fileIndex; - - /** flip rows */ bool flipRows; - /** additional json header */ std::map additionalJsonHeader; /** Used by streamer thread to update local copy (reduce number of locks @@ -189,18 +143,12 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject { /** Frame Number of First Frame */ uint64_t firstIndex{0}; - /* File name to stream */ std::string fileNametoStream; /** Complete buffer used for roi, eg. shortGotthard */ char *completeBuffer{nullptr}; - /** Number of Modules in X and Y dimension */ - xy numMods{1, 1}; - - /** Quad Enable */ + xy numPorts{1, 1}; bool *quadEnable; - - /** Total number of frames */ uint64_t *totalNumFrames; }; diff --git a/slsReceiverSoftware/src/Implementation.cpp b/slsReceiverSoftware/src/Implementation.cpp index 0e6419404..714c4d146 100644 --- a/slsReceiverSoftware/src/Implementation.cpp +++ b/slsReceiverSoftware/src/Implementation.cpp @@ -217,7 +217,7 @@ slsDetectorDefs::xy Implementation::GetPortGeometry() { xy portGeometry{1, 1}; if (detType == EIGER) portGeometry.x = numUDPInterfaces; - else // (jungfrau and gotthard2) + else if (detType == JUNGFRAU) portGeometry.y = numUDPInterfaces; return portGeometry; } @@ -226,18 +226,18 @@ void Implementation::setDetectorSize(const slsDetectorDefs::xy size) { xy portGeometry = GetPortGeometry(); std::string log_message = "Detector Size (ports): ("; - numModules.x = portGeometry.x * size.x; - numModules.y = portGeometry.y * size.y; - xy nm{numModules.x, numModules.y}; + numModules = size; + numPorts.x = portGeometry.x * size.x; + numPorts.y = portGeometry.y * size.y; if (quadEnable) { - nm.x = 1; - nm.y = 2; + numPorts.x = 1; + numPorts.y = 2; } for (const auto &it : dataStreamer) { - it->SetNumberofModules(nm); + it->SetNumberofPorts(numPorts); } - LOG(logINFO) << "Detector Size (ports): " << sls::ToString(numModules); + LOG(logINFO) << "Detector Size (ports): " << sls::ToString(numPorts); } int Implementation::getModulePositionId() const { return modulePos; } @@ -254,8 +254,16 @@ void Implementation::setModulePositionId(const int id) { for (unsigned int i = 0; i < listener.size(); ++i) { uint16_t row = 0, col = 0; row = (modulePos % numModules.y) * portGeometry.y; - col = (modulePos / numModules.y) * portGeometry.x + i; - + col = (modulePos / numModules.y) * portGeometry.x; + if (portGeometry.y == 2) { + row += i; + } + if (portGeometry.x == 2) { + col += i; + } + LOG(logDEBUG1) << i << ":numModules:" << numModules.x << "," + << numModules.y << " portGeometry:" << portGeometry.x + << "," << portGeometry.y; listener[i]->SetHardCodedPosition(row, col); } } @@ -758,12 +766,7 @@ void Implementation::StartMasterWriter() { MasterAttributes masterAttributes; masterAttributes.detType = detType; masterAttributes.timingMode = timingMode; - xy nm{numModules.x, numModules.y}; - if (quadEnable) { - nm.x = 1; - nm.y = 2; - } - masterAttributes.geometry = xy(nm.x, nm.y); + masterAttributes.geometry = numPorts; masterAttributes.imageSize = generalData->imageSize; masterAttributes.nPixels = xy(generalData->nPixelsX, generalData->nPixelsY); @@ -823,12 +826,12 @@ void Implementation::StartMasterWriter() { std::array virtualFileAndDatasetNames; // create virtual hdf5 file (if multiple files) if (dataProcessor[0]->GetFilesInAcquisition() > 1 || - (numModules.x * numModules.y) > 1) { + (numPorts.x * numPorts.y) > 1) { virtualFileAndDatasetNames = dataProcessor[0]->CreateVirtualFile( filePath, fileName, fileIndex, overwriteEnable, silentMode, modulePos, numUDPInterfaces, framesPerFile, - numberOfTotalFrames, numModules.x, numModules.y, + numberOfTotalFrames, numPorts.x, numPorts.y, dynamicRange, &hdf5LibMutex); } // link file in master @@ -879,12 +882,6 @@ void Implementation::setNumberofUDPInterfaces(const int n) { } if (numUDPInterfaces != n) { - - // reduce number of detectors to size with 1 interface - xy portGeometry = GetPortGeometry(); - numModules.x /= portGeometry.x; - numModules.y /= portGeometry.y; - // clear all threads and fifos listener.clear(); dataProcessor.clear(); @@ -933,15 +930,12 @@ void Implementation::setNumberofUDPInterfaces(const int n) { if (dataStreamEnable) { try { bool flip = flipRows; - xy nm{numModules.x, numModules.y}; if (quadEnable) { flip = (i == 1 ? true : false); - nm.x = 1; - nm.y = 2; } dataStreamer.push_back(sls::make_unique( i, fifo[i].get(), &dynamicRange, &roi, &fileIndex, flip, - nm, &quadEnable, &numberOfTotalFrames)); + numPorts, &quadEnable, &numberOfTotalFrames)); dataStreamer[i]->SetGeneralData(generalData); dataStreamer[i]->CreateZmqSockets( &numUDPInterfaces, streamingPort, streamingSrcIP, @@ -1063,15 +1057,12 @@ void Implementation::setDataStreamEnable(const bool enable) { for (int i = 0; i < numUDPInterfaces; ++i) { try { bool flip = flipRows; - xy nm{numModules.x, numModules.y}; if (quadEnable) { flip = (i == 1 ? true : false); - nm.x = 1; - nm.y = 2; } dataStreamer.push_back(sls::make_unique( i, fifo[i].get(), &dynamicRange, &roi, &fileIndex, flip, - nm, &quadEnable, &numberOfTotalFrames)); + numPorts, &quadEnable, &numberOfTotalFrames)); dataStreamer[i]->SetGeneralData(generalData); dataStreamer[i]->CreateZmqSockets( &numUDPInterfaces, streamingPort, streamingSrcIP, @@ -1499,18 +1490,12 @@ bool Implementation::getQuad() const { return quadEnable; } void Implementation::setQuad(const bool b) { if (quadEnable != b) { quadEnable = b; - + setDetectorSize(numModules); if (!quadEnable) { - xy nm{numModules.x, numModules.y}; for (const auto &it : dataStreamer) { - it->SetNumberofModules(nm); it->SetFlipRows(flipRows); } } else { - xy nm{1, 2}; - for (const auto &it : dataStreamer) { - it->SetNumberofModules(nm); - } if (dataStreamer.size() == 2) { dataStreamer[0]->SetFlipRows(false); dataStreamer[1]->SetFlipRows(true); diff --git a/slsReceiverSoftware/src/Implementation.h b/slsReceiverSoftware/src/Implementation.h index a9080b1f5..558044e22 100644 --- a/slsReceiverSoftware/src/Implementation.h +++ b/slsReceiverSoftware/src/Implementation.h @@ -290,6 +290,7 @@ class Implementation : private virtual slsDetectorDefs { // config parameters detectorType detType{GENERIC}; xy numModules{1, 1}; + xy numPorts{1, 1}; int modulePos{0}; std::string detHostname; bool silentMode{false}; diff --git a/slsReceiverSoftware/src/Listener.cpp b/slsReceiverSoftware/src/Listener.cpp index a5c6dfda1..c80cd0590 100644 --- a/slsReceiverSoftware/src/Listener.cpp +++ b/slsReceiverSoftware/src/Listener.cpp @@ -210,6 +210,8 @@ void Listener::CreateDummySocketForUDPSocketBufferSize(int s) { void Listener::SetHardCodedPosition(uint16_t r, uint16_t c) { row = r; column = c; + LOG(logDEBUG1) << "Setting hardcoded position [" << index + << "] (row: " << row << ", col: " << column << ")"; } void Listener::ThreadExecution() { diff --git a/slsReceiverSoftware/src/MultiReceiverApp.cpp b/slsReceiverSoftware/src/MultiReceiverApp.cpp index 5cb6cc8de..a02656478 100644 --- a/slsReceiverSoftware/src/MultiReceiverApp.cpp +++ b/slsReceiverSoftware/src/MultiReceiverApp.cpp @@ -47,12 +47,12 @@ void printHelp() { } /** - * Start Acquisition Call back (slsMultiReceiver writes data if file write enabled) - * if registerCallBackRawDataReady or registerCallBackRawDataModifyReady registered, - * users get data + * Start Acquisition Call back (slsMultiReceiver writes data if file write + * enabled) if registerCallBackRawDataReady or + * registerCallBackRawDataModifyReady registered, users get data */ -int StartAcq(const std::string & filePath, const std::string & fileName, uint64_t fileIndex, - size_t imageSize, void *objectPointer) { +int StartAcq(const std::string &filePath, const std::string &fileName, + uint64_t fileIndex, size_t imageSize, void *objectPointer) { LOG(logINFOBLUE) << "#### StartAcq: filePath:" << filePath << " fileName:" << fileName << " fileIndex:" << fileIndex << " imageSize:" << imageSize << " ####"; @@ -61,8 +61,8 @@ int StartAcq(const std::string & filePath, const std::string & fileName, uint64_ /** Acquisition Finished Call back */ void AcquisitionFinished(uint64_t framesCaught, void *objectPointer) { - LOG(logINFOBLUE) << "#### AcquisitionFinished: framesCaught:" << framesCaught - << " ####"; + LOG(logINFOBLUE) << "#### AcquisitionFinished: framesCaught:" + << framesCaught << " ####"; } /** @@ -76,16 +76,16 @@ void GetData(slsDetectorDefs::sls_receiver_header *header, char *dataPointer, PRINT_IN_COLOR( detectorHeader.modId ? detectorHeader.modId : detectorHeader.row, - "#### %d GetData: ####\n" + "#### %d %d GetData: ####\n" "frameNumber: %lu\t\texpLength: %u\t\tpacketNumber: %u\t\tbunchId: %lu" "\t\ttimestamp: %lu\t\tmodId: %u\t\t" "row: %u\t\tcolumn: %u\t\treserved: %u\t\tdebug: %u" "\t\troundRNumber: %u\t\tdetType: %u\t\tversion: %u" //"\t\tpacketsMask:%s" "\t\tfirstbytedata: 0x%x\t\tdatsize: %zu\n\n", - detectorHeader.row, (long unsigned int)detectorHeader.frameNumber, - detectorHeader.expLength, detectorHeader.packetNumber, - (long unsigned int)detectorHeader.bunchId, + detectorHeader.column, detectorHeader.row, + (long unsigned int)detectorHeader.frameNumber, detectorHeader.expLength, + detectorHeader.packetNumber, (long unsigned int)detectorHeader.bunchId, (long unsigned int)detectorHeader.timestamp, detectorHeader.modId, detectorHeader.row, detectorHeader.column, detectorHeader.reserved, detectorHeader.debug, detectorHeader.roundRNumber, diff --git a/slsSupportLib/include/sls/ZmqSocket.h b/slsSupportLib/include/sls/ZmqSocket.h index 65523c227..803a5bafe 100644 --- a/slsSupportLib/include/sls/ZmqSocket.h +++ b/slsSupportLib/include/sls/ZmqSocket.h @@ -28,9 +28,9 @@ struct zmqHeader { uint32_t jsonversion{0}; uint32_t dynamicRange{0}; uint64_t fileIndex{0}; - /** number of detectors in x axis */ + /** number of detectors/port in x axis */ uint32_t ndetx{0}; - /** number of detectors in y axis */ + /** number of detectors/port in y axis */ uint32_t ndety{0}; /** number of pixels/channels in x axis for this zmq socket */ uint32_t npixelsx{0}; diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index a2f98325c..652a610d0 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -6,10 +6,10 @@ #define APIRECEIVER 0x220408 #define APIGUI 0x220328 -#define APICTB 0x220408 -#define APIGOTTHARD 0x220408 -#define APIGOTTHARD2 0x220408 -#define APIJUNGFRAU 0x220408 -#define APIMYTHEN3 0x220408 -#define APIMOENCH 0x220408 -#define APIEIGER 0x220408 +#define APICTB 0x220428 +#define APIGOTTHARD 0x220428 +#define APIGOTTHARD2 0x220428 +#define APIJUNGFRAU 0x220428 +#define APIMYTHEN3 0x220428 +#define APIMOENCH 0x220427 +#define APIEIGER 0x220428