diff --git a/slsDetectorGui/forms/form_tab_advanced.ui b/slsDetectorGui/forms/form_tab_advanced.ui
index b6545fd4a..858567f9f 100755
--- a/slsDetectorGui/forms/form_tab_advanced.ui
+++ b/slsDetectorGui/forms/form_tab_advanced.ui
@@ -54,7 +54,7 @@
QTabWidget::North
- 2
+ 1
Qt::ElideLeft
@@ -132,102 +132,20 @@
Region of Interest
- -
-
+
-
+
-
+
0
0
-
-
- 130
- 0
-
-
- Add ROI Slot
-
-
-
- :/icons/images/add.png:/icons/images/add.png
+ X Min:
- -
-
-
-
- 0
- 0
-
-
-
-
- 130
- 0
-
-
-
- Get ROI
-
-
-
- :/icons/images/download.png:/icons/images/download.png
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 20
- 20
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 20
- 20
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 130
- 0
-
-
-
- Set ROI
-
-
-
- :/icons/images/upload.png:/icons/images/upload.png
-
-
-
- -
+
-
@@ -237,12 +155,12 @@
- 130
- 0
+ 0
+ 35
- Clear ROI
+ Clear ROI
@@ -250,45 +168,159 @@
- -
+
-
+
+
+
+ 160
+ 0
+
+
+
+ -1
+
+
+ 1279
+
+
+ -1
+
+
+
+ -
Qt::Horizontal
- 20
+ 40
20
- -
-
-
- QFrame::NoFrame
+
-
+
+
+
+ 0
+ 0
+
-
- true
+
+ X Max:
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
+
+ 160
+ 0
+
+
+
+ -1
+
+
+ 1279
+
+
+ -1
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Readout:
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 35
+
+
+
+ Set ROI
+
+
+
+ :/icons/images/refresh.png:/icons/images/refresh.png
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 160
+ 0
+
-
-
-
- 0
- 0
- 735
- 235
-
-
-
-
- 1
-
-
- 15
-
-
-
@@ -399,7 +431,7 @@
- Detector Control Port:
+ Readout Control Port:
@@ -910,7 +942,7 @@
- Detector UDP MAC:
+ Readout UDP MAC:
@@ -929,7 +961,7 @@
- Detector:
+ Readout:
@@ -968,7 +1000,7 @@
- Detector UDP IP:
+ Readout UDP IP:
@@ -981,7 +1013,7 @@
- Detector Stop Port:
+ Readout Stop Port:
@@ -1402,11 +1434,11 @@ Exposure Time of a sub frame. Only for Eiger in 32 bit mode
tabAdvancedSettings
spinSetAllTrimbits
- btnAddRoi
+ comboReadout
+ spinXmin
+ spinXmax
btnSetRoi
- btnGetRoi
btnClearRoi
- scrollArea
comboDetector
spinControlPort
spinStopPort
diff --git a/slsDetectorGui/include/qTabAdvanced.h b/slsDetectorGui/include/qTabAdvanced.h
index 921232914..62986e7b9 100755
--- a/slsDetectorGui/include/qTabAdvanced.h
+++ b/slsDetectorGui/include/qTabAdvanced.h
@@ -29,7 +29,6 @@ private slots:
void SetRxrUDPMAC();
void SetRxrZMQPort(int port);
void SetRxrZMQIP();
- void AddROISlot();
void GetROI();
void ClearROI();
void SetROI();
@@ -56,22 +55,12 @@ private:
void GetRxrUDPMAC();
void GetRxrZMQPort();
void GetRxrZMQIP();
- void ClearROIWidgets();
void GetAllTrimbits();
void GetNumStoragecells();
void GetSubExposureTime();
void GetSubDeadTime();
multiSlsDetector *myDet;
- /** ROI */
- std::vector lblFromX;
- std::vector spinFromX;
- std::vector lblFromY;
- std::vector spinFromY;
- std::vector lblToX;
- std::vector spinToX;
- std::vector lblToY;
- std::vector spinToY;
};
diff --git a/slsDetectorGui/src/qTabAdvanced.cpp b/slsDetectorGui/src/qTabAdvanced.cpp
index 72eb07e23..811fd8217 100755
--- a/slsDetectorGui/src/qTabAdvanced.cpp
+++ b/slsDetectorGui/src/qTabAdvanced.cpp
@@ -10,18 +10,7 @@ qTabAdvanced::qTabAdvanced(QWidget *parent, multiSlsDetector *detector)
FILE_LOG(logDEBUG) << "Advanced ready";
}
-qTabAdvanced::~qTabAdvanced() {
- for (size_t i = 0; i < lblFromX.size(); ++i) {
- delete lblFromX[i];
- delete lblFromY[i];
- delete lblToX[i];
- delete lblToY[i];
- delete spinFromX[i];
- delete spinFromY[i];
- delete spinToX[i];
- delete spinToY[i];
- }
-}
+qTabAdvanced::~qTabAdvanced() {}
void qTabAdvanced::SetupWidgetWindow() {
// enabling according to det type
@@ -93,9 +82,8 @@ void qTabAdvanced::Initialization() {
// roi
if (tab_roi->isEnabled()) {
- connect(btnAddRoi, SIGNAL(clicked()), this, SLOT(AddROISlot()));
+ connect(comboReadout, SIGNAL(currentIndexChanged(int)), this, SLOT(GetROI()));
connect(btnSetRoi, SIGNAL(clicked()), this, SLOT(SetROI()));
- connect(btnGetRoi, SIGNAL(clicked()), this, SLOT(GetROI()));
connect(btnClearRoi, SIGNAL(clicked()), this, SLOT(ClearROI()));
}
@@ -122,14 +110,20 @@ void qTabAdvanced::PopulateDetectors() {
FILE_LOG(logDEBUG) << "Populating detectors";
disconnect(comboDetector, SIGNAL(currentIndexChanged(int)), this,
SLOT(SetDetector(int)));
+ disconnect(comboReadout, SIGNAL(currentIndexChanged(int)), this, SLOT(GetROI()));
comboDetector->clear();
- for (unsigned int i = 0; i < myDet->size(); ++i)
+ comboReadout->clear();
+ for (unsigned int i = 0; i < myDet->size(); ++i) {
comboDetector->addItem(QString(myDet->getHostname(i).c_str()));
+ comboReadout->addItem(QString(myDet->getHostname(i).c_str()));
+ }
comboDetector->setCurrentIndex(0);
+ comboReadout->setCurrentIndex(0);
connect(comboDetector, SIGNAL(currentIndexChanged(int)), this,
SLOT(SetDetector(int)));
+ connect(comboReadout, SIGNAL(currentIndexChanged(int)), this, SLOT(GetROI()));
}
void qTabAdvanced::GetControlPort() {
@@ -462,173 +456,33 @@ void qTabAdvanced::SetRxrZMQIP() {
&qTabAdvanced::GetRxrZMQIP)
}
-void qTabAdvanced::AddROISlot() {
- FILE_LOG(logDEBUG) << "Add ROI Slot";
-
- QLabel *lFromX = new QLabel("x min:");
- QLabel *lFromY = new QLabel("y min:");
- QLabel *lToX = new QLabel("x max:");
- QLabel *lToY = new QLabel("y max:");
- QSpinBox *sFromX = new QSpinBox();
- QSpinBox *sFromY = new QSpinBox();
- QSpinBox *sToX = new QSpinBox();
- QSpinBox *sToY = new QSpinBox();
- lFromX->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
- lFromY->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
- lToX->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
- lToY->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
- sFromX->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
- sFromY->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
- sToX->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
- sToY->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
- lFromX->setFixedWidth(50);
- lFromY->setFixedWidth(50);
- lToX->setFixedWidth(50);
- lToY->setFixedWidth(50);
- sFromX->setFixedWidth(80);
- sFromY->setFixedWidth(80);
- sToX->setFixedWidth(80);
- sToY->setFixedWidth(80);
- sFromX->setFixedHeight(19);
- sFromY->setFixedHeight(19);
- sToX->setFixedHeight(19);
- sToY->setFixedHeight(19);
- sFromX->setMaximum(myDet->getTotalNumberOfChannels(slsDetectorDefs::X) - 1);
- sToX->setMaximum(myDet->getTotalNumberOfChannels(slsDetectorDefs::X) - 1);
- sFromY->setMaximum(myDet->getTotalNumberOfChannels(slsDetectorDefs::Y) - 1);
- sToY->setMaximum(myDet->getTotalNumberOfChannels(slsDetectorDefs::Y) - 1);
- sFromX->setMinimum(-1);
- sToX->setMinimum(-1);
- sFromY->setMinimum(-1);
- sToY->setMinimum(-1);
- sFromX->setValue(-1);
- sFromY->setValue(-1);
- sToX->setValue(-1);
- sToY->setValue(-1);
-
- lblFromX.push_back(lFromX);
- lblFromY.push_back(lFromY);
- lblToX.push_back(lToX);
- lblToY.push_back(lToY);
- spinFromX.push_back(sFromX);
- spinFromY.push_back(sFromY);
- spinToX.push_back(sToX);
- spinToY.push_back(sToY);
-
- int nroi = (int)lblFromX.size();
- gridRoi->addWidget(lblFromX[nroi], nroi, 0, Qt::AlignTop);
- gridRoi->addWidget(spinFromX[nroi], nroi, 1, Qt::AlignTop);
- // FIXME: gridRoi->addItem(new
- // QSpacerItem(40,20,QSizePolicy::Expanding,QSizePolicy::Fixed),
- // nroi,2,Qt::AlignTop);
- gridRoi->addWidget(lblToX[nroi], nroi, 3, Qt::AlignTop);
- gridRoi->addWidget(spinToX[nroi], nroi, 4, Qt::AlignTop);
- // FIXME: gridRoi->addItem(new
- // QSpacerItem(40,20,QSizePolicy::Expanding,QSizePolicy::Fixed),
- // nroi,5,Qt::AlignTop);
- gridRoi->addWidget(lblFromY[nroi], nroi, 6, Qt::AlignTop);
- gridRoi->addWidget(spinFromY[nroi], nroi, 7, Qt::AlignTop);
- // FIXME: gridRoi->addItem(new
- // QSpacerItem(40,20,QSizePolicy::Expanding,QSizePolicy::Fixed),
- // nroi,8,Qt::AlignTop);
- gridRoi->addWidget(lblToY[nroi], nroi, 9, Qt::AlignTop);
- gridRoi->addWidget(spinToY[nroi], nroi, 10, Qt::AlignTop);
-
- lblFromX[nroi]->show();
- spinFromX[nroi]->show();
- lblToX[nroi]->show();
- spinToX[nroi]->show();
- lblFromY[nroi]->show();
- spinFromY[nroi]->show();
- lblToY[nroi]->show();
- spinToY[nroi]->show();
-
- FILE_LOG(logDEBUG) << "ROI Inputs added";
-}
-
void qTabAdvanced::GetROI() {
FILE_LOG(logDEBUG) << "Getting ROI";
- ClearROIWidgets();
-
try {
- int nroi = 0;
- const slsDetectorDefs::ROI *roi = myDet->getROI(nroi);
- if (roi != nullptr) {
- for (int i = 0; i < nroi; ++i) {
- AddROISlot();
- spinFromX[i]->setValue(roi[i].xmin);
- spinFromY[i]->setValue(roi[i].ymin);
- spinToX[i]->setValue(roi[i].xmax);
- spinToY[i]->setValue(roi[i].ymax);
- }
- FILE_LOG(logDEBUG) << "ROIs populated: " << nroi;
- }
-
+ slsDetectorDefs::ROI roi = myDet->getROI(comboReadout->currentIndex());
+ spinXmin->setValue(roi.xmin);
+ spinXmax->setValue(roi.xmax);
} CATCH_DISPLAY ("Could not get ROI.", "qTabAdvanced::GetROI")
}
-void qTabAdvanced::ClearROIWidgets() {
- FILE_LOG(logDEBUG) << "Clear ROI Widgets";
-
- // hide widgets
- QLayoutItem *item;
- while ((item = gridRoi->takeAt(0))) {
- if (item->widget()) {
- item->widget()->hide();
- gridRoi->removeWidget(item->widget());
- }
- }
-
- // delete widgets
- for (size_t i = 0; i < lblFromX.size(); ++i) {
- delete lblFromX[i];
- delete spinFromX[i];
- delete lblToX[i];
- delete spinToY[i];
- delete lblFromY[i];
- delete spinFromY[i];
- delete lblToY[i];
- delete spinToY[i];
- }
- lblFromX.clear();
- spinFromX.clear();
- lblToX.clear();
- spinToY.clear();
- lblFromY.clear();
- spinFromY.clear();
- lblToY.clear();
- spinToY.clear();
-}
-
void qTabAdvanced::ClearROI() {
FILE_LOG(logINFO) << "Clearing ROI";
- if (QMessageBox::warning(
- this, "Clear ROI",
- "Are you sure you want to clear all the ROI in detector?",
- QMessageBox::Yes | QMessageBox::No,
- QMessageBox::No) == QMessageBox::Yes) {
-
- ClearROIWidgets();
- SetROI();
- FILE_LOG(logDEBUG) << "ROIs cleared";
- }
+ spinXmin->setValue(-1);
+ spinXmax->setValue(-1);
+ SetROI();
+ FILE_LOG(logDEBUG) << "ROIs cleared";
}
void qTabAdvanced::SetROI() {
- // get roi from widgets
- int nroi = (int)lblFromX.size();
- slsDetectorDefs::ROI roi[nroi];
- for (int i = 0; i < nroi; ++i) {
- roi[i].xmin = spinFromX[i]->value();
- roi[i].ymin = spinFromY[i]->value();
- roi[i].xmax = spinToX[i]->value();
- roi[i].ymax = spinToY[i]->value();
- }
+
+ slsDetectorDefs::ROI roi;
+ roi.xmin = spinXmin->value();
+ roi.xmax = spinXmax->value();
// set roi
- FILE_LOG(logINFO) << "Setting ROI:" << nroi;
+ FILE_LOG(logINFO) << "Setting ROI: [" << roi.xmin << ", " << roi.xmax << "]";
try {
- myDet->setROI(nroi, roi, -1);
+ myDet->setROI(roi, comboReadout->currentIndex());
} CATCH_DISPLAY ("Could not set these ROIs.",
"qTabAdvanced::SetROI")
diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer
index f79ce81f4..58a992a6c 100755
Binary files a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer and b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer differ
diff --git a/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer b/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer
index d138a3ae1..8b395a374 100755
Binary files a/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer and b/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer differ
diff --git a/slsDetectorServers/gotthardDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/gotthardDetectorServer/slsDetectorFunctionList.c
index 6f7ce88b4..a0b0807d5 100755
--- a/slsDetectorServers/gotthardDetectorServer/slsDetectorFunctionList.c
+++ b/slsDetectorServers/gotthardDetectorServer/slsDetectorFunctionList.c
@@ -37,8 +37,7 @@ int digitalTestBit = 0;
// roi configuration
int adcConfigured = -1;
-ROI rois[MAX_ROIS];
-int nROI = 0;
+ROI rois;
int ipPacketSize = 0;
int udpPacketSize = 0;
@@ -397,7 +396,9 @@ void setupDetector() {
bus_w(TEMP_SPI_OUT_REG, 0x0);
// roi, gbit readout
- setROIADC(-1); // set adcsyncreg, daqreg, chipofinterestreg, cleanfifos,
+ rois.xmin = -1;
+ rois.xmax = -1;
+ setROI(rois);// set adcsyncreg, daqreg, chipofinterestreg, cleanfifos,
setGbitReadout();
// master, slave (25um)
@@ -726,95 +727,49 @@ int setDynamicRange(int dr){
return DYNAMIC_RANGE;
}
-ROI* setROI(int n, ROI arg[], int *retvalsize, int *ret) {
+int setROI(ROI arg) {
- // set ROI
- if(n >= 0){
- // print
- if (!n) {
- FILE_LOG(logINFO, ("Clearing ROI\n"));
- } else {
- FILE_LOG(logINFO, ("Setting ROI:\n"));
- int i = 0;
- for (i = 0; i < n; ++i) {
- FILE_LOG(logINFO, ("\t(%d, %d)\n", arg[i].xmin, arg[i].xmax));
- }
+ int adc = -1;
+ if (arg.xmin == -1) {
+ FILE_LOG(logINFO, ("Clearing ROI\n"));
+ rois.xmin = -1;
+ rois.xmax = -1;
+ } else {
+ FILE_LOG(logINFO, ("Setting ROI:(%d, %d)\n", arg.xmin, arg.xmax));
+ // validation
+ // xmin divisible by 256 and less than 1280
+ if (((arg.xmin % NCHAN_PER_ADC) != 0) || (arg.xmin >= (NCHAN * NCHIP))) {
+ FILE_LOG(logERROR, ("Could not set roi. xmin is invalid\n"));
+ return FAIL;
}
- // only one ROI allowed per module
- if (n > 1) {
- FILE_LOG(logERROR, ("\tCannot set more than 1 ROI per module\n"));
- *ret = FAIL;
- *retvalsize = nROI;
- return rois;
+ // xmax must be 255 more than xmin
+ if (arg.xmax != (arg.xmin + NCHAN_PER_ADC - 1)) {
+ FILE_LOG(logERROR, ("Could not set roi. xmax is invalid\n"));
+ return FAIL;
}
+ rois.xmin = arg.xmin;
+ rois.xmax = arg.xmax;
+ adc = arg.xmin / NCHAN_PER_ADC;
+ }
+ FILE_LOG(logINFO, ("\tAdc to be configured: %d\n", adc));
+ FILE_LOG(logINFO, ("\tROI to be configured: (%d, %d)\n",
+ (adc == -1) ? 0 : (rois.xmin),
+ (adc == -1) ? (NCHIP * NCHAN - 1) : (rois.xmax)));
- //clear all rois
- nROI = 0;
+ //set adc of interest
+ setROIADC(adc);
+ return OK;
+}
- // find adc number and recorrect channel limits
- int adc = -1;
- if (n) {
- // all channels
- if ((arg[0].xmin <= 0) && (arg[0].xmax >= NCHIP * NCHAN))
- adc = -1;
- // single adc
- else {
- //adc = mid value/numchans
- adc = ((((arg[0].xmax) + (arg[0].xmin))/2) / (NCHAN * NCHIPS_PER_ADC));
- // incorrect adc
- if((adc < 0) || (adc > 4)) {
- FILE_LOG(logERROR, ("\tadc value greater than 5. deleting roi\n"));
- adc = -1;
- }
- // recorrect roi values
- else {
- rois[0].xmin = adc * (NCHAN * NCHIPS_PER_ADC);
- rois[0].xmax = (adc + 1) * (NCHAN * NCHIPS_PER_ADC) - 1;
- rois[0].ymin = -1;
- rois[0].ymax = -1;
- nROI = 1;
- }
- }
- }
-
- if (adc == -1)
- nROI = 0;
-
- FILE_LOG(logINFO, ("\tAdc to be configured: %d\n", adc));
- FILE_LOG(logINFO, ("\tROI to be configured: (%d, %d)\n",
- (adc == -1) ? 0 : (rois[0].xmin),
- (adc == -1) ? (NCHIP * NCHAN - 1) : (rois[0].xmax)));
-
- // could not set roi
- if((n != 0) && ((arg[0].xmin != rois[0].xmin)||
- (arg[0].xmax != rois[0].xmax)||
- (arg[0].ymin != rois[0].ymin)||
- (arg[0].ymax != rois[0].ymax))) {
- *ret = FAIL;
- FILE_LOG(logERROR, ("\tCould not set given ROI\n"));
- }
- if(n != nROI) {
- *ret = FAIL;
- FILE_LOG(logERROR, ("\tCould not set or clear ROIs\n"));
- }
-
- //set adc of interest
- setROIADC(adc);
- } else FILE_LOG(logINFO, ("Getting ROI:\n"));
+ROI getROI() {
+ FILE_LOG(logINFO, ("Getting ROI:\n"));
// print
- if (!nROI) {
+ if (rois.xmin == -1) {
FILE_LOG(logINFO, ("\tROI: None\n"));
} else {
- FILE_LOG(logINFO, ("ROI:\n"));
- int i = 0;
- for (i = 0; i < nROI; ++i) {
- FILE_LOG(logINFO, ("\t(%d, %d)\n", rois[i].xmin, rois[i].xmax));
-
- }
+ FILE_LOG(logINFO, ("ROI: (%d,%d)\n", rois.xmin, rois.xmax));
}
-
- *retvalsize = nROI;
return rois;
}
diff --git a/slsDetectorServers/gotthardDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/gotthardDetectorServer/slsDetectorServer_defs.h
index 6c037e852..16e1142cb 100755
--- a/slsDetectorServers/gotthardDetectorServer/slsDetectorServer_defs.h
+++ b/slsDetectorServers/gotthardDetectorServer/slsDetectorServer_defs.h
@@ -24,6 +24,7 @@ enum DACINDEX {VREF_DS, VCASCN_PB, VCASCP_PB, VOUT_CM, VCASC_OUT, VIN
#define NCHIP (10)
#define NDAC (8)
#define NCHIPS_PER_ADC (2)
+#define NCHAN_PER_ADC (256)
#define DYNAMIC_RANGE (16)
#define NUM_BITS_PER_PIXEL (DYNAMIC_RANGE / 8)
#define DATA_BYTES (NCHIP * NCHAN * NUM_BITS_PER_PIXEL)
diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h
index fd4ca2898..7038b6135 100755
--- a/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h
+++ b/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h
@@ -114,7 +114,8 @@ void resetPeripheral();
// parameters - dr, roi
int setDynamicRange(int dr);
#ifdef GOTTHARDD
-ROI* setROI(int n, ROI arg[], int *retvalsize, int *ret);
+int setROI(ROI arg);
+ROI getROI();
#endif
#if defined(CHIPTESTBOARDD) || defined(MOENCHD)
int setADCEnableMask(uint32_t mask);
diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c
index 4b98305cc..542af9d48 100755
--- a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c
+++ b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c
@@ -189,6 +189,7 @@ const char* getFunctionName(enum detFuncs func) {
case F_SET_DYNAMIC_RANGE: return "F_SET_DYNAMIC_RANGE";
case F_SET_READOUT_FLAGS: return "F_SET_READOUT_FLAGS";
case F_SET_ROI: return "F_SET_ROI";
+ case F_GET_ROI: return "F_GET_ROI";
case F_SET_SPEED: return "F_SET_SPEED";
case F_EXIT_SERVER: return "F_EXIT_SERVER";
case F_LOCK_SERVER: return "F_LOCK_SERVER";
@@ -279,6 +280,7 @@ void function_table() {
flist[F_SET_DYNAMIC_RANGE] = &set_dynamic_range;
flist[F_SET_READOUT_FLAGS] = &set_readout_flags;
flist[F_SET_ROI] = &set_roi;
+ flist[F_GET_ROI] = &get_roi;
flist[F_SET_SPEED] = &set_speed;
flist[F_EXIT_SERVER] = &exit_server;
flist[F_LOCK_SERVER] = &lock_server;
@@ -1896,76 +1898,49 @@ int set_readout_flags(int file_des) {
int set_roi(int file_des) {
ret = OK;
memset(mess, 0, sizeof(mess));
- int narg = -1;
- ROI arg[MAX_ROIS];
- int nretval = -1;
- ROI* retval = NULL;
+ ROI arg;
- // receive number of ROIs
- if (receiveData(file_des, &narg, sizeof(narg), INT32) < 0)
+ // receive ROI
+ if (receiveData(file_des, &arg.xmin, sizeof(int), INT32) < 0)
return printSocketReadError();
- // receive ROIs
- {
- int iloop = 0;
- for (iloop = 0; iloop < narg; ++iloop) {
- if (receiveData(file_des, &arg[iloop].xmin, sizeof(int), INT32) < 0)
- return printSocketReadError();
- if (receiveData(file_des, &arg[iloop].xmax, sizeof(int), INT32) < 0)
- return printSocketReadError();
- if (receiveData(file_des, &arg[iloop].ymin, sizeof(int), INT32) < 0)
- return printSocketReadError();
- if (receiveData(file_des, &arg[iloop].ymax, sizeof(int), INT32) < 0)
- return printSocketReadError();
- }
- }
- FILE_LOG(logDEBUG1, ("Set ROI (narg:%d)\n", narg));
- {
- int iloop = 0;
- for (iloop = 0; iloop < narg; ++iloop) {
- FILE_LOG(logDEBUG1, ("%d: %d\t%d\t%d\t%d\n",
- arg[iloop].xmin, arg[iloop].xmax, arg[iloop].ymin, arg[iloop].ymax));
- }
- }
+ if (receiveData(file_des, &arg.xmax, sizeof(int), INT32) < 0)
+ return printSocketReadError();
+ FILE_LOG(logDEBUG1, ("Set ROI: [%d, %d]\n", arg.xmin, arg.xmax));
#ifndef GOTTHARDD
functionNotImplemented();
#else
- // set & get
- if ((narg == GET_READOUT_FLAGS) || (Server_VerifyLock() == OK)) {
- if (myDetectorType == GOTTHARD && narg > 1) {
- ret = FAIL;
- strcpy(mess,"Can not set more than one ROI per module.\n");
- FILE_LOG(logERROR,(mess));
- } else {
- retval = setROI(narg, arg, &nretval, &ret);
- if (ret == FAIL) {
- if (nretval == -1) // chip test board
- sprintf(mess,"Could not set ROI. Max ROI level (100) reached!\n");
- else if (nretval == -2)
- sprintf(mess, "Could not set ROI. Could not allocate RAM\n");
- else
- sprintf(mess,"Could not set all roi. "
- "Set %d rois, but read %d rois\n", narg, nretval);
- FILE_LOG(logERROR,(mess));
- }
- FILE_LOG(logDEBUG1, ("nRois: %d\n", nretval));
- }
+ // only set
+ if (Server_VerifyLock() == OK) {
+ ret = setROI(arg);
+ if (ret == FAIL) {
+ sprintf(mess, "Could not set ROI. Invalid xmin or xmax\n");
+ FILE_LOG(logERROR,(mess));
+ }
}
#endif
- Server_SendResult(file_des, INT32, UPDATE, NULL, 0);
+ return Server_SendResult(file_des, INT32, UPDATE, NULL, 0);
+}
+
+int get_roi(int file_des) {
+ ret = OK;
+ memset(mess, 0, sizeof(mess));
+ ROI retval;
+
+#ifndef GOTTHARDD
+ functionNotImplemented();
+#else
+ // only get
+ retval = getROI();
+ FILE_LOG(logDEBUG1, ("nRois: (%d, %d)\n", retval.xmin, retval.xmax));
+#endif
+
+ Server_SendResult(file_des, INT32, UPDATE, NULL, 0);
if (ret != FAIL) {
- //retvalsize could be swapped during sendData
- int nretval1 = nretval;
- sendData(file_des, &nretval1, sizeof(nretval1), INT32);
- int iloop = 0;
- for(iloop = 0; iloop < nretval; ++iloop) {
- sendData(file_des, &retval[iloop].xmin, sizeof(int), INT32);
- sendData(file_des, &retval[iloop].xmax, sizeof(int), INT32);
- sendData(file_des, &retval[iloop].ymin, sizeof(int), INT32);
- sendData(file_des, &retval[iloop].ymax, sizeof(int), INT32);
- }
+ sendData(file_des, &retval.xmin, sizeof(int), INT32);
+ sendData(file_des, &retval.xmax, sizeof(int), INT32);
}
return ret;
}
@@ -1973,7 +1948,6 @@ int set_roi(int file_des) {
-
int set_speed(int file_des) {
ret = OK;
memset(mess, 0, sizeof(mess));
@@ -2284,20 +2258,9 @@ int send_update(int file_des) {
// roi
#if defined(GOTTHARDD)
- ROI* retval = NULL;
- ROI arg[1];
- int ret = OK, nretval = 0;
- retval = setROI(-1, arg, &nretval, &ret);
- //retvalsize could be swapped during sendData
- int nretval1 = nretval;
- sendData(file_des, &nretval1, sizeof(nretval1), INT32);
- int iloop = 0;
- for(iloop = 0; iloop < nretval; ++iloop) {
- sendData(file_des, &retval[iloop].xmin, sizeof(int), INT32);
- sendData(file_des, &retval[iloop].xmax, sizeof(int), INT32);
- sendData(file_des, &retval[iloop].ymin, sizeof(int), INT32);
- sendData(file_des, &retval[iloop].ymax, sizeof(int), INT32);
- }
+ ROI retval = getROI();
+ sendData(file_des, &retval.xmin, sizeof(int), INT32);
+ sendData(file_des, &retval.xmax, sizeof(int), INT32);
#endif
#if defined(CHIPTESTBOARDD) || defined(MOENCHD)
diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.h b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.h
index 66ed015c7..26c889650 100755
--- a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.h
+++ b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.h
@@ -49,6 +49,7 @@ int get_time_left(int);
int set_dynamic_range(int);
int set_readout_flags(int);
int set_roi(int);
+int get_roi(int);
int set_speed(int);
int exit_server(int);
int lock_server(int);
diff --git a/slsDetectorSoftware/include/Detector.h b/slsDetectorSoftware/include/Detector.h
index 824b11bb3..08eb14955 100644
--- a/slsDetectorSoftware/include/Detector.h
+++ b/slsDetectorSoftware/include/Detector.h
@@ -82,16 +82,10 @@ class Detector {
/**
* Sets the maximum number of channels of complete detector in both
* dimensions. -1 means no limit in this dimension. This value is used to
- * calculate row and column offsets for each module.
+ * calculate row and column channels for each module.
*/
void setMaxNumberOfChannels(const defs::coordinates value);
- /** [Gotthard] */
- Result getDetectorOffsets(Positions pos = {}) const;
-
- /** [Gotthard] */
- void setDetectorOffsets(defs::coordinates value, Positions pos = {});
-
/** [Eiger with specific quad hardware] */
Result getQuad(Positions pos = {}) const;
@@ -664,15 +658,16 @@ class Detector {
/** [Eiger] If it is set, it resets chips completely (else partially) before an acquisition TODO: if it makes sense */
void setCounterBit(bool value, Positions pos = {});
- /** [Gotthard, CTB]*/
- Result> getROI(Positions pos = {}) const;
+ /** [Gotthard]*/
+ Result getROI(Positions pos = {}) const;
/**
- * [Gotthard Options: Only a single chip or all chips, only 1 ROI allowed]
- * [CTB: multiple ROIs allowed]
- * subset modules not allowed
+ * [Gotthard]
+ * Options: Only a single ROI per module
+ * Can set only a single ROI at a time
+ * @param module position index
*/
- void setROI(std::vector value, Positions pos = {});
+ void setROI(defs::ROI value, int moduleId);
/** [CTB]*/
Result getADCEnableMask(Positions pos = {}) const;
diff --git a/slsDetectorSoftware/include/multiSlsDetector.h b/slsDetectorSoftware/include/multiSlsDetector.h
index 611d93ae3..c24a00cd9 100755
--- a/slsDetectorSoftware/include/multiSlsDetector.h
+++ b/slsDetectorSoftware/include/multiSlsDetector.h
@@ -65,16 +65,6 @@ struct sharedMultiSlsDetector {
/** total number of channels including gap pixels in one dimension */
int numberOfChannelInclGapPixels[2];
- /** total number of channels for all detectors */
- int maxNumberOfChannels;
-
- /** max number of channels for all detectors in one dimension*/
- int maxNumberOfChannel[2];
-
- /** max number of channels including gap pixels for all detectors in
- * one dimension*/
- int maxNumberOfChannelInclGapPixels[2];
-
/** max number of channels allowed for the complete set of detectors in
* one dimension */
int maxNumberOfChannelsPerDetector[2];
@@ -432,8 +422,7 @@ class multiSlsDetector : public virtual slsDetectorDefs {
/**
* Returns the maximum number of channels of all sls detectors in each
- * dimension d from shared memory. multi detector shared memory variable to
- * calculate offsets for each sls detector
+ * dimension d from shared memory.
* @param d dimension d
* @returns the maximum number of channels of all sls detectors in dimension
* d
@@ -442,8 +431,7 @@ class multiSlsDetector : public virtual slsDetectorDefs {
/**
* Sets the maximum number of channels of all sls detectors in each
- * dimension d from shared memory, multi detector shared memory variable to
- * calculate offsets for each sls detector
+ * dimension d from shared memory
* @param d dimension d
* @param i maximum number of channels for multi structure in dimension d
* @returns the maximum number of channels of all sls detectors in dimension
@@ -453,37 +441,18 @@ class multiSlsDetector : public virtual slsDetectorDefs {
/**
* Returns maximum number of channels of all sls detectors in each
- * dimension d from shared memory, multi detector shared memory variable to
- * calculate offsets for each sls detector
+ * dimension d from shared memory
* @returns maximum number of channels of all sls detectors
*/
slsDetectorDefs::coordinates getMaxNumberOfChannels() const; //
/**
* Sets maximum number of channels of all sls detectors in each
- * dimension d from shared memory, multi detector shared memory variable to
- * calculate offsets for each sls detector
+ * dimension d from shared memory
* @param c maximum number of channels of all sls detectors
*/
void setMaxNumberOfChannels(const slsDetectorDefs::coordinates c); //
- /**
- * Get Detector offset from shared memory in dimension d
- * @param d dimension d
- * @param detPos -1 for all detectors in list or specific detector position
- * @returns offset in dimension d, -1 if pos is not an actual position in
- * list
- */
- int getDetectorOffset(dimension d, int detPos = -1); //
-
- /**
- * Set Detector offset in shared memory in dimension d
- * @param d dimension d
- * @param off offset for detector
- * @param detPos -1 for all detectors in list or specific detector position
- */
- void setDetectorOffset(dimension d, int off, int detPos = -1);//
-
/**
* Get Quad Type (Only for Eiger Quad detector hardware)
* @param detPos -1 for all detectors in list or specific detector position
@@ -1376,22 +1345,27 @@ class multiSlsDetector : public virtual slsDetectorDefs {
int setCounterBit(int i = -1, int detPos = -1); //
/**
- * Set ROI (Gotthard)
- * At the moment only one set allowed
- * @param n number of rois
- * @param roiLimits array of roi
+ * Clear ROI (Gotthard)
* @param detPos -1 for all detectors in list or specific detector position
*/
- void setROI(int n = -1, ROI roiLimits[] = nullptr, int detPos = -1);
+ void clearROI(int detPos = -1);
/**
- * Get ROI from each detector and convert it to the multi detector scale
- * (Gotthard)
- * @param n number of rois
- * @param detPos -1 for all detectors in list or specific detector position
- * @returns OK or FAIL
+ * Set ROI (Gotthard)
+ * At the moment only one set allowed per module
+ * Only allowed to set one ROI per module
+ * @param arg roi
+ * @param detPos specific detector position
*/
- const ROI *getROI(int &n, int detPos = -1);
+ void setROI(slsDetectorDefs::ROI arg, int detPos = -1);
+
+ /**
+ * Get ROI (Gotthard)
+ * Only allowed to set one ROI per module
+ * @param detPos specific detector position
+ * @returns roi
+ */
+ slsDetectorDefs::ROI getROI(int detPos) const;
/**
* Set ADC Enable Mask (CTB, Moench)
@@ -2187,14 +2161,6 @@ class multiSlsDetector : public virtual slsDetectorDefs {
*/
void initializeMembers(bool verify = true);
- /**
- * Appends detectors to the end of the list in shared memory
- * Connects to them
- * @param name concatenated hostname of the sls detectors to be appended to
- * the list
- */
- void addMultipleDetectors(const char *name);//
-
/**
* Update user details in detector structure
*/
@@ -2206,23 +2172,6 @@ class multiSlsDetector : public virtual slsDetectorDefs {
*/
bool isAcquireReady();
- /**
- * Decodes which detector and the corresponding channel numbers for it
- * Mainly useful in a multi detector setROI (Gotthard)
- * @param offsetX channel number or total channel offset in x direction
- * @param offsetY channel number or total channel offset in y direction
- * @param channelX channel number from detector offset in x direction
- * @param channelY channel number from detector offset in x direction
- * @returns detector id or -1 if channel number out of range
- */
- int decodeNChannel(int offsetX, int offsetY, int &channelX, int &channelY);
-
- /**
- * Updates the channel offsets in X and Y dimension for all the sls
- * detectors It is required for decodeNMod and setting ROI
- */
- void updateOffsets();
-
/**
* Execute in command line and return result
* @param cmd command
@@ -2230,12 +2179,26 @@ class multiSlsDetector : public virtual slsDetectorDefs {
*/
std::string exec(const char *cmd);
+ /**
+ * Appends detectors to the end of the list in shared memory
+ * Connects to them
+ * @param name concatenated hostname of the sls detectors to be appended to
+ * the list
+ */
+ void addMultipleDetectors(const char *name);//
+
/**
* Add sls detector
* @param s hostname of the single detector
*/
void addSlsDetector(const std::string &hostname);
+ /**
+ * Updates the channel size in X and Y dimension for all the sls
+ * detectors
+ */
+ void updateDetectorSize();
+
/**
* increments file index
* @param detPos -1 for all detectors in list or specific detector position
@@ -2243,13 +2206,6 @@ class multiSlsDetector : public virtual slsDetectorDefs {
*/
int incrementFileIndex(int detPos = -1);
- /**
- * Ensures that min is less than max in both dimensions (Gotthard)
- * @param n number of rois
- * @param r array of rois
- */
- void verifyMinMaxROI(int n, ROI r[]);
-
/**
* add gap pixels to the image (only for Eiger in 4 bit mode)
* @param image pointer to image without gap pixels
diff --git a/slsDetectorSoftware/include/slsDetector.h b/slsDetectorSoftware/include/slsDetector.h
index 269e8cdc7..de23d310d 100755
--- a/slsDetectorSoftware/include/slsDetector.h
+++ b/slsDetectorSoftware/include/slsDetector.h
@@ -13,7 +13,7 @@
class ServerInterface;
#define SLS_SHMAPIVERSION 0x190726
-#define SLS_SHMVERSION 0x190726
+#define SLS_SHMVERSION 0x190813
/**
* @short structure allocated in shared memory to store detector settings for
@@ -35,10 +35,6 @@ struct sharedSlsDetector {
/** END OF FIXED PATTERN -----------------------------------------------*/
- /** Detector offset in the X & Y direction in the multi detector structure
- */
- int offset[2];
-
/** Number of detectors in multi list in x dir and y dir */
int multiSize[2];
@@ -75,11 +71,8 @@ struct sharedSlsDetector {
/** size of the data that are transfered from the detector */
int dataBytes;
- /** number of rois defined */
- int nROI;
-
- /** list of rois */
- slsDetectorDefs::ROI roiLimits[MAX_ROIS];
+ /** roi */
+ slsDetectorDefs::ROI roi;
/** adc enable mask */
uint32_t adcEnableMask;
@@ -339,7 +332,7 @@ class slsDetector : public virtual slsDetectorDefs {
/**
* Update total number of channels (chiptestboard or moench)
- * depending on the number of samples, roi, readout flags(ctb)
+ * depending on the number of samples, adenablemask, readout flags(ctb)
*/
void updateTotalNumberOfChannels();
@@ -423,32 +416,6 @@ class slsDetector : public virtual slsDetectorDefs {
*/
int getReadNLines();
- /**
- * Get Detector offset from shared memory in dimension d
- * @param d dimension d
- * @returns offset in dimension d
- */
- int getDetectorOffset(dimension d) const;
-
- /**
- * Get Detector offset from shared memory in dimension d
- * @returns offset
- */
- slsDetectorDefs::coordinates getDetectorOffsets() const;
-
- /**
- * Set Detector offset in shared memory in dimension d
- * @param d dimension d
- * @param off offset for detector
- */
- void setDetectorOffset(dimension d, int off);
-
- /**
- * Set Detector offset in shared memory
- * @param value offset for detector
- */
- void setDetectorOffsets(slsDetectorDefs::coordinates value);
-
/**
* Set Detector offset in shared memory in dimension d
* @param detx number of detectors in X dir in multi list
@@ -1143,35 +1110,29 @@ class slsDetector : public virtual slsDetectorDefs {
*/
int setCounterBit(int cb = -1);
+ /**
+ * Clear ROI (Gotthard)
+ */
+ void clearROI();
+
/**
* Set ROI (Gotthard)
- * At the moment only one set allowed
- * @param n number of rois
- * @param roiLimits array of roi
+ * Also calls configuremac
+ * @param arg roi
*/
- void setROI(int n = -1, ROI roiLimits[] = nullptr);
+ void setROI(slsDetectorDefs::ROI arg);
/**
- * Get ROI from each detector and convert it to the multi detector scale
- * (Gotthard)
- * @param n number of rois
- * @returns OK or FAIL
+ * Send ROI from shared memory to Receiver (Gotthard)
*/
- const slsDetectorDefs::ROI *getROI(int &n);
+ void sendROItoReceiver();
/**
- * Returns number of rois
- * @returns number of ROIs
+ * Get ROI (Gotthard)
+ * Update receiver if different from shm
+ * @returns roi
*/
- int getNRoi();
-
- /**
- * Send ROI to the detector after calculating
- * from setROI
- * @param n number of ROIs (-1 to get)
- * @param roiLimits ROI
- */
- void sendROI(int n = -1, ROI roiLimits[] = nullptr);
+ slsDetectorDefs::ROI getROI();
/**
* Set ADC Enable Mask (CTB, Moench)
diff --git a/slsDetectorSoftware/include/slsDetectorUsers.h b/slsDetectorSoftware/include/slsDetectorUsers.h
index 734aabbc8..742d574cf 100755
--- a/slsDetectorSoftware/include/slsDetectorUsers.h
+++ b/slsDetectorSoftware/include/slsDetectorUsers.h
@@ -104,7 +104,7 @@ public:
/**
* Returns the maximum number of channels of all detectors
* (provided by user in config file using detsizechan command)
- * Offsets are calculated according to these dimensions
+ * number of channels in x and y are calculated according to these dimensions
* @param nx number of channels in horizontal
* @param ny number of channels in vertical
* @returns the maximum number of channels of all detectors
@@ -112,15 +112,13 @@ public:
int getMaximumDetectorSize(int &nx, int &ny);
/**
- * Returns the size and offsets of detector/multi detector
- * @param x horizontal position origin in channel number
- * @param y vertical position origin in channel number
+ * Returns the size of detector/multi detector
* @param nx number of channels in horiziontal
* @param ny number of channels in vertical
* @param detPos -1 for all detectors in list or specific detector position
* @returns the total number of channels of all sls detectors
*/
- int getDetectorSize(int &x, int &y, int &nx, int &ny, int detPos = -1);
+ int getDetectorSize(int &nx, int &ny, int detPos);
/**
* Gets detector type
@@ -496,22 +494,22 @@ public:
int setFlowControl10G(int enable = -1, int detPos = -1);
/**
- * Set ROI (Gotthard) (>= 1 roi, but max 1 roi per module)
- * At the moment only one set allowed
- * @param n number of rois
- * @param roiLimits array of roi
- * @param detPos -1 for all detectors in list or specific detector position
+ * Set ROI (Gotthard)
+ * At the moment only one set allowed per module
+ * Only allowed to set one ROI per module
+ * @param arg roi
+ * @param detPos specific detector position
*/
- void setROI(int n=-1, slsDetectorDefs::ROI roiLimits[]=NULL, int detPos = -1);
+ void setROI(slsDetectorDefs::ROI arg, int detPos = -1);
+
/**
- * Get ROI from each detector and convert it to the multi detector scale (Gotthard)
- * >= 1 roi, but max 1 roi per module
- * @param n number of rois
- * @param detPos -1 for all detectors in list or specific detector position
- * @returns pointer to array of ROI structure
+ * Get ROI (Gotthard)
+ * Only allowed to set one ROI per module
+ * @param detPos specific detector position
+ * @returns roi
*/
- const slsDetectorDefs::ROI* getROI(int &n, int detPos = -1);
+ slsDetectorDefs::ROI getROI(int detPos = -1);
diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp
index 81dc9792a..b35e7223a 100644
--- a/slsDetectorSoftware/src/Detector.cpp
+++ b/slsDetectorSoftware/src/Detector.cpp
@@ -110,16 +110,6 @@ void Detector::setMaxNumberOfChannels(const defs::coordinates value) {
pimpl->setMaxNumberOfChannels(value);
}
-Result Detector::getDetectorOffsets(Positions pos) const {
- return pimpl->Parallel(&slsDetector::getDetectorOffsets, pos);
-}
-
-void Detector::setDetectorOffsets(defs::coordinates value, Positions pos) {
- pimpl->Parallel(&slsDetector::setDetectorOffsets, pos, value);
- // pimpl->Parallel(&slsDetector::setDetectorOffset, pos,
- // value);
-}
-
Result Detector::getQuad(Positions pos) const {
return pimpl->Parallel(&slsDetector::getQuad, pos);
}
@@ -1071,41 +1061,15 @@ void Detector::setCounterBit(bool value, Positions pos) {
pimpl->Parallel(&slsDetector::setCounterBit, pos, value);
}
-Result> Detector::getROI(Positions pos) const {
- //vector holding module_id for the modules that should be read
- const std::vector id_vec = [&]() {
- if (pos.empty() || (pos.size() == 1 && pos[0] == -1)){
- std::vector tmp;
- for(size_t i=0; i!= pimpl->size(); ++i)
- tmp.push_back(i);
- return tmp;
- }else{
- return pos;
- }
- }();
-
-
- //values to return
- Result> res;
-
- //for each detector id get the ROI
- for (const auto& i :id_vec){
- int n = 0;
- auto ptr = pimpl->getROI(n, i);
- // res.emplace_back(ptr, ptr+n);
- }
- return res;
+Result Detector::getROI(Positions pos) const {
+ return pimpl->Parallel(&slsDetector::getROI, pos);
}
-void Detector::setROI(std::vector value, Positions pos) {
- if (pos.empty() || (pos.size() == 1 && pos[0] == -1)) {
- pimpl->setROI(static_cast(value.size()), value.data(), -1);
- } else if (pos.size() > 1) {
- throw RuntimeError("Cannot set roi to a subset of modules");
- } else {
- pimpl->Parallel(&slsDetector::setROI, pos,
- static_cast(value.size()), value.data());
+void Detector::setROI(defs::ROI value, int moduleId) {
+ if (moduleId < 0 && size() > 1) {
+ throw RuntimeError("Cannot set ROI for all modules simultaneously");
}
+ pimpl->Parallel(&slsDetector::setROI, {moduleId}, value);
}
Result Detector::getADCEnableMask(Positions pos) const {
diff --git a/slsDetectorSoftware/src/multiSlsDetector.cpp b/slsDetectorSoftware/src/multiSlsDetector.cpp
index ef1f9c1e1..1dd184d87 100755
--- a/slsDetectorSoftware/src/multiSlsDetector.cpp
+++ b/slsDetectorSoftware/src/multiSlsDetector.cpp
@@ -283,8 +283,8 @@ void multiSlsDetector::initializeDetectorStructure() {
multi_shm()->numberOfChannel[Y] = 0;
multi_shm()->numberOfChannelInclGapPixels[X] = 0;
multi_shm()->numberOfChannelInclGapPixels[Y] = 0;
- multi_shm()->maxNumberOfChannelsPerDetector[X] = 0;
- multi_shm()->maxNumberOfChannelsPerDetector[Y] = 0;
+ multi_shm()->maxNumberOfChannelsPerDetector[X] = -1;
+ multi_shm()->maxNumberOfChannelsPerDetector[Y] = -1;
multi_shm()->acquiringFlag = false;
multi_shm()->receiver_upstream = false;
}
@@ -303,9 +303,6 @@ void multiSlsDetector::initializeMembers(bool verify) {
throw;
}
}
-
- // depend on number of detectors
- updateOffsets();
}
void multiSlsDetector::updateUserdetails() {
@@ -333,197 +330,6 @@ bool multiSlsDetector::isAcquireReady() {
return OK != 0u;
}
-int multiSlsDetector::decodeNChannel(int offsetX, int offsetY, int &channelX,
- int &channelY) {
- channelX = -1;
- channelY = -1;
- // loop over
- for (size_t i = 0; i < detectors.size(); ++i) {
- int x = detectors[i]->getDetectorOffset(X);
- int y = detectors[i]->getDetectorOffset(Y);
- // check x offset range
- if ((offsetX >= x) &&
- (offsetX <
- (x + detectors[i]->getTotalNumberOfChannelsInclGapPixels(X)))) {
- if (offsetY == -1) {
- channelX = offsetX - x;
- return i;
- } else {
- // check y offset range
- if ((offsetY >= y) &&
- (offsetY <
- (y + detectors[i]->getTotalNumberOfChannelsInclGapPixels(
- Y)))) {
- channelX = offsetX - x;
- channelY = offsetY - y;
- return i;
- }
- }
- }
- }
- return -1;
-}
-
-void multiSlsDetector::updateOffsets() {
- FILE_LOG(logDEBUG1) << "Updating Multi-Detector Offsets";
-
- int offsetX = 0, offsetY = 0, numX = 0, numY = 0;
- int maxChanX = multi_shm()->maxNumberOfChannelsPerDetector[X];
- int maxChanY = multi_shm()->maxNumberOfChannelsPerDetector[Y];
- int prevChanX = 0;
- int prevChanY = 0;
- bool firstTime = true;
-
- multi_shm()->numberOfChannel[X] = 0;
- multi_shm()->numberOfChannel[Y] = 0;
- multi_shm()->numberOfDetector[X] = 0;
- multi_shm()->numberOfDetector[Y] = 0;
-
- // gap pixels
- int offsetX_gp = 0, offsetY_gp = 0, numX_gp = 0, numY_gp = 0;
- int prevChanX_gp = 0, prevChanY_gp = 0;
- multi_shm()->numberOfChannelInclGapPixels[X] = 0;
- multi_shm()->numberOfChannelInclGapPixels[Y] = 0;
-
- for (size_t idet = 0; idet < detectors.size(); ++idet) {
- FILE_LOG(logDEBUG1)
- << "offsetX:" << offsetX << " prevChanX:" << prevChanX
- << " offsetY:" << offsetY << " prevChanY:" << prevChanY
- << " offsetX_gp:" << offsetX_gp << " prevChanX_gp:" << prevChanX_gp
- << " offsetY_gp:" << offsetY_gp << " prevChanY_gp:" << prevChanY_gp;
-
- // incrementing in both direction
- if (firstTime) {
- // incrementing in both directions
- firstTime = false;
- if ((maxChanX > 0) &&
- ((offsetX + detectors[idet]->getTotalNumberOfChannels(X)) >
- maxChanX)) {
- FILE_LOG(logWARNING)
- << "\nDetector[" << idet
- << "] exceeds maximum channels "
- "allowed for complete detector set in X dimension!";
- }
- if ((maxChanY > 0) &&
- ((offsetY + detectors[idet]->getTotalNumberOfChannels(Y)) >
- maxChanY)) {
- FILE_LOG(logERROR)
- << "\nDetector[" << idet
- << "] exceeds maximum channels "
- "allowed for complete detector set in Y dimension!";
- }
- prevChanX = detectors[idet]->getTotalNumberOfChannels(X);
- prevChanY = detectors[idet]->getTotalNumberOfChannels(Y);
- prevChanX_gp =
- detectors[idet]->getTotalNumberOfChannelsInclGapPixels(X);
- prevChanY_gp =
- detectors[idet]->getTotalNumberOfChannelsInclGapPixels(Y);
- numX += detectors[idet]->getTotalNumberOfChannels(X);
- numY += detectors[idet]->getTotalNumberOfChannels(Y);
- numX_gp +=
- detectors[idet]->getTotalNumberOfChannelsInclGapPixels(X);
- numY_gp +=
- detectors[idet]->getTotalNumberOfChannelsInclGapPixels(Y);
- ++multi_shm()->numberOfDetector[X];
- ++multi_shm()->numberOfDetector[Y];
- FILE_LOG(logDEBUG1) << "incrementing in both direction";
- }
-
- // incrementing in y direction
- else if ((maxChanY == -1) ||
- ((maxChanY > 0) && ((offsetY + prevChanY +
- detectors[idet]->getTotalNumberOfChannels(
- Y)) <= maxChanY))) {
- offsetY += prevChanY;
- offsetY_gp += prevChanY_gp;
- prevChanY = detectors[idet]->getTotalNumberOfChannels(Y);
- prevChanY_gp =
- detectors[idet]->getTotalNumberOfChannelsInclGapPixels(Y);
- numY += detectors[idet]->getTotalNumberOfChannels(Y);
- numY_gp +=
- detectors[idet]->getTotalNumberOfChannelsInclGapPixels(Y);
- // increment in y again only in the first column (else you double
- // increment)
- if (multi_shm()->numberOfDetector[X] == 1)
- ++multi_shm()->numberOfDetector[Y];
- FILE_LOG(logDEBUG1) << "incrementing in y direction";
- }
-
- // incrementing in x direction
- else {
- if ((maxChanX > 0) &&
- ((offsetX + prevChanX +
- detectors[idet]->getTotalNumberOfChannels(X)) > maxChanX)) {
- FILE_LOG(logDEBUG1)
- << "\nDetector[" << idet
- << "] exceeds maximum channels "
- "allowed for complete detector set in X dimension!";
- }
- offsetY = 0;
- offsetY_gp = 0;
- prevChanY = detectors[idet]->getTotalNumberOfChannels(Y);
- prevChanY_gp =
- detectors[idet]->getTotalNumberOfChannelsInclGapPixels(Y);
- numY = 0; // assuming symmetry with this statement.
- // whats on 1st column should be on 2nd column
- numY_gp = 0;
- offsetX += prevChanX;
- offsetX_gp += prevChanX_gp;
- prevChanX = detectors[idet]->getTotalNumberOfChannels(X);
- prevChanX_gp =
- detectors[idet]->getTotalNumberOfChannelsInclGapPixels(X);
- numX += detectors[idet]->getTotalNumberOfChannels(X);
- numX_gp +=
- detectors[idet]->getTotalNumberOfChannelsInclGapPixels(X);
- ++multi_shm()->numberOfDetector[X];
- FILE_LOG(logDEBUG1) << "incrementing in x direction";
- }
-
- double bytesperchannel =
- (double)detectors[idet]->getDataBytes() /
- (double)(detectors[idet]->getTotalNumberOfChannels(X) *
- detectors[idet]->getTotalNumberOfChannels(Y));
- detectors[idet]->setDetectorOffset(
- X, (bytesperchannel >= 1.0) ? offsetX_gp : offsetX);
- detectors[idet]->setDetectorOffset(
- Y, (bytesperchannel >= 1.0) ? offsetY_gp : offsetY);
-
- FILE_LOG(logDEBUG1) << "Detector[" << idet << "] has offsets ("
- << detectors[idet]->getDetectorOffset(X) << ", "
- << detectors[idet]->getDetectorOffset(Y) << ")";
- // offsetY has been reset sometimes and offsetX the first time,
- // but remember the highest values
- if (numX > multi_shm()->numberOfChannel[X]) {
- multi_shm()->numberOfChannel[X] = numX;
- }
- if (numY > multi_shm()->numberOfChannel[Y]) {
- multi_shm()->numberOfChannel[Y] = numY;
- }
- if (numX_gp > multi_shm()->numberOfChannelInclGapPixels[X]) {
- multi_shm()->numberOfChannelInclGapPixels[X] = numX_gp;
- }
- if (numY_gp > multi_shm()->numberOfChannelInclGapPixels[Y]) {
- multi_shm()->numberOfChannelInclGapPixels[Y] = numY_gp;
- }
- }
- FILE_LOG(logDEBUG1)
- << "\n\tNumber of Channels in X direction:"
- << multi_shm()->numberOfChannel[X]
- << "\n\tNumber of Channels in Y direction:"
- << multi_shm()->numberOfChannel[Y]
- << "\n\tNumber of Channels in X direction with Gap Pixels:"
- << multi_shm()->numberOfChannelInclGapPixels[X]
- << "\n\tNumber of Channels in Y direction with Gap Pixels:"
- << multi_shm()->numberOfChannelInclGapPixels[Y];
-
- multi_shm()->numberOfChannels =
- multi_shm()->numberOfChannel[0] * multi_shm()->numberOfChannel[1];
-
- for (auto &d : detectors) {
- d->updateMultiSize(multi_shm()->numberOfDetector[0],
- multi_shm()->numberOfDetector[1]);
- }
-}
std::string multiSlsDetector::exec(const char *cmd) {
int bufsize = 128;
@@ -560,8 +366,6 @@ void multiSlsDetector::setHostname(const std::vector &name) {
for (const auto &hostname : name) {
addSlsDetector(hostname);
}
-
- updateOffsets();
}
void multiSlsDetector::setHostname(const char *name, int detPos) {
@@ -598,8 +402,7 @@ void multiSlsDetector::addMultipleDetectors(const char *name) {
for (const auto &hostname : sls::split(name, '+')) {
addSlsDetector(hostname);
}
-
- updateOffsets();
+ updateDetectorSize();
}
void multiSlsDetector::addSlsDetector(const std::string &hostname) {
@@ -623,11 +426,63 @@ void multiSlsDetector::addSlsDetector(const std::string &hostname) {
sls::make_unique(type, multiId, pos, false));
multi_shm()->numberOfDetectors = detectors.size();
multi_shm()->numberOfChannels += detectors[pos]->getTotalNumberOfChannels();
-
detectors[pos]->setHostname(hostname);
multi_shm()->multiDetectorType = getDetectorTypeAsEnum(-1);// -1 needed here
}
+void multiSlsDetector::updateDetectorSize() {
+ FILE_LOG(logDEBUG) << "Updating Multi-Detector Size: " << size();
+
+ int my = detectors[0]->getTotalNumberOfChannels(Y);
+ int mx = detectors[0]->getTotalNumberOfChannels(X);
+ int mgy = detectors[0]->getTotalNumberOfChannelsInclGapPixels(Y);
+ int mgx = detectors[0]->getTotalNumberOfChannelsInclGapPixels(X);
+ if (mgy == 0) {
+ mgy = my;
+ mgx = mx;
+ }
+
+ int maxy = multi_shm()->maxNumberOfChannelsPerDetector[Y];
+ if (maxy == -1) {
+ maxy = my * size();
+ }
+
+ int ndety = maxy / my;
+ int ndetx = size() / ndety;
+ if ((maxy % my) > 0) {
+ ++ndetx;
+ }
+
+ multi_shm()->numberOfDetector[X] = ndetx;
+ multi_shm()->numberOfDetector[Y] = ndety;
+ multi_shm()->numberOfChannel[X] = mx * ndetx;
+ multi_shm()->numberOfChannel[Y] = my * ndety;
+ multi_shm()->numberOfChannelInclGapPixels[X] = mgx * ndetx;
+ multi_shm()->numberOfChannelInclGapPixels[Y] = mgy * ndety;
+
+ FILE_LOG(logDEBUG)
+ << "\n\tNumber of Detectors in X direction:"
+ << multi_shm()->numberOfDetector[X]
+ << "\n\tNumber of Detectors in Y direction:"
+ << multi_shm()->numberOfDetector[Y]
+ << "\n\tNumber of Channels in X direction:"
+ << multi_shm()->numberOfChannel[X]
+ << "\n\tNumber of Channels in Y direction:"
+ << multi_shm()->numberOfChannel[Y]
+ << "\n\tNumber of Channels in X direction with Gap Pixels:"
+ << multi_shm()->numberOfChannelInclGapPixels[X]
+ << "\n\tNumber of Channels in Y direction with Gap Pixels:"
+ << multi_shm()->numberOfChannelInclGapPixels[Y];
+
+ multi_shm()->numberOfChannels =
+ multi_shm()->numberOfChannel[0] * multi_shm()->numberOfChannel[1];
+
+ for (auto &d : detectors) {
+ d->updateMultiSize(multi_shm()->numberOfDetector[0],
+ multi_shm()->numberOfDetector[1]);
+ }
+}
+
slsDetectorDefs::detectorType multiSlsDetector::getDetectorTypeAsEnum() const {
return multi_shm()->multiDetectorType;
}
@@ -732,14 +587,6 @@ void multiSlsDetector::setMaxNumberOfChannels(const slsDetectorDefs::coordinates
multi_shm()->maxNumberOfChannelsPerDetector[Y] = c.y;
}
-int multiSlsDetector::getDetectorOffset(dimension d, int detPos) {
- return detectors[detPos]->getDetectorOffset(d);
-}
-
-void multiSlsDetector::setDetectorOffset(dimension d, int off, int detPos) {
- detectors[detPos]->setDetectorOffset(d, off);
-}
-
int multiSlsDetector::getQuad(int detPos) {
int retval = detectors[0]->getQuad();
if (retval && size() > 1) {
@@ -1272,8 +1119,6 @@ int multiSlsDetector::setDynamicRange(int dr, int detPos) {
// change in dr
if (dr != -1 && dr != prevValue) {
- updateOffsets();
-
// update speed, check ratecorrection
if (getDetectorTypeAsEnum() == EIGER) {
@@ -2172,318 +2017,40 @@ int multiSlsDetector::setCounterBit(int i, int detPos) {
return sls::minusOneIfDifferent(r);
}
-void multiSlsDetector::verifyMinMaxROI(int n, ROI r[]) {
- int temp;
- for (int i = 0; i < n; ++i) {
- if ((r[i].xmax) < (r[i].xmin)) {
- temp = r[i].xmax;
- r[i].xmax = r[i].xmin;
- r[i].xmin = temp;
- }
- if ((r[i].ymax) < (r[i].ymin)) {
- temp = r[i].ymax;
- r[i].ymax = r[i].ymin;
- r[i].ymin = temp;
- }
- }
-}
-
-void multiSlsDetector::setROI(int n, ROI roiLimits[], int detPos) {
+void multiSlsDetector::clearROI(int detPos) {
// single
if (detPos >= 0) {
- detectors[detPos]->setROI(n, roiLimits);
+ detectors[detPos]->clearROI();
}
// multi
- int xmin = 0, xmax = 0, ymin = 0, ymax = 0, channelX = 0, channelY = 0,
- idet = 0, lastChannelX = 0, lastChannelY = 0, index = 0, offsetX = 0,
- offsetY = 0;
-
- bool invalidroi = false;
- int ndet = detectors.size();
- ROI allroi[ndet][n];
- int nroi[ndet];
- for (int i = 0; i < ndet; ++i) {
- nroi[i] = 0;
- }
-
- if ((n < 0) || (roiLimits == nullptr)) {
- throw RuntimeError("Cannot set ROI due to Invalid ROI");
- }
-
- // ensures min < max
- verifyMinMaxROI(n, roiLimits);
- FILE_LOG(logDEBUG1) << "Setting ROI for " << n << "rois:";
- for (int i = 0; i < n; ++i) {
- FILE_LOG(logDEBUG1)
- << i << ":" << roiLimits[i].xmin << "\t" << roiLimits[i].xmax
- << "\t" << roiLimits[i].ymin << "\t" << roiLimits[i].ymax;
- }
- // for each roi
- for (int i = 0; i < n; ++i) {
- xmin = roiLimits[i].xmin;
- xmax = roiLimits[i].xmax;
- ymin = roiLimits[i].ymin;
- ymax = roiLimits[i].ymax;
-
- if (size() > 1) {
- // check roi max values
- idet = decodeNChannel(xmax, ymax, channelX, channelY);
- FILE_LOG(logDEBUG1) << "Decoded Channel max vals: " << std::endl
- << "det:" << idet << "\t" << xmax << "\t"
- << ymax << "\t" << channelX << "\t" << channelY;
- if (idet == -1) {
- FILE_LOG(logERROR) << "invalid roi";
- continue;
- }
-
- // split in x dir
- while (xmin <= xmax) {
- invalidroi = false;
- ymin = roiLimits[i].ymin;
- // split in y dir
- while (ymin <= ymax) {
- // get offset for each detector
- idet = decodeNChannel(xmin, ymin, channelX, channelY);
- FILE_LOG(logDEBUG1)
- << "Decoded Channel min vals: " << std::endl
- << "det:" << idet << "\t" << xmin << "\t" << ymin
- << "\t" << channelX << "\t" << channelY;
- if (idet < 0 || idet >= (int)detectors.size()) {
- FILE_LOG(logDEBUG1) << "invalid roi";
- invalidroi = true;
- break;
- }
- // get last channel for each det in x and y dir
- lastChannelX =
- (detectors[idet]->getTotalNumberOfChannelsInclGapPixels(
- X)) -
- 1;
- lastChannelY =
- (detectors[idet]->getTotalNumberOfChannelsInclGapPixels(
- Y)) -
- 1;
-
- offsetX = detectors[idet]->getDetectorOffset(X);
- offsetY = detectors[idet]->getDetectorOffset(Y);
- // at the end in x dir
- if ((offsetX + lastChannelX) >= xmax) {
- lastChannelX = xmax - offsetX;
- }
- // at the end in y dir
- if ((offsetY + lastChannelY) >= ymax) {
- lastChannelY = ymax - offsetY;
- }
-
- FILE_LOG(logDEBUG1)
- << "lastChannelX:" << lastChannelX << "\t"
- << "lastChannelY:" << lastChannelY;
-
- // creating the list of roi for corresponding detector
- index = nroi[idet];
- allroi[idet][index].xmin = channelX;
- allroi[idet][index].xmax = lastChannelX;
- allroi[idet][index].ymin = channelY;
- allroi[idet][index].ymax = lastChannelY;
- nroi[idet] = nroi[idet] + 1;
-
- ymin = lastChannelY + offsetY + 1;
- if ((lastChannelY + offsetY) == ymax) {
- ymin = ymax + 1;
- }
-
- FILE_LOG(logDEBUG1)
- << "nroi[idet]:" << nroi[idet] << "\tymin:" << ymin;
- }
- if (invalidroi) {
- break;
- }
-
- xmin = lastChannelX + offsetX + 1;
- if ((lastChannelX + offsetX) == xmax) {
- xmin = xmax + 1;
- }
- }
- } else { // FIXME: check if xmax is greater? or reduce logic above?
- idet = 0;
- nroi[idet] = n;
- index = 0;
- allroi[idet][index].xmin = xmin;
- allroi[idet][index].xmax = xmax;
- allroi[idet][index].ymin = ymin;
- allroi[idet][index].ymax = ymax;
- // nroi[idet] = nroi[idet] + 1;
- }
- }
-
- FILE_LOG(logDEBUG1) << "Setting ROI :";
- for (size_t i = 0; i < detectors.size(); ++i) {
- FILE_LOG(logDEBUG1) << "detector " << i;
- for (int j = 0; j < nroi[i]; ++j) {
- FILE_LOG(logDEBUG1)
- << allroi[i][j].xmin << "\t" << allroi[i][j].xmax << "\t"
- << allroi[i][j].ymin << "\t" << allroi[i][j].ymax;
- }
- }
-
- // settings the rois for each detector
- for (size_t i = 0; i != detectors.size(); ++i) {
- detectors[i]->setROI(nroi[i], allroi[i]);
- }
+ parallelCall(&slsDetector::clearROI);
}
-const slsDetectorDefs::ROI *multiSlsDetector::getROI(int &n, int detPos) {
+void multiSlsDetector::setROI(slsDetectorDefs::ROI arg, int detPos) {
// single
if (detPos >= 0) {
- return detectors[detPos]->getROI(n);
+ detectors[detPos]->setROI(arg);
}
// multi
- n = 0;
- int num = 0;
- int ndet = detectors.size();
- int maxroi = ndet * MAX_ROIS;
- ROI temproi;
- ROI roiLimits[maxroi];
- ROI *retval = new ROI[maxroi];
- const ROI *temp = nullptr;
- int index = 0;
+ if (detPos < 0 && size() > 1) {
+ throw RuntimeError("Cannot set ROI for all modules simultaneously");
+ }
+ detectors[0]->setROI(arg);
+}
- // get each detector's roi array
- for (size_t idet = 0; idet < detectors.size(); ++idet) {
- temp = detectors[idet]->getROI(index);
- if (temp != nullptr) {
- if (index != 0) {
- FILE_LOG(logINFO) << "detector " << idet << ":";
- }
- for (int j = 0; j < index; ++j) {
- FILE_LOG(logINFO)
- << temp[j].xmin << "\t" << temp[j].xmax << "\t"
- << temp[j].ymin << "\t" << temp[j].ymax;
- int x = detectors[idet]->getDetectorOffset(X);
- int y = detectors[idet]->getDetectorOffset(Y);
- roiLimits[n].xmin = temp[j].xmin + x;
- roiLimits[n].xmax = temp[j].xmax + x;
- roiLimits[n].ymin = temp[j].ymin + y;
- roiLimits[n].ymax = temp[j].ymin + y;
- ++n;
- }
- }
+slsDetectorDefs::ROI multiSlsDetector::getROI(int detPos) const {
+ // single
+ if (detPos >= 0) {
+ return detectors[detPos]->getROI();
}
- // empty roi
- if (n == 0) {
- return nullptr;
+ // multi
+ if (detPos < 0 && size() > 1) {
+ throw RuntimeError("Cannot get ROI for all modules simultaneously");
}
-
- FILE_LOG(logDEBUG1) << "ROI :" << std::endl;
- for (int j = 0; j < n; ++j) {
- FILE_LOG(logDEBUG1)
- << roiLimits[j].xmin << "\t" << roiLimits[j].xmax << "\t"
- << roiLimits[j].ymin << "\t" << roiLimits[j].ymax;
- }
-
- // combine all the adjacent rois in x direction
- for (int i = 0; i < n; ++i) {
- // since the ones combined are replaced by -1
- if ((roiLimits[i].xmin) == -1) {
- continue;
- }
- for (int j = i + 1; j < n; ++j) {
- // since the ones combined are replaced by -1
- if ((roiLimits[j].xmin) == -1) {
- continue;
- }
- // if y values are same
- if (((roiLimits[i].ymin) == (roiLimits[j].ymin)) &&
- ((roiLimits[i].ymax) == (roiLimits[j].ymax))) {
- // if adjacent, increase [i] range and replace all [j] with -1
- if ((roiLimits[i].xmax) + 1 == roiLimits[j].xmin) {
- roiLimits[i].xmax = roiLimits[j].xmax;
- roiLimits[j].xmin = -1;
- roiLimits[j].xmax = -1;
- roiLimits[j].ymin = -1;
- roiLimits[j].ymax = -1;
- }
- // if adjacent, increase [i] range and replace all [j] with -1
- else if ((roiLimits[i].xmin) - 1 == roiLimits[j].xmax) {
- roiLimits[i].xmin = roiLimits[j].xmin;
- roiLimits[j].xmin = -1;
- roiLimits[j].xmax = -1;
- roiLimits[j].ymin = -1;
- roiLimits[j].ymax = -1;
- }
- }
- }
- }
-
- FILE_LOG(logDEBUG1) << "Combined along x axis Getting ROI :\ndetector "
- << n;
- for (int j = 0; j < n; ++j) {
- FILE_LOG(logDEBUG1)
- << roiLimits[j].xmin << "\t" << roiLimits[j].xmax << "\t"
- << roiLimits[j].ymin << "\t" << roiLimits[j].ymax;
- }
-
- // combine all the adjacent rois in y direction
- for (int i = 0; i < n; ++i) {
- // since the ones combined are replaced by -1
- if ((roiLimits[i].ymin) == -1) {
- continue;
- }
- for (int j = i + 1; j < n; ++j) {
- // since the ones combined are replaced by -1
- if ((roiLimits[j].ymin) == -1) {
- continue;
- }
- // if x values are same
- if (((roiLimits[i].xmin) == (roiLimits[j].xmin)) &&
- ((roiLimits[i].xmax) == (roiLimits[j].xmax))) {
- // if adjacent, increase [i] range and replace all [j] with -1
- if ((roiLimits[i].ymax) + 1 == roiLimits[j].ymin) {
- roiLimits[i].ymax = roiLimits[j].ymax;
- roiLimits[j].xmin = -1;
- roiLimits[j].xmax = -1;
- roiLimits[j].ymin = -1;
- roiLimits[j].ymax = -1;
- }
- // if adjacent, increase [i] range and replace all [j] with -1
- else if ((roiLimits[i].ymin) - 1 == roiLimits[j].ymax) {
- roiLimits[i].ymin = roiLimits[j].ymin;
- roiLimits[j].xmin = -1;
- roiLimits[j].xmax = -1;
- roiLimits[j].ymin = -1;
- roiLimits[j].ymax = -1;
- }
- }
- }
- }
-
- // get rid of -1s
- for (int i = 0; i < n; ++i) {
- if ((roiLimits[i].xmin) != -1) {
- retval[num] = roiLimits[i];
- ++num;
- }
- }
- // sort final roi
- for (int i = 0; i < num; ++i) {
- for (int j = i + 1; j < num; ++j) {
- if (retval[j].xmin < retval[i].xmin) {
- temproi = retval[i];
- retval[i] = retval[j];
- retval[j] = temproi;
- }
- }
- }
- n = num;
-
- FILE_LOG(logDEBUG1) << "\nxmin\txmax\tymin\tymax";
- for (int i = 0; i < n; ++i) {
- FILE_LOG(logDEBUG1) << retval[i].xmin << "\t" << retval[i].xmax << "\t"
- << retval[i].ymin << "\t" << retval[i].ymax;
- }
- return retval;
+ return detectors[0]->getROI();
}
void multiSlsDetector::setADCEnableMask(uint32_t mask, int detPos) {
@@ -2688,15 +2255,16 @@ int multiSlsDetector::enableGapPixels(int val, int detPos) {
int ret = sls::minusOneIfDifferent(r);
if (val != -1) {
- updateOffsets();
+ multi_shm()->numberOfChannelInclGapPixels[X] = sls::sum(parallelCall(&slsDetector::getTotalNumberOfChannelsInclGapPixels, X));
+ multi_shm()->numberOfChannelInclGapPixels[Y] = sls::sum(parallelCall(&slsDetector::getTotalNumberOfChannelsInclGapPixels, Y));
}
return ret;
}
void multiSlsDetector::setGapPixelsEnable(bool enable, Positions pos){
Parallel(&slsDetector::enableGapPixels, pos, static_cast(enable));
-
- updateOffsets();
+ multi_shm()->numberOfChannelInclGapPixels[X] = sls::sum(parallelCall(&slsDetector::getTotalNumberOfChannelsInclGapPixels, X));
+ multi_shm()->numberOfChannelInclGapPixels[Y] = sls::sum(parallelCall(&slsDetector::getTotalNumberOfChannelsInclGapPixels, Y));
}
int multiSlsDetector::setTrimEn(std::vector energies, int detPos) {
diff --git a/slsDetectorSoftware/src/slsDetector.cpp b/slsDetectorSoftware/src/slsDetector.cpp
index a8e373ad9..c2fc2416f 100755
--- a/slsDetectorSoftware/src/slsDetector.cpp
+++ b/slsDetectorSoftware/src/slsDetector.cpp
@@ -308,15 +308,13 @@ void slsDetector::initializeDetectorStructure(detectorType type) {
shm()->controlPort = DEFAULT_PORTNO;
sls::strcpy_safe(shm()->hostname, DEFAULT_HOSTNAME);
shm()->myDetectorType = type;
- shm()->offset[X] = 0;
- shm()->offset[Y] = 0;
shm()->multiSize[X] = 0;
shm()->multiSize[Y] = 0;
-
+ shm()->controlPort = DEFAULT_PORTNO;
shm()->stopPort = DEFAULT_PORTNO + 1;
sls::strcpy_safe(shm()->settingsDir, getenv("HOME"));
- shm()->nROI = 0;
- memset(shm()->roiLimits, 0, MAX_ROIS * sizeof(ROI));
+ shm()->roi.xmin = -1;
+ shm()->roi.xmax = -1;
shm()->adcEnableMask = BIT32_MASK;
shm()->roFlags = NORMAL_READOUT;
shm()->currentSettings = UNINITIALIZED;
@@ -688,28 +686,6 @@ int slsDetector::getReadNLines() {
return retval;
}
-int slsDetector::getDetectorOffset(dimension d) const {
- return shm()->offset[d];
-}
-
-slsDetectorDefs::coordinates slsDetector::getDetectorOffsets() const {
- slsDetectorDefs::coordinates coord;
- coord.x = shm()->offset[X];
- coord.y = shm()->offset[Y];
- return coord;
-}
-
-void slsDetector::setDetectorOffset(dimension d, int off) {
- if (off >= 0) {
- shm()->offset[d] = off;
- }
-}
-
-void slsDetector::setDetectorOffsets(slsDetectorDefs::coordinates value) {
- shm()->offset[X] = value.x;
- shm()->offset[Y] = value.y;
-}
-
void slsDetector::updateMultiSize(int detx, int dety) {
shm()->multiSize[0] = detx;
shm()->multiSize[1] = dety;
@@ -878,17 +854,9 @@ void slsDetector::updateCachedDetectorVariables() {
// roi
if (shm()->myDetectorType == GOTTHARD) {
n += client.Receive(&i32, sizeof(i32));
- shm()->nROI = i32;
- for (int i = 0; i < shm()->nROI; ++i) {
- n += client.Receive(&i32, sizeof(i32));
- shm()->roiLimits[i].xmin = i32;
- n += client.Receive(&i32, sizeof(i32));
- shm()->roiLimits[i].xmax = i32;
- n += client.Receive(&i32, sizeof(i32));
- shm()->roiLimits[i].ymin = i32;
- n += client.Receive(&i32, sizeof(i32));
- shm()->roiLimits[i].xmax = i32;
- }
+ shm()->roi.xmin = i32;
+ n += client.Receive(&i32, sizeof(i32));
+ shm()->roi.xmax = i32;
}
if (shm()->myDetectorType == CHIPTESTBOARD ||
@@ -1849,7 +1817,7 @@ std::string slsDetector::setReceiverHostname(const std::string &receiverIP) {
break;
case GOTTHARD:
- sendROI(-1, nullptr);
+ sendROItoReceiver();
break;
default:
@@ -2344,44 +2312,27 @@ int slsDetector::setCounterBit(int cb) {
return retval;
}
-void slsDetector::setROI(int n, ROI roiLimits[]) {
- std::sort(roiLimits, roiLimits + n,
- [](ROI a, ROI b) { return a.xmin < b.xmin; });
-
- sendROI(n, roiLimits);
+void slsDetector::clearROI() {
+ FILE_LOG(logDEBUG1) << "Clearing ROI";
+ slsDetectorDefs::ROI arg;
+ arg.xmin = -1;
+ arg.xmax = -1;
+ setROI(arg);
}
-const slsDetectorDefs::ROI *slsDetector::getROI(int &n) {
- sendROI(-1, nullptr);
- n = shm()->nROI;
- return shm()->roiLimits;
-}
-
-int slsDetector::getNRoi() { return shm()->nROI; }
-
-void slsDetector::sendROI(int n, ROI roiLimits[]) {
+void slsDetector::setROI(slsDetectorDefs::ROI arg) {
int fnum = F_SET_ROI;
int ret = FAIL;
- int narg = n;
- // send roiLimits if given, else from shm
- ROI *arg = (roiLimits != nullptr) ? roiLimits : shm()->roiLimits;
- int nretval = 0;
- ROI retval[MAX_ROIS];
- FILE_LOG(logDEBUG1) << "Sending ROI to detector" << narg;
-
+ if (arg.xmin < 0 || arg.xmax >= getTotalNumberOfChannels()) {
+ arg.xmin = -1;
+ arg.xmax = -1;
+ }
+ FILE_LOG(logDEBUG) << "Sending ROI to detector [" << arg.xmin << ", " << arg.xmax << "]";
auto client = DetectorSocket(shm()->hostname, shm()->controlPort);
client.Send(&fnum, sizeof(fnum));
- client.Send(&narg, sizeof(narg));
- if (narg != -1) {
- for (int i = 0; i < narg; ++i) {
- client.Send(&arg[i].xmin, sizeof(int));
- client.Send(&arg[i].xmax, sizeof(int));
- client.Send(&arg[i].ymin, sizeof(int));
- client.Send(&arg[i].ymax, sizeof(int));
- }
- }
+ client.Send(&arg.xmin, sizeof(int));
+ client.Send(&arg.xmax, sizeof(int));
client.Receive(&ret, sizeof(ret));
-
// handle ret
if (ret == FAIL) {
char mess[MAX_STR_LENGTH]{};
@@ -2389,65 +2340,63 @@ void slsDetector::sendROI(int n, ROI roiLimits[]) {
throw RuntimeError("Detector " + std::to_string(detId) +
" returned error: " + std::string(mess));
} else {
- client.Receive(&nretval, sizeof(nretval));
- int nrec = 0;
- for (int i = 0; i < nretval; ++i) {
- nrec += client.Receive(&retval[i].xmin, sizeof(int));
- nrec += client.Receive(&retval[i].xmax, sizeof(int));
- nrec += client.Receive(&retval[i].ymin, sizeof(int));
- nrec += client.Receive(&retval[i].ymax, sizeof(int));
- }
- shm()->nROI = nretval;
- FILE_LOG(logDEBUG1) << "nRoi: " << nretval;
- for (int i = 0; i < nretval; ++i) {
- shm()->roiLimits[i] = retval[i];
- FILE_LOG(logDEBUG1)
- << "ROI [" << i << "] (" << shm()->roiLimits[i].xmin << ","
- << shm()->roiLimits[i].xmax << "," << shm()->roiLimits[i].ymin
- << "," << shm()->roiLimits[i].ymax << ")";
+ memcpy(&shm()->roi, &arg, sizeof(ROI));
+ if (ret == FORCE_UPDATE) {
+ updateCachedDetectorVariables();
}
}
- if (ret == FORCE_UPDATE) {
- updateCachedDetectorVariables();
- }
+
// old firmware requires configuremac after setting roi
- if (shm()->myDetectorType == GOTTHARD && n != -1) {
+ if (shm()->myDetectorType == GOTTHARD) {
configureMAC();
}
+ sendROItoReceiver();
+}
+
+void slsDetector::sendROItoReceiver() {
// update roi in receiver
if (shm()->useReceiverFlag) {
- fnum = F_RECEIVER_SET_ROI;
- ret = FAIL;
- narg = shm()->nROI;
- arg = shm()->roiLimits;
- FILE_LOG(logDEBUG1) << "Sending ROI to receiver: " << shm()->nROI;
-
- auto receiver = ReceiverSocket(shm()->rxHostname, shm()->rxTCPPort);
- receiver.Send(&fnum, sizeof(fnum));
- receiver.Send(&narg, sizeof(narg));
- if (narg != -1) {
- for (int i = 0; i < narg; ++i) {
- receiver.Send(&arg[i].xmin, sizeof(int));
- receiver.Send(&arg[i].xmax, sizeof(int));
- receiver.Send(&arg[i].ymin, sizeof(int));
- receiver.Send(&arg[i].ymax, sizeof(int));
- }
- }
- receiver.Receive(&ret, sizeof(ret));
-
- if (ret == FAIL) {
- char mess[MAX_STR_LENGTH]{};
- receiver.Receive(mess, MAX_STR_LENGTH);
- throw ReceiverError("Receiver " + std::to_string(detId) +
- " returned error: " + std::string(mess));
- }
- if (ret == FORCE_UPDATE) {
- updateCachedReceiverVariables();
- }
+ FILE_LOG(logDEBUG1) << "Sending ROI to receiver";
+ sendToReceiver(F_RECEIVER_SET_ROI, shm()->roi, nullptr);
}
}
+slsDetectorDefs::ROI slsDetector::getROI() {
+ int fnum = F_GET_ROI;
+ int ret = FAIL;
+ FILE_LOG(logDEBUG1) << "Getting ROI from detector";
+ auto client = DetectorSocket(shm()->hostname, shm()->controlPort);
+ client.Send(&fnum, sizeof(fnum));
+ client.Receive(&ret, sizeof(ret));
+ // handle ret
+ if (ret == FAIL) {
+ char mess[MAX_STR_LENGTH]{};
+ client.Receive(mess, MAX_STR_LENGTH);
+ throw RuntimeError("Detector " + std::to_string(detId) +
+ " returned error: " + std::string(mess));
+ } else {
+ ROI retval;
+ client.Receive(&retval.xmin, sizeof(int));
+ client.Receive(&retval.xmax, sizeof(int));
+ FILE_LOG(logDEBUG1)
+ << "ROI retval [" << retval.xmin << ","
+ << retval.xmax << "]";
+ if (ret == FORCE_UPDATE) {
+ updateCachedDetectorVariables();
+ }
+ // if different from shm, update and send to receiver
+ if (shm()->roi.xmin != retval.xmin || shm()->roi.xmax != retval.xmax) {
+ memcpy(&shm()->roi, &retval, sizeof(ROI));
+ sendROItoReceiver();
+ }
+ }
+
+ return shm()->roi;
+}
+
+
+
void slsDetector::setADCEnableMask(uint32_t mask) {
uint32_t arg = mask;
FILE_LOG(logDEBUG1) << "Setting ADC Enable mask to 0x" << std::hex << arg
diff --git a/slsDetectorSoftware/src/slsDetectorCommand.cpp b/slsDetectorSoftware/src/slsDetectorCommand.cpp
index 3989a1d3a..3c3a7c36a 100755
--- a/slsDetectorSoftware/src/slsDetectorCommand.cpp
+++ b/slsDetectorSoftware/src/slsDetectorCommand.cpp
@@ -308,7 +308,14 @@ slsDetectorCommand::slsDetectorCommand(multiSlsDetector *det) {
++i;
/*! \page config
- - roi [i] [xmin] [xmax] [ymin] [ymax] sets region of interest of the detector, where i is number of rois;i=0 to clear rois. Used for GOTTHARD only. \c Returns \c (int)
+ - clearroi resets region of interest of the detector. Used for GOTTHARD only. \c Returns \c (string)
+ */
+ descrToFuncMap[i].m_pFuncName = "clearroi";
+ descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdDetectorSize;
+ ++i;
+
+ /*! \page config
+ - roi [xmin] [xmax] sets region of interest of the detector. Used for GOTTHARD only. \c Returns \c (int)
*/
descrToFuncMap[i].m_pFuncName = "roi";
descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdDetectorSize;
@@ -3252,28 +3259,28 @@ std::string slsDetectorCommand::cmdDetectorSize(int narg, const char * const arg
if (action == HELP_ACTION)
return helpDetectorSize(action);
- int ret, val = -1, pos = -1, i;
+ int ret, val = -1;
char ans[1000];
if (action == PUT_ACTION) {
- if (!sscanf(args[1], "%d", &val))
+ if (cmd != "roi" && !sscanf(args[1], "%d", &val))
return std::string("could not scan ") + std::string(args[0]) + std::string(" ") + std::string(args[1]);
+ if (cmd == "clearroi") {
+ myDet->clearROI(detPos);
+ }
+
if (cmd == "roi") {
//debug number of arguments
- if ((val < 0) || (narg != ((val * 4) + 2)))
+ if (narg != 3)
return helpDetectorSize(action);
- ROI allroi[val];
- pos = 2;
- for (i = 0; i < val; ++i) {
- if ((!sscanf(args[pos++], "%d", &allroi[i].xmin)) ||
- (!sscanf(args[pos++], "%d", &allroi[i].xmax)) ||
- (!sscanf(args[pos++], "%d", &allroi[i].ymin)) ||
- (!sscanf(args[pos++], "%d", &allroi[i].ymax)))
- return std::string("cannot parse arguments for roi");
- }
- myDet->setROI(val, allroi, detPos);
+ ROI roi;
+ if (!sscanf(args[1], "%d", &roi.xmin))
+ return std::string("cannot parse arguments for roi xmin");
+ if (!sscanf(args[2], "%d", &roi.xmax))
+ return std::string("cannot parse arguments for roi xmax");
+ myDet->setROI(roi, detPos);
}
if (cmd == "detsizechan") {
@@ -3308,17 +3315,21 @@ std::string slsDetectorCommand::cmdDetectorSize(int narg, const char * const arg
if ((!sscanf(args[1], "%d", &val)) || (val != 0 && val != 1))
return std::string("cannot scan gappixels mode: must be 0 or 1");
- if (detPos < 0) // only in multi detector level to update offsets etc.
+ if (detPos < 0) // only in multi detector level to update number of channels etc.
myDet->enableGapPixels(val, detPos);
}
}
if (cmd == "dr") {
ret = myDet->setDynamicRange(val, detPos);
+ } else if (cmd == "clearroi") {
+ if (action == GET_ACTION) {
+ return std::string("Cannot get");
+ }
+ return std::string("successful");
} else if (cmd == "roi") {
- const ROI* r = myDet->getROI(ret, detPos);
-
- delete [] r;
+ ROI roi = myDet->getROI(detPos);
+ return (std::string("[") + std::to_string(roi.xmin) + std::string(",") + std::to_string(roi.xmax) + std::string("]"));
} else if (cmd == "detsizechan") {
sprintf(ans, "%d %d", myDet->getMaxNumberOfChannelsPerDetector(X), myDet->getMaxNumberOfChannelsPerDetector(Y));
return std::string(ans);
@@ -3330,7 +3341,7 @@ std::string slsDetectorCommand::cmdDetectorSize(int narg, const char * const arg
return std::string("Not required for this detector\n");
ret = myDet->getFlippedData(Y, detPos);
} else if (cmd == "gappixels") {
- if (detPos >= 0) // only in multi detector level to update offsets etc.
+ if (detPos >= 0) // only in multi detector level to update number of channels etc.
return std::string("Cannot execute this command from slsDetector level. Please use multiSlsDetector level.\n");
ret = myDet->enableGapPixels(-1, detPos);
}
@@ -3349,7 +3360,8 @@ std::string slsDetectorCommand::helpDetectorSize(int action) {
std::ostringstream os;
if (action == PUT_ACTION || action == HELP_ACTION) {
os << "dr i \n sets the dynamic range of the detector" << std::endl;
- os << "roi i xmin xmax ymin ymax \n sets region of interest where i is number of rois;i=0 to clear rois" << std::endl;
+ os << "clearroi \n resets region of interest" << std::endl;
+ os << "roi xmin xmax \n sets region of interest " << std::endl;
os << "detsizechan x y \n sets the maximum number of channels for complete detector set in both directions; -1 is no limit" << std::endl;
os << "quad i \n if i = 1, sets the detector size to a quad (Specific to an EIGER quad hardware). 0 by default."<< std::endl;
os << "flippeddatax x \n sets if the data should be flipped on the x axis" << std::endl;
diff --git a/slsDetectorSoftware/src/slsDetectorUsers.cpp b/slsDetectorSoftware/src/slsDetectorUsers.cpp
index f4b83b178..8e89ca408 100755
--- a/slsDetectorSoftware/src/slsDetectorUsers.cpp
+++ b/slsDetectorSoftware/src/slsDetectorUsers.cpp
@@ -14,14 +14,7 @@ int slsDetectorUsers::getMaximumDetectorSize(int &nx, int &ny){
return nx*ny;
}
-int slsDetectorUsers::getDetectorSize(int &x, int &y, int &nx, int &ny, int detPos){
- if (detPos < 0) {
- x = 0;
- y = 0;
- } else {
- x = detector.getDetectorOffset(slsDetectorDefs::X, detPos);
- y = detector.getDetectorOffset(slsDetectorDefs::Y, detPos);
- }
+int slsDetectorUsers::getDetectorSize(int &nx, int &ny, int detPos){
nx=detector.getTotalNumberOfChannels(slsDetectorDefs::X, detPos);
ny=detector.getTotalNumberOfChannels(slsDetectorDefs::Y, detPos);
return nx*ny;
@@ -226,12 +219,12 @@ int slsDetectorUsers::setFlowControl10G(int i, int detPos) {
return detector.setFlowControl10G(i, detPos);
}
-void slsDetectorUsers::setROI(int n, slsDetectorDefs::ROI roiLimits[], int detPos) {
- detector.setROI(n, roiLimits, detPos);
+void slsDetectorUsers::setROI(slsDetectorDefs::ROI arg, int detPos) {
+ detector.setROI(arg, detPos);
}
-const slsDetectorDefs::ROI* slsDetectorUsers::getROI(int &n, int detPos) {
- return detector.getROI(n, detPos);
+slsDetectorDefs::ROI slsDetectorUsers::getROI(int detPos) {
+ return detector.getROI(detPos);
}
/************************************************************************
diff --git a/slsReceiverSoftware/include/DataStreamer.h b/slsReceiverSoftware/include/DataStreamer.h
index b3e62d48d..152d006c0 100755
--- a/slsReceiverSoftware/include/DataStreamer.h
+++ b/slsReceiverSoftware/include/DataStreamer.h
@@ -32,7 +32,7 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject {
* @param nd pointer to number of detectors in each dimension
* @param gpEnable pointer to gap pixels enable
*/
- DataStreamer(int ind, Fifo* f, uint32_t* dr, std::vector* r,
+ DataStreamer(int ind, Fifo* f, uint32_t* dr, ROI* r,
uint64_t* fi, int fd, char* ajh, int* nd, bool* gpEnable);
/**
@@ -188,7 +188,7 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject {
uint32_t* dynamicRange;
/** ROI */
- std::vector* roi;
+ ROI* roi;
/** adc Configured */
int adcConfigured;
diff --git a/slsReceiverSoftware/include/GeneralData.h b/slsReceiverSoftware/include/GeneralData.h
index 87ad410d0..99beeeddd 100755
--- a/slsReceiverSoftware/include/GeneralData.h
+++ b/slsReceiverSoftware/include/GeneralData.h
@@ -142,17 +142,17 @@ public:
* Set ROI
* @param i ROI
*/
- virtual void SetROI(std::vector i) {
+ virtual void SetROI(slsDetectorDefs::ROI i) {
FILE_LOG(logERROR) << "SetROI is a generic function that should be overloaded by a derived class";
};
/**
* Get Adc configured
* @param index thread index for debugging purposes
- * @param i pointer to a vector of ROI pointers
+ * @param ROI
* @returns adc configured
*/
- virtual int GetAdcConfigured(int index, std::vector* i) const{
+ virtual int GetAdcConfigured(int index, slsDetectorDefs::ROI i) const{
FILE_LOG(logERROR) << "GetAdcConfigured is a generic function that should be overloaded by a derived class";
return 0;
};
@@ -311,9 +311,9 @@ private:
* Set ROI
* @param i ROI
*/
- void SetROI(std::vector i) {
+ void SetROI(slsDetectorDefs::ROI i) {
// all adcs
- if(!i.size()) {
+ if(i.xmin == -1) {
nPixelsX = 1280;
dataSize = 1280;
packetSize = GOTTHARD_PACKET_SIZE;
@@ -352,28 +352,21 @@ private:
/**
* Get Adc configured
* @param index thread index for debugging purposes
- * @param i pointer to a vector of ROI
+ * @param i ROI
* @returns adc configured
*/
- int GetAdcConfigured(int index, std::vector* i) const{
+ int GetAdcConfigured(int index, slsDetectorDefs::ROI i) const{
int adc = -1;
// single adc
- if(i->size()) {
+ if(i.xmin != -1) {
// gotthard can have only one adc per detector enabled (or all)
- // so just looking at the first roi is enough (more not possible at the moment)
-
- //if its for 1 adc or general
- if ((i->at(0).xmin == 0) && (i->at(0).xmax == nChip * nChan))
+ //adc = mid value/numchans also for only 1 roi
+ adc = ((((i.xmax) + (i.xmin))/2)/
+ (nChan * nChipsPerAdc));
+ if((adc < 0) || (adc > 4)) {
+ FILE_LOG(logWARNING) << index << ": Deleting ROI. "
+ "Adc value should be between 0 and 4";
adc = -1;
- else {
- //adc = mid value/numchans also for only 1 roi
- adc = ((((i->at(0).xmax) + (i->at(0).xmin))/2)/
- (nChan * nChipsPerAdc));
- if((adc < 0) || (adc > 4)) {
- FILE_LOG(logWARNING) << index << ": Deleting ROI. "
- "Adc value should be between 0 and 4";
- adc = -1;
- }
}
}
FILE_LOG(logINFO) << "Adc Configured: " << adc;
diff --git a/slsReceiverSoftware/include/slsReceiverImplementation.h b/slsReceiverSoftware/include/slsReceiverImplementation.h
index aacab85cb..f579bc94d 100755
--- a/slsReceiverSoftware/include/slsReceiverImplementation.h
+++ b/slsReceiverSoftware/include/slsReceiverImplementation.h
@@ -207,9 +207,9 @@ class slsReceiverImplementation : private virtual slsDetectorDefs {
//***acquisition parameters***
/**
* Get ROI
- * @return index of adc enabled, else -1 if all enabled
+ * @return roi
*/
- std::vector getROI() const;
+ ROI getROI() const;
/**
* Get ADC Enable Mask
@@ -529,10 +529,10 @@ class slsReceiverImplementation : private virtual slsDetectorDefs {
//***acquisition parameters***
/**
* Set ROI
- * @param i ROI
+ * @param arg ROI
* @return OK or FAIL
*/
- int setROI(const std::vector new_roi);
+ int setROI(ROI arg);
/**
* Set ADC Enable Mask
@@ -961,7 +961,7 @@ class slsReceiverImplementation : private virtual slsDetectorDefs {
//***acquisition parameters***
/* ROI */
- std::vector roi;
+ ROI roi;
/** ADC Enable Mask */
uint32_t adcEnableMask;
/** streaming frequency */
diff --git a/slsReceiverSoftware/src/DataStreamer.cpp b/slsReceiverSoftware/src/DataStreamer.cpp
index c11d383df..3d5db32b9 100755
--- a/slsReceiverSoftware/src/DataStreamer.cpp
+++ b/slsReceiverSoftware/src/DataStreamer.cpp
@@ -16,7 +16,7 @@
const std::string DataStreamer::TypeName = "DataStreamer";
-DataStreamer::DataStreamer(int ind, Fifo* f, uint32_t* dr, std::vector* r,
+DataStreamer::DataStreamer(int ind, Fifo* f, uint32_t* dr, ROI* r,
uint64_t* fi, int fd, char* ajh, int* nd, bool* gpEnable) :
ThreadObject(ind),
runningFlag(0),
@@ -93,9 +93,9 @@ void DataStreamer::ResetParametersforNewMeasurement(const std::string& fname){
delete[] completeBuffer;
completeBuffer = nullptr;
}
- if (roi->size()) {
+ if (roi->xmin != -1) {
if (generalData->myDetectorType == GOTTHARD) {
- adcConfigured = generalData->GetAdcConfigured(index, roi);
+ adcConfigured = generalData->GetAdcConfigured(index, *roi);
}
completeBuffer = new char[generalData->imageSizeComplete];
memset(completeBuffer, 0, generalData->imageSizeComplete);
diff --git a/slsReceiverSoftware/src/slsReceiverImplementation.cpp b/slsReceiverSoftware/src/slsReceiverImplementation.cpp
index 1634f8c83..28b3f100e 100755
--- a/slsReceiverSoftware/src/slsReceiverImplementation.cpp
+++ b/slsReceiverSoftware/src/slsReceiverImplementation.cpp
@@ -104,7 +104,8 @@ void slsReceiverImplementation::InitializeMembers() {
overwriteEnable = true;
//***acquisition parameters***
- roi.clear();
+ roi.xmin = -1;
+ roi.xmax = -1;
adcEnableMask = BIT32_MASK;
streamingFrequency = 0;
streamingTimerInMs = DEFAULT_STREAMING_TIMER_IN_MS;
@@ -305,7 +306,7 @@ int slsReceiverImplementation::getNumberofUDPInterfaces() const {
}
/***acquisition parameters***/
-std::vector slsReceiverImplementation::getROI() const {
+slsDetectorDefs::ROI slsReceiverImplementation::getROI() const {
FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called";
return roi;
}
@@ -858,51 +859,21 @@ int slsReceiverImplementation::setUDPSocketBufferSize(const int64_t s) {
}
/***acquisition parameters***/
-int slsReceiverImplementation::setROI(
- const std::vector new_roi) {
- bool change = false;
- if (roi.size() != new_roi.size())
- change = true;
- else {
- for (size_t i = 0; i != new_roi.size(); ++i) {
- if ((roi[i].xmin != new_roi[i].xmin) ||
- (roi[i].xmax != new_roi[i].xmax) ||
- (roi[i].ymin != new_roi[i].ymin) ||
- (roi[i].xmax != new_roi[i].xmax)) {
- change = true;
- break;
- }
- }
- }
+int slsReceiverImplementation::setROI(slsDetectorDefs::ROI arg) {
+ if (roi.xmin != arg.xmin || roi.xmax != arg.xmax) {
+ roi.xmin = arg.xmin;
+ roi.xmax = arg.xmax;
- if (change) {
- roi = new_roi;
- switch (myDetectorType) {
- case GOTTHARD:
- generalData->SetROI(new_roi);
- framesPerFile = generalData->maxFramesPerFile;
- break;
- default:
- break;
- }
+ // only for gotthard
+ generalData->SetROI(arg);
+ framesPerFile = generalData->maxFramesPerFile;
for (const auto &it : dataProcessor)
it->SetPixelDimension();
if (SetupFifoStructure() == FAIL)
return FAIL;
}
- std::stringstream sstm;
- sstm << "ROI: ";
- if (!roi.size())
- sstm << "0";
- else {
- for (size_t i = 0; i < roi.size(); ++i) {
- sstm << "( " << roi[i].xmin << ", " << roi[i].xmax << ", "
- << roi[i].ymin << ", " << roi[i].ymax << " )";
- }
- }
- std::string message = sstm.str();
- FILE_LOG(logINFO) << message;
+ FILE_LOG(logINFO) << "ROI: [" << roi.xmin << ", " << roi.xmax << "]";;
FILE_LOG(logINFO) << "Packets per Frame: "
<< (generalData->packetsPerFrame);
return OK;
diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp
index ba99be5ae..7aacb2eb8 100755
--- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp
+++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp
@@ -510,22 +510,12 @@ int slsReceiverTCPIPInterface::set_detector_hostname(Interface &socket) {
}
int slsReceiverTCPIPInterface::set_roi(Interface &socket) {
- static_assert(sizeof(ROI) == 4 * sizeof(int), "ROI not packed");
- auto narg = socket.Receive();
- std::vector arg;
- for (int iloop = 0; iloop < narg; ++iloop) {
- ROI temp{};
- socket.Receive(temp);
- arg.push_back(temp);
- }
- FILE_LOG(logDEBUG1) << "Set ROI narg: " << narg;
- for (int iloop = 0; iloop < narg; ++iloop) {
- FILE_LOG(logDEBUG1)
- << "(" << arg[iloop].xmin << ", " << arg[iloop].xmax << ", "
- << arg[iloop].ymin << ", " << arg[iloop].ymax << ")";
- }
+ static_assert(sizeof(ROI) == 2 * sizeof(int), "ROI not packed");
+ ROI arg;
+ socket.Receive(arg);
+ FILE_LOG(logDEBUG1) << "Set ROI: [" << arg.xmin << ", " << arg.xmax << "]";
- if (myDetectorType == EIGER || myDetectorType == JUNGFRAU)
+ if (myDetectorType != GOTTHARD)
functionNotImplemented();
VerifyIdle(socket);
diff --git a/slsSupportLib/include/sls_detector_defs.h b/slsSupportLib/include/sls_detector_defs.h
index e224a319f..816836d9e 100755
--- a/slsSupportLib/include/sls_detector_defs.h
+++ b/slsSupportLib/include/sls_detector_defs.h
@@ -220,12 +220,18 @@ format
@short structure for a region of interest
xmin,xmax,ymin,ymax define the limits of the region
*/
+
+ #ifdef __cplusplus
+ struct ROI {
+ int xmin{-1}; /**< is the roi xmin (in channel number) */
+ int xmax{-1}; /**< is the roi xmax (in channel number)*/
+ };
+ #else
typedef struct {
int xmin; /**< is the roi xmin (in channel number) */
int xmax; /**< is the roi xmax (in channel number)*/
- int ymin; /**< is the roi ymin (in channel number)*/
- int ymax; /**< is the roi ymax (in channel number)*/
- } ROI;
+ } ROI;
+ #endif
/**
network parameters
diff --git a/slsSupportLib/include/sls_detector_funcs.h b/slsSupportLib/include/sls_detector_funcs.h
index cbc2caedd..3aa838a93 100755
--- a/slsSupportLib/include/sls_detector_funcs.h
+++ b/slsSupportLib/include/sls_detector_funcs.h
@@ -35,6 +35,7 @@ enum detFuncs{
F_SET_DYNAMIC_RANGE, /**< set/get detector dynamic range */
F_SET_READOUT_FLAGS, /**< set/get readout flags */
F_SET_ROI, /**< set/get region of interest */
+ F_GET_ROI,
F_SET_SPEED, /**< set/get readout speed parameters */
F_EXIT_SERVER, /**< turn off detector server */
F_LOCK_SERVER, /**< Locks/Unlocks server communication to the given client */
@@ -185,6 +186,7 @@ static const char* getFunctionNameFromEnum(enum detFuncs func) {
case F_SET_DYNAMIC_RANGE: return "F_SET_DYNAMIC_RANGE";
case F_SET_READOUT_FLAGS: return "F_SET_READOUT_FLAGS";
case F_SET_ROI: return "F_SET_ROI";
+ case F_GET_ROI: return "F_GET_ROI";
case F_SET_SPEED: return "F_SET_SPEED";
case F_EXIT_SERVER: return "F_EXIT_SERVER";
case F_LOCK_SERVER: return "F_LOCK_SERVER";
diff --git a/slsSupportLib/include/versionAPI.h b/slsSupportLib/include/versionAPI.h
index 1392d0ae8..85bcbd662 100644
--- a/slsSupportLib/include/versionAPI.h
+++ b/slsSupportLib/include/versionAPI.h
@@ -2,9 +2,9 @@
#define GITBRANCH "developer"
#define APIMOENCH 0x181108
#define APICTB 0x190604
-#define APIGOTTHARD 0x190715
#define APILIB 0x190723
#define APIRECEIVER 0x190722
#define APIGUI 0x190723
#define APIJUNGFRAU 0x190730
-#define APIEIGER 0x190809
+#define APIGOTTHARD 0x190813
+#define APIEIGER 0x190814