diff --git a/src/DialWindow.cpp b/src/DialWindow.cpp index 176f3223a..2828c22c5 100644 --- a/src/DialWindow.cpp +++ b/src/DialWindow.cpp @@ -20,7 +20,7 @@ #include "DialWindow.h" DialWindow::DialWindow(MainWindow *mainWindow) : - GcWindow(mainWindow), mainWindow(mainWindow) + GcWindow(mainWindow), mainWindow(mainWindow), average(1) { rolling.resize(150); // enough for 30 seconds at 5hz @@ -46,6 +46,28 @@ DialWindow::DialWindow(MainWindow *mainWindow) : } controlsLayout->addRow(seriesLabel, seriesSelector); + // average selection + averageLabel= new QLabel(tr("Average"), this); + averageLabel->hide(); + averageLabel->setAutoFillBackground(true); + + QHBoxLayout *averageLayout = new QHBoxLayout; + averageSlider = new QSlider(Qt::Horizontal); + averageSlider->hide(); + averageSlider->setTickPosition(QSlider::TicksBelow); + averageSlider->setTickInterval(5); + averageSlider->setMinimum(1); + averageSlider->setMaximum(30); + averageSlider->setValue(1); + averageLayout->addWidget(averageSlider); + averageEdit = new QLineEdit(); + averageEdit->hide(); + averageEdit->setFixedWidth(20); + averageEdit->setText(QString("%1").arg(1) ); + averageLayout->addWidget(averageEdit); + + controlsLayout->addRow(averageLabel, averageLayout); + // display label... QVBoxLayout *layout = new QVBoxLayout(this); layout->setSpacing(0); @@ -57,6 +79,9 @@ DialWindow::DialWindow(MainWindow *mainWindow) : // get updates.. connect(mainWindow, SIGNAL(telemetryUpdate(RealtimeData)), this, SLOT(telemetryUpdate(RealtimeData))); connect(seriesSelector, SIGNAL(currentIndexChanged(int)), this, SLOT(seriesChanged())); + connect(averageSlider, SIGNAL(valueChanged(int)),this, SLOT(setAverageFromSlider())); + connect(averageEdit, SIGNAL(textChanged(const QString)), this, SLOT(setAverageFromText(const QString))); + connect(mainWindow, SIGNAL(configChanged()), this, SLOT(seriesChanged())); connect(mainWindow, SIGNAL(stop()), this, SLOT(stop())); connect(mainWindow, SIGNAL(start()), this, SLOT(start())); @@ -104,6 +129,34 @@ DialWindow::telemetryUpdate(const RealtimeData &rtData) double value = rtData.value(series); + // Average value for display for HeartRate, Watts and Cadence + double displayValue = value; + + if (series == RealtimeData::HeartRate || + series == RealtimeData::Watts || + series == RealtimeData::Cadence) { + + sum += value; + int j = index-(count=0?j:150+j)]; + + //store value + rolling[index] = value; + + // move index on/round for next value + index = (index >= 149) ? 0 : index+1; + count++; + + if (average > 1) { + // rolling average + if (count < average*5) + displayValue = sum/(count); + else + displayValue = sum/(average*5); + } + + } + switch (series) { case RealtimeData::Time: @@ -118,12 +171,12 @@ DialWindow::telemetryUpdate(const RealtimeData &rtData) break; case RealtimeData::Speed: - if (!mainWindow->useMetricUnits) value *= MILES_PER_KM; + if (!mainWindow->useMetricUnits) displayValue *= MILES_PER_KM; valueLabel->setText(QString("%1").arg(value, 0, 'f', 1)); break; case RealtimeData::Distance: - if (!mainWindow->useMetricUnits) value *= MILES_PER_KM; + if (!mainWindow->useMetricUnits) displayValue *= MILES_PER_KM; valueLabel->setText(QString("%1").arg(value, 0, 'f', 3)); break; @@ -339,7 +392,7 @@ DialWindow::telemetryUpdate(const RealtimeData &rtData) break; default: - valueLabel->setText(QString("%1").arg(round(value))); + valueLabel->setText(QString("%1").arg(round(displayValue))); break; } @@ -364,6 +417,14 @@ void DialWindow::seriesChanged() RealtimeData::DataSeries series = static_cast (seriesSelector->itemData(seriesSelector->currentIndex()).toInt()); + if (series == RealtimeData::HeartRate || + series == RealtimeData::Watts || + series == RealtimeData::Cadence) { + averageLabel->show(); + averageEdit->show(); + averageSlider->show(); + } + // the series selector changed so update the colors switch(series) { @@ -417,3 +478,28 @@ void DialWindow::seriesChanged() .arg(foreground.name()); valueLabel->setStyleSheet(sh); } + +void +DialWindow::setAverageFromText(const QString text) { + int value = text.toDouble(); + averageEdit->setText(text); + if (average != value) { + average = value; + averageSlider->setValue(average); + + // correction of sum + sum = 0; + int j = index-(count=0?j:150+j)]; + j++; + } + } +} + +void +DialWindow::setAverageFromSlider() { + if (average != averageSlider->value()) { + setAverageFromText(QString("%1").arg(averageSlider->value())); + } +} diff --git a/src/DialWindow.h b/src/DialWindow.h index 130408a81..68636668e 100644 --- a/src/DialWindow.h +++ b/src/DialWindow.h @@ -103,6 +103,7 @@ class DialWindow : public GcWindow double lapNumber; // for calculating averages + int average; int count; double sum; @@ -112,6 +113,7 @@ class DialWindow : public GcWindow double rollingSum; int index; // index into rolling (circular buffer) + // VI/RI makes us track AP too int apcount; int apsum; @@ -130,12 +132,20 @@ class DialWindow : public GcWindow } // controls - QComboBox *seriesSelector; + QComboBox *seriesSelector; + + QLabel *averageLabel; + QSlider *averageSlider; + QLineEdit *averageEdit; // display QLabel *valueLabel; QColor foreground, background; + + private slots : + void setAverageFromSlider(); + void setAverageFromText(const QString text); }; #endif // _GC_DialWindow_h