From d708d251a09be2054e0f6a0ff601b9e5591ea63a Mon Sep 17 00:00:00 2001 From: Paul Colby Date: Wed, 10 Sep 2014 22:29:03 +1000 Subject: [PATCH] Implement Gamin Activity Extension LX element (#31) This is the last element we needed to implement to support the Garmin Activity Extension. Definitely should do some refactoring of the TrainingSession class sometime - its grown into a small beast. --- src/polar/v2/trainingsession.cpp | 48 ++++++++++++- ...ining-sessions-19401412.all-extensions.tcx | 27 +++++++- ...ning-sessions-19401412.garmin-activity.tcx | 27 +++++++- ...ining-sessions-19946380.all-extensions.tcx | 7 +- ...ning-sessions-19946380.garmin-activity.tcx | 7 +- ...ining-sessions-22165267.all-extensions.tcx | 68 ++++++++++++++++++- ...ning-sessions-22165267.garmin-activity.tcx | 68 ++++++++++++++++++- 7 files changed, 245 insertions(+), 7 deletions(-) diff --git a/src/polar/v2/trainingsession.cpp b/src/polar/v2/trainingsession.cpp index 68ce3d46..48f8b507 100644 --- a/src/polar/v2/trainingsession.cpp +++ b/src/polar/v2/trainingsession.cpp @@ -1882,6 +1882,53 @@ QDomDocument TrainingSession::toTCX(const QString &buildTime) const track = doc.createElement(QLatin1String("Track")); lap.appendChild(track); + + // Add any enabled extensions. + if (tcxOptions.testFlag(GarminActivityExtension)) { + QDomElement extensions = doc.createElement(QLatin1String("Extensions")); + lap.appendChild(extensions); + + // Add the Garmin Activity Extension. + if (tcxOptions.testFlag(GarminActivityExtension)) { + QDomElement lx = doc.createElement(QLatin1String("LX")); + lx.setAttribute(QLatin1String("xmlns"), + QLatin1String("http://www.garmin.com/xmlschemas/ActivityExtension/v2")); + extensions.appendChild(lx); + + if (stats.contains(QLatin1String("speed"))) { + lx.appendChild(doc.createElement(QLatin1String("AvgSpeed"))) + .appendChild(doc.createTextNode(QString::fromLatin1("%1") + .arg(first(firstMap(stats.value(QLatin1String("speed"))) + .value(QLatin1String("average"))).toDouble()))); + } + + if (stats.contains(QLatin1String("cadence"))) { + const QVariantMap cadence = firstMap(stats.value(QLatin1String("cadence"))); + + const QString sensor = getTcxCadenceSensor( + first(firstMap(create.value(QLatin1String("sport"))) + .value(QLatin1String("value"))).toULongLong()); + + if (sensor != QLatin1String("Footpod")) { + lx.appendChild(doc.createElement(QLatin1String("MaxBikeCadence"))) + .appendChild(doc.createTextNode(QString::fromLatin1("%1") + .arg(first(cadence.value(QLatin1String("maximum"))).toUInt()))); + } + + lx.appendChild(doc.createElement(QLatin1String("AvgRunCadence"))) + .appendChild(doc.createTextNode(QString::fromLatin1("%1") + .arg(first(cadence.value(QLatin1String("average"))).toUInt()))); + + if (sensor == QLatin1String("Footpod")) { + lx.appendChild(doc.createElement(QLatin1String("MaxRunCadence"))) + .appendChild(doc.createTextNode(QString::fromLatin1("%1") + .arg(first(cadence.value(QLatin1String("maximum"))).toUInt()))); + } + + /// @todo AvgWatts and MaxWatts when power data is available. + } + } + } } QDomElement trackPoint = doc.createElement(QLatin1String("Trackpoint")); @@ -2063,7 +2110,6 @@ void TrainingSession::addLapStats(QDomDocument &doc, QDomElement &lap, lap.appendChild(doc.createElement(QLatin1String("Intensity"))) .appendChild(doc.createTextNode(QString::fromLatin1("Active"))); - // Cadence is only available per exercise, not per lap. if (stats.contains(QLatin1String("cadence"))) { lap.appendChild(doc.createElement(QLatin1String("Cadence"))) .appendChild(doc.createTextNode(QString::fromLatin1("%1") diff --git a/test/polar/v2/testdata/training-sessions-19401412.all-extensions.tcx b/test/polar/v2/testdata/training-sessions-19401412.all-extensions.tcx index e99e4855..0da8397c 100644 --- a/test/polar/v2/testdata/training-sessions-19401412.all-extensions.tcx +++ b/test/polar/v2/testdata/training-sessions-19401412.all-extensions.tcx @@ -1,5 +1,5 @@ - + 2014-07-13T07:26:23+10:00 @@ -27078,6 +27078,11 @@ + + + 5.87056 + + 1492.25 @@ -49489,6 +49494,11 @@ + + + 4.90671 + + 227.5 @@ -52910,6 +52920,11 @@ + + + 8.38207 + + 1561.62 @@ -76356,6 +76371,11 @@ + + + 5.982 + + 153.5 @@ -78667,6 +78687,11 @@ + + + 9.00117 + + diff --git a/test/polar/v2/testdata/training-sessions-19401412.garmin-activity.tcx b/test/polar/v2/testdata/training-sessions-19401412.garmin-activity.tcx index e99e4855..0da8397c 100644 --- a/test/polar/v2/testdata/training-sessions-19401412.garmin-activity.tcx +++ b/test/polar/v2/testdata/training-sessions-19401412.garmin-activity.tcx @@ -1,5 +1,5 @@ - + 2014-07-13T07:26:23+10:00 @@ -27078,6 +27078,11 @@ + + + 5.87056 + + 1492.25 @@ -49489,6 +49494,11 @@ + + + 4.90671 + + 227.5 @@ -52910,6 +52920,11 @@ + + + 8.38207 + + 1561.62 @@ -76356,6 +76371,11 @@ + + + 5.982 + + 153.5 @@ -78667,6 +78687,11 @@ + + + 9.00117 + + diff --git a/test/polar/v2/testdata/training-sessions-19946380.all-extensions.tcx b/test/polar/v2/testdata/training-sessions-19946380.all-extensions.tcx index dc70d360..f620669d 100644 --- a/test/polar/v2/testdata/training-sessions-19946380.all-extensions.tcx +++ b/test/polar/v2/testdata/training-sessions-19946380.all-extensions.tcx @@ -1,5 +1,5 @@ - + 2014-07-18T07:48:56+10:00 @@ -58311,6 +58311,11 @@ + + + 4.21967 + + diff --git a/test/polar/v2/testdata/training-sessions-19946380.garmin-activity.tcx b/test/polar/v2/testdata/training-sessions-19946380.garmin-activity.tcx index dc70d360..f620669d 100644 --- a/test/polar/v2/testdata/training-sessions-19946380.garmin-activity.tcx +++ b/test/polar/v2/testdata/training-sessions-19946380.garmin-activity.tcx @@ -1,5 +1,5 @@ - + 2014-07-18T07:48:56+10:00 @@ -58311,6 +58311,11 @@ + + + 4.21967 + + diff --git a/test/polar/v2/testdata/training-sessions-22165267.all-extensions.tcx b/test/polar/v2/testdata/training-sessions-22165267.all-extensions.tcx index 82b8ac6a..ec4803ab 100644 --- a/test/polar/v2/testdata/training-sessions-22165267.all-extensions.tcx +++ b/test/polar/v2/testdata/training-sessions-22165267.all-extensions.tcx @@ -1,5 +1,5 @@ - + 2014-08-07T17:25:01+10:00 @@ -4559,6 +4559,13 @@ + + + 10.0226 + 80 + 84 + + 242 @@ -9174,6 +9181,13 @@ + + + 9.84793 + 83 + 85 + + 237.5 @@ -13713,6 +13727,13 @@ + + + 10.083 + 83 + 86 + + 175 @@ -17055,6 +17076,13 @@ + + + 13.6203 + 85 + 89 + + 264.5 @@ -22088,6 +22116,13 @@ + + + 9.09187 + 81 + 84 + + 257.5 @@ -27007,6 +27042,13 @@ + + + 9.216 + 82 + 85 + + 186 @@ -30558,6 +30600,13 @@ + + + 13.0374 + 84 + 86 + + 269.5 @@ -35686,6 +35735,13 @@ + + + 8.95792 + 81 + 83 + + 234.5 @@ -40168,6 +40224,13 @@ + + + 10.3778 + 81 + 84 + + 25.125 @@ -40652,6 +40715,9 @@ + + + diff --git a/test/polar/v2/testdata/training-sessions-22165267.garmin-activity.tcx b/test/polar/v2/testdata/training-sessions-22165267.garmin-activity.tcx index 82b8ac6a..ec4803ab 100644 --- a/test/polar/v2/testdata/training-sessions-22165267.garmin-activity.tcx +++ b/test/polar/v2/testdata/training-sessions-22165267.garmin-activity.tcx @@ -1,5 +1,5 @@ - + 2014-08-07T17:25:01+10:00 @@ -4559,6 +4559,13 @@ + + + 10.0226 + 80 + 84 + + 242 @@ -9174,6 +9181,13 @@ + + + 9.84793 + 83 + 85 + + 237.5 @@ -13713,6 +13727,13 @@ + + + 10.083 + 83 + 86 + + 175 @@ -17055,6 +17076,13 @@ + + + 13.6203 + 85 + 89 + + 264.5 @@ -22088,6 +22116,13 @@ + + + 9.09187 + 81 + 84 + + 257.5 @@ -27007,6 +27042,13 @@ + + + 9.216 + 82 + 85 + + 186 @@ -30558,6 +30600,13 @@ + + + 13.0374 + 84 + 86 + + 269.5 @@ -35686,6 +35735,13 @@ + + + 8.95792 + 81 + 83 + + 234.5 @@ -40168,6 +40224,13 @@ + + + 10.3778 + 81 + 84 + + 25.125 @@ -40652,6 +40715,9 @@ + + +