diff --git a/applications/mne_scan/plugins/hpi/hpi.cpp b/applications/mne_scan/plugins/hpi/hpi.cpp index 41fbafd5664..7cd11f9a430 100644 --- a/applications/mne_scan/plugins/hpi/hpi.cpp +++ b/applications/mne_scan/plugins/hpi/hpi.cpp @@ -322,7 +322,9 @@ void Hpi::initPluginControlWidgets() this, &Hpi::onAllowedMovementChanged); connect(pHpiSettingsView, &HpiSettingsView::allowedRotationChanged, this, &Hpi::onAllowedRotationChanged); - connect(pHpiSettingsView, &HpiSettingsView::fittingRepetitionTimeChanged, + connect(pHpiSettingsView, &HpiSettingsView::repetitionTimeChanged, + this, &Hpi::setTimeBetweenFits); + connect(pHpiSettingsView, &HpiSettingsView::fittingWindowTimeChanged, this, &Hpi::setFittingWindowSize); connect(this, &Hpi::errorsChanged, pHpiSettingsView, &HpiSettingsView::setErrorLabels, Qt::BlockingQueuedConnection); @@ -330,7 +332,8 @@ void Hpi::initPluginControlWidgets() pHpiSettingsView, &HpiSettingsView::setMovementResults, Qt::BlockingQueuedConnection); connect(this, &Hpi::newDigitizerList, pHpiSettingsView, &HpiSettingsView::newDigitizerList); - + connect(this, &Hpi::minimumWindowSizeChanged, + pHpiSettingsView, &HpiSettingsView::setMinimumWindowSize); onSspStatusChanged(pHpiSettingsView->getSspStatusChanged()); onCompStatusChanged(pHpiSettingsView->getCompStatusChanged()); @@ -521,7 +524,7 @@ void Hpi::onContHpiStatusChanged(bool bChecked) //============================================================================================================= -void Hpi::setFittingWindowSize(double dRepetitionTime) +void Hpi::setTimeBetweenFits(double dRepetitionTime) { QMutexLocker locker(&m_mutex); m_iRepetitionTimeInSamples = dRepetitionTime * m_pFiffInfo->sfreq; @@ -529,6 +532,14 @@ void Hpi::setFittingWindowSize(double dRepetitionTime) //============================================================================================================= +void Hpi::setFittingWindowSize(double dFittingWindowSizeInMillisecons) +{ + QMutexLocker locker(&m_mutex); + m_iFittingWindowSize = dFittingWindowSizeInMillisecons / 1000.0 * m_pFiffInfo->sfreq; +} + +//============================================================================================================= + void Hpi::onDevHeadTransAvailable(const FIFFLIB::FiffCoordTrans& devHeadTrans) { m_pFiffInfo->dev_head_t = devHeadTrans; @@ -567,7 +578,10 @@ int Hpi::computeMinimalWindowsize() } // compute buffersize needed to provide this resolution in frequency space N = FS/df - return ceil(dSFreq/iMinDeltaF); + int iWindowSize = ceil(dSFreq/iMinDeltaF); + minimumWindowSizeChanged(iWindowSize/dSFreq); + + return iWindowSize; } //============================================================================================================= diff --git a/applications/mne_scan/plugins/hpi/hpi.h b/applications/mne_scan/plugins/hpi/hpi.h index 864f76d76cc..089a4f6a60b 100644 --- a/applications/mne_scan/plugins/hpi/hpi.h +++ b/applications/mne_scan/plugins/hpi/hpi.h @@ -239,13 +239,22 @@ class HPISHARED_EXPORT Hpi : public SCSHAREDLIB::AbstractAlgorithm */ void onDevHeadTransAvailable(const FIFFLIB::FiffCoordTrans& devHeadTrans); + //========================================================================================================= /** - * Set fitting window size when doing continuous hpi using the repetition time as measure. + * Set repetition time between hpi fits. * * @param[in] dRepetitionTime Repetition time in seconds */ - void setFittingWindowSize(double dRepetitionTime); + void setTimeBetweenFits(double dRepetitionTimeInSeconds); + + //========================================================================================================= + /** + * Set hpi fitting window size. + * + * @param[in] dFittingWindowSizeInSeconds Fitting window size in seconds + */ + void setFittingWindowSize(double dFittingWindowSizeInSeconds); //========================================================================================================= /** @@ -334,6 +343,8 @@ class HPISHARED_EXPORT Hpi : public SCSHAREDLIB::AbstractAlgorithm SCSHAREDLIB::PluginOutputData::SPtr m_pHpiOutput; /**< The RealTimeHpiResult of the Hpi output.*/ signals: + void minimumWindowSizeChanged(const double dWindowSizeInSeconds); + void errorsChanged(const QVector& vErrors, double dMeanErrorDist); void movementResultsChanged(double dMovement, diff --git a/libraries/disp/viewers/formfiles/hpisettingsview.ui b/libraries/disp/viewers/formfiles/hpisettingsview.ui index 1375a428883..fdb3795467c 100644 --- a/libraries/disp/viewers/formfiles/hpisettingsview.ui +++ b/libraries/disp/viewers/formfiles/hpisettingsview.ui @@ -17,7 +17,7 @@ - 1 + 0 @@ -319,7 +319,7 @@ - Do continous HPI fitting at + Do continous HPI fitting @@ -328,6 +328,12 @@ + + + 0 + 0 + + 61 @@ -340,36 +346,77 @@ QFrame::Raised - - - 4 - - - 4 - - - + + + + + + 0 + 0 + + 70 16777215 + + 2 + - 10 + 0.200000000000000 - 1000000 + 30.000000000000000 + + + 0.500000000000000 + 1.000000000000000 + + + + + + + + 0 + 0 + + + + + 70 + 16777215 + + + + 50 + + + 1000 + + 10 + + 200 + - + - Win Size [Samples] + Time between fits [Seconds] + + + + + + + Window Size [Milliseconds] diff --git a/libraries/disp/viewers/hpisettingsview.cpp b/libraries/disp/viewers/hpisettingsview.cpp index 9d8bdb3a78d..615353dad88 100644 --- a/libraries/disp/viewers/hpisettingsview.cpp +++ b/libraries/disp/viewers/hpisettingsview.cpp @@ -80,12 +80,6 @@ HpiSettingsView::HpiSettingsView(const QString& sSettingsPath, m_sSettingsPath = sSettingsPath; m_pUi->setupUi(this); - // Disable change of window size for now - bool bWindowsize = false; - m_pUi->frame_samplesToFit->setVisible(bWindowsize); - m_pUi->label_3->setVisible(bWindowsize); - m_pUi->m_spinBox_samplesToFit->setVisible(bWindowsize); - connect(m_pUi->m_pushButton_loadDigitizers, &QPushButton::released, this, &HpiSettingsView::onLoadDigitizers); connect(m_pUi->m_pushButton_doFreqOrder, &QPushButton::clicked, @@ -104,8 +98,10 @@ HpiSettingsView::HpiSettingsView(const QString& sSettingsPath, this, &HpiSettingsView::compStatusChanged); connect(m_pUi->m_checkBox_continousHPI, &QCheckBox::clicked, this, &HpiSettingsView::contHpiStatusChanged); - connect(m_pUi->m_spinBox_samplesToFit, QOverload::of(&QSpinBox::valueChanged), - this, &HpiSettingsView::fittingWindowSizeChanged); + connect(m_pUi->m_doubleSpinBox_fittingRepetitionTime, static_cast(&QDoubleSpinBox::valueChanged), + this, &HpiSettingsView::repetitionTimeChanged); + connect(m_pUi->m_spinBox_windowSize, QOverload::of(&QSpinBox::valueChanged), + this, &HpiSettingsView::fittingWindowTimeChanged); connect(m_pUi->m_doubleSpinBox_maxHPIContinousDist, static_cast(&QDoubleSpinBox::valueChanged), this, &HpiSettingsView::allowedMeanErrorDistChanged); connect(m_pUi->m_doubleSpinBox_moveThreshold, static_cast(&QDoubleSpinBox::valueChanged), @@ -177,6 +173,17 @@ void HpiSettingsView::setMovementResults(double dMovement, //============================================================================================================= +void HpiSettingsView::setMinimumWindowSize(double dWindowSize) +{ + int iMinimumInMs = ceil(dWindowSize*1000); + m_pUi->m_spinBox_windowSize->setMinimum(iMinimumInMs); + if(m_pUi->m_spinBox_windowSize->value() < iMinimumInMs) { + m_pUi->m_spinBox_windowSize->setValue(iMinimumInMs); + } +} + +//============================================================================================================= + bool HpiSettingsView::getSspStatusChanged() { return m_pUi->m_checkBox_useSSP->isChecked(); @@ -220,9 +227,9 @@ bool HpiSettingsView::continuousHPIChecked() //============================================================================================================= -int HpiSettingsView::getFittingWindowSize() +double HpiSettingsView::getFittingRepetitionTime() { - return m_pUi->m_spinBox_samplesToFit->value(); + return m_pUi->m_doubleSpinBox_fittingRepetitionTime->value(); } //============================================================================================================= @@ -251,7 +258,7 @@ void HpiSettingsView::saveSettings() QVariant::fromValue(m_pUi->m_doubleSpinBox_maxHPIContinousDist->value())); settings.setValue(m_sSettingsPath + QString("/HpiSettingsView/fittingWindowSize"), - QVariant::fromValue(m_pUi->m_spinBox_samplesToFit->value())); + QVariant::fromValue(m_pUi->m_doubleSpinBox_fittingRepetitionTime->value())); } //============================================================================================================= @@ -273,7 +280,7 @@ void HpiSettingsView::loadSettings() m_pUi->m_checkBox_useComp->setChecked(settings.value(m_sSettingsPath + QString("/HpiSettingsView/useCOMP"), false).toBool()); m_pUi->m_checkBox_continousHPI->setChecked(settings.value(m_sSettingsPath + QString("/HpiSettingsView/continousHPI"), false).toBool()); m_pUi->m_doubleSpinBox_maxHPIContinousDist->setValue(settings.value(m_sSettingsPath + QString("/HpiSettingsView/maxError"), 10.0).toDouble()); - m_pUi->m_spinBox_samplesToFit->setValue(settings.value(m_sSettingsPath + QString("/HpiSettingsView/fittingWindowSize"), 300).toInt()); + m_pUi->m_doubleSpinBox_fittingRepetitionTime->setValue(settings.value(m_sSettingsPath + QString("/HpiSettingsView/fittingWindowSize"), 300).toInt()); } //============================================================================================================= diff --git a/libraries/disp/viewers/hpisettingsview.h b/libraries/disp/viewers/hpisettingsview.h index ffaafb58ac9..4f7eaecdc49 100644 --- a/libraries/disp/viewers/hpisettingsview.h +++ b/libraries/disp/viewers/hpisettingsview.h @@ -117,6 +117,14 @@ class DISPSHARED_EXPORT HpiSettingsView : public AbstractView void setMovementResults(double dMovement, double dRotation); + //========================================================================================================= + /** + * Updates the minimal window time for hpi fits. + * + * @param[in] dMinimumWindowTime in seconds. + */ + void setMinimumWindowSize(double dMinimumWindowTime); + //========================================================================================================= /** * Get the SSP checked status. @@ -167,11 +175,11 @@ class DISPSHARED_EXPORT HpiSettingsView : public AbstractView //========================================================================================================= /** - * Get number of fits per second to do when performing continuous hpi + * Get the time between hpi fits in seconds. * - * @return Number of fits per second + * @return Repetition time between fits in seconds. */ - int getFittingWindowSize(); + double getFittingRepetitionTime(); //========================================================================================================= /** @@ -382,11 +390,19 @@ class DISPSHARED_EXPORT HpiSettingsView : public AbstractView //========================================================================================================= /** - * Emit this signal when 'fits per second' control gets updated. + * Emit this signal when 'Time between fits' control gets updated. + * + * @param[in] dTimeBetweenFitsInSecs The time between fits in seconds. + */ + void repetitionTimeChanged(double dTimeBetweenFitsInSecs); + + //========================================================================================================= + /** + * Emit this signal when 'Time between fits' control gets updated. * - * @param[in] iFitsPerSecond How many fits per second we should do. + * @param[in] dWindowSizeInSeconds The window size to use for hpi fits in seconds. */ - void fittingWindowSizeChanged(int iFitsPerSecond); + void fittingWindowTimeChanged(double dWindowSizeInSeconds); //========================================================================================================= /**