diff --git a/slsDetectorGui/include/qDrawPlot.h b/slsDetectorGui/include/qDrawPlot.h index df96214bf..2c8739040 100644 --- a/slsDetectorGui/include/qDrawPlot.h +++ b/slsDetectorGui/include/qDrawPlot.h @@ -91,8 +91,10 @@ class qDrawPlot : public QWidget, private Ui::PlotObject { void Update2dPlot(); void Update1dXYRange(); void Update2dXYRange(); + void rearrangeGotthard25data(double *data); static const int NUM_PEDESTAL_FRAMES = 20; + static const int NUM_GOTTHARD25_CHANS = 1280; sls::Detector *det; slsDetectorDefs::detectorType detType; @@ -164,4 +166,5 @@ class qDrawPlot : public QWidget, private Ui::PlotObject { uint32_t pixelMask{0}; uint32_t gainMask{0}; int gainOffset{0}; + bool gotthard25; }; diff --git a/slsDetectorGui/src/qDrawPlot.cpp b/slsDetectorGui/src/qDrawPlot.cpp index a95c9efcd..5101c11dd 100644 --- a/slsDetectorGui/src/qDrawPlot.cpp +++ b/slsDetectorGui/src/qDrawPlot.cpp @@ -80,6 +80,10 @@ void qDrawPlot::SetupWidgetWindow() { fileSaveName = "Image"; } + gotthard25 = ((detType == slsDetectorDefs::GOTTHARD2 || + detType == slsDetectorDefs::GOTTHARD) && + det->size() == 2); + SetupPlots(); SetDataCallBack(true); det->registerAcquisitionFinishedCallback(&(GetAcquisitionFinishedCallBack), @@ -807,6 +811,11 @@ void qDrawPlot::GetData(detectorData *data, uint64_t frameIndex, isGainDataExtracted = false; } + // gotthard25um rearranging + if (gotthard25) { + rearrangeGotthard25data(rawData); + } + // title and frame index titles plotTitle = plotTitlePrefix + QString(data->fileName.c_str()).section('/', -1); @@ -1145,6 +1154,18 @@ void qDrawPlot::toDoublePixelData(double *dest, char *source, int size, } } +void qDrawPlot::rearrangeGotthard25data(double *data) { + const int nChans = NUM_GOTTHARD25_CHANS; + double temp[nChans * 2] = {0.0}; + for (int i = 0; i != nChans; ++i) { + // master module + temp[i * 2] = data[i]; + // slave module + temp[i * 2 + 1] = data[nChans + i]; + } + memcpy(data, temp, nChans * 2 * sizeof(double)); +} + void qDrawPlot::UpdatePlot() { std::lock_guard lock(mPlots); LOG(logDEBUG) << "Update Plot"; diff --git a/slsDetectorSoftware/src/DetectorImpl.cpp b/slsDetectorSoftware/src/DetectorImpl.cpp index 86df25719..5751c5f77 100644 --- a/slsDetectorSoftware/src/DetectorImpl.cpp +++ b/slsDetectorSoftware/src/DetectorImpl.cpp @@ -281,6 +281,13 @@ void DetectorImpl::addModule(const std::string &hostname) { // get type by connecting detectorType type = Module::getTypeFromDetector(host, port); + + // gotthard cannot have more than 2 modules (50um=1, 25um=2 + if ((type == GOTTHARD || type == GOTTHARD2) && modules.size() > 2) { + freeSharedMemory(); + throw sls::RuntimeError("Gotthard cannot have more than 2 modules"); + } + auto pos = modules.size(); modules.emplace_back( sls::make_unique(type, detectorIndex, pos, false));