diff --git a/RELEASE.txt b/RELEASE.txt index 0cd4c5f26..3395b5bd9 100755 --- a/RELEASE.txt +++ b/RELEASE.txt @@ -83,6 +83,11 @@ This document describes the differences between v7.0.0 and v6.x.x -udp_srcip and udp_Srcip2: can set to auto (for virtual or 1g data networks) - set dataset name for all hdf5 files to "data" only - number of storage cells is not updated in teh receiver. done. and also allowing it to be modified in running status +- refactored memory structure in receiver and listener code (maybe resolves stuck issue, need to check) +- callback modified to have rx header and not rx header pointer +- rx udp socket refactored (maybe resolves getting stuck?)remove check for eiger header and isntead checks for malformed packets for every detector +-help should not create a new object + 2. Resolved Issues ================== diff --git a/integrationTests/test-integrationMulti.cpp b/integrationTests/test-integrationMulti.cpp index 64716e45c..40f77c6dd 100644 --- a/integrationTests/test-integrationMulti.cpp +++ b/integrationTests/test-integrationMulti.cpp @@ -106,4 +106,3 @@ TEST_CASE("Set and read timers", "[.integration][.multi]") { } } // namespace sls - diff --git a/libs/pybind11 b/libs/pybind11 index 8de7772cc..914c06fb2 160000 --- a/libs/pybind11 +++ b/libs/pybind11 @@ -1 +1 @@ -Subproject commit 8de7772cc72daca8e947b79b83fea46214931604 +Subproject commit 914c06fb252b6cc3727d0eedab6736e88a3fcb01 diff --git a/slsDetectorGui/slsDetectorPlotting/include/SlsQt1DPlot.h b/slsDetectorGui/slsDetectorPlotting/include/SlsQt1DPlot.h index 7441981db..c5914cd7c 100644 --- a/slsDetectorGui/slsDetectorPlotting/include/SlsQt1DPlot.h +++ b/slsDetectorGui/slsDetectorPlotting/include/SlsQt1DPlot.h @@ -8,8 +8,8 @@ #include #include #include -#include #include +#include class QPen; class QwtSymbol; @@ -140,7 +140,7 @@ class SlsQt1DPlot : public QwtPlot { void SetLogX(bool yes = 1); void SetLogY(bool yes = 1); - void EnableRoiBox(std::array roi); + void EnableRoiBox(std::array roi); void DisableRoiBox(); private: @@ -176,5 +176,3 @@ class SlsQt1DPlot : public QwtPlot { } // namespace sls #endif - - diff --git a/slsDetectorGui/slsDetectorPlotting/include/SlsQt2DPlot.h b/slsDetectorGui/slsDetectorPlotting/include/SlsQt2DPlot.h index 5b2f499df..650b8f295 100644 --- a/slsDetectorGui/slsDetectorPlotting/include/SlsQt2DPlot.h +++ b/slsDetectorGui/slsDetectorPlotting/include/SlsQt2DPlot.h @@ -5,8 +5,8 @@ #include "SlsQt2DZoomer.h" #include #include -#include #include +#include class QwtPlotPanner; class QwtScaleWidget; @@ -70,7 +70,7 @@ class SlsQt2DPlot : public QwtPlot { void SetLogz(bool enable, bool isMin, bool isMax, double min, double max); void SetZRange(bool isMin, bool isMax, double min, double max); void LogZ(bool on = 1); - void EnableRoiBox(std::array roi); + void EnableRoiBox(std::array roi); void DisableRoiBox(); public slots: diff --git a/slsDetectorGui/slsDetectorPlotting/src/SlsQt1DPlot.cpp b/slsDetectorGui/slsDetectorPlotting/src/SlsQt1DPlot.cpp index 3cfa413d4..87a988e6c 100644 --- a/slsDetectorGui/slsDetectorPlotting/src/SlsQt1DPlot.cpp +++ b/slsDetectorGui/slsDetectorPlotting/src/SlsQt1DPlot.cpp @@ -444,17 +444,16 @@ void SlsQt1DPlot::SetLog(int axisId, bool yes) { Update(); } - void SlsQt1DPlot::EnableRoiBox(std::array roi) { if (roiBox == nullptr) { roiBox = new QwtPlotShapeItem(); roiBox->attach(this); roiBox->setPen(QColor(Qt::yellow), 2.0, Qt::SolidLine); - } + } // TopLeft - BottomRight (max points are +1 on graph) QRect myRect(QPoint(roi[0], roi[2]), QPoint(roi[1] - 1, roi[3] - 1)); - roiBox->setRect( QRectF(myRect) ); + roiBox->setRect(QRectF(myRect)); replot(); } @@ -465,7 +464,6 @@ void SlsQt1DPlot::DisableRoiBox() { } } - void SlsQt1DPlot::UnZoom() { setAxisScale(QwtPlot::xBottom, zoomer->x(), zoomer->x() + zoomer->w()); setAxisScale(QwtPlot::yLeft, zoomer->y(), zoomer->y() + zoomer->h()); diff --git a/slsDetectorGui/slsDetectorPlotting/src/SlsQt2DPlot.cpp b/slsDetectorGui/slsDetectorPlotting/src/SlsQt2DPlot.cpp index 4a1f8b687..d166338d2 100644 --- a/slsDetectorGui/slsDetectorPlotting/src/SlsQt2DPlot.cpp +++ b/slsDetectorGui/slsDetectorPlotting/src/SlsQt2DPlot.cpp @@ -301,7 +301,7 @@ void SlsQt2DPlot::EnableRoiBox(std::array roi) { // TopLeft - BottomRight (max points are +1 on graph) QRect myRect(QPoint(roi[0], roi[2]), QPoint(roi[1] - 1, roi[3] - 1)); - roiBox->setRect( QRectF(myRect) ); + roiBox->setRect(QRectF(myRect)); roiBox->attach(this); replot(); diff --git a/slsDetectorGui/src/qDetectorMain.cpp b/slsDetectorGui/src/qDetectorMain.cpp index 203b6b451..b0f553d2d 100644 --- a/slsDetectorGui/src/qDetectorMain.cpp +++ b/slsDetectorGui/src/qDetectorMain.cpp @@ -59,7 +59,8 @@ int main(int argc, char **argv) { case 'f': fname = optarg; - LOG(sls::logDEBUG) << long_options[option_index].name << " " << optarg; + LOG(sls::logDEBUG) + << long_options[option_index].name << " " << optarg; break; case 'd': @@ -73,7 +74,7 @@ int main(int argc, char **argv) { case 'v': tempval = APIGUI; LOG(sls::logINFO) << "SLS Detector GUI " << GITBRANCH << " (0x" - << std::hex << tempval << ")"; + << std::hex << tempval << ")"; return 0; case 'h': @@ -101,7 +102,8 @@ int main(int argc, char **argv) { app.exec(); } catch (const std::exception &e) { sls::qDefs::Message(sls::qDefs::CRITICAL, - std::string(e.what()) + "\nExiting Gui :'( ", "main"); + std::string(e.what()) + "\nExiting Gui :'( ", + "main"); } return 0; } @@ -243,16 +245,14 @@ void qDetectorMain::SetUpDetector(const std::string &config_file, int multiID) { default: std::ostringstream os; os << det->getHostname() << " has " - << ToString(det->getDetectorType().squash()) - << " detector type (" << std::to_string(detType) - << "). Exiting GUI."; + << ToString(det->getDetectorType().squash()) << " detector type (" + << std::to_string(detType) << "). Exiting GUI."; std::string errorMess = os.str(); throw RuntimeError(errorMess.c_str()); } std::ostringstream os; - os << "SLS Detector GUI : " - << ToString(det->getDetectorType().squash()) << " - " - << det->getHostname(); + os << "SLS Detector GUI : " << ToString(det->getDetectorType().squash()) + << " - " << det->getHostname(); std::string title = os.str(); LOG(logINFO) << title; setWindowTitle(QString(title.c_str())); @@ -344,7 +344,8 @@ void qDetectorMain::EnableModes(QAction *action) { enable = actionExpert->isChecked(); tabs->setTabEnabled(ADVANCED, enable); - bool visible = enable && (detType == slsDetectorDefs::EIGER || detType == slsDetectorDefs::MYTHEN3); + bool visible = enable && (detType == slsDetectorDefs::EIGER || + detType == slsDetectorDefs::MYTHEN3); actionLoadTrimbits->setVisible(visible); actionSaveTrimbits->setVisible(visible); tabSettings->SetExportMode(enable); diff --git a/slsDetectorGui/src/qDrawPlot.cpp b/slsDetectorGui/src/qDrawPlot.cpp index d6abbc9aa..c8cb311ce 100644 --- a/slsDetectorGui/src/qDrawPlot.cpp +++ b/slsDetectorGui/src/qDrawPlot.cpp @@ -628,7 +628,6 @@ void qDrawPlot::SetGapPixels(bool enable) { isGapPixels = enable; } - void qDrawPlot::GetStatistics(double &min, double &max, double &sum) { LOG(logDEBUG) << "Calculating Statistics"; double *array = data2d; @@ -778,15 +777,15 @@ void qDrawPlot::GetData(detectorData *data, uint64_t frameIndex, rxRoi.ymax = data->rxRoi[3]; // only for 2d anyway if (isGapPixels) { - rxRoi.xmin += ((rxRoi.xmin/1024) * 6 + (rxRoi.xmin/256) * 2); - rxRoi.xmax += ((rxRoi.xmax/1024) * 6 + (rxRoi.xmax/256) * 2); - rxRoi.ymin += ((rxRoi.ymin/512) * 34 + (rxRoi.ymin/256) * 2); - rxRoi.ymax += ((rxRoi.ymax/512) * 34 + (rxRoi.ymax/256) * 2); - LOG(logINFO) << "Rx_roi recalculated with gap pixels: " << ToString(rxRoi); + rxRoi.xmin += ((rxRoi.xmin / 1024) * 6 + (rxRoi.xmin / 256) * 2); + rxRoi.xmax += ((rxRoi.xmax / 1024) * 6 + (rxRoi.xmax / 256) * 2); + rxRoi.ymin += ((rxRoi.ymin / 512) * 34 + (rxRoi.ymin / 256) * 2); + rxRoi.ymax += ((rxRoi.ymax / 512) * 34 + (rxRoi.ymax / 256) * 2); + LOG(logINFO) << "Rx_roi recalculated with gap pixels: " + << ToString(rxRoi); } LOG(logDEBUG) << "Rx_roi: " << ToString(rxRoi); } - // 1d check if npixelX has changed (m3 for different counters enabled) if (is1d && static_cast(nPixelsX) != data->nx) { @@ -1034,17 +1033,22 @@ void qDrawPlot::Update1dPlot() { } lblRxRoiEnabled->hide(); } else { - plot1d->EnableRoiBox(std::array{rxRoi.xmin, rxRoi.xmax, (int)plot1d->GetYMinimum(), (int)plot1d->GetYMaximum()}); + plot1d->EnableRoiBox(std::array{ + rxRoi.xmin, rxRoi.xmax, (int)plot1d->GetYMinimum(), + (int)plot1d->GetYMaximum()}); if (isGainDataExtracted) { - gainplot1d->EnableRoiBox(std::array{rxRoi.xmin, rxRoi.xmax, 0, 3}); + gainplot1d->EnableRoiBox( + std::array{rxRoi.xmin, rxRoi.xmax, 0, 3}); } lblRxRoiEnabled->show(); } } // ymin and ymax could change (so replot roi every time) if (!rxRoi.completeRoi()) { - plot1d->EnableRoiBox(std::array{rxRoi.xmin, rxRoi.xmax, (int)plot1d->GetYMinimum(), (int)plot1d->GetYMaximum()}); - } + plot1d->EnableRoiBox(std::array{rxRoi.xmin, rxRoi.xmax, + (int)plot1d->GetYMinimum(), + (int)plot1d->GetYMaximum()}); + } } void qDrawPlot::Update2dPlot() { diff --git a/slsDetectorGui/src/qTabAdvanced.cpp b/slsDetectorGui/src/qTabAdvanced.cpp index 433195756..4f3aca801 100644 --- a/slsDetectorGui/src/qTabAdvanced.cpp +++ b/slsDetectorGui/src/qTabAdvanced.cpp @@ -7,8 +7,7 @@ namespace sls { -qTabAdvanced::qTabAdvanced(QWidget *parent, Detector *detector, - qDrawPlot *p) +qTabAdvanced::qTabAdvanced(QWidget *parent, Detector *detector, qDrawPlot *p) : QWidget(parent), det(detector), plot(p) { setupUi(this); SetupWidgetWindow(); @@ -445,8 +444,7 @@ void qTabAdvanced::SetDetectorUDPIP(bool force) { std::string s = dispDetectorUDPIP->text().toAscii().constData(); LOG(logINFO) << "Setting Detector UDP IP:" << s; try { - det->setSourceUDPIP(IpAddr{s}, - {comboDetector->currentIndex()}); + det->setSourceUDPIP(IpAddr{s}, {comboDetector->currentIndex()}); } CATCH_HANDLE("Could not set Detector UDP IP.", "qTabAdvanced::SetDetectorUDPIP", this, @@ -463,8 +461,7 @@ void qTabAdvanced::SetDetectorUDPMAC(bool force) { std::string s = dispDetectorUDPMAC->text().toAscii().constData(); LOG(logINFO) << "Setting Detector UDP MAC:" << s; try { - det->setSourceUDPMAC(MacAddr{s}, - {comboDetector->currentIndex()}); + det->setSourceUDPMAC(MacAddr{s}, {comboDetector->currentIndex()}); } CATCH_HANDLE("Could not set Detector UDP MAC.", "qTabAdvanced::SetDetectorUDPMAC", this, @@ -491,8 +488,7 @@ void qTabAdvanced::SetCltZMQIP(bool force) { std::string s = dispZMQIP->text().toAscii().constData(); LOG(logINFO) << "Setting Client ZMQ IP:" << s; try { - det->setClientZmqIp(IpAddr{s}, - {comboDetector->currentIndex()}); + det->setClientZmqIp(IpAddr{s}, {comboDetector->currentIndex()}); } CATCH_HANDLE("Could not set Client ZMQ IP.", "qTabAdvanced::SetCltZMQIP", this, diff --git a/slsDetectorGui/src/qTabDataOutput.cpp b/slsDetectorGui/src/qTabDataOutput.cpp index 6d624a82b..7ab62ef2e 100644 --- a/slsDetectorGui/src/qTabDataOutput.cpp +++ b/slsDetectorGui/src/qTabDataOutput.cpp @@ -235,7 +235,7 @@ void qTabDataOutput::GetFileFormat() { break; default: throw RuntimeError(std::string("Unknown file format: ") + - std::to_string(static_cast(retval))); + std::to_string(static_cast(retval))); } } CATCH_DISPLAY("Could not get file format.", "qTabDataOutput::GetFileFormat") diff --git a/slsDetectorGui/src/qTabDeveloper.cpp b/slsDetectorGui/src/qTabDeveloper.cpp index 7fb6cfdfc..6f1b9273b 100644 --- a/slsDetectorGui/src/qTabDeveloper.cpp +++ b/slsDetectorGui/src/qTabDeveloper.cpp @@ -344,7 +344,7 @@ qTabDeveloper::getSLSIndex(slsDetectorDefs::detectorType detType, int index) { return slsDetectorDefs::TEMPERATURE_FPGA; default: throw RuntimeError(std::string("Unknown dac/adc index") + - std::to_string(index)); + std::to_string(index)); } break; case slsDetectorDefs::GOTTHARD: @@ -371,7 +371,7 @@ qTabDeveloper::getSLSIndex(slsDetectorDefs::detectorType detType, int index) { return slsDetectorDefs::TEMPERATURE_FPGA; default: throw RuntimeError(std::string("Unknown dac/adc index") + - std::to_string(index)); + std::to_string(index)); } break; @@ -397,7 +397,7 @@ qTabDeveloper::getSLSIndex(slsDetectorDefs::detectorType detType, int index) { return slsDetectorDefs::TEMPERATURE_ADC; default: throw RuntimeError(std::string("Unknown dac/adc index") + - std::to_string(index)); + std::to_string(index)); } break; @@ -421,7 +421,7 @@ qTabDeveloper::getSLSIndex(slsDetectorDefs::detectorType detType, int index) { return slsDetectorDefs::IBIAS_SFP; default: throw RuntimeError(std::string("Unknown dac/adc index") + - std::to_string(index)); + std::to_string(index)); } break; @@ -463,7 +463,7 @@ qTabDeveloper::getSLSIndex(slsDetectorDefs::detectorType detType, int index) { return slsDetectorDefs::VTHRESHOLD; default: throw RuntimeError(std::string("Unknown dac/adc index") + - std::to_string(index)); + std::to_string(index)); } break; @@ -499,7 +499,7 @@ qTabDeveloper::getSLSIndex(slsDetectorDefs::detectorType detType, int index) { return slsDetectorDefs::VCOM_ADC2; default: throw RuntimeError(std::string("Unknown dac/adc index") + - std::to_string(index)); + std::to_string(index)); } break; diff --git a/slsDetectorGui/src/qTabMeasurement.cpp b/slsDetectorGui/src/qTabMeasurement.cpp index 4e8976219..841c8465c 100644 --- a/slsDetectorGui/src/qTabMeasurement.cpp +++ b/slsDetectorGui/src/qTabMeasurement.cpp @@ -339,7 +339,7 @@ void qTabMeasurement::GetTimingMode() { disconnect(comboTimingMode, SIGNAL(currentIndexChanged(int)), this, SLOT(SetTimingMode(int))); try { - + slsDetectorDefs::timingMode retval{slsDetectorDefs::AUTO_TIMING}; // m3: remove slave modes (always trigger) before squashing if (det->getDetectorType().squash() == slsDetectorDefs::MYTHEN3) { @@ -373,7 +373,7 @@ void qTabMeasurement::GetTimingMode() { break; default: throw RuntimeError(std::string("Unknown timing mode: ") + - std::to_string(retval)); + std::to_string(retval)); } } CATCH_DISPLAY("Could not get timing mode.", @@ -410,7 +410,7 @@ void qTabMeasurement::GetBurstMode() { break; default: throw RuntimeError(std::string("Unknown burst mode: ") + - std::to_string(retval)); + std::to_string(retval)); } } CATCH_DISPLAY("Could not get burst mode.", "qTabMeasurement::GetBurstMode") diff --git a/slsDetectorGui/src/qTabSettings.cpp b/slsDetectorGui/src/qTabSettings.cpp index 91f758f28..10f1ceb91 100644 --- a/slsDetectorGui/src/qTabSettings.cpp +++ b/slsDetectorGui/src/qTabSettings.cpp @@ -88,7 +88,7 @@ void qTabSettings::SetupWidgetWindow() { } else if (detType == slsDetectorDefs::EIGER) { lblSpinHV->show(); spinHV->show(); - hvmin = 0; + hvmin = 0; lblDynamicRange->setEnabled(true); comboDynamicRange->setEnabled(true); lblThreshold->setEnabled(true); @@ -103,11 +103,11 @@ void qTabSettings::SetupWidgetWindow() { lblComboHV->show(); } else if (detType == slsDetectorDefs::MOENCH) { lblSpinHV->show(); - spinHV->show(); + spinHV->show(); } else if (detType == slsDetectorDefs::GOTTHARD2) { lblSpinHV->show(); spinHV->show(); - hvmin = 0; + hvmin = 0; } // default settings for the disabled @@ -241,10 +241,10 @@ void qTabSettings::GetHighVoltage() { try { Result retvals = det->getHighVoltage(); - int retval = 0; + int retval = 0; if (det->getDetectorType().squash() != slsDetectorDefs::EIGER) { retval = retvals.tsquash("Inconsistent values for high voltage."); - } + } // eiger slaves return -999 else { @@ -255,14 +255,15 @@ void qTabSettings::GetHighVoltage() { master_retvals.push_back(retvals[i]); } } - retval = master_retvals.tsquash("Inconsistent values for high voltage."); - } - + retval = + master_retvals.tsquash("Inconsistent values for high voltage."); + } + // spinHV if (spinHV->isVisible()) { if (retval != 0 && retval < hvmin && retval > HV_MAX) { throw RuntimeError(std::string("Unknown High Voltage: ") + - std::to_string(retval)); + std::to_string(retval)); } spinHV->setValue(retval); } @@ -292,12 +293,11 @@ void qTabSettings::GetHighVoltage() { break; default: throw RuntimeError(std::string("Unknown High Voltage: ") + - std::to_string(retval)); + std::to_string(retval)); } } } - CATCH_DISPLAY("Could not get high voltage.", - "qTabSettings::GetHighVoltage") + CATCH_DISPLAY("Could not get high voltage.", "qTabSettings::GetHighVoltage") connect(spinHV, SIGNAL(valueChanged(int)), this, SLOT(SetHighVoltage())); connect(comboHV, SIGNAL(currentIndexChanged(int)), this, SLOT(SetHighVoltage())); @@ -332,7 +332,7 @@ void qTabSettings::GetSettings() { default: if ((int)retval < -1 || (int)retval >= comboSettings->count()) { throw RuntimeError(std::string("Unknown settings: ") + - std::to_string(retval)); + std::to_string(retval)); } comboSettings->setCurrentIndex(retval); break; @@ -367,7 +367,7 @@ void qTabSettings::GetGainMode() { "Inconsistent gain mode for all detectors."); if ((int)retval < 0 || (int)retval >= comboGainMode->count()) { throw RuntimeError(std::string("Unknown gain mode: ") + - std::to_string(retval)); + std::to_string(retval)); } // warning when using fix_g0 and not in export mode if ((int)retval == FIX_G0 && !isVisibleFixG0) { @@ -438,7 +438,7 @@ void qTabSettings::GetDynamicRange() { break; default: throw RuntimeError(std::string("Unknown dynamic range: ") + - std::to_string(retval)); + std::to_string(retval)); } } CATCH_DISPLAY("Could not get dynamic range.", @@ -469,7 +469,7 @@ void qTabSettings::SetDynamicRange(int index) { break; default: throw RuntimeError(std::string("Unknown dynamic range: ") + - std::to_string(index)); + std::to_string(index)); } } CATCH_HANDLE("Could not set dynamic range.", @@ -515,8 +515,7 @@ void qTabSettings::SetThresholdEnergies() { slsDetectorDefs::detectorSettings sett = static_cast( comboSettings->currentIndex()); - LOG(logINFO) << "Setting Threshold Energies to " << ToString(eV) - << " (eV)"; + LOG(logINFO) << "Setting Threshold Energies to " << ToString(eV) << " (eV)"; try { det->setThresholdEnergy(eV, sett); } @@ -555,9 +554,8 @@ void qTabSettings::GetCounterMask() { // if retval[i] = 2, chkCounter2 is checked for (auto i : retval) { if (i > 3) { - throw RuntimeError( - std::string("Unknown counter index : ") + - std::to_string(static_cast(i))); + throw RuntimeError(std::string("Unknown counter index : ") + + std::to_string(static_cast(i))); } counters[i]->setChecked(true); } diff --git a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c index 017ffc514..54ca07f07 100644 --- a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c @@ -1125,7 +1125,7 @@ int64_t getMeasuredSubPeriod() { /* parameters - channel, module, settings */ -void getModule(sls_detector_module* myMod) { +void getModule(sls_detector_module *myMod) { // serial number myMod->serialnumber = detectorModules->serialnumber; // reg (settings) @@ -1133,7 +1133,7 @@ void getModule(sls_detector_module* myMod) { // iodelay myMod->iodelay = setIODelay(-1); // tau - myMod->tau = (int) getCurrentTau(); + myMod->tau = (int)getCurrentTau(); // eV myMod->eV[0] = detectorModules->eV[0]; // dacs @@ -1150,8 +1150,10 @@ int setModule(sls_detector_module myMod, char *mess) { LOG(logINFO, ("Setting module with settings %d\n", myMod.reg)); - if (((myMod.nchan) > (detectorModules->nchan)) || ((myMod.ndac) > (detectorModules->ndac))) { - strcpy(mess, "Could not set module as the number of channels or dacs do not match to the one in the detector server\n"); + if (((myMod.nchan) > (detectorModules->nchan)) || + ((myMod.ndac) > (detectorModules->ndac))) { + strcpy(mess, "Could not set module as the number of channels or dacs " + "do not match to the one in the detector server\n"); LOG(logERROR, (mess)); return FAIL; } @@ -2158,7 +2160,7 @@ void setExternalGating(int enable[]) { enable[1] = eiger_extgatingpolarity; } -int setTrimbits(int* chanregs, char* mess) { +int setTrimbits(int *chanregs, char *mess) { LOG(logINFO, ("Setting module with trimbits\n")); #ifndef VIRTUAL // include gap pixels @@ -2190,7 +2192,7 @@ int setTrimbits(int* chanregs, char* mess) { LOG(logERROR, (mess)); setSettings(UNDEFINED); LOG(logERROR, ("Settings has been changed to undefined (random " - "trim file)\n")); + "trim file)\n")); // if quad, reset M8 and PROGRAM manually if (!Feb_Control_SetChipSignalsToTrimQuad(0)) { @@ -2219,7 +2221,6 @@ int setTrimbits(int* chanregs, char* mess) { return OK; } - int setAllTrimbits(int val) { LOG(logINFO, ("Setting all trimbits to %d\n", val)); #ifndef VIRTUAL diff --git a/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer b/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer index bf0d7e213..a17968377 100755 Binary files a/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer and b/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer differ diff --git a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c index e65719c07..cfa68014a 100644 --- a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c @@ -2271,10 +2271,6 @@ int setClockDivider(enum CLKINDEX ind, int val) { clkDivider[ind] = val; LOG(logINFO, ("\t%s clock (%d) divider set to %d\n", clock_names[ind], ind, clkDivider[ind])); - // update system frequency - if (ind == SYSTEM_C0) { - setTimingSource(getTimingSource()); - } // phase is reset by pll (when setting output frequency) if (ind < SYSTEM_C0) { @@ -2305,9 +2301,9 @@ int setClockDivider(enum CLKINDEX ind, int val) { int64_t period = getPeriod(); int64_t delayAfterTrigger = getDelayAfterTrigger(); int64_t burstPeriod = getBurstPeriod(); - + systemFrequency = ((double)getVCOFrequency(SYSTEM_C0) / - (double)clkDivider[SYSTEM_C0]); + (double)clkDivider[SYSTEM_C0]); setExpTime(exptime); setPeriod(period); diff --git a/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h index 22e994f1c..543e1ff20 100644 --- a/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h @@ -67,11 +67,11 @@ #define SPEED_144_CLKDIV_0 (6) #define SPEED_144_CLKDIV_1 (6) #define SPEED_144_CLKPHASE_DEG_1 (122) // 125 not possible -#define SPEED_144_DBIT_PIPELINE (1) +#define SPEED_144_DBIT_PIPELINE (1) #define SPEED_108_CLKDIV_0 (8) #define SPEED_108_CLKDIV_1 (8) #define SPEED_108_CLKPHASE_DEG_1 (268) // 270 not possible -#define SPEED_108_DBIT_PIPELINE (1) +#define SPEED_108_DBIT_PIPELINE (1) /* Firmware Definitions */ #define FIXED_PLL_FREQUENCY (20000000) // 20MHz diff --git a/slsDetectorServers/gotthardDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/gotthardDetectorServer/slsDetectorFunctionList.c index b89a988ee..221676690 100644 --- a/slsDetectorServers/gotthardDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/gotthardDetectorServer/slsDetectorFunctionList.c @@ -862,7 +862,8 @@ int setROI(ROI arg) { rois.ymin = -1; rois.ymax = -1; } else { - LOG(logINFO, ("Setting ROI:(%d, %d, %d, %d)\n", arg.xmin, arg.xmax, arg.ymin, arg.ymax)); + LOG(logINFO, ("Setting ROI:(%d, %d, %d, %d)\n", arg.xmin, arg.xmax, + arg.ymin, arg.ymax)); // validation // xmin divisible by 256 and less than 1280 if (((arg.xmin % NCHAN_PER_ADC) != 0) || @@ -896,7 +897,8 @@ ROI getROI() { if (rois.xmin == -1) { LOG(logINFO, ("\tROI: None\n")); } else { - LOG(logINFO, ("ROI: (%d,%d,%d,%d)\n", rois.xmin, rois.xmax, rois.ymin, rois.ymax)); + LOG(logINFO, ("ROI: (%d,%d,%d,%d)\n", rois.xmin, rois.xmax, rois.ymin, + rois.ymax)); } return rois; } diff --git a/slsDetectorServers/moenchDetectorServer/RegisterDefs.h b/slsDetectorServers/moenchDetectorServer/RegisterDefs.h index 048dfdc9a..bfd563358 100644 --- a/slsDetectorServers/moenchDetectorServer/RegisterDefs.h +++ b/slsDetectorServers/moenchDetectorServer/RegisterDefs.h @@ -572,7 +572,6 @@ #define PATTERN_SET_LSB_REG (0x82 << MEM_MAP_SHIFT) #define PATTERN_SET_MSB_REG (0x83 << MEM_MAP_SHIFT) - /* Pattern Loop 3 Address RW regiser */ #define PATTERN_LOOP_3_ADDR_REG (0x84 << MEM_MAP_SHIFT) diff --git a/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c index 776787a81..67f35ea67 100644 --- a/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c @@ -422,7 +422,7 @@ void allocateDetectorStructureMemory() { detectorDacs[idac] = 0; } - // trimbits start at 0 + // trimbits start at 0 for (int ichan = 0; ichan < (detectorModules->nchan); ichan++) { *((detectorModules->chanregs) + ichan) = 0; } @@ -488,7 +488,6 @@ void setupDetector() { // dynamic range setDynamicRange(DEFAULT_DYNAMIC_RANGE); - // Initialization of acquistion parameters setNumFrames(DEFAULT_NUM_FRAMES); setNumTriggers(DEFAULT_NUM_CYCLES); @@ -1102,7 +1101,7 @@ void updateVthAndCounterMask() { setVthDac(2, 0); } else { // previous counter values - setCounterMaskWithUpdateFlag(counterMask, 0); + setCounterMaskWithUpdateFlag(counterMask, 0); } if (pumpProbe) { // enable only vth2 @@ -1280,7 +1279,7 @@ int setDACS(int *dacs) { return OK; } -void getModule(sls_detector_module* myMod) { +void getModule(sls_detector_module *myMod) { // serial number myMod->serialnumber = detectorModules->serialnumber; // csr reg @@ -1302,8 +1301,10 @@ void getModule(sls_detector_module* myMod) { int setModule(sls_detector_module myMod, char *mess) { LOG(logINFO, ("Setting module\n")); - if (((myMod.nchan) > (detectorModules->nchan)) || ((myMod.ndac) > (detectorModules->ndac))) { - strcpy(mess, "Could not set module as the number of channels or dacs do not match to the one in the detector server\n"); + if (((myMod.nchan) > (detectorModules->nchan)) || + ((myMod.ndac) > (detectorModules->ndac))) { + strcpy(mess, "Could not set module as the number of channels or dacs " + "do not match to the one in the detector server\n"); LOG(logERROR, (mess)); return FAIL; } @@ -1359,7 +1360,8 @@ int setTrimbits(int *trimbits) { uint32_t prevRunClk = clkDivider[SYSTEM_C0]; // set to trimming clock - if (setClockDividerWithTimeUpdateOption(SYSTEM_C0, DEFAULT_TRIMMING_RUN_CLKDIV, 0) == FAIL) { + if (setClockDividerWithTimeUpdateOption( + SYSTEM_C0, DEFAULT_TRIMMING_RUN_CLKDIV, 0) == FAIL) { LOG(logERROR, ("Could not start trimming. Could not set to trimming clock\n")); return FAIL; @@ -1479,7 +1481,7 @@ enum detectorSettings setSettings(enum detectorSettings sett) { void validateSettings() { LOG(logWARNING, ("Not validating dac settings temporarily")); return; - + // if any special dac value is changed individually => undefined const int specialDacs[NSPECIALDACS] = SPECIALDACINDEX; int *specialDacValues[] = {defaultDacValue_standard, defaultDacValue_fast, @@ -1541,7 +1543,7 @@ void setDAC(enum DACINDEX ind, int val, int mV, int counterEnableCheck) { return; } - // threshold dacs + // threshold dacs // remember value, vthreshold: skip disabled, // others: disable or enable dac if counter mask // setDAC called directly: will set independent of counter enable @@ -1569,8 +1571,8 @@ void setDAC(enum DACINDEX ind, int val, int mV, int counterEnableCheck) { // skip setting vthx dac (value remembered anyway) if (ind == M_VTHRESHOLD) { continue; - } - // disable dac (except when setting dac directly) + } + // disable dac (except when setting dac directly) if (counterEnableCheck) { val = DEFAULT_COUNTER_DISABLED_VTH_VAL; } @@ -1624,7 +1626,7 @@ void setVthDac(int index, int enable) { if (enable) { value = vthEnabledVals[index]; } - setGeneralDAC(vthdacs[index], value, 0); + setGeneralDAC(vthdacs[index], value, 0); } int getDAC(enum DACINDEX ind, int mV) { @@ -1790,11 +1792,11 @@ int setGainCaps(int caps) { int setInterpolation(int enable) { LOG(logINFO, ("%s Interpolation\n", enable == 0 ? "Disabling" : "Enabling")); - + int csr = M3SetInterpolation(enable); int ret = setChipStatusRegister(csr); if (ret == OK) { - updateVthAndCounterMask(); + updateVthAndCounterMask(); } return ret; } @@ -2271,7 +2273,8 @@ int setClockDivider(enum CLKINDEX ind, int val) { return setClockDividerWithTimeUpdateOption(ind, val, 1); } -int setClockDividerWithTimeUpdateOption(enum CLKINDEX ind, int val, int timeUpdate) { +int setClockDividerWithTimeUpdateOption(enum CLKINDEX ind, int val, + int timeUpdate) { if (ind < 0 || ind >= NUM_CLOCKS) { LOG(logERROR, ("Unknown clock index %d to set clock divider\n", ind)); return FAIL; @@ -2310,7 +2313,7 @@ int setClockDividerWithTimeUpdateOption(enum CLKINDEX ind, int val, int timeUpda } int64_t period = getPeriod(); int64_t delayAfterTrigger = getDelayAfterTrigger(); - + clkDivider[ind] = val; for (int i = 0; i != 3; ++i) { @@ -2461,8 +2464,8 @@ void *start_timer(void *arg) { for (int i = 0; i < nchannels; ++i) { switch (dr) { - //case 1: // TODO: Not implemented in firmware yet - // break; + // case 1: // TODO: Not implemented in firmware yet + // break; case 8: *((uint8_t *)(imageData + i)) = (uint8_t)i; break; @@ -2470,7 +2473,8 @@ void *start_timer(void *arg) { *((uint16_t *)(imageData + i * sizeof(uint16_t))) = (uint16_t)i; break; case 32: - *((uint32_t *)(imageData + i * sizeof(uint32_t))) = ((uint32_t)i & 0xFFFFFF); // 24 bit + *((uint32_t *)(imageData + i * sizeof(uint32_t))) = + ((uint32_t)i & 0xFFFFFF); // 24 bit break; default: break; @@ -2491,8 +2495,7 @@ void *start_timer(void *arg) { struct timespec begin, end; clock_gettime(CLOCK_REALTIME, &begin); usleep(expUs); - - + int srcOffset = 0; // loop packet for (int i = 0; i != packetsPerFrame; ++i) { @@ -2712,7 +2715,8 @@ int setChipStatusRegister(int csr) { uint32_t prevRunClk = clkDivider[SYSTEM_C0]; // set to trimming clock - if (setClockDividerWithTimeUpdateOption(SYSTEM_C0, DEFAULT_TRIMMING_RUN_CLKDIV, 0) == FAIL) { + if (setClockDividerWithTimeUpdateOption( + SYSTEM_C0, DEFAULT_TRIMMING_RUN_CLKDIV, 0) == FAIL) { LOG(logERROR, ("Could not set to trimming clock in order to change CSR\n")); return FAIL; diff --git a/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h index 4956dd52f..08df21400 100644 --- a/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h @@ -105,7 +105,7 @@ enum DACINDEX { 1220, /* vIpreOut */ \ 2800, /* Vth3 */ \ 2800, /* Vth1 */ \ - 800, /* vIcin */ \ + 800, /* vIcin */ \ 1800, /* cas */ \ 1100, /* Vrpreamp */ \ 1100, /* Vcal_n */ \ diff --git a/slsDetectorServers/slsDetectorServer/include/programViaBlackfin.h b/slsDetectorServers/slsDetectorServer/include/programViaBlackfin.h index 0dabbfbec..edb2bb60c 100644 --- a/slsDetectorServers/slsDetectorServer/include/programViaBlackfin.h +++ b/slsDetectorServers/slsDetectorServer/include/programViaBlackfin.h @@ -29,9 +29,10 @@ int eraseAndWriteToFlash(char *mess, enum PROGRAM_INDEX index, ssize_t fsize, int forceDeleteNormalFile); int getDrive(char *mess, enum PROGRAM_INDEX index); /** Notify fpga not to touch flash, open src and flash drive to write */ -int openFileForFlash(char *mess, enum PROGRAM_INDEX index, FILE **flashfd, FILE **srcfd, - int forceDeleteNormalFile); -int checkNormalFile(char *mess, enum PROGRAM_INDEX index, int forceDeleteNormalFile); +int openFileForFlash(char *mess, enum PROGRAM_INDEX index, FILE **flashfd, + FILE **srcfd, int forceDeleteNormalFile); +int checkNormalFile(char *mess, enum PROGRAM_INDEX index, + int forceDeleteNormalFile); int eraseFlash(char *mess); /* write from tmp file to flash */ int writeToFlash(char *mess, ssize_t fsize, FILE *flashfd, FILE *srcfd); diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index d33cec62b..e8bd5e397 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -310,14 +310,14 @@ int64_t getMeasurementTime(); // parameters - module, settings #if defined(MYTHEN3D) || defined(EIGERD) -void getModule(sls_detector_module* myMod); +void getModule(sls_detector_module *myMod); #endif #if (!defined(CHIPTESTBOARDD)) && (!defined(MOENCHD)) && (!defined(GOTTHARD2D)) int setModule(sls_detector_module myMod, char *mess); #endif #ifdef EIGERD -int setTrimbits(int* chanregs, char* mess); +int setTrimbits(int *chanregs, char *mess); #endif #ifdef MYTHEN3D int setTrimbits(int *trimbits); @@ -569,7 +569,8 @@ int getFrequency(enum CLKINDEX ind); int getVCOFrequency(enum CLKINDEX ind); int getMaxClockDivider(); int setClockDivider(enum CLKINDEX ind, int val); -int setClockDividerWithTimeUpdateOption(enum CLKINDEX ind, int val, int timeUpdate); +int setClockDividerWithTimeUpdateOption(enum CLKINDEX ind, int val, + int timeUpdate); int getClockDivider(enum CLKINDEX ind); #elif GOTTHARD2D diff --git a/slsDetectorServers/slsDetectorServer/src/communication_funcs.c b/slsDetectorServers/slsDetectorServer/src/communication_funcs.c index 08376899d..229670185 100644 --- a/slsDetectorServers/slsDetectorServer/src/communication_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/communication_funcs.c @@ -411,14 +411,14 @@ int sendModule(int file_des, sls_detector_module *myMod) { LOG(level, ("Sending Module\n")); int ts = 0, n = 0; - n = sendData(file_des, &(myMod->serialnumber), - sizeof(myMod->serialnumber), INT32); + n = sendData(file_des, &(myMod->serialnumber), sizeof(myMod->serialnumber), + INT32); if (!n) { return -1; } ts += n; - LOG(level, ("serialno sent %d bytes. serialno: %d\n", n, - myMod->serialnumber)); + LOG(level, + ("serialno sent %d bytes. serialno: %d\n", n, myMod->serialnumber)); n = sendData(file_des, &(myMod->nchan), sizeof(myMod->nchan), INT32); if (!n) { return -1; @@ -448,8 +448,7 @@ int sendModule(int file_des, sls_detector_module *myMod) { return -1; } ts += n; - LOG(level, - ("iodelay sent %d bytes. iodelay: %d\n", n, myMod->iodelay)); + LOG(level, ("iodelay sent %d bytes. iodelay: %d\n", n, myMod->iodelay)); n = sendData(file_des, &(myMod->tau), sizeof(myMod->tau), INT32); if (!n) { return -1; @@ -471,7 +470,7 @@ int sendModule(int file_des, sls_detector_module *myMod) { LOG(level, ("dacs sent %d bytes.\n", n)); // channels n = sendData(file_des, myMod->chanregs, sizeof(int) * (myMod->nchan), - INT32); + INT32); LOG(level, ("chanregs sent %d bytes.\n", n)); if (!n) { return -1; @@ -494,8 +493,8 @@ int receiveModule(int file_des, sls_detector_module *myMod) { return -1; } ts += n; - LOG(level, ("serialno received %d bytes. serialno: %d\n", n, - myMod->serialnumber)); + LOG(level, + ("serialno received %d bytes. serialno: %d\n", n, myMod->serialnumber)); n = receiveData(file_des, &(myMod->nchan), sizeof(myMod->nchan), INT32); if (!n) { return -1; @@ -525,8 +524,7 @@ int receiveModule(int file_des, sls_detector_module *myMod) { return -1; } ts += n; - LOG(level, - ("iodelay received %d bytes. iodelay: %d\n", n, myMod->iodelay)); + LOG(level, ("iodelay received %d bytes. iodelay: %d\n", n, myMod->iodelay)); n = receiveData(file_des, &(myMod->tau), sizeof(myMod->tau), INT32); if (!n) { return -1; diff --git a/slsDetectorServers/slsDetectorServer/src/loadPattern.c b/slsDetectorServers/slsDetectorServer/src/loadPattern.c index eb9d342ba..ecb171009 100644 --- a/slsDetectorServers/slsDetectorServer/src/loadPattern.c +++ b/slsDetectorServers/slsDetectorServer/src/loadPattern.c @@ -164,8 +164,10 @@ void writePatternWord(int addr, uint64_t word) { int validate_getPatternWaitAddresses(char *message, int level, int *addr) { // validate input if (level < 0 || level >= MAX_LEVELS) { - sprintf(message, - "Cannot get patwait address. Level %d must be between 0 and %d.\n", level, MAX_LEVELS - 1); + sprintf( + message, + "Cannot get patwait address. Level %d must be between 0 and %d.\n", + level, MAX_LEVELS - 1); LOG(logERROR, (message)); return FAIL; } @@ -203,8 +205,10 @@ int getPatternWaitAddress(int level) { int validate_setPatternWaitAddresses(char *message, int level, int addr) { // validate input if (level < 0 || level >= MAX_LEVELS) { - sprintf(message, - "Cannot set patwait address. Level %d must be between 0 and %d.\n", level, MAX_LEVELS - 1); + sprintf( + message, + "Cannot set patwait address. Level %d must be between 0 and %d.\n", + level, MAX_LEVELS - 1); LOG(logERROR, (message)); return FAIL; } @@ -274,7 +278,8 @@ int validate_getPatternWaitTime(char *message, int level, uint64_t *waittime) { // validate input if (level < 0 || level >= MAX_LEVELS) { sprintf(message, - "Cannot get patwaittime. Level %d must be between 0 and %d.\n", level, MAX_LEVELS - 1); + "Cannot get patwaittime. Level %d must be between 0 and %d.\n", + level, MAX_LEVELS - 1); LOG(logERROR, (message)); return FAIL; } @@ -313,7 +318,8 @@ int validate_setPatternWaitTime(char *message, int level, uint64_t waittime) { // validate input if (level < 0 || level >= MAX_LEVELS) { sprintf(message, - "Cannot set patwaittime. Level %d must be between 0 and %d.\n", level, MAX_LEVELS - 1); + "Cannot set patwaittime. Level %d must be between 0 and %d.\n", + level, MAX_LEVELS - 1); LOG(logERROR, (message)); return FAIL; } @@ -376,7 +382,8 @@ int validate_getPatternLoopCycles(char *message, int level, int *numLoops) { // validate input if (level < 0 || level >= MAX_LEVELS) { sprintf(message, - "Cannot get patnloop. Level %d must be between 0 and %d.\n", level, MAX_LEVELS - 1); + "Cannot get patnloop. Level %d must be between 0 and %d.\n", + level, MAX_LEVELS - 1); LOG(logERROR, (message)); return FAIL; } @@ -409,7 +416,8 @@ int validate_setPatternLoopCycles(char *message, int level, int numLoops) { // validate input if (level < 0 || level >= MAX_LEVELS) { sprintf(message, - "Cannot set patnloop. Level %d must be between 0 and %d.\n", level, MAX_LEVELS); + "Cannot set patnloop. Level %d must be between 0 and %d.\n", + level, MAX_LEVELS); LOG(logERROR, (message)); return FAIL; } @@ -519,9 +527,10 @@ int validate_getPatternLoopAddresses(char *message, int level, int *startAddr, int *stopAddr) { // validate input if (level < 0 || level >= MAX_LEVELS) { - sprintf( - message, - "Cannot get patloop addresses. Level %d must be between 0 and %d.\n", level, MAX_LEVELS - 1); + sprintf(message, + "Cannot get patloop addresses. Level %d must be between 0 and " + "%d.\n", + level, MAX_LEVELS - 1); LOG(logERROR, (message)); return FAIL; } @@ -591,9 +600,10 @@ int validate_setPatternLoopAddresses(char *message, int level, int startAddr, int stopAddr) { // validate input if (level < 0 || level >= MAX_LEVELS) { - sprintf( - message, - "Cannot set patloop addresses. Level %d must be between 0 and %d.\n", level, MAX_LEVELS - 1); + sprintf(message, + "Cannot set patloop addresses. Level %d must be between 0 and " + "%d.\n", + level, MAX_LEVELS - 1); LOG(logERROR, (message)); return FAIL; } @@ -970,13 +980,13 @@ int loadPatternFile(char *patFname, char *errMessage) { } // patloop - if (!strncmp(line, "patloop", strlen("patloop"))){ + if (!strncmp(line, "patloop", strlen("patloop"))) { int level = -1; int startAddr = 0; int stopAddr = 0; // cannot scan values - if (sscanf(line, "%s %d 0x%x 0x%x", command, &level, &startAddr, &stopAddr) != - 4) { + if (sscanf(line, "%s %d 0x%x 0x%x", command, &level, &startAddr, + &stopAddr) != 4) { strcpy(temp, "Could not scan patloop arguments.\n"); break; } diff --git a/slsDetectorServers/slsDetectorServer/src/programViaBlackfin.c b/slsDetectorServers/slsDetectorServer/src/programViaBlackfin.c index 2329f07cb..e5a281875 100644 --- a/slsDetectorServers/slsDetectorServer/src/programViaBlackfin.c +++ b/slsDetectorServers/slsDetectorServer/src/programViaBlackfin.c @@ -110,7 +110,8 @@ int defineGPIOpins(char *mess) { if (access(CMD_GPIO9_EXIST, F_OK) != 0) { if (executeCommand(CMD_GPIO9_DEFINE, retvals, logDEBUG1) == FAIL) { snprintf(mess, MAX_STR_LENGTH, - "Could not define gpio9 (nConfig) for fpga (%s)\n", retvals); + "Could not define gpio9 (nConfig) for fpga (%s)\n", + retvals); LOG(logERROR, (mess)); return FAIL; } @@ -146,7 +147,8 @@ int FPGAdontTouchFlash(char *mess, int programming) { // define gpio9 as output if (executeCommand(CMD_GPIO9_DEFINE_OUT, retvals, logDEBUG1) == FAIL) { snprintf(mess, MAX_STR_LENGTH, - "Could not set gpio9 (nConfig) as output for fpga (%s)\n", retvals); + "Could not set gpio9 (nConfig) as output for fpga (%s)\n", + retvals); LOG(logERROR, (mess)); return FAIL; } @@ -156,7 +158,8 @@ int FPGAdontTouchFlash(char *mess, int programming) { if (programming && latestKernelVerified == 1) { if (executeCommand(CMD_GPIO3_DEFINE_OUT, retvals, logDEBUG1) == FAIL) { snprintf(mess, MAX_STR_LENGTH, - "Could not set gpio3 (nCE) as output for fpga (%s)\n", retvals); + "Could not set gpio3 (nCE) as output for fpga (%s)\n", + retvals); LOG(logERROR, (mess)); return FAIL; } @@ -166,9 +169,10 @@ int FPGAdontTouchFlash(char *mess, int programming) { // tell FPGA to not: gpio9 if (executeCommand(CMD_GPIO9_DONT_TOUCH_FLASH, retvals, logDEBUG1) == FAIL) { - snprintf(mess, MAX_STR_LENGTH, - "Could not set gpio9 (nConfig) to not touch flash for fpga (%s)\n", - retvals); + snprintf( + mess, MAX_STR_LENGTH, + "Could not set gpio9 (nConfig) to not touch flash for fpga (%s)\n", + retvals); LOG(logERROR, (mess)); return FAIL; } @@ -178,9 +182,10 @@ int FPGAdontTouchFlash(char *mess, int programming) { if (programming && latestKernelVerified == 1) { if (executeCommand(CMD_GPIO3_DONT_TOUCH_FLASH, retvals, logDEBUG1) == FAIL) { - snprintf(mess, MAX_STR_LENGTH, - "Could not set gpio3 (nCE) to not touch flash for fpga (%s)\n", - retvals); + snprintf( + mess, MAX_STR_LENGTH, + "Could not set gpio3 (nCE) to not touch flash for fpga (%s)\n", + retvals); LOG(logERROR, (mess)); return FAIL; } @@ -198,7 +203,8 @@ int FPGATouchFlash(char *mess, int programming) { // tell FPGA to touch flash to program itself if (executeCommand(CMD_GPIO9_DEFINE_IN, retvals, logDEBUG1) == FAIL) { snprintf(mess, MAX_STR_LENGTH, - "Could not set gpio9 (nConfig) as input for fpga (%s)\n", retvals); + "Could not set gpio9 (nConfig) as input for fpga (%s)\n", + retvals); LOG(logERROR, (mess)); return FAIL; } @@ -207,7 +213,8 @@ int FPGATouchFlash(char *mess, int programming) { if (programming && latestKernelVerified == 1) { if (executeCommand(CMD_GPIO3_DEFINE_IN, retvals, logDEBUG1) == FAIL) { snprintf(mess, MAX_STR_LENGTH, - "Could not set gpio3 (nCE) as input for fpga (%s)\n", retvals); + "Could not set gpio3 (nCE) as input for fpga (%s)\n", + retvals); LOG(logERROR, (mess)); return FAIL; } @@ -341,8 +348,8 @@ int eraseAndWriteToFlash(char *mess, enum PROGRAM_INDEX index, FILE *flashfd = NULL; FILE *srcfd = NULL; - if (openFileForFlash(mess, index, &flashfd, &srcfd, forceDeleteNormalFile) == - FAIL) { + if (openFileForFlash(mess, index, &flashfd, &srcfd, + forceDeleteNormalFile) == FAIL) { return FAIL; } @@ -446,8 +453,8 @@ int getDrive(char *mess, enum PROGRAM_INDEX index) { return OK; } -int openFileForFlash(char *mess, enum PROGRAM_INDEX index, FILE **flashfd, FILE **srcfd, - int forceDeleteNormalFile) { +int openFileForFlash(char *mess, enum PROGRAM_INDEX index, FILE **flashfd, + FILE **srcfd, int forceDeleteNormalFile) { // open src file *srcfd = fopen(TEMP_PROG_FILE_NAME, "r"); if (*srcfd == NULL) { @@ -480,13 +487,13 @@ int openFileForFlash(char *mess, enum PROGRAM_INDEX index, FILE **flashfd, FILE return OK; } -int checkNormalFile(char *mess, enum PROGRAM_INDEX index, int forceDeleteNormalFile) { +int checkNormalFile(char *mess, enum PROGRAM_INDEX index, + int forceDeleteNormalFile) { #ifndef VIRTUAL // check if its a normal file or special file struct stat buf; if (stat(flashDriveName, &buf) == -1) { - sprintf(mess, - "Could not %s. Unable to find the flash drive %s\n", + sprintf(mess, "Could not %s. Unable to find the flash drive %s\n", messageType, flashDriveName); LOG(logERROR, (mess)); return FAIL; @@ -507,17 +514,21 @@ int checkNormalFile(char *mess, enum PROGRAM_INDEX index, int forceDeleteNormalF // user does not allow to fix it (default) if (forceDeleteNormalFile == 0) { sprintf(mess, - "Could not %s. The flash drive %s found for fpga programming is a normal file. To " - "fix this (by deleting this file, creating the flash drive and proceeding with " - "programming), re-run the programming command 'programfpga' with parameter " - "'--force-delete-normal-file'\n", - messageType, flashDriveName); + "Could not %s. The flash drive %s found for fpga " + "programming is a normal file. To " + "fix this (by deleting this file, creating the flash drive " + "and proceeding with " + "programming), re-run the programming command " + "'programfpga' with parameter " + "'--force-delete-normal-file'\n", + messageType, flashDriveName); LOG(logERROR, (mess)); return FAIL; } - + // fpga memory stays after a reboot, user allowed to fix it - LOG(logWARNING, ("Flash drive invalidated (normal file). Fixing it...\n")); + LOG(logWARNING, + ("Flash drive invalidated (normal file). Fixing it...\n")); // user allows to fix it, so force delete normal file char cmd[MAX_STR_LENGTH] = {0}; @@ -678,7 +689,8 @@ int waitForFPGAtoTouchFlash(char *mess) { #ifdef VIRTUAL return OK; #endif - LOG(logINFO, ("\tWaiting for FPGA to program from flash... \n\t[gpio7 (CD) should be High when done]\n")); + LOG(logINFO, ("\tWaiting for FPGA to program from flash... \n\t[gpio7 (CD) " + "should be High when done]\n")); int timeSpent = 0; int result = 0; @@ -718,6 +730,7 @@ int waitForFPGAtoTouchFlash(char *mess) { } LOG(logDEBUG1, ("gpi07 (CD)returned %d\n", result)); } - LOG(logINFO, ("\tFPGA has picked up the program from flash. gpio7 (CD) is High\n")); + LOG(logINFO, + ("\tFPGA has picked up the program from flash. gpio7 (CD) is High\n")); return OK; } diff --git a/slsDetectorServers/slsDetectorServer/src/programViaNios.c b/slsDetectorServers/slsDetectorServer/src/programViaNios.c index fef00ace5..ea4eadf26 100644 --- a/slsDetectorServers/slsDetectorServer/src/programViaNios.c +++ b/slsDetectorServers/slsDetectorServer/src/programViaNios.c @@ -7,8 +7,8 @@ #include "slsDetectorServer_defs.h" #include -#include // usleep #include +#include // usleep /* global variables */ @@ -151,8 +151,7 @@ int openFileForFlash(char *mess, FILE **flashfd) { // check if its a normal file or special file struct stat buf; if (stat(flashDriveName, &buf) == -1) { - sprintf(mess, - "Could not %s. Unable to find the flash drive %s\n", + sprintf(mess, "Could not %s. Unable to find the flash drive %s\n", messageType, flashDriveName); LOG(logERROR, (mess)); return FAIL; diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index a49388f12..ae93ba936 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -1292,7 +1292,7 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) { // ignore counter enable to force vth dac values setDAC(serverDacIndex, val, mV, 0); #else - setDAC(serverDacIndex, val, mV); + setDAC(serverDacIndex, val, mV); #endif retval = getDAC(serverDacIndex, mV); } @@ -1573,7 +1573,7 @@ int get_module(int file_des) { #if !defined(MYTHEN3D) && !defined(EIGERD) functionNotImplemented(); -#else +#else // allocate to receive module structure // allocate dacs @@ -1605,7 +1605,8 @@ int get_module(int file_des) { // ensure nchan is not 0, else trimbits not copied if (module.nchan == 0) { - strcpy(mess, "Could not get module as the number of channels to copy is 0\n"); + strcpy(mess, "Could not get module as the number of channels to " + "copy is 0\n"); LOG(logERROR, (mess)); return FAIL; } @@ -1625,7 +1626,6 @@ int get_module(int file_des) { return ret; } - int set_module(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); @@ -1881,55 +1881,57 @@ int acquire(int blocking, int file_des) { #ifdef EIGERD // check for hardware mac and hardware ip if (udpDetails[0].srcmac != getDetectorMAC()) { - ret = FAIL; - uint64_t sourcemac = getDetectorMAC(); - char src_mac[MAC_ADDRESS_SIZE]; - getMacAddressinString(src_mac, MAC_ADDRESS_SIZE, sourcemac); - sprintf(mess, + ret = FAIL; + uint64_t sourcemac = getDetectorMAC(); + char src_mac[MAC_ADDRESS_SIZE]; + getMacAddressinString(src_mac, MAC_ADDRESS_SIZE, sourcemac); + sprintf( + mess, "Invalid udp source mac address for this detector. Must be " "same as hardware detector mac address %s\n", src_mac); - LOG(logERROR, (mess)); - } else if (!enableTenGigabitEthernet(GET_FLAG) && - (udpDetails[0].srcip != getDetectorIP())) { - ret = FAIL; - uint32_t sourceip = getDetectorIP(); - char src_ip[INET_ADDRSTRLEN]; - getIpAddressinString(src_ip, sourceip); - sprintf( - mess, - "Invalid udp source ip address for this detector. Must be same " - "as hardware detector ip address %s in 1G readout mode \n", - src_ip); - LOG(logERROR, (mess)); - } else -#endif - if (configured == FAIL) { - ret = FAIL; - strcpy(mess, "Could not start acquisition because "); - strcat(mess, configureMessage); - LOG(logERROR, (mess)); - } else if (sharedMemory_getScanStatus() == RUNNING) { - ret = FAIL; - strcpy(mess, "Could not start acquisition because a scan is " - "already running!\n"); - LOG(logERROR, (mess)); - } else { - memset(scanErrMessage, 0, MAX_STR_LENGTH); - sharedMemory_setScanStop(0); - sharedMemory_setScanStatus(IDLE); // if it was error - if (pthread_create(&pthread_tid, NULL, &start_state_machine, - &blocking)) { + LOG(logERROR, (mess)); + } else if (!enableTenGigabitEthernet(GET_FLAG) && + (udpDetails[0].srcip != getDetectorIP())) { ret = FAIL; - strcpy(mess, "Could not start acquisition thread!\n"); + uint32_t sourceip = getDetectorIP(); + char src_ip[INET_ADDRSTRLEN]; + getIpAddressinString(src_ip, sourceip); + sprintf( + mess, + "Invalid udp source ip address for this detector. Must be " + "same " + "as hardware detector ip address %s in 1G readout mode \n", + src_ip); + LOG(logERROR, (mess)); + } else +#endif + if (configured == FAIL) { + ret = FAIL; + strcpy(mess, "Could not start acquisition because "); + strcat(mess, configureMessage); + LOG(logERROR, (mess)); + } else if (sharedMemory_getScanStatus() == RUNNING) { + ret = FAIL; + strcpy(mess, "Could not start acquisition because a scan is " + "already running!\n"); LOG(logERROR, (mess)); } else { - // only does not wait for non blocking and scan - if (blocking || !scan) { - pthread_join(pthread_tid, NULL); + memset(scanErrMessage, 0, MAX_STR_LENGTH); + sharedMemory_setScanStop(0); + sharedMemory_setScanStatus(IDLE); // if it was error + if (pthread_create(&pthread_tid, NULL, &start_state_machine, + &blocking)) { + ret = FAIL; + strcpy(mess, "Could not start acquisition thread!\n"); + LOG(logERROR, (mess)); + } else { + // only does not wait for non blocking and scan + if (blocking || !scan) { + pthread_join(pthread_tid, NULL); + } } } - } } return Server_SendResult(file_des, INT32, NULL, 0); } @@ -2118,7 +2120,8 @@ int set_num_frames(int file_des) { arg > MAX_FRAMES_IN_BURST_MODE) { ret = FAIL; sprintf(mess, - "Could not set number of frames %lld. Must be less than equal to %d in " + "Could not set number of frames %lld. Must be less " + "than equal to %d in " "burst mode.\n", (long long unsigned int)arg, MAX_FRAMES_IN_BURST_MODE); LOG(logERROR, (mess)); @@ -9260,11 +9263,12 @@ int clear_all_udp_dst(int file_des) { #endif { numUdpDestinations = numdest; - LOG(logINFOBLUE, ("Number of UDP Destinations: %d\n", - numUdpDestinations)); + LOG(logINFOBLUE, + ("Number of UDP Destinations: %d\n", numUdpDestinations)); ret = configureMAC(); if (ret == FAIL) { - strcpy(mess, "Could not clear all destinations in the fpga.\n"); + strcpy(mess, + "Could not clear all destinations in the fpga.\n"); LOG(logERROR, (mess)); } } @@ -9968,21 +9972,22 @@ int set_interpolation(int file_des) { if (Server_VerifyLock() == OK) { if (getPumpProbe() && arg) { ret = FAIL; - sprintf(mess, "Could not set interpolation. Disable pump probe mode first.\n"); + sprintf(mess, "Could not set interpolation. Disable pump probe " + "mode first.\n"); LOG(logERROR, (mess)); - } else { + } else { ret = setInterpolation(arg); if (ret == FAIL) { if (arg) sprintf(mess, "Could not set interpolation or enable all " - "counters for it.\n"); + "counters for it.\n"); else sprintf(mess, "Could not set interpolation\n"); LOG(logERROR, (mess)); } else { int retval = getInterpolation(); validate(&ret, mess, (int)arg, (int)retval, "set interpolation", - DEC); + DEC); LOG(logDEBUG1, ("interpolation retval: %u\n", retval)); } } @@ -10024,16 +10029,18 @@ int set_pump_probe(int file_des) { if (Server_VerifyLock() == OK) { if (getInterpolation() && arg) { ret = FAIL; - sprintf(mess, "Could not set pump probe mode. Disable interpolation mode first.\n"); + sprintf(mess, "Could not set pump probe mode. Disable " + "interpolation mode first.\n"); LOG(logERROR, (mess)); - } else { + } else { ret = setPumpProbe(arg); if (ret == FAIL) { sprintf(mess, "Could not set pump probe\n"); LOG(logERROR, (mess)); } else { int retval = getPumpProbe(); - validate(&ret, mess, (int)arg, (int)retval, "set pump probe", DEC); + validate(&ret, mess, (int)arg, (int)retval, "set pump probe", + DEC); LOG(logDEBUG1, ("pump probe retval: %u\n", retval)); } } diff --git a/slsDetectorSoftware/include/sls/Detector.h b/slsDetectorSoftware/include/sls/Detector.h index 9afe3ec4a..cc566adb4 100644 --- a/slsDetectorSoftware/include/sls/Detector.h +++ b/slsDetectorSoftware/include/sls/Detector.h @@ -10,7 +10,6 @@ #include #include - namespace sls { using ns = std::chrono::nanoseconds; class detectorData; @@ -144,7 +143,8 @@ class Detector { defs::detectorSettings settings = defs::STANDARD, bool trimbits = true, Positions pos = {}); - /** [Mythen3] It loads trim files from settingspath. An energy of -1 will pick up values from detector */ + /** [Mythen3] It loads trim files from settingspath. An energy of -1 will + * pick up values from detector */ void setThresholdEnergy(std::array threshold_ev, defs::detectorSettings settings = defs::STANDARD, bool trimbits = true, Positions pos = {}); @@ -907,7 +907,7 @@ class Detector { Result getIndividualRxROIs(Positions pos) const; defs::ROI getRxROI() const; - + /** only at multi module level without gap pixels */ void setRxROI(const defs::ROI value); @@ -1495,13 +1495,15 @@ class Detector { /** [Mythen3] */ Result getInterpolation(Positions pos = {}) const; - /** [Mythen3] interpolation mode enables all counters and disables vth3. Disabling sets back counter mask and vth3. */ + /** [Mythen3] interpolation mode enables all counters and disables vth3. + * Disabling sets back counter mask and vth3. */ void setInterpolation(bool value, Positions pos = {}); /** [Mythen3] */ Result getPumpProbe(Positions pos = {}) const; - /** [Mythen3] pump probe mode only enables vth2. Disabling sets back to previous value */ + /** [Mythen3] pump probe mode only enables vth2. Disabling sets back to + * previous value */ void setPumpProbe(bool value, Positions pos = {}); /** [Mythen3] */ diff --git a/slsDetectorSoftware/include/sls/detectorData.h b/slsDetectorSoftware/include/sls/detectorData.h index 9cd2fcbe8..33f983a66 100644 --- a/slsDetectorSoftware/include/sls/detectorData.h +++ b/slsDetectorSoftware/include/sls/detectorData.h @@ -11,11 +11,22 @@ namespace sls { */ class detectorData { public: - detectorData(double progressIndex, std::string fileName, int nx, int ny, char *data, int databytes, int dynamicRange, uint64_t fileIndex, bool completeImage) - : progressIndex(progressIndex), fileName(fileName), fileIndex(fileIndex), nx(nx), ny(ny), data(data), databytes(databytes), dynamicRange(dynamicRange), completeImage(completeImage){}; + detectorData(double progressIndex, std::string fileName, int nx, int ny, + char *data, int databytes, int dynamicRange, + uint64_t fileIndex, bool completeImage) + : progressIndex(progressIndex), fileName(fileName), + fileIndex(fileIndex), nx(nx), ny(ny), data(data), + databytes(databytes), dynamicRange(dynamicRange), + completeImage(completeImage){}; - detectorData(double progressIndex, std::string fileName, int nx, int ny, char *data, int databytes, int dynamicRange, uint64_t fileIndex, bool completeImage, std::array rxRoi) - : progressIndex(progressIndex), fileName(fileName), fileIndex(fileIndex), nx(nx), ny(ny), data(data), databytes(databytes), dynamicRange(dynamicRange), completeImage(completeImage), rxRoi(rxRoi) {}; + detectorData(double progressIndex, std::string fileName, int nx, int ny, + char *data, int databytes, int dynamicRange, + uint64_t fileIndex, bool completeImage, + std::array rxRoi) + : progressIndex(progressIndex), fileName(fileName), + fileIndex(fileIndex), nx(nx), ny(ny), data(data), + databytes(databytes), dynamicRange(dynamicRange), + completeImage(completeImage), rxRoi(rxRoi){}; /** * data has to be deleted by caller */ @@ -51,7 +62,7 @@ class detectorData { int databytes; int dynamicRange; bool completeImage; - std::array rxRoi{{-1, -1, -1, -1}}; + std::array rxRoi{{-1, -1, -1, -1}}; }; } // namespace sls diff --git a/slsDetectorSoftware/src/CmdLineApp.cpp b/slsDetectorSoftware/src/CmdLineApp.cpp index 9d1e63b99..186c29c9b 100644 --- a/slsDetectorSoftware/src/CmdLineApp.cpp +++ b/slsDetectorSoftware/src/CmdLineApp.cpp @@ -53,26 +53,31 @@ int main(int argc, char *argv[]) { if (parser.isHelp()) action = slsDetectorDefs::HELP_ACTION; + else { - // Free shared memory should work also without a detector - // if we have an option for verify in the detector constructor - // we could avoid this but clutter the code - if (parser.command() == "free" && action != slsDetectorDefs::HELP_ACTION) { - if (parser.detector_id() != -1) - std::cout << "Cannot free shared memory of sub-detector\n"; - else - sls::freeSharedMemory(parser.multi_id()); - return 0; + // Free shared memory should work also without a detector + // if we have an option for verify in the detector constructor + // we could avoid this but clutter the code + if (parser.command() == "free") { + if (parser.detector_id() != -1) + std::cout << "Cannot free shared memory of sub-detector\n"; + else + sls::freeSharedMemory(parser.multi_id()); + return 0; + } } // prevent mem size check if (parser.command() == "config" && action == slsDetectorDefs::PUT_ACTION) { sls::freeSharedMemory(parser.multi_id()); - } + } try { - sls::Detector det(parser.multi_id()); - sls::CmdProxy proxy(&det); + std::unique_ptr det{nullptr}; + if (action != slsDetectorDefs::HELP_ACTION) { + det = sls::make_unique(parser.multi_id()); + } + sls::CmdProxy proxy(det.get()); proxy.Call(parser.command(), parser.arguments(), parser.detector_id(), action, std::cout, parser.receiver_id()); } catch (const sls::RuntimeError &e) { diff --git a/slsDetectorSoftware/src/CmdProxy.cpp b/slsDetectorSoftware/src/CmdProxy.cpp index 6f6a4d094..d852b8f3e 100644 --- a/slsDetectorSoftware/src/CmdProxy.cpp +++ b/slsDetectorSoftware/src/CmdProxy.cpp @@ -48,8 +48,8 @@ void CmdProxy::Call(const std::string &command, if (it != functions.end()) { os << ((*this).*(it->second))(action); } else { - throw RuntimeError( - cmd + " Unknown command, use list to list all commands"); + throw RuntimeError(cmd + + " Unknown command, use list to list all commands"); } } @@ -219,12 +219,10 @@ std::string CmdProxy::Acquire(int action) { << '\n'; } else { if (det->empty()) { - throw RuntimeError( - "This shared memory has no detectors added."); + throw RuntimeError("This shared memory has no detectors added."); } if (det_id >= 0) { - throw RuntimeError( - "Individual detectors not allowed for readout."); + throw RuntimeError("Individual detectors not allowed for readout."); } det->acquire(); @@ -456,27 +454,29 @@ std::string CmdProxy::Trimbits(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[fname]\n\t[Eiger][Mythen3] Put will load the trimbit file to detector. If no extension specified, serial number of each module is attached. Get will save the trimbits from the detector to file with serial number added to file name." + os << "[fname]\n\t[Eiger][Mythen3] Put will load the trimbit file to " + "detector. If no extension specified, serial number of each " + "module is attached. Get will save the trimbits from the " + "detector to file with serial number added to file name." << '\n'; } else if (action == defs::GET_ACTION) { if (args.size() != 1) { WrongNumberOfParameters(1); } det->saveTrimbits(args[0], std::vector{det_id}); - os << args << '\n'; + os << args << '\n'; } else if (action == defs::PUT_ACTION) { if (args.size() != 1) { WrongNumberOfParameters(1); } det->loadTrimbits(args[0], std::vector{det_id}); - os << args << '\n'; + os << args << '\n'; } else { throw RuntimeError("Unknown action"); } return os.str(); } - std::string CmdProxy::TrimEnergies(int action) { std::ostringstream os; os << cmd << ' '; @@ -553,8 +553,7 @@ std::string CmdProxy::Exptime(int action) { } else if (cmd == "exptime3") { gateIndex = 2; } else { - throw RuntimeError( - "Unknown command, use list to list all commands"); + throw RuntimeError("Unknown command, use list to list all commands"); } std::ostringstream os; @@ -699,8 +698,7 @@ std::string CmdProxy::Adcphase(int action) { auto det_type = det->getDetectorType().squash(defs::GENERIC); if (det_type == defs::EIGER || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { - throw RuntimeError( - "adcphase not implemented for this detector"); + throw RuntimeError("adcphase not implemented for this detector"); } if (action == defs::GET_ACTION) { Result t; @@ -710,8 +708,7 @@ std::string CmdProxy::Adcphase(int action) { } else if (args.size() == 1) { if (args[0] != "deg") { throw RuntimeError("Unknown adcphase argument " + - args[0] + - ". Did you mean deg? "); + args[0] + ". Did you mean deg? "); } t = det->getADCPhaseInDegrees(std::vector{det_id}); os << OutString(t) << " deg\n"; @@ -726,7 +723,7 @@ std::string CmdProxy::Adcphase(int action) { } else if (args.size() == 2) { if (args[1] != "deg") { throw RuntimeError("Unknown adcphase 2nd argument " + - args[1] + ". Did you mean deg?"); + args[1] + ". Did you mean deg?"); } det->setADCPhaseInDegrees(StringTo(args[0]), std::vector{det_id}); @@ -754,8 +751,7 @@ std::string CmdProxy::Dbitphase(int action) { auto det_type = det->getDetectorType().squash(defs::GENERIC); if (det_type == defs::EIGER || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { - throw RuntimeError( - "dbitphase not implemented for this detector"); + throw RuntimeError("dbitphase not implemented for this detector"); } if (action == defs::GET_ACTION) { Result t; @@ -764,8 +760,8 @@ std::string CmdProxy::Dbitphase(int action) { os << OutString(t) << '\n'; } else if (args.size() == 1) { if (args[0] != "deg") { - throw RuntimeError("Unknown dbitphase argument " + - args[0] + ". Did you mean deg? "); + throw RuntimeError("Unknown dbitphase argument " + args[0] + + ". Did you mean deg? "); } t = det->getDBITPhaseInDegrees(std::vector{det_id}); os << OutString(t) << " deg\n"; @@ -780,7 +776,7 @@ std::string CmdProxy::Dbitphase(int action) { } else if (args.size() == 2) { if (args[1] != "deg") { throw RuntimeError("Unknown dbitphase 2nd argument " + - args[1] + ". Did you mean deg? "); + args[1] + ". Did you mean deg? "); } det->setDBITPhaseInDegrees(StringTo(args[0]), std::vector{det_id}); @@ -805,8 +801,7 @@ std::string CmdProxy::ClockFrequency(int action) { } else { defs::detectorType type = det->getDetectorType().squash(defs::GENERIC); if (type != defs::GOTTHARD2 && type != defs::MYTHEN3) { - throw RuntimeError( - "clkfreq not implemented for this detector."); + throw RuntimeError("clkfreq not implemented for this detector."); } if (action == defs::GET_ACTION) { if (args.size() != 1) { @@ -836,8 +831,7 @@ std::string CmdProxy::ClockPhase(int action) { } else { defs::detectorType type = det->getDetectorType().squash(defs::GENERIC); if (type != defs::GOTTHARD2 && type != defs::MYTHEN3) { - throw RuntimeError( - "clkphase not implemented for this detector."); + throw RuntimeError("clkphase not implemented for this detector."); } if (action == defs::GET_ACTION) { if (args.size() == 1) { @@ -847,7 +841,7 @@ std::string CmdProxy::ClockPhase(int action) { } else if (args.size() == 2) { if (args[1] != "deg") { throw RuntimeError("Cannot scan argument" + args[1] + - ". Did you mean deg?"); + ". Did you mean deg?"); } auto t = det->getClockPhaseinDegrees(StringTo(args[0]), {det_id}); @@ -864,7 +858,7 @@ std::string CmdProxy::ClockPhase(int action) { } else if (args.size() == 3) { if (args[2] != "deg") { throw RuntimeError("Cannot scan argument" + args[2] + - ". Did you mean deg?"); + ". Did you mean deg?"); } det->setClockPhaseinDegrees(StringTo(args[0]), StringTo(args[1]), @@ -919,8 +913,7 @@ std::string CmdProxy::ClockDivider(int action) { } else { defs::detectorType type = det->getDetectorType().squash(defs::GENERIC); if (type != defs::GOTTHARD2 && type != defs::MYTHEN3) { - throw RuntimeError( - "clkdiv not implemented for this detector."); + throw RuntimeError("clkdiv not implemented for this detector."); } if (action == defs::GET_ACTION) { if (args.size() != 1) { @@ -1010,7 +1003,7 @@ std::string CmdProxy::CurrentSource(int action) { fix = false; } else { throw RuntimeError("Invalid argument: " + args[1] + - ". Did you mean fix or nofix?"); + ". Did you mean fix or nofix?"); } if (args.size() == 3) { det->setCurrentSource(defs::currentSrcParameters( @@ -1023,7 +1016,7 @@ std::string CmdProxy::CurrentSource(int action) { normalCurrent = false; } else { throw RuntimeError("Invalid argument: " + args[3] + - ". Did you mean normal or low?"); + ". Did you mean normal or low?"); } det->setCurrentSource(defs::currentSrcParameters( fix, StringTo(args[2]), normalCurrent)); @@ -1119,7 +1112,7 @@ std::string CmdProxy::Dac(int action) { if (args.size() == 2) { if ((args[1] != "mv") && (args[1] != "mV")) { throw RuntimeError("Unknown argument " + args[1] + - ". Did you mean mV?"); + ". Did you mean mV?"); } mV = true; } else if (args.size() > 2) { @@ -1140,7 +1133,7 @@ std::string CmdProxy::Dac(int action) { if (args.size() == 3) { if ((args[2] != "mv") && (args[2] != "mV")) { throw RuntimeError("Unknown argument " + args[2] + - ". Did you mean mV?"); + ". Did you mean mV?"); } mV = true; } else if (args.size() > 3 || args.size() < 2) { @@ -1174,11 +1167,10 @@ std::string CmdProxy::DacList(const int action) { } else if (action == slsDetectorDefs::PUT_ACTION) { if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { throw RuntimeError("This detector already has fixed dac " - "names. Cannot change them."); + "names. Cannot change them."); } if (det_id != -1) { - throw RuntimeError( - "Cannot configure dacnames at module level"); + throw RuntimeError("Cannot configure dacnames at module level"); } if (args.size() != 18) { WrongNumberOfParameters(18); @@ -1203,7 +1195,7 @@ std::string CmdProxy::DacValues(int action) { if (args.size() == 1) { if ((args[0] != "mv") && (args[0] != "mV")) { throw RuntimeError("Unknown argument " + args[0] + - ". Did you mean mV?"); + ". Did you mean mV?"); } mv = true; } else if (args.size() > 1) { @@ -1248,7 +1240,7 @@ std::string CmdProxy::ResetDacs(int action) { if (args.size() == 1) { if (args[0] != "hard") { throw RuntimeError("Unknown argument " + args[0] + - ". Did you mean hard?"); + ". Did you mean hard?"); } hardReset = true; } else if (args.size() > 1) { @@ -1514,8 +1506,8 @@ std::string CmdProxy::UDPDestinationList(int action) { } if (rx_id < 0 || rx_id >= MAX_UDP_DESTINATION) { throw RuntimeError(std::string("Invalid receiver index ") + - std::to_string(rx_id) + - std::string(" to set round robin entry.")); + std::to_string(rx_id) + + std::string(" to set round robin entry.")); } auto t = det->getDestinationUDPList(rx_id, std::vector{det_id}); os << OutString(t) << '\n'; @@ -1543,7 +1535,11 @@ std::string CmdProxy::UDPSourceIP(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[x.x.x.x] or auto\n\tIp address of the detector (source) udp interface. Must be same subnet as destination udp ip.\n\t[Eiger] Set only for 10G. For 1G, detector will replace with its own DHCP IP address. If 'auto' used, then ip is set to ip of rx_hostname." + os << "[x.x.x.x] or auto\n\tIp address of the detector (source) udp " + "interface. Must be same subnet as destination udp " + "ip.\n\t[Eiger] Set only for 10G. For 1G, detector will replace " + "with its own DHCP IP address. If 'auto' used, then ip is set to " + "ip of rx_hostname." << '\n'; } else if (action == defs::GET_ACTION) { auto t = det->getSourceUDPIP(std::vector{det_id}); @@ -1565,7 +1561,7 @@ std::string CmdProxy::UDPSourceIP(int action) { } det->setSourceUDPIP(val, std::vector{det_id}); os << val << '\n'; - + } else { throw RuntimeError("Unknown action"); } @@ -1576,7 +1572,11 @@ std::string CmdProxy::UDPSourceIP2(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[x.x.x.x] or auto\n\t[Jungfrau][Gotthard2] Ip address of the detector (source) udp interface 2. Must be same subnet as destination udp ip2.\n\t [Jungfrau] top half or inner interface\n\t [Gotthard2] veto debugging. If 'auto' used, then ip is set to ip of rx_hostname." + os << "[x.x.x.x] or auto\n\t[Jungfrau][Gotthard2] Ip address of the " + "detector (source) udp interface 2. Must be same subnet as " + "destination udp ip2.\n\t [Jungfrau] top half or inner " + "interface\n\t [Gotthard2] veto debugging. If 'auto' used, then " + "ip is set to ip of rx_hostname." << '\n'; } else if (action == defs::GET_ACTION) { auto t = det->getSourceUDPIP2(std::vector{det_id}); @@ -1591,14 +1591,14 @@ std::string CmdProxy::UDPSourceIP2(int action) { IpAddr val; if (args[0] == "auto") { val = getIpFromAuto(); - LOG(logINFO) << "Setting udp_srcip2 of detector " << det_id << " to " - << val; + LOG(logINFO) << "Setting udp_srcip2 of detector " << det_id + << " to " << val; } else { val = IpAddr(args[0]); } det->setSourceUDPIP2(val, std::vector{det_id}); os << val << '\n'; - + } else { throw RuntimeError("Unknown action"); } @@ -1744,7 +1744,8 @@ std::string CmdProxy::Rx_ROI(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { os << "[xmin] [xmax] [ymin] [ymax]\n\tRegion of interest in " - "receiver.\n\tOnly allowed at multi module level and without gap pixels." + "receiver.\n\tOnly allowed at multi module level and without gap " + "pixels." << '\n'; } else if (action == defs::GET_ACTION) { if (!args.empty()) { @@ -2009,7 +2010,7 @@ std::string CmdProxy::TemperatureEvent(int action) { } if (StringTo(args[0]) != 0) { throw RuntimeError("Unknown argument for temp event. Did you " - "mean 0 to reset event?"); + "mean 0 to reset event?"); } det->resetTemperatureEvent(std::vector{det_id}); os << "cleared" << '\n'; @@ -2144,8 +2145,7 @@ std::string CmdProxy::VetoFile(int action) { "file should have 128 rows of gain index and 12 bit value in dec" << '\n'; } else if (action == defs::GET_ACTION) { - throw RuntimeError( - "cannot get vetofile. Did you mean vetophoton?"); + throw RuntimeError("cannot get vetofile. Did you mean vetophoton?"); } else if (action == defs::PUT_ACTION) { if (args.size() != 2) { WrongNumberOfParameters(2); @@ -2266,8 +2266,7 @@ std::string CmdProxy::VetoAlgorithm(int action) { defs::streamingInterface interface = StringTo(args[0]); if (interface == defs::streamingInterface::NONE) { - throw RuntimeError( - "Must specify an interface to set algorithm"); + throw RuntimeError("Must specify an interface to set algorithm"); } auto t = det->getVetoAlgorithm(interface, std::vector{det_id}); os << OutString(t) << ' ' << ToString(interface) << '\n'; @@ -2279,8 +2278,7 @@ std::string CmdProxy::VetoAlgorithm(int action) { defs::streamingInterface interface = StringTo(args[1]); if (interface == defs::streamingInterface::NONE) { - throw RuntimeError( - "Must specify an interface to set algorithm"); + throw RuntimeError("Must specify an interface to set algorithm"); } det->setVetoAlgorithm(alg, interface, std::vector{det_id}); os << ToString(alg) << ' ' << ToString(interface) << '\n'; @@ -2368,7 +2366,9 @@ std::string CmdProxy::Counters(int action) { if (args.empty()) { WrongNumberOfParameters(1); } - if (std::any_of(args.cbegin(), args.cend(), [](std::string s){ return (StringTo(s) < 0 || StringTo(s) > 2); })) { + if (std::any_of(args.cbegin(), args.cend(), [](std::string s) { + return (StringTo(s) < 0 || StringTo(s) > 2); + })) { throw RuntimeError("Invalid counter indices list. Example: 0 1 2"); } // convert vector to counter enable mask @@ -2402,8 +2402,7 @@ std::string CmdProxy::GateDelay(int action) { } else if (cmd == "gatedelay3") { gateIndex = 2; } else { - throw RuntimeError( - "Unknown command, use list to list all commands"); + throw RuntimeError("Unknown command, use list to list all commands"); } std::ostringstream os; @@ -2705,30 +2704,35 @@ std::string CmdProxy::PatternWord(int action) { return os.str(); } -void CmdProxy::GetLevelAndUpdateArgIndex(int action, std::string levelSeparatedCommand, int& level, int& iArg, size_t nGetArgs, size_t nPutArgs) { +void CmdProxy::GetLevelAndUpdateArgIndex(int action, + std::string levelSeparatedCommand, + int &level, int &iArg, size_t nGetArgs, + size_t nPutArgs) { if (cmd == levelSeparatedCommand) { ++nGetArgs; ++nPutArgs; } else { - LOG(logWARNING) << "This command is deprecated and will be removed. Please migrate to " << levelSeparatedCommand; + LOG(logWARNING) << "This command is deprecated and will be removed. " + "Please migrate to " + << levelSeparatedCommand; } if (action == defs::GET_ACTION && args.size() != nGetArgs) { WrongNumberOfParameters(nGetArgs); } else if (action == defs::PUT_ACTION && args.size() != nPutArgs) { WrongNumberOfParameters(nPutArgs); - } + } if (cmd == levelSeparatedCommand) { - level = StringTo(args[iArg++]); + level = StringTo(args[iArg++]); } else { level = cmd[cmd.find_first_of("012")] - '0'; } } std::string CmdProxy::PatternLoopAddresses(int action) { - if (cmd != "patlimits" && cmd != "patloop0" && cmd != "patloop1" && cmd != "patloop2" && cmd != "patloop") { - throw RuntimeError( - "Unknown command, use list to list all commands"); - } + if (cmd != "patlimits" && cmd != "patloop0" && cmd != "patloop1" && + cmd != "patloop2" && cmd != "patloop") { + throw RuntimeError("Unknown command, use list to list all commands"); + } std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { @@ -2737,17 +2741,17 @@ std::string CmdProxy::PatternLoopAddresses(int action) { "of complete pattern." << '\n'; } else if (cmd == "patloop") { - os << "[0-6] [start addr] [stop addr] \n\t[Ctb][Moench][Mythen3] Limits of the loop level provided." - << "\n\t[Mythen3] Level options: 0-3 only." - << '\n'; + os << "[0-6] [start addr] [stop addr] \n\t[Ctb][Moench][Mythen3] " + "Limits of the loop level provided." + << "\n\t[Mythen3] Level options: 0-3 only." << '\n'; } else { - os << "Depreciated command. Use patloop." - << '\n'; - } + os << "Depreciated command. Use patloop." << '\n'; + } } else { int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 2; if (cmd != "patlimits") { - GetLevelAndUpdateArgIndex(action, "patloop", level, iArg, nGetArgs, nPutArgs); + GetLevelAndUpdateArgIndex(action, "patloop", level, iArg, nGetArgs, + nPutArgs); } if (action == defs::GET_ACTION) { auto t = @@ -2755,11 +2759,11 @@ std::string CmdProxy::PatternLoopAddresses(int action) { os << OutStringHex(t, 4) << '\n'; } else if (action == defs::PUT_ACTION) { int start = StringTo(args[iArg++]); - int stop = StringTo(args[iArg++]); + int stop = StringTo(args[iArg++]); det->setPatternLoopAddresses(level, start, stop, - std::vector{det_id}); + std::vector{det_id}); os << '[' << ToStringHex(start, 4) << ", " << ToStringHex(stop, 4) - << "]\n"; + << "]\n"; } else { throw RuntimeError("Unknown action"); } @@ -2768,25 +2772,25 @@ std::string CmdProxy::PatternLoopAddresses(int action) { } std::string CmdProxy::PatternLoopCycles(int action) { - if (cmd != "patnloop0" && cmd != "patnloop1" && cmd != "patnloop2" && cmd != "patnloop") { - throw RuntimeError( - "Unknown command, use list to list all commands"); - } + if (cmd != "patnloop0" && cmd != "patnloop1" && cmd != "patnloop2" && + cmd != "patnloop") { + throw RuntimeError("Unknown command, use list to list all commands"); + } std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { if (cmd == "patnloop") { - os << "[0-6] [n_cycles] \n\t[Ctb][Moench][Mythen3] Number of cycles of " + os << "[0-6] [n_cycles] \n\t[Ctb][Moench][Mythen3] Number of " + "cycles of " "the loop level provided." - << "\n\t[Mythen3] Level options: 0-3 only." - << '\n'; + << "\n\t[Mythen3] Level options: 0-3 only." << '\n'; } else { - os << "Depreciated command. Use patnloop." - << '\n'; - } + os << "Depreciated command. Use patnloop." << '\n'; + } } else { int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; - GetLevelAndUpdateArgIndex(action, "patnloop", level, iArg, nGetArgs, nPutArgs); + GetLevelAndUpdateArgIndex(action, "patnloop", level, iArg, nGetArgs, + nPutArgs); if (action == defs::GET_ACTION) { auto t = det->getPatternLoopCycles(level, std::vector{det_id}); os << OutString(t) << '\n'; @@ -2802,23 +2806,25 @@ std::string CmdProxy::PatternLoopCycles(int action) { } std::string CmdProxy::PatternWaitAddress(int action) { - if (cmd != "patwait0" && cmd != "patwait1" && cmd != "patwait2" && cmd != "patwait") { - throw RuntimeError( - "Unknown command, use list to list all commands"); - } + if (cmd != "patwait0" && cmd != "patwait1" && cmd != "patwait2" && + cmd != "patwait") { + throw RuntimeError("Unknown command, use list to list all commands"); + } std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { if (cmd == "patwait") { - os << "[0-6] [addr] \n\t[Ctb][Moench][Mythen3] Wait address for loop level provided." - << "\n\t[Mythen3] Level options: 0-3 only."; + os << "[0-6] [addr] \n\t[Ctb][Moench][Mythen3] Wait address for " + "loop level provided." + << "\n\t[Mythen3] Level options: 0-3 only."; } else { os << "Depreciated command. Use patwait."; } os << '\n'; } else { int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; - GetLevelAndUpdateArgIndex(action, "patwait", level, iArg, nGetArgs, nPutArgs); + GetLevelAndUpdateArgIndex(action, "patwait", level, iArg, nGetArgs, + nPutArgs); if (action == defs::GET_ACTION) { auto t = det->getPatternWaitAddr(level, std::vector{det_id}); os << OutStringHex(t, 4) << '\n'; @@ -2834,9 +2840,9 @@ std::string CmdProxy::PatternWaitAddress(int action) { } std::string CmdProxy::PatternWaitTime(int action) { - if (cmd != "patwaittime0" && cmd != "patwaittime1" && cmd != "patwaittime2" && cmd != "patwaittime") { - throw RuntimeError( - "Unknown command, use list to list all commands"); + if (cmd != "patwaittime0" && cmd != "patwaittime1" && + cmd != "patwaittime2" && cmd != "patwaittime") { + throw RuntimeError("Unknown command, use list to list all commands"); } std::ostringstream os; os << cmd << ' '; @@ -2844,15 +2850,14 @@ std::string CmdProxy::PatternWaitTime(int action) { if (cmd == "patwaittime") { os << "[0-6] [n_clk] \n\t[Ctb][Moench][Mythen3] Wait time in clock " "cycles for the loop provided." - << "\n\t[Mythen3] Level options: 0-3 only." - << '\n'; + << "\n\t[Mythen3] Level options: 0-3 only." << '\n'; } else { - os << "Depreciated command. Use patwaittime." - << '\n'; - } + os << "Depreciated command. Use patwaittime." << '\n'; + } } else { int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; - GetLevelAndUpdateArgIndex(action, "patwaittime", level, iArg, nGetArgs, nPutArgs); + GetLevelAndUpdateArgIndex(action, "patwaittime", level, iArg, nGetArgs, + nPutArgs); if (action == defs::GET_ACTION) { auto t = det->getPatternWaitTime(level, std::vector{det_id}); os << OutString(t) << '\n'; @@ -2965,9 +2970,8 @@ std::string CmdProxy::ProgramFpga(int action) { bool forceDeteleNormalFile = false; if (args.size() == 2) { if (args[1] != "--force-delete-normal-file") { - throw RuntimeError( - "Could not scan second argument. Did you " - "mean --force-delete-normal-file?"); + throw RuntimeError("Could not scan second argument. Did you " + "mean --force-delete-normal-file?"); } forceDeteleNormalFile = true; } else if (args.size() != 1) { diff --git a/slsDetectorSoftware/src/CmdProxy.h b/slsDetectorSoftware/src/CmdProxy.h index dcfa3d4b5..f1476db99 100644 --- a/slsDetectorSoftware/src/CmdProxy.h +++ b/slsDetectorSoftware/src/CmdProxy.h @@ -12,7 +12,7 @@ #include namespace sls { - + /** Macro to make an integer command. * CMDNAME name of the function that does the command * GETFCN Detector function to get @@ -55,7 +55,7 @@ namespace sls { os << args[0] << '\n'; \ } \ } else { \ - throw RuntimeError("Unknown action"); \ + throw RuntimeError("Unknown action"); \ } \ return os.str(); \ } @@ -77,9 +77,9 @@ namespace sls { WrongNumberOfParameters(1); \ } \ } else if (action == slsDetectorDefs::PUT_ACTION) { \ - throw RuntimeError("cannot put"); \ + throw RuntimeError("cannot put"); \ } else { \ - throw RuntimeError("Unknown action"); \ + throw RuntimeError("Unknown action"); \ } \ return os.str(); \ } @@ -104,7 +104,7 @@ namespace sls { det->SETFCN(args[0], std::vector{det_id}); \ os << args.front() << '\n'; \ } else { \ - throw RuntimeError("Unknown action"); \ + throw RuntimeError("Unknown action"); \ } \ return os.str(); \ } @@ -130,7 +130,7 @@ namespace sls { det->SETFCN(val, std::vector{det_id}); \ os << ToStringHex(val, 16) << '\n'; \ } else { \ - throw RuntimeError("Unknown action"); \ + throw RuntimeError("Unknown action"); \ } \ return os.str(); \ } @@ -156,7 +156,7 @@ namespace sls { det->SETFCN(val, std::vector{det_id}); \ os << args.front() << '\n'; \ } else { \ - throw RuntimeError("Unknown action"); \ + throw RuntimeError("Unknown action"); \ } \ return os.str(); \ } @@ -182,7 +182,7 @@ namespace sls { det->SETFCN(val, std::vector{det_id}); \ os << args.front() << '\n'; \ } else { \ - throw RuntimeError("Unknown action"); \ + throw RuntimeError("Unknown action"); \ } \ return os.str(); \ } @@ -208,7 +208,7 @@ namespace sls { det->SETFCN(val, det_id); \ os << args.front() << '\n'; \ } else { \ - throw RuntimeError("Unknown action"); \ + throw RuntimeError("Unknown action"); \ } \ return os.str(); \ } @@ -234,7 +234,7 @@ namespace sls { det->SETFCN(val, det_id); \ os << args.front() << '\n'; \ } else { \ - throw RuntimeError("Unknown action"); \ + throw RuntimeError("Unknown action"); \ } \ return os.str(); \ } @@ -254,8 +254,7 @@ namespace sls { os << OutString(t) << '\n'; \ } else if (action == slsDetectorDefs::PUT_ACTION) { \ if (det_id != -1) { \ - throw RuntimeError( \ - "Cannot execute this at module level"); \ + throw RuntimeError("Cannot execute this at module level"); \ } \ if (args.size() != 1) { \ WrongNumberOfParameters(1); \ @@ -264,7 +263,7 @@ namespace sls { det->SETFCN(val); \ os << args.front() << '\n'; \ } else { \ - throw RuntimeError("Unknown action"); \ + throw RuntimeError("Unknown action"); \ } \ return os.str(); \ } @@ -275,7 +274,7 @@ namespace sls { std::ostringstream os; \ os << cmd << ' '; \ if (det_id != -1) { \ - throw RuntimeError("Cannot execute this at module level"); \ + throw RuntimeError("Cannot execute this at module level"); \ } \ if (action == slsDetectorDefs::HELP_ACTION) \ os << HLPSTR << '\n'; \ @@ -293,7 +292,7 @@ namespace sls { det->SETFCN(val); \ os << args.front() << '\n'; \ } else { \ - throw RuntimeError("Unknown action"); \ + throw RuntimeError("Unknown action"); \ } \ return os.str(); \ } @@ -319,7 +318,7 @@ namespace sls { det->SETFCN(INDEX, val, std::vector{det_id}); \ os << args.front() << '\n'; \ } else { \ - throw RuntimeError("Unknown action"); \ + throw RuntimeError("Unknown action"); \ } \ return os.str(); \ } @@ -347,7 +346,7 @@ namespace sls { std::vector{det_id}); \ os << args[0] << ' ' << args[1] << '\n'; \ } else { \ - throw RuntimeError("Unknown action"); \ + throw RuntimeError("Unknown action"); \ } \ return os.str(); \ } @@ -358,12 +357,12 @@ namespace sls { std::ostringstream os; \ os << cmd << ' '; \ if (det_id != -1) { \ - throw RuntimeError("Cannot execute this at module level"); \ + throw RuntimeError("Cannot execute this at module level"); \ } \ if (action == slsDetectorDefs::HELP_ACTION) \ os << HLPSTR << '\n'; \ else if (action == slsDetectorDefs::GET_ACTION) { \ - throw RuntimeError("Cannot get"); \ + throw RuntimeError("Cannot get"); \ } else if (action == slsDetectorDefs::PUT_ACTION) { \ if (!args.empty()) { \ WrongNumberOfParameters(0); \ @@ -371,7 +370,7 @@ namespace sls { det->SETFCN(); \ os << "successful\n"; \ } else { \ - throw RuntimeError("Unknown action"); \ + throw RuntimeError("Unknown action"); \ } \ return os.str(); \ } @@ -384,7 +383,7 @@ namespace sls { if (action == slsDetectorDefs::HELP_ACTION) \ os << HLPSTR << '\n'; \ else if (action == slsDetectorDefs::GET_ACTION) { \ - throw RuntimeError("Cannot get"); \ + throw RuntimeError("Cannot get"); \ } else if (action == slsDetectorDefs::PUT_ACTION) { \ if (!args.empty()) { \ WrongNumberOfParameters(0); \ @@ -392,7 +391,7 @@ namespace sls { det->SETFCN(std::vector{det_id}); \ os << "successful\n"; \ } else { \ - throw RuntimeError("Unknown action"); \ + throw RuntimeError("Unknown action"); \ } \ return os.str(); \ } @@ -403,12 +402,12 @@ namespace sls { std::ostringstream os; \ os << cmd << ' '; \ if (det_id != -1) { \ - throw RuntimeError("Cannot execute this at module level"); \ + throw RuntimeError("Cannot execute this at module level"); \ } \ if (action == slsDetectorDefs::HELP_ACTION) \ os << HLPSTR << '\n'; \ else if (action == slsDetectorDefs::GET_ACTION) { \ - throw RuntimeError("Cannot get"); \ + throw RuntimeError("Cannot get"); \ } else if (action == slsDetectorDefs::PUT_ACTION) { \ if (args.size() != 1) { \ WrongNumberOfParameters(1); \ @@ -416,7 +415,7 @@ namespace sls { det->SETFCN(args[0]); \ os << args.front() << '\n'; \ } else { \ - throw RuntimeError("Unknown action"); \ + throw RuntimeError("Unknown action"); \ } \ return os.str(); \ } @@ -429,7 +428,7 @@ namespace sls { if (action == slsDetectorDefs::HELP_ACTION) \ os << HLPSTR << '\n'; \ else if (action == slsDetectorDefs::GET_ACTION) { \ - throw RuntimeError("Cannot get"); \ + throw RuntimeError("Cannot get"); \ } else if (action == slsDetectorDefs::PUT_ACTION) { \ if (args.size() != 1) { \ WrongNumberOfParameters(1); \ @@ -437,7 +436,7 @@ namespace sls { det->SETFCN(args[0], std::vector{det_id}); \ os << args.front() << '\n'; \ } else { \ - throw RuntimeError("Unknown action"); \ + throw RuntimeError("Unknown action"); \ } \ return os.str(); \ } @@ -456,9 +455,9 @@ namespace sls { auto t = det->GETFCN(std::vector{det_id}); \ os << OutString(t) << '\n'; \ } else if (action == slsDetectorDefs::PUT_ACTION) { \ - throw RuntimeError("Cannot put"); \ + throw RuntimeError("Cannot put"); \ } else { \ - throw RuntimeError("Unknown action"); \ + throw RuntimeError("Unknown action"); \ } \ return os.str(); \ } @@ -475,11 +474,11 @@ namespace sls { WrongNumberOfParameters(0); \ } \ auto t = det->GETFCN(); \ - os << ToString(t) << '\n'; \ + os << ToString(t) << '\n'; \ } else if (action == slsDetectorDefs::PUT_ACTION) { \ - throw RuntimeError("Cannot put"); \ + throw RuntimeError("Cannot put"); \ } else { \ - throw RuntimeError("Unknown action"); \ + throw RuntimeError("Unknown action"); \ } \ return os.str(); \ } @@ -498,9 +497,9 @@ namespace sls { auto t = det->GETFCN(std::vector{det_id}); \ os << OutStringHex(t) << '\n'; \ } else if (action == slsDetectorDefs::PUT_ACTION) { \ - throw RuntimeError("Cannot put"); \ + throw RuntimeError("Cannot put"); \ } else { \ - throw RuntimeError("Unknown action"); \ + throw RuntimeError("Unknown action"); \ } \ return os.str(); \ } @@ -518,9 +517,9 @@ namespace sls { auto t = det->GETFCN(VAL, std::vector{det_id}); \ os << OutString(t) << APPEND << '\n'; \ } else if (action == slsDetectorDefs::PUT_ACTION) { \ - throw RuntimeError("Cannot put"); \ + throw RuntimeError("Cannot put"); \ } else { \ - throw RuntimeError("Unknown action"); \ + throw RuntimeError("Unknown action"); \ } \ return os.str(); \ } @@ -1196,7 +1195,10 @@ class CmdProxy { /* Pattern */ std::string Pattern(int action); std::string PatternWord(int action); - void GetLevelAndUpdateArgIndex(int action, std::string levelSeparatedCommand, int& level, int& iArg, size_t nGetArgs, size_t nPutArgs); + void GetLevelAndUpdateArgIndex(int action, + std::string levelSeparatedCommand, + int &level, int &iArg, size_t nGetArgs, + size_t nPutArgs); std::string PatternLoopAddresses(int action); std::string PatternLoopCycles(int action); std::string PatternWaitAddress(int action); @@ -1604,7 +1606,6 @@ class CmdProxy { "out from in a round robin fashion. The entry must not have been " "empty. Default: 0"); - INTEGER_COMMAND_VEC_ID( udp_srcmac, getSourceUDPMAC, setSourceUDPMAC, MacAddr, "[x:x:x:x:x:x]\n\tMac address of the detector (source) udp " @@ -1981,8 +1982,7 @@ class CmdProxy { "users only."); INTEGER_COMMAND_VEC_ID( - gainmode, getGainMode, setGainMode, - StringTo, + gainmode, getGainMode, setGainMode, StringTo, "[dynamicgain|forceswitchg1|forceswitchg2|fixg1|fixg2|fixg0]\n\t[" "Jungfrau] Gain mode.\n\tCAUTION: Do not use fixg0 without caution, " "you can damage the detector!!!"); @@ -2047,11 +2047,15 @@ class CmdProxy { INTEGER_COMMAND_VEC_ID(interpolation, getInterpolation, setInterpolation, StringTo, "[0, 1]\n\t[Mythen3] Enables or disables " - "interpolation. Default is disabled. Interpolation mode enables all counters and disables vth3. Disabling sets back counter mask and vth3."); + "interpolation. Default is disabled. Interpolation " + "mode enables all counters and disables vth3. " + "Disabling sets back counter mask and vth3."); - INTEGER_COMMAND_VEC_ID(pumpprobe, getPumpProbe, setPumpProbe, StringTo, - "[0, 1]\n\t[Mythen3] Enables or disables pump probe " - "mode. Default is disabled. Pump probe mode only enables vth2. Disabling sets back to previous value."); + INTEGER_COMMAND_VEC_ID( + pumpprobe, getPumpProbe, setPumpProbe, StringTo, + "[0, 1]\n\t[Mythen3] Enables or disables pump probe " + "mode. Default is disabled. Pump probe mode only enables vth2. " + "Disabling sets back to previous value."); INTEGER_COMMAND_VEC_ID(apulse, getAnalogPulsing, setAnalogPulsing, StringTo, diff --git a/slsDetectorSoftware/src/CtbConfig.cpp b/slsDetectorSoftware/src/CtbConfig.cpp index d450ac5e6..f5ee27d0e 100644 --- a/slsDetectorSoftware/src/CtbConfig.cpp +++ b/slsDetectorSoftware/src/CtbConfig.cpp @@ -10,9 +10,9 @@ namespace sls { -CtbConfig::CtbConfig(){ - for (size_t i=0; i!=num_dacs; ++i){ - setDacName(i, "dac"+ToString(i)); +CtbConfig::CtbConfig() { + for (size_t i = 0; i != num_dacs; ++i) { + setDacName(i, "dac" + ToString(i)); } } @@ -25,11 +25,11 @@ void CtbConfig::check_index(size_t i) const { } void CtbConfig::check_size(const std::string &name) const { - + if (name.empty()) throw RuntimeError("Name needs to be at least one character"); - // dacname_length -1 to account for \0 termination + // dacname_length -1 to account for \0 termination if (!(name.size() < (name_length - 1))) { std::ostringstream oss; oss << "Length of name needs to be less than " << name_length - 1 @@ -48,8 +48,8 @@ void CtbConfig::setDacName(size_t index, const std::string &name) { memcpy(dst, &name[0], name.size()); } -void CtbConfig::setDacNames(const std::vector& names){ - for (size_t i = 0; i!=num_dacs; ++i){ +void CtbConfig::setDacNames(const std::vector &names) { + for (size_t i = 0; i != num_dacs; ++i) { setDacName(i, names[i]); } } @@ -65,8 +65,6 @@ std::vector CtbConfig::getDacNames() const { return names; } -const char* CtbConfig::shm_tag(){ - return shm_tag_; -} +const char *CtbConfig::shm_tag() { return shm_tag_; } } // namespace sls \ No newline at end of file diff --git a/slsDetectorSoftware/src/CtbConfig.h b/slsDetectorSoftware/src/CtbConfig.h index 6c17fadbf..3de6dd128 100644 --- a/slsDetectorSoftware/src/CtbConfig.h +++ b/slsDetectorSoftware/src/CtbConfig.h @@ -3,11 +3,10 @@ #include namespace sls { - class CtbConfig { static constexpr size_t name_length = 20; static constexpr size_t num_dacs = 18; - static constexpr const char* shm_tag_ = "ctbdacs"; + static constexpr const char *shm_tag_ = "ctbdacs"; char dacnames[name_length * num_dacs]{}; void check_index(size_t i) const; @@ -15,17 +14,16 @@ class CtbConfig { public: CtbConfig(); - CtbConfig(const CtbConfig&) = default; - CtbConfig(CtbConfig&&) = default; - CtbConfig& operator=(const CtbConfig&) = default; + CtbConfig(const CtbConfig &) = default; + CtbConfig(CtbConfig &&) = default; + CtbConfig &operator=(const CtbConfig &) = default; ~CtbConfig() = default; void setDacNames(const std::vector &names); void setDacName(size_t index, const std::string &name); std::string getDacName(size_t index) const; std::vector getDacNames() const; - static const char* shm_tag(); + static const char *shm_tag(); }; - } // namespace sls diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index b27cc6af9..1f197c9d2 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -55,8 +55,7 @@ void freeSharedMemory(int detectorIndex, int moduleIndex) { using defs = slsDetectorDefs; -Detector::Detector(int shm_id) - : pimpl(make_unique(shm_id)) {} +Detector::Detector(int shm_id) : pimpl(make_unique(shm_id)) {} Detector::~Detector() = default; @@ -1795,7 +1794,7 @@ void Detector::setVetoAlgorithm(const defs::vetoAlgorithm alg, defs::streamingInterface interface, Positions pos) { LOG(logDEBUG) << "alg:" << ToString(alg) - << " interface:" << ToString(interface); + << " interface:" << ToString(interface); pimpl->Parallel(&Module::setVetoAlgorithm, pos, alg, interface); } diff --git a/slsDetectorSoftware/src/DetectorImpl.cpp b/slsDetectorSoftware/src/DetectorImpl.cpp index aedafcd35..30c5ea819 100644 --- a/slsDetectorSoftware/src/DetectorImpl.cpp +++ b/slsDetectorSoftware/src/DetectorImpl.cpp @@ -185,8 +185,7 @@ void DetectorImpl::initializeMembers(bool verify) { // get objects from single det shared memory (open) for (int i = 0; i < shm()->totalNumberOfModules; i++) { try { - modules.push_back( - make_unique(detectorIndex, i, verify)); + modules.push_back(make_unique(detectorIndex, i, verify)); } catch (...) { modules.clear(); throw; @@ -307,8 +306,7 @@ void DetectorImpl::addModule(const std::string &hostname) { } auto pos = modules.size(); - modules.emplace_back( - make_unique(type, detectorIndex, pos, false)); + modules.emplace_back(make_unique(type, detectorIndex, pos, false)); shm()->totalNumberOfModules = modules.size(); modules[pos]->setControlPort(port); modules[pos]->setStopPort(port + 1); @@ -459,17 +457,17 @@ int DetectorImpl::createReceivingDataSockets() { try { zmqSocket.push_back( make_unique(modules[iSocket / numUDPInterfaces] - ->getClientStreamingIP() - .str() - .c_str(), - portnum)); + ->getClientStreamingIP() + .str() + .c_str(), + portnum)); // set high water mark int hwm = shm()->zmqHwm; if (hwm >= 0) { zmqSocket[iSocket]->SetReceiveHighWaterMark(hwm); if (zmqSocket[iSocket]->GetReceiveHighWaterMark() != hwm) { throw ZmqSocketError("Could not set zmq rcv hwm to " + - std::to_string(hwm)); + std::to_string(hwm)); } } LOG(logINFO) << "Zmq Client[" << iSocket << "] at " @@ -672,7 +670,6 @@ void DetectorImpl::readFrameFromReceiver() { << "\n\t databytes: " << multisize << "\n\t dynamicRange: " << dynamicRange; - // send data to callback if (data) { char *callbackImage = multiframe.get(); @@ -1063,7 +1060,7 @@ void DetectorImpl::setClientStreamingHwm(const int limit) { if (it->GetReceiveHighWaterMark() != limit) { shm()->zmqHwm = -1; throw ZmqSocketError("Could not set zmq rcv hwm to " + - std::to_string(limit)); + std::to_string(limit)); } } LOG(logINFO) << "Setting Client Zmq socket rcv hwm to " << limit; @@ -1186,10 +1183,10 @@ void DetectorImpl::startAcquisition(bool blocking, std::vector positions) { std::iota(begin(positions), end(positions), 0); } // could be all slaves in positions - slaves.reserve(positions.size()); + slaves.reserve(positions.size()); auto is_master = Parallel(&Module::isMaster, positions); for (size_t i : positions) { - if (is_master[i]) + if (is_master[i]) master.push_back(i); else slaves.push_back(i); @@ -1418,8 +1415,8 @@ std::vector DetectorImpl::readProgrammingFile(const std::string &fname) { } Result DetectorImpl::getDefaultDac(defs::dacIndex index, - defs::detectorSettings sett, - Positions pos) { + defs::detectorSettings sett, + Positions pos) { return Parallel(&Module::getDefaultDac, pos, index, sett); } @@ -1463,7 +1460,8 @@ defs::ROI DetectorImpl::getRxROI() const { auto t = Parallel(&Module::getRxROI, {}); if (t.equal() && t.front().completeRoi()) { LOG(logDEBUG) << "no roi"; - return defs::ROI (0, shm()->numberOfChannels.x - 1, 0, shm()->numberOfChannels.y - 1); + return defs::ROI(0, shm()->numberOfChannels.x - 1, 0, + shm()->numberOfChannels.y - 1); } defs::xy numChansPerMod = modules[0]->getNumberOfChannels(); @@ -1537,21 +1535,26 @@ void DetectorImpl::setRxROI(const defs::ROI arg) { throw RuntimeError("Invalid Roi of size 0."); } if (arg.completeRoi()) { - throw RuntimeError("Did you mean the clear roi command (API: clearRxROI, cmd: rx_clearroi)?"); + throw RuntimeError("Did you mean the clear roi command (API: " + "clearRxROI, cmd: rx_clearroi)?"); } if (arg.xmin > arg.xmax || arg.ymin > arg.ymax) { - throw RuntimeError("Invalid Receiver Roi. xmin/ymin exceeds xmax/ymax."); + throw RuntimeError( + "Invalid Receiver Roi. xmin/ymin exceeds xmax/ymax."); } defs::xy numChansPerMod = modules[0]->getNumberOfChannels(); bool is2D = (numChansPerMod.y > 1 ? true : false); defs::xy geometry = getPortGeometry(); - if (!is2D && ((arg.ymin != -1 && arg.ymin != 0) || (arg.ymax != -1 && arg.ymax != 0))) { - throw RuntimeError("Invalid Receiver roi. Cannot set 2d roi for a 1d detector."); + if (!is2D && ((arg.ymin != -1 && arg.ymin != 0) || + (arg.ymax != -1 && arg.ymax != 0))) { + throw RuntimeError( + "Invalid Receiver roi. Cannot set 2d roi for a 1d detector."); } - if (arg.xmin < 0 || arg.xmax >= shm()->numberOfChannels.x || (is2D && (arg.ymin < 0 || arg.ymax >= shm()->numberOfChannels.y))) { + if (arg.xmin < 0 || arg.xmax >= shm()->numberOfChannels.x || + (is2D && (arg.ymin < 0 || arg.ymax >= shm()->numberOfChannels.y))) { throw RuntimeError("Invalid Receiver Roi. Outside detector range."); } @@ -1576,7 +1579,8 @@ void DetectorImpl::setRxROI(const defs::ROI arg) { --moduleRoi.xmax; } } else { - throw RuntimeError("Cannot have more than 2 modules for a Gotthard2 detector"); + throw RuntimeError("Cannot have more than 2 modules for a " + "Gotthard2 detector"); } } else { // get module limits @@ -1593,27 +1597,27 @@ void DetectorImpl::setRxROI(const defs::ROI arg) { if (arg.xmin > moduleFullRoi.xmax || arg.xmax < moduleFullRoi.xmin || (is2D && (arg.ymin > moduleFullRoi.ymax || - arg.ymax < moduleFullRoi.ymin))) { + arg.ymax < moduleFullRoi.ymin))) { moduleRoi.setNoRoi(); } // incomplete module roi else if (arg.xmin > moduleFullRoi.xmin || - arg.xmax < moduleFullRoi.xmax || - (is2D && (arg.ymin > moduleFullRoi.ymin || - arg.ymax < moduleFullRoi.ymax))) { + arg.xmax < moduleFullRoi.xmax || + (is2D && (arg.ymin > moduleFullRoi.ymin || + arg.ymax < moduleFullRoi.ymax))) { moduleRoi.xmin = (arg.xmin <= moduleFullRoi.xmin) - ? 0 - : (arg.xmin % numChansPerMod.x); + ? 0 + : (arg.xmin % numChansPerMod.x); moduleRoi.xmax = (arg.xmax >= moduleFullRoi.xmax) - ? numChansPerMod.x - 1 - : (arg.xmax % numChansPerMod.x); + ? numChansPerMod.x - 1 + : (arg.xmax % numChansPerMod.x); if (is2D) { moduleRoi.ymin = (arg.ymin <= moduleFullRoi.ymin) - ? 0 - : (arg.ymin % numChansPerMod.y); + ? 0 + : (arg.ymin % numChansPerMod.y); moduleRoi.ymax = (arg.ymax >= moduleFullRoi.ymax) - ? numChansPerMod.y - 1 - : (arg.ymax % numChansPerMod.y); + ? numChansPerMod.y - 1 + : (arg.ymax % numChansPerMod.y); } } } @@ -1625,7 +1629,9 @@ void DetectorImpl::setRxROI(const defs::ROI arg) { // metadata if (arg.completeRoi()) { - modules[0]->setRxROIMetadata(defs::ROI (0, shm()->numberOfChannels.x - 1, 0, shm()->numberOfChannels.y - 1)); + modules[0]->setRxROIMetadata(defs::ROI(0, shm()->numberOfChannels.x - 1, + 0, + shm()->numberOfChannels.y - 1)); } else { modules[0]->setRxROIMetadata(arg); } @@ -1639,7 +1645,6 @@ void DetectorImpl::clearRxROI() { shm()->rx_roi.ymax = -1; } - std::vector DetectorImpl::getCtbDacNames() const { return ctb_shm()->getDacNames(); } diff --git a/slsDetectorSoftware/src/DetectorImpl.h b/slsDetectorSoftware/src/DetectorImpl.h index 2c2845072..6d0898318 100644 --- a/slsDetectorSoftware/src/DetectorImpl.h +++ b/slsDetectorSoftware/src/DetectorImpl.h @@ -2,20 +2,20 @@ // Copyright (C) 2021 Contributors to the SLS Detector Package #pragma once +#include "CtbConfig.h" #include "SharedMemory.h" #include "sls/Result.h" #include "sls/logger.h" #include "sls/sls_detector_defs.h" -#include "CtbConfig.h" +#include #include #include +#include #include #include #include #include -#include -#include namespace sls { @@ -87,8 +87,8 @@ class DetectorImpl : public virtual slsDetectorDefs { template struct NonDeduced { using type = CT; }; template Result Parallel(RT (Module::*somefunc)(CT...), - std::vector positions, - typename NonDeduced::type... Args) { + std::vector positions, + typename NonDeduced::type... Args) { if (modules.empty()) throw RuntimeError("No modules added"); @@ -115,8 +115,8 @@ class DetectorImpl : public virtual slsDetectorDefs { template Result Parallel(RT (Module::*somefunc)(CT...) const, - std::vector positions, - typename NonDeduced::type... Args) const { + std::vector positions, + typename NonDeduced::type... Args) const { if (modules.empty()) throw RuntimeError("No modules added"); @@ -142,8 +142,7 @@ class DetectorImpl : public virtual slsDetectorDefs { } template - void Parallel(void (Module::*somefunc)(CT...), - std::vector positions, + void Parallel(void (Module::*somefunc)(CT...), std::vector positions, typename NonDeduced::type... Args) { if (modules.empty()) @@ -296,9 +295,8 @@ class DetectorImpl : public virtual slsDetectorDefs { std::vector readProgrammingFile(const std::string &fname); void setNumberofUDPInterfaces(int n, Positions pos); - Result getDefaultDac(defs::dacIndex index, - defs::detectorSettings sett, - Positions pos = {}); + Result getDefaultDac(defs::dacIndex index, defs::detectorSettings sett, + Positions pos = {}); void setDefaultDac(defs::dacIndex index, int defaultValue, defs::detectorSettings sett, Positions pos); defs::ROI getRxROI() const; diff --git a/slsDetectorSoftware/src/Module.cpp b/slsDetectorSoftware/src/Module.cpp index 05e59c420..fdcaec49c 100644 --- a/slsDetectorSoftware/src/Module.cpp +++ b/slsDetectorSoftware/src/Module.cpp @@ -237,15 +237,16 @@ void Module::setAllThresholdEnergy(std::array e_eV, throw RuntimeError("This detector should have called with 3 energies"); } if (shm()->trimEnergies.empty()) { - throw RuntimeError( - "Trim energies have not been defined for this module yet! Use trimen."); + throw RuntimeError("Trim energies have not been defined for this " + "module yet! Use trimen."); } std::vector energy(e_eV.begin(), e_eV.end()); // if all energies are same if (allEqualTo(energy, energy[0])) { if (energy[0] == -1) { - throw RuntimeError("Every energy provided to set threshold energy is -1. Typo?"); + throw RuntimeError( + "Every energy provided to set threshold energy is -1. Typo?"); } energy.resize(1); } @@ -309,8 +310,10 @@ void Module::setAllThresholdEnergy(std::array e_eV, trim2, trimbits); // csr if (myMod1.reg != myMod2.reg) { - throw RuntimeError("setAllThresholdEnergy: chip shift register values do not match between files for energy (eV) " + - std::to_string(energy[i])); + throw RuntimeError( + "setAllThresholdEnergy: chip shift register values do not " + "match between files for energy (eV) " + + std::to_string(energy[i])); } myMods[i].reg = myMod1.reg; } @@ -319,12 +322,10 @@ void Module::setAllThresholdEnergy(std::array e_eV, sls_detector_module myMod{shm()->detType}; myMod = myMods[0]; - // if multiple thresholds, combine if (myMods.size() > 1) { auto counters = getSetBits(getCounterMask()); - // average vtrim of enabled counters int sum = 0; for (size_t i = 0; i < counters.size(); ++i) { @@ -364,7 +365,9 @@ void Module::setAllThresholdEnergy(std::array e_eV, } // csr if (myMods[0].reg != myMods[1].reg || myMods[1].reg != myMods[2].reg) { - throw RuntimeError("setAllThresholdEnergy: chip shift register values do not match between files for all energies"); + throw RuntimeError( + "setAllThresholdEnergy: chip shift register values do not " + "match between files for all energies"); } } @@ -2397,8 +2400,7 @@ void Module::setReceiverDbitList(std::vector list) { } for (auto &it : list) { if (it < 0 || it > 63) { - throw RuntimeError( - "Dbit list value must be between 0 and 63\n"); + throw RuntimeError("Dbit list value must be between 0 and 63\n"); } } std::sort(begin(list), end(list)); @@ -3297,8 +3299,8 @@ void Module::setModule(sls_detector_module &module, bool trimbits) { } } if (out_of_range) { - LOG(logWARNING) - << "Some trimbits were out of range, these have been replaced with 0 or 63."; + LOG(logWARNING) << "Some trimbits were out of range, these have " + "been replaced with 0 or 63."; } // check dacs out_of_range = false; @@ -3318,8 +3320,9 @@ void Module::setModule(sls_detector_module &module, bool trimbits) { } } if (out_of_range) { - LOG(logWARNING) << "Some dacs were out of range, " - "these have been replaced with 0/200 or 2800/2400."; + LOG(logWARNING) + << "Some dacs were out of range, " + "these have been replaced with 0/200 or 2800/2400."; } } auto client = DetectorSocket(shm()->hostname, shm()->controlPort); @@ -3391,14 +3394,18 @@ void Module::sendModule(sls_detector_module *myMod, ClientSocket &client) { ts += n; LOG(level) << "channels sent. " << n << " bytes"; - int expectedBytesSent = sizeof(sls_detector_module) - sizeof(myMod->dacs) - sizeof(myMod->chanregs) + (myMod->ndac * sizeof(int)) + (myMod->nchan * sizeof(int)); + int expectedBytesSent = sizeof(sls_detector_module) - sizeof(myMod->dacs) - + sizeof(myMod->chanregs) + + (myMod->ndac * sizeof(int)) + + (myMod->nchan * sizeof(int)); if (expectedBytesSent != ts) { - throw RuntimeError("Module size " + std::to_string(ts) + " sent does not match expected size to be sent " + std::to_string(expectedBytesSent)); + throw RuntimeError("Module size " + std::to_string(ts) + + " sent does not match expected size to be sent " + + std::to_string(expectedBytesSent)); } } - void Module::receiveModule(sls_detector_module *myMod, ClientSocket &client) { constexpr TLogLevel level = logDEBUG1; LOG(level) << "Receiving Module"; @@ -3630,33 +3637,36 @@ sls_detector_module Module::readSettingsFile(const std::string &fname, return myMod; } -void Module::saveSettingsFile(sls_detector_module &myMod, const std::string &fname) { +void Module::saveSettingsFile(sls_detector_module &myMod, + const std::string &fname) { LOG(logDEBUG1) << moduleIndex << ": Saving settings to " << fname; std::ofstream outfile(fname); if (!outfile) { throw RuntimeError("Could not write settings file: " + fname); } switch (shm()->detType) { - case MYTHEN3: - outfile.write(reinterpret_cast(&myMod.reg), sizeof(myMod.reg)); - outfile.write(reinterpret_cast(myMod.dacs), - sizeof(int) * (myMod.ndac)); - outfile.write(reinterpret_cast(myMod.chanregs), - sizeof(int) * (myMod.nchan)); - break; - case EIGER: - outfile.write(reinterpret_cast(myMod.dacs), - sizeof(int) * (myMod.ndac)); - outfile.write(reinterpret_cast(&myMod.iodelay), - sizeof(myMod.iodelay)); - outfile.write(reinterpret_cast(&myMod.tau), sizeof(myMod.tau)); - outfile.write(reinterpret_cast(myMod.chanregs), - sizeof(int) * (myMod.nchan)); - break; - default: - throw RuntimeError("Saving settings file is not implemented for this detector."); + case MYTHEN3: + outfile.write(reinterpret_cast(&myMod.reg), sizeof(myMod.reg)); + outfile.write(reinterpret_cast(myMod.dacs), + sizeof(int) * (myMod.ndac)); + outfile.write(reinterpret_cast(myMod.chanregs), + sizeof(int) * (myMod.nchan)); + break; + case EIGER: + outfile.write(reinterpret_cast(myMod.dacs), + sizeof(int) * (myMod.ndac)); + outfile.write(reinterpret_cast(&myMod.iodelay), + sizeof(myMod.iodelay)); + outfile.write(reinterpret_cast(&myMod.tau), sizeof(myMod.tau)); + outfile.write(reinterpret_cast(myMod.chanregs), + sizeof(int) * (myMod.nchan)); + break; + default: + throw RuntimeError( + "Saving settings file is not implemented for this detector."); } - LOG(logINFO) << "Settings for " << shm()->hostname << " written to " << fname; + LOG(logINFO) << "Settings for " << shm()->hostname << " written to " + << fname; } void Module::sendProgram(bool blackfin, std::vector buffer, diff --git a/slsDetectorSoftware/src/Module.h b/slsDetectorSoftware/src/Module.h index 2ab2f0217..f83e257d8 100644 --- a/slsDetectorSoftware/src/Module.h +++ b/slsDetectorSoftware/src/Module.h @@ -791,22 +791,22 @@ class Module : public virtual slsDetectorDefs { static const int NIOS_WRITE_TO_FLASH_TIME_KERNEL = 40; enum mythen3_DacIndex { - M_VCASSH, - M_VTH2, - M_VRSHAPER, - M_VRSHAPER_N, - M_VIPRE_OUT, - M_VTH3, - M_VTH1, - M_VICIN, - M_VCAS, - M_VRPREAMP, - M_VCAL_N, - M_VIPRE, - M_VISHAPER, - M_VCAL_P, - M_VTRIM, - M_VDCSH + M_VCASSH, + M_VTH2, + M_VRSHAPER, + M_VRSHAPER_N, + M_VIPRE_OUT, + M_VTH3, + M_VTH1, + M_VICIN, + M_VCAS, + M_VRPREAMP, + M_VCAL_N, + M_VIPRE, + M_VISHAPER, + M_VCAL_P, + M_VTRIM, + M_VDCSH }; enum eiger_DacIndex { diff --git a/slsDetectorSoftware/src/Pattern.cpp b/slsDetectorSoftware/src/Pattern.cpp index 3797340f1..4592c06f0 100644 --- a/slsDetectorSoftware/src/Pattern.cpp +++ b/slsDetectorSoftware/src/Pattern.cpp @@ -29,11 +29,13 @@ bool Pattern::operator==(const Pattern &other) const { if (pat->limits[i] != other.pat->limits[i]) return false; } - for (size_t i = 0; i < (sizeof(pat->startloop) / sizeof(pat->startloop[0])); ++i) { + for (size_t i = 0; i < (sizeof(pat->startloop) / sizeof(pat->startloop[0])); + ++i) { if (pat->startloop[i] != other.pat->startloop[i]) return false; } - for (size_t i = 0; i < (sizeof(pat->stoploop) / sizeof(pat->stoploop[0])); ++i) { + for (size_t i = 0; i < (sizeof(pat->stoploop) / sizeof(pat->stoploop[0])); + ++i) { if (pat->stoploop[i] != other.pat->stoploop[i]) return false; } @@ -70,11 +72,10 @@ void Pattern::validate() const { for (int i = 0; i != MAX_PATTERN_LEVELS; ++i) { if (pat->startloop[i] >= MAX_PATTERN_LENGTH || pat->stoploop[i] >= MAX_PATTERN_LENGTH) { - throw RuntimeError( - "Invalid Pattern loop address for level " + ToString(i) + - std::string(" [") + ToString(pat->startloop[i]) + - std::string(", ") + ToString(pat->stoploop[i]) + - std::string("]")); + throw RuntimeError("Invalid Pattern loop address for level " + + ToString(i) + std::string(" [") + + ToString(pat->startloop[i]) + std::string(", ") + + ToString(pat->stoploop[i]) + std::string("]")); } if (pat->wait[i] >= MAX_PATTERN_LENGTH) { throw RuntimeError("Invalid Pattern wait address for level " + @@ -129,26 +130,27 @@ void Pattern::load(const std::string &fname) { } pat->limits[0] = StringTo(args[1]); pat->limits[1] = StringTo(args[2]); - } - else if (cmd == "patloop0" || cmd == "patloop1" || + } else if (cmd == "patloop0" || cmd == "patloop1" || cmd == "patloop2" || cmd == "patloop") { int level = -1, iArg = 1; if (cmd == "patloop") { if (nargs != 3) { throw RuntimeError("Invalid arguments for " + - ToString(args)); + ToString(args)); } level = StringTo(args[iArg++]); } else { - LOG(logWARNING) << "Depreciated command. Please use patloop next time."; + LOG(logWARNING) + << "Depreciated command. Please use patloop next time."; if (nargs != 2) { throw RuntimeError("Invalid arguments for " + - ToString(args)); + ToString(args)); } level = cmd[cmd.find_first_of("012")] - '0'; } if (level < 0 || level >= MAX_PATTERN_LEVELS) { - throw RuntimeError("Invalid Pattern level. Options 0-" + std::to_string(MAX_PATTERN_LEVELS - 1)); + throw RuntimeError("Invalid Pattern level. Options 0-" + + std::to_string(MAX_PATTERN_LEVELS - 1)); } int loop1 = StringTo(args[iArg++]); int loop2 = StringTo(args[iArg++]); @@ -160,19 +162,21 @@ void Pattern::load(const std::string &fname) { if (cmd == "patnloop") { if (nargs != 2) { throw RuntimeError("Invalid arguments for " + - ToString(args)); + ToString(args)); } level = StringTo(args[iArg++]); } else { - LOG(logWARNING) << "Depreciated command. Please use patnloop next time."; + LOG(logWARNING) << "Depreciated command. Please use " + "patnloop next time."; if (nargs != 1) { throw RuntimeError("Invalid arguments for " + - ToString(args)); + ToString(args)); } level = cmd[cmd.find_first_of("012")] - '0'; } if (level < 0 || level >= MAX_PATTERN_LEVELS) { - throw RuntimeError("Invalid Pattern level. Options 0-" + std::to_string(MAX_PATTERN_LEVELS - 1)); + throw RuntimeError("Invalid Pattern level. Options 0-" + + std::to_string(MAX_PATTERN_LEVELS - 1)); } pat->nloop[level] = StringTo(args[iArg++]); } else if (cmd == "patwait0" || cmd == "patwait1" || @@ -181,19 +185,21 @@ void Pattern::load(const std::string &fname) { if (cmd == "patwait") { if (nargs != 2) { throw RuntimeError("Invalid arguments for " + - ToString(args)); + ToString(args)); } level = StringTo(args[iArg++]); } else { - LOG(logWARNING) << "Depreciated command. Please use patwait next time."; + LOG(logWARNING) + << "Depreciated command. Please use patwait next time."; if (nargs != 1) { throw RuntimeError("Invalid arguments for " + - ToString(args)); + ToString(args)); } level = cmd[cmd.find_first_of("012")] - '0'; } if (level < 0 || level >= MAX_PATTERN_LEVELS) { - throw RuntimeError("Invalid Pattern level. Options 0-" + std::to_string(MAX_PATTERN_LEVELS - 1)); + throw RuntimeError("Invalid Pattern level. Options 0-" + + std::to_string(MAX_PATTERN_LEVELS - 1)); } pat->wait[level] = StringTo(args[iArg++]); } else if (cmd == "patwaittime0" || cmd == "patwaittime1" || @@ -202,19 +208,21 @@ void Pattern::load(const std::string &fname) { if (cmd == "patwaittime") { if (nargs != 2) { throw RuntimeError("Invalid arguments for " + - ToString(args)); + ToString(args)); } level = StringTo(args[iArg++]); } else { - LOG(logWARNING) << "Depreciated command. Please use patwaittime next time."; + LOG(logWARNING) << "Depreciated command. Please use " + "patwaittime next time."; if (nargs != 1) { throw RuntimeError("Invalid arguments for " + - ToString(args)); + ToString(args)); } level = cmd[cmd.find_first_of("012")] - '0'; } if (level < 0 || level >= MAX_PATTERN_LEVELS) { - throw RuntimeError("Invalid Pattern level. Options 0-" + std::to_string(MAX_PATTERN_LEVELS - 1)); + throw RuntimeError("Invalid Pattern level. Options 0-" + + std::to_string(MAX_PATTERN_LEVELS - 1)); } pat->waittime[level] = StringTo(args[iArg++]); } else { @@ -279,10 +287,12 @@ std::string Pattern::str() const { << ToStringHex(pat->limits[1], addr_width) << std::endl; for (int i = 0; i != MAX_PATTERN_LEVELS; ++i) { - oss << "patloop " << i << ' ' << ToStringHex(pat->startloop[i], addr_width) << " " + oss << "patloop " << i << ' ' + << ToStringHex(pat->startloop[i], addr_width) << " " << ToStringHex(pat->stoploop[i], addr_width) << std::endl << "patnloop " << pat->nloop[i] << std::endl - << "patwait " << i << ' ' << ToStringHex(pat->wait[i], addr_width) << std::endl + << "patwait " << i << ' ' << ToStringHex(pat->wait[i], addr_width) + << std::endl << "patwaittime " << i << ' ' << pat->waittime[i] << std::endl; } diff --git a/slsDetectorSoftware/src/SharedMemory.h b/slsDetectorSoftware/src/SharedMemory.h index 63e3b0c41..e31fc5fb9 100644 --- a/slsDetectorSoftware/src/SharedMemory.h +++ b/slsDetectorSoftware/src/SharedMemory.h @@ -13,17 +13,16 @@ #include "sls/logger.h" #include "sls/sls_detector_exceptions.h" +#include // errno #include -#include // errno #include // strerror #include // O_CREAT, O_TRUNC.. #include #include +#include #include // shared memory #include // fstat #include -#include -#include namespace sls { diff --git a/slsDetectorSoftware/tests/test-CmdProxy-global.h b/slsDetectorSoftware/tests/test-CmdProxy-global.h index c794601a8..ab869529b 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-global.h +++ b/slsDetectorSoftware/tests/test-CmdProxy-global.h @@ -10,5 +10,4 @@ void test_dac(slsDetectorDefs::dacIndex index, const std::string &dacname, void test_onchip_dac(slsDetectorDefs::dacIndex index, const std::string &dacname, int dacvalue); - } // namespace sls diff --git a/slsDetectorSoftware/tests/test-CmdProxy-mythen3.cpp b/slsDetectorSoftware/tests/test-CmdProxy-mythen3.cpp index be6d9877f..102808dd2 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-mythen3.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy-mythen3.cpp @@ -511,18 +511,23 @@ TEST_CASE("interpolation", "[.cmd]") { std::ostringstream oss; proxy.Call("interpolation", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "interpolation 1\n"); - REQUIRE(det.getCounterMask().tsquash("inconsistent counter mask") == - 7); - REQUIRE(det.getDAC(defs::VTH3, 0, {0}).tsquash("inconsistent vth3 dac value") == disabledDacValue); + REQUIRE(det.getCounterMask().tsquash( + "inconsistent counter mask") == 7); + REQUIRE(det.getDAC(defs::VTH3, 0, {0}) + .tsquash("inconsistent vth3 dac value") == + disabledDacValue); } { std::ostringstream oss; proxy.Call("interpolation", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "interpolation 0\n"); - REQUIRE(det.getCounterMask().tsquash("inconsistent counter mask") == - fixedMask[i]); - uint32_t expectedVth3DacVal = (fixedMask[i] & 0x4 ? fixedVth3DacVal : disabledDacValue); - REQUIRE(det.getDAC(defs::VTH3, 0, {0}).tsquash("inconsistent vth3 dac value") == expectedVth3DacVal); + REQUIRE(det.getCounterMask().tsquash( + "inconsistent counter mask") == fixedMask[i]); + uint32_t expectedVth3DacVal = + (fixedMask[i] & 0x4 ? fixedVth3DacVal : disabledDacValue); + REQUIRE(det.getDAC(defs::VTH3, 0, {0}) + .tsquash("inconsistent vth3 dac value") == + expectedVth3DacVal); } } @@ -535,7 +540,6 @@ TEST_CASE("interpolation", "[.cmd]") { det.setCounterMask(prev_mask[i], {i}); det.setInterpolation(prev_interpolation[i], {i}); det.setDAC(defs::VTH3, prev_vth3DacVal[i], 0, {i}); - } } else { REQUIRE_THROWS(proxy.Call("interpolation", {}, -1, GET)); @@ -567,23 +571,38 @@ TEST_CASE("pumpprobe", "[.cmd]") { std::ostringstream oss; proxy.Call("pumpprobe", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "pumpprobe 1\n"); - REQUIRE(det.getDAC(defs::VTH1, 0, {0}).tsquash("inconsistent vth2 dac value") == disabledDacValue); - REQUIRE(det.getDAC(defs::VTH2, 0, {0}).tsquash("inconsistent vth2 dac value") == fixedVthDacVal); - REQUIRE(det.getDAC(defs::VTH3, 0, {0}).tsquash("inconsistent vth2 dac value") == disabledDacValue); - } - // interpolation and pump probe + REQUIRE(det.getDAC(defs::VTH1, 0, {0}) + .tsquash("inconsistent vth2 dac value") == + disabledDacValue); + REQUIRE(det.getDAC(defs::VTH2, 0, {0}) + .tsquash("inconsistent vth2 dac value") == + fixedVthDacVal); + REQUIRE(det.getDAC(defs::VTH3, 0, {0}) + .tsquash("inconsistent vth2 dac value") == + disabledDacValue); + } + // interpolation and pump probe REQUIRE_THROWS(proxy.Call("interpolation", {"1"}, -1, PUT)); { // none std::ostringstream oss; proxy.Call("pumpprobe", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "pumpprobe 0\n"); - REQUIRE(det.getCounterMask().tsquash("inconsistent counter mask") == 7); - REQUIRE(det.getDAC(defs::VTH1, 0, {0}).tsquash("inconsistent vth1 dac value") == (fixedMask[i] & 0x1 ? fixedVthDacVal : disabledDacValue)); - REQUIRE(det.getDAC(defs::VTH2, 0, {0}).tsquash("inconsistent vth2 dac value") == (fixedMask[i] & 0x2 ? fixedVthDacVal : disabledDacValue)); - REQUIRE(det.getDAC(defs::VTH3, 0, {0}).tsquash("inconsistent vth3 dac value") == (fixedMask[i] & 0x4 ? fixedVthDacVal : disabledDacValue)); - } - + REQUIRE(det.getCounterMask().tsquash( + "inconsistent counter mask") == 7); + REQUIRE( + det.getDAC(defs::VTH1, 0, {0}) + .tsquash("inconsistent vth1 dac value") == + (fixedMask[i] & 0x1 ? fixedVthDacVal : disabledDacValue)); + REQUIRE( + det.getDAC(defs::VTH2, 0, {0}) + .tsquash("inconsistent vth2 dac value") == + (fixedMask[i] & 0x2 ? fixedVthDacVal : disabledDacValue)); + REQUIRE( + det.getDAC(defs::VTH3, 0, {0}) + .tsquash("inconsistent vth3 dac value") == + (fixedMask[i] & 0x4 ? fixedVthDacVal : disabledDacValue)); + } } { std::ostringstream oss; diff --git a/slsDetectorSoftware/tests/test-CmdProxy-pattern.cpp b/slsDetectorSoftware/tests/test-CmdProxy-pattern.cpp index b06aadb6a..2b40bd175 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-pattern.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy-pattern.cpp @@ -170,12 +170,12 @@ TEST_CASE("patloop", "[.cmd]") { std::string sLoop = ToString(iLoop); if (iLoop < 3) { std::string deprecatedCmd = "patloop" + sLoop; - {// depreciated + { // depreciated std::ostringstream oss; proxy.Call(deprecatedCmd, {"0x20", "0x5c"}, -1, PUT, oss); REQUIRE(oss.str() == deprecatedCmd + " [0x0020, 0x005c]\n"); } - {// depreciated + { // depreciated std::ostringstream oss; proxy.Call(deprecatedCmd, {}, -1, GET, oss); REQUIRE(oss.str() == deprecatedCmd + " [0x0020, 0x005c]\n"); @@ -190,9 +190,10 @@ TEST_CASE("patloop", "[.cmd]") { std::ostringstream oss; proxy.Call("patloop", {sLoop}, -1, GET, oss); REQUIRE(oss.str() == "patloop [0x0020, 0x005c]\n"); - } + } for (int iDet = 0; iDet != det.size(); ++iDet) { - det.setPatternLoopAddresses(iLoop, prev_val[iDet][0], prev_val[iDet][1], {iDet}); + det.setPatternLoopAddresses(iLoop, prev_val[iDet][0], + prev_val[iDet][1], {iDet}); } } } else { @@ -216,12 +217,12 @@ TEST_CASE("patnloop", "[.cmd]") { std::string sLoop = ToString(iLoop); if (iLoop < 3) { std::string deprecatedCmd = "patnloop" + sLoop; - {// depreciated + { // depreciated std::ostringstream oss; proxy.Call(deprecatedCmd, {"5"}, -1, PUT, oss); REQUIRE(oss.str() == deprecatedCmd + " 5\n"); } - {// depreciated + { // depreciated std::ostringstream oss; proxy.Call(deprecatedCmd, {}, -1, GET, oss); REQUIRE(oss.str() == deprecatedCmd + " 5\n"); @@ -262,12 +263,12 @@ TEST_CASE("patwait", "[.cmd]") { std::string sLoop = ToString(iLoop); if (iLoop < 3) { std::string deprecatedCmd = "patwait" + sLoop; - {// depreciated + { // depreciated std::ostringstream oss; proxy.Call(deprecatedCmd, {"0x5c"}, -1, PUT, oss); REQUIRE(oss.str() == deprecatedCmd + " 0x005c\n"); } - {// depreciated + { // depreciated std::ostringstream oss; proxy.Call(deprecatedCmd, {}, -1, GET, oss); REQUIRE(oss.str() == deprecatedCmd + " 0x005c\n"); @@ -308,12 +309,12 @@ TEST_CASE("patwaittime", "[.cmd]") { std::string sLoop = ToString(iLoop); if (iLoop < 3) { std::string deprecatedCmd = "patwaittime" + sLoop; - {// depreciated + { // depreciated std::ostringstream oss; proxy.Call(deprecatedCmd, {"8589936640"}, -1, PUT, oss); REQUIRE(oss.str() == deprecatedCmd + " 8589936640\n"); } - {// depreciated + { // depreciated std::ostringstream oss; proxy.Call(deprecatedCmd, {}, -1, GET, oss); REQUIRE(oss.str() == deprecatedCmd + " 8589936640\n"); diff --git a/slsDetectorSoftware/tests/test-CmdProxy-rx.cpp b/slsDetectorSoftware/tests/test-CmdProxy-rx.cpp index aa733a6c0..93a10227d 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-rx.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy-rx.cpp @@ -465,7 +465,8 @@ TEST_CASE("rx_roi", "[.cmd]") { REQUIRE(oss.str() == "rx_roi [10, 15]\n"); } REQUIRE_THROWS(proxy.Call("rx_roi", {"-1", "-1"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("rx_roi", {"10", "15", "25", "30"}, -1, PUT)); + REQUIRE_THROWS( + proxy.Call("rx_roi", {"10", "15", "25", "30"}, -1, PUT)); } // 2d else { @@ -481,10 +482,18 @@ TEST_CASE("rx_roi", "[.cmd]") { } { std::ostringstream oss; - proxy.Call("rx_roi", {"1", std::to_string(detsize.x - 5), "1", std::to_string(detsize.y - 5)}, -1, PUT, oss); - REQUIRE(oss.str() == std::string("rx_roi [1, ") + std::to_string(detsize.x - 5) + std::string(", ") + std::to_string(detsize.y - 5) + std::string(", 1]\n")); - } - REQUIRE_THROWS(proxy.Call("rx_roi", {"-1", "-1", "-1", "-1"}, -1, PUT)); + proxy.Call("rx_roi", + {"1", std::to_string(detsize.x - 5), "1", + std::to_string(detsize.y - 5)}, + -1, PUT, oss); + REQUIRE(oss.str() == std::string("rx_roi [1, ") + + std::to_string(detsize.x - 5) + + std::string(", ") + + std::to_string(detsize.y - 5) + + std::string(", 1]\n")); + } + REQUIRE_THROWS( + proxy.Call("rx_roi", {"-1", "-1", "-1", "-1"}, -1, PUT)); } for (int i = 0; i != det.size(); ++i) { @@ -574,7 +583,7 @@ TEST_CASE("fname", "[.cmd]") { } REQUIRE_THROWS(proxy.Call("fname", {"fdf/dfd"}, -1, PUT)); REQUIRE_THROWS(proxy.Call("fname", {"fdf dfd"}, -1, PUT)); - + for (int i = 0; i != det.size(); ++i) { det.setFileNamePrefix(prev_val[i], {i}); } diff --git a/slsDetectorSoftware/tests/test-CmdProxy.cpp b/slsDetectorSoftware/tests/test-CmdProxy.cpp index 156f82b2f..703c54858 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy.cpp @@ -16,15 +16,14 @@ namespace sls { using test::GET; using test::PUT; -TEST_CASE("Calling help doesn't throw or cause segfault"){ - //Dont add [.cmd] tag this should run with normal tests +TEST_CASE("Calling help doesn't throw or cause segfault") { + // Dont add [.cmd] tag this should run with normal tests CmdProxy proxy(nullptr); auto commands = proxy.GetProxyCommands(); std::ostringstream os; for (const auto &cmd : commands) - REQUIRE_NOTHROW(proxy.Call(cmd, {}, -1, slsDetectorDefs::HELP_ACTION, os)); - - + REQUIRE_NOTHROW( + proxy.Call(cmd, {}, -1, slsDetectorDefs::HELP_ACTION, os)); } TEST_CASE("Unknown command", "[.cmd]") { @@ -338,9 +337,8 @@ TEST_CASE("threshold", "[.cmd]") { det.setTrimEnergies(prev_energies); for (int i = 0; i != det.size(); ++i) { if (prev_threshold[i][0] >= 0) { - std::cout - << "prev cvalues:" << ToString(prev_threshold[i]) - << std::endl; + std::cout << "prev cvalues:" << ToString(prev_threshold[i]) + << std::endl; det.setThresholdEnergy(prev_threshold[i], prev_settings, true, {i}); } @@ -585,7 +583,8 @@ TEST_CASE("master", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::EIGER || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD || det_type == defs::GOTTHARD2) { + if (det_type == defs::EIGER || det_type == defs::MYTHEN3 || + det_type == defs::GOTTHARD || det_type == defs::GOTTHARD2) { REQUIRE_NOTHROW(proxy.Call("master", {}, -1, GET)); if (det_type == defs::EIGER) { // get previous master @@ -2265,10 +2264,8 @@ TEST_CASE("scan", "[.cmd]") { { std::ostringstream oss; - proxy.Call("scan", {ToString(ind), "500", "1500", "500"}, -1, PUT, - oss); - CHECK(oss.str() == - "scan [" + ToString(ind) + ", 500, 1500, 500]\n"); + proxy.Call("scan", {ToString(ind), "500", "1500", "500"}, -1, PUT, oss); + CHECK(oss.str() == "scan [" + ToString(ind) + ", 500, 1500, 500]\n"); } { std::ostringstream oss; @@ -2279,8 +2276,8 @@ TEST_CASE("scan", "[.cmd]") { } { std::ostringstream oss; - proxy.Call("scan", {ToString(ind), "500", "1500", "500", "2s"}, -1, - PUT, oss); + proxy.Call("scan", {ToString(ind), "500", "1500", "500", "2s"}, -1, PUT, + oss); CHECK(oss.str() == "scan [" + ToString(ind) + ", 500, 1500, 500, 2s]\n"); } @@ -2305,16 +2302,14 @@ TEST_CASE("scan", "[.cmd]") { std::ostringstream oss; proxy.Call("scan", {ToString(ind), "1500", "500", "-500"}, -1, PUT, oss); - CHECK(oss.str() == - "scan [" + ToString(ind) + ", 1500, 500, -500]\n"); + CHECK(oss.str() == "scan [" + ToString(ind) + ", 1500, 500, -500]\n"); } CHECK_THROWS(proxy.Call( - "scan", {ToString(notImplementedInd), "500", "1500", "500"}, -1, - PUT)); - CHECK_THROWS(proxy.Call("scan", {ToString(ind), "500", "1500", "-500"}, - -1, PUT)); - CHECK_THROWS(proxy.Call("scan", {ToString(ind), "1500", "500", "500"}, - -1, PUT)); + "scan", {ToString(notImplementedInd), "500", "1500", "500"}, -1, PUT)); + CHECK_THROWS( + proxy.Call("scan", {ToString(ind), "500", "1500", "-500"}, -1, PUT)); + CHECK_THROWS( + proxy.Call("scan", {ToString(ind), "1500", "500", "500"}, -1, PUT)); if (det_type == defs::MYTHEN3 || defs::EIGER) { { diff --git a/slsDetectorSoftware/tests/test-CtbConfig.cpp b/slsDetectorSoftware/tests/test-CtbConfig.cpp index f8a683cf9..3687ed0fa 100644 --- a/slsDetectorSoftware/tests/test-CtbConfig.cpp +++ b/slsDetectorSoftware/tests/test-CtbConfig.cpp @@ -3,14 +3,14 @@ #include -#include "SharedMemory.h" #include "CtbConfig.h" +#include "SharedMemory.h" #include namespace sls { -TEST_CASE("Default construction"){ - static_assert(sizeof(CtbConfig) == 360); // 18*20 +TEST_CASE("Default construction") { + static_assert(sizeof(CtbConfig) == 360); // 18*20 CtbConfig c; auto names = c.getDacNames(); @@ -21,7 +21,7 @@ TEST_CASE("Default construction"){ REQUIRE(names[3] == "dac3"); } -TEST_CASE("Set and get a single dac name"){ +TEST_CASE("Set and get a single dac name") { CtbConfig c; c.setDacName(3, "vrf"); auto names = c.getDacNames(); @@ -30,28 +30,28 @@ TEST_CASE("Set and get a single dac name"){ REQUIRE(names[3] == "vrf"); } -TEST_CASE("Set a name that is too large throws"){ +TEST_CASE("Set a name that is too large throws") { CtbConfig c; REQUIRE_THROWS(c.setDacName(3, "somestringthatisreallytolongforadatac")); } -TEST_CASE("Length of dac name cannot be 0"){ +TEST_CASE("Length of dac name cannot be 0") { CtbConfig c; REQUIRE_THROWS(c.setDacName(1, "")); } -TEST_CASE("Copy a CTB config"){ +TEST_CASE("Copy a CTB config") { CtbConfig c1; c1.setDacName(5, "somename"); auto c2 = c1; - //change the name on the first object - //to detecto shallow copy + // change the name on the first object + // to detecto shallow copy c1.setDacName(5, "someothername"); REQUIRE(c2.getDacName(5) == "somename"); } -TEST_CASE("Move CtbConfig "){ +TEST_CASE("Move CtbConfig ") { CtbConfig c1; c1.setDacName(3, "yetanothername"); CtbConfig c2(std::move(c1)); diff --git a/slsDetectorSoftware/tests/test-SharedMemory.cpp b/slsDetectorSoftware/tests/test-SharedMemory.cpp index ad5743e15..2ddd6167f 100644 --- a/slsDetectorSoftware/tests/test-SharedMemory.cpp +++ b/slsDetectorSoftware/tests/test-SharedMemory.cpp @@ -97,7 +97,6 @@ TEST_CASE("Move SharedMemory", "[detector]") { shm.createSharedMemory(); shm()->x = 9; - SharedMemory shm2(shm_id + 1, -1); shm2 = std::move(shm); // shm is now a moved from object! @@ -132,13 +131,12 @@ TEST_CASE("Create several shared memories", "[detector]") { } } -TEST_CASE("Create create a shared memory with a tag"){ +TEST_CASE("Create create a shared memory with a tag") { SharedMemory shm(0, -1, "ctbdacs"); REQUIRE(shm.getName() == "/slsDetectorPackage_detector_0_ctbdacs"); - } -TEST_CASE("Create create a shared memory with a tag when SLSDETNAME is set"){ +TEST_CASE("Create create a shared memory with a tag when SLSDETNAME is set") { // if SLSDETNAME is already set we unset it but // save the value @@ -156,10 +154,9 @@ TEST_CASE("Create create a shared memory with a tag when SLSDETNAME is set"){ unsetenv(SHM_ENV_NAME); else setenv(SHM_ENV_NAME, old_slsdetname.c_str(), 1); - } -TEST_CASE("map int64 to int32 throws"){ +TEST_CASE("map int64 to int32 throws") { SharedMemory shm(shm_id, -1); shm.createSharedMemory(); *shm() = 7; diff --git a/slsReceiverSoftware/CMakeLists.txt b/slsReceiverSoftware/CMakeLists.txt index 6592f7af9..8ff2b1e6b 100755 --- a/slsReceiverSoftware/CMakeLists.txt +++ b/slsReceiverSoftware/CMakeLists.txt @@ -4,7 +4,6 @@ set(SOURCES src/Implementation.cpp src/ClientInterface.cpp src/Receiver.cpp - src/File.cpp src/BinaryDataFile.cpp src/ThreadObject.cpp src/Listener.cpp diff --git a/slsReceiverSoftware/include/sls/Receiver.h b/slsReceiverSoftware/include/sls/Receiver.h index 6fc898cb9..5eed72df8 100644 --- a/slsReceiverSoftware/include/sls/Receiver.h +++ b/slsReceiverSoftware/include/sls/Receiver.h @@ -4,7 +4,6 @@ #include "sls/sls_detector_defs.h" #include - namespace sls { class ClientInterface; @@ -40,16 +39,17 @@ class Receiver : private virtual slsDetectorDefs { int64_t getReceiverVersion(); /** - * Start Acquisition Call back (slsMultiReceiver writes data if file write enabled) - * if registerCallBackRawDataReady or registerCallBackRawDataModifyReady registered, - * users get data - * callback arguments are: + * Start Acquisition Call back (slsMultiReceiver writes data if file write + * enabled) if registerCallBackRawDataReady or + * registerCallBackRawDataModifyReady registered, users get data callback + * arguments are: * - file path * - file name prefix * - file index * - image size in bytes */ - void registerCallBackStartAcquisition(int (*func)(const std::string &, const std::string &, + void registerCallBackStartAcquisition(int (*func)(const std::string &, + const std::string &, uint64_t, size_t, void *), void *arg); @@ -66,9 +66,9 @@ class Receiver : private virtual slsDetectorDefs { * args to raw data ready callback are: * - sls_receiver_header frame metadata, * - pointer to data - * - image size in bytes + * - image size in bytes */ - void registerCallBackRawDataReady(void (*func)(sls_receiver_header *, + void registerCallBackRawDataReady(void (*func)(sls_receiver_header &, char *, size_t, void *), void *arg); @@ -81,7 +81,7 @@ class Receiver : private virtual slsDetectorDefs { * Can be modified to the new size to be written/streamed. (only smaller * value allowed). */ - void registerCallBackRawDataModifyReady(void (*func)(sls_receiver_header *, + void registerCallBackRawDataModifyReady(void (*func)(sls_receiver_header &, char *, size_t &, void *), void *arg); diff --git a/slsReceiverSoftware/src/Arping.cpp b/slsReceiverSoftware/src/Arping.cpp index a946f636f..a476dba39 100644 --- a/slsReceiverSoftware/src/Arping.cpp +++ b/slsReceiverSoftware/src/Arping.cpp @@ -19,8 +19,8 @@ void Arping::SetInterfacesAndIps(const int index, const std::string &interface, if (interface.empty() || ip.empty()) { throw RuntimeError("Could not arping. Interface name and ip not " - "set up for interface " + - std::to_string(index)); + "set up for interface " + + std::to_string(index)); } // create commands to arping std::ostringstream os; diff --git a/slsReceiverSoftware/src/Arping.h b/slsReceiverSoftware/src/Arping.h index 5fe30068c..80af8d1c5 100644 --- a/slsReceiverSoftware/src/Arping.h +++ b/slsReceiverSoftware/src/Arping.h @@ -37,4 +37,3 @@ class Arping { }; } // namespace sls - diff --git a/slsReceiverSoftware/src/BinaryDataFile.cpp b/slsReceiverSoftware/src/BinaryDataFile.cpp index 98103068a..42f7c3744 100644 --- a/slsReceiverSoftware/src/BinaryDataFile.cpp +++ b/slsReceiverSoftware/src/BinaryDataFile.cpp @@ -4,110 +4,112 @@ namespace sls { -BinaryDataFile::BinaryDataFile(const int index) : File(BINARY), index_(index) {} +BinaryDataFile::BinaryDataFile(const int index) : index(index) {} BinaryDataFile::~BinaryDataFile() { CloseFile(); } -void BinaryDataFile::CloseFile() { - if (fd_) { - fclose(fd_); - } - fd_ = nullptr; +slsDetectorDefs::fileFormat BinaryDataFile::GetFileFormat() const { + return BINARY; } -void BinaryDataFile::CreateFirstBinaryDataFile( - const std::string filePath, const std::string fileNamePrefix, - const uint64_t fileIndex, const bool overWriteEnable, const bool silentMode, - const int modulePos, const int numUnitsPerReadout, - const uint32_t udpPortNumber, const uint32_t maxFramesPerFile) { +void BinaryDataFile::CloseFile() { + if (fd) { + fclose(fd); + } + fd = nullptr; +} - subFileIndex_ = 0; - numFramesInFile_ = 0; +void BinaryDataFile::CreateFirstBinaryDataFile(const std::string &fNamePrefix, + const uint64_t fIndex, + const bool ovEnable, + const bool sMode, + const uint32_t uPortNumber, + const uint32_t mFramesPerFile) { - filePath_ = filePath; - fileNamePrefix_ = fileNamePrefix; - fileIndex_ = fileIndex; - overWriteEnable_ = overWriteEnable; - silentMode_ = silentMode; - detIndex_ = modulePos; - numUnitsPerReadout_ = numUnitsPerReadout; - udpPortNumber_ = udpPortNumber; - maxFramesPerFile_ = maxFramesPerFile; + subFileIndex = 0; + numFramesInFile = 0; + + fileNamePrefix = fNamePrefix; + fileIndex = fIndex; + overWriteEnable = ovEnable; + silentMode = sMode; + udpPortNumber = uPortNumber; + maxFramesPerFile = mFramesPerFile; CreateFile(); } void BinaryDataFile::CreateFile() { - numFramesInFile_ = 0; + numFramesInFile = 0; std::ostringstream os; - os << filePath_ << "/" << fileNamePrefix_ << "_d" - << (detIndex_ * numUnitsPerReadout_ + index_) << "_f" << subFileIndex_ - << '_' << fileIndex_ << ".raw"; - fileName_ = os.str(); + os << fileNamePrefix << "_f" << subFileIndex << '_' << fileIndex << ".raw"; + fileName = os.str(); - if (!overWriteEnable_) { - if (nullptr == (fd_ = fopen((const char *)fileName_.c_str(), "wx"))) { - fd_ = nullptr; - throw RuntimeError("Could not create/overwrite file " + - fileName_); + if (!overWriteEnable) { + if (nullptr == (fd = fopen(fileName.c_str(), "wx"))) { + fd = nullptr; + throw RuntimeError("Could not create/overwrite file " + fileName); } - } else if (nullptr == (fd_ = fopen((const char *)fileName_.c_str(), "w"))) { - fd_ = nullptr; - throw RuntimeError("Could not create file " + fileName_); + } else if (nullptr == (fd = fopen(fileName.c_str(), "w"))) { + fd = nullptr; + throw RuntimeError("Could not create file " + fileName); } // setting to no file buffering - setvbuf(fd_, nullptr, _IONBF, 0); + setvbuf(fd, nullptr, _IONBF, 0); - if (!silentMode_) { - LOG(logINFO) << "[" << udpPortNumber_ - << "]: Binary File created: " << fileName_; + if (!silentMode) { + LOG(logINFO) << "[" << udpPortNumber + << "]: Binary File created: " << fileName; } } -void BinaryDataFile::WriteToFile(char *buffer, const int buffersize, +void BinaryDataFile::WriteToFile(char *imageData, sls_receiver_header &header, + const int imageSize, const uint64_t currentFrameNumber, const uint32_t numPacketsCaught) { // check if maxframesperfile = 0 for infinite - if (maxFramesPerFile_ && (numFramesInFile_ >= maxFramesPerFile_)) { + if (maxFramesPerFile && (numFramesInFile >= maxFramesPerFile)) { CloseFile(); - ++subFileIndex_; + ++subFileIndex; CreateFile(); } - ++numFramesInFile_; + ++numFramesInFile; // write to file - int ret = 0; + size_t ret = 0; - // contiguous bitset + // contiguous bitset (write header + image) if (sizeof(sls_bitset) == sizeof(bitset_storage)) { - ret = fwrite(buffer, 1, buffersize, fd_); + ret = fwrite(&header, sizeof(sls_receiver_header) + imageSize, 1, fd); } // not contiguous bitset else { // write detector header - ret = fwrite(buffer, 1, sizeof(sls_detector_header), fd_); + ret = fwrite(&header, sizeof(sls_detector_header), 1, fd); // get contiguous representation of bit mask bitset_storage storage; memset(storage, 0, sizeof(bitset_storage)); - sls_bitset bits = *(sls_bitset *)(buffer + sizeof(sls_detector_header)); + sls_bitset bits = header.packetsMask; for (int i = 0; i < MAX_NUM_PACKETS; ++i) storage[i >> 3] |= (bits[i] << (i & 7)); // write bitmask - ret += fwrite((char *)storage, 1, sizeof(bitset_storage), fd_); + ret += fwrite(storage, sizeof(bitset_storage), 1, fd); // write data - ret += fwrite(buffer + sizeof(sls_detector_header), 1, - buffersize - sizeof(sls_receiver_header), fd_); + ret += fwrite(imageData, imageSize, 1, fd); } // if write error - if (ret != buffersize) { - throw RuntimeError(std::to_string(index_) + - " : Write to file failed for image number " + - std::to_string(currentFrameNumber)); + if (ret != imageSize + sizeof(sls_receiver_header)) { + throw RuntimeError( + std::to_string(index) + + " : Write to file failed for image number " + + std::to_string(currentFrameNumber) + ". Wrote " + + std::to_string(ret) + " bytes instead of " + + std::to_string(imageSize + sizeof(sls_receiver_header))); } } diff --git a/slsReceiverSoftware/src/BinaryDataFile.h b/slsReceiverSoftware/src/BinaryDataFile.h index b2de445de..a6e9bcbdb 100644 --- a/slsReceiverSoftware/src/BinaryDataFile.h +++ b/slsReceiverSoftware/src/BinaryDataFile.h @@ -12,38 +12,32 @@ class BinaryDataFile : private virtual slsDetectorDefs, public File { BinaryDataFile(const int index); ~BinaryDataFile(); + fileFormat GetFileFormat() const override; void CloseFile() override; - void CreateFirstBinaryDataFile(const std::string filePath, - const std::string fileNamePrefix, - const uint64_t fileIndex, - const bool overWriteEnable, - const bool silentMode, const int modulePos, - const int numUnitsPerReadout, - const uint32_t udpPortNumber, - const uint32_t maxFramesPerFile) override; + void CreateFirstBinaryDataFile(const std::string &fNamePrefix, + const uint64_t fIndex, const bool ovEnable, + const bool sMode, const uint32_t uPortNumber, + const uint32_t mFramesPerFile) override; - void WriteToFile(char *buffer, const int buffersize, - const uint64_t currentFrameNumber, + void WriteToFile(char *imageData, sls_receiver_header &header, + const int imageSize, const uint64_t currentFrameNumber, const uint32_t numPacketsCaught) override; private: void CreateFile(); - uint32_t index_; - FILE *fd_{nullptr}; - std::string fileName_; - uint32_t numFramesInFile_{0}; - uint32_t subFileIndex_{0}; + uint32_t index; + FILE *fd{nullptr}; + std::string fileName; + uint32_t numFramesInFile{0}; + uint32_t subFileIndex{0}; - std::string filePath_; - std::string fileNamePrefix_; - uint64_t fileIndex_{0}; - bool overWriteEnable_{false}; - bool silentMode_{false}; - int detIndex_{0}; - int numUnitsPerReadout_{0}; - uint32_t udpPortNumber_{0}; - uint32_t maxFramesPerFile_{0}; + std::string fileNamePrefix; + uint64_t fileIndex{0}; + bool overWriteEnable{false}; + bool silentMode{false}; + uint32_t udpPortNumber{0}; + uint32_t maxFramesPerFile{0}; }; } // namespace sls diff --git a/slsReceiverSoftware/src/ClientInterface.cpp b/slsReceiverSoftware/src/ClientInterface.cpp index c17accb2a..ce881e449 100644 --- a/slsReceiverSoftware/src/ClientInterface.cpp +++ b/slsReceiverSoftware/src/ClientInterface.cpp @@ -22,7 +22,6 @@ #include #include - namespace sls { using ns = std::chrono::nanoseconds; @@ -34,7 +33,6 @@ using Interface = ServerInterface; #define gettid() syscall(SYS_gettid) #endif - ClientInterface::~ClientInterface() { killTcpThread = true; LOG(logINFO) << "Shutting down TCP Socket on port " << portNumber; @@ -72,13 +70,13 @@ void ClientInterface::registerCallBackAcquisitionFinished(void (*func)(uint64_t, } void ClientInterface::registerCallBackRawDataReady( - void (*func)(sls_receiver_header *, char *, size_t, void *), void *arg) { + void (*func)(sls_receiver_header &, char *, size_t, void *), void *arg) { rawDataReadyCallBack = func; pRawDataReady = arg; } void ClientInterface::registerCallBackRawDataModifyReady( - void (*func)(sls_receiver_header *, char *, size_t &, void *), void *arg) { + void (*func)(sls_receiver_header &, char *, size_t &, void *), void *arg) { rawDataModifyReadyCallBack = func; pRawDataReady = arg; } @@ -1176,7 +1174,8 @@ int ClientInterface::get_additional_json_header(Interface &socket) { int ClientInterface::set_udp_socket_buffer_size(Interface &socket) { auto size = socket.Receive(); if (size == 0) { - throw RuntimeError("Receiver socket buffer size must be > 0."); + throw RuntimeError( + "Receiver socket buffer size must be greater than 0."); } if (size > 0) { verifyIdle(socket); diff --git a/slsReceiverSoftware/src/ClientInterface.h b/slsReceiverSoftware/src/ClientInterface.h index 248f60f2a..f060c654e 100644 --- a/slsReceiverSoftware/src/ClientInterface.h +++ b/slsReceiverSoftware/src/ClientInterface.h @@ -34,7 +34,8 @@ class ClientInterface : private virtual slsDetectorDefs { //***callback functions*** /** params: file path, file name, file index, image size */ - void registerCallBackStartAcquisition(int (*func)(const std::string &, const std::string &, + void registerCallBackStartAcquisition(int (*func)(const std::string &, + const std::string &, uint64_t, size_t, void *), void *arg); @@ -42,13 +43,13 @@ class ClientInterface : private virtual slsDetectorDefs { void registerCallBackAcquisitionFinished(void (*func)(uint64_t, void *), void *arg); - /** params: sls_receiver_header pointer, pointer to data, image size */ - void registerCallBackRawDataReady(void (*func)(sls_receiver_header *, + /** params: sls_receiver_header, pointer to data, image size */ + void registerCallBackRawDataReady(void (*func)(sls_receiver_header &, char *, size_t, void *), void *arg); - /** params: sls_receiver_header pointer, pointer to data, reference to image size */ - void registerCallBackRawDataModifyReady(void (*func)(sls_receiver_header *, + /** params: sls_receiver_header, pointer to data, reference to image size */ + void registerCallBackRawDataModifyReady(void (*func)(sls_receiver_header &, char *, size_t &, void *), void *arg); @@ -180,19 +181,18 @@ class ClientInterface : private virtual slsDetectorDefs { } } - int (ClientInterface::*flist[NUM_REC_FUNCTIONS])( - ServerInterface &socket); + int (ClientInterface::*flist[NUM_REC_FUNCTIONS])(ServerInterface &socket); //***callback parameters*** - int (*startAcquisitionCallBack)(const std::string &, const std::string &, uint64_t, size_t, - void *) = nullptr; + int (*startAcquisitionCallBack)(const std::string &, const std::string &, + uint64_t, size_t, void *) = nullptr; void *pStartAcquisition{nullptr}; void (*acquisitionFinishedCallBack)(uint64_t, void *) = nullptr; void *pAcquisitionFinished{nullptr}; - void (*rawDataReadyCallBack)(sls_receiver_header *, char *, size_t, + void (*rawDataReadyCallBack)(sls_receiver_header &, char *, size_t, void *) = nullptr; - void (*rawDataModifyReadyCallBack)(sls_receiver_header *, char *, size_t &, + void (*rawDataModifyReadyCallBack)(sls_receiver_header &, char *, size_t &, void *) = nullptr; void *pRawDataReady{nullptr}; diff --git a/slsReceiverSoftware/src/DataProcessor.cpp b/slsReceiverSoftware/src/DataProcessor.cpp index 638b0b99b..6e9b1e854 100644 --- a/slsReceiverSoftware/src/DataProcessor.cpp +++ b/slsReceiverSoftware/src/DataProcessor.cpp @@ -26,72 +26,82 @@ namespace sls { -const std::string DataProcessor::typeName_ = "DataProcessor"; +const std::string DataProcessor::typeName = "DataProcessor"; -DataProcessor::DataProcessor(int index, detectorType detectorType, Fifo *fifo, - bool *dataStreamEnable, - uint32_t *streamingFrequency, - uint32_t *streamingTimerInMs, - uint32_t *streamingStartFnum, bool *framePadding, - std::vector *ctbDbitList, int *ctbDbitOffset, - int *ctbAnalogDataBytes) - : ThreadObject(index, typeName_), fifo_(fifo), detectorType_(detectorType), - dataStreamEnable_(dataStreamEnable), - streamingFrequency_(streamingFrequency), - streamingTimerInMs_(streamingTimerInMs), - streamingStartFnum_(streamingStartFnum), framePadding_(framePadding), - ctbDbitList_(ctbDbitList), ctbDbitOffset_(ctbDbitOffset), - ctbAnalogDataBytes_(ctbAnalogDataBytes) { +DataProcessor::DataProcessor(int index) : ThreadObject(index, typeName) { LOG(logDEBUG) << "DataProcessor " << index << " created"; } DataProcessor::~DataProcessor() { DeleteFiles(); } -bool DataProcessor::GetStartedFlag() const { return startedFlag_; } +bool DataProcessor::GetStartedFlag() const { return startedFlag; } -void DataProcessor::SetFifo(Fifo *fifo) { fifo_ = fifo; } +void DataProcessor::SetFifo(Fifo *f) { fifo = f; } -void DataProcessor::SetActivate(bool enable) { activated_ = enable; } +void DataProcessor::SetGeneralData(GeneralData *g) { generalData = g; } -void DataProcessor::SetReceiverROI(ROI roi) { - receiverRoi_ = roi; - receiverRoiEnabled_ = receiverRoi_.completeRoi() ? false : true; - receiverNoRoi_ = receiverRoi_.noRoi(); +void DataProcessor::SetActivate(bool enable) { activated = enable; } + +void DataProcessor::SetReceiverROI(ROI roi) { + receiverRoi = roi; + receiverRoiEnabled = receiverRoi.completeRoi() ? false : true; + receiverNoRoi = receiverRoi.noRoi(); } +void DataProcessor::SetDataStreamEnable(bool enable) { + dataStreamEnable = enable; +} + +void DataProcessor::SetStreamingFrequency(uint32_t value) { + streamingFrequency = value; +} + +void DataProcessor::SetStreamingTimerInMs(uint32_t value) { + streamingTimerInMs = value; +} + +void DataProcessor::SetStreamingStartFnum(uint32_t value) { + streamingStartFnum = value; +} + +void DataProcessor::SetFramePadding(bool enable) { framePadding = enable; } + +void DataProcessor::SetCtbDbitList(std::vector value) { + ctbDbitList = value; +} + +void DataProcessor::SetCtbDbitOffset(int value) { ctbDbitOffset = value; } + void DataProcessor::ResetParametersforNewAcquisition() { StopRunning(); - startedFlag_ = false; - numFramesCaught_ = 0; - firstIndex_ = 0; - currentFrameIndex_ = 0; - firstStreamerFrame_ = true; - streamCurrentFrame_ = false; - completeImageToStreamBeforeCropping = make_unique(generalData_->imageSize); + startedFlag = false; + numFramesCaught = 0; + firstIndex = 0; + currentFrameIndex = 0; + firstStreamerFrame = true; + streamCurrentFrame = false; + completeImageToStreamBeforeCropping = + make_unique(generalData->imageSize); } void DataProcessor::RecordFirstIndex(uint64_t fnum) { // listen to this fnum, later +1 - currentFrameIndex_ = fnum; - startedFlag_ = true; - firstIndex_ = fnum; - LOG(logDEBUG1) << index << " First Index:" << firstIndex_; -} - -void DataProcessor::SetGeneralData(GeneralData *generalData) { - generalData_ = generalData; + currentFrameIndex = fnum; + startedFlag = true; + firstIndex = fnum; + LOG(logDEBUG1) << index << " First Index:" << firstIndex; } void DataProcessor::CloseFiles() { - if (dataFile_) - dataFile_->CloseFile(); + if (dataFile) + dataFile->CloseFile(); } void DataProcessor::DeleteFiles() { CloseFiles(); - delete dataFile_; - dataFile_ = nullptr; + delete dataFile; + dataFile = nullptr; } void DataProcessor::SetupFileWriter(const bool filewriteEnable, const fileFormat fileFormatType, @@ -101,60 +111,59 @@ void DataProcessor::SetupFileWriter(const bool filewriteEnable, switch (fileFormatType) { #ifdef HDF5C case HDF5: - dataFile_ = new HDF5DataFile(index, hdf5LibMutex); + dataFile = new HDF5DataFile(index, hdf5LibMutex); break; #endif case BINARY: - dataFile_ = new BinaryDataFile(index); + dataFile = new BinaryDataFile(index); break; default: - throw RuntimeError( - "Unknown file format (compile with hdf5 flags"); + throw RuntimeError("Unknown file format (compile with hdf5 flags"); } } } -void DataProcessor::CreateFirstFiles( - const std::string &filePath, const std::string &fileNamePrefix, - const uint64_t fileIndex, const bool overWriteEnable, const bool silentMode, - const int modulePos, const int numUnitsPerReadout, - const uint32_t udpPortNumber, const uint32_t maxFramesPerFile, - const uint64_t numImages, const uint32_t dynamicRange, - const bool detectorDataStream) { - if (dataFile_ == nullptr) { +void DataProcessor::CreateFirstFiles(const std::string &fileNamePrefix, + const uint64_t fileIndex, + const bool overWriteEnable, + const bool silentMode, + const uint32_t udpPortNumber, + const uint64_t numImages, + const bool detectorDataStream) { + if (dataFile == nullptr) { throw RuntimeError("file object not contstructed"); } CloseFiles(); // deactivated (half module/ single port or no roi), dont write file - if (!activated_ || !detectorDataStream || receiverNoRoi_) { + if (!activated || !detectorDataStream || receiverNoRoi) { return; } #ifdef HDF5C - int nx = generalData_->nPixelsX; - int ny = generalData_->nPixelsY; - if (receiverRoiEnabled_) { - nx = receiverRoi_.xmax - receiverRoi_.xmin + 1; - ny = receiverRoi_.ymax - receiverRoi_.ymin + 1; - if (receiverRoi_.ymax == -1 || receiverRoi_.ymin == -1) { + int nx = generalData->nPixelsX; + int ny = generalData->nPixelsY; + if (receiverRoiEnabled) { + nx = receiverRoi.xmax - receiverRoi.xmin + 1; + ny = receiverRoi.ymax - receiverRoi.ymin + 1; + if (receiverRoi.ymax == -1 || receiverRoi.ymin == -1) { ny = 1; } } #endif - switch (dataFile_->GetFileFormat()) { + switch (dataFile->GetFileFormat()) { #ifdef HDF5C case HDF5: - dataFile_->CreateFirstHDF5DataFile( - filePath, fileNamePrefix, fileIndex, overWriteEnable, silentMode, - modulePos, numUnitsPerReadout, udpPortNumber, maxFramesPerFile, - numImages, nx, ny, dynamicRange); + dataFile->CreateFirstHDF5DataFile( + fileNamePrefix, fileIndex, overWriteEnable, silentMode, + udpPortNumber, generalData->framesPerFile, numImages, nx, ny, + generalData->dynamicRange); break; #endif case BINARY: - dataFile_->CreateFirstBinaryDataFile( - filePath, fileNamePrefix, fileIndex, overWriteEnable, silentMode, - modulePos, numUnitsPerReadout, udpPortNumber, maxFramesPerFile); + dataFile->CreateFirstBinaryDataFile( + fileNamePrefix, fileIndex, overWriteEnable, silentMode, + udpPortNumber, generalData->framesPerFile); break; default: throw RuntimeError("Unknown file format (compile with hdf5 flags"); @@ -163,32 +172,32 @@ void DataProcessor::CreateFirstFiles( #ifdef HDF5C uint32_t DataProcessor::GetFilesInAcquisition() const { - if (dataFile_ == nullptr) { + if (dataFile == nullptr) { throw RuntimeError("No data file object created to get number of " - "files in acquiistion"); + "files in acquiistion"); } - return dataFile_->GetFilesInAcquisition(); + return dataFile->GetFilesInAcquisition(); } std::string DataProcessor::CreateVirtualFile( const std::string &filePath, const std::string &fileNamePrefix, const uint64_t fileIndex, const bool overWriteEnable, const bool silentMode, - const int modulePos, const int numUnitsPerReadout, - const uint32_t maxFramesPerFile, const uint64_t numImages, - const int numModX, const int numModY, const uint32_t dynamicRange, - std::mutex *hdf5LibMutex) { + const int modulePos, const uint64_t numImages, const int numModX, + const int numModY, std::mutex *hdf5LibMutex) { - if (receiverRoiEnabled_) { - throw std::runtime_error("Skipping virtual hdf5 file since rx_roi is enabled."); + if (receiverRoiEnabled) { + throw std::runtime_error( + "Skipping virtual hdf5 file since rx_roi is enabled."); } - bool gotthard25um = - ((detectorType_ == GOTTHARD || detectorType_ == GOTTHARD2) && - (numModX * numModY) == 2); + bool gotthard25um = ((generalData->detType == GOTTHARD || + generalData->detType == GOTTHARD2) && + (numModX * numModY) == 2); - // maxframesperfile = 0 for infinite files + // 0 for infinite files uint32_t framesPerFile = - ((maxFramesPerFile == 0) ? numFramesCaught_ : maxFramesPerFile); + ((generalData->framesPerFile == 0) ? numFramesCaught + : generalData->framesPerFile); // TODO: assumption 1: create virtual file even if no data in other // files (they exist anyway) assumption2: virtual file max frame index @@ -196,10 +205,10 @@ std::string DataProcessor::CreateVirtualFile( // stop acquisition) return masterFileUtility::CreateVirtualHDF5File( filePath, fileNamePrefix, fileIndex, overWriteEnable, silentMode, - modulePos, numUnitsPerReadout, framesPerFile, - generalData_->nPixelsX, generalData_->nPixelsY, dynamicRange, - numFramesCaught_, numModX, numModY, dataFile_->GetPDataType(), - dataFile_->GetParameterNames(), dataFile_->GetParameterDataTypes(), + modulePos, generalData->numUDPInterfaces, framesPerFile, + generalData->nPixelsX, generalData->nPixelsY, generalData->dynamicRange, + numFramesCaught, numModX, numModY, dataFile->GetPDataType(), + dataFile->GetParameterNames(), dataFile->GetParameterDataTypes(), hdf5LibMutex, gotthard25um); } @@ -208,16 +217,17 @@ void DataProcessor::LinkFileInMaster(const std::string &masterFileName, const bool silentMode, std::mutex *hdf5LibMutex) { - if (receiverRoiEnabled_) { - throw std::runtime_error("Should not be here, roi with hdf5 virtual should throw."); + if (receiverRoiEnabled) { + throw std::runtime_error( + "Should not be here, roi with hdf5 virtual should throw."); } std::string fname{virtualFileName}, masterfname{masterFileName}; // if no virtual file, link data file if (virtualFileName.empty()) { - fname = dataFile_->GetFileName(); + fname = dataFile->GetFileName(); } masterFileUtility::LinkHDF5FileInMaster(masterfname, fname, - dataFile_->GetParameterNames(), + dataFile->GetParameterNames(), silentMode, hdf5LibMutex); } #endif @@ -228,7 +238,7 @@ std::string DataProcessor::CreateMasterFile( const fileFormat fileFormatType, MasterAttributes *attr, std::mutex *hdf5LibMutex) { - attr->framesInFile = numFramesCaught_; + attr->framesInFile = numFramesCaught; std::unique_ptr masterFile{nullptr}; switch (fileFormatType) { @@ -249,35 +259,38 @@ std::string DataProcessor::CreateMasterFile( void DataProcessor::ThreadExecution() { char *buffer = nullptr; - fifo_->PopAddress(buffer); + fifo->PopAddress(buffer); LOG(logDEBUG5) << "DataProcessor " << index << ", " << std::hex << static_cast(buffer) << std::dec << ":" << buffer; + auto *memImage = reinterpret_cast(buffer); // check dummy - auto numBytes = *reinterpret_cast(buffer); - LOG(logDEBUG1) << "DataProcessor " << index << ", Numbytes:" << numBytes; - if (numBytes == DUMMY_PACKET_VALUE) { + LOG(logDEBUG1) << "DataProcessor " << index + << ", Numbytes:" << memImage->size; + if (memImage->size == DUMMY_PACKET_VALUE) { StopProcessing(buffer); return; } try { - ProcessAnImage(buffer); + ProcessAnImage(memImage->header, memImage->size, memImage->firstIndex, + memImage->data); } catch (const std::exception &e) { - fifo_->FreeAddress(buffer); + fifo->FreeAddress(buffer); return; } // stream (if time/freq to stream) or free - if (streamCurrentFrame_) { + if (streamCurrentFrame) { // copy the complete image back if roi enabled - if (receiverRoiEnabled_) { - (*((uint32_t *)buffer)) = generalData_->imageSize; - memcpy(buffer + generalData_->fifoBufferHeaderSize, &completeImageToStreamBeforeCropping[0], generalData_->imageSize); + if (receiverRoiEnabled) { + memImage->size = generalData->imageSize; + memcpy(memImage->data, &completeImageToStreamBeforeCropping[0], + generalData->imageSize); } - fifo_->PushAddressToStream(buffer); + fifo->PushAddressToStream(buffer); } else { - fifo_->FreeAddress(buffer); + fifo->FreeAddress(buffer); } } @@ -285,107 +298,86 @@ void DataProcessor::StopProcessing(char *buf) { LOG(logDEBUG1) << "DataProcessing " << index << ": Dummy"; // stream or free - if (*dataStreamEnable_) - fifo_->PushAddressToStream(buf); + if (dataStreamEnable) + fifo->PushAddressToStream(buf); else - fifo_->FreeAddress(buf); + fifo->FreeAddress(buf); CloseFiles(); StopRunning(); LOG(logDEBUG1) << index << ": Processing Completed"; } -void DataProcessor::ProcessAnImage(char *buf) { - - auto *rheader = - reinterpret_cast(buf + FIFO_HEADER_NUMBYTES); - sls_detector_header header = rheader->detHeader; - uint64_t fnum = header.frameNumber; - currentFrameIndex_ = fnum; - numFramesCaught_++; - uint32_t nump = header.packetNumber; - +void DataProcessor::ProcessAnImage(sls_receiver_header &header, size_t &size, + size_t &firstImageIndex, char *data) { + uint64_t fnum = header.detHeader.frameNumber; LOG(logDEBUG1) << "DataProcessing " << index << ": fnum:" << fnum; + currentFrameIndex = fnum; + numFramesCaught++; + uint32_t nump = header.detHeader.packetNumber; - if (!startedFlag_) { + if (!startedFlag) { RecordFirstIndex(fnum); - if (*dataStreamEnable_) { + if (dataStreamEnable) { // restart timer - clock_gettime(CLOCK_REALTIME, &timerbegin_); - timerbegin_.tv_sec -= (*streamingTimerInMs_) / 1000; - timerbegin_.tv_nsec -= ((*streamingTimerInMs_) % 1000) * 1000000; + clock_gettime(CLOCK_REALTIME, &timerbegin); + timerbegin.tv_sec -= streamingTimerInMs / 1000; + timerbegin.tv_nsec -= (streamingTimerInMs % 1000) * 1000000; // to send first image - currentFreqCount_ = *streamingFrequency_ - *streamingStartFnum_; + currentFreqCount = streamingFrequency - streamingStartFnum; } } // frame padding - if (activated_ && *framePadding_ && nump < generalData_->packetsPerFrame) - PadMissingPackets(buf); + if (framePadding && nump < generalData->packetsPerFrame) + PadMissingPackets(header, data); // rearrange ctb digital bits (if ctbDbitlist is not empty) - if (!(*ctbDbitList_).empty()) { - RearrangeDbitData(buf); + if (!ctbDbitList.empty()) { + RearrangeDbitData(size, data); } - // 'stream Image' check has to be done here before crop image + // 'stream Image' check has to be done here before crop image // stream (if time/freq to stream) or free - if (*dataStreamEnable_ && SendToStreamer()) { - // if first frame to stream, add frame index to fifo header (might - // not be the first) - if (firstStreamerFrame_) { - firstStreamerFrame_ = false; - (*((uint32_t *)(buf + FIFO_DATASIZE_NUMBYTES))) = - (uint32_t)(fnum - firstIndex_); + if (dataStreamEnable && SendToStreamer()) { + if (firstStreamerFrame) { + firstStreamerFrame = false; + // write to memory structure of first streamer frame + firstImageIndex = firstIndex; } - streamCurrentFrame_ = true; + streamCurrentFrame = true; } else { - streamCurrentFrame_ = false; + streamCurrentFrame = false; } - - if (receiverRoiEnabled_) { + if (receiverRoiEnabled) { // copy the complete image to stream before cropping - if (streamCurrentFrame_) { - memcpy(&completeImageToStreamBeforeCropping[0], buf + generalData_->fifoBufferHeaderSize, generalData_->imageSize); + if (streamCurrentFrame) { + memcpy(&completeImageToStreamBeforeCropping[0], data, + generalData->imageSize); } - CropImage(buf); + CropImage(size, data); } try { // normal call back if (rawDataReadyCallBack != nullptr) { - std::size_t dsize = *reinterpret_cast(buf); - rawDataReadyCallBack(rheader, - buf + FIFO_HEADER_NUMBYTES + - sizeof(sls_receiver_header), - dsize, pRawDataReady); + rawDataReadyCallBack(header, data, size, pRawDataReady); } // call back with modified size else if (rawDataModifyReadyCallBack != nullptr) { - std::size_t revsize = *reinterpret_cast(buf); - rawDataModifyReadyCallBack(rheader, - buf + FIFO_HEADER_NUMBYTES + - sizeof(sls_receiver_header), - revsize, pRawDataReady); - (*((uint32_t *)buf)) = revsize; + rawDataModifyReadyCallBack(header, data, size, pRawDataReady); } } catch (const std::exception &e) { - throw RuntimeError("Get Data Callback Error: " + - std::string(e.what())); + throw RuntimeError("Get Data Callback Error: " + std::string(e.what())); } // write to file - if (dataFile_) { + if (dataFile) { try { - dataFile_->WriteToFile( - buf + FIFO_HEADER_NUMBYTES, - sizeof(sls_receiver_header) + - (uint32_t)(*((uint32_t *)buf)), //+ size of data (resizable - // from previous call back - fnum - firstIndex_, nump); + dataFile->WriteToFile(data, header, size, fnum - firstIndex, nump); } catch (const RuntimeError &e) { ; // ignore write exception for now (TODO: send error message // via stopReceiver tcp) @@ -395,7 +387,7 @@ void DataProcessor::ProcessAnImage(char *buf) { bool DataProcessor::SendToStreamer() { // skip - if ((*streamingFrequency_) == 0u) { + if (streamingFrequency == 0u) { if (!CheckTimer()) return false; } else { @@ -409,9 +401,9 @@ bool DataProcessor::CheckTimer() { struct timespec end; clock_gettime(CLOCK_REALTIME, &end); - auto elapsed_s = (end.tv_sec - timerbegin_.tv_sec) + - (end.tv_nsec - timerbegin_.tv_nsec) / 1e9; - double timer_s = *streamingTimerInMs_ / 1e3; + auto elapsed_s = (end.tv_sec - timerbegin.tv_sec) + + (end.tv_nsec - timerbegin.tv_nsec) / 1e9; + double timer_s = streamingTimerInMs / 1e3; LOG(logDEBUG1) << index << " Timer elapsed time:" << elapsed_s << " seconds"; @@ -421,47 +413,45 @@ bool DataProcessor::CheckTimer() { return false; // restart timer - clock_gettime(CLOCK_REALTIME, &timerbegin_); + clock_gettime(CLOCK_REALTIME, &timerbegin); return true; } bool DataProcessor::CheckCount() { - if (currentFreqCount_ == *streamingFrequency_) { - currentFreqCount_ = 1; + if (currentFreqCount == streamingFrequency) { + currentFreqCount = 1; return true; } - currentFreqCount_++; + currentFreqCount++; return false; } void DataProcessor::registerCallBackRawDataReady( - void (*func)(sls_receiver_header *, char *, size_t, void *), void *arg) { + void (*func)(sls_receiver_header &, char *, size_t, void *), void *arg) { rawDataReadyCallBack = func; pRawDataReady = arg; } void DataProcessor::registerCallBackRawDataModifyReady( - void (*func)(sls_receiver_header *, char *, size_t &, void *), void *arg) { + void (*func)(sls_receiver_header &, char *, size_t &, void *), void *arg) { rawDataModifyReadyCallBack = func; pRawDataReady = arg; } -void DataProcessor::PadMissingPackets(char *buf) { +void DataProcessor::PadMissingPackets(sls_receiver_header header, char *data) { LOG(logDEBUG) << index << ": Padding Missing Packets"; - uint32_t pperFrame = generalData_->packetsPerFrame; - auto *header = - reinterpret_cast(buf + FIFO_HEADER_NUMBYTES); - uint32_t nmissing = pperFrame - header->detHeader.packetNumber; - sls_bitset pmask = header->packetsMask; + uint32_t pperFrame = generalData->packetsPerFrame; - uint32_t dsize = generalData_->dataSize; - if (detectorType_ == GOTTHARD2 && index != 0) { - dsize = generalData_->vetoDataSize; + uint32_t nmissing = pperFrame - header.detHeader.packetNumber; + sls_bitset pmask = header.packetsMask; + + uint32_t dsize = generalData->dataSize; + if (generalData->detType == GOTTHARD2 && index != 0) { + dsize = generalData->vetoDataSize; } - uint32_t fifohsize = generalData_->fifoBufferHeaderSize; uint32_t corrected_dsize = - dsize - ((pperFrame * dsize) - generalData_->imageSize); + dsize - ((pperFrame * dsize) - generalData->imageSize); LOG(logDEBUG1) << "bitmask: " << pmask.to_string(); for (unsigned int pnum = 0; pnum < pperFrame; ++pnum) { @@ -478,26 +468,26 @@ void DataProcessor::PadMissingPackets(char *buf) { << std::endl; // missing packet - switch (detectorType_) { + switch (generalData->detType) { // for gotthard, 1st packet: 4 bytes fnum, CACA + CACA, 639*2 bytes // data // 2nd packet: 4 bytes fnum, previous 1*2 bytes data + // 640*2 bytes data !! case GOTTHARD: if (pnum == 0u) - memset(buf + fifohsize + (pnum * dsize), 0xFF, dsize - 2); + memset(data + (pnum * dsize), 0xFF, dsize - 2); else - memset(buf + fifohsize + (pnum * dsize), 0xFF, dsize + 2); + memset(data + (pnum * dsize), 0xFF, dsize + 2); break; case CHIPTESTBOARD: case MOENCH: if (pnum == (pperFrame - 1)) - memset(buf + fifohsize + (pnum * dsize), 0xFF, corrected_dsize); + memset(data + (pnum * dsize), 0xFF, corrected_dsize); else - memset(buf + fifohsize + (pnum * dsize), 0xFF, dsize); + memset(data + (pnum * dsize), 0xFF, dsize); break; default: - memset(buf + fifohsize + (pnum * dsize), 0xFF, dsize); + memset(data + (pnum * dsize), 0xFF, dsize); break; } --nmissing; @@ -505,11 +495,10 @@ void DataProcessor::PadMissingPackets(char *buf) { } /** ctb specific */ -void DataProcessor::RearrangeDbitData(char *buf) { +void DataProcessor::RearrangeDbitData(size_t &size, char *data) { + int nAnalogDataBytes = generalData->GetNumberOfAnalogDatabytes(); // TODO! (Erik) Refactor and add tests - int totalSize = (int)(*((uint32_t *)buf)); - int ctbDigitalDataBytes = - totalSize - (*ctbAnalogDataBytes_) - (*ctbDbitOffset_); + int ctbDigitalDataBytes = size - nAnalogDataBytes - ctbDbitOffset; // no digital data if (ctbDigitalDataBytes == 0) { @@ -519,20 +508,17 @@ void DataProcessor::RearrangeDbitData(char *buf) { } const int numSamples = (ctbDigitalDataBytes / sizeof(uint64_t)); - const int digOffset = FIFO_HEADER_NUMBYTES + sizeof(sls_receiver_header) + - (*ctbAnalogDataBytes_); // ceil as numResult8Bits could be decimal - const int numResult8Bits = - ceil((numSamples * (*ctbDbitList_).size()) / 8.00); + const int numResult8Bits = ceil((numSamples * ctbDbitList.size()) / 8.00); std::vector result(numResult8Bits); uint8_t *dest = &result[0]; - auto *source = (uint64_t *)(buf + digOffset + (*ctbDbitOffset_)); + auto *source = (uint64_t *)(data + nAnalogDataBytes + ctbDbitOffset); // loop through digital bit enable vector int bitoffset = 0; - for (auto bi : (*ctbDbitList_)) { + for (auto bi : ctbDbitList) { // where numbits * numsamples is not a multiple of 8 if (bitoffset != 0) { bitoffset = 0; @@ -553,18 +539,19 @@ void DataProcessor::RearrangeDbitData(char *buf) { } } - // copy back to buf and update size - memcpy(buf + digOffset, result.data(), numResult8Bits * sizeof(uint8_t)); - (*((uint32_t *)buf)) = numResult8Bits * sizeof(uint8_t); + // copy back to memory and update size + memcpy(data + nAnalogDataBytes, result.data(), + numResult8Bits * sizeof(uint8_t)); + size = numResult8Bits * sizeof(uint8_t); } -void DataProcessor::CropImage(char *buf) { - LOG(logDEBUG) << "Cropping Image to ROI " << ToString(receiverRoi_); - int nPixelsX = generalData_->nPixelsX; - int xmin = receiverRoi_.xmin; - int xmax = receiverRoi_.xmax; - int ymin = receiverRoi_.ymin; - int ymax = receiverRoi_.ymax; +void DataProcessor::CropImage(size_t &size, char *data) { + LOG(logDEBUG) << "Cropping Image to ROI " << ToString(receiverRoi); + int nPixelsX = generalData->nPixelsX; + int xmin = receiverRoi.xmin; + int xmax = receiverRoi.xmax; + int ymin = receiverRoi.ymin; + int ymax = receiverRoi.ymax; int xwidth = xmax - xmin + 1; int ywidth = ymax - ymin + 1; if (ymin == -1 || ymax == -1) { @@ -573,16 +560,16 @@ void DataProcessor::CropImage(char *buf) { } // calculate total roi size - double bytesPerPixel = generalData_->dynamicRange / 8.00; + double bytesPerPixel = generalData->dynamicRange / 8.00; int startOffset = (int)((nPixelsX * ymin + xmin) * bytesPerPixel); - // write size into fifo buffer header + // write size into memory std::size_t roiImageSize = xwidth * ywidth * bytesPerPixel; LOG(logDEBUG) << "roiImageSize:" << roiImageSize; - (*((uint32_t *)buf)) = roiImageSize; + size = roiImageSize; // copy the roi to the beginning of the image - char *dstOffset = buf + generalData_->fifoBufferHeaderSize; + char *dstOffset = data; char *srcOffset = dstOffset + startOffset; // entire width @@ -594,7 +581,7 @@ void DataProcessor::CropImage(char *buf) { for (int y = 0; y != ywidth; ++y) { memcpy(dstOffset, srcOffset, xwidth * bytesPerPixel); dstOffset += (int)(xwidth * bytesPerPixel); - srcOffset += (int)(generalData_->nPixelsX * bytesPerPixel); + srcOffset += (int)(generalData->nPixelsX * bytesPerPixel); } } } diff --git a/slsReceiverSoftware/src/DataProcessor.h b/slsReceiverSoftware/src/DataProcessor.h index ce54e0b3d..65ccb7ccc 100644 --- a/slsReceiverSoftware/src/DataProcessor.h +++ b/slsReceiverSoftware/src/DataProcessor.h @@ -29,46 +29,45 @@ struct MasterAttributes; class DataProcessor : private virtual slsDetectorDefs, public ThreadObject { public: - DataProcessor(int index, detectorType detectorType, Fifo *fifo, - bool *dataStreamEnable, uint32_t *streamingFrequency, - uint32_t *streamingTimerInMs, uint32_t *streamingStartFnum, - bool *framePadding, std::vector *ctbDbitList, - int *ctbDbitOffset, int *ctbAnalogDataBytes); - + DataProcessor(int index); ~DataProcessor() override; bool GetStartedFlag() const; void SetFifo(Fifo *f); - void SetActivate(bool enable); - void SetReceiverROI(ROI roi); - void ResetParametersforNewAcquisition(); void SetGeneralData(GeneralData *generalData); + void SetActivate(bool enable); + void SetReceiverROI(ROI roi); + void SetDataStreamEnable(bool enable); + void SetStreamingFrequency(uint32_t value); + void SetStreamingTimerInMs(uint32_t value); + void SetStreamingStartFnum(uint32_t value); + void SetFramePadding(bool enable); + void SetCtbDbitList(std::vector value); + void SetCtbDbitOffset(int value); + + void ResetParametersforNewAcquisition(); void CloseFiles(); void DeleteFiles(); void SetupFileWriter(const bool filewriteEnable, const fileFormat fileFormatType, std::mutex *hdf5LibMutex); - void CreateFirstFiles(const std::string &filePath, - const std::string &fileNamePrefix, + void CreateFirstFiles(const std::string &fileNamePrefix, const uint64_t fileIndex, const bool overWriteEnable, - const bool silentMode, const int modulePos, - const int numUnitsPerReadout, - const uint32_t udpPortNumber, - const uint32_t maxFramesPerFile, - const uint64_t numImages, const uint32_t dynamicRange, + const bool silentMode, const uint32_t udpPortNumber, + const uint64_t numImages, const bool detectorDataStream); #ifdef HDF5C uint32_t GetFilesInAcquisition() const; - std::string CreateVirtualFile( - const std::string &filePath, const std::string &fileNamePrefix, - const uint64_t fileIndex, const bool overWriteEnable, - const bool silentMode, const int modulePos, - const int numUnitsPerReadout, const uint32_t maxFramesPerFile, - const uint64_t numImages, const int numModX, const int numModY, - const uint32_t dynamicRange, std::mutex *hdf5LibMutex); + std::string CreateVirtualFile(const std::string &filePath, + const std::string &fileNamePrefix, + const uint64_t fileIndex, + const bool overWriteEnable, + const bool silentMode, const int modulePos, + const uint64_t numImages, const int numModX, + const int numModY, std::mutex *hdf5LibMutex); void LinkFileInMaster(const std::string &masterFileName, const std::string &virtualFileName, const bool silentMode, std::mutex *hdf5LibMutex); @@ -82,14 +81,13 @@ class DataProcessor : private virtual slsDetectorDefs, public ThreadObject { MasterAttributes *attr, std::mutex *hdf5LibMutex); - /** params: sls_receiver_header pointer, pointer to data, image size */ - void registerCallBackRawDataReady(void (*func)(sls_receiver_header *, + /** params: sls_receiver_header, pointer to data, image size */ + void registerCallBackRawDataReady(void (*func)(sls_receiver_header &, char *, size_t, void *), void *arg); - /** params: sls_receiver_header pointer, pointer to data, reference to image - * size */ - void registerCallBackRawDataModifyReady(void (*func)(sls_receiver_header *, + /** params: sls_receiver_header, pointer to data, reference to image size */ + void registerCallBackRawDataModifyReady(void (*func)(sls_receiver_header &, char *, size_t &, void *), void *arg); @@ -114,7 +112,8 @@ class DataProcessor : private virtual slsDetectorDefs, public ThreadObject { * Process an image popped from fifo, * write to file if fw enabled & update parameters */ - void ProcessAnImage(char *buf); + void ProcessAnImage(sls_receiver_header &header, size_t &size, + size_t &firstImageIndex, char *data); /** * Calls CheckTimer and CheckCount for streaming frequency and timer @@ -137,52 +136,50 @@ class DataProcessor : private virtual slsDetectorDefs, public ThreadObject { */ bool CheckCount(); - void PadMissingPackets(char *buf); + void PadMissingPackets(sls_receiver_header header, char *data); /** * Align corresponding digital bits together (CTB only if ctbDbitlist is not * empty) */ - void RearrangeDbitData(char *buf); + void RearrangeDbitData(size_t &size, char *data); - void CropImage(char *buf); + void CropImage(size_t &size, char *data); - static const std::string typeName_; + static const std::string typeName; - const GeneralData *generalData_{nullptr}; - Fifo *fifo_; - detectorType detectorType_; - bool *dataStreamEnable_; - bool activated_{false}; - ROI receiverRoi_{}; - bool receiverRoiEnabled_{false}; - bool receiverNoRoi_{false}; + GeneralData *generalData{nullptr}; + Fifo *fifo; + bool dataStreamEnable; + bool activated{false}; + ROI receiverRoi{}; + bool receiverRoiEnabled{false}; + bool receiverNoRoi{false}; std::unique_ptr completeImageToStreamBeforeCropping; /** if 0, sending random images with a timer */ - uint32_t *streamingFrequency_; - uint32_t *streamingTimerInMs_; - uint32_t *streamingStartFnum_; - uint32_t currentFreqCount_{0}; - struct timespec timerbegin_ {}; - bool *framePadding_; - std::vector *ctbDbitList_; - int *ctbDbitOffset_; - int *ctbAnalogDataBytes_; - std::atomic startedFlag_{false}; - std::atomic firstIndex_{0}; + uint32_t streamingFrequency; + uint32_t streamingTimerInMs; + uint32_t streamingStartFnum; + uint32_t currentFreqCount{0}; + struct timespec timerbegin {}; + bool framePadding; + std::vector ctbDbitList; + int ctbDbitOffset; + std::atomic startedFlag{false}; + std::atomic firstIndex{0}; // for statistics - uint64_t numFramesCaught_{0}; + uint64_t numFramesCaught{0}; /** Frame Number of latest processed frame number */ - std::atomic currentFrameIndex_{0}; + std::atomic currentFrameIndex{0}; /** first streamer frame to add frame index in fifo header */ - bool firstStreamerFrame_{false}; + bool firstStreamerFrame{false}; - bool streamCurrentFrame_{false}; + bool streamCurrentFrame{false}; - File *dataFile_{nullptr}; + File *dataFile{nullptr}; // call back /** @@ -192,7 +189,7 @@ class DataProcessor : private virtual slsDetectorDefs, public ThreadObject { * dataPointer is the pointer to the data * dataSize in bytes is the size of the data in bytes. */ - void (*rawDataReadyCallBack)(sls_receiver_header *, char *, size_t, + void (*rawDataReadyCallBack)(sls_receiver_header &, char *, size_t, void *) = nullptr; /** @@ -203,7 +200,7 @@ class DataProcessor : private virtual slsDetectorDefs, public ThreadObject { * revDatasize is the reference of data size in bytes. Can be modified to * the new size to be written/streamed. (only smaller value). */ - void (*rawDataModifyReadyCallBack)(sls_receiver_header *, char *, size_t &, + void (*rawDataModifyReadyCallBack)(sls_receiver_header &, char *, size_t &, void *) = nullptr; void *pRawDataReady{nullptr}; diff --git a/slsReceiverSoftware/src/DataStreamer.cpp b/slsReceiverSoftware/src/DataStreamer.cpp index 5d89b0126..e02ebbe75 100644 --- a/slsReceiverSoftware/src/DataStreamer.cpp +++ b/slsReceiverSoftware/src/DataStreamer.cpp @@ -18,14 +18,8 @@ namespace sls { const std::string DataStreamer::TypeName = "DataStreamer"; -DataStreamer::DataStreamer(int ind, Fifo *f, uint32_t *dr, ROI *r, uint64_t *fi, - bool fr, slsDetectorDefs::xy np, bool *qe, - uint64_t *tot) - : ThreadObject(ind, TypeName), fifo(f), dynamicRange(dr), detectorRoi(r), - fileIndex(fi), flipRows(fr), numPorts(np), quadEnable(qe), - totalNumFrames(tot) { - - LOG(logDEBUG) << "DataStreamer " << ind << " created"; +DataStreamer::DataStreamer(int index) : ThreadObject(index, TypeName) { + LOG(logDEBUG) << "DataStreamer " << index << " created"; } DataStreamer::~DataStreamer() { @@ -35,6 +29,33 @@ DataStreamer::~DataStreamer() { void DataStreamer::SetFifo(Fifo *f) { fifo = f; } +void DataStreamer::SetGeneralData(GeneralData *g) { generalData = g; } + +void DataStreamer::SetFileIndex(uint64_t value) { fileIndex = value; } + +void DataStreamer::SetNumberofPorts(xy np) { numPorts = np; } + +void DataStreamer::SetFlipRows(bool fd) { + flipRows = fd; + // flip only right port of quad + if (quadEnable) { + flipRows = (index == 1 ? true : false); + } +} + +void DataStreamer::SetQuadEnable(bool value) { quadEnable = value; } + +void DataStreamer::SetNumberofTotalFrames(uint64_t value) { + nTotalFrames = value; +} + +void DataStreamer::SetAdditionalJsonHeader( + const std::map &json) { + std::lock_guard lock(additionalJsonMutex); + additionalJsonHeader = json; + isAdditionalJsonUpdated = true; +} + void DataStreamer::ResetParametersforNewAcquisition(const std::string &fname) { StopRunning(); startedFlag = false; @@ -45,38 +66,23 @@ void DataStreamer::ResetParametersforNewAcquisition(const std::string &fname) { delete[] completeBuffer; completeBuffer = nullptr; } - if (generalData->myDetectorType == GOTTHARD && detectorRoi->xmin != -1) { - adcConfigured = generalData->GetAdcConfigured(index, *detectorRoi); + if (generalData->detType == GOTTHARD && + generalData->detectorRoi.xmin != -1) { + adcConfigured = + generalData->GetAdcConfigured(index, generalData->detectorRoi); completeBuffer = new char[generalData->imageSizeComplete]; memset(completeBuffer, 0, generalData->imageSizeComplete); } } -void DataStreamer::RecordFirstIndex(uint64_t fnum, char *buf) { +void DataStreamer::RecordFirstIndex(uint64_t fnum, size_t firstImageIndex) { startedFlag = true; - // streamer first index needn't be - uint64_t firstVal = fnum - (*((uint32_t *)(buf + FIFO_DATASIZE_NUMBYTES))); - - firstIndex = firstVal; + firstIndex = firstImageIndex; LOG(logDEBUG1) << index << " First Index: " << firstIndex << ", First Streamer Index:" << fnum; } -void DataStreamer::SetGeneralData(GeneralData *g) { generalData = g; } - -void DataStreamer::SetNumberofPorts(xy np) { numPorts = np; } - -void DataStreamer::SetFlipRows(bool fd) { flipRows = fd; } - -void DataStreamer::SetAdditionalJsonHeader( - const std::map &json) { - std::lock_guard lock(additionalJsonMutex); - additionalJsonHeader = json; - isAdditionalJsonUpdated = true; -} - -void DataStreamer::CreateZmqSockets(int *nunits, uint32_t port, - const IpAddr ip, int hwm) { +void DataStreamer::CreateZmqSockets(uint32_t port, const IpAddr ip, int hwm) { uint32_t portnum = port + index; std::string sip = ip.str(); try { @@ -110,20 +116,25 @@ void DataStreamer::CloseZmqSocket() { void DataStreamer::ThreadExecution() { char *buffer = nullptr; fifo->PopAddressToStream(buffer); - LOG(logDEBUG5) << "DataStreamer " << index - << ", " - "pop 0x" - << std::hex << (void *)(buffer) << std::dec << ":" << buffer; + LOG(logDEBUG5) << "DataStreamer " << index << ", pop 0x" << std::hex + << (void *)(buffer) << std::dec << ":" << buffer; + auto *memImage = reinterpret_cast(buffer); // check dummy - auto numBytes = *reinterpret_cast(buffer); - LOG(logDEBUG1) << "DataStreamer " << index << ", Numbytes:" << numBytes; - if (numBytes == DUMMY_PACKET_VALUE) { + LOG(logDEBUG1) << "DataStreamer " << index + << ", Numbytes:" << memImage->size; + if (memImage->size == DUMMY_PACKET_VALUE) { StopProcessing(buffer); return; } - ProcessAnImage(buffer); + // streamer first index needn't be the very first index + if (!startedFlag) { + RecordFirstIndex(memImage->header.detHeader.frameNumber, + memImage->firstIndex); + } + + ProcessAnImage(memImage->header.detHeader, memImage->size, memImage->data); // free fifo->FreeAddress(buffer); @@ -131,12 +142,10 @@ void DataStreamer::ThreadExecution() { void DataStreamer::StopProcessing(char *buf) { LOG(logDEBUG1) << "DataStreamer " << index << ": Dummy"; - - sls_receiver_header *header = (sls_receiver_header *)(buf); - // send dummy header and data - if (!SendHeader(header, 0, 0, 0, true)) { - LOG(logERROR) << "Could not send zmq dummy header for streamer " - << index; + if (!SendDummyHeader()) { + LOG(logERROR) + << "Could not send zmq dummy header for streamer for port " + << zmqSocket->GetPortNumber(); } fifo->FreeAddress(buf); @@ -145,35 +154,26 @@ void DataStreamer::StopProcessing(char *buf) { } /** buf includes only the standard header */ -void DataStreamer::ProcessAnImage(char *buf) { +void DataStreamer::ProcessAnImage(sls_detector_header header, size_t size, + char *data) { - sls_receiver_header *header = - (sls_receiver_header *)(buf + FIFO_HEADER_NUMBYTES); - uint64_t fnum = header->detHeader.frameNumber; + uint64_t fnum = header.frameNumber; LOG(logDEBUG1) << "DataStreamer " << index << ": fnum:" << fnum; - if (!startedFlag) { - RecordFirstIndex(fnum, buf); - } - auto numBytes = *reinterpret_cast(buf); - // shortframe gotthard if (completeBuffer) { // disregarding the size modified from callback (always using - // imageSizeComplete - // instead of buf (32 bit) because gui needs imagesizecomplete and - // listener - // write imagesize + // imageSizeComplete instead of size because gui needs + // imagesizecomplete and listener writes imagesize to size - if (!SendHeader(header, generalData->imageSizeComplete, - generalData->nPixelsXComplete, - generalData->nPixelsYComplete, false)) { + if (!SendDataHeader(header, generalData->imageSizeComplete, + generalData->nPixelsXComplete, + generalData->nPixelsYComplete)) { LOG(logERROR) << "Could not send zmq header for fnum " << fnum << " and streamer " << index; } memcpy(completeBuffer + ((generalData->imageSize) * adcConfigured), - buf + FIFO_HEADER_NUMBYTES + sizeof(sls_receiver_header), - numBytes); + data, size); if (!zmqSocket->SendData(completeBuffer, generalData->imageSizeComplete)) { @@ -185,39 +185,36 @@ void DataStreamer::ProcessAnImage(char *buf) { // normal else { - if (!SendHeader(header, numBytes, generalData->nPixelsX, - generalData->nPixelsY, - false)) { // new size possibly from callback + if (!SendDataHeader(header, size, generalData->nPixelsX, + generalData->nPixelsY)) { LOG(logERROR) << "Could not send zmq header for fnum " << fnum << " and streamer " << index; } - if (!zmqSocket->SendData(buf + FIFO_HEADER_NUMBYTES + - sizeof(sls_receiver_header), - numBytes)) { // new size possibly from callback + if (!zmqSocket->SendData(data, size)) { LOG(logERROR) << "Could not send zmq data for fnum " << fnum << " and streamer " << index; } } } -int DataStreamer::SendHeader(sls_receiver_header *rheader, uint32_t size, - uint32_t nx, uint32_t ny, bool dummy) { - +int DataStreamer::SendDummyHeader() { zmqHeader zHeader; - zHeader.data = !dummy; + zHeader.data = false; zHeader.jsonversion = SLS_DETECTOR_JSON_HEADER_VERSION; + return zmqSocket->SendHeader(index, zHeader); +} - if (dummy) { - return zmqSocket->SendHeader(index, zHeader); - } - - sls_detector_header header = rheader->detHeader; +int DataStreamer::SendDataHeader(sls_detector_header header, uint32_t size, + uint32_t nx, uint32_t ny) { + zmqHeader zHeader; + zHeader.data = true; + zHeader.jsonversion = SLS_DETECTOR_JSON_HEADER_VERSION; uint64_t frameIndex = header.frameNumber - firstIndex; uint64_t acquisitionIndex = header.frameNumber; - zHeader.dynamicRange = *dynamicRange; - zHeader.fileIndex = *fileIndex; + zHeader.dynamicRange = generalData->dynamicRange; + zHeader.fileIndex = fileIndex; zHeader.ndetx = numPorts.x; zHeader.ndety = numPorts.y; zHeader.npixelsx = nx; @@ -226,7 +223,7 @@ int DataStreamer::SendHeader(sls_receiver_header *rheader, uint32_t size, zHeader.acqIndex = acquisitionIndex; zHeader.frameIndex = frameIndex; zHeader.progress = - 100 * ((double)(frameIndex + 1) / (double)(*totalNumFrames)); + 100 * ((double)(frameIndex + 1) / (double)(nTotalFrames)); zHeader.fname = fileNametoStream; zHeader.frameNumber = header.frameNumber; zHeader.expLength = header.expLength; @@ -242,7 +239,7 @@ int DataStreamer::SendHeader(sls_receiver_header *rheader, uint32_t size, zHeader.detType = header.detType; zHeader.version = header.version; zHeader.flipRows = static_cast(flipRows); - zHeader.quad = *quadEnable; + zHeader.quad = quadEnable; zHeader.completeImage = (header.packetNumber < generalData->packetsPerFrame ? false : true); @@ -258,15 +255,9 @@ int DataStreamer::SendHeader(sls_receiver_header *rheader, uint32_t size, } void DataStreamer::RestreamStop() { - // send dummy header - zmqHeader zHeader; - zHeader.data = false; - zHeader.jsonversion = SLS_DETECTOR_JSON_HEADER_VERSION; - int ret = zmqSocket->SendHeader(index, zHeader); - if (!ret) { - throw RuntimeError( - "Could not restream Dummy Header via ZMQ for port " + - std::to_string(zmqSocket->GetPortNumber())); + if (!SendDummyHeader()) { + throw RuntimeError("Could not restream Dummy Header via ZMQ for port " + + std::to_string(zmqSocket->GetPortNumber())); } } diff --git a/slsReceiverSoftware/src/DataStreamer.h b/slsReceiverSoftware/src/DataStreamer.h index 49c3c3d81..f05c4e466 100644 --- a/slsReceiverSoftware/src/DataStreamer.h +++ b/slsReceiverSoftware/src/DataStreamer.h @@ -25,57 +25,38 @@ class ZmqSocket; class DataStreamer : private virtual slsDetectorDefs, public ThreadObject { public: - /** - * Constructor - * Calls Base Class CreateThread(), sets ErrorMask if error and increments - * NumberofDataStreamers - * @param ind self index - * @param f address of Fifo pointer - * @param dr pointer to dynamic range - * @param r detectorRoi - * @param fi pointer to file index - * @param fr flip rows - * @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 np, bool *qe, uint64_t *tot); - - /** - * Destructor - * Calls Base Class DestroyThread() and decrements NumberofDataStreamers - */ + DataStreamer(int index); ~DataStreamer(); void SetFifo(Fifo *f); - void ResetParametersforNewAcquisition(const std::string &fname); void SetGeneralData(GeneralData *g); + + void SetFileIndex(uint64_t value); void SetNumberofPorts(xy np); void SetFlipRows(bool fd); + void SetQuadEnable(bool value); + void SetNumberofTotalFrames(uint64_t value); void SetAdditionalJsonHeader(const std::map &json); + void ResetParametersforNewAcquisition(const std::string &fname); /** * Creates Zmq Sockets * (throws an exception if it couldnt create zmq sockets) - * @param nunits pointer to number of theads/ units per detector * @param port streaming port start index * @param ip streaming source ip * @param hwm streaming high water mark */ - void CreateZmqSockets(int *nunits, uint32_t port, const IpAddr ip, - int hwm); + void CreateZmqSockets(uint32_t port, const IpAddr ip, int hwm); void CloseZmqSocket(); void RestreamStop(); private: /** * Record First Index - * @param fnum current frame number - * @param buf get frame index from buffer to calculate first index to record */ - void RecordFirstIndex(uint64_t fnum, char *buf); + void RecordFirstIndex(uint64_t fnum, size_t firstImageIndex); + void ThreadExecution(); /** @@ -88,7 +69,9 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject { * Process an image popped from fifo, * write to file if fw enabled & update parameters */ - void ProcessAnImage(char *buf); + void ProcessAnImage(sls_detector_header header, size_t size, char *data); + + int SendDummyHeader(); /** * Create and send Json Header @@ -96,21 +79,18 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject { * @param size data size (could have been modified in call back) * @param nx number of pixels in x dim * @param ny number of pixels in y dim - * @param dummy true if its a dummy header * @returns 0 if error, else 1 */ - int SendHeader(sls_receiver_header *rheader, uint32_t size = 0, - uint32_t nx = 0, uint32_t ny = 0, bool dummy = true); + int SendDataHeader(sls_detector_header header, uint32_t size = 0, + uint32_t nx = 0, uint32_t ny = 0); static const std::string TypeName; const GeneralData *generalData{nullptr}; - Fifo *fifo; + Fifo *fifo{nullptr}; ZmqSocket *zmqSocket{nullptr}; - uint32_t *dynamicRange; - ROI *detectorRoi; int adcConfigured{-1}; - uint64_t *fileIndex; - bool flipRows; + uint64_t fileIndex{0}; + bool flipRows{false}; std::map additionalJsonHeader; /** Used by streamer thread to update local copy (reduce number of locks @@ -130,8 +110,8 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject { char *completeBuffer{nullptr}; xy numPorts{1, 1}; - bool *quadEnable; - uint64_t *totalNumFrames; + bool quadEnable{false}; + uint64_t nTotalFrames{0}; }; } // namespace sls diff --git a/slsReceiverSoftware/src/Fifo.cpp b/slsReceiverSoftware/src/Fifo.cpp index ccb01108d..1bec44e12 100644 --- a/slsReceiverSoftware/src/Fifo.cpp +++ b/slsReceiverSoftware/src/Fifo.cpp @@ -17,10 +17,10 @@ namespace sls { -Fifo::Fifo(int ind, uint32_t fifoItemSize, uint32_t depth) - : index(ind), memory(nullptr), fifoBound(nullptr), fifoFree(nullptr), - fifoStream(nullptr), fifoDepth(depth), status_fifoBound(0), - status_fifoFree(depth) { +Fifo::Fifo(int index, size_t fifoItemSize, uint32_t fifoDepth) + : index(index), memory(nullptr), fifoBound(nullptr), fifoFree(nullptr), + fifoStream(nullptr), fifoDepth(fifoDepth), status_fifoBound(0), + status_fifoFree(fifoDepth) { LOG(logDEBUG3) << __SHORT_AT__ << " called"; CreateFifos(fifoItemSize); } @@ -30,7 +30,7 @@ Fifo::~Fifo() { DestroyFifos(); } -void Fifo::CreateFifos(uint32_t fifoItemSize) { +void Fifo::CreateFifos(size_t fifoItemSize) { LOG(logDEBUG3) << __SHORT_AT__ << " called"; // destroy if not already @@ -41,7 +41,7 @@ void Fifo::CreateFifos(uint32_t fifoItemSize) { fifoFree = new CircularFifo(fifoDepth); fifoStream = new CircularFifo(fifoDepth); // allocate memory - size_t mem_len = (size_t)fifoItemSize * (size_t)fifoDepth * sizeof(char); + size_t mem_len = fifoItemSize * (size_t)fifoDepth * sizeof(char); memory = (char *)malloc(mem_len); if (memory == nullptr) { throw RuntimeError("Could not allocate memory for fifos"); diff --git a/slsReceiverSoftware/src/Fifo.h b/slsReceiverSoftware/src/Fifo.h index c55e6fc9f..d07fe5fef 100644 --- a/slsReceiverSoftware/src/Fifo.h +++ b/slsReceiverSoftware/src/Fifo.h @@ -21,95 +21,36 @@ namespace sls { class Fifo : private virtual slsDetectorDefs { public: - /** - * Constructor - * Calls CreateFifos that creates fifos and allocates memory - * @param ind self index - * @param fifoItemSize size of each fifo item - * @param depth fifo depth - */ - Fifo(int ind, uint32_t fifoItemSize, uint32_t depth); - - /** - * Destructor - */ + Fifo(int index, size_t fifoItemSize, uint32_t fifoDepth); ~Fifo(); - /** - * Frees the bound address by pushing into fifoFree - */ void FreeAddress(char *&address); - - /** - * Pops free address from fifoFree - */ void GetNewAddress(char *&address); - /** - * Pushes bound address into fifoBound - */ + /** to process data */ void PushAddress(char *&address); - - /** - * Pops bound address from fifoBound to process data - */ void PopAddress(char *&address); - /** - * Pushes bound address into fifoStream - */ void PushAddressToStream(char *&address); - - /** - * Pops bound address from fifoStream to stream data - */ void PopAddressToStream(char *&address); - /** - * Get Maximum Level filled in Fifo Bound - * and reset this value for next intake - */ int GetMaxLevelForFifoBound(); - - /** - * Get Minimum Level filled in Fifo Free - * and reset this value to max for next intake - */ int GetMinLevelForFifoFree(); private: - /** - * Create Fifos, allocate memory & push addresses into fifo - * @param fifoItemSize size of each fifo item - */ - void CreateFifos(uint32_t fifoItemSize); - - /** - * Destroy Fifos and deallocate memory - */ + /** also allocate memory & push addresses into free fifo */ + void CreateFifos(size_t fifoItemSize); + /** also deallocate memory */ void DestroyFifos(); - /** Self Index */ int index; - - /** Memory allocated, whose addresses are pushed into the fifos */ char *memory; - - /** Circular Fifo pointing to addresses of bound data in memory */ CircularFifo *fifoBound; - - /** Circular Fifo pointing to addresses of freed data in memory */ CircularFifo *fifoFree; - - /** Circular Fifo pointing to addresses of to be streamed data in memory */ CircularFifo *fifoStream; - - /** Fifo depth set */ int fifoDepth; - volatile int status_fifoBound; volatile int status_fifoFree; }; } // namespace sls - diff --git a/slsReceiverSoftware/src/File.cpp b/slsReceiverSoftware/src/File.cpp deleted file mode 100644 index 2da45d84c..000000000 --- a/slsReceiverSoftware/src/File.cpp +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-other -// Copyright (C) 2021 Contributors to the SLS Detector Package -#include "File.h" - -#include - -namespace sls { - -File::File(const slsDetectorDefs::fileFormat format) : format_(format) {} - -File::~File() {} - -slsDetectorDefs::fileFormat File::GetFileFormat() const { return format_; } - -} // namespace sls diff --git a/slsReceiverSoftware/src/File.h b/slsReceiverSoftware/src/File.h index 957d414cd..9bcbabbaa 100644 --- a/slsReceiverSoftware/src/File.h +++ b/slsReceiverSoftware/src/File.h @@ -18,17 +18,16 @@ struct MasterAttributes; class File : private virtual slsDetectorDefs { public: - File(const slsDetectorDefs::fileFormat format); - virtual ~File(); + File(){}; + virtual ~File(){}; - fileFormat GetFileFormat() const; + virtual fileFormat GetFileFormat() const = 0; virtual void CloseFile() = 0; #ifdef HDF5C virtual std::string GetFileName() const { - LOG(logERROR) - << "This is a generic function GetFileName that " - "should be overloaded by a derived class"; + LOG(logERROR) << "This is a generic function GetFileName that " + "should be overloaded by a derived class"; return std::string{}; } @@ -46,9 +45,8 @@ class File : private virtual slsDetectorDefs { } virtual std::vector GetParameterNames() const { - LOG(logERROR) - << "This is a generic function GetParameterNames that " - "should be overloaded by a derived class"; + LOG(logERROR) << "This is a generic function GetParameterNames that " + "should be overloaded by a derived class"; return std::vector{}; }; @@ -60,33 +58,31 @@ class File : private virtual slsDetectorDefs { }; virtual void CreateFirstHDF5DataFile( - const std::string filePath, const std::string fileNamePrefix, - const uint64_t fileIndex, const bool overWriteEnable, - const bool silentMode, const int modulePos, - const int numUnitsPerReadout, const uint32_t udpPortNumber, - const uint32_t maxFramesPerFile, const uint64_t numImages, - const uint32_t nPixelsX, const uint32_t nPixelsY, - const uint32_t dynamicRange) { - LOG(logERROR) << "This is a generic function CreateFirstHDF5DataFile that " - "should be overloaded by a derived class"; + const std::string &fileNamePrefix, const uint64_t fileIndex, + const bool overWriteEnable, const bool silentMode, + const uint32_t udpPortNumber, const uint32_t maxFramesPerFile, + const uint64_t numImages, const uint32_t nPixelsX, + const uint32_t nPixelsY, const uint32_t dynamicRange) { + LOG(logERROR) + << "This is a generic function CreateFirstHDF5DataFile that " + "should be overloaded by a derived class"; }; #endif - virtual void CreateFirstBinaryDataFile( - const std::string filePath, const std::string fileNamePrefix, - const uint64_t fileIndex, const bool overWriteEnable, - const bool silentMode, const int modulePos, - const int numUnitsPerReadout, const uint32_t udpPortNumber, - const uint32_t maxFramesPerFile) { - LOG(logERROR) << "This is a generic function CreateFirstBinaryDataFile that " - "should be overloaded by a derived class"; + virtual void CreateFirstBinaryDataFile(const std::string &fileNamePrefix, + const uint64_t fileIndex, + const bool overWriteEnable, + const bool silentMode, + const uint32_t udpPortNumber, + const uint32_t maxFramesPerFile) { + LOG(logERROR) + << "This is a generic function CreateFirstBinaryDataFile that " + "should be overloaded by a derived class"; }; - virtual void WriteToFile(char *buffer, const int buffersize, + virtual void WriteToFile(char *imageData, sls_receiver_header &header, + const int imageSize, const uint64_t currentFrameNumber, const uint32_t numPacketsCaught) = 0; - - protected: - slsDetectorDefs::fileFormat format_; }; } // namespace sls diff --git a/slsReceiverSoftware/src/GeneralData.h b/slsReceiverSoftware/src/GeneralData.h index 4c71f8f15..9803a7295 100644 --- a/slsReceiverSoftware/src/GeneralData.h +++ b/slsReceiverSoftware/src/GeneralData.h @@ -21,7 +21,7 @@ namespace sls { class GeneralData { public: - slsDetectorDefs::detectorType myDetectorType{slsDetectorDefs::GENERIC}; + slsDetectorDefs::detectorType detType{slsDetectorDefs::GENERIC}; uint32_t nPixelsX{0}; uint32_t nPixelsY{0}; uint32_t headerSizeinPacket{0}; @@ -36,11 +36,9 @@ class GeneralData { uint32_t frameIndexOffset{0}; uint32_t packetIndexMask{0}; uint32_t packetIndexOffset{0}; - uint32_t maxFramesPerFile{0}; - /** Header size of data saved into fifo buffer at a time*/ - uint32_t fifoBufferHeaderSize{0}; - uint32_t defaultFifoDepth{0}; - uint32_t numUDPInterfaces{1}; + uint32_t framesPerFile{0}; + uint32_t fifoDepth{0}; + int numUDPInterfaces{1}; uint32_t headerPacketSize{0}; /** Streaming (for ROI - mainly short Gotthard) */ uint32_t nPixelsXComplete{0}; @@ -50,7 +48,7 @@ class GeneralData { uint32_t imageSizeComplete{0}; /** if standard header implemented in firmware */ bool standardheader{false}; - uint32_t defaultUdpSocketBufferSize{RECEIVE_SOCKET_BUFFER_SIZE}; + uint32_t udpSocketBufferSize{RECEIVE_SOCKET_BUFFER_SIZE}; uint32_t vetoDataSize{0}; uint32_t vetoPacketSize{0}; uint32_t vetoImageSize{0}; @@ -63,7 +61,7 @@ class GeneralData { slsDetectorDefs::readoutMode readoutType{slsDetectorDefs::ANALOG_ONLY}; uint32_t adcEnableMaskOneGiga{BIT32_MASK}; uint32_t adcEnableMaskTenGiga{BIT32_MASK}; - slsDetectorDefs::ROI roi{}; + slsDetectorDefs::ROI detectorRoi{}; uint32_t counterMask{0}; GeneralData(){}; @@ -163,12 +161,10 @@ class GotthardData : public GeneralData { public: GotthardData() { - myDetectorType = slsDetectorDefs::GOTTHARD; + detType = slsDetectorDefs::GOTTHARD; nPixelsY = 1; headerSizeinPacket = 6; - maxFramesPerFile = MAX_FRAMES_PER_FILE; - fifoBufferHeaderSize = - FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header); + framesPerFile = MAX_FRAMES_PER_FILE; UpdateImageSize(); }; @@ -251,7 +247,7 @@ class GotthardData : public GeneralData { }; void SetDetectorROI(slsDetectorDefs::ROI i) { - roi = i; + detectorRoi = i; UpdateImageSize(); }; @@ -259,18 +255,18 @@ class GotthardData : public GeneralData { void UpdateImageSize() { // all adcs - if (roi.xmin == -1) { + if (detectorRoi.xmin == -1) { nPixelsX = 1280; dataSize = 1280; packetsPerFrame = 2; frameIndexMask = 0xFFFFFFFE; frameIndexOffset = 1; packetIndexMask = 1; - maxFramesPerFile = MAX_FRAMES_PER_FILE; + framesPerFile = MAX_FRAMES_PER_FILE; nPixelsXComplete = 0; nPixelsYComplete = 0; imageSizeComplete = 0; - defaultFifoDepth = 50000; + fifoDepth = 50000; } else { nPixelsX = 256; dataSize = 512; @@ -278,11 +274,11 @@ class GotthardData : public GeneralData { frameIndexMask = 0xFFFFFFFF; frameIndexOffset = 0; packetIndexMask = 0; - maxFramesPerFile = SHORT_MAX_FRAMES_PER_FILE; + framesPerFile = SHORT_MAX_FRAMES_PER_FILE; nPixelsXComplete = 1280; nPixelsYComplete = 1; imageSizeComplete = 1280 * 2; - defaultFifoDepth = 75000; + fifoDepth = 75000; } imageSize = int(nPixelsX * nPixelsY * GetPixelDepth()); packetSize = headerSizeinPacket + dataSize; @@ -294,11 +290,9 @@ class EigerData : public GeneralData { public: EigerData() { - myDetectorType = slsDetectorDefs::EIGER; + detType = slsDetectorDefs::EIGER; headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header); - maxFramesPerFile = EIGER_MAX_FRAMES_PER_FILE; - fifoBufferHeaderSize = - FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header); + framesPerFile = EIGER_MAX_FRAMES_PER_FILE; numUDPInterfaces = 2; headerPacketSize = 40; standardheader = true; @@ -324,7 +318,7 @@ class EigerData : public GeneralData { packetSize = headerSizeinPacket + dataSize; imageSize = int(nPixelsX * nPixelsY * GetPixelDepth()); packetsPerFrame = imageSize / dataSize; - defaultFifoDepth = (dynamicRange == 32 ? 100 : 1000); + fifoDepth = (dynamicRange == 32 ? 100 : 1000); }; }; @@ -332,14 +326,12 @@ class JungfrauData : public GeneralData { public: JungfrauData() { - myDetectorType = slsDetectorDefs::JUNGFRAU; + detType = slsDetectorDefs::JUNGFRAU; headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header); dataSize = 8192; packetSize = headerSizeinPacket + dataSize; - maxFramesPerFile = JFRAU_MAX_FRAMES_PER_FILE; - fifoBufferHeaderSize = - FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header); - defaultFifoDepth = 2500; + framesPerFile = JFRAU_MAX_FRAMES_PER_FILE; + fifoDepth = 2500; standardheader = true; maxRowsPerReadout = 512; UpdateImageSize(); @@ -356,7 +348,7 @@ class JungfrauData : public GeneralData { nPixelsY = (256 * 2) / numUDPInterfaces; imageSize = int(nPixelsX * nPixelsY * GetPixelDepth()); packetsPerFrame = imageSize / dataSize; - defaultUdpSocketBufferSize = (1000 * 1024 * 1024) / numUDPInterfaces; + udpSocketBufferSize = (1000 * 1024 * 1024) / numUDPInterfaces; }; }; @@ -367,15 +359,13 @@ class Mythen3Data : public GeneralData { public: Mythen3Data() { - myDetectorType = slsDetectorDefs::MYTHEN3; + detType = slsDetectorDefs::MYTHEN3; nPixelsY = 1; headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header); - maxFramesPerFile = MYTHEN3_MAX_FRAMES_PER_FILE; - fifoBufferHeaderSize = - FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header); - defaultFifoDepth = 50000; + framesPerFile = MYTHEN3_MAX_FRAMES_PER_FILE; + fifoDepth = 50000; standardheader = true; - defaultUdpSocketBufferSize = (1000 * 1024 * 1024); + udpSocketBufferSize = (1000 * 1024 * 1024); dynamicRange = 32; tengigaEnable = true; SetCounterMask(0x7); @@ -396,7 +386,7 @@ class Mythen3Data : public GeneralData { int n = __builtin_popcount(mask); if (n < 1 || n > 3) { throw RuntimeError("Invalid number of counters " + - std::to_string(n) + ". Expected 1-3."); + std::to_string(n) + ". Expected 1-3."); } counterMask = mask; ncounters = n; @@ -437,15 +427,13 @@ class Mythen3Data : public GeneralData { class Gotthard2Data : public GeneralData { public: Gotthard2Data() { - myDetectorType = slsDetectorDefs::GOTTHARD2; + detType = slsDetectorDefs::GOTTHARD2; nPixelsX = 128 * 10; nPixelsY = 1; headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header); dataSize = 2560; // 1280 channels * 2 bytes - maxFramesPerFile = GOTTHARD2_MAX_FRAMES_PER_FILE; - fifoBufferHeaderSize = - FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header); - defaultFifoDepth = 50000; + framesPerFile = GOTTHARD2_MAX_FRAMES_PER_FILE; + fifoDepth = 50000; standardheader = true; vetoDataSize = 160; vetoHsize = 16; @@ -481,7 +469,7 @@ class Gotthard2Data : public GeneralData { packetsPerFrame = imageSize / dataSize; vetoPacketSize = vetoHsize + vetoDataSize; vetoImageSize = vetoDataSize * packetsPerFrame; - defaultUdpSocketBufferSize = (1000 * 1024 * 1024) / numUDPInterfaces; + udpSocketBufferSize = (1000 * 1024 * 1024) / numUDPInterfaces; }; }; @@ -494,16 +482,14 @@ class ChipTestBoardData : public GeneralData { public: /** Constructor */ ChipTestBoardData() { - myDetectorType = slsDetectorDefs::CHIPTESTBOARD; + detType = slsDetectorDefs::CHIPTESTBOARD; nPixelsY = 1; // number of samples headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header); frameIndexMask = 0xFFFFFF; // 10g frameIndexOffset = 8; // 10g packetIndexMask = 0xFF; // 10g - maxFramesPerFile = CTB_MAX_FRAMES_PER_FILE; - fifoBufferHeaderSize = - FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header); - defaultFifoDepth = 2500; + framesPerFile = CTB_MAX_FRAMES_PER_FILE; + fifoDepth = 2500; standardheader = true; UpdateImageSize(); }; @@ -586,13 +572,11 @@ class MoenchData : public GeneralData { public: MoenchData() { - myDetectorType = slsDetectorDefs::MOENCH; + detType = slsDetectorDefs::MOENCH; headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header); frameIndexMask = 0xFFFFFF; - maxFramesPerFile = MOENCH_MAX_FRAMES_PER_FILE; - fifoBufferHeaderSize = - FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header); - defaultFifoDepth = 2500; + framesPerFile = MOENCH_MAX_FRAMES_PER_FILE; + fifoDepth = 2500; standardheader = true; UpdateImageSize(); }; diff --git a/slsReceiverSoftware/src/HDF5DataFile.cpp b/slsReceiverSoftware/src/HDF5DataFile.cpp index 3af531145..54554b156 100644 --- a/slsReceiverSoftware/src/HDF5DataFile.cpp +++ b/slsReceiverSoftware/src/HDF5DataFile.cpp @@ -8,9 +8,9 @@ namespace sls { HDF5DataFile::HDF5DataFile(int index, std::mutex *hdf5Lib) - : File(HDF5), index_(index), hdf5Lib_(hdf5Lib) { + : index(index), hdf5Lib(hdf5Lib) { - parameterNames_ = std::vector{ + parameterNames = std::vector{ "frame number", "exp length or sub exposure time", "packets caught", @@ -27,102 +27,98 @@ HDF5DataFile::HDF5DataFile(int index, std::mutex *hdf5Lib) "packets caught bit mask", }; H5::StrType strdatatype(H5::PredType::C_S1, sizeof(bitset_storage)); - parameterDataTypes_ = std::vector{ - H5::PredType::STD_U64LE, H5::PredType::STD_U32LE, H5::PredType::STD_U32LE, - H5::PredType::STD_U64LE, H5::PredType::STD_U64LE, H5::PredType::STD_U16LE, - H5::PredType::STD_U16LE, H5::PredType::STD_U16LE, H5::PredType::STD_U16LE, - H5::PredType::STD_U32LE, H5::PredType::STD_U16LE, H5::PredType::STD_U8LE, + parameterDataTypes = std::vector{ + H5::PredType::STD_U64LE, H5::PredType::STD_U32LE, + H5::PredType::STD_U32LE, H5::PredType::STD_U64LE, + H5::PredType::STD_U64LE, H5::PredType::STD_U16LE, + H5::PredType::STD_U16LE, H5::PredType::STD_U16LE, + H5::PredType::STD_U16LE, H5::PredType::STD_U32LE, + H5::PredType::STD_U16LE, H5::PredType::STD_U8LE, H5::PredType::STD_U8LE, strdatatype}; } HDF5DataFile::~HDF5DataFile() { CloseFile(); } -std::string HDF5DataFile::GetFileName() const { - return fileName_; -} +std::string HDF5DataFile::GetFileName() const { return fileName; } uint32_t HDF5DataFile::GetFilesInAcquisition() const { - return numFilesInAcquisition_; + return numFilesInAcquisition; } -H5::DataType HDF5DataFile::GetPDataType() const { return dataType_; } +H5::DataType HDF5DataFile::GetPDataType() const { return dataType; } std::vector HDF5DataFile::GetParameterNames() const { - return parameterNames_; + return parameterNames; } std::vector HDF5DataFile::GetParameterDataTypes() const { - return parameterDataTypes_; + return parameterDataTypes; } +slsDetectorDefs::fileFormat HDF5DataFile::GetFileFormat() const { return HDF5; } + void HDF5DataFile::CloseFile() { - std::lock_guard lock(*hdf5Lib_); + std::lock_guard lock(*hdf5Lib); try { H5::Exception::dontPrint(); // to handle errors - if (fd_) { - fd_->close(); - delete fd_; - fd_ = nullptr; + if (fd) { + fd->close(); + delete fd; + fd = nullptr; } } catch (const H5::Exception &error) { - LOG(logERROR) << "Could not close data HDF5 handles of index " - << index_; + LOG(logERROR) << "Could not close data HDF5 handles of index " << index; error.printErrorStack(); } - if (dataSpace_) { - delete dataSpace_; - dataSpace_ = nullptr; + if (dataSpace) { + delete dataSpace; + dataSpace = nullptr; } - if (dataSet_) { - delete dataSet_; - dataSet_ = nullptr; + if (dataSet) { + delete dataSet; + dataSet = nullptr; } - if (dataSpacePara_) { - delete dataSpacePara_; - dataSpacePara_ = nullptr; + if (dataSpacePara) { + delete dataSpacePara; + dataSpacePara = nullptr; } - for (auto it : dataSetPara_) + for (auto it : dataSetPara) delete it; - dataSetPara_.clear(); + dataSetPara.clear(); } void HDF5DataFile::CreateFirstHDF5DataFile( - const std::string filePath, const std::string fileNamePrefix, - const uint64_t fileIndex, const bool overWriteEnable, const bool silentMode, - const int modulePos, const int numUnitsPerReadout, - const uint32_t udpPortNumber, const uint32_t maxFramesPerFile, - const uint64_t numImages, const uint32_t nPixelsX, const uint32_t nPixelsY, - const uint32_t dynamicRange) { + const std::string &fNamePrefix, const uint64_t fIndex, const bool owEnable, + const bool sMode, const uint32_t uPortNumber, const uint32_t mFramesPerFile, + const uint64_t nImages, const uint32_t nX, const uint32_t nY, + const uint32_t dr) { - subFileIndex_ = 0; - numFramesInFile_ = 0; - extNumImages_ = numImages; - numFilesInAcquisition_ = 0; + subFileIndex = 0; + numFramesInFile = 0; + extNumImages = nImages; + numFilesInAcquisition = 0; - maxFramesPerFile_ = maxFramesPerFile; - numImages_ = numImages; - nPixelsX_ = nPixelsX; - nPixelsY_ = nPixelsY; - dynamicRange_ = dynamicRange; + maxFramesPerFile = mFramesPerFile; + numImages = nImages; + nPixelsX = nX; + nPixelsY = nY; + dynamicRange = dr; - filePath_ = filePath; - fileNamePrefix_ = fileNamePrefix; - fileIndex_ = fileIndex; - overWriteEnable_ = overWriteEnable; - silentMode_ = silentMode; - detIndex_ = modulePos; - numUnitsPerReadout_ = numUnitsPerReadout; - udpPortNumber_ = udpPortNumber; + fileNamePrefix = fNamePrefix; + fileIndex = fIndex; + overWriteEnable = owEnable; + silentMode = sMode; + udpPortNumber = uPortNumber; - switch (dynamicRange_) { + switch (dynamicRange) { case 12: case 16: - dataType_ = H5::PredType::STD_U16LE; + dataType = H5::PredType::STD_U16LE; break; case 32: - dataType_ = H5::PredType::STD_U32LE; + dataType = H5::PredType::STD_U32LE; break; default: - dataType_ = H5::PredType::STD_U8LE; + dataType = H5::PredType::STD_U8LE; break; } @@ -130,27 +126,25 @@ void HDF5DataFile::CreateFirstHDF5DataFile( } void HDF5DataFile::CreateFile() { - numFramesInFile_ = 0; - numFilesInAcquisition_++; + numFramesInFile = 0; + numFilesInAcquisition++; std::ostringstream os; - os << filePath_ << "/" << fileNamePrefix_ << "_d" - << (detIndex_ * numUnitsPerReadout_ + index_) << "_f" << subFileIndex_ - << '_' << fileIndex_ << ".h5"; - fileName_ = os.str(); + os << fileNamePrefix << "_f" << subFileIndex << '_' << fileIndex << ".h5"; + fileName = os.str(); - std::lock_guard lock(*hdf5Lib_); + std::lock_guard lock(*hdf5Lib); uint64_t framestosave = - ((maxFramesPerFile_ == 0) ? numImages_ : // infinite images - (((extNumImages_ - subFileIndex_) > maxFramesPerFile_) + ((maxFramesPerFile == 0) ? numImages : // infinite images + (((extNumImages - subFileIndex) > maxFramesPerFile) ? // save up to maximum at a time - maxFramesPerFile_ - : (extNumImages_ - subFileIndex_))); + maxFramesPerFile + : (extNumImages - subFileIndex))); uint64_t nDimx = framestosave; - uint32_t nDimy = nPixelsY_; - uint32_t nDimz = ((dynamicRange_ == 4) ? (nPixelsX_ / 2) : nPixelsX_); + uint32_t nDimy = nPixelsY; + uint32_t nDimz = ((dynamicRange == 4) ? (nPixelsX / 2) : nPixelsX); try { H5::Exception::dontPrint(); // to handle errors @@ -158,90 +152,88 @@ void HDF5DataFile::CreateFile() { // file H5::FileAccPropList fapl; fapl.setFcloseDegree(H5F_CLOSE_STRONG); - fd_ = nullptr; - if (!overWriteEnable_) - fd_ = new H5::H5File(fileName_.c_str(), H5F_ACC_EXCL, - H5::FileCreatPropList::DEFAULT, fapl); + fd = nullptr; + if (!overWriteEnable) + fd = new H5::H5File(fileName.c_str(), H5F_ACC_EXCL, + H5::FileCreatPropList::DEFAULT, fapl); else - fd_ = new H5::H5File(fileName_.c_str(), H5F_ACC_TRUNC, - H5::FileCreatPropList::DEFAULT, fapl); + fd = new H5::H5File(fileName.c_str(), H5F_ACC_TRUNC, + H5::FileCreatPropList::DEFAULT, fapl); // attributes - version double dValue = HDF5_WRITER_VERSION; H5::DataSpace dataspace_attr = H5::DataSpace(H5S_SCALAR); - H5::Attribute attribute = fd_->createAttribute( + H5::Attribute attribute = fd->createAttribute( "version", H5::PredType::NATIVE_DOUBLE, dataspace_attr); attribute.write(H5::PredType::NATIVE_DOUBLE, &dValue); + // dimensions + hsize_t dims[DATA_RANK] = {nDimx, nDimy, nDimz}; + hsize_t dimsMax[DATA_RANK] = {H5S_UNLIMITED, nDimy, nDimz}; + hsize_t dimsPara[PARA_RANK] = {nDimx}; + hsize_t dimsMaxPara[PARA_RANK] = {H5S_UNLIMITED}; + // always create chunked dataset as unlimited is only + // supported with chunked layout + hsize_t dimsChunk[DATA_RANK] = {MAX_CHUNKED_IMAGES, nDimy, nDimz}; + hsize_t dimsChunkPara[PARA_RANK] = {MAX_CHUNKED_IMAGES}; + // dataspace - hsize_t srcdims[3] = {nDimx, nDimy, nDimz}; - hsize_t srcdimsmax[3] = {H5S_UNLIMITED, nDimy, nDimz}; - dataSpace_ = nullptr; - dataSpace_ = new H5::DataSpace(3, srcdims, srcdimsmax); + dataSpace = nullptr; + dataSpace = new H5::DataSpace(DATA_RANK, dims, dimsMax); + dataSpacePara = nullptr; + dataSpacePara = new H5::DataSpace(PARA_RANK, dimsPara, dimsMaxPara); + + // property list + H5::DSetCreatPropList plist; + H5::DSetCreatPropList plistPara; + int fill_value = -1; + plist.setFillValue(dataType, &fill_value); + // plistPara.setFillValue(dataType, &fill_value); + plist.setChunk(DATA_RANK, dimsChunk); + plistPara.setChunk(PARA_RANK, dimsChunkPara); // dataset - // fill value - H5::DSetCreatPropList plist; - int fill_value = -1; - plist.setFillValue(dataType_, &fill_value); - // always create chunked dataset as unlimited is only - // supported with chunked layout - hsize_t chunk_dims[3] = {MAX_CHUNKED_IMAGES, nDimy, nDimz}; - plist.setChunk(3, chunk_dims); - dataSet_ = nullptr; - dataSet_ = new H5::DataSet(fd_->createDataSet( - DATASET_NAME, dataType_, *dataSpace_, plist)); - - // create parameter datasets - hsize_t dims[1] = {nDimx}; - hsize_t dimsmax[1] = {H5S_UNLIMITED}; - dataSpacePara_ = nullptr; - dataSpacePara_ = new H5::DataSpace(1, dims, dimsmax); - - // always create chunked dataset as unlimited is only - // supported with chunked layout - H5::DSetCreatPropList paralist; - hsize_t chunkpara_dims[3] = {MAX_CHUNKED_IMAGES}; - paralist.setChunk(1, chunkpara_dims); - - for (unsigned int i = 0; i < parameterNames_.size(); ++i) { - H5::DataSet *ds = new H5::DataSet(fd_->createDataSet( - parameterNames_[i].c_str(), parameterDataTypes_[i], - *dataSpacePara_, paralist)); - dataSetPara_.push_back(ds); + dataSet = nullptr; + dataSet = new H5::DataSet( + fd->createDataSet(DATASET_NAME, dataType, *dataSpace, plist)); + for (unsigned int i = 0; i < parameterNames.size(); ++i) { + H5::DataSet *ds = new H5::DataSet(fd->createDataSet( + parameterNames[i].c_str(), parameterDataTypes[i], + *dataSpacePara, plistPara)); + dataSetPara.push_back(ds); } } catch (const H5::Exception &error) { error.printErrorStack(); CloseFile(); - throw RuntimeError("Could not create HDF5 handles in object " + - index_); + throw RuntimeError("Could not create HDF5 handles in object " + index); } - if (!silentMode_) { - LOG(logINFO) << "[" << udpPortNumber_ - << "]: HDF5 File created: " << fileName_; + if (!silentMode) { + LOG(logINFO) << "[" << udpPortNumber + << "]: HDF5 File created: " << fileName; } } -void HDF5DataFile::WriteToFile(char *buffer, const int buffersize, +void HDF5DataFile::WriteToFile(char *imageData, sls_receiver_header &header, + const int imageSize, const uint64_t currentFrameNumber, const uint32_t numPacketsCaught) { // check if maxframesperfile = 0 for infinite - if (maxFramesPerFile_ && (numFramesInFile_ >= maxFramesPerFile_)) { + if (maxFramesPerFile && (numFramesInFile >= maxFramesPerFile)) { CloseFile(); - ++subFileIndex_; + ++subFileIndex; CreateFile(); } - ++numFramesInFile_; + ++numFramesInFile; // extend dataset (when receiver start followed by many status starts // (jungfrau))) - if (currentFrameNumber >= extNumImages_) { + if (currentFrameNumber >= extNumImages) { ExtendDataset(); } - WriteDataFile(currentFrameNumber, buffer + sizeof(sls_receiver_header)); - WriteParameterDatasets(currentFrameNumber, (sls_receiver_header *)(buffer)); + WriteImageDatasets(currentFrameNumber, imageData); + WriteParameterDatasets(currentFrameNumber, header); } void HDF5DataFile::Convert12to16Bit(uint16_t *dst, uint8_t *src) { @@ -254,27 +246,27 @@ void HDF5DataFile::Convert12to16Bit(uint16_t *dst, uint8_t *src) { } } -void HDF5DataFile::WriteDataFile(const uint64_t currentFrameNumber, - char *buffer) { +void HDF5DataFile::WriteImageDatasets(const uint64_t currentFrameNumber, + char *buffer) { // expand 12 bit to 16 bits char *revBuffer = buffer; - if (dynamicRange_ == 12) { + if (dynamicRange == 12) { revBuffer = (char *)malloc(EIGER_16_BIT_IMAGE_SIZE); if (revBuffer == nullptr) { throw RuntimeError("Could not allocate memory for 12 bit to " - "16 bit conversion in object " + - std::to_string(index_)); + "16 bit conversion in object " + + std::to_string(index)); } Convert12to16Bit((uint16_t *)revBuffer, (uint8_t *)buffer); } - std::lock_guard lock(*hdf5Lib_); + std::lock_guard lock(*hdf5Lib); uint64_t nDimx = - ((maxFramesPerFile_ == 0) ? currentFrameNumber - : currentFrameNumber % maxFramesPerFile_); - uint32_t nDimy = nPixelsY_; - uint32_t nDimz = ((dynamicRange_ == 4) ? (nPixelsX_ / 2) : nPixelsX_); + ((maxFramesPerFile == 0) ? currentFrameNumber + : currentFrameNumber % maxFramesPerFile); + uint32_t nDimy = nPixelsY; + uint32_t nDimz = ((dynamicRange == 4) ? (nPixelsX / 2) : nPixelsX); hsize_t count[3] = {1, nDimy, nDimz}; hsize_t start[3] = {nDimx, 0, 0}; @@ -282,85 +274,85 @@ void HDF5DataFile::WriteDataFile(const uint64_t currentFrameNumber, try { H5::Exception::dontPrint(); // to handle errors - dataSpace_->selectHyperslab(H5S_SELECT_SET, count, start); + dataSpace->selectHyperslab(H5S_SELECT_SET, count, start); H5::DataSpace memspace(2, dims2); - dataSet_->write(revBuffer, dataType_, memspace, *dataSpace_); + dataSet->write(revBuffer, dataType, memspace, *dataSpace); memspace.close(); - if (dynamicRange_ == 12) { + if (dynamicRange == 12) { free(revBuffer); } } catch (const H5::Exception &error) { - if (dynamicRange_ == 12) { + if (dynamicRange == 12) { free(revBuffer); } - LOG(logERROR) << "Could not write to file in object " << index_; + LOG(logERROR) << "Could not write to file in object " << index; error.printErrorStack(); throw RuntimeError("Could not write to file in object " + - std::to_string(index_)); + std::to_string(index)); } } void HDF5DataFile::WriteParameterDatasets(const uint64_t currentFrameNumber, - sls_receiver_header *rheader) { - std::lock_guard lock(*hdf5Lib_); + sls_receiver_header rheader) { + std::lock_guard lock(*hdf5Lib); uint64_t fnum = - ((maxFramesPerFile_ == 0) ? currentFrameNumber - : currentFrameNumber % maxFramesPerFile_); + ((maxFramesPerFile == 0) ? currentFrameNumber + : currentFrameNumber % maxFramesPerFile); - sls_detector_header header = rheader->detHeader; - hsize_t count[1] = {1}; - hsize_t start[1] = {fnum}; + sls_detector_header header = rheader.detHeader; + hsize_t count[PARA_RANK] = {1}; + hsize_t start[PARA_RANK] = {fnum}; int i = 0; try { H5::Exception::dontPrint(); // to handle errors - dataSpacePara_->selectHyperslab(H5S_SELECT_SET, count, start); + dataSpacePara->selectHyperslab(H5S_SELECT_SET, count, start); H5::DataSpace memspace(H5S_SCALAR); - dataSetPara_[0]->write(&header.frameNumber, parameterDataTypes_[0], - memspace, *dataSpacePara_); + dataSetPara[0]->write(&header.frameNumber, parameterDataTypes[0], + memspace, *dataSpacePara); i = 1; - dataSetPara_[1]->write(&header.expLength, parameterDataTypes_[1], - memspace, *dataSpacePara_); + dataSetPara[1]->write(&header.expLength, parameterDataTypes[1], + memspace, *dataSpacePara); i = 2; - dataSetPara_[2]->write(&header.packetNumber, parameterDataTypes_[2], - memspace, *dataSpacePara_); + dataSetPara[2]->write(&header.packetNumber, parameterDataTypes[2], + memspace, *dataSpacePara); i = 3; - dataSetPara_[3]->write(&header.bunchId, parameterDataTypes_[3], - memspace, *dataSpacePara_); + dataSetPara[3]->write(&header.bunchId, parameterDataTypes[3], memspace, + *dataSpacePara); i = 4; - dataSetPara_[4]->write(&header.timestamp, parameterDataTypes_[4], - memspace, *dataSpacePara_); + dataSetPara[4]->write(&header.timestamp, parameterDataTypes[4], + memspace, *dataSpacePara); i = 5; - dataSetPara_[5]->write(&header.modId, parameterDataTypes_[5], memspace, - *dataSpacePara_); + dataSetPara[5]->write(&header.modId, parameterDataTypes[5], memspace, + *dataSpacePara); i = 6; - dataSetPara_[6]->write(&header.row, parameterDataTypes_[6], memspace, - *dataSpacePara_); + dataSetPara[6]->write(&header.row, parameterDataTypes[6], memspace, + *dataSpacePara); i = 7; - dataSetPara_[7]->write(&header.column, parameterDataTypes_[7], memspace, - *dataSpacePara_); + dataSetPara[7]->write(&header.column, parameterDataTypes[7], memspace, + *dataSpacePara); i = 8; - dataSetPara_[8]->write(&header.reserved, parameterDataTypes_[8], - memspace, *dataSpacePara_); + dataSetPara[8]->write(&header.reserved, parameterDataTypes[8], memspace, + *dataSpacePara); i = 9; - dataSetPara_[9]->write(&header.debug, parameterDataTypes_[9], memspace, - *dataSpacePara_); + dataSetPara[9]->write(&header.debug, parameterDataTypes[9], memspace, + *dataSpacePara); i = 10; - dataSetPara_[10]->write(&header.roundRNumber, parameterDataTypes_[10], - memspace, *dataSpacePara_); + dataSetPara[10]->write(&header.roundRNumber, parameterDataTypes[10], + memspace, *dataSpacePara); i = 11; - dataSetPara_[11]->write(&header.detType, parameterDataTypes_[11], - memspace, *dataSpacePara_); + dataSetPara[11]->write(&header.detType, parameterDataTypes[11], + memspace, *dataSpacePara); i = 12; - dataSetPara_[12]->write(&header.version, parameterDataTypes_[12], - memspace, *dataSpacePara_); + dataSetPara[12]->write(&header.version, parameterDataTypes[12], + memspace, *dataSpacePara); i = 13; // contiguous bitset if (sizeof(sls_bitset) == sizeof(bitset_storage)) { - dataSetPara_[13]->write((char *)&(rheader->packetsMask), - parameterDataTypes_[13], memspace, - *dataSpacePara_); + dataSetPara[13]->write((char *)&(rheader.packetsMask), + parameterDataTypes[13], memspace, + *dataSpacePara); } // not contiguous bitset @@ -368,54 +360,53 @@ void HDF5DataFile::WriteParameterDatasets(const uint64_t currentFrameNumber, // get contiguous representation of bit mask bitset_storage storage; memset(storage, 0, sizeof(bitset_storage)); - sls_bitset bits = rheader->packetsMask; + sls_bitset bits = rheader.packetsMask; for (int i = 0; i < MAX_NUM_PACKETS; ++i) storage[i >> 3] |= (bits[i] << (i & 7)); // write bitmask - dataSetPara_[13]->write((char *)storage, parameterDataTypes_[13], - memspace, *dataSpacePara_); + dataSetPara[13]->write((char *)storage, parameterDataTypes[13], + memspace, *dataSpacePara); } i = 14; } catch (const H5::Exception &error) { error.printErrorStack(); throw RuntimeError( "Could not write parameters (index:" + std::to_string(i) + - ") to file in object " + std::to_string(index_)); + ") to file in object " + std::to_string(index)); } } void HDF5DataFile::ExtendDataset() { - std::lock_guard lock(*hdf5Lib_); + std::lock_guard lock(*hdf5Lib); try { H5::Exception::dontPrint(); // to handle errors - hsize_t dims[3]; - dataSpace_->getSimpleExtentDims(dims); - dims[0] += numImages_; + hsize_t dims[DATA_RANK]; + dataSpace->getSimpleExtentDims(dims); + dims[0] += numImages; + dataSet->extend(dims); + delete dataSpace; + dataSpace = nullptr; + dataSpace = new H5::DataSpace(dataSet->getSpace()); - dataSet_->extend(dims); - delete dataSpace_; - dataSpace_ = nullptr; - dataSpace_ = new H5::DataSpace(dataSet_->getSpace()); - - hsize_t dims_para[1] = {dims[0]}; - for (unsigned int i = 0; i < dataSetPara_.size(); ++i) - dataSetPara_[i]->extend(dims_para); - delete dataSpacePara_; - dataSpacePara_ = nullptr; - dataSpacePara_ = new H5::DataSpace(dataSetPara_[0]->getSpace()); + hsize_t dimsPara[PARA_RANK] = {dims[0]}; + for (unsigned int i = 0; i < dataSetPara.size(); ++i) + dataSetPara[i]->extend(dimsPara); + delete dataSpacePara; + dataSpacePara = nullptr; + dataSpacePara = new H5::DataSpace(dataSetPara[0]->getSpace()); } catch (const H5::Exception &error) { error.printErrorStack(); throw RuntimeError("Could not extend dataset in object " + - std::to_string(index_)); + std::to_string(index)); } - if (!silentMode_) { - LOG(logINFO) << index_ << " Extending HDF5 dataset by " << extNumImages_ - << ", Total x Dimension: " << (extNumImages_ + numImages_); + if (!silentMode) { + LOG(logINFO) << index << " Extending HDF5 dataset by " << extNumImages + << ", Total x Dimension: " << (extNumImages + numImages); } - extNumImages_ += numImages_; + extNumImages += numImages; } } // namespace sls diff --git a/slsReceiverSoftware/src/HDF5DataFile.h b/slsReceiverSoftware/src/HDF5DataFile.h index a6d32ae15..c8eaef937 100644 --- a/slsReceiverSoftware/src/HDF5DataFile.h +++ b/slsReceiverSoftware/src/HDF5DataFile.h @@ -14,6 +14,7 @@ class HDF5DataFile : private virtual slsDetectorDefs, public File { HDF5DataFile(const int index, std::mutex *hdf5Lib); ~HDF5DataFile(); + fileFormat GetFileFormat() const override; std::string GetFileName() const override; uint32_t GetFilesInAcquisition() const override; H5::DataType GetPDataType() const override; @@ -22,59 +23,53 @@ class HDF5DataFile : private virtual slsDetectorDefs, public File { void CloseFile() override; - void CreateFirstHDF5DataFile( - const std::string filePath, const std::string fileNamePrefix, - const uint64_t fileIndex, const bool overWriteEnable, - const bool silentMode, const int modulePos, - const int numUnitsPerReadout, const uint32_t udpPortNumber, - const uint32_t maxFramesPerFile, const uint64_t numImages, - const uint32_t nPixelsX, const uint32_t nPixelsY, - const uint32_t dynamicRange) override; + void CreateFirstHDF5DataFile(const std::string &fNamePrefix, + const uint64_t fIndex, const bool owEnable, + const bool sMode, const uint32_t uPortNumber, + const uint32_t mFramesPerFile, + const uint64_t nImages, const uint32_t nX, + const uint32_t nY, const uint32_t dr) override; - void WriteToFile(char *buffer, const int buffersize, - const uint64_t currentFrameNumber, + void WriteToFile(char *imageData, sls_receiver_header &header, + const int imageSize, const uint64_t currentFrameNumber, const uint32_t numPacketsCaught) override; private: void CreateFile(); void Convert12to16Bit(uint16_t *dst, uint8_t *src); - void WriteDataFile(const uint64_t currentFrameNumber, char *buffer); + void WriteImageDatasets(const uint64_t currentFrameNumber, char *buffer); void WriteParameterDatasets(const uint64_t currentFrameNumber, - sls_receiver_header *rheader); + sls_receiver_header rheader); void ExtendDataset(); - int index_; - std::mutex *hdf5Lib_; - H5::H5File *fd_{nullptr}; - std::string fileName_; - std::string dataSetName_; - H5::DataSpace *dataSpace_{nullptr}; - H5::DataSet *dataSet_{nullptr}; - H5::DataType dataType_{H5::PredType::STD_U16LE}; + int index; + std::mutex *hdf5Lib; + H5::H5File *fd{nullptr}; + std::string fileName; + H5::DataSpace *dataSpace{nullptr}; + H5::DataSet *dataSet{nullptr}; + H5::DataType dataType{H5::PredType::STD_U16LE}; - H5::DataSpace *dataSpacePara_{nullptr}; - std::vector dataSetPara_{nullptr}; - std::vector parameterNames_; - std::vector parameterDataTypes_; + H5::DataSpace *dataSpacePara{nullptr}; + std::vector dataSetPara{nullptr}; + std::vector parameterNames; + std::vector parameterDataTypes; - uint32_t subFileIndex_{0}; - uint32_t numFramesInFile_{0}; - uint32_t numFilesInAcquisition_{0}; - uint32_t maxFramesPerFile_{0}; - uint64_t numImages_{0}; - uint64_t extNumImages_{0}; - uint32_t nPixelsX_{0}; - uint32_t nPixelsY_{0}; - uint32_t dynamicRange_{0}; + uint32_t subFileIndex{0}; + uint32_t numFramesInFile{0}; + uint32_t numFilesInAcquisition{0}; + uint32_t maxFramesPerFile{0}; + uint64_t numImages{0}; + uint64_t extNumImages{0}; + uint32_t nPixelsX{0}; + uint32_t nPixelsY{0}; + uint32_t dynamicRange{0}; - std::string filePath_; - std::string fileNamePrefix_; - uint64_t fileIndex_{0}; - bool overWriteEnable_{false}; - bool silentMode_{false}; - int detIndex_{0}; - int numUnitsPerReadout_{0}; - uint32_t udpPortNumber_{0}; + std::string fileNamePrefix; + uint64_t fileIndex{0}; + bool overWriteEnable{false}; + bool silentMode{false}; + uint32_t udpPortNumber{0}; static const int EIGER_NUM_PIXELS{256 * 2 * 256}; static const int EIGER_16_BIT_IMAGE_SIZE{EIGER_NUM_PIXELS * 2}; diff --git a/slsReceiverSoftware/src/Implementation.cpp b/slsReceiverSoftware/src/Implementation.cpp index 54721701d..d67fd0cee 100644 --- a/slsReceiverSoftware/src/Implementation.cpp +++ b/slsReceiverSoftware/src/Implementation.cpp @@ -66,23 +66,23 @@ void Implementation::SetThreadPriorities() { void Implementation::SetupFifoStructure() { fifo.clear(); - for (int i = 0; i < numUDPInterfaces; ++i) { - uint32_t datasize = generalData->imageSize; + for (int i = 0; i < generalData->numUDPInterfaces; ++i) { + size_t datasize = generalData->imageSize; // veto data size - if (detType == GOTTHARD2 && i != 0) { + if (generalData->detType == GOTTHARD2 && i != 0) { datasize = generalData->vetoImageSize; } + datasize += IMAGE_STRUCTURE_HEADER_SIZE; // create fifo structure try { - fifo.push_back(sls::make_unique( - i, datasize + (generalData->fifoBufferHeaderSize), fifoDepth)); + fifo.push_back( + sls::make_unique(i, datasize, generalData->fifoDepth)); } catch (...) { fifo.clear(); - fifoDepth = 0; - throw RuntimeError( - "Could not allocate memory for fifo structure " + - std::to_string(i) + ". FifoDepth is now 0."); + generalData->fifoDepth = 0; + throw RuntimeError("Could not allocate memory for fifo structure " + + std::to_string(i) + ". FifoDepth is now 0."); } // set the listener & dataprocessor threads to point to the right fifo if (listener.size()) @@ -93,13 +93,12 @@ void Implementation::SetupFifoStructure() { dataStreamer[i]->SetFifo(fifo[i].get()); LOG(logINFO) << "Memory Allocated for Fifo " << i << ": " - << (double)(((size_t)(datasize) + - (size_t)(generalData->fifoBufferHeaderSize)) * - (size_t)fifoDepth) / + << (double)(datasize * (size_t)generalData->fifoDepth) / (double)(1024 * 1024) << " MB"; } - LOG(logINFO) << numUDPInterfaces << " Fifo structure(s) reconstructed"; + LOG(logINFO) << generalData->numUDPInterfaces + << " Fifo structure(s) reconstructed"; } /************************************************** @@ -110,8 +109,7 @@ void Implementation::SetupFifoStructure() { void Implementation::setDetectorType(const detectorType d) { - detType = d; - switch (detType) { + switch (d) { case GOTTHARD: case EIGER: case JUNGFRAU: @@ -123,14 +121,14 @@ void Implementation::setDetectorType(const detectorType d) { break; default: throw RuntimeError("This is an unknown receiver type " + - std::to_string(static_cast(d))); + std::to_string(static_cast(d))); } delete generalData; generalData = nullptr; // set detector specific variables - switch (detType) { + switch (d) { case GOTTHARD: generalData = new GotthardData(); break; @@ -156,41 +154,17 @@ void Implementation::setDetectorType(const detectorType d) { break; } - framesPerFile = generalData->maxFramesPerFile; - fifoDepth = generalData->defaultFifoDepth; - numUDPInterfaces = generalData->numUDPInterfaces; - udpSocketBufferSize = generalData->defaultUdpSocketBufferSize; - dynamicRange = generalData->dynamicRange; - tengigaEnable = generalData->tengigaEnable; - numberOfAnalogSamples = generalData->nAnalogSamples; - numberOfDigitalSamples = generalData->nDigitalSamples; - readoutType = generalData->readoutType; - adcEnableMaskOneGiga = generalData->adcEnableMaskOneGiga; - adcEnableMaskTenGiga = generalData->adcEnableMaskTenGiga; - detectorRoi = generalData->roi; - counterMask = generalData->counterMask; - SetLocalNetworkParameters(); SetupFifoStructure(); // create threads - for (int i = 0; i < numUDPInterfaces; ++i) { + for (int i = 0; i < generalData->numUDPInterfaces; ++i) { try { - auto fifo_ptr = fifo[i].get(); - listener.push_back(sls::make_unique( - i, detType, fifo_ptr, &status, &udpPortNum[i], ð[i], - &udpSocketBufferSize, &actualUDPSocketBufferSize, - &framesPerFile, &frameDiscardMode, &detectorDataStream[i], - &silentMode)); - int ctbAnalogDataBytes = 0; - if (detType == CHIPTESTBOARD) { - ctbAnalogDataBytes = generalData->GetNumberOfAnalogDatabytes(); - } - dataProcessor.push_back(sls::make_unique( - i, detType, fifo_ptr, &dataStreamEnable, &streamingFrequency, - &streamingTimerInMs, &streamingStartFnum, &framePadding, - &ctbDbitList, &ctbDbitOffset, &ctbAnalogDataBytes)); + listener.push_back(sls::make_unique(i, &status)); + SetupListener(i); + dataProcessor.push_back(sls::make_unique(i)); + SetupDataProcessor(i); } catch (...) { listener.clear(); dataProcessor.clear(); @@ -200,30 +174,60 @@ void Implementation::setDetectorType(const detectorType d) { } } - // set up writer and callbacks - for (const auto &it : listener) { - it->SetGeneralData(generalData); - it->SetActivate(activated); - } - for (const auto &it : dataProcessor) { - it->SetGeneralData(generalData); - it->SetActivate(activated); - } SetThreadPriorities(); LOG(logDEBUG) << " Detector type set to " << ToString(d); } +void Implementation::SetupListener(int i) { + listener[i]->SetFifo(fifo[i].get()); + listener[i]->SetGeneralData(generalData); + listener[i]->SetUdpPortNumber(udpPortNum[i]); + listener[i]->SetEthernetInterface(eth[i]); + listener[i]->SetActivate(activated); + listener[i]->SetNoRoi(portRois[i].noRoi()); + listener[i]->SetDetectorDatastream(detectorDataStream[i]); + listener[i]->SetFrameDiscardPolicy(frameDiscardMode); + listener[i]->SetSilentMode(silentMode); +} + +void Implementation::SetupDataProcessor(int i) { + dataProcessor[i]->SetFifo(fifo[i].get()); + dataProcessor[i]->SetGeneralData(generalData); + dataProcessor[i]->SetActivate(activated); + dataProcessor[i]->SetReceiverROI(portRois[i]); + dataProcessor[i]->SetDataStreamEnable(dataStreamEnable); + dataProcessor[i]->SetStreamingFrequency(streamingFrequency); + dataProcessor[i]->SetStreamingTimerInMs(streamingTimerInMs); + dataProcessor[i]->SetStreamingStartFnum(streamingStartFnum); + dataProcessor[i]->SetFramePadding(framePadding); + dataProcessor[i]->SetCtbDbitList(ctbDbitList); + dataProcessor[i]->SetCtbDbitOffset(ctbDbitOffset); +} + +void Implementation::SetupDataStreamer(int i) { + dataStreamer[i]->SetFifo(fifo[i].get()); + dataStreamer[i]->SetGeneralData(generalData); + dataStreamer[i]->CreateZmqSockets(streamingPort, streamingSrcIP, + streamingHwm); + dataStreamer[i]->SetAdditionalJsonHeader(additionalJsonHeader); + dataStreamer[i]->SetFileIndex(fileIndex); + dataStreamer[i]->SetFlipRows(flipRows); + dataStreamer[i]->SetNumberofPorts(numPorts); + dataStreamer[i]->SetQuadEnable(quadEnable); + dataStreamer[i]->SetNumberofTotalFrames(numberOfTotalFrames); +} + slsDetectorDefs::xy Implementation::getDetectorSize() const { return numModules; } const slsDetectorDefs::xy Implementation::GetPortGeometry() const { xy portGeometry{1, 1}; - if (detType == EIGER) - portGeometry.x = numUDPInterfaces; - else if (detType == JUNGFRAU) - portGeometry.y = numUDPInterfaces; + if (generalData->detType == EIGER) + portGeometry.x = generalData->numUDPInterfaces; + else if (generalData->detType == JUNGFRAU) + portGeometry.y = generalData->numUDPInterfaces; return portGeometry; } @@ -285,14 +289,16 @@ bool Implementation::getSilentMode() const { return silentMode; } void Implementation::setSilentMode(const bool i) { silentMode = i; + for (const auto &it : listener) + it->SetSilentMode(silentMode); LOG(logINFO) << "Silent Mode: " << i; } -uint32_t Implementation::getFifoDepth() const { return fifoDepth; } +uint32_t Implementation::getFifoDepth() const { return generalData->fifoDepth; } void Implementation::setFifoDepth(const uint32_t i) { - if (fifoDepth != i) { - fifoDepth = i; + if (generalData->fifoDepth != i) { + generalData->fifoDepth = i; SetupFifoStructure(); } LOG(logINFO) << "Fifo Depth: " << i; @@ -305,6 +311,8 @@ Implementation::getFrameDiscardPolicy() const { void Implementation::setFrameDiscardPolicy(const frameDiscardPolicy i) { frameDiscardMode = i; + for (const auto &it : listener) + it->SetFrameDiscardPolicy(frameDiscardMode); LOG(logINFO) << "Frame Discard Policy: " << ToString(frameDiscardMode); } @@ -312,6 +320,8 @@ bool Implementation::getFramePaddingEnable() const { return framePadding; } void Implementation::setFramePaddingEnable(const bool i) { framePadding = i; + for (const auto &it : dataProcessor) + it->SetFramePadding(framePadding); LOG(logINFO) << "Frame Padding: " << framePadding; } @@ -332,7 +342,7 @@ std::array Implementation::getThreadIds() const { } else { retval[id++] = 0; } - if (numUDPInterfaces == 2) { + if (generalData->numUDPInterfaces == 2) { retval[id++] = listener[1]->GetThreadId(); retval[id++] = dataProcessor[1]->GetThreadId(); if (dataStreamEnable) { @@ -356,9 +366,10 @@ void Implementation::setArping(const bool i, arping.StopThread(); } else { // setup interface - for (int i = 0; i != numUDPInterfaces; ++i) { + for (int i = 0; i != generalData->numUDPInterfaces; ++i) { // ignore eiger with 2 interfaces (only udp port) - if (i == 1 && (numUDPInterfaces == 1 || detType == EIGER)) { + if (i == 1 && (generalData->numUDPInterfaces == 1 || + generalData->detType == EIGER)) { break; } arping.SetInterfacesAndIps(i, eth[i], ips[i]); @@ -375,13 +386,14 @@ slsDetectorDefs::ROI Implementation::getReceiverROI() const { void Implementation::setReceiverROI(const slsDetectorDefs::ROI arg) { receiverRoi = arg; - if (numUDPInterfaces == 1 || detType == slsDetectorDefs::GOTTHARD2) { + if (generalData->numUDPInterfaces == 1 || + generalData->detType == slsDetectorDefs::GOTTHARD2) { portRois[0] = arg; } else { slsDetectorDefs::xy nPortDim(generalData->nPixelsX, generalData->nPixelsY); - for (int iPort = 0; iPort != numUDPInterfaces; ++iPort) { + for (int iPort = 0; iPort != generalData->numUDPInterfaces; ++iPort) { // default init = complete roi slsDetectorDefs::ROI portRoi{}; @@ -445,7 +457,8 @@ void Implementation::setReceiverROI(const slsDetectorDefs::ROI arg) { for (size_t i = 0; i != dataProcessor.size(); ++i) dataProcessor[i]->SetReceiverROI(portRois[i]); LOG(logINFO) << "receiver roi: " << ToString(receiverRoi); - if (numUDPInterfaces == 2 && detType != slsDetectorDefs::GOTTHARD2) { + if (generalData->numUDPInterfaces == 2 && + generalData->detType != slsDetectorDefs::GOTTHARD2) { LOG(logINFO) << "port rois: " << ToString(portRois); } } @@ -506,6 +519,8 @@ uint64_t Implementation::getFileIndex() const { return fileIndex; } void Implementation::setFileIndex(const uint64_t i) { fileIndex = i; + for (const auto &it : dataStreamer) + it->SetFileIndex(fileIndex); LOG(logINFO) << "File Index: " << fileIndex; } @@ -541,11 +556,13 @@ void Implementation::setOverwriteEnable(const bool b) { << (overwriteEnable ? "enabled" : "disabled"); } -uint32_t Implementation::getFramesPerFile() const { return framesPerFile; } +uint32_t Implementation::getFramesPerFile() const { + return generalData->framesPerFile; +} void Implementation::setFramesPerFile(const uint32_t i) { - framesPerFile = i; - LOG(logINFO) << "Frames per file: " << framesPerFile; + generalData->framesPerFile = i; + LOG(logINFO) << "Frames per file: " << generalData->framesPerFile; } /************************************************** @@ -556,7 +573,7 @@ void Implementation::setFramesPerFile(const uint32_t i) { slsDetectorDefs::runStatus Implementation::getStatus() const { return status; } std::vector Implementation::getFramesCaught() const { - std::vector numFramesCaught(numUDPInterfaces); + std::vector numFramesCaught(generalData->numUDPInterfaces); int index = 0; for (const auto &it : listener) { if (it->GetStartedFlag()) { @@ -568,7 +585,7 @@ std::vector Implementation::getFramesCaught() const { } std::vector Implementation::getCurrentFrameIndex() const { - std::vector frameIndex(numUDPInterfaces); + std::vector frameIndex(generalData->numUDPInterfaces); int index = 0; for (const auto &it : listener) { if (it->GetStartedFlag()) { @@ -580,14 +597,24 @@ std::vector Implementation::getCurrentFrameIndex() const { } double Implementation::getProgress() const { - if (!activated || (!detectorDataStream[0] && !detectorDataStream[1])) { + std::vector disabledPort; + for (auto &it : listener) { + disabledPort.push_back(it->isPortDisabled()); + } + + // all ports disabled + if (allEqualTo(disabledPort, true)) { return 100.00; } - // if disabled, considering only 1 port + // any disabled double totalFrames = (double)(numberOfTotalFrames * listener.size()); - if (!detectorDataStream[0] || !detectorDataStream[1]) { - totalFrames /= 2; + if (anyEqualTo(disabledPort, true)) { + for (auto it : disabledPort) { + if (it) { + totalFrames /= 2; + } + } } double progress = 0; @@ -603,8 +630,8 @@ double Implementation::getProgress() const { } std::vector Implementation::getNumMissingPackets() const { - std::vector mp(numUDPInterfaces); - for (int i = 0; i < numUDPInterfaces; ++i) { + std::vector mp(generalData->numUDPInterfaces); + for (int i = 0; i < generalData->numUDPInterfaces; ++i) { int np = generalData->packetsPerFrame; uint64_t totnp = np; // ReadNRows @@ -639,7 +666,7 @@ void Implementation::startReceiver() { pStartAcquisition); } catch (const std::exception &e) { throw RuntimeError("Start Acquisition Callback Error: " + - std::string(e.what())); + std::string(e.what())); } if (rawDataReadyCallBack != nullptr) { LOG(logINFO) << "Data Write has been defined externally"; @@ -708,7 +735,7 @@ void Implementation::stopReceiver() { auto mp = getNumMissingPackets(); // print summary uint64_t tot = 0; - for (int i = 0; i < numUDPInterfaces; i++) { + for (int i = 0; i < generalData->numUDPInterfaces; i++) { int nf = listener[i]->GetNumCompleteFramesCaught(); tot += nf; std::string mpMessage = std::to_string(mp[i]); @@ -726,7 +753,7 @@ void Implementation::stopReceiver() { } else if (portRois[i].noRoi()) { summary = (i == 0 ? "\n\tNo Roi on Left Port" : "\n\tNo Roi on Right Port"); - } else { + } else { std::ostringstream os; os << "\n\tMissing Packets\t\t: " << mpMessage << "\n\tComplete Frames\t\t: " << nf @@ -742,16 +769,16 @@ void Implementation::stopReceiver() { // callback if (acquisitionFinishedCallBack) { try { - acquisitionFinishedCallBack((tot / numUDPInterfaces), - pAcquisitionFinished); + acquisitionFinishedCallBack( + (tot / generalData->numUDPInterfaces), + pAcquisitionFinished); } catch (const std::exception &e) { // change status status = IDLE; LOG(logINFO) << "Receiver Stopped"; LOG(logINFO) << "Status: " << ToString(status); - throw RuntimeError( - "Acquisition Finished Callback Error: " + - std::string(e.what())); + throw RuntimeError("Acquisition Finished Callback Error: " + + std::string(e.what())); } } } @@ -828,7 +855,7 @@ void Implementation::ResetParametersforNewAcquisition() { void Implementation::CreateUDPSockets() { try { for (unsigned int i = 0; i < listener.size(); ++i) { - listener[i]->CreateUDPSockets(); + listener[i]->CreateUDPSocket(actualUDPSocketBufferSize); } } catch (const RuntimeError &e) { shutDownUDPSockets(); @@ -840,10 +867,13 @@ void Implementation::CreateUDPSockets() { void Implementation::SetupWriter() { try { for (unsigned int i = 0; i < dataProcessor.size(); ++i) { + std::ostringstream os; + os << filePath << "/" << fileName << "_d" + << (modulePos * generalData->numUDPInterfaces + i); + std::string fileNamePrefix = os.str(); dataProcessor[i]->CreateFirstFiles( - filePath, fileName, fileIndex, overwriteEnable, silentMode, - modulePos, numUDPInterfaces, udpPortNum[i], framesPerFile, - numberOfTotalFrames, dynamicRange, detectorDataStream[i]); + fileNamePrefix, fileIndex, overwriteEnable, silentMode, + udpPortNum[i], numberOfTotalFrames, detectorDataStream[i]); } } catch (const RuntimeError &e) { shutDownUDPSockets(); @@ -859,25 +889,24 @@ void Implementation::StartMasterWriter() { // master file if (masterFileWriteEnable) { MasterAttributes masterAttributes; - masterAttributes.detType = detType; + masterAttributes.detType = generalData->detType; masterAttributes.timingMode = timingMode; masterAttributes.geometry = numPorts; masterAttributes.imageSize = generalData->imageSize; masterAttributes.nPixels = xy(generalData->nPixelsX, generalData->nPixelsY); - masterAttributes.maxFramesPerFile = framesPerFile; + masterAttributes.maxFramesPerFile = generalData->framesPerFile; masterAttributes.frameDiscardMode = frameDiscardMode; masterAttributes.framePadding = framePadding; masterAttributes.scanParams = scanParams; masterAttributes.totalFrames = numberOfTotalFrames; - masterAttributes.receiverRoi = - receiverRoiMetadata; + masterAttributes.receiverRoi = receiverRoiMetadata; masterAttributes.exptime = acquisitionTime; masterAttributes.period = acquisitionPeriod; masterAttributes.burstMode = burstMode; - masterAttributes.numUDPInterfaces = numUDPInterfaces; - masterAttributes.dynamicRange = dynamicRange; - masterAttributes.tenGiga = tengigaEnable; + masterAttributes.numUDPInterfaces = generalData->numUDPInterfaces; + masterAttributes.dynamicRange = generalData->dynamicRange; + masterAttributes.tenGiga = generalData->tengigaEnable; masterAttributes.thresholdEnergyeV = thresholdEnergyeV; masterAttributes.thresholdAllEnergyeV = thresholdAllEnergyeV; masterAttributes.subExptime = subExpTime; @@ -885,25 +914,28 @@ void Implementation::StartMasterWriter() { masterAttributes.quad = quadEnable; masterAttributes.readNRows = readNRows; masterAttributes.ratecorr = rateCorrections; - masterAttributes.adcmask = - tengigaEnable ? adcEnableMaskTenGiga : adcEnableMaskOneGiga; - masterAttributes.analog = (readoutType == ANALOG_ONLY || - readoutType == ANALOG_AND_DIGITAL) - ? 1 - : 0; - masterAttributes.analogSamples = numberOfAnalogSamples; - masterAttributes.digital = (readoutType == DIGITAL_ONLY || - readoutType == ANALOG_AND_DIGITAL) - ? 1 - : 0; - masterAttributes.digitalSamples = numberOfDigitalSamples; + masterAttributes.adcmask = generalData->tengigaEnable + ? generalData->adcEnableMaskTenGiga + : generalData->adcEnableMaskOneGiga; + masterAttributes.analog = + (generalData->readoutType == ANALOG_ONLY || + generalData->readoutType == ANALOG_AND_DIGITAL) + ? 1 + : 0; + masterAttributes.analogSamples = generalData->nAnalogSamples; + masterAttributes.digital = + (generalData->readoutType == DIGITAL_ONLY || + generalData->readoutType == ANALOG_AND_DIGITAL) + ? 1 + : 0; + masterAttributes.digitalSamples = generalData->nDigitalSamples; masterAttributes.dbitoffset = ctbDbitOffset; masterAttributes.dbitlist = 0; for (auto &i : ctbDbitList) { masterAttributes.dbitlist |= (1 << i); } - masterAttributes.detectorRoi = detectorRoi; - masterAttributes.counterMask = counterMask; + masterAttributes.detectorRoi = generalData->detectorRoi; + masterAttributes.counterMask = generalData->counterMask; masterAttributes.exptimeArray[0] = acquisitionTime1; masterAttributes.exptimeArray[1] = acquisitionTime2; masterAttributes.exptimeArray[2] = acquisitionTime3; @@ -924,12 +956,10 @@ void Implementation::StartMasterWriter() { // create virtual hdf5 file (if multiple files) if (dataProcessor[0]->GetFilesInAcquisition() > 1 || (numPorts.x * numPorts.y) > 1) { - virtualFileName = - dataProcessor[0]->CreateVirtualFile( - filePath, fileName, fileIndex, overwriteEnable, - silentMode, modulePos, numUDPInterfaces, framesPerFile, - numberOfTotalFrames, numPorts.x, numPorts.y, - dynamicRange, &hdf5LibMutex); + virtualFileName = dataProcessor[0]->CreateVirtualFile( + filePath, fileName, fileIndex, overwriteEnable, silentMode, + modulePos, numberOfTotalFrames, numPorts.x, numPorts.y, + &hdf5LibMutex); } // link file in master if (masterFileWriteEnable) { @@ -940,7 +970,8 @@ void Implementation::StartMasterWriter() { #endif } catch (std::exception &e) { // ignore it and just print it - LOG(logWARNING) << "Caught exception when handling virtual hdf5 file [" << e.what() << "]"; + LOG(logWARNING) << "Caught exception when handling virtual hdf5 file [" + << e.what() << "]"; } } @@ -968,17 +999,16 @@ void Implementation::StartRunning() { * * * ************************************************/ int Implementation::getNumberofUDPInterfaces() const { - return numUDPInterfaces; + return generalData->numUDPInterfaces; } // not Eiger void Implementation::setNumberofUDPInterfaces(const int n) { - if (detType == EIGER) { - throw RuntimeError( - "Cannot set number of UDP interfaces for Eiger"); + if (generalData->detType == EIGER) { + throw RuntimeError("Cannot set number of UDP interfaces for Eiger"); } - if (numUDPInterfaces != n) { + if (generalData->numUDPInterfaces != n) { // clear all threads and fifos listener.clear(); dataProcessor.clear(); @@ -987,41 +1017,21 @@ void Implementation::setNumberofUDPInterfaces(const int n) { // set local variables generalData->SetNumberofInterfaces(n); - numUDPInterfaces = n; + generalData->numUDPInterfaces = n; // fifo - udpSocketBufferSize = generalData->defaultUdpSocketBufferSize; SetupFifoStructure(); // recalculate port rois setReceiverROI(receiverRoi); // create threads - for (int i = 0; i < numUDPInterfaces; ++i) { + for (int i = 0; i < generalData->numUDPInterfaces; ++i) { // listener and dataprocessor threads try { - auto fifo_ptr = fifo[i].get(); - listener.push_back(sls::make_unique( - i, detType, fifo_ptr, &status, &udpPortNum[i], ð[i], - &udpSocketBufferSize, &actualUDPSocketBufferSize, - &framesPerFile, &frameDiscardMode, &detectorDataStream[i], - &silentMode)); - listener[i]->SetGeneralData(generalData); - listener[i]->SetActivate(activated); - listener[i]->SetNoRoi(portRois[i].noRoi()); - - int ctbAnalogDataBytes = 0; - if (detType == CHIPTESTBOARD) { - ctbAnalogDataBytes = - generalData->GetNumberOfAnalogDatabytes(); - } - dataProcessor.push_back(sls::make_unique( - i, detType, fifo_ptr, &dataStreamEnable, - &streamingFrequency, &streamingTimerInMs, - &streamingStartFnum, &framePadding, &ctbDbitList, - &ctbDbitOffset, &ctbAnalogDataBytes)); - dataProcessor[i]->SetGeneralData(generalData); - dataProcessor[i]->SetActivate(activated); - dataProcessor[i]->SetReceiverROI(portRois[i]); + listener.push_back(sls::make_unique(i, &status)); + SetupListener(i); + dataProcessor.push_back(sls::make_unique(i)); + SetupDataProcessor(i); } catch (...) { listener.clear(); dataProcessor.clear(); @@ -1029,27 +1039,18 @@ void Implementation::setNumberofUDPInterfaces(const int n) { "Could not create listener/dataprocessor threads (index:" + std::to_string(i) + ")"); } + // streamer threads if (dataStreamEnable) { try { - bool flip = flipRows; - if (quadEnable) { - flip = (i == 1 ? true : false); - } - dataStreamer.push_back(sls::make_unique( - i, fifo[i].get(), &dynamicRange, &detectorRoi, - &fileIndex, flip, numPorts, &quadEnable, - &numberOfTotalFrames)); - dataStreamer[i]->SetGeneralData(generalData); - dataStreamer[i]->CreateZmqSockets( - &numUDPInterfaces, streamingPort, streamingSrcIP, - streamingHwm); - dataStreamer[i]->SetAdditionalJsonHeader( - additionalJsonHeader); + dataStreamer.push_back(sls::make_unique(i)); + SetupDataStreamer(i); } catch (...) { if (dataStreamEnable) { dataStreamer.clear(); dataStreamEnable = false; + for (const auto &it : dataProcessor) + it->SetDataStreamEnable(dataStreamEnable); } throw RuntimeError( "Could not create datastreamer threads (index:" + @@ -1081,13 +1082,14 @@ void Implementation::setNumberofUDPInterfaces(const int n) { setUDPSocketBufferSize(0); } - LOG(logINFO) << "Number of Interfaces: " << numUDPInterfaces; + LOG(logINFO) << "Number of Interfaces: " << generalData->numUDPInterfaces; } std::string Implementation::getEthernetInterface() const { return eth[0]; } void Implementation::setEthernetInterface(const std::string &c) { eth[0] = c; + listener[0]->SetEthernetInterface(c); LOG(logINFO) << "Ethernet Interface: " << eth[0]; } @@ -1095,6 +1097,9 @@ std::string Implementation::getEthernetInterface2() const { return eth[1]; } void Implementation::setEthernetInterface2(const std::string &c) { eth[1] = c; + if (listener.size() > 1) { + listener[1]->SetEthernetInterface(c); + } LOG(logINFO) << "Ethernet Interface 2: " << eth[1]; } @@ -1102,6 +1107,7 @@ uint32_t Implementation::getUDPPortNumber() const { return udpPortNum[0]; } void Implementation::setUDPPortNumber(const uint32_t i) { udpPortNum[0] = i; + listener[0]->SetUdpPortNumber(i); LOG(logINFO) << "UDP Port Number[0]: " << udpPortNum[0]; } @@ -1109,32 +1115,30 @@ uint32_t Implementation::getUDPPortNumber2() const { return udpPortNum[1]; } void Implementation::setUDPPortNumber2(const uint32_t i) { udpPortNum[1] = i; + if (listener.size() > 1) { + listener[1]->SetUdpPortNumber(i); + } LOG(logINFO) << "UDP Port Number[1]: " << udpPortNum[1]; } int Implementation::getUDPSocketBufferSize() const { - return udpSocketBufferSize; + return generalData->udpSocketBufferSize; } void Implementation::setUDPSocketBufferSize(const int s) { - // custom setup is not 0 (must complain if set up didnt work) - // testing default setup at startup, argument is 0 to use default values - int size = (s == 0) ? udpSocketBufferSize : s; size_t listSize = listener.size(); - if ((detType == JUNGFRAU || detType == GOTTHARD2) && - (int)listSize != numUDPInterfaces) { - throw RuntimeError( - "Number of Interfaces " + std::to_string(numUDPInterfaces) + - " do not match listener size " + std::to_string(listSize)); + if ((generalData->detType == JUNGFRAU || + generalData->detType == GOTTHARD2) && + (int)listSize != generalData->numUDPInterfaces) { + throw RuntimeError("Number of Interfaces " + + std::to_string(generalData->numUDPInterfaces) + + " do not match listener size " + + std::to_string(listSize)); } for (auto &l : listener) { - l->CreateDummySocketForUDPSocketBufferSize(size); - } - // custom and didnt set, throw error - if (s != 0 && udpSocketBufferSize != s) { - throw RuntimeError("Could not set udp socket buffer size. (No " - "CAP_NET_ADMIN privileges?)"); + l->CreateDummySocketForUDPSocketBufferSize(s, + actualUDPSocketBufferSize); } } @@ -1157,31 +1161,22 @@ void Implementation::setDataStreamEnable(const bool enable) { dataStreamer.clear(); if (enable) { - for (int i = 0; i < numUDPInterfaces; ++i) { + for (int i = 0; i < generalData->numUDPInterfaces; ++i) { try { - bool flip = flipRows; - if (quadEnable) { - flip = (i == 1 ? true : false); - } - dataStreamer.push_back(sls::make_unique( - i, fifo[i].get(), &dynamicRange, &detectorRoi, - &fileIndex, flip, numPorts, &quadEnable, - &numberOfTotalFrames)); - dataStreamer[i]->SetGeneralData(generalData); - dataStreamer[i]->CreateZmqSockets( - &numUDPInterfaces, streamingPort, streamingSrcIP, - streamingHwm); - dataStreamer[i]->SetAdditionalJsonHeader( - additionalJsonHeader); + dataStreamer.push_back(sls::make_unique(i)); + SetupDataStreamer(i); } catch (...) { dataStreamer.clear(); dataStreamEnable = false; - throw RuntimeError( - "Could not set data stream enable."); + for (const auto &it : dataProcessor) + it->SetDataStreamEnable(dataStreamEnable); + throw RuntimeError("Could not set data stream enable."); } } SetThreadPriorities(); } + for (const auto &it : dataProcessor) + it->SetDataStreamEnable(dataStreamEnable); } LOG(logINFO) << "Data Send to Gui: " << dataStreamEnable; } @@ -1192,6 +1187,8 @@ uint32_t Implementation::getStreamingFrequency() const { void Implementation::setStreamingFrequency(const uint32_t freq) { streamingFrequency = freq; + for (const auto &it : dataProcessor) + it->SetStreamingFrequency(streamingFrequency); LOG(logINFO) << "Streaming Frequency: " << streamingFrequency; } @@ -1201,6 +1198,8 @@ uint32_t Implementation::getStreamingTimer() const { void Implementation::setStreamingTimer(const uint32_t time_in_ms) { streamingTimerInMs = time_in_ms; + for (const auto &it : dataProcessor) + it->SetStreamingTimerInMs(streamingTimerInMs); LOG(logINFO) << "Streamer Timer: " << streamingTimerInMs; } @@ -1210,6 +1209,8 @@ uint32_t Implementation::getStreamingStartingFrameNumber() const { void Implementation::setStreamingStartingFrameNumber(const uint32_t fnum) { streamingStartFnum = fnum; + for (const auto &it : dataProcessor) + it->SetStreamingStartFnum(streamingStartFnum); LOG(logINFO) << "Streaming Start Frame num: " << streamingStartFnum; } @@ -1220,9 +1221,7 @@ void Implementation::setStreamingPort(const uint32_t i) { LOG(logINFO) << "Streaming Port: " << streamingPort; } -IpAddr Implementation::getStreamingSourceIP() const { - return streamingSrcIP; -} +IpAddr Implementation::getStreamingSourceIP() const { return streamingSrcIP; } void Implementation::setStreamingSourceIP(const IpAddr ip) { streamingSrcIP = ip; @@ -1258,8 +1257,7 @@ Implementation::getAdditionalJsonParameter(const std::string &key) const { if (additionalJsonHeader.find(key) != additionalJsonHeader.end()) { return additionalJsonHeader.at(key); } - throw RuntimeError("No key " + key + - " found in additional json header"); + throw RuntimeError("No key " + key + " found in additional json header"); } void Implementation::setAdditionalJsonParameter(const std::string &key, @@ -1305,7 +1303,7 @@ void Implementation::updateTotalNumberOfFrames() { int64_t repeats = numberOfTriggers; int64_t numFrames = numberOfFrames; // gotthard2 - if (detType == GOTTHARD2) { + if (generalData->detType == GOTTHARD2) { // auto if (timingMode == AUTO_TIMING) { // burst mode, repeats = #bursts @@ -1328,6 +1326,8 @@ void Implementation::updateTotalNumberOfFrames() { } numberOfTotalFrames = numFrames * repeats * (int64_t)(numberOfAdditionalStorageCells + 1); + for (const auto &it : dataStreamer) + it->SetNumberofTotalFrames(numberOfTotalFrames); if (numberOfTotalFrames == 0) { throw RuntimeError("Invalid total number of frames to receive: 0"); } @@ -1467,91 +1467,87 @@ void Implementation::setSubPeriod(const ns i) { } uint32_t Implementation::getNumberofAnalogSamples() const { - return numberOfAnalogSamples; + return generalData->nAnalogSamples; } void Implementation::setNumberofAnalogSamples(const uint32_t i) { - if (numberOfAnalogSamples != i) { - numberOfAnalogSamples = i; - + if (generalData->nAnalogSamples != i) { generalData->SetNumberOfAnalogSamples(i); SetupFifoStructure(); } - LOG(logINFO) << "Number of Analog Samples: " << numberOfAnalogSamples; + LOG(logINFO) << "Number of Analog Samples: " << generalData->nAnalogSamples; LOG(logINFO) << "Packets per Frame: " << (generalData->packetsPerFrame); } uint32_t Implementation::getNumberofDigitalSamples() const { - return numberOfDigitalSamples; + return generalData->nDigitalSamples; } void Implementation::setNumberofDigitalSamples(const uint32_t i) { - if (numberOfDigitalSamples != i) { - numberOfDigitalSamples = i; - + if (generalData->nDigitalSamples != i) { generalData->SetNumberOfDigitalSamples(i); SetupFifoStructure(); } - LOG(logINFO) << "Number of Digital Samples: " << numberOfDigitalSamples; + LOG(logINFO) << "Number of Digital Samples: " + << generalData->nDigitalSamples; LOG(logINFO) << "Packets per Frame: " << (generalData->packetsPerFrame); } -uint32_t Implementation::getCounterMask() const { return counterMask; } +uint32_t Implementation::getCounterMask() const { + return generalData->counterMask; +} void Implementation::setCounterMask(const uint32_t i) { - if (counterMask != i) { + if (generalData->counterMask != i) { generalData->SetCounterMask(i); - counterMask = i; SetupFifoStructure(); } - LOG(logINFO) << "Counter mask: " << ToStringHex(counterMask); - int ncounters = __builtin_popcount(counterMask); + LOG(logINFO) << "Counter mask: " << ToStringHex(generalData->counterMask); + int ncounters = __builtin_popcount(generalData->counterMask); LOG(logINFO) << "Number of counters: " << ncounters; } -uint32_t Implementation::getDynamicRange() const { return dynamicRange; } +uint32_t Implementation::getDynamicRange() const { + return generalData->dynamicRange; +} void Implementation::setDynamicRange(const uint32_t i) { - if (dynamicRange != i) { - dynamicRange = i; - - if (detType == EIGER || detType == MYTHEN3) { + if (generalData->dynamicRange != i) { + if (generalData->detType == EIGER || generalData->detType == MYTHEN3) { generalData->SetDynamicRange(i); - fifoDepth = generalData->defaultFifoDepth; SetupFifoStructure(); } } - LOG(logINFO) << "Dynamic Range: " << dynamicRange; + LOG(logINFO) << "Dynamic Range: " << generalData->dynamicRange; } -slsDetectorDefs::ROI Implementation::getROI() const { return detectorRoi; } +slsDetectorDefs::ROI Implementation::getROI() const { + return generalData->detectorRoi; +} void Implementation::setDetectorROI(slsDetectorDefs::ROI arg) { - if (detectorRoi.xmin != arg.xmin || detectorRoi.xmax != arg.xmax) { - detectorRoi.xmin = arg.xmin; - detectorRoi.xmax = arg.xmax; - + if (generalData->detectorRoi.xmin != arg.xmin || + generalData->detectorRoi.xmax != arg.xmax) { // only for gotthard generalData->SetDetectorROI(arg); - framesPerFile = generalData->maxFramesPerFile; SetupFifoStructure(); } - LOG(logINFO) << "Detector ROI: " << ToString(detectorRoi); + LOG(logINFO) << "Detector ROI: " << ToString(generalData->detectorRoi); LOG(logINFO) << "Packets per Frame: " << (generalData->packetsPerFrame); } -bool Implementation::getTenGigaEnable() const { return tengigaEnable; } +bool Implementation::getTenGigaEnable() const { + return generalData->tengigaEnable; +} void Implementation::setTenGigaEnable(const bool b) { - if (tengigaEnable != b) { - tengigaEnable = b; - + if (generalData->tengigaEnable != b) { generalData->SetTenGigaEnable(b); SetupFifoStructure(); // datastream can be disabled/enabled only for Eiger 10GbE - if (detType == EIGER) { + if (generalData->detType == EIGER) { if (!b) { detectorDataStream[LEFT] = 1; detectorDataStream[RIGHT] = 1; @@ -1561,11 +1557,12 @@ void Implementation::setTenGigaEnable(const bool b) { } LOG(logDEBUG) << "Detector datastream updated [Left: " << ToString(detectorDataStream[LEFT]) - << ", Right: " - << ToString(detectorDataStream[RIGHT]) << "]"; + << ", Right: " << ToString(detectorDataStream[RIGHT]) + << "]"; } } - LOG(logINFO) << "Ten Giga: " << (tengigaEnable ? "enabled" : "disabled"); + LOG(logINFO) << "Ten Giga: " + << (generalData->tengigaEnable ? "enabled" : "disabled"); LOG(logINFO) << "Packets per Frame: " << (generalData->packetsPerFrame); } @@ -1573,19 +1570,8 @@ bool Implementation::getFlipRows() const { return flipRows; } void Implementation::setFlipRows(bool enable) { flipRows = enable; - - if (!quadEnable) { - for (const auto &it : dataStreamer) { - it->SetFlipRows(flipRows); - } - } - // quad - else { - if (dataStreamer.size() == 2) { - dataStreamer[0]->SetFlipRows(false); - dataStreamer[1]->SetFlipRows(true); - } - } + for (const auto &it : dataStreamer) + it->SetFlipRows(flipRows); LOG(logINFO) << "Flip Rows: " << flipRows; } @@ -1595,15 +1581,9 @@ void Implementation::setQuad(const bool b) { if (quadEnable != b) { quadEnable = b; setDetectorSize(numModules); - if (!quadEnable) { - for (const auto &it : dataStreamer) { - it->SetFlipRows(flipRows); - } - } else { - if (dataStreamer.size() == 2) { - dataStreamer[0]->SetFlipRows(false); - dataStreamer[1]->SetFlipRows(true); - } + for (const auto &it : dataStreamer) { + it->SetQuadEnable(quadEnable); + it->SetFlipRows(flipRows); } } LOG(logINFO) << "Quad Enable: " << quadEnable; @@ -1633,7 +1613,7 @@ void Implementation::setDetectorDataStream(const portPosition port, LOG(logINFO) << "Detector 10GbE datastream (" << ToString(port) << " Port): " << ToString(detectorDataStream10GbE[index]); // update datastream for 10g - if (tengigaEnable) { + if (generalData->tengigaEnable) { detectorDataStream[index] = detectorDataStream10GbE[index]; LOG(logDEBUG) << "Detector datastream updated [" << (index == 0 ? "Left" : "Right") @@ -1655,8 +1635,7 @@ void Implementation::setThresholdEnergy(const int value) { void Implementation::setThresholdEnergy(const std::array value) { thresholdAllEnergyeV = value; - LOG(logINFO) << "Threshold Energy (eV): " - << ToString(thresholdAllEnergyeV); + LOG(logINFO) << "Threshold Energy (eV): " << ToString(thresholdAllEnergyeV); } void Implementation::setRateCorrections(const std::vector &t) { @@ -1665,59 +1644,63 @@ void Implementation::setRateCorrections(const std::vector &t) { } slsDetectorDefs::readoutMode Implementation::getReadoutMode() const { - return readoutType; + return generalData->readoutType; } void Implementation::setReadoutMode(const readoutMode f) { - if (readoutType != f) { - readoutType = f; - + if (generalData->readoutType != f) { generalData->SetReadoutMode(f); SetupFifoStructure(); } - LOG(logINFO) << "Readout Mode: " << ToString(f); + LOG(logINFO) << "Readout Mode: " << ToString(generalData->readoutType); LOG(logINFO) << "Packets per Frame: " << (generalData->packetsPerFrame); } uint32_t Implementation::getADCEnableMask() const { - return adcEnableMaskOneGiga; + return generalData->adcEnableMaskOneGiga; } void Implementation::setADCEnableMask(uint32_t mask) { - if (adcEnableMaskOneGiga != mask) { - adcEnableMaskOneGiga = mask; - + if (generalData->adcEnableMaskOneGiga != mask) { generalData->SetOneGigaAdcEnableMask(mask); SetupFifoStructure(); } LOG(logINFO) << "ADC Enable Mask for 1Gb mode: 0x" << std::hex - << adcEnableMaskOneGiga << std::dec; + << generalData->adcEnableMaskOneGiga << std::dec; LOG(logINFO) << "Packets per Frame: " << (generalData->packetsPerFrame); } uint32_t Implementation::getTenGigaADCEnableMask() const { - return adcEnableMaskTenGiga; + return generalData->adcEnableMaskTenGiga; } void Implementation::setTenGigaADCEnableMask(uint32_t mask) { - if (adcEnableMaskTenGiga != mask) { - adcEnableMaskTenGiga = mask; - + if (generalData->adcEnableMaskTenGiga != mask) { generalData->SetTenGigaAdcEnableMask(mask); SetupFifoStructure(); } LOG(logINFO) << "ADC Enable Mask for 10Gb mode: 0x" << std::hex - << adcEnableMaskTenGiga << std::dec; + << generalData->adcEnableMaskTenGiga << std::dec; LOG(logINFO) << "Packets per Frame: " << (generalData->packetsPerFrame); } std::vector Implementation::getDbitList() const { return ctbDbitList; } -void Implementation::setDbitList(const std::vector &v) { ctbDbitList = v; } +void Implementation::setDbitList(const std::vector &v) { + ctbDbitList = v; + for (const auto &it : dataProcessor) + it->SetCtbDbitList(ctbDbitList); + LOG(logINFO) << "Dbit list: " << ToString(ctbDbitList); +} int Implementation::getDbitOffset() const { return ctbDbitOffset; } -void Implementation::setDbitOffset(const int s) { ctbDbitOffset = s; } +void Implementation::setDbitOffset(const int s) { + ctbDbitOffset = s; + for (const auto &it : dataProcessor) + it->SetCtbDbitOffset(ctbDbitOffset); + LOG(logINFO) << "Dbit offset: " << ctbDbitOffset; +} /************************************************** * * @@ -1740,7 +1723,7 @@ void Implementation::registerCallBackAcquisitionFinished(void (*func)(uint64_t, } void Implementation::registerCallBackRawDataReady( - void (*func)(sls_receiver_header *, char *, size_t, void *), void *arg) { + void (*func)(sls_receiver_header &, char *, size_t, void *), void *arg) { rawDataReadyCallBack = func; pRawDataReady = arg; for (const auto &it : dataProcessor) @@ -1748,7 +1731,7 @@ void Implementation::registerCallBackRawDataReady( } void Implementation::registerCallBackRawDataModifyReady( - void (*func)(sls_receiver_header *, char *, size_t &, void *), void *arg) { + void (*func)(sls_receiver_header &, char *, size_t &, void *), void *arg) { rawDataModifyReadyCallBack = func; pRawDataReady = arg; for (const auto &it : dataProcessor) diff --git a/slsReceiverSoftware/src/Implementation.h b/slsReceiverSoftware/src/Implementation.h index 605b47cd5..59e5fd7b1 100644 --- a/slsReceiverSoftware/src/Implementation.h +++ b/slsReceiverSoftware/src/Implementation.h @@ -266,13 +266,12 @@ class Implementation : private virtual slsDetectorDefs { /** params: total frames caught */ void registerCallBackAcquisitionFinished(void (*func)(uint64_t, void *), void *arg); - /** params: sls_receiver_header pointer, pointer to data, image size */ - void registerCallBackRawDataReady(void (*func)(sls_receiver_header *, + /** params: sls_receiver_header, pointer to data, image size */ + void registerCallBackRawDataReady(void (*func)(sls_receiver_header &, char *, size_t, void *), void *arg); - /** params: sls_receiver_header pointer, pointer to data, reference to image - * size */ - void registerCallBackRawDataModifyReady(void (*func)(sls_receiver_header *, + /** params: sls_receiver_header, pointer to data, reference to image size */ + void registerCallBackRawDataModifyReady(void (*func)(sls_receiver_header &, char *, size_t &, void *), void *arg); @@ -288,6 +287,9 @@ class Implementation : private virtual slsDetectorDefs { void SetupWriter(); void StartMasterWriter(); void StartRunning(); + void SetupListener(int i); + void SetupDataProcessor(int i); + void SetupDataStreamer(int i); /************************************************** * * @@ -296,13 +298,11 @@ 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}; - uint32_t fifoDepth{0}; frameDiscardPolicy frameDiscardMode{NO_DISCARD}; bool framePadding{true}; pid_t parentThreadId; @@ -320,7 +320,6 @@ class Implementation : private virtual slsDetectorDefs { bool fileWriteEnable{false}; bool masterFileWriteEnable{true}; bool overwriteEnable{true}; - uint32_t framesPerFile{0}; // acquisition std::atomic status{IDLE}; @@ -328,11 +327,9 @@ class Implementation : private virtual slsDetectorDefs { scanParameters scanParams{}; // network configuration (UDP) - int numUDPInterfaces{1}; std::array eth; std::array udpPortNum{ {DEFAULT_UDP_PORTNO, DEFAULT_UDP_PORTNO + 1}}; - int udpSocketBufferSize{0}; int actualUDPSocketBufferSize{0}; // zmq parameters @@ -364,12 +361,6 @@ class Implementation : private virtual slsDetectorDefs { ns gateDelay3 = std::chrono::nanoseconds(0); ns subExpTime = std::chrono::nanoseconds(0); ns subPeriod = std::chrono::nanoseconds(0); - uint32_t numberOfAnalogSamples{0}; - uint32_t numberOfDigitalSamples{0}; - uint32_t counterMask{0}; - uint32_t dynamicRange{16}; - ROI detectorRoi{}; - bool tengigaEnable{false}; bool flipRows{false}; bool quadEnable{false}; bool activated{true}; @@ -380,9 +371,6 @@ class Implementation : private virtual slsDetectorDefs { int thresholdEnergyeV{-1}; std::array thresholdAllEnergyeV = {{-1, -1, -1}}; std::vector rateCorrections; - readoutMode readoutType{ANALOG_ONLY}; - uint32_t adcEnableMaskOneGiga{BIT32_MASK}; - uint32_t adcEnableMaskTenGiga{BIT32_MASK}; std::vector ctbDbitList; int ctbDbitOffset{0}; @@ -392,9 +380,9 @@ class Implementation : private virtual slsDetectorDefs { void *pStartAcquisition{nullptr}; void (*acquisitionFinishedCallBack)(uint64_t, void *){nullptr}; void *pAcquisitionFinished{nullptr}; - void (*rawDataReadyCallBack)(sls_receiver_header *, char *, size_t, + void (*rawDataReadyCallBack)(sls_receiver_header &, char *, size_t, void *){nullptr}; - void (*rawDataModifyReadyCallBack)(sls_receiver_header *, char *, size_t &, + void (*rawDataModifyReadyCallBack)(sls_receiver_header &, char *, size_t &, void *){nullptr}; void *pRawDataReady{nullptr}; diff --git a/slsReceiverSoftware/src/Listener.cpp b/slsReceiverSoftware/src/Listener.cpp index d10598a9b..7a79e2fd3 100644 --- a/slsReceiverSoftware/src/Listener.cpp +++ b/slsReceiverSoftware/src/Listener.cpp @@ -18,24 +18,21 @@ #include #include #include +#include namespace sls { const std::string Listener::TypeName = "Listener"; -Listener::Listener(int ind, detectorType dtype, Fifo *f, - std::atomic *s, uint32_t *portno, std::string *e, - int *us, int *as, uint32_t *fpf, frameDiscardPolicy *fdp, - bool *detds, bool *sm) - : ThreadObject(ind, TypeName), fifo(f), myDetectorType(dtype), status(s), - udpPortNumber(portno), eth(e), udpSocketBufferSize(us), - actualUDPSocketBufferSize(as), framesPerFile(fpf), frameDiscardMode(fdp), - detectorDataStream(detds), silentMode(sm) { - LOG(logDEBUG) << "Listener " << ind << " created"; +Listener::Listener(int index, std::atomic *status) + : ThreadObject(index, TypeName), status(status) { + LOG(logDEBUG) << "Listener " << index << " created"; } Listener::~Listener() = default; +bool Listener::isPortDisabled() const { return disabledPort; } + uint64_t Listener::GetPacketsCaught() const { return numPacketsCaught; } uint64_t Listener::GetNumCompleteFramesCaught() const { @@ -48,7 +45,7 @@ uint64_t Listener::GetLastFrameIndexCaught() const { int64_t Listener::GetNumMissingPacket(bool stoppedFlag, uint64_t numPackets) const { - if (!activated || !(*detectorDataStream) || noRoi) { + if (disabledPort) { return 0; } if (!stoppedFlag) { @@ -72,6 +69,45 @@ uint64_t Listener::GetListenedIndex() const { void Listener::SetFifo(Fifo *f) { fifo = f; } +void Listener::SetGeneralData(GeneralData *g) { generalData = g; } + +void Listener::SetUdpPortNumber(const uint32_t portNumber) { + udpPortNumber = portNumber; +} + +void Listener::SetEthernetInterface(const std::string e) { + eth = e; + // if eth is mistaken with ip address + if (eth.find('.') != std::string::npos) { + eth = ""; + } + if (!eth.length()) { + LOG(logWARNING) << "ethernet interface for udp port " << udpPortNumber + << " is empty. Listening to all"; + } +} + +void Listener::SetActivate(bool enable) { + activated = enable; + disabledPort = (!activated || !detectorDataStream || noRoi); +} + +void Listener::SetDetectorDatastream(bool enable) { + detectorDataStream = enable; + disabledPort = (!activated || !detectorDataStream || noRoi); +} + +void Listener::SetNoRoi(bool enable) { + noRoi = enable; + disabledPort = (!activated || !detectorDataStream || noRoi); +} + +void Listener::SetFrameDiscardPolicy(frameDiscardPolicy value) { + frameDiscardMode = value; +} + +void Listener::SetSilentMode(bool enable) { silentMode = enable; } + void Listener::ResetParametersforNewAcquisition() { StopRunning(); startedFlag = false; @@ -82,7 +118,7 @@ void Listener::ResetParametersforNewAcquisition() { lastCaughtFrameIndex = 0; carryOverFlag = false; uint32_t packetSize = generalData->packetSize; - if (myDetectorType == GOTTHARD2 && index != 0) { + if (generalData->detType == GOTTHARD2 && index != 0) { packetSize = generalData->vetoPacketSize; } carryOverPacket = make_unique(packetSize); @@ -101,112 +137,97 @@ void Listener::RecordFirstIndex(uint64_t fnum) { // listen to this fnum, later +1 currentFrameIndex = fnum; lastCaughtFrameIndex = fnum; - startedFlag = true; firstIndex = fnum; - if (!(*silentMode)) { + if (!silentMode) { if (!index) { LOG(logINFOBLUE) << index << " First Index: " << firstIndex; } } } -void Listener::SetGeneralData(GeneralData *g) { generalData = g; } - -void Listener::SetActivate(bool enable) { activated = enable; } - -void Listener::SetNoRoi(bool enable) {noRoi = enable; } - -void Listener::CreateUDPSockets() { - if (!activated || !(*detectorDataStream) || noRoi) { +void Listener::CreateUDPSocket(int &actualSize) { + if (disabledPort) { return; } - - // if eth is mistaken with ip address - if ((*eth).find('.') != std::string::npos) { - (*eth) = ""; - } - if (!(*eth).length()) { - LOG(logWARNING) << "eth is empty. Listening to all"; - } - - ShutDownUDPSocket(); - uint32_t packetSize = generalData->packetSize; - if (myDetectorType == GOTTHARD2 && index != 0) { + if (generalData->detType == GOTTHARD2 && index != 0) { packetSize = generalData->vetoPacketSize; } - // InterfaceNameToIp(eth).str().c_str() try { + udpSocket = nullptr; udpSocket = make_unique( - *udpPortNumber, packetSize, - ((*eth).length() ? InterfaceNameToIp(*eth).str().c_str() - : nullptr), - *udpSocketBufferSize); - LOG(logINFO) << index << ": UDP port opened at port " << *udpPortNumber; + udpPortNumber, packetSize, + (eth.length() ? InterfaceNameToIp(eth).str().c_str() : nullptr), + generalData->udpSocketBufferSize); + LOG(logINFO) << index << ": UDP port opened at port " << udpPortNumber; } catch (...) { throw RuntimeError("Could not create UDP socket on port " + - std::to_string(*udpPortNumber)); + std::to_string(udpPortNumber)); } udpSocketAlive = true; // doubled due to kernel bookkeeping (could also be less due to permissions) - *actualUDPSocketBufferSize = udpSocket->getBufferSize(); + actualSize = udpSocket->getBufferSize(); } void Listener::ShutDownUDPSocket() { if (udpSocket) { udpSocketAlive = false; + // give other thread time after udpSocketAlive is changed + usleep(0); udpSocket->Shutdown(); - LOG(logINFO) << "Shut down of UDP port " << *udpPortNumber; + LOG(logINFO) << "Shut down of UDP port " << udpPortNumber; } } -void Listener::CreateDummySocketForUDPSocketBufferSize(int s) { - LOG(logINFO) << "Testing UDP Socket Buffer size " << s << " with test port " - << *udpPortNumber; +void Listener::CreateDummySocketForUDPSocketBufferSize(int s, int &actualSize) { + // custom setup (s != 0) + // default setup at startup (s = 0) + int size = (s == 0 ? generalData->udpSocketBufferSize : s); + LOG(logINFO) << "Testing UDP Socket Buffer size " << size + << " with test port " << udpPortNumber; + int previousSize = generalData->udpSocketBufferSize; + generalData->udpSocketBufferSize = size; - if (!activated || !(*detectorDataStream) || noRoi) { - *actualUDPSocketBufferSize = (s * 2); + if (disabledPort) { + actualSize = (generalData->udpSocketBufferSize * 2); return; } - int temp = *udpSocketBufferSize; - *udpSocketBufferSize = s; - - // if eth is mistaken with ip address - if ((*eth).find('.') != std::string::npos) { - (*eth) = ""; - } - uint32_t packetSize = generalData->packetSize; - if (myDetectorType == GOTTHARD2 && index != 0) { + if (generalData->detType == GOTTHARD2 && index != 0) { packetSize = generalData->vetoPacketSize; } // create dummy socket try { - UdpRxSocket g(*udpPortNumber, packetSize, - ((*eth).length() - ? InterfaceNameToIp(*eth).str().c_str() - : nullptr), - *udpSocketBufferSize); + UdpRxSocket g( + udpPortNumber, packetSize, + (eth.length() ? InterfaceNameToIp(eth).str().c_str() : nullptr), + generalData->udpSocketBufferSize); // doubled due to kernel bookkeeping (could also be less due to // permissions) - *actualUDPSocketBufferSize = g.getBufferSize(); - if (*actualUDPSocketBufferSize == -1) { - *udpSocketBufferSize = temp; + actualSize = g.getBufferSize(); + if (actualSize == -1) { + generalData->udpSocketBufferSize = previousSize; } else { - *udpSocketBufferSize = (*actualUDPSocketBufferSize) / 2; + generalData->udpSocketBufferSize = actualSize / 2; } } catch (...) { throw RuntimeError("Could not create a test UDP socket on port " + - std::to_string(*udpPortNumber)); + std::to_string(udpPortNumber)); + } + + // custom and didnt set, throw error + if (s != 0 && static_cast(generalData->udpSocketBufferSize) != s) { + throw RuntimeError("Could not set udp socket buffer size. (No " + "CAP_NET_ADMIN privileges?)"); } } @@ -219,126 +240,83 @@ void Listener::SetHardCodedPosition(uint16_t r, uint16_t c) { void Listener::ThreadExecution() { char *buffer; - int rc = 0; - fifo->GetNewAddress(buffer); - LOG(logDEBUG5) << "Listener " << index - << ", " - "pop 0x" - << std::hex << (void *)(buffer) << std::dec << ":" << buffer; + LOG(logDEBUG5) << "Listener " << index << ", pop 0x" << std::hex + << (void *)(buffer) << std::dec << ":" << buffer; + auto *memImage = reinterpret_cast(buffer); // udpsocket doesnt exist - if (activated && *detectorDataStream && !noRoi &&!udpSocketAlive && !carryOverFlag) { - // LOG(logERROR) << "Listening_Thread " << index << ": UDP Socket not - // created or shut down earlier"; - (*((uint32_t *)buffer)) = 0; - StopListening(buffer); + if ((*status == TRANSMITTING || !udpSocketAlive) && !carryOverFlag) { + StopListening(buffer, memImage->size); return; } - // get data - if ((*status != TRANSMITTING && - (!activated || !(*detectorDataStream) || noRoi || udpSocketAlive)) || - carryOverFlag) { - rc = ListenToAnImage(buffer); - } + // reset header and size and get data + memset(memImage, 0, IMAGE_STRUCTURE_HEADER_SIZE); + int rc = ListenToAnImage(memImage->header, memImage->data); - // error check, (should not be here) if not transmitting yet (previous if) - // rc should be > 0 - if (rc == 0) { - if (!udpSocketAlive) { - (*((uint32_t *)buffer)) = 0; - StopListening(buffer); - } else - fifo->FreeAddress(buffer); - return; - } - - // discarding image - else if (rc < 0) { + // end of acquisition or discarding image + if (rc <= 0) { fifo->FreeAddress(buffer); return; } - (*((uint32_t *)buffer)) = rc; - - // push into fifo + // valid image, set size and push into fifo + memImage->size = rc; fifo->PushAddress(buffer); // Statistics - if (!(*silentMode)) { + if (!silentMode) { numFramesStatistic++; if (numFramesStatistic >= // second condition also for infinite #number of frames - (((*framesPerFile) == 0) ? STATISTIC_FRAMENUMBER_INFINITE - : (*framesPerFile))) + (generalData->framesPerFile == 0 ? STATISTIC_FRAMENUMBER_INFINITE + : generalData->framesPerFile)) PrintFifoStatistics(); } } -void Listener::StopListening(char *buf) { - (*((uint32_t *)buf)) = DUMMY_PACKET_VALUE; +void Listener::StopListening(char *buf, size_t &size) { + size = DUMMY_PACKET_VALUE; fifo->PushAddress(buf); StopRunning(); - LOG(logDEBUG1) << index << ": Listening Packets (" << *udpPortNumber - << ") : " << numPacketsCaught; - LOG(logDEBUG1) << index << ": Listening Completed"; + LOG(logDEBUG1) << index << ": Listening Completed. Packets (" + << udpPortNumber << ") : " << numPacketsCaught; } /* buf includes the fifo header and packet header */ -uint32_t Listener::ListenToAnImage(char *buf) { +uint32_t Listener::ListenToAnImage(sls_receiver_header &dstHeader, + char *dstData) { - int rc = 0; uint64_t fnum = 0; uint32_t pnum = 0; uint64_t bnum = 0; uint32_t numpackets = 0; + uint32_t dsize = generalData->dataSize; uint32_t imageSize = generalData->imageSize; uint32_t packetSize = generalData->packetSize; uint32_t hsize = generalData->headerSizeinPacket; - uint32_t fifohsize = generalData->fifoBufferHeaderSize; - bool standardheader = generalData->standardheader; - if (myDetectorType == GOTTHARD2 && index != 0) { + bool standardHeader = generalData->standardheader; + if (generalData->detType == GOTTHARD2 && index != 0) { dsize = generalData->vetoDataSize; imageSize = generalData->vetoImageSize; packetSize = generalData->vetoPacketSize; hsize = generalData->vetoHsize; - standardheader = false; + standardHeader = false; } uint32_t pperFrame = generalData->packetsPerFrame; bool isHeaderEmpty = true; - sls_detector_header *old_header = nullptr; - sls_receiver_header *new_header = nullptr; uint32_t corrected_dsize = dsize - ((pperFrame * dsize) - imageSize); + sls_detector_header *srcDetHeader = nullptr; - // reset to -1 - memset(buf, 0, fifohsize); - new_header = (sls_receiver_header *)(buf + FIFO_HEADER_NUMBYTES); - - // deactivated port (eiger) or deactivated (eiger) - if (!(*detectorDataStream) || !activated || noRoi) { - return 0; - } - - // look for carry over + // carry over packet if (carryOverFlag) { LOG(logDEBUG3) << index << "carry flag"; - // check if its the current image packet - // -------------------------- new header - // ---------------------------------------------------------------------- - if (standardheader) { - old_header = (sls_detector_header *)(&carryOverPacket[0]); - fnum = old_header->frameNumber; - pnum = old_header->packetNumber; - } - // -------------------old header - // ----------------------------------------------------------------------------- - else { - generalData->GetHeaderInfo(index, &carryOverPacket[0], - oddStartingPacket, fnum, pnum, bnum); - } - //------------------------------------------------------------------------------------------------------------ + GetPacketIndices(fnum, pnum, bnum, standardHeader, + carryOverPacket.get(), srcDetHeader); + + // future packet if (fnum != currentFrameIndex) { if (fnum < currentFrameIndex) { LOG(logERROR) @@ -347,277 +325,72 @@ uint32_t Listener::ListenToAnImage(char *buf) { carryOverFlag = false; return 0; } - switch (*frameDiscardMode) { - case DISCARD_EMPTY_FRAMES: - if (!numpackets) { - LOG(logDEBUG) - << index << " Skipped fnum:" << currentFrameIndex; - currentFrameIndex = fnum; - return -1; - } - break; - case DISCARD_PARTIAL_FRAMES: - LOG(logDEBUG) - << index << " discarding fnum:" << currentFrameIndex; - currentFrameIndex = fnum; - return -1; - default: - break; - } - new_header->detHeader.packetNumber = numpackets; - if (isHeaderEmpty) { - new_header->detHeader.row = row; - new_header->detHeader.column = column; - } - new_header->detHeader.frameNumber = currentFrameIndex; - ++currentFrameIndex; - return imageSize; - } - - // copy packet - switch (myDetectorType) { - // for gotthard, 1st packet: 4 bytes fnum, CACA - // + CACA, 639*2 bytes data 2nd packet: 4 - // bytes fnum, previous 1*2 bytes data + 640*2 bytes data !! - case GOTTHARD: - if (!pnum) - memcpy(buf + fifohsize, &carryOverPacket[hsize + 4], dsize - 2); - else - memcpy(buf + fifohsize + dsize - 2, &carryOverPacket[hsize], - dsize + 2); - break; - case CHIPTESTBOARD: - case MOENCH: - if (pnum == (pperFrame - 1)) - memcpy(buf + fifohsize + (pnum * dsize), - &carryOverPacket[hsize], corrected_dsize); - else - memcpy(buf + fifohsize + (pnum * dsize), - &carryOverPacket[hsize], dsize); - break; - default: - memcpy(buf + fifohsize + (pnum * dsize), &carryOverPacket[hsize], - dsize); - break; + return HandleFuturePacket(false, numpackets, fnum, isHeaderEmpty, + imageSize, dstHeader); } + CopyPacket(dstData, carryOverPacket.get(), dsize, hsize, + corrected_dsize, numpackets, isHeaderEmpty, standardHeader, + dstHeader, srcDetHeader, pnum, bnum); carryOverFlag = false; - ++numpackets; // number of packets in this image (each time its copied - // to buf) - new_header->packetsMask[( - (pnum < MAX_NUM_PACKETS) ? pnum : MAX_NUM_PACKETS - 1)] = 1; - - // writer header - if (isHeaderEmpty) { - // -------------------------- new header - // ---------------------------------------------------------------------- - if (standardheader) { - memcpy((char *)new_header, (char *)old_header, - sizeof(sls_detector_header)); - } - // -------------------old header - // ------------------------------------------------------------------------------ - else { - new_header->detHeader.frameNumber = fnum; - new_header->detHeader.bunchId = bnum; - new_header->detHeader.row = row; - new_header->detHeader.column = column; - new_header->detHeader.detType = - (uint8_t)generalData->myDetectorType; - new_header->detHeader.version = - (uint8_t)SLS_DETECTOR_HEADER_VERSION; - } - //------------------------------------------------------------------------------------------------------------ - isHeaderEmpty = false; - } } // until last packet isHeaderEmpty to account for gotthard short frame, else // never entering this loop) while (numpackets < pperFrame) { // listen to new packet - rc = 0; - if (udpSocketAlive) { - rc = udpSocket->ReceiveDataOnly(&listeningPacket[0]); - } - // end of acquisition - if (rc <= 0) { + if (!udpSocketAlive || !udpSocket->ReceivePacket(&listeningPacket[0])) { + // end of acquisition if (numpackets == 0) - return 0; // empty image - - switch (*frameDiscardMode) { - case DISCARD_EMPTY_FRAMES: - if (!numpackets) { - return -1; - } - break; - case DISCARD_PARTIAL_FRAMES: - // empty packet now, but not empty image (EOA) - if (numpackets) { - LOG(logDEBUG) - << index << " discarding fnum:" << currentFrameIndex; - } - return -1; - default: - break; - } - new_header->detHeader.packetNumber = - numpackets; // number of packets caught - if (isHeaderEmpty) { - new_header->detHeader.row = row; - new_header->detHeader.column = column; - } - new_header->detHeader.frameNumber = currentFrameIndex; - return imageSize; // empty packet now, but not empty image (EOA) + return 0; + return HandleFuturePacket(true, numpackets, fnum, isHeaderEmpty, + imageSize, dstHeader); } - - // update parameters - numPacketsCaught++; // record immediately to get more time before socket - // shutdown + numPacketsCaught++; numPacketsStatistic++; - - // -------------------------- new header - // ---------------------------------------------------------------------- - if (standardheader) { - old_header = (sls_detector_header *)(&listeningPacket[0]); - fnum = old_header->frameNumber; - pnum = old_header->packetNumber; - } - // -------------------old header - // ----------------------------------------------------------------------------- - else { - // set first packet to be odd or even (check required when switching - // from roi to no roi) - if (myDetectorType == GOTTHARD && !startedFlag) { - oddStartingPacket = generalData->SetOddStartingPacket( - index, &listeningPacket[0]); - } - - generalData->GetHeaderInfo(index, &listeningPacket[0], - oddStartingPacket, fnum, pnum, bnum); - } - //------------------------------------------------------------------------------------------------------------ + GetPacketIndices(fnum, pnum, bnum, standardHeader, + listeningPacket.get(), srcDetHeader); // Eiger Firmware in a weird state - if (myDetectorType == EIGER && fnum == 0) { - LOG(logERROR) << "[" << *udpPortNumber + if (generalData->detType == EIGER && fnum == 0) { + LOG(logERROR) << "[" << udpPortNumber << "]: Got Frame Number " "Zero from Firmware. Discarding Packet"; numPacketsCaught--; + numPacketsStatistic--; return 0; } lastCaughtFrameIndex = fnum; - LOG(logDEBUG1) << "Listening " << index << ": currentfindex:" << currentFrameIndex << ", fnum:" << fnum << ", pnum:" << pnum << ", numpackets:" << numpackets; - if (!startedFlag) RecordFirstIndex(fnum); + // bad packet if (pnum >= pperFrame) { LOG(logERROR) << "Bad packet " << pnum << "(fnum: " << fnum - << "), throwing away. " - "Packets caught so far: " + << "), throwing away. Packets caught so far: " << numpackets; - return 0; // bad packet + return 0; } - // future packet by looking at image number (all other - // detectors) + // future packet if (fnum != currentFrameIndex) { carryOverFlag = true; memcpy(carryOverPacket.get(), &listeningPacket[0], packetSize); - - switch (*frameDiscardMode) { - case DISCARD_EMPTY_FRAMES: - if (!numpackets) { - LOG(logDEBUG) - << index << " Skipped fnum:" << currentFrameIndex; - currentFrameIndex = fnum; - return -1; - } - break; - case DISCARD_PARTIAL_FRAMES: - LOG(logDEBUG) - << index << " discarding fnum:" << currentFrameIndex; - currentFrameIndex = fnum; - return -1; - default: - break; - } - new_header->detHeader.packetNumber = - numpackets; // number of packets caught - if (isHeaderEmpty) { - new_header->detHeader.row = row; - new_header->detHeader.column = column; - } - new_header->detHeader.frameNumber = currentFrameIndex; - ++currentFrameIndex; - return imageSize; - } - - // copy packet - switch (myDetectorType) { - // for gotthard, 1st packet: 4 bytes fnum, CACA - // + CACA, 639*2 bytes data 2nd packet: 4 - // bytes fnum, previous 1*2 bytes data + 640*2 bytes data !! - case GOTTHARD: - if (!pnum) - memcpy(buf + fifohsize + (pnum * dsize), - &listeningPacket[hsize + 4], dsize - 2); - else - memcpy(buf + fifohsize + (pnum * dsize) - 2, - &listeningPacket[hsize], dsize + 2); - break; - case CHIPTESTBOARD: - case MOENCH: - if (pnum == (pperFrame - 1)) - memcpy(buf + fifohsize + (pnum * dsize), - &listeningPacket[hsize], corrected_dsize); - else - memcpy(buf + fifohsize + (pnum * dsize), - &listeningPacket[hsize], dsize); - break; - default: - memcpy(buf + fifohsize + (pnum * dsize), &listeningPacket[hsize], - dsize); - break; - } - ++numpackets; // number of packets in this image (each time its copied - // to buf) - new_header->packetsMask[( - (pnum < MAX_NUM_PACKETS) ? pnum : MAX_NUM_PACKETS - 1)] = 1; - - if (isHeaderEmpty) { - // -------------------------- new header - // ---------------------------------------------------------------------- - if (standardheader) { - memcpy((char *)new_header, (char *)old_header, - sizeof(sls_detector_header)); - } - // -------------------old header - // ------------------------------------------------------------------------------ - else { - new_header->detHeader.frameNumber = fnum; - new_header->detHeader.bunchId = bnum; - new_header->detHeader.row = row; - new_header->detHeader.column = column; - new_header->detHeader.detType = - (uint8_t)generalData->myDetectorType; - new_header->detHeader.version = - (uint8_t)SLS_DETECTOR_HEADER_VERSION; - } - //------------------------------------------------------------------------------------------------------------ - isHeaderEmpty = false; + return HandleFuturePacket(false, numpackets, fnum, isHeaderEmpty, + imageSize, dstHeader); } + CopyPacket(dstData, listeningPacket.get(), dsize, hsize, + corrected_dsize, numpackets, isHeaderEmpty, standardHeader, + dstHeader, srcDetHeader, pnum, bnum); } // complete image - new_header->detHeader.packetNumber = numpackets; // number of packets caught - new_header->detHeader.frameNumber = currentFrameIndex; + dstHeader.detHeader.packetNumber = numpackets; if (numpackets == pperFrame) { ++numCompleteFramesCaught; } @@ -625,6 +398,121 @@ uint32_t Listener::ListenToAnImage(char *buf) { return imageSize; } +size_t Listener::HandleFuturePacket(bool EOA, uint32_t numpackets, + uint64_t fnum, bool isHeaderEmpty, + size_t imageSize, + sls_receiver_header &dstHeader) { + switch (frameDiscardMode) { + case DISCARD_EMPTY_FRAMES: + if (!numpackets) { + if (!EOA) { + LOG(logDEBUG) << index << " Skipped fnum:" << currentFrameIndex; + currentFrameIndex = fnum; + } + return -1; + } + break; + case DISCARD_PARTIAL_FRAMES: + LOG(logDEBUG) << index << " discarding fnum:" << currentFrameIndex; + if (!EOA) { + currentFrameIndex = fnum; + } + return -1; + default: + break; + } + dstHeader.detHeader.packetNumber = numpackets; + // for empty frames (padded) + if (isHeaderEmpty) { + dstHeader.detHeader.frameNumber = currentFrameIndex; + // no packet to get bnum + dstHeader.detHeader.row = row; + dstHeader.detHeader.column = column; + dstHeader.detHeader.detType = + static_cast(generalData->detType); + dstHeader.detHeader.version = + static_cast(SLS_DETECTOR_HEADER_VERSION); + } + if (!EOA) { + ++currentFrameIndex; + } + return imageSize; +} + +void Listener::CopyPacket(char *dst, char *src, uint32_t dataSize, + uint32_t detHeaderSize, uint32_t correctedDataSize, + uint32_t &numpackets, bool &isHeaderEmpty, + bool standardHeader, sls_receiver_header &dstHeader, + sls_detector_header *srcDetHeader, uint32_t pnum, + uint64_t bnum) { + + // copy packet data + switch (generalData->detType) { + // for gotthard, 1st packet: 4 bytes fnum, CACA + // + CACA, 639*2 bytes data 2nd packet: 4 + // bytes fnum, previous 1*2 bytes data + 640*2 bytes data !! + case GOTTHARD: + if (!pnum) + memcpy(dst, &src[detHeaderSize + 4], dataSize - 2); + else + memcpy(dst + dataSize - 2, &src[detHeaderSize], dataSize + 2); + break; + case CHIPTESTBOARD: + case MOENCH: + if (pnum == (generalData->packetsPerFrame - 1)) + memcpy(dst + (pnum * dataSize), &src[detHeaderSize], + correctedDataSize); + else + memcpy(dst + (pnum * dataSize), &src[detHeaderSize], dataSize); + break; + default: + memcpy(dst + (pnum * dataSize), &src[detHeaderSize], dataSize); + break; + } + + ++numpackets; + dstHeader + .packetsMask[((pnum < MAX_NUM_PACKETS) ? pnum : MAX_NUM_PACKETS - 1)] = + 1; + + // writer header + if (isHeaderEmpty) { + if (standardHeader) { + memcpy((char *)&dstHeader, (char *)srcDetHeader, + sizeof(sls_detector_header)); + } else { + dstHeader.detHeader.frameNumber = currentFrameIndex; + dstHeader.detHeader.bunchId = bnum; + dstHeader.detHeader.row = row; + dstHeader.detHeader.column = column; + dstHeader.detHeader.detType = + static_cast(generalData->detType); + dstHeader.detHeader.version = + static_cast(SLS_DETECTOR_HEADER_VERSION); + } + isHeaderEmpty = false; + } +} + +void Listener::GetPacketIndices(uint64_t &fnum, uint32_t &pnum, uint64_t &bnum, + bool standardHeader, char *packet, + sls_detector_header *&header) { + if (standardHeader) { + header = (sls_detector_header *)(&packet[0]); + fnum = header->frameNumber; + pnum = header->packetNumber; + } else { + // set first packet to be odd or even (check required when switching + // from roi to no roi) + if (generalData->detType == GOTTHARD && !startedFlag) { + oddStartingPacket = + generalData->SetOddStartingPacket(index, &packet[0]); + } + generalData->GetHeaderInfo(index, &packet[0], oddStartingPacket, fnum, + pnum, bnum); + } +} + void Listener::PrintFifoStatistics() { LOG(logDEBUG1) << "numFramesStatistic:" << numFramesStatistic << " numPacketsStatistic:" << numPacketsStatistic @@ -638,7 +526,7 @@ void Listener::PrintFifoStatistics() { numFramesStatistic = 0; const auto color = loss ? logINFORED : logINFOGREEN; - LOG(color) << "[" << *udpPortNumber + LOG(color) << "[" << udpPortNumber << "]: " "Packet_Loss:" << loss << " (" << lossPercent << "%)" diff --git a/slsReceiverSoftware/src/Listener.h b/slsReceiverSoftware/src/Listener.h index 2257f54cd..8ebeee35f 100644 --- a/slsReceiverSoftware/src/Listener.h +++ b/slsReceiverSoftware/src/Listener.h @@ -24,34 +24,10 @@ class Fifo; class Listener : private virtual slsDetectorDefs, public ThreadObject { public: - /** - * Constructor - * Calls Base Class CreateThread(), sets ErrorMask if error and increments - * NumberofListerners - * @param ind self index - * @param dtype detector type - * @param f address of Fifo pointer - * @param s pointer to receiver status - * @param portno pointer to udp port number - * @param e ethernet interface - * @param dr pointer to dynamic range - * @param us pointer to udp socket buffer size - * @param as pointer to actual udp socket buffer size - * @param fpf pointer to frames per file - * @param fdp frame discard policy - * @param detds pointer to detector data stream - * @param sm pointer to silent mode - */ - Listener(int ind, detectorType dtype, Fifo *f, std::atomic *s, - uint32_t *portno, std::string *e, int *us, int *as, uint32_t *fpf, - frameDiscardPolicy *fdp, bool *detds, bool *sm); - - /** - * Destructor - * Calls Base Class DestroyThread() and decrements NumberofListerners - */ + Listener(int index, std::atomic *status); ~Listener(); + bool isPortDisabled() const; uint64_t GetPacketsCaught() const; uint64_t GetNumCompleteFramesCaught() const; uint64_t GetLastFrameIndexCaught() const; @@ -62,19 +38,20 @@ class Listener : private virtual slsDetectorDefs, public ThreadObject { uint64_t GetListenedIndex() const; void SetFifo(Fifo *f); - void ResetParametersforNewAcquisition(); void SetGeneralData(GeneralData *g); + void SetUdpPortNumber(const uint32_t portNumber); + void SetEthernetInterface(const std::string e); void SetActivate(bool enable); + void SetDetectorDatastream(bool enable); void SetNoRoi(bool enable); - void CreateUDPSockets(); - void ShutDownUDPSocket(); + void SetFrameDiscardPolicy(frameDiscardPolicy value); + void SetSilentMode(bool enable); - /** - * Create & closes a dummy UDP socket - * to set & get actual buffer size - * @param s UDP socket buffer size to be set - */ - void CreateDummySocketForUDPSocketBufferSize(int s); + void ResetParametersforNewAcquisition(); + void CreateUDPSocket(int &actualSize); + void ShutDownUDPSocket(); + /** to set & get actual buffer size */ + void CreateDummySocketForUDPSocketBufferSize(int s, int &actualSize); /** * Set hard coded (calculated but not from detector) row and column @@ -98,18 +75,31 @@ class Listener : private virtual slsDetectorDefs, public ThreadObject { * Pushes non empty buffers into fifo/ frees empty buffer, * pushes dummy buffer into fifo * and reset running mask by calling StopRunning() - * @param buf address of buffer */ - void StopListening(char *buf); + void StopListening(char *buf, size_t &size); /** * Listen to the UDP Socket for an image, * place them in the right order - * @param buf address of buffer * @returns number of bytes of relevant data, can be image size or 0 (stop * acquisition) or -1 to discard image */ - uint32_t ListenToAnImage(char *buf); + uint32_t ListenToAnImage(sls_receiver_header &dstHeader, char *dstData); + + size_t HandleFuturePacket(bool EOA, uint32_t numpackets, uint64_t fnum, + bool isHeaderEmpty, size_t imageSize, + sls_receiver_header &rxHeader); + + void CopyPacket(char *dst, char *src, uint32_t dataSize, + uint32_t detHeaderSize, uint32_t correctedDataSize, + uint32_t &numpackets, bool &isHeaderEmpty, + bool standardHeader, sls_receiver_header &rxHeader, + sls_detector_header *detHeader, uint32_t pnum, + uint64_t bnum); + + void GetPacketIndices(uint64_t &fnum, uint32_t &pnum, uint64_t &bnum, + bool standardHeader, char *packet, + sls_detector_header *&header); void PrintFifoStatistics(); @@ -118,20 +108,17 @@ class Listener : private virtual slsDetectorDefs, public ThreadObject { Fifo *fifo; // individual members - detectorType myDetectorType; std::atomic *status; std::unique_ptr udpSocket{nullptr}; - uint32_t *udpPortNumber; - std::string *eth; - int *udpSocketBufferSize; - /** double due to kernel bookkeeping */ - int *actualUDPSocketBufferSize; - uint32_t *framesPerFile; - frameDiscardPolicy *frameDiscardMode; + + uint32_t udpPortNumber{0}; + std::string eth; + frameDiscardPolicy frameDiscardMode; bool activated{false}; - bool *detectorDataStream; + bool detectorDataStream{true}; bool noRoi{false}; - bool *silentMode; + bool silentMode; + bool disabledPort{false}; /** row hardcoded as 1D or 2d, * if detector does not send them yet or diff --git a/slsReceiverSoftware/src/MasterAttributes.cpp b/slsReceiverSoftware/src/MasterAttributes.cpp index 9047e86e8..807e25c82 100644 --- a/slsReceiverSoftware/src/MasterAttributes.cpp +++ b/slsReceiverSoftware/src/MasterAttributes.cpp @@ -3,7 +3,6 @@ #include "MasterAttributes.h" #include - namespace sls { void MasterAttributes::GetBinaryAttributes( @@ -33,8 +32,7 @@ void MasterAttributes::GetBinaryAttributes( GetCtbBinaryAttributes(w); break; default: - throw RuntimeError( - "Unknown Detector type to get master attributes"); + throw RuntimeError("Unknown Detector type to get master attributes"); } GetFinalBinaryAttributes(w); w->EndObject(); @@ -66,8 +64,7 @@ void MasterAttributes::WriteHDF5Attributes(H5::H5File *fd, H5::Group *group) { WriteCtbHDF5Attributes(fd, group); break; default: - throw RuntimeError( - "Unknown Detector type to get master attributes"); + throw RuntimeError("Unknown Detector type to get master attributes"); } WriteFinalHDF5Attributes(fd, group); } @@ -169,14 +166,15 @@ void MasterAttributes::GetFinalBinaryAttributes( } #ifdef HDF5C -void MasterAttributes::WriteCommonHDF5Attributes(H5::H5File *fd, H5::Group *group) { +void MasterAttributes::WriteCommonHDF5Attributes(H5::H5File *fd, + H5::Group *group) { char c[1024]{}; // version { double version = BINARY_WRITER_VERSION; H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::Attribute attribute = - fd->createAttribute("Version", H5::PredType::NATIVE_DOUBLE, dataspace); + H5::Attribute attribute = fd->createAttribute( + "Version", H5::PredType::NATIVE_DOUBLE, dataspace); attribute.write(H5::PredType::NATIVE_DOUBLE, &version); } // timestamp @@ -211,22 +209,22 @@ void MasterAttributes::WriteCommonHDF5Attributes(H5::H5File *fd, H5::Group *grou // geometry x { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = group->createDataSet("Geometry in x axis", - H5::PredType::NATIVE_INT, dataspace); + H5::DataSet dataset = group->createDataSet( + "Geometry in x axis", H5::PredType::NATIVE_INT, dataspace); dataset.write(&geometry.x, H5::PredType::NATIVE_INT); } // geometry y { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = group->createDataSet("Geometry in y axis", - H5::PredType::NATIVE_INT, dataspace); + H5::DataSet dataset = group->createDataSet( + "Geometry in y axis", H5::PredType::NATIVE_INT, dataspace); dataset.write(&geometry.y, H5::PredType::NATIVE_INT); } // Image Size { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = - group->createDataSet("Image Size", H5::PredType::NATIVE_INT, dataspace); + H5::DataSet dataset = group->createDataSet( + "Image Size", H5::PredType::NATIVE_INT, dataspace); dataset.write(&imageSize, H5::PredType::NATIVE_INT); H5::DataSpace dataspaceAttr = H5::DataSpace(H5S_SCALAR); H5::StrType strdatatype(H5::PredType::C_S1, 256); @@ -239,22 +237,22 @@ void MasterAttributes::WriteCommonHDF5Attributes(H5::H5File *fd, H5::Group *grou // npixels x { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = group->createDataSet("Number of pixels in x axis", - H5::PredType::NATIVE_INT, dataspace); + H5::DataSet dataset = group->createDataSet( + "Number of pixels in x axis", H5::PredType::NATIVE_INT, dataspace); dataset.write(&nPixels.x, H5::PredType::NATIVE_INT); } // npixels y { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = group->createDataSet("Number of pixels in y axis", - H5::PredType::NATIVE_INT, dataspace); + H5::DataSet dataset = group->createDataSet( + "Number of pixels in y axis", H5::PredType::NATIVE_INT, dataspace); dataset.write(&nPixels.y, H5::PredType::NATIVE_INT); } // Maximum frames per file { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = group->createDataSet("Maximum frames per file", - H5::PredType::NATIVE_INT, dataspace); + H5::DataSet dataset = group->createDataSet( + "Maximum frames per file", H5::PredType::NATIVE_INT, dataspace); dataset.write(&maxFramesPerFile, H5::PredType::NATIVE_INT); } // Frame Discard Policy @@ -262,15 +260,15 @@ void MasterAttributes::WriteCommonHDF5Attributes(H5::H5File *fd, H5::Group *grou H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); H5::StrType strdatatype(H5::PredType::C_S1, 256); H5::DataSet dataset = group->createDataSet("Frame Discard Policy", - strdatatype, dataspace); + strdatatype, dataspace); strcpy_safe(c, ToString(frameDiscardMode)); dataset.write(c, strdatatype); } // Frame Padding { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = group->createDataSet("Frame Padding", - H5::PredType::NATIVE_INT, dataspace); + H5::DataSet dataset = group->createDataSet( + "Frame Padding", H5::PredType::NATIVE_INT, dataspace); dataset.write(&framePadding, H5::PredType::NATIVE_INT); } // Scan Parameters @@ -285,47 +283,48 @@ void MasterAttributes::WriteCommonHDF5Attributes(H5::H5File *fd, H5::Group *grou // Total Frames { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = group->createDataSet("Total Frames", - H5::PredType::STD_U64LE, dataspace); + H5::DataSet dataset = group->createDataSet( + "Total Frames", H5::PredType::STD_U64LE, dataspace); dataset.write(&totalFrames, H5::PredType::STD_U64LE); } // Receiver Roi xmin { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = group->createDataSet("receiver roi xmin", - H5::PredType::NATIVE_INT, dataspace); + H5::DataSet dataset = group->createDataSet( + "receiver roi xmin", H5::PredType::NATIVE_INT, dataspace); dataset.write(&receiverRoi.xmin, H5::PredType::NATIVE_INT); } // Receiver Roi xmax { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = group->createDataSet("receiver roi xmax", - H5::PredType::NATIVE_INT, dataspace); + H5::DataSet dataset = group->createDataSet( + "receiver roi xmax", H5::PredType::NATIVE_INT, dataspace); dataset.write(&receiverRoi.xmax, H5::PredType::NATIVE_INT); } // Receiver Roi ymin { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = group->createDataSet("receiver roi ymin", - H5::PredType::NATIVE_INT, dataspace); + H5::DataSet dataset = group->createDataSet( + "receiver roi ymin", H5::PredType::NATIVE_INT, dataspace); dataset.write(&receiverRoi.ymin, H5::PredType::NATIVE_INT); } // Receiver Roi ymax { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = group->createDataSet("receiver roi ymax", - H5::PredType::NATIVE_INT, dataspace); + H5::DataSet dataset = group->createDataSet( + "receiver roi ymax", H5::PredType::NATIVE_INT, dataspace); dataset.write(&receiverRoi.ymax, H5::PredType::NATIVE_INT); } } -void MasterAttributes::WriteFinalHDF5Attributes(H5::H5File *fd, H5::Group *group) { +void MasterAttributes::WriteFinalHDF5Attributes(H5::H5File *fd, + H5::Group *group) { char c[1024]{}; // Total Frames in file { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = group->createDataSet("Frames in File", - H5::PredType::STD_U64LE, dataspace); + H5::DataSet dataset = group->createDataSet( + "Frames in File", H5::PredType::STD_U64LE, dataspace); dataset.write(&framesInFile, H5::PredType::STD_U64LE); } // additional json header @@ -334,7 +333,7 @@ void MasterAttributes::WriteFinalHDF5Attributes(H5::H5File *fd, H5::Group *group H5::StrType strdatatype(H5::PredType::C_S1, json.length()); H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); H5::DataSet dataset = group->createDataSet("Additional JSON Header", - strdatatype, dataspace); + strdatatype, dataspace); strcpy_safe(c, ToString(additionalJsonHeader)); dataset.write(c, strdatatype); } @@ -362,8 +361,8 @@ void MasterAttributes::WriteHDF5Period(H5::H5File *fd, H5::Group *group) { void MasterAttributes::WriteHDF5DynamicRange(H5::H5File *fd, H5::Group *group) { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = - group->createDataSet("Dynamic Range", H5::PredType::NATIVE_INT, dataspace); + H5::DataSet dataset = group->createDataSet( + "Dynamic Range", H5::PredType::NATIVE_INT, dataspace); dataset.write(&dynamicRange, H5::PredType::NATIVE_INT); H5::DataSpace dataspaceAttr = H5::DataSpace(H5S_SCALAR); H5::StrType strdatatype(H5::PredType::C_S1, 256); @@ -375,8 +374,8 @@ void MasterAttributes::WriteHDF5DynamicRange(H5::H5File *fd, H5::Group *group) { void MasterAttributes::WriteHDF5TenGiga(H5::H5File *fd, H5::Group *group) { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = group->createDataSet("Ten Giga Enable", - H5::PredType::NATIVE_INT, dataspace); + H5::DataSet dataset = group->createDataSet( + "Ten Giga Enable", H5::PredType::NATIVE_INT, dataspace); dataset.write(&tenGiga, H5::PredType::NATIVE_INT); } @@ -384,38 +383,40 @@ void MasterAttributes::WriteHDF5ROI(H5::H5File *fd, H5::Group *group) { // Roi xmin { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = - group->createDataSet("roi xmin", H5::PredType::NATIVE_INT, dataspace); + H5::DataSet dataset = group->createDataSet( + "roi xmin", H5::PredType::NATIVE_INT, dataspace); dataset.write(&detectorRoi.xmin, H5::PredType::NATIVE_INT); } // Roi xmax { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = - group->createDataSet("roi xmax", H5::PredType::NATIVE_INT, dataspace); + H5::DataSet dataset = group->createDataSet( + "roi xmax", H5::PredType::NATIVE_INT, dataspace); dataset.write(&detectorRoi.xmax, H5::PredType::NATIVE_INT); } } -void MasterAttributes::WriteHDF5NumUDPInterfaces(H5::H5File *fd, H5::Group *group) { +void MasterAttributes::WriteHDF5NumUDPInterfaces(H5::H5File *fd, + H5::Group *group) { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = group->createDataSet("Number of UDP Interfaces", - H5::PredType::NATIVE_INT, dataspace); + H5::DataSet dataset = group->createDataSet( + "Number of UDP Interfaces", H5::PredType::NATIVE_INT, dataspace); dataset.write(&numUDPInterfaces, H5::PredType::NATIVE_INT); } void MasterAttributes::WriteHDF5ReadNRows(H5::H5File *fd, H5::Group *group) { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = - group->createDataSet("Number of rows", H5::PredType::NATIVE_INT, dataspace); + H5::DataSet dataset = group->createDataSet( + "Number of rows", H5::PredType::NATIVE_INT, dataspace); dataset.write(&readNRows, H5::PredType::NATIVE_INT); } -void MasterAttributes::WriteHDF5ThresholdEnergy(H5::H5File *fd, H5::Group *group) { +void MasterAttributes::WriteHDF5ThresholdEnergy(H5::H5File *fd, + H5::Group *group) { char c[1024]{}; H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = group->createDataSet("Threshold Energy", - H5::PredType::NATIVE_INT, dataspace); + H5::DataSet dataset = group->createDataSet( + "Threshold Energy", H5::PredType::NATIVE_INT, dataspace); dataset.write(&thresholdEnergyeV, H5::PredType::NATIVE_INT); H5::DataSpace dataspaceAttr = H5::DataSpace(H5S_SCALAR); H5::StrType strdatatype(H5::PredType::C_S1, 256); @@ -425,7 +426,8 @@ void MasterAttributes::WriteHDF5ThresholdEnergy(H5::H5File *fd, H5::Group *group attribute.write(strdatatype, c); } -void MasterAttributes::WriteHDF5ThresholdEnergies(H5::H5File *fd, H5::Group *group) { +void MasterAttributes::WriteHDF5ThresholdEnergies(H5::H5File *fd, + H5::Group *group) { char c[1024]{}; H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); H5::StrType strdatatype(H5::PredType::C_S1, 1024); @@ -462,7 +464,8 @@ void MasterAttributes::WriteHDF5SubQuad(H5::H5File *fd, H5::Group *group) { dataset.write(&quad, H5::PredType::NATIVE_INT); } -void MasterAttributes::WriteHDF5RateCorrections(H5::H5File *fd, H5::Group *group) { +void MasterAttributes::WriteHDF5RateCorrections(H5::H5File *fd, + H5::Group *group) { char c[1024]{}; H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); H5::StrType strdatatype(H5::PredType::C_S1, 1024); @@ -474,8 +477,8 @@ void MasterAttributes::WriteHDF5RateCorrections(H5::H5File *fd, H5::Group *group void MasterAttributes::WriteHDF5CounterMask(H5::H5File *fd, H5::Group *group) { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = - group->createDataSet("Counter Mask", H5::PredType::STD_U32LE, dataspace); + H5::DataSet dataset = group->createDataSet( + "Counter Mask", H5::PredType::STD_U32LE, dataspace); dataset.write(&counterMask, H5::PredType::STD_U32LE); } @@ -491,7 +494,8 @@ void MasterAttributes::WriteHDF5ExptimeArray(H5::H5File *fd, H5::Group *group) { } } -void MasterAttributes::WriteHDF5GateDelayArray(H5::H5File *fd, H5::Group *group) { +void MasterAttributes::WriteHDF5GateDelayArray(H5::H5File *fd, + H5::Group *group) { for (int i = 0; i != 3; ++i) { char c[1024]{}; H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); @@ -529,43 +533,45 @@ void MasterAttributes::WriteHDF5AdcMask(H5::H5File *fd, H5::Group *group) { void MasterAttributes::WriteHDF5AnalogFlag(H5::H5File *fd, H5::Group *group) { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = - group->createDataSet("Analog Flag", H5::PredType::NATIVE_INT, dataspace); + H5::DataSet dataset = group->createDataSet( + "Analog Flag", H5::PredType::NATIVE_INT, dataspace); dataset.write(&analog, H5::PredType::NATIVE_INT); } -void MasterAttributes::WriteHDF5AnalogSamples(H5::H5File *fd, H5::Group *group) { +void MasterAttributes::WriteHDF5AnalogSamples(H5::H5File *fd, + H5::Group *group) { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = - group->createDataSet("Analog Samples", H5::PredType::NATIVE_INT, dataspace); + H5::DataSet dataset = group->createDataSet( + "Analog Samples", H5::PredType::NATIVE_INT, dataspace); dataset.write(&analogSamples, H5::PredType::NATIVE_INT); } void MasterAttributes::WriteHDF5DigitalFlag(H5::H5File *fd, H5::Group *group) { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = - group->createDataSet("Digital Flag", H5::PredType::NATIVE_INT, dataspace); + H5::DataSet dataset = group->createDataSet( + "Digital Flag", H5::PredType::NATIVE_INT, dataspace); dataset.write(&digital, H5::PredType::NATIVE_INT); } -void MasterAttributes::WriteHDF5DigitalSamples(H5::H5File *fd, H5::Group *group) { +void MasterAttributes::WriteHDF5DigitalSamples(H5::H5File *fd, + H5::Group *group) { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = group->createDataSet("Digital Samples", - H5::PredType::NATIVE_INT, dataspace); + H5::DataSet dataset = group->createDataSet( + "Digital Samples", H5::PredType::NATIVE_INT, dataspace); dataset.write(&digitalSamples, H5::PredType::NATIVE_INT); } void MasterAttributes::WriteHDF5DbitOffset(H5::H5File *fd, H5::Group *group) { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = - group->createDataSet("Dbit Offset", H5::PredType::NATIVE_INT, dataspace); + H5::DataSet dataset = group->createDataSet( + "Dbit Offset", H5::PredType::NATIVE_INT, dataspace); dataset.write(&dbitoffset, H5::PredType::NATIVE_INT); } void MasterAttributes::WriteHDF5DbitList(H5::H5File *fd, H5::Group *group) { H5::DataSpace dataspace = H5::DataSpace(H5S_SCALAR); - H5::DataSet dataset = group->createDataSet("Dbit Bitset List", - H5::PredType::STD_U64LE, dataspace); + H5::DataSet dataset = group->createDataSet( + "Dbit Bitset List", H5::PredType::STD_U64LE, dataspace); dataset.write(&dbitlist, H5::PredType::STD_U64LE); } #endif @@ -586,7 +592,8 @@ void MasterAttributes::GetGotthardBinaryAttributes( }; #ifdef HDF5C -void MasterAttributes::WriteGotthardHDF5Attributes(H5::H5File *fd, H5::Group *group) { +void MasterAttributes::WriteGotthardHDF5Attributes(H5::H5File *fd, + H5::Group *group) { MasterAttributes::WriteHDF5Exptime(fd, group); MasterAttributes::WriteHDF5Period(fd, group); MasterAttributes::WriteHDF5ROI(fd, group); @@ -606,7 +613,8 @@ void MasterAttributes::GetJungfrauBinaryAttributes( } #ifdef HDF5C -void MasterAttributes::WriteJungfrauHDF5Attributes(H5::H5File *fd, H5::Group *group) { +void MasterAttributes::WriteJungfrauHDF5Attributes(H5::H5File *fd, + H5::Group *group) { MasterAttributes::WriteHDF5Exptime(fd, group); MasterAttributes::WriteHDF5Period(fd, group); MasterAttributes::WriteHDF5NumUDPInterfaces(fd, group); @@ -639,7 +647,8 @@ void MasterAttributes::GetEigerBinaryAttributes( } #ifdef HDF5C -void MasterAttributes::WriteEigerHDF5Attributes(H5::H5File *fd, H5::Group *group) { +void MasterAttributes::WriteEigerHDF5Attributes(H5::H5File *fd, + H5::Group *group) { MasterAttributes::WriteHDF5DynamicRange(fd, group); MasterAttributes::WriteHDF5TenGiga(fd, group); MasterAttributes::WriteHDF5Exptime(fd, group); @@ -678,7 +687,8 @@ void MasterAttributes::GetMythen3BinaryAttributes( } #ifdef HDF5C -void MasterAttributes::WriteMythen3HDF5Attributes(H5::H5File *fd, H5::Group *group) { +void MasterAttributes::WriteMythen3HDF5Attributes(H5::H5File *fd, + H5::Group *group) { MasterAttributes::WriteHDF5DynamicRange(fd, group); MasterAttributes::WriteHDF5TenGiga(fd, group); MasterAttributes::WriteHDF5Period(fd, group); @@ -701,7 +711,8 @@ void MasterAttributes::GetGotthard2BinaryAttributes( } #ifdef HDF5C -void MasterAttributes::WriteGotthard2HDF5Attributes(H5::H5File *fd, H5::Group *group) { +void MasterAttributes::WriteGotthard2HDF5Attributes(H5::H5File *fd, + H5::Group *group) { MasterAttributes::WriteHDF5Exptime(fd, group); MasterAttributes::WriteHDF5Period(fd, group); MasterAttributes::WriteHDF5BurstMode(fd, group); @@ -723,7 +734,8 @@ void MasterAttributes::GetMoenchBinaryAttributes( } #ifdef HDF5C -void MasterAttributes::WriteMoenchHDF5Attributes(H5::H5File *fd, H5::Group *group) { +void MasterAttributes::WriteMoenchHDF5Attributes(H5::H5File *fd, + H5::Group *group) { MasterAttributes::WriteHDF5Exptime(fd, group); MasterAttributes::WriteHDF5Period(fd, group); MasterAttributes::WriteHDF5TenGiga(fd, group); @@ -757,7 +769,8 @@ void MasterAttributes::GetCtbBinaryAttributes( } #ifdef HDF5C -void MasterAttributes::WriteCtbHDF5Attributes(H5::H5File *fd, H5::Group *group) { +void MasterAttributes::WriteCtbHDF5Attributes(H5::H5File *fd, + H5::Group *group) { MasterAttributes::WriteHDF5Exptime(fd, group); MasterAttributes::WriteHDF5Period(fd, group); MasterAttributes::WriteHDF5TenGiga(fd, group); diff --git a/slsReceiverSoftware/src/MasterAttributes.h b/slsReceiverSoftware/src/MasterAttributes.h index 89dd4d1b1..6601de2e2 100644 --- a/slsReceiverSoftware/src/MasterAttributes.h +++ b/slsReceiverSoftware/src/MasterAttributes.h @@ -7,21 +7,18 @@ #include "sls/logger.h" #include "sls/sls_detector_defs.h" +#include #include #include -#include #ifdef HDF5C #include "H5Cpp.h" #endif - namespace sls { using ns = std::chrono::nanoseconds; - - class MasterAttributes { public: // (before acquisition) diff --git a/slsReceiverSoftware/src/MasterFileUtility.cpp b/slsReceiverSoftware/src/MasterFileUtility.cpp index 2cf48c319..81ad932ff 100644 --- a/slsReceiverSoftware/src/MasterFileUtility.cpp +++ b/slsReceiverSoftware/src/MasterFileUtility.cpp @@ -24,9 +24,9 @@ std::string CreateMasterBinaryFile(const std::string &filePath, if (!overWriteEnable) mode = "wx"; FILE *fd = fopen(fileName.c_str(), mode.c_str()); - if(!fd) { + if (!fd) { throw RuntimeError("Could not create/overwrite binary master file " + - fileName); + fileName); } rapidjson::StringBuffer s; @@ -62,15 +62,16 @@ void LinkHDF5FileInMaster(std::string &masterFileName, // open master file H5::H5File masterfd(masterFileName.c_str(), H5F_ACC_RDWR, - H5::FileCreatPropList::DEFAULT, flist); + H5::FileCreatPropList::DEFAULT, flist); // open data file fd = make_unique(dataFilename.c_str(), H5F_ACC_RDONLY, - H5::FileCreatPropList::DEFAULT, flist); + H5::FileCreatPropList::DEFAULT, flist); // create link for data dataset H5::DataSet dset = fd->openDataSet(DATASET_NAME); - std::string linkname = std::string("/entry/data/") + std::string(DATASET_NAME); + std::string linkname = + std::string("/entry/data/") + std::string(DATASET_NAME); if (H5Lcreate_external(dataFilename.c_str(), DATASET_NAME, masterfd.getLocId(), linkname.c_str(), H5P_DEFAULT, H5P_DEFAULT) < 0) { @@ -129,7 +130,7 @@ std::string CreateMasterHDF5File(const std::string &filePath, createFlags = H5F_ACC_TRUNC; } fd = make_unique(fileName.c_str(), createFlags, - H5::FileCreatPropList::DEFAULT, flist); + H5::FileCreatPropList::DEFAULT, flist); // attributes - version double dValue = HDF5_WRITER_VERSION; @@ -152,8 +153,7 @@ std::string CreateMasterHDF5File(const std::string &filePath, error.printErrorStack(); if (fd != nullptr) fd->close(); - throw RuntimeError( - "Could not create/overwrite master HDF5 handles"); + throw RuntimeError("Could not create/overwrite master HDF5 handles"); } if (!silentMode) { LOG(logINFO) << "Master File: " << fileName; @@ -165,13 +165,12 @@ std::string CreateVirtualHDF5File( const std::string &filePath, const std::string &fileNamePrefix, const uint64_t fileIndex, const bool overWriteEnable, const bool silentMode, const int modulePos, const int numUnitsPerReadout, - const uint32_t maxFramesPerFile, - const uint32_t nPixelsX, const uint32_t nPixelsY, - const uint32_t dynamicRange, const uint64_t numImagesCaught, - const int numModX, const int numModY, const H5::DataType dataType, - const std::vector parameterNames, - const std::vector parameterDataTypes, std::mutex *hdf5LibMutex, - bool gotthard25um) { + const uint32_t maxFramesPerFile, const uint32_t nPixelsX, + const uint32_t nPixelsY, const uint32_t dynamicRange, + const uint64_t numImagesCaught, const int numModX, const int numModY, + const H5::DataType dataType, const std::vector parameterNames, + const std::vector parameterDataTypes, + std::mutex *hdf5LibMutex, bool gotthard25um) { // virtual file name std::ostringstream osfn; @@ -195,10 +194,10 @@ std::string CreateVirtualHDF5File( fapl.setFcloseDegree(H5F_CLOSE_STRONG); if (!overWriteEnable) fd = make_unique(fileName.c_str(), H5F_ACC_EXCL, - H5::FileCreatPropList::DEFAULT, fapl); + H5::FileCreatPropList::DEFAULT, fapl); else fd = make_unique(fileName.c_str(), H5F_ACC_TRUNC, - H5::FileCreatPropList::DEFAULT, fapl); + H5::FileCreatPropList::DEFAULT, fapl); // attributes - version double dValue = HDF5_WRITER_VERSION; @@ -207,21 +206,23 @@ std::string CreateVirtualHDF5File( "version", H5::PredType::NATIVE_DOUBLE, dataspace_attr); attribute.write(H5::PredType::NATIVE_DOUBLE, &dValue); - // virtual dataspace - hsize_t vdsDims[3] = {numImagesCaught, numModY * nDimy, - numModZ * nDimz}; - H5::DataSpace vdsDataSpace(3, vdsDims, nullptr); - hsize_t vdsDimsPara[2] = {numImagesCaught, - (unsigned int)numModY * numModZ}; - H5::DataSpace vdsDataSpacePara(2, vdsDimsPara, nullptr); + // dataspace + hsize_t vdsDims[DATA_RANK] = {numImagesCaught, numModY * nDimy, + numModZ * nDimz}; + hsize_t vdsDimsPara[VDS_PARA_RANK] = {numImagesCaught, + numModY * numModZ}; + H5::DataSpace vdsDataSpace(DATA_RANK, vdsDims, nullptr); + H5::DataSpace vdsDataSpacePara(VDS_PARA_RANK, vdsDimsPara, nullptr); - // property list (fill value and datatype) - int fill_value = -1; + // property list H5::DSetCreatPropList plist; + int fill_value = -1; plist.setFillValue(dataType, &fill_value); - - // property list for parameters (datatype) std::vector plistPara(paraSize); + // ignoring last fill (string) + for (unsigned int i = 0; i != plistPara.size() - 1; ++i) { + plistPara[i].setFillValue(parameterDataTypes[i], &fill_value); + } // hyperslab (files) int numFiles = numImagesCaught / maxFramesPerFile; @@ -235,15 +236,15 @@ std::string CreateVirtualHDF5File( ? maxFramesPerFile : (numImagesCaught - framesSaved); - hsize_t startLocation[3] = {framesSaved, 0, 0}; - hsize_t strideBetweenBlocks[3] = {1, 1, 1}; - hsize_t numBlocks[3] = {nDimx, nDimy, nDimz}; - hsize_t blockSize[3] = {1, 1, 1}; + hsize_t startLocation[DATA_RANK] = {framesSaved, 0, 0}; + hsize_t strideBetweenBlocks[DATA_RANK] = {1, 1, 1}; + hsize_t numBlocks[DATA_RANK] = {nDimx, nDimy, nDimz}; + hsize_t blockSize[DATA_RANK] = {1, 1, 1}; - hsize_t startLocationPara[2] = {framesSaved, 0}; - hsize_t strideBetweenBlocksPara[3] = {1, 1}; - hsize_t numBlocksPara[2] = {1, 1}; - hsize_t blockSizePara[3] = {nDimx, 1}; + hsize_t startLocationPara[VDS_PARA_RANK] = {framesSaved, 0}; + hsize_t strideBetweenBlocksPara[VDS_PARA_RANK] = {1, 1}; + hsize_t numBlocksPara[VDS_PARA_RANK] = {nDimx, 1}; + hsize_t blockSizePara[VDS_PARA_RANK] = {1, 1}; // interleaving for g2 if (gotthard25um) { @@ -284,12 +285,23 @@ std::string CreateVirtualHDF5File( } // source dataspace - hsize_t srcDims[3] = {nDimx, nDimy, nDimz}; - hsize_t srcDimsMax[3] = {H5S_UNLIMITED, nDimy, nDimz}; - H5::DataSpace srcDataSpace(3, srcDims, srcDimsMax); - hsize_t srcDimsPara[1] = {nDimx}; - hsize_t srcDimsMaxPara[1] = {H5S_UNLIMITED}; - H5::DataSpace srcDataSpacePara(1, srcDimsPara, srcDimsMaxPara); + hsize_t srcDims[DATA_RANK] = {nDimx, nDimy, nDimz}; + hsize_t srcDimsMax[DATA_RANK] = {H5S_UNLIMITED, nDimy, nDimz}; + H5::DataSpace srcDataSpace(DATA_RANK, srcDims, srcDimsMax); + hsize_t srcDimsPara[PARA_RANK] = {nDimx}; + hsize_t srcDimsMaxPara[PARA_RANK] = {H5S_UNLIMITED}; + H5::DataSpace srcDataSpacePara(PARA_RANK, srcDimsPara, + srcDimsMaxPara); + // temporary fixfor corner case bug: + // (framescaught not multiple of framesperfile, + // virtual parameter datasets error loading (bad scalar value)) + if (nDimx != maxFramesPerFile) { + hsize_t count[1] = {nDimx}; + hsize_t start[1] = {0}; + srcDataSpacePara.selectHyperslab( + H5S_SELECT_SET, count, start, strideBetweenBlocksPara, + blockSizePara); + } // mapping of property list plist.setVirtual(vdsDataSpace, relative_srcFileName.c_str(), @@ -310,13 +322,13 @@ std::string CreateVirtualHDF5File( startLocation[1] += nDimy; } } - startLocationPara[1]++; + ++startLocationPara[1]; } framesSaved += nDimx; } // datasets - H5::DataSet vdsDataSet(fd->createDataSet(DATASET_NAME, dataType, - vdsDataSpace, plist)); + H5::DataSet vdsDataSet( + fd->createDataSet(DATASET_NAME, dataType, vdsDataSpace, plist)); for (unsigned int p = 0; p < paraSize; ++p) { H5::DataSet vdsDataSetPara(fd->createDataSet( @@ -330,8 +342,7 @@ std::string CreateVirtualHDF5File( if (fd) { fd->close(); } - throw RuntimeError( - "Could not create/overwrite virtual HDF5 handles"); + throw RuntimeError("Could not create/overwrite virtual HDF5 handles"); } if (!silentMode) { LOG(logINFO) << "Virtual File: " << fileName; diff --git a/slsReceiverSoftware/src/MasterFileUtility.h b/slsReceiverSoftware/src/MasterFileUtility.h index bbce2f4e5..ec7494c1d 100644 --- a/slsReceiverSoftware/src/MasterFileUtility.h +++ b/slsReceiverSoftware/src/MasterFileUtility.h @@ -10,9 +10,6 @@ namespace sls { namespace masterFileUtility { - - - std::string CreateMasterBinaryFile(const std::string &filePath, const std::string &fileNamePrefix, const uint64_t fileIndex, @@ -37,13 +34,12 @@ std::string CreateVirtualHDF5File( const std::string &filePath, const std::string &fileNamePrefix, const uint64_t fileIndex, const bool overWriteEnable, const bool silentMode, const int modulePos, const int numUnitsPerReadout, - const uint32_t maxFramesPerFile, - const uint32_t nPixelsX, const uint32_t nPixelsY, - const uint32_t dynamicRange, const uint64_t numImagesCaught, - const int numModX, const int numModY, const H5::DataType dataType, - const std::vector parameterNames, - const std::vector parameterDataTypes, std::mutex *hdf5LibMutex, - bool gotthard25um); + const uint32_t maxFramesPerFile, const uint32_t nPixelsX, + const uint32_t nPixelsY, const uint32_t dynamicRange, + const uint64_t numImagesCaught, const int numModX, const int numModY, + const H5::DataType dataType, const std::vector parameterNames, + const std::vector parameterDataTypes, + std::mutex *hdf5LibMutex, bool gotthard25um); #endif } // namespace masterFileUtility diff --git a/slsReceiverSoftware/src/MultiReceiverApp.cpp b/slsReceiverSoftware/src/MultiReceiverApp.cpp index 93605f6f7..cb91eb738 100644 --- a/slsReceiverSoftware/src/MultiReceiverApp.cpp +++ b/slsReceiverSoftware/src/MultiReceiverApp.cpp @@ -54,15 +54,16 @@ void printHelp() { int StartAcq(const std::string &filePath, const std::string &fileName, uint64_t fileIndex, size_t imageSize, void *objectPointer) { LOG(sls::logINFOBLUE) << "#### StartAcq: filePath:" << filePath - << " fileName:" << fileName << " fileIndex:" << fileIndex - << " imageSize:" << imageSize << " ####"; + << " fileName:" << fileName + << " fileIndex:" << fileIndex + << " imageSize:" << imageSize << " ####"; return 0; } /** Acquisition Finished Call back */ void AcquisitionFinished(uint64_t framesCaught, void *objectPointer) { LOG(sls::logINFOBLUE) << "#### AcquisitionFinished: framesCaught:" - << framesCaught << " ####"; + << framesCaught << " ####"; } /** @@ -70,9 +71,9 @@ void AcquisitionFinished(uint64_t framesCaught, void *objectPointer) { * Prints in different colors(for each receiver process) the different headers * for each image call back. */ -void GetData(slsDetectorDefs::sls_receiver_header *header, char *dataPointer, +void GetData(slsDetectorDefs::sls_receiver_header &header, char *dataPointer, size_t imageSize, void *objectPointer) { - slsDetectorDefs::sls_detector_header detectorHeader = header->detHeader; + slsDetectorDefs::sls_detector_header detectorHeader = header.detHeader; PRINT_IN_COLOR( detectorHeader.modId ? detectorHeader.modId : detectorHeader.row, @@ -101,9 +102,9 @@ void GetData(slsDetectorDefs::sls_receiver_header *header, char *dataPointer, * @param modifiedImageSize new data size in bytes after the callback. * This will be the size written/streamed. (only smaller value is allowed). */ -void GetData(slsDetectorDefs::sls_receiver_header *header, char *dataPointer, +void GetData(slsDetectorDefs::sls_receiver_header &header, char *dataPointer, size_t &modifiedImageSize, void *objectPointer) { - slsDetectorDefs::sls_detector_header detectorHeader = header->detHeader; + slsDetectorDefs::sls_detector_header detectorHeader = header.detHeader; PRINT_IN_COLOR( detectorHeader.modId ? detectorHeader.modId : detectorHeader.row, @@ -123,7 +124,7 @@ void GetData(slsDetectorDefs::sls_receiver_header *header, char *dataPointer, detectorHeader.debug, detectorHeader.roundRNumber, detectorHeader.detType, detectorHeader.version, // header->packetsMask.to_string().c_str(), - ((uint8_t)(*((uint8_t *)(dataPointer)))), modifiedImageSize); + *reinterpret_cast(dataPointer), modifiedImageSize); // if data is modified, eg ROI and size is reduced modifiedImageSize = 26000; diff --git a/slsReceiverSoftware/src/Receiver.cpp b/slsReceiverSoftware/src/Receiver.cpp index 657137b11..c7f0cbe67 100644 --- a/slsReceiverSoftware/src/Receiver.cpp +++ b/slsReceiverSoftware/src/Receiver.cpp @@ -128,9 +128,11 @@ int64_t Receiver::getReceiverVersion() { return tcpipInterface->getReceiverVersion(); } -void Receiver::registerCallBackStartAcquisition( - int (*func)(const std::string &, const std::string &, uint64_t, size_t, void *), - void *arg) { +void Receiver::registerCallBackStartAcquisition(int (*func)(const std::string &, + const std::string &, + uint64_t, size_t, + void *), + void *arg) { tcpipInterface->registerCallBackStartAcquisition(func, arg); } @@ -141,12 +143,12 @@ void Receiver::registerCallBackAcquisitionFinished(void (*func)(uint64_t, } void Receiver::registerCallBackRawDataReady( - void (*func)(sls_receiver_header *, char *, size_t, void *), void *arg) { + void (*func)(sls_receiver_header &, char *, size_t, void *), void *arg) { tcpipInterface->registerCallBackRawDataReady(func, arg); } void Receiver::registerCallBackRawDataModifyReady( - void (*func)(sls_receiver_header *, char *, size_t &, void *), void *arg) { + void (*func)(sls_receiver_header &, char *, size_t &, void *), void *arg) { tcpipInterface->registerCallBackRawDataModifyReady(func, arg); } diff --git a/slsReceiverSoftware/src/ThreadObject.cpp b/slsReceiverSoftware/src/ThreadObject.cpp index 67b3fbda6..183b31ece 100644 --- a/slsReceiverSoftware/src/ThreadObject.cpp +++ b/slsReceiverSoftware/src/ThreadObject.cpp @@ -18,15 +18,15 @@ namespace sls { #define gettid() syscall(SYS_gettid) #endif -ThreadObject::ThreadObject(int threadIndex, std::string threadType) - : index(threadIndex), type(threadType) { +ThreadObject::ThreadObject(int index, std::string type) + : index(index), type(type) { LOG(logDEBUG) << type << " thread created: " << index; sem_init(&semaphore, 1, 0); try { threadObject = std::thread(&ThreadObject::RunningThread, this); } catch (...) { - throw RuntimeError("Could not create " + type + - " thread with index " + std::to_string(index)); + throw RuntimeError("Could not create " + type + " thread with index " + + std::to_string(index)); } } diff --git a/slsReceiverSoftware/src/ThreadObject.h b/slsReceiverSoftware/src/ThreadObject.h index ffba674a5..6089e1042 100644 --- a/slsReceiverSoftware/src/ThreadObject.h +++ b/slsReceiverSoftware/src/ThreadObject.h @@ -24,7 +24,7 @@ class ThreadObject : private virtual slsDetectorDefs { const int index{0}; public: - ThreadObject(int threadIndex, std::string threadType); + ThreadObject(int index, std::string type); virtual ~ThreadObject(); pid_t GetThreadId() const; bool IsRunning() const; diff --git a/slsReceiverSoftware/src/receiver_defs.h b/slsReceiverSoftware/src/receiver_defs.h index 21dfeaa1a..d06b8ae73 100644 --- a/slsReceiverSoftware/src/receiver_defs.h +++ b/slsReceiverSoftware/src/receiver_defs.h @@ -37,13 +37,21 @@ namespace sls { #define FILE_BUFFER_SIZE (16 * 1024 * 1024) // 16mb // fifo -#define FIFO_HEADER_NUMBYTES (16) -#define FIFO_DATASIZE_NUMBYTES (4) -#define FIFO_PADDING_NUMBYTES \ - (4) // for 8 byte alignment due to sls_receiver_header structure +struct image_structure { + size_t size; + size_t firstIndex; + slsDetectorDefs::sls_receiver_header header; + char data[]; +}; +#define IMAGE_STRUCTURE_HEADER_SIZE \ + (sizeof(size_t) + sizeof(size_t) + \ + sizeof(slsDetectorDefs::sls_receiver_header)) // hdf5 #define MAX_CHUNKED_IMAGES (1) +#define DATA_RANK (3) +#define PARA_RANK (1) +#define VDS_PARA_RANK (2) // parameters to calculate fifo depth #define SAMPLE_TIME_IN_NS (100000000) // 100ms @@ -58,7 +66,6 @@ namespace sls { #define STREAMER_PRIORITY (10) #define TCP_PRIORITY (10) - #ifdef HDF5C #define DATASET_NAME "/data" #endif diff --git a/slsReceiverSoftware/tests/test-CircularFifo.cpp b/slsReceiverSoftware/tests/test-CircularFifo.cpp index b83075065..1e1398536 100644 --- a/slsReceiverSoftware/tests/test-CircularFifo.cpp +++ b/slsReceiverSoftware/tests/test-CircularFifo.cpp @@ -6,7 +6,6 @@ namespace sls { - TEST_CASE("Empty buffer") { CircularFifo fifo(0); diff --git a/slsSupportLib/include/sls/StaticVector.h b/slsSupportLib/include/sls/StaticVector.h index 794bbee71..3c671f80b 100644 --- a/slsSupportLib/include/sls/StaticVector.h +++ b/slsSupportLib/include/sls/StaticVector.h @@ -192,8 +192,7 @@ bool operator!=(const std::vector &lhs, } template -std::ostream &operator<<(std::ostream &os, - const StaticVector &c) { +std::ostream &operator<<(std::ostream &os, const StaticVector &c) { return os << ToString(c); } diff --git a/slsSupportLib/include/sls/UdpRxSocket.h b/slsSupportLib/include/sls/UdpRxSocket.h index 646309ef6..a982ed471 100644 --- a/slsSupportLib/include/sls/UdpRxSocket.h +++ b/slsSupportLib/include/sls/UdpRxSocket.h @@ -23,10 +23,6 @@ class UdpRxSocket { void setBufferSize(int size); ssize_t getPacketSize() const noexcept; void Shutdown(); - - // Only for backwards compatibility, this drops the EIGER small pkt, may be - // removed - ssize_t ReceiveDataOnly(char *dst) noexcept; }; } // namespace sls diff --git a/slsSupportLib/include/sls/ZmqSocket.h b/slsSupportLib/include/sls/ZmqSocket.h index e3f546afd..e25e9b115 100644 --- a/slsSupportLib/include/sls/ZmqSocket.h +++ b/slsSupportLib/include/sls/ZmqSocket.h @@ -9,8 +9,8 @@ *@short functions to open/close zmq sockets */ -#include "sls/sls_detector_exceptions.h" #include "sls/container_utils.h" +#include "sls/sls_detector_exceptions.h" #include #include @@ -23,7 +23,6 @@ namespace sls { // #define ZMQ_DETAIL #define ROIVERBOSITY - /** zmq header structure */ struct zmqHeader { /** true if incoming data, false if end of acquisition */ @@ -224,8 +223,7 @@ class ZmqSocket { /** Socket descriptor */ mySocketDescriptors sockfd; - std::unique_ptr header_buffer = - make_unique(MAX_STR_LENGTH); + std::unique_ptr header_buffer = make_unique(MAX_STR_LENGTH); }; } // namespace sls diff --git a/slsSupportLib/include/sls/sls_detector_defs.h b/slsSupportLib/include/sls/sls_detector_defs.h index 677075ee4..b5425ff96 100644 --- a/slsSupportLib/include/sls/sls_detector_defs.h +++ b/slsSupportLib/include/sls/sls_detector_defs.h @@ -69,8 +69,8 @@ #define MAX_STR_LENGTH 1000 #define SHORT_STR_LENGTH 20 -#define MAX_PATTERN_LENGTH 0x2000 -#define MAX_PATTERN_LEVELS 6 +#define MAX_PATTERN_LENGTH 0x2000 +#define MAX_PATTERN_LEVELS 6 #define M3_MAX_PATTERN_LEVELS 3 #define DEFAULT_STREAMING_TIMER_IN_MS 500 @@ -179,8 +179,8 @@ class slsDetectorDefs { ROI(int xmin, int xmax, int ymin, int ymax) : xmin(xmin), xmax(xmax), ymin(ymin), ymax(ymax){}; constexpr std::array getIntArray() const { - return std::array ({xmin, xmax, ymin, ymax}); - } + return std::array({xmin, xmax, ymin, ymax}); + } constexpr bool completeRoi() const { return (xmin == -1 && xmax == -1 && ymin == -1 && ymax == -1); } diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index fbd1dab47..5e4aaba1a 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -2,13 +2,13 @@ // Copyright (C) 2021 Contributors to the SLS Detector Package /** API versions */ #define GITBRANCH "developer" -#define APILIB 0x220609 -#define APIRECEIVER 0x220609 -#define APIGUI 0x220609 -#define APICTB 0x220714 -#define APIGOTTHARD 0x220714 -#define APIGOTTHARD2 0x220714 -#define APIJUNGFRAU 0x220714 -#define APIMYTHEN3 0x220714 -#define APIMOENCH 0x220714 -#define APIEIGER 0x220714 +#define APILIB 0x220609 +#define APIRECEIVER 0x220609 +#define APIGUI 0x220609 +#define APICTB 0x220714 +#define APIGOTTHARD 0x220714 +#define APIJUNGFRAU 0x220714 +#define APIMYTHEN3 0x220714 +#define APIMOENCH 0x220714 +#define APIEIGER 0x220714 +#define APIGOTTHARD2 0x220811 diff --git a/slsSupportLib/src/ServerSocket.cpp b/slsSupportLib/src/ServerSocket.cpp index d8f235e2f..e61c5d132 100644 --- a/slsSupportLib/src/ServerSocket.cpp +++ b/slsSupportLib/src/ServerSocket.cpp @@ -15,7 +15,6 @@ #include #include - namespace sls { #define DEFAULT_PACKET_SIZE 1286 diff --git a/slsSupportLib/src/ToString.cpp b/slsSupportLib/src/ToString.cpp index 3b3cd072f..04fda1dde 100644 --- a/slsSupportLib/src/ToString.cpp +++ b/slsSupportLib/src/ToString.cpp @@ -123,8 +123,7 @@ std::ostream &operator<<(std::ostream &os, std::string ToString(const slsDetectorDefs::currentSrcParameters &r) { std::ostringstream oss; if (r.fix < -1 || r.fix > 1 || r.normal < -1 || r.normal > 1) { - throw RuntimeError( - "Invalid current source parameters. Cannot print."); + throw RuntimeError("Invalid current source parameters. Cannot print."); } oss << '['; if (r.enable) { diff --git a/slsSupportLib/src/UdpRxSocket.cpp b/slsSupportLib/src/UdpRxSocket.cpp index 18eaf9372..c7634544c 100644 --- a/slsSupportLib/src/UdpRxSocket.cpp +++ b/slsSupportLib/src/UdpRxSocket.cpp @@ -18,13 +18,11 @@ namespace sls { UdpRxSocket::UdpRxSocket(int port, ssize_t packet_size, const char *hostname, int kernel_buffer_size) : packet_size_(packet_size) { - struct addrinfo hints; - memset(&hints, 0, sizeof(hints)); + struct addrinfo hints {}; hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_DGRAM; - hints.ai_protocol = 0; hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG; - struct addrinfo *res = nullptr; + struct addrinfo *res{nullptr}; const std::string portname = std::to_string(port); if (getaddrinfo(hostname, portname.c_str(), &hints, &res)) { @@ -36,6 +34,7 @@ UdpRxSocket::UdpRxSocket(int port, ssize_t packet_size, const char *hostname, throw RuntimeError("Failed to create UDP RX socket"); } if (bind(sockfd_, res->ai_addr, res->ai_addrlen) == -1) { + close(sockfd_); throw RuntimeError("Failed to bind UDP RX socket"); } freeaddrinfo(res); @@ -56,29 +55,19 @@ UdpRxSocket::UdpRxSocket(int port, ssize_t packet_size, const char *hostname, } } -UdpRxSocket::~UdpRxSocket() { Shutdown(); } +UdpRxSocket::~UdpRxSocket() { + Shutdown(); + close(sockfd_); + sockfd_ = -1; +} + ssize_t UdpRxSocket::getPacketSize() const noexcept { return packet_size_; } bool UdpRxSocket::ReceivePacket(char *dst) noexcept { auto bytes_received = recvfrom(sockfd_, dst, packet_size_, 0, nullptr, nullptr); - return bytes_received == packet_size_; -} -ssize_t UdpRxSocket::ReceiveDataOnly(char *dst) noexcept { - auto r = recvfrom(sockfd_, dst, packet_size_, 0, nullptr, nullptr); - constexpr ssize_t eiger_header_packet = 40; // only detector that has this - if (r == eiger_header_packet) { - LOG(logWARNING) << "Got header pkg"; - r = recvfrom(sockfd_, dst, packet_size_, 0, nullptr, nullptr); - } - // temporary workaround for Eiger firmware (stop sends bad packets of size 8 - // bytes) - if (r == 8) { - LOG(logWARNING) << "Ignoring bad packet of size 8 bytes"; - r = recvfrom(sockfd_, dst, packet_size_, 0, nullptr, nullptr); - } - return r; + return bytes_received == packet_size_; } int UdpRxSocket::getBufferSize() const { @@ -95,10 +84,7 @@ void UdpRxSocket::setBufferSize(int size) { } void UdpRxSocket::Shutdown() { + // not closing yet on purpose, but read gives -1 shutdown(sockfd_, SHUT_RDWR); - if (sockfd_ >= 0) { - close(sockfd_); - sockfd_ = -1; - } } } // namespace sls \ No newline at end of file diff --git a/slsSupportLib/src/ZmqSocket.cpp b/slsSupportLib/src/ZmqSocket.cpp index 4f9c7cf05..4082f43f0 100644 --- a/slsSupportLib/src/ZmqSocket.cpp +++ b/slsSupportLib/src/ZmqSocket.cpp @@ -417,4 +417,3 @@ void ZmqSocket::mySocketDescriptors::Close() { }; } // namespace sls - diff --git a/slsSupportLib/src/file_utils.cpp b/slsSupportLib/src/file_utils.cpp index 645d0e62d..76786eb74 100644 --- a/slsSupportLib/src/file_utils.cpp +++ b/slsSupportLib/src/file_utils.cpp @@ -60,15 +60,14 @@ std::vector readBinaryFile(const std::string &fname, // check if it exists struct stat st; if (stat(fname.c_str(), &st) != 0) { - throw RuntimeError(errorPrefix + - std::string(" (file does not exist)")); + throw RuntimeError(errorPrefix + std::string(" (file does not exist)")); } FILE *fp = fopen(fname.c_str(), "rb"); if (fp == nullptr) { throw RuntimeError(errorPrefix + - std::string(" (Could not open file: ") + fname + - std::string(")")); + std::string(" (Could not open file: ") + fname + + std::string(")")); } // get file size to print progress @@ -76,13 +75,12 @@ std::vector readBinaryFile(const std::string &fname, std::vector buffer(filesize, 0); if ((ssize_t)fread(buffer.data(), sizeof(char), filesize, fp) != filesize) { - throw RuntimeError(errorPrefix + - std::string(" (Could not read file)")); + throw RuntimeError(errorPrefix + std::string(" (Could not read file)")); } if (fclose(fp) != 0) { throw RuntimeError(errorPrefix + - std::string(" (Could not close file)")); + std::string(" (Could not close file)")); } LOG(logDEBUG1) << "Read file into memory"; diff --git a/slsSupportLib/tests/test-ToString.cpp b/slsSupportLib/tests/test-ToString.cpp index ac246fda6..56b591eba 100644 --- a/slsSupportLib/tests/test-ToString.cpp +++ b/slsSupportLib/tests/test-ToString.cpp @@ -333,8 +333,7 @@ TEST_CASE("streamingInterface") { REQUIRE(ToString(defs::streamingInterface::ETHERNET_10GB) == "10gbe"); REQUIRE(ToString(defs::streamingInterface::LOW_LATENCY_LINK) == "lll"); REQUIRE(ToString(defs::streamingInterface::LOW_LATENCY_LINK | - defs::streamingInterface::ETHERNET_10GB) == - "lll, 10gbe"); + defs::streamingInterface::ETHERNET_10GB) == "lll, 10gbe"); } // Speed level @@ -353,10 +352,8 @@ TEST_CASE("string to speedLevel") { defs::speedLevel::HALF_SPEED); REQUIRE(StringTo("quarter_speed") == defs::speedLevel::QUARTER_SPEED); - REQUIRE(StringTo("108") == - defs::speedLevel::G2_108MHZ); - REQUIRE(StringTo("144") == - defs::speedLevel::G2_144MHZ); + REQUIRE(StringTo("108") == defs::speedLevel::G2_108MHZ); + REQUIRE(StringTo("144") == defs::speedLevel::G2_144MHZ); } } // namespace sls diff --git a/slsSupportLib/tests/test-UdpRxSocket.cpp b/slsSupportLib/tests/test-UdpRxSocket.cpp index c0345671c..2fc152b5d 100644 --- a/slsSupportLib/tests/test-UdpRxSocket.cpp +++ b/slsSupportLib/tests/test-UdpRxSocket.cpp @@ -33,8 +33,7 @@ int open_socket(int port) { const std::string portname = std::to_string(port); if (getaddrinfo(host, portname.c_str(), &hints, &res)) { - throw RuntimeError("Failed at getaddrinfo with " + - std::string(host)); + throw RuntimeError("Failed at getaddrinfo with " + std::string(host)); } int fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); if (fd == -1) { diff --git a/slsSupportLib/tests/test-ZmqSocket.cpp b/slsSupportLib/tests/test-ZmqSocket.cpp index 7697d952d..513bc1392 100644 --- a/slsSupportLib/tests/test-ZmqSocket.cpp +++ b/slsSupportLib/tests/test-ZmqSocket.cpp @@ -5,7 +5,6 @@ namespace sls { - TEST_CASE("Throws when cannot create socket") { REQUIRE_THROWS(ZmqSocket("sdiasodjajpvv", 5076001)); } @@ -118,4 +117,4 @@ TEST_CASE("Send header and data") { } } -} //namespace \ No newline at end of file +} // namespace sls \ No newline at end of file diff --git a/tests/src/testclient.cpp b/tests/src/testclient.cpp index b4bece3f5..06983bcf0 100644 --- a/tests/src/testclient.cpp +++ b/tests/src/testclient.cpp @@ -38,7 +38,8 @@ int main(int argc, char **argv) { for (int i = 0; i != 100; ++i) { std::cout << "Sending: " << i << "\n"; auto socket = sls::ClientSocket("test", hostname, port); - std::cout << "Sent: " << socket.Send(sls::func_id::read_int) << " bytes\n"; + std::cout << "Sent: " << socket.Send(sls::func_id::read_int) + << " bytes\n"; std::cout << "Sent: " << socket.Send(i) << " bytes\n"; } @@ -46,7 +47,8 @@ int main(int argc, char **argv) { for (int i = 0; i != 5; ++i) { std::cout << "Sending data\n"; auto socket = sls::ClientSocket("test", hostname, port); - std::cout << "Sent: " << socket.Send(sls::func_id::read_data) << " bytes\n"; + std::cout << "Sent: " << socket.Send(sls::func_id::read_data) + << " bytes\n"; std::cout << "Sent: " << socket.Send(data.get(), sls::DATA_SIZE) << " bytes\n"; } @@ -54,7 +56,8 @@ int main(int argc, char **argv) { // Send too little data { auto socket = sls::ClientSocket("test", hostname, port); - std::cout << "Sent: " << socket.Send(sls::func_id::read_data) << " bytes\n"; + std::cout << "Sent: " << socket.Send(sls::func_id::read_data) + << " bytes\n"; std::cout << "Sent: " << socket.Send(data.get(), sls::DATA_SIZE / 2) << " bytes\n"; } @@ -71,7 +74,8 @@ int main(int argc, char **argv) { for (int i = 0; i != 10; ++i) { std::cout << "Sending: " << i << "\n"; auto socket = sls::ClientSocket("test", hostname, port); - std::cout << "Sent: " << socket.Send(sls::func_id::read_int) << " bytes\n"; + std::cout << "Sent: " << socket.Send(sls::func_id::read_int) + << " bytes\n"; std::cout << "Sent: " << socket.Send(i) << " bytes\n"; } diff --git a/tests/test.cpp b/tests/test.cpp index fd970314a..a26248353 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -30,13 +30,14 @@ int main(int argc, char *argv[]) { sls::test::my_ip = "undefined"; Catch::Session session; - auto cli = - session.cli() | - sls::Opt(sls::test::hostname, "hostname")["-hn"]["--hostname"]( - "Detector hostname for integration tests") | - sls::Opt(sls::test::detector_type, "detector_type")["-dt"]["--detector_type"]( - "Detector type for integration tests") | - sls::Opt(sls::test::my_ip, "my_ip")["-hip"]["--host_ip"]("Host ip address"); + auto cli = session.cli() | + sls::Opt(sls::test::hostname, "hostname")["-hn"]["--hostname"]( + "Detector hostname for integration tests") | + sls::Opt(sls::test::detector_type, + "detector_type")["-dt"]["--detector_type"]( + "Detector type for integration tests") | + sls::Opt(sls::test::my_ip, + "my_ip")["-hip"]["--host_ip"]("Host ip address"); session.cli(cli); @@ -47,8 +48,8 @@ int main(int argc, char *argv[]) { sls::test::type = slsDetectorDefs::GENERIC; if (!sls::test::detector_type.empty()) { - sls::test::type = - sls::StringTo(sls::test::detector_type); + sls::test::type = sls::StringTo( + sls::test::detector_type); } return session.run();