updated for partialread

This commit is contained in:
maliakal_d 2021-08-16 16:34:11 +02:00
parent 5f8dc7a7f0
commit f8b5795c29
3 changed files with 70 additions and 50 deletions

View File

@ -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
========================

View File

@ -2306,57 +2306,72 @@ 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);
{
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:
for (int i = 0; i < ntotpixels / 2; ++i) {
*((uint8_t *)(imageData + i)) =
eiger_virtual_test_mode
? 0xEE
: (uint8_t)(((2 * i & 0xF) << 4) | ((2 * i + 1) & 0xF));
}
: (uint8_t)(((2 * pixelVal & 0xF) << 4) | ((2 * pixelVal + 1) & 0xF));
break;
case 8:
for (int i = 0; i < ntotpixels; ++i) {
*((uint8_t *)(imageData + i)) =
eiger_virtual_test_mode ? 0xFE : (uint8_t)i;
}
eiger_virtual_test_mode ? 0xFE : (uint8_t)pixelVal;
break;
case 16:
for (int i = 0; i < ntotpixels; ++i) {
*((uint16_t *)(imageData + i * sizeof(uint16_t))) =
eiger_virtual_test_mode ? 0xFFE : (uint16_t)i;
}
eiger_virtual_test_mode ? 0xFFE
: (uint16_t)pixelVal;
break;
case 32:
for (int i = 0; i < ntotpixels; ++i) {
*((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;
}
}
}
// Send data
if (!skipData) {
uint64_t frameNr = 0;
@ -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,

View File

@ -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 =
(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;
}
}
int pnum = i;
// first interface
@ -2391,11 +2380,13 @@ void *start_timer(void *arg) {
// fill data
memcpy(packetData + sizeof(sls_detector_header),
imageData + srcOffset, dataSize);
sendUDPPacket(0, packetData, packetsize);
srcOffset += dataSize;
if (i >= startval && i <= endval) {
sendUDPPacket(0, packetData, packetsize);
LOG(logDEBUG1, ("Sent packet: %d [interface 0]\n", i));
}
}
// second interface
else if (numInterfaces == 2 && i >= (maxPacketsPerFrame / 2)) {
@ -2416,12 +2407,14 @@ void *start_timer(void *arg) {
// fill data
memcpy(packetData2 + sizeof(sls_detector_header),
imageData + srcOffset2, dataSize);
sendUDPPacket(1, packetData2, packetsize);
srcOffset2 += dataSize;
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));
clock_gettime(CLOCK_REALTIME, &end);
int64_t timeNs = ((end.tv_sec - begin.tv_sec) * 1E9 +