Fixpositions (#436)

* fix positions on server side

* wip

* numports wip

* wip

* jungfrau top inner interface row increment

* x, y detpos, wip

* removed eiger row indices flipping in gui (bottom flipping maintained)

* wip

* wip, jungfrau numinterfaces2

* jungfrau virtual works

* eiger, jungfrau, g2 virtual server works

* eiger positions fix, wip

* binaries in

* minor printout

* binaries in

* pointer bug

* comment to define test_mod_geometry define
This commit is contained in:
Dhanya Thattil 2022-04-28 16:32:26 +02:00 committed by GitHub
parent b7153fe3e0
commit afeee5501c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
26 changed files with 162 additions and 215 deletions

View File

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

View File

@ -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),

View File

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

View File

@ -19,7 +19,7 @@
#include <pthread.h>
#include <time.h>
#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))) =

View File

@ -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);

View File

@ -21,7 +21,7 @@
#include <pthread.h>
#include <time.h>
#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),

View File

@ -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),

View File

@ -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),

View File

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

View File

@ -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();
}
}

View File

@ -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: "

View File

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

View File

@ -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<std::string, std::string> &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<std::string, std::string> 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;
};

View File

@ -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<std::string, 2> 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<DataStreamer>(
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<DataStreamer>(
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);

View File

@ -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};

View File

@ -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() {

View File

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

View File

@ -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};

View File

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