From 5dc93dccc8738b1eebdfa8859dd14d834daed468 Mon Sep 17 00:00:00 2001 From: "Sean C. Rhea" Date: Wed, 20 Feb 2008 17:24:45 +0000 Subject: [PATCH] - Added TotalWorkRideMetric. - Use XML to describe what metrics to display and in what order. --- src/gui/BasicRideMetrics.cpp | 2 ++ src/gui/BasicRideMetrics.h | 29 ++++++++++++++++++ src/gui/RideItem.cpp | 59 +++++++++++++++++++++++++++++------- src/gui/gui.pro | 1 + 4 files changed, 80 insertions(+), 11 deletions(-) diff --git a/src/gui/BasicRideMetrics.cpp b/src/gui/BasicRideMetrics.cpp index 0a1620d2f..9ce5868e6 100644 --- a/src/gui/BasicRideMetrics.cpp +++ b/src/gui/BasicRideMetrics.cpp @@ -3,4 +3,6 @@ bool totalDistanceAdded = RideMetricFactory::instance().addMetric(TotalDistanceRideMetric()); +bool totalWorkAdded = + RideMetricFactory::instance().addMetric(TotalWorkRideMetric()); diff --git a/src/gui/BasicRideMetrics.h b/src/gui/BasicRideMetrics.h index 78655c1e1..75a362f8c 100644 --- a/src/gui/BasicRideMetrics.h +++ b/src/gui/BasicRideMetrics.h @@ -29,5 +29,34 @@ class TotalDistanceRideMetric : public RideMetric { RideMetric *clone() const { return new TotalDistanceRideMetric(*this); } }; +class TotalWorkRideMetric : public RideMetric { + double kJ; + + public: + + TotalWorkRideMetric() : kJ(0.0) {} + QString name() const { return "total_work"; } + QString units(bool metric) const { (void) metric; return "kJ"; } + double value(bool metric) const { (void) metric; return kJ; } + void compute(const RawFile *raw, const Zones *zones, int zoneRange) { + (void) zones; + (void) zoneRange; + QListIterator i(raw->points); + double secs_delta = raw->rec_int_ms / 1000.0; + while (i.hasNext()) { + RawFilePoint *point = i.next(); + if (point->watts >= 0.0) + kJ += point->watts * secs_delta; + } + kJ /= 1000.0; + } + void aggregateWith(RideMetric *other) { + assert(other->name() == name()); + TotalWorkRideMetric *m = (TotalWorkRideMetric*) other; + kJ += m->kJ; + } + RideMetric *clone() const { return new TotalWorkRideMetric(*this); } +}; + #endif // _GC_BasicRideMetrics_h diff --git a/src/gui/RideItem.cpp b/src/gui/RideItem.cpp index efac8c67e..893aef967 100644 --- a/src/gui/RideItem.cpp +++ b/src/gui/RideItem.cpp @@ -26,6 +26,7 @@ #include "Zones.h" #include #include +#include RideItem::RideItem(QTreeWidgetItem *parent, int type, QString path, QString fileName, const QDateTime &dateTime, @@ -146,6 +147,16 @@ double RideItem::timeInZone(int zone) return time_in_zone[zone]; } +static const char *metricsXml = + "\n" + " \n" + " \n" + " \n" + " \n" + "\n"; + QString RideItem::htmlSummary() { @@ -332,18 +343,44 @@ RideItem::htmlSummary() summary += "Time riding:" + time_to_string(secs_moving_or_pedaling) + ""; - bool metric = (unit.toString() == "Metric"); + bool metricUnits = (unit.toString() == "Metric"); + + { + QDomDocument doc; + QString err; + int errLine, errCol; + if (!doc.setContent(QString(metricsXml), &err, &errLine, &errCol)){ + fprintf(stderr, "error: %s, line %d, col %d\n", + err.toAscii().constData(), errLine, errCol); + assert(false); + } + QDomNodeList groups = doc.elementsByTagName("metric_group"); + assert(groups.size() == 1); // for now... + QDomElement group = groups.at(0).toElement(); + assert(!group.isNull()); + QString groupName = group.attribute("name"); + assert(groupName.length() > 0); + assert(groupName == "Totals"); // for now... + QDomNodeList metricsList = group.childNodes(); + for (int i = 0; i < metricsList.size(); ++i) { + QDomElement metric = metricsList.at(i).toElement(); + QString name = metric.attribute("name"); + QString displayName = metric.attribute("display_name"); + int precision = metric.attribute("precision", "0").toInt(); + assert(name.length() > 0); + assert(displayName.length() > 0); + const RideMetric *m = metrics.value(name); + QString s("%1 (%2):%3"); + s = s.arg(displayName).arg(m->units(metricUnits)); + if (precision == 0) + s = s.arg((unsigned) round(m->value(metricUnits))); + else + s = s.arg(m->value(metricUnits), 0, 'f', precision); + summary += s; + } + } - assert(metrics.contains("total_distance")); - const RideMetric *totalDistanceMetric = metrics.value("total_distance"); - summary += ("Distance (" - + totalDistanceMetric->units(metric) - + "):%1") - .arg(totalDistanceMetric->value(metric), 0, 'f', 1); - - summary += QString("Work (kJ):" - "%1") - .arg((unsigned) round(total_work)); summary += ""; summary += ""; diff --git a/src/gui/gui.pro b/src/gui/gui.pro index 16ccb9611..4cdcc469e 100644 --- a/src/gui/gui.pro +++ b/src/gui/gui.pro @@ -7,6 +7,7 @@ TARGET = GoldenCheetah DEPENDPATH += . INCLUDEPATH += /usr/local/qwt/include ../lib ../srm CONFIG += static debug +QT += xml LIBS += /usr/local/qwt/lib/libqwt.a LIBS += ../lib/libgc.a ../srm/libsrm.a LIBS += -lm -lz