#include "qTabSettings.h" #include "multiSlsDetector.h" #include #include #include qTabSettings::qTabSettings(QWidget *parent, multiSlsDetector *detector) : QWidget(parent), myDet(detector) { setupUi(this); SetupWidgetWindow(); FILE_LOG(logDEBUG) << "Settings ready"; } qTabSettings::~qTabSettings() {} void qTabSettings::SetupWidgetWindow() { switch(myDet->getDetectorTypeAsEnum()) { case MOENCH: lblSettings->setEnabled(false); comboSettings->setEnabled(false); break; case EIGER: lblDynamicRange->setEnabled(true); comboDynamicRange->setEnabled(true); lblThreshold->setEnabled(true); spinThreshold->setEnabled(true); break; default: break; } Initialization(); // Settings comboSettings->setCurrentIndex(UNINITIALIZED); if (comboSettings->isEnabled()) { SetupDetectorSettings(); GetSettings(); } // Dynamic Range (update it anyway) GetDynamicRange(); // get threshold spinThreshold->setValue(-1); if (spinThreshold->isEnabled()) GetThresholdEnergy(); } void qTabSettings::SetupDetectorSettings() { // To be able to index items on a combo box QStandardItemModel *model = qobject_cast(comboSettings->model()); if (model) { QModelIndex index[NUMSETTINGS]; QStandardItem *item[NUMSETTINGS]; for (int i = 0; i < NUMSETTINGS; ++i) { index[i] = model->index(i, comboSettings->modelColumn(), comboSettings->rootModelIndex()); item[i] = model->itemFromIndex(index[i]); } item[(int)UNDEFINED]->setEnabled(false); item[(int)UNINITIALIZED]->setEnabled(false); switch (detType) { case slsDetectorDefs::EIGER: item[(int)STANDARD]->setEnabled(true); item[(int)HIGHGAIN]->setEnabled(true); item[(int)LOWGAIN]->setEnabled(true); item[(int)VERYHIGHGAIN]->setEnabled(true); item[(int)VERLOWGAIN]->setEnabled(true); item[(int)FAST]->setEnabled(false); item[(int)DYNAMICGAIN]->setEnabled(false); item[(int)MEDIUMGAIN]->setEnabled(false); item[(int)LOWNOISE]->setEnabled(false); item[(int)DYNAMICHG0]->setEnabled(false); item[(int)FIXGAIN1]->setEnabled(false); item[(int)FIXGAIN2]->setEnabled(false); item[(int)FORCESWITCHG1]->setEnabled(false); item[(int)FORCESWITCHG2]->setEnabled(false); break; case slsDetectorDefs::GOTTHARD: item[(int)HIGHGAIN]->setEnabled(true); item[(int)DYNAMICGAIN]->setEnabled(true); item[(int)LOWGAIN]->setEnabled(true); item[(int)MEDIUMGAIN]->setEnabled(true); item[(int)VERYHIGHGAIN]->setEnabled(true); item[(int)STANDARD]->setEnabled(false); item[(int)FAST]->setEnabled(false); item[(int)LOWNOISE]->setEnabled(false); item[(int)DYNAMICHG0]->setEnabled(false); item[(int)FIXGAIN1]->setEnabled(false); item[(int)FIXGAIN2]->setEnabled(false); item[(int)FORCESWITCHG1]->setEnabled(false); item[(int)FORCESWITCHG2]->setEnabled(false); item[(int)VERLOWGAIN]->setEnabled(false); break; case slsDetectorDefs::JUNGFRAU: item[(int)DYNAMICGAIN]->setEnabled(true); item[(int)DYNAMICHG0]->setEnabled(true); item[(int)FIXGAIN1]->setEnabled(true); item[(int)FIXGAIN2]->setEnabled(true); item[(int)FORCESWITCHG1]->setEnabled(true); item[(int)FORCESWITCHG2]->setEnabled(true); item[(int)STANDARD]->setEnabled(false); item[(int)FAST]->setEnabled(false); item[(int)HIGHGAIN]->setEnabled(false); item[(int)LOWGAIN]->setEnabled(false); item[(int)MEDIUMGAIN]->setEnabled(false); item[(int)VERYHIGHGAIN]->setEnabled(false); item[(int)LOWNOISE]->setEnabled(false); item[(int)VERLOWGAIN]->setEnabled(false); break; default: FILE_LOG(logDEBUG) << "Unknown detector type. Exiting GUI."; qDefs::Message(qDefs::CRITICAL, "Unknown detector type. Exiting GUI.", "qTabSettings::SetupDetectorSettings"); exit(-1); } } } void qTabSettings::Initialization() { // Settings if (comboSettings->isEnabled()) connect(comboSettings, SIGNAL(currentIndexChanged(int)), this, SLOT(SetSettings(int))); // Dynamic Range if (comboDynamicRange->isEnabled()) connect(comboDynamicRange, SIGNAL(activated(int)), this, SLOT(SetDynamicRange(int))); // Threshold if (spinThreshold->isEnabled()) connect(spinThreshold, SIGNAL(valueChanged(int)), this, SLOT(SetEnergy())); } void qTabSettings::GetSettings() { FILE_LOG(logDEBUG) << "Getting settings"; disconnect(comboSettings, SIGNAL(currentIndexChanged(int)), this, SLOT(SetSettings(int))); try{ int sett = myDet->getSettings(-1); FILE_LOG(logDEBUG) << "Settings from Detector:" << sett; switch (sett) { case -1: qDefs::Message(qDefs::WARNING, "Different values for settings.", "qTabSettings::GetSettings"); comboSettings->setCurrentIndex(UNDEFINED); break; case slsDetectorDefs::UNDEFINED: comboSettings->setCurrentIndex(UNDEFINED); break; case slsDetectorDefs::UNINITIALIZED: comboSettings->setCurrentIndex(UNINITIALIZED); break; default: if (sett >= NUMSETTINGS) { qDefs::Message(qDefs::WARNING, "Unknown settings " + std::to_string(sett) + ".", "qTabSettings::GetSettings"); return; } comboSettings->setCurrentIndex(sett); break; } } catch (const sls::NonCriticalError &e) { qDefs::ExceptionMessage("Could not get settings.", e.what(), "qTabSettings::GetSettings"); } connect(comboSettings, SIGNAL(currentIndexChanged(int)), this, SLOT(SetSettings(int))); } void qTabSettings::GetDynamicRange() { FILE_LOG(logDEBUG) << "Getting dynamic range"; disconnect(comboDynamicRange, SIGNAL(activated(int)), this, SLOT(SetDynamicRange(int))); try { int ret = myDet->setDynamicRange(-1); // set the final value on gui switch (ret) { case -1: qDefs::Message(qDefs::WARNING, "Different values for dynamic range.", "qTabSettings::GetDynamicRange"); break; case 32: comboDynamicRange->setCurrentIndex(0); break; case 16: comboDynamicRange->setCurrentIndex(1); break; case 8: comboDynamicRange->setCurrentIndex(2); break; case 4: comboDynamicRange->setCurrentIndex(3); break; default: qDefs::Message(qDefs::WARNING, "Unknown Dynamic Range " + std::to_string(ret) + ".", "qTabSettings::GetDynamicRange"); break; } } catch (const sls::NonCriticalError &e) { qDefs::ExceptionMessage("Could not get dynamic range.", e.what(), "qTabSettings::GetDynamicRange"); } connect(comboDynamicRange, SIGNAL(activated(int)), this,SLOT(SetDynamicRange(int))); } void qTabSettings::GetThresholdEnergy() { FILE_LOG(logDEBUG) << "Getting theshold energy"; disconnect(spinThreshold, SIGNAL(valueChanged(int)), this, SLOT(SetEnergy())); qDefs::IgnoreNonCriticalExceptions( myDet, "Could not get threshold energy." "qTabSettings::GetThresholdEnergy", spinThreshold, &QSpinBox::setValue, &multiSlsDetector::getThresholdEnergy, -1); connect(spinThreshold, SIGNAL(valueChanged(int)), this, SLOT(SetEnergy())); } void qTabSettings::SetSettings(int index) { // settings try { myDet->setSettings((slsDetectorDefs::detectorSettings)index); FILE_LOG(logINFO) << "Settings set to " << myDet->slsDetectorDefs::getDetectorSettings(sett); } catch (const sls::NonCriticalError &e) { qDefs::ExceptionMessage("Could not set settings.", e.what(), "qTabSettings::SetSettings"); GetSettings(); } // threshold if (spinThreshold->isEnabled()) { SetEnergy(); } } void qTabSettings::SetDynamicRange(int index) { int dr = -1; switch (index) { case 0: dr = 32; break; case 1: dr = 16; break; case 2: dr = 8; break; case 3: dr = 4; break; default: qDefs::Message(qDefs::WARNING, "Unknown dynamic range " + std::to_string(index) + ".", "qTabSettings::SetDynamicRange"); return; } try { myDet->setDynamicRange(dr); FILE_LOG(logINFO) << "Setting dynamic range to " << dr; } catch (const sls::NonCriticalError &e) { qDefs::ExceptionMessage("Could not set dynamic range.", e.what(), "qTabSettings::SetDynamicRange"); GetDynamicRange(); } } void qTabSettings::SetEnergy() { try { // set int index = spinThreshold->value(); int ret = myDet->setThresholdEnergy(index); FILE_LOG(logINFO) << "Threshold energy set to " << index; // validate if ((ret - index) > THRESHOLD_TOLERANCE) { qDefs::Message(qDefs::WARNING, "Threshold energy could not be set (tolerance 200 eV).", "qTabSettings::SetEnergy"); } } catch (const sls::NonCriticalError &e) { qDefs::ExceptionMessage("Could not get threshold energy."), e.what(), "qTabSettings::SetEnergy"); } // set the right value anyway (exception or no) GetThresholdEnergy(); } void qTabSettings::Refresh() { FILE_LOG(logDEBUG) << "\n**Updating Settings Tab"; // settings if (comboSettings->isEnabled()) { GetSettings(); } // threshold if (spinThreshold->isEnabled()) { GetThresholdEnergy(); } // Dynamic Range if (comboDynamicRange->isEnabled()) { GetDynamicRange(); } FILE_LOG(logDEBUG) << "**Updated Settings Tab"; }