From f8b5795c2947a574c9c2b295bb6198a38436f7a9 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 16 Aug 2021 16:34:11 +0200 Subject: [PATCH] updated for partialread --- RELEASE.txt | 4 + .../slsDetectorFunctionList.c | 85 ++++++++++++------- .../slsDetectorFunctionList.c | 31 +++---- 3 files changed, 70 insertions(+), 50 deletions(-) diff --git a/RELEASE.txt b/RELEASE.txt index 4c64e7a44..4d51875b4 100755 --- a/RELEASE.txt +++ b/RELEASE.txt @@ -75,6 +75,10 @@ serialnumber (put) dbitpipeline readnlines->partialread +setting number of udp interfaces from 1 to 2, didnt get image in gui + +virtual server plots increasing values for every packet.. not every pixel + 3. Firmware Requirements ======================== diff --git a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c index fec8f9127..9638745e3 100644 --- a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c @@ -2306,55 +2306,70 @@ void *start_timer(void *arg) { int tgEnable = send_to_ten_gig; int datasize = (tgEnable ? 4096 : 1024); int packetsize = datasize + sizeof(sls_detector_header); - int numPacketsPerFrame = (tgEnable ? 4 : 16) * dr; + 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 ntotpixels = 256 * 256 * 4; + + int partialReadout = getPartialReadout(); + if (partialReadout == -1) { + LOG(logERROR, + ("partial readout is -1. Assuming no partial readout.\n")); + partialReadout = MAX_ROWS_PER_READOUT; + } + const int maxRows = MAX_ROWS_PER_READOUT; + const int packetsPerFrame = + (maxPacketsPerFrame * partialReadout) / maxRows; + LOG(logDEBUG1, (" dr:%d\n bytesperpixel:%f\n tgenable:%d\n datasize:%d\n " - "packetsize:%d\n numpackes:%d\n npixelsx:%d\n databytes:%d\n " - "ntotpixels:%d\n", - dr, bytesPerPixel, tgEnable, datasize, packetsize, numPacketsPerFrame, - npixelsx, databytes, ntotpixels)); + "packetsize:%d\n maxnumpackes:%d\n npixelsx:%d\n databytes:%d\n", + dr, bytesPerPixel, tgEnable, datasize, packetsize, maxPacketsPerFrame, + npixelsx, databytes)); // Generate data char imageData[databytes * 2]; memset(imageData, 0, databytes * 2); { - switch (dr) { - case 4: - for (int i = 0; i < ntotpixels / 2; ++i) { + int npixels = NCHAN * NCHIP; + const int pixelsPerPacket = (double)datasize / eiger_dynamicrange; + int pixelVal = 0; + if (dr == 4) { + npixels /= 2; + } + for (int i = 0; i < npixels; ++i) { + if (i > 0 && i % pixelsPerPacket == 0) { + ++pixelVal; + } + switch (dr) { + case 4: *((uint8_t *)(imageData + i)) = eiger_virtual_test_mode ? 0xEE - : (uint8_t)(((2 * i & 0xF) << 4) | ((2 * i + 1) & 0xF)); - } - break; - case 8: - for (int i = 0; i < ntotpixels; ++i) { + : (uint8_t)(((2 * pixelVal & 0xF) << 4) | ((2 * pixelVal + 1) & 0xF)); + break; + case 8: *((uint8_t *)(imageData + i)) = - eiger_virtual_test_mode ? 0xFE : (uint8_t)i; - } - break; - case 16: - for (int i = 0; i < ntotpixels; ++i) { + eiger_virtual_test_mode ? 0xFE : (uint8_t)pixelVal; + break; + case 16: *((uint16_t *)(imageData + i * sizeof(uint16_t))) = - eiger_virtual_test_mode ? 0xFFE : (uint16_t)i; - } - break; - case 32: - for (int i = 0; i < ntotpixels; ++i) { + eiger_virtual_test_mode ? 0xFFE + : (uint16_t)pixelVal; + break; + case 32: *((uint32_t *)(imageData + i * sizeof(uint32_t))) = - eiger_virtual_test_mode ? 0xFFFFFE : (uint32_t)i; + eiger_virtual_test_mode ? 0xFFFFFE + : (uint32_t)pixelVal; + break; + default: + break; } - break; - default: - break; } + } // Send data @@ -2381,7 +2396,13 @@ void *start_timer(void *arg) { int srcOffset2 = npixelsx; // loop packet - for (int i = 0; i != numPacketsPerFrame; ++i) { + for (int i = 0; i != maxPacketsPerFrame; ++i) { + + // calculate for partial readout + const int startval = 0; + const int endval = startval + packetsPerFrame - 1; + + // set header char packetData[packetsize]; memset(packetData, 0, packetsize); @@ -2443,13 +2464,15 @@ void *start_timer(void *arg) { } } } - if (eiger_virtual_left_datastream) { + if (eiger_virtual_left_datastream && i >= startval && i <= endval) { usleep(eiger_virtual_transmission_delay_left); sendUDPPacket(0, packetData, packetsize); + LOG(logDEBUG1, ("Sent left packet: %d\n", i)); } - if (eiger_virtual_right_datastream) { + if (eiger_virtual_right_datastream && i >= startval && i <= endval) { usleep(eiger_virtual_transmission_delay_right); sendUDPPacket(1, packetData2, packetsize); + LOG(logDEBUG1, ("Sent right packet: %d\n", i)); } } LOG(logINFO, ("Sent frame: %d[%lld]\n", iframes, diff --git a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c index fed28014b..09c4647f9 100644 --- a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c @@ -2358,20 +2358,9 @@ void *start_timer(void *arg) { // loop packet (128 packets) for (int i = 0; i != maxPacketsPerFrame; ++i) { - // send out only the partial packets - if (partialReadout != MAX_ROWS_PER_READOUT) { - // get the mid point - const int startval = + const int startval = (maxPacketsPerFrame / 2) - (packetsPerFrame / 2); - const int endval = startval + packetsPerFrame - 1; - LOG(logINFOBLUE, - ("packetsperframe:%d startval:%d endval:%d'\n", - packetsPerFrame, startval, endval)); - // skip sending out this packet - if (i < startval || i > endval) { - continue; - } - } + const int endval = startval + packetsPerFrame - 1; int pnum = i; // first interface @@ -2391,10 +2380,12 @@ void *start_timer(void *arg) { // fill data memcpy(packetData + sizeof(sls_detector_header), imageData + srcOffset, dataSize); - - sendUDPPacket(0, packetData, packetsize); srcOffset += dataSize; - LOG(logDEBUG1, ("Sent packet: %d [interface 0]\n", i)); + + if (i >= startval && i <= endval) { + sendUDPPacket(0, packetData, packetsize); + LOG(logDEBUG1, ("Sent packet: %d [interface 0]\n", i)); + } } // second interface @@ -2416,10 +2407,12 @@ void *start_timer(void *arg) { // fill data memcpy(packetData2 + sizeof(sls_detector_header), imageData + srcOffset2, dataSize); - - sendUDPPacket(1, packetData2, packetsize); srcOffset2 += dataSize; - LOG(logDEBUG1, ("Sent packet: %d [interface 1]\n", pnum)); + + if (i >= startval && i <= endval) { + sendUDPPacket(1, packetData2, packetsize); + LOG(logDEBUG1, ("Sent packet: %d [interface 1]\n", pnum)); + } } } LOG(logINFO, ("Sent frame: %d\n", iframes));