Skip to content

Commit d3e2c9e

Browse files
committed
Enh: add control for window size to gui
1 parent de0f949 commit d3e2c9e

File tree

5 files changed

+134
-39
lines changed

5 files changed

+134
-39
lines changed

applications/mne_scan/plugins/hpi/hpi.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -322,15 +322,18 @@ void Hpi::initPluginControlWidgets()
322322
this, &Hpi::onAllowedMovementChanged);
323323
connect(pHpiSettingsView, &HpiSettingsView::allowedRotationChanged,
324324
this, &Hpi::onAllowedRotationChanged);
325-
connect(pHpiSettingsView, &HpiSettingsView::fittingRepetitionTimeChanged,
325+
connect(pHpiSettingsView, &HpiSettingsView::repetitionTimeChanged,
326+
this, &Hpi::setTimeBetweenFits);
327+
connect(pHpiSettingsView, &HpiSettingsView::fittingWindowTimeChanged,
326328
this, &Hpi::setFittingWindowSize);
327329
connect(this, &Hpi::errorsChanged,
328330
pHpiSettingsView, &HpiSettingsView::setErrorLabels, Qt::BlockingQueuedConnection);
329331
connect(this, &Hpi::movementResultsChanged,
330332
pHpiSettingsView, &HpiSettingsView::setMovementResults, Qt::BlockingQueuedConnection);
331333
connect(this, &Hpi::newDigitizerList,
332334
pHpiSettingsView, &HpiSettingsView::newDigitizerList);
333-
335+
connect(this, &Hpi::minimumWindowSizeChanged,
336+
pHpiSettingsView, &HpiSettingsView::setMinimumWindowSize);
334337

335338
onSspStatusChanged(pHpiSettingsView->getSspStatusChanged());
336339
onCompStatusChanged(pHpiSettingsView->getCompStatusChanged());
@@ -521,14 +524,22 @@ void Hpi::onContHpiStatusChanged(bool bChecked)
521524

522525
//=============================================================================================================
523526

524-
void Hpi::setFittingWindowSize(double dRepetitionTime)
527+
void Hpi::setTimeBetweenFits(double dRepetitionTime)
525528
{
526529
QMutexLocker locker(&m_mutex);
527530
m_iRepetitionTimeInSamples = dRepetitionTime * m_pFiffInfo->sfreq;
528531
}
529532

530533
//=============================================================================================================
531534

535+
void Hpi::setFittingWindowSize(double dFittingWindowSizeInMillisecons)
536+
{
537+
QMutexLocker locker(&m_mutex);
538+
m_iFittingWindowSize = dFittingWindowSizeInMillisecons / 1000.0 * m_pFiffInfo->sfreq;
539+
}
540+
541+
//=============================================================================================================
542+
532543
void Hpi::onDevHeadTransAvailable(const FIFFLIB::FiffCoordTrans& devHeadTrans)
533544
{
534545
m_pFiffInfo->dev_head_t = devHeadTrans;
@@ -567,7 +578,10 @@ int Hpi::computeMinimalWindowsize()
567578
}
568579

569580
// compute buffersize needed to provide this resolution in frequency space N = FS/df
570-
return ceil(dSFreq/iMinDeltaF);
581+
int iWindowSize = ceil(dSFreq/iMinDeltaF);
582+
minimumWindowSizeChanged(iWindowSize/dSFreq);
583+
584+
return iWindowSize;
571585
}
572586

573587
//=============================================================================================================

applications/mne_scan/plugins/hpi/hpi.h

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,13 +239,22 @@ class HPISHARED_EXPORT Hpi : public SCSHAREDLIB::AbstractAlgorithm
239239
*/
240240
void onDevHeadTransAvailable(const FIFFLIB::FiffCoordTrans& devHeadTrans);
241241

