diff --git a/src/LTMPlot.cpp b/src/LTMPlot.cpp index b3ff9b03e..7b3dc3848 100644 --- a/src/LTMPlot.cpp +++ b/src/LTMPlot.cpp @@ -841,13 +841,15 @@ LTMPlot::createCurveData(LTMSettings *settings, MetricDetail metricDetail, QVect // Get metric data, either from metricDB for RideFile metrics // or from StressCalculator for PM type metrics QList PMCdata; - if (/* XXX FIXME */metricDetail.type == METRIC_BEST || metricDetail.type == METRIC_DB || metricDetail.type == METRIC_META) { + if (metricDetail.type == METRIC_DB || metricDetail.type == METRIC_META) { data = settings->data; } else if (metricDetail.type == METRIC_MEASURE) { data = settings->measures; } else if (metricDetail.type == METRIC_PM) { createPMCCurveData(settings, metricDetail, PMCdata); data = &PMCdata; + } else if (metricDetail.type == METRIC_BEST) { + data = settings->bests; } n=-1; @@ -868,6 +870,8 @@ LTMPlot::createCurveData(LTMSettings *settings, MetricDetail metricDetail, QVect double value; if (metricDetail.type == METRIC_MEASURE) value = rideMetrics.getText(metricDetail.symbol, "0.0").toDouble(); + else if (metricDetail.type == METRIC_BEST) + value = rideMetrics.getForSymbol(metricDetail.bestSymbol); else value = rideMetrics.getForSymbol(metricDetail.symbol); diff --git a/src/LTMSettings.cpp b/src/LTMSettings.cpp index 794eed59d..f8301924c 100644 --- a/src/LTMSettings.cpp +++ b/src/LTMSettings.cpp @@ -168,6 +168,7 @@ QDataStream &operator<<(QDataStream &out, const LTMSettings &settings) out<(metric.series); } return out; @@ -235,6 +236,7 @@ QDataStream &operator>>(QDataStream &in, LTMSettings &settings) if (version >= 2) { // get bests info in>>m.duration; in>>m.duration_units; + in>>m.bestSymbol; in>>x; m.series = static_cast(x); } diff --git a/src/LTMSettings.h b/src/LTMSettings.h index 962dc7bc9..49fd343f2 100644 --- a/src/LTMSettings.h +++ b/src/LTMSettings.h @@ -69,6 +69,7 @@ class MetricDetail { // for METRICS QString symbol; + QString bestSymbol; QString name, units; const RideMetric *metric; @@ -138,9 +139,12 @@ class LTMSettings { bool shadeZones; bool legend; bool events; + QList metrics; QList *data; QList *measures; + QList *bests; + LTMTool *ltmTool; QString field1, field2; }; diff --git a/src/LTMTool.cpp b/src/LTMTool.cpp index 04266c970..ed6abbd1b 100644 --- a/src/LTMTool.cpp +++ b/src/LTMTool.cpp @@ -1199,6 +1199,7 @@ EditMetricDetailDialog::bestName() } desc += RideFile::seriesName(seriesList.at(dataSeries->currentIndex())); userName->setText(desc); + metricDetail->bestSymbol = desc.replace(" ", "_"); } void @@ -1269,7 +1270,7 @@ EditMetricDetailDialog::metricSelected() break; } - + (*metricDetail) = ltmTool->metrics[index]; // overwrite! } diff --git a/src/LTMWindow.cpp b/src/LTMWindow.cpp index 3f7c9516a..4f7d11ae4 100644 --- a/src/LTMWindow.cpp +++ b/src/LTMWindow.cpp @@ -23,6 +23,7 @@ #include "Context.h" #include "Context.h" #include "Athlete.h" +#include "RideFileCache.h" #include "SummaryMetrics.h" #include "Settings.h" #include "math.h" @@ -217,6 +218,8 @@ LTMWindow::refresh() results = context->athlete->metricDB->getAllMetricsFor(settings.start, settings.end); measures.clear(); // clear any old data measures = context->athlete->metricDB->getAllMeasuresFor(settings.start, settings.end); + bestsresults.clear(); + bestsresults = RideFileCache::getAllBestsFor(settings.metrics, settings.start, settings.end); refreshPlot(); repaint(); // title changes color when filters change dirty = false; @@ -236,6 +239,7 @@ LTMWindow::dateRangeChanged(DateRange range) settings.data = &results; settings.measures = &measures; + settings.bests = &bestsresults; // apply filter to new date range too -- will also refresh plot filterChanged(); @@ -266,6 +270,7 @@ LTMWindow::filterChanged() } settings.title = myDateRange.name; settings.data = &results; + settings.bests = &bestsresults; settings.measures = &measures; // if we want weeks and start is not a monday go back to the monday @@ -278,6 +283,8 @@ LTMWindow::filterChanged() results = context->athlete->metricDB->getAllMetricsFor(settings.start, settings.end); measures.clear(); // clear any old data measures = context->athlete->metricDB->getAllMeasuresFor(settings.start, settings.end); + bestsresults.clear(); + bestsresults = RideFileCache::getAllBestsFor(settings.metrics, settings.start, settings.end); // loop through results removing any not in stringlist.. if (ltmTool->isFiltered()) { diff --git a/src/LTMWindow.h b/src/LTMWindow.h index 2a35bf584..e5053ae14 100644 --- a/src/LTMWindow.h +++ b/src/LTMWindow.h @@ -201,6 +201,7 @@ class LTMWindow : public GcChartWindow LTMSettings settings; // all the plot settings QList results; QList measures; + QList bestsresults; // Widgets LTMPlot *ltmPlot; diff --git a/src/RideFileCache.cpp b/src/RideFileCache.cpp index bc0121986..0c229a7a9 100644 --- a/src/RideFileCache.cpp +++ b/src/RideFileCache.cpp @@ -22,6 +22,8 @@ #include "Athlete.h" #include "Zones.h" #include "HrZones.h" +#include "SummaryMetrics.h" +#include "LTMSettings.h" // getAllBestsFor needs this #include // for pow() #include @@ -1289,3 +1291,46 @@ RideFileCache::tiz(Context *context, QString filename, RideFile::SeriesType seri return 0; } +// get best values (as passed in the list of MetricDetails between the dates specified +// and return as an array of SummaryMetrics. +// +// this is to 're-use' the metric api (especially in the LTM code) for passing back multiple +// bests across multiple rides in one object. We do this so we can optimise the read/seek acroos +// the CPX files within a single call. +// +// We order the bests requested in the order they will appear in the CPX file so we can open +// and seek forward to each value before putting into the summary metric. Since it is placed +// on the stack as a return paramater we also don't need to worry about memory allocation just +// like the metric code works. +// +// +QList +RideFileCache::getAllBestsFor(QList metrics, QDateTime from, QDateTime to) +{ +//qDebug()<<"refresh cpx..."; + + QList results; + QList worklist; + + // lets get a worklist + foreach(MetricDetail x, metrics) { + if (x.type == 5) { + worklist << x; + //qDebug()<<"added"< getAllBestsFor(QList, QDateTime from, QDateTime to); + static int decimalsFor(RideFile::SeriesType series); // get data