diff --git a/gpxsee.qrc b/gpxsee.qrc index 48fe6d9e..8e076074 100644 --- a/gpxsee.qrc +++ b/gpxsee.qrc @@ -14,11 +14,12 @@ icons/arrow-left-double.png icons/arrow-right-double.png icons/view-fullscreen.png - icons/office-chart-line-stacked.png + icons/office-chart-line.png icons/preferences-desktop-display.png icons/flag_48.png icons/system-run.png icons/document-print-preview.png + icons/view-filter.png lang/gpxsee_cs.qm lang/gpxsee_sv.qm lang/gpxsee_de.qm diff --git a/icons/office-chart-line-stacked.png b/icons/office-chart-line-stacked.png deleted file mode 100644 index 82b086bf..00000000 Binary files a/icons/office-chart-line-stacked.png and /dev/null differ diff --git a/icons/office-chart-line.png b/icons/office-chart-line.png new file mode 100644 index 00000000..70404aae Binary files /dev/null and b/icons/office-chart-line.png differ diff --git a/lang/gpxsee_cs.ts b/lang/gpxsee_cs.ts index 84b176c0..8e0bb69f 100644 --- a/lang/gpxsee_cs.ts +++ b/lang/gpxsee_cs.ts @@ -353,7 +353,7 @@ - + Moving time Čistý čas @@ -493,12 +493,12 @@ Offline mapy jsou načítány při startu aplikace z následujícího adresáře: - + Open map file Otevřít mapový soubor - + No files loaded Nejsou načteny žádné soubory @@ -528,28 +528,28 @@ Všechny soubory (*) - - + + Date Datum - + Routes Trasy - + Map files (*.map *.tba *.tar) Mapové soubory (*.map *.tba *.tar) - + Error loading map: Mapu nelze načíst: - + %n files %n soubor @@ -578,7 +578,7 @@ Exportovat do PDF... - + Waypoints Navigační body @@ -644,12 +644,12 @@ Soubor POI nelze načíst: - + Name Název - + Tracks Cesty @@ -671,14 +671,14 @@ - + Distance Vzdálenost - + Time Čas @@ -821,104 +821,179 @@ - + Graphs Grafy - + + Moving average window size + Velikost okna klouzavého průměru + + + + Elevation: + Výška: + + + + Speed: + Rychlost: + + + + Heart rate: + Tep: + + + + Cadence: + Kadence: + + + + Power: + Výkon: + + + + Outlier elimination + Eliminovat chybné hodnoty GPS signálu + + + + mi/h + mi/h + + + + km/h + km/h + + + + s + s + + + + Minimal speed: + Minimální rychlost: + + + + Minimal duration: + Minimální doba trvání: + + + + Filtering + Filtrování + + + + Pause detection + Detekce přestávek + + + mi mi - + km km - + POI radius: POI radius: - - + + POI POI - + Name Název - + Date Datum - + Distance Vzdálenost - + Time Čas - + Moving time Čistý čas - + Item count (>1) Počet objektů (>1) - + Separate graph page Samostatná stránka s grafy - + Header Záhlaví - + Use OpenGL Používat OpenGL - + MB MB - + Image cache size: Mezipaměť obrázků: - - + + System Systém - + Appearance Vzhled - + + Data + Data + + + Print & Export Tisk a export - + Options Nastavení diff --git a/lang/gpxsee_de.ts b/lang/gpxsee_de.ts index 473dc108..fc081e5b 100644 --- a/lang/gpxsee_de.ts +++ b/lang/gpxsee_de.ts @@ -353,7 +353,7 @@ - + Moving time Bewegungszeit @@ -498,27 +498,27 @@ Offlinekarten werden zu Programmstart aus dem folgenden Verzeichnis geladen: - + Open map file Karte Datei öffnen - + Map files (*.map *.tba *.tar) Karten-Dateien (*.map *.tba *.tar) - + Error loading map: Fehler beim Laden der Karte-Datei: - + No files loaded Keine Dateien geladen - + %n files %n Datei @@ -551,13 +551,13 @@ Alle Dateien (*) - - + + Date Datum - + Routes Routen @@ -582,7 +582,7 @@ Als PDF exportieren... - + Waypoints Wegpunkte @@ -643,12 +643,12 @@ Fehler beim Laden der POI-Datei: - + Name Name - + Tracks Strecken @@ -670,14 +670,14 @@ - + Distance Distanz - + Time Zeit @@ -820,104 +820,179 @@ - + Graphs Graphen - + + Moving average window size + Fensterbreite des gleitenden Mittelwerts + + + + Elevation: + Höhe: + + + + Speed: + Geschwindigkeit: + + + + Heart rate: + Herzfrequenz: + + + + Cadence: + Frequenz: + + + + Power: + Leistung: + + + + Outlier elimination + Ausreißer entfernen + + + + mi/h + mi/h + + + + km/h + km/h + + + + s + sek + + + + Minimal speed: + Minimale Geschwindigkeit: + + + + Minimal duration: + Minimale Dauer: + + + + Filtering + Datenfilterung + + + + Pause detection + Pausenerkennung + + + mi mi - + km km - + POI radius: POI-Radius: - - + + POI POI - + Name Name - + Date Datum - + Distance Distanz - + Time Zeit - + Moving time Bewegungszeit - + Item count (>1) Elementanzahl (>1) - + Separate graph page Separate Seite für Graphen - + Header Kopfzeile - + Use OpenGL OpenGL verwenden - + MB MB - + Image cache size: Bild-Cache größe: - - + + System System - + Appearance Erscheinungsbild - + + Data + Daten + + + Print & Export Druck & Export - + Options Einstellungen diff --git a/lang/gpxsee_sv.ts b/lang/gpxsee_sv.ts index a17a25c8..041e64fc 100644 --- a/lang/gpxsee_sv.ts +++ b/lang/gpxsee_sv.ts @@ -353,7 +353,7 @@ - + Moving time Förflyttningstid @@ -498,27 +498,27 @@ Offline-kartor läses in från följande mapp vid programstart: - + Open map file - + Map files (*.map *.tba *.tar) - + Error loading map: - + No files loaded Inga filer inlästa - + %n files %n filer @@ -551,13 +551,13 @@ Alla filer (*) - - + + Date Datum - + Routes Rutter @@ -582,7 +582,7 @@ Exportera till PDF... - + Waypoints Vägpunkter @@ -643,12 +643,12 @@ Fel vid inläsning av POI-fil: - + Name Namn - + Tracks Spår @@ -670,14 +670,14 @@ - + Distance Avstånd - + Time Tid @@ -820,104 +820,179 @@ - + Graphs Diagram - + + Moving average window size + + + + + Elevation: + Höjd: + + + + Speed: + Hastighet: + + + + Heart rate: + Hjärtfrekvens: + + + + Cadence: + Stegfrekvens: + + + + Power: + Kraft: + + + + Outlier elimination + + + + + mi/h + mi/h + + + + km/h + km/h + + + + s + sek + + + + Minimal speed: + + + + + Minimal duration: + + + + + Filtering + + + + + Pause detection + + + + mi mi - + km km - + POI radius: POI-radie: - - + + POI POI - + Name Namn - + Date Datum - + Distance Avstånd - + Time Tid - + Moving time Förflyttningstid - + Item count (>1) Objektantal (>1) - + Separate graph page Separat diagramsida - + Header - + Use OpenGL Använd OpenGL - + MB - + Image cache size: - - + + System System - + Appearance Utseende - + + Data + Data + + + Print & Export Utskrift & Export - + Options Alternativ diff --git a/src/gui.cpp b/src/gui.cpp index 776eb926..e9886c94 100644 --- a/src/gui.cpp +++ b/src/gui.cpp @@ -874,6 +874,7 @@ void GUI::printFile() void GUI::openOptions() { Options options(_options); + bool reload = false; OptionsDialog dialog(&options, this); if (dialog.exec() != QDialog::Accepted) @@ -903,6 +904,39 @@ void GUI::openOptions() _tabs.at(i)->setRenderHint(QPainter::Antialiasing, options.graphAntiAliasing); + if (options.elevationFilter != _options.elevationFilter) { + Track::setElevationFilter(options.elevationFilter); + reload = true; + } + if (options.speedFilter != _options.speedFilter) { + Track::setSpeedFilter(options.speedFilter); + reload = true; + } + if (options.heartRateFilter != _options.heartRateFilter) { + Track::setHeartRateFilter(options.heartRateFilter); + reload = true; + } + if (options.cadenceFilter != _options.cadenceFilter) { + Track::setCadenceFilter(options.cadenceFilter); + reload = true; + } + if (options.powerFilter != _options.powerFilter) { + Track::setPowerFilter(options.powerFilter); + reload = true; + } + if (options.outlierEliminate != _options.outlierEliminate) { + Track::setOutlierElimination(options.outlierEliminate); + reload = true; + } + if (options.pauseSpeed != _options.pauseSpeed) { + Track::setPauseSpeed(options.pauseSpeed); + reload = true; + } + if (options.pauseInterval != _options.pauseInterval) { + Track::setPauseInterval(options.pauseInterval); + reload = true; + } + if (options.poiRadius != _options.poiRadius) _poi->setRadius(options.poiRadius); @@ -914,6 +948,9 @@ void GUI::openOptions() if (options.pixmapCache != _options.pixmapCache) QPixmapCache::setCacheLimit(options.pixmapCache * 1024); + if (reload) + reloadFile(); + _options = options; } @@ -1580,6 +1617,22 @@ void GUI::writeSettings() settings.setValue(PATH_AA_SETTING, _options.pathAntiAliasing); if (_options.graphAntiAliasing != GRAPH_AA_DEFAULT) settings.setValue(GRAPH_AA_SETTING, _options.graphAntiAliasing); + if (_options.elevationFilter != ELEVATION_FILTER_DEFAULT) + settings.setValue(ELEVATION_FILTER_SETTING, _options.elevationFilter); + if (_options.speedFilter != SPEED_FILTER_DEFAULT) + settings.setValue(SPEED_FILTER_SETTING, _options.speedFilter); + if (_options.heartRateFilter != HEARTRATE_FILTER_DEFAULT) + settings.setValue(HEARTRATE_FILTER_SETTING, _options.heartRateFilter); + if (_options.cadenceFilter != CADENCE_FILTER_DEFAULT) + settings.setValue(CADENCE_FILTER_SETTING, _options.cadenceFilter); + if (_options.powerFilter != POWER_FILTER_DEFAULT) + settings.setValue(POWER_FILTER_SETTING, _options.powerFilter); + if (_options.outlierEliminate != OUTLIER_ELIMINATE_DEFAULT) + settings.setValue(OUTLIER_ELIMINATE_SETTING, _options.outlierEliminate); + if (_options.pauseSpeed != PAUSE_SPEED_DEFAULT) + settings.setValue(PAUSE_SPEED_SETTING, _options.pauseSpeed); + if (_options.pauseInterval != PAUSE_INTERVAL_DEFAULT) + settings.setValue(PAUSE_INTERVAL_SETTING, _options.pauseInterval); if (_options.poiRadius != POI_RADIUS_DEFAULT) settings.setValue(POI_RADIUS_SETTING, _options.poiRadius); if (_options.useOpenGL != USE_OPENGL_DEFAULT) @@ -1759,6 +1812,22 @@ void GUI::readSettings() GRAPH_WIDTH_DEFAULT).toInt(); _options.graphAntiAliasing = settings.value(GRAPH_AA_SETTING, GRAPH_AA_DEFAULT).toBool(); + _options.elevationFilter = settings.value(ELEVATION_FILTER_SETTING, + ELEVATION_FILTER_DEFAULT).toInt(); + _options.speedFilter = settings.value(SPEED_FILTER_SETTING, + SPEED_FILTER_DEFAULT).toInt(); + _options.heartRateFilter = settings.value(HEARTRATE_FILTER_SETTING, + HEARTRATE_FILTER_DEFAULT).toInt(); + _options.cadenceFilter = settings.value(CADENCE_FILTER_SETTING, + CADENCE_FILTER_DEFAULT).toInt(); + _options.powerFilter = settings.value(POWER_FILTER_SETTING, + POWER_FILTER_DEFAULT).toInt(); + _options.outlierEliminate = settings.value(OUTLIER_ELIMINATE_SETTING, + OUTLIER_ELIMINATE_DEFAULT).toBool(); + _options.pauseSpeed = settings.value(PAUSE_SPEED_SETTING, + PAUSE_SPEED_DEFAULT).toFloat(); + _options.pauseInterval = settings.value(PAUSE_INTERVAL_SETTING, + PAUSE_INTERVAL_DEFAULT).toInt(); _options.poiRadius = settings.value(POI_RADIUS_SETTING, POI_RADIUS_DEFAULT) .toInt(); _options.useOpenGL = settings.value(USE_OPENGL_SETTING, USE_OPENGL_DEFAULT) @@ -1798,6 +1867,15 @@ void GUI::readSettings() _tabs.at(i)->useOpenGL(true); } + Track::setElevationFilter(_options.elevationFilter); + Track::setSpeedFilter(_options.speedFilter); + Track::setHeartRateFilter(_options.heartRateFilter); + Track::setCadenceFilter(_options.cadenceFilter); + Track::setPowerFilter(_options.powerFilter); + Track::setOutlierElimination(_options.outlierEliminate); + Track::setPauseSpeed(_options.pauseSpeed); + Track::setPauseInterval(_options.pauseInterval); + _poi->setRadius(_options.poiRadius); QPixmapCache::setCacheLimit(_options.pixmapCache * 1024); diff --git a/src/icons.h b/src/icons.h index 1f0465d4..e1b408f2 100644 --- a/src/icons.h +++ b/src/icons.h @@ -10,7 +10,7 @@ #define CLOSE_FILE_ICON ":/icons/dialog-close.png" #define SHOW_POI_ICON ":/icons/flag.png" #define SHOW_MAP_ICON ":/icons/applications-internet.png" -#define SHOW_GRAPHS_ICON ":/icons/office-chart-line-stacked.png" +#define SHOW_GRAPHS_ICON ":/icons/office-chart-line.png" #define QUIT_ICON ":/icons/application-exit.png" #define RELOAD_FILE_ICON ":/icons/view-refresh.png" #define NEXT_FILE_ICON ":/icons/arrow-right.png" @@ -24,5 +24,6 @@ #define POI_ICON ":/icons/flag_48.png" #define SYSTEM_ICON ":/icons/system-run.png" #define PRINT_EXPORT_ICON ":/icons/document-print-preview.png" +#define DATA_ICON ":/icons/view-filter.png" #endif /* ICONS_H */ diff --git a/src/optionsdialog.cpp b/src/optionsdialog.cpp index c9800027..9834752e 100644 --- a/src/optionsdialog.cpp +++ b/src/optionsdialog.cpp @@ -117,6 +117,77 @@ QWidget *OptionsDialog::createAppearancePage() return appearancePage; } +QWidget *OptionsDialog::createDataPage() +{ + QString filterToolTip = tr("Moving average window size"); + + _elevationFilter = new QSpinBox(); + _elevationFilter->setValue(_options->elevationFilter); + _elevationFilter->setToolTip(filterToolTip); + _speedFilter = new QSpinBox(); + _speedFilter->setValue(_options->speedFilter); + _speedFilter->setToolTip(filterToolTip); + _heartRateFilter = new QSpinBox(); + _heartRateFilter->setValue(_options->heartRateFilter); + _heartRateFilter->setToolTip(filterToolTip); + _cadenceFilter = new QSpinBox(); + _cadenceFilter->setValue(_options->cadenceFilter); + _cadenceFilter->setToolTip(filterToolTip); + _powerFilter = new QSpinBox(); + _powerFilter->setValue(_options->powerFilter); + _powerFilter->setToolTip(filterToolTip); + + QFormLayout *filterLayout = new QFormLayout(); + filterLayout->addRow(tr("Elevation:"), _elevationFilter); + filterLayout->addRow(tr("Speed:"), _speedFilter); + filterLayout->addRow(tr("Heart rate:"), _heartRateFilter); + filterLayout->addRow(tr("Cadence:"), _cadenceFilter); + filterLayout->addRow(tr("Power:"), _powerFilter); + + _outlierEliminate = new QCheckBox(tr("Outlier elimination")); + _outlierEliminate->setChecked(_options->outlierEliminate); + + QFormLayout *outlierLayout = new QFormLayout(); + outlierLayout->addWidget(_outlierEliminate); + + QWidget *filterTab = new QWidget(); + QVBoxLayout *filterTabLayout = new QVBoxLayout(); + filterTabLayout->addLayout(filterLayout); + filterTabLayout->addLayout(outlierLayout); + filterTabLayout->addStretch(); + filterTab->setLayout(filterTabLayout); + + _pauseSpeed = new QDoubleSpinBox(); + _pauseSpeed->setDecimals(1); + _pauseSpeed->setSingleStep(0.1); + _pauseSpeed->setMinimum(0.1); + if (_options->units == Imperial) { + _pauseSpeed->setValue(_options->pauseSpeed * MS2MIH); + _pauseSpeed->setSuffix(UNIT_SPACE + tr("mi/h")); + } else { + _pauseSpeed->setValue(_options->pauseSpeed * MS2KMH); + _pauseSpeed->setSuffix(UNIT_SPACE + tr("km/h")); + } + _pauseInterval = new QSpinBox(); + _pauseInterval->setMinimum(1); + _pauseInterval->setSuffix(UNIT_SPACE + tr("s")); + _pauseInterval->setValue(_options->pauseInterval); + + QFormLayout *pauseLayout = new QFormLayout(); + pauseLayout->addRow(tr("Minimal speed:"), _pauseSpeed); + pauseLayout->addRow(tr("Minimal duration:"), _pauseInterval); + + QWidget *pauseTab = new QWidget(); + pauseTab->setLayout(pauseLayout); + + + QTabWidget *filterPage = new QTabWidget(); + filterPage->addTab(filterTab, tr("Filtering")); + filterPage->addTab(pauseTab, tr("Pause detection")); + + return filterPage; +} + QWidget *OptionsDialog::createPOIPage() { _poiRadius = new QDoubleSpinBox(); @@ -226,6 +297,7 @@ OptionsDialog::OptionsDialog(Options *options, QWidget *parent) { QStackedWidget *pages = new QStackedWidget(); pages->addWidget(createAppearancePage()); + pages->addWidget(createDataPage()); pages->addWidget(createPOIPage()); pages->addWidget(createExportPage()); pages->addWidget(createSystemPage()); @@ -234,6 +306,7 @@ OptionsDialog::OptionsDialog(Options *options, QWidget *parent) menu->setIconSize(QSize(MENU_ICON_SIZE, MENU_ICON_SIZE)); new QListWidgetItem(QIcon(QPixmap(APPEARANCE_ICON)), tr("Appearance"), menu); + new QListWidgetItem(QIcon(QPixmap(DATA_ICON)), tr("Data"), menu); new QListWidgetItem(QIcon(QPixmap(POI_ICON)), tr("POI"), menu); new QListWidgetItem(QIcon(QPixmap(PRINT_EXPORT_ICON)), tr("Print & Export"), menu); @@ -282,10 +355,18 @@ void OptionsDialog::accept() _options->graphWidth = _graphWidth->value(); _options->graphAntiAliasing = _graphAA->isChecked(); - if (_options->units == Imperial) - _options->poiRadius = _poiRadius->value() * MIINM; - else - _options->poiRadius = _poiRadius->value() * KMINM; + _options->elevationFilter = _elevationFilter->value(); + _options->speedFilter = _speedFilter->value(); + _options->heartRateFilter = _heartRateFilter->value(); + _options->cadenceFilter = _cadenceFilter->value(); + _options->powerFilter = _powerFilter->value(); + _options->outlierEliminate = _outlierEliminate->isChecked(); + _options->pauseSpeed = (_options->units == Imperial) + ? _pauseSpeed->value() / MS2MIH : _pauseSpeed->value() / MS2KMH; + _options->pauseInterval = _pauseInterval->value(); + + _options->poiRadius = (_options->units == Imperial) + ? _poiRadius->value() * MIINM : _poiRadius->value() * KMINM; _options->useOpenGL = _useOpenGL->isChecked(); _options->pixmapCache = _pixmapCache->value(); diff --git a/src/optionsdialog.h b/src/optionsdialog.h index 7319e5b4..ae65d73c 100644 --- a/src/optionsdialog.h +++ b/src/optionsdialog.h @@ -22,6 +22,15 @@ struct Options { int graphWidth; bool pathAntiAliasing; bool graphAntiAliasing; + // Data + int elevationFilter; + int speedFilter; + int heartRateFilter; + int cadenceFilter; + int powerFilter; + bool outlierEliminate; + qreal pauseSpeed; + int pauseInterval; // POI int poiRadius; // System @@ -51,12 +60,14 @@ public slots: private: QWidget *createAppearancePage(); + QWidget *createDataPage(); QWidget *createPOIPage(); QWidget *createSystemPage(); QWidget *createExportPage(); Options *_options; + // Appearance ColorBox *_baseColor; QDoubleSpinBox *_colorOffset; QSpinBox *_trackWidth; @@ -66,9 +77,21 @@ private: QCheckBox *_pathAA; QSpinBox *_graphWidth; QCheckBox *_graphAA; + // Data + QSpinBox *_elevationFilter; + QSpinBox *_speedFilter; + QSpinBox *_heartRateFilter; + QSpinBox *_cadenceFilter; + QSpinBox *_powerFilter; + QCheckBox *_outlierEliminate; + QDoubleSpinBox *_pauseSpeed; + QSpinBox *_pauseInterval; + // POI QDoubleSpinBox *_poiRadius; + // System QSpinBox *_pixmapCache; QCheckBox *_useOpenGL; + // Print/Export QCheckBox *_name; QCheckBox *_date; QCheckBox *_distance; diff --git a/src/pathview.cpp b/src/pathview.cpp index 7ae2c374..5cbf89a5 100644 --- a/src/pathview.cpp +++ b/src/pathview.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "opengl.h" #include "misc.h" #include "poi.h" @@ -301,6 +302,7 @@ void PathView::setMap(Map *map) _mapScale->setResolution(_res); resetCachedContent(); + QPixmapCache::clear(); } void PathView::setPOI(POI *poi) @@ -542,6 +544,7 @@ void PathView::clear() resetDigitalZoom(); resetCachedContent(); + QPixmapCache::clear(); } void PathView::showTracks(bool show) diff --git a/src/settings.h b/src/settings.h index c26cc8f7..3f104bbd 100644 --- a/src/settings.h +++ b/src/settings.h @@ -90,12 +90,28 @@ #define PATH_AA_DEFAULT true #define GRAPH_AA_SETTING "graphAntiAliasing" #define GRAPH_AA_DEFAULT false +#define ELEVATION_FILTER_SETTING "elevationFilter" +#define ELEVATION_FILTER_DEFAULT 3 +#define SPEED_FILTER_SETTING "speedFilter" +#define SPEED_FILTER_DEFAULT 7 +#define HEARTRATE_FILTER_SETTING "heartrateFilter" +#define HEARTRATE_FILTER_DEFAULT 3 +#define CADENCE_FILTER_SETTING "cadenceFilter" +#define CADENCE_FILTER_DEFAULT 3 +#define POWER_FILTER_SETTING "powerFilter" +#define POWER_FILTER_DEFAULT 3 +#define OUTLIER_ELIMINATE_SETTING "outlierEliminate" +#define OUTLIER_ELIMINATE_DEFAULT true +#define PAUSE_SPEED_SETTING "pauseSpeed" +#define PAUSE_SPEED_DEFAULT 0.5 /* m/s */ +#define PAUSE_INTERVAL_SETTING "pauseInterval" +#define PAUSE_INTERVAL_DEFAULT 10 /* s */ #define POI_RADIUS_SETTING "poiRadius" #define POI_RADIUS_DEFAULT (IMPERIAL_UNITS() ? MIINM : KMINM) #define USE_OPENGL_SETTING "useOpenGL" #define USE_OPENGL_DEFAULT false #define PIXMAP_CACHE_SETTING "pixmapCache" -#define PIXMAP_CACHE_DEFAULT 64 +#define PIXMAP_CACHE_DEFAULT 64 /* MB */ #define PRINT_NAME_SETTING "printName" #define PRINT_NAME_DEFAULT true #define PRINT_DATE_SETTING "printDate" diff --git a/src/track.cpp b/src/track.cpp index 102222db..95138797 100644 --- a/src/track.cpp +++ b/src/track.cpp @@ -1,16 +1,17 @@ #include "track.h" +#define OUTLIER_WINDOW 31 -#define WINDOW_OE 31 +int Track::_elevationWindow = 3; +int Track::_speedWindow = 7; +int Track::_heartRateWindow = 3; +int Track::_cadenceWindow = 3; +int Track::_powerWindow = 3; -#define WINDOW_EF 3 -#define WINDOW_SF 7 -#define WINDOW_HF 3 -#define WINDOW_CF 3 -#define WINDOW_PF 3 +qreal Track::_pauseSpeed = 0.5; +int Track::_pauseInterval = 10; -#define PAUSE_SPEED 0.5 -#define PAUSE_TIME_DIFF 10 +bool Track::_outlierEliminate = true; static qreal median(QVector v) @@ -104,15 +105,16 @@ Track::Track(const TrackData &data) : _data(data) _pause = 0; for (int i = 1; i < data.count(); i++) { - if (_time.at(i) > _time.at(i-1) + PAUSE_TIME_DIFF - && _speed.at(i) < PAUSE_SPEED) { + if (_time.at(i) > _time.at(i-1) + _pauseInterval + && _speed.at(i) < _pauseSpeed) { _pause += _time.at(i) - _time.at(i-1); _stop.insert(i-1); _stop.insert(i); } } - _outliers = eliminate(_speed, WINDOW_OE); + if (_outlierEliminate) + _outliers = eliminate(_speed, OUTLIER_WINDOW); QSet::const_iterator it; for (it = _stop.constBegin(); it != _stop.constEnd(); ++it) @@ -137,7 +139,7 @@ Graph Track::elevation() const raw.append(GraphPoint(_distance.at(i), _time.at(i), _data.at(i).elevation())); - return filter(raw, WINDOW_EF); + return filter(raw, _elevationWindow); } Graph Track::speed() const @@ -161,7 +163,7 @@ Graph Track::speed() const raw.append(GraphPoint(_distance.at(i), _time.at(i), v)); } - filtered = filter(raw, WINDOW_SF); + filtered = filter(raw, _speedWindow); QSet::const_iterator it; for (it = stop.constBegin(); it != stop.constEnd(); ++it) @@ -179,7 +181,7 @@ Graph Track::heartRate() const raw.append(GraphPoint(_distance.at(i), _time.at(i), _data.at(i).heartRate())); - return filter(raw, WINDOW_HF); + return filter(raw, _heartRateWindow); } Graph Track::temperature() const @@ -212,7 +214,7 @@ Graph Track::cadence() const raw.append(GraphPoint(_distance.at(i), _time.at(i), c)); } - filtered = filter(raw, WINDOW_CF); + filtered = filter(raw, _cadenceWindow); QSet::const_iterator it; for (it = stop.constBegin(); it != stop.constEnd(); ++it) @@ -239,7 +241,7 @@ Graph Track::power() const raw.append(GraphPoint(_distance.at(i), _time.at(i), p)); } - filtered = filter(raw, WINDOW_PF); + filtered = filter(raw, _powerWindow); QSet::const_iterator it; for (it = stop.constBegin(); it != stop.constEnd(); ++it) diff --git a/src/track.h b/src/track.h index 72103e72..891c151a 100644 --- a/src/track.h +++ b/src/track.h @@ -33,6 +33,16 @@ public: bool isNull() const {return (_data.size() < 2);} + static void setElevationFilter(int window) {_elevationWindow = window;} + static void setSpeedFilter(int window) {_speedWindow = window;} + static void setHeartRateFilter(int window) {_heartRateWindow = window;} + static void setCadenceFilter(int window) {_cadenceWindow = window;} + static void setPowerFilter(int window) {_powerWindow = window;} + static void setPauseSpeed(qreal speed) {_pauseSpeed = speed;} + static void setPauseInterval(int interval) {_pauseInterval = interval;} + static void setOutlierElimination(bool eliminate) + {_outlierEliminate = eliminate;} + private: bool discardStopPoint(int i) const; @@ -46,6 +56,17 @@ private: QSet _stop; qreal _pause; + + static bool _outlierEliminate; + + static int _elevationWindow; + static int _speedWindow; + static int _heartRateWindow; + static int _cadenceWindow; + static int _powerWindow; + + static qreal _pauseSpeed; + static int _pauseInterval; }; #endif // TRACK_H