242+
242243
//=========================================================================================================
243244
/**
244-
* Set fitting window size when doing continuous hpi using the repetition time as measure.
245+
* Set repetition time between hpi fits.
245246
*
246247
* @param[in] dRepetitionTime Repetition time in seconds
247248
*/
248-
void setFittingWindowSize(double dRepetitionTime);
249+
void setTimeBetweenFits(double dRepetitionTimeInSeconds);
250+
251+
//=========================================================================================================
252+
/**
253+
* Set hpi fitting window size.
254+
*
255+
* @param[in] dFittingWindowSizeInSeconds Fitting window size in seconds
256+
*/
257+
void setFittingWindowSize(double dFittingWindowSizeInSeconds);
249258

250259
//=========================================================================================================
251260
/**
@@ -334,6 +343,8 @@ class HPISHARED_EXPORT Hpi : public SCSHAREDLIB::AbstractAlgorithm
334343
SCSHAREDLIB::PluginOutputData<SCMEASLIB::RealTimeHpiResult>::SPtr m_pHpiOutput; /**< The RealTimeHpiResult of the Hpi output.*/
335344

336345
signals:
346+
void minimumWindowSizeChanged(const double dWindowSizeInSeconds);
347+
337348
void errorsChanged(const QVector<double>& vErrors,
338349
double dMeanErrorDist);
339350
void movementResultsChanged(double dMovement,

libraries/disp/viewers/formfiles/hpisettingsview.ui

Lines changed: 62 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<item>
1818
<widget class="QTabWidget" name="tabWidget">
1919
<property name="currentIndex">
20-
<number>1</number>
20+
<number>0</number>
2121
</property>
2222
<widget class="QWidget" name="tab_loadDigitizers">
2323
<attribute name="title">
@@ -319,7 +319,7 @@
319319
<item>
320320
<widget class="QCheckBox" name="m_checkBox_continousHPI">
321321
<property name="text">
322-
<string>Do continous HPI fitting at</string>
322+
<string>Do continous HPI fitting </string>
323323
</property>
324324
</widget>
325325
</item>
@@ -328,6 +328,12 @@
328328
</item>
329329
<item>
330330
<widget class="QFrame" name="frame_samplesToFit">
331+
<property name="sizePolicy">
332+
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
333+
<horstretch>0</horstretch>
334+
<verstretch>0</verstretch>
335+
</sizepolicy>
336+
</property>
331337
<property name="minimumSize">
332338
<size>
333339
<width>61</width>
@@ -340,36 +346,77 @@
340346
<property name="frameShadow">
341347
<enum>QFrame::Raised</enum>
342348
</property>
343-
<layout class="QHBoxLayout" name="horizontalLayout_2">
344-
<property name="topMargin">
345-
<number>4</number>
346-
</property>
347-
<property name="bottomMargin">
348-
<number>4</number>
349-
</property>
350-
<item>
351-
<widget class="QSpinBox" name="m_spinBox_samplesToFit">
349+
<layout class="QFormLayout" name="formLayout_5">
350+
<item row="0" column="0">
351+
<widget class="QDoubleSpinBox" name="m_doubleSpinBox_fittingRepetitionTime">
352+
<property name="sizePolicy">
353+
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
354+
<horstretch>0</horstretch>
355+
<verstretch>0</verstretch>
356+
</sizepolicy>
357+
</property>
352358
<property name="maximumSize">
353359
<size>
354360
<width>70</width>
355361
<height>16777215</height>
356362
</size>
357363
</property>
364+
<property name="decimals">
365+
<number>2</number>
366+
</property>
358367
<property name="minimum">
359-
<number>10</number>
368+
<double>0.200000000000000</double>
360369
</property>
361370
<property name="maximum">
362-
<number>1000000</number>
371+
<double>30.000000000000000</double>
372+
</property>
373+
<property name="singleStep">
374+
<double>0.500000000000000</double>
363375
</property>
364376
<property name="value">
377+
<double>1.000000000000000</double>
378+
</property>
379+
</widget>
380+
</item>
381+
<item row="1" column="0">
382+
<widget class="QSpinBox" name="m_spinBox_windowSize">
383+
<property name="sizePolicy">
384+
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
385+
<horstretch>0</horstretch>
386+
<verstretch>0</verstretch>
387+
</sizepolicy>
388+
</property>
389+
<property name="maximumSize">
390+
<size>
391+
<width>70</width>
392+
<height>16777215</height>
393+
</size>
394+
</property>
395+
<property name="minimum">
396+
<number>50</number>
397+
</property>
398+
<property name="maximum">
399+
<number>1000</number>
400+
</property>
401+
<property name="singleStep">
365402
<number>10</number>
366403
</property>
404+
<property name="value">
405+
<number>200</number>
406+
</property>
367407
</widget>
368408
</item>
369-
<item>
409+
<item row="0" column="1">
370410
<widget class="QLabel" name="label_3">
371411
<property name="text">
372-
<string>Win Size [Samples]</string>
412+
<string>Time between fits [Seconds]</string>
413+
</property>
414+
</widget>
415+
</item>
416+
<item row="1" column="1">
417+
<widget class="QLabel" name="label_4">
418+
<property name="text">
419+
<string>Window Size [Milliseconds]</string>
373420
</property>
374421
</widget>
375422
</item>

libraries/disp/viewers/hpisettingsview.cpp

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,6 @@ HpiSettingsView::HpiSettingsView(const QString& sSettingsPath,
8080
m_sSettingsPath = sSettingsPath;
8181
m_pUi->setupUi(this);
8282

83-
// Disable change of window size for now
84-
bool bWindowsize = false;
85-
m_pUi->frame_samplesToFit->setVisible(bWindowsize);
86-
m_pUi->label_3->setVisible(bWindowsize);
87-
m_pUi->m_spinBox_samplesToFit->setVisible(bWindowsize);
88-
8983
connect(m_pUi->m_pushButton_loadDigitizers, &QPushButton::released,
9084
this, &HpiSettingsView::onLoadDigitizers);
9185
connect(m_pUi->m_pushButton_doFreqOrder, &QPushButton::clicked,
@@ -104,8 +98,10 @@ HpiSettingsView::HpiSettingsView(const QString& sSettingsPath,
10498
this, &HpiSettingsView::compStatusChanged);
10599
connect(m_pUi->m_checkBox_continousHPI, &QCheckBox::clicked,
106100
this, &HpiSettingsView::contHpiStatusChanged);
107-
connect(m_pUi->m_spinBox_samplesToFit, QOverload<int>::of(&QSpinBox::valueChanged),
108-
this, &HpiSettingsView::fittingWindowSizeChanged);
101+
connect(m_pUi->m_doubleSpinBox_fittingRepetitionTime, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
102+
this, &HpiSettingsView::repetitionTimeChanged);
103+
connect(m_pUi->m_spinBox_windowSize, QOverload<int>::of(&QSpinBox::valueChanged),
104+
this, &HpiSettingsView::fittingWindowTimeChanged);
109105
connect(m_pUi->m_doubleSpinBox_maxHPIContinousDist, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
110106
this, &HpiSettingsView::allowedMeanErrorDistChanged);
111107
connect(m_pUi->m_doubleSpinBox_moveThreshold, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
@@ -177,6 +173,17 @@ void HpiSettingsView::setMovementResults(double dMovement,
177173

178174
//=============================================================================================================
179175

176+
void HpiSettingsView::setMinimumWindowSize(double dWindowSize)
177+
{
178+
int iMinimumInMs = ceil(dWindowSize*1000);
179+
m_pUi->m_spinBox_windowSize->setMinimum(iMinimumInMs);
180+
if(m_pUi->m_spinBox_windowSize->value() < iMinimumInMs) {
181+
m_pUi->m_spinBox_windowSize->setValue(iMinimumInMs);
182+
}
183+
}
184+
185+
//=============================================================================================================
186+
180187
bool HpiSettingsView::getSspStatusChanged()
181188
{
182189
return m_pUi->m_checkBox_useSSP->isChecked();
@@ -220,9 +227,9 @@ bool HpiSettingsView::continuousHPIChecked()
220227

221228
//=============================================================================================================
222229

223-
int HpiSettingsView::getFittingWindowSize()
230+
double HpiSettingsView::getFittingRepetitionTime()
224231
{
225-
return m_pUi->m_spinBox_samplesToFit->value();
232+
return m_pUi->m_doubleSpinBox_fittingRepetitionTime->value();
226233
}
227234

228235
//=============================================================================================================
@@ -251,7 +258,7 @@ void HpiSettingsView::saveSettings()
251258
QVariant::fromValue(m_pUi->m_doubleSpinBox_maxHPIContinousDist->value()));
252259

253260
settings.setValue(m_sSettingsPath + QString("/HpiSettingsView/fittingWindowSize"),
254-
QVariant::fromValue(m_pUi->m_spinBox_samplesToFit->value()));
261+
QVariant::fromValue(m_pUi->m_doubleSpinBox_fittingRepetitionTime->value()));
255262
}
256263

257264
//=============================================================================================================
@@ -273,7 +280,7 @@ void HpiSettingsView::loadSettings()
273280
m_pUi->m_checkBox_useComp->setChecked(settings.value(m_sSettingsPath + QString("/HpiSettingsView/useCOMP"), false).toBool());
274281
m_pUi->m_checkBox_continousHPI->setChecked(settings.value(m_sSettingsPath + QString("/HpiSettingsView/continousHPI"), false).toBool());
275282
m_pUi->m_doubleSpinBox_maxHPIContinousDist->setValue(settings.value(m_sSettingsPath + QString("/HpiSettingsView/maxError"), 10.0).toDouble());
276-
m_pUi->m_spinBox_samplesToFit->setValue(settings.value(m_sSettingsPath + QString("/HpiSettingsView/fittingWindowSize"), 300).toInt());
283+
m_pUi->m_doubleSpinBox_fittingRepetitionTime->setValue(settings.value(m_sSettingsPath + QString("/HpiSettingsView/fittingWindowSize"), 300).toInt());
277284
}
278285

279286
//=============================================================================================================

libraries/disp/viewers/hpisettingsview.h

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,14 @@ class DISPSHARED_EXPORT HpiSettingsView : public AbstractView
117117
void setMovementResults(double dMovement,
118118
double dRotation);
119119

120+
//=========================================================================================================
121+
/**
122+
* Updates the minimal window time for hpi fits.
123+
*
124+
* @param[in] dMinimumWindowTime in seconds.
125+
*/
126+
void setMinimumWindowSize(double dMinimumWindowTime);
127+
120128
//=========================================================================================================
121129
/**
122130
* Get the SSP checked status.
@@ -167,11 +175,11 @@ class DISPSHARED_EXPORT HpiSettingsView : public AbstractView
167175

168176
//=========================================================================================================
169177
/**
170-
* Get number of fits per second to do when performing continuous hpi
178+
* Get the time between hpi fits in seconds.
171179
*
172-
* @return Number of fits per second
180+
* @return Repetition time between fits in seconds.
173181
*/
174-
int getFittingWindowSize();
182+
double getFittingRepetitionTime();
175183

176184
//=========================================================================================================
177185
/**
@@ -382,11 +390,19 @@ class DISPSHARED_EXPORT HpiSettingsView : public AbstractView
382390

383391
//=========================================================================================================
384392
/**
385-
* Emit this signal when 'fits per second' control gets updated.
393+
* Emit this signal when 'Time between fits' control gets updated.
394+
*
395+
* @param[in] dTimeBetweenFitsInSecs The time between fits in seconds.
396+
*/
397+
void repetitionTimeChanged(double dTimeBetweenFitsInSecs);
398+
399+
//=========================================================================================================
400+
/**
401+
* Emit this signal when 'Time between fits' control gets updated.
386402
*
387-
* @param[in] iFitsPerSecond How many fits per second we should do.
403+
* @param[in] dWindowSizeInSeconds The window size to use for hpi fits in seconds.
388404
*/
389-
void fittingWindowSizeChanged(int iFitsPerSecond);
405+
void fittingWindowTimeChanged(double dWindowSizeInSeconds);
390406

391407
//=========================================================================================================
392408
/**

0 commit comments

Comments
 (0)