Skip to content

Commit

Permalink
Include power data in TCX output (#31, #43, #47)
Browse files Browse the repository at this point in the history
TCX has no support for power data per se, however, both the Garmin
Activity Extension (#31) and the Garmin Course Extension (#47) support
power data.  This change includes power data for both extensions.

Note, the Garmin Course Extension is currently not unit tested (will
add unit tests shortly).  Also, there are a few code paths added in
this change that cannot be tested until we get a data set that includes
*both* power data and lap data (#46).
  • Loading branch information
pcolby committed Jan 5, 2015
1 parent 05aa86f commit 32603fb
Show file tree
Hide file tree
Showing 16 changed files with 144 additions and 15 deletions.
53 changes: 51 additions & 2 deletions src/polar/v2/trainingsession.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1794,6 +1794,10 @@ QDomDocument TrainingSession::toTCX(const QString &buildTime) const
tcx.setAttribute(QLatin1String("xmlns:ax2"),
QLatin1String("http://www.garmin.com/xmlschemas/ActivityExtension/v2"));
}
if (tcxOptions.testFlag(GarminCourseExtension)) {
tcx.setAttribute(QLatin1String("xmlns:cx1"),
QLatin1String("http://www.garmin.com/xmlschemas/CourseExtension/v1"));
}
doc.appendChild(tcx);

QDomElement activities = doc.createElement(QLatin1String("Activities"));
Expand Down Expand Up @@ -1825,6 +1829,8 @@ QDomDocument TrainingSession::toTCX(const QString &buildTime) const
// Get the "samples" samples.
const QVariantList altitude = samples.value(QLatin1String("altitude")).toList();
const QVariantList cadence = samples.value(QLatin1String("cadence")).toList();
const QVariantList powerLeft = samples.value(QLatin1String("left-pedal-power")).toList();
const QVariantList powerRight = samples.value(QLatin1String("right-pedal-power")).toList();
const QVariantList distance = samples.value(QLatin1String("distance")).toList();
const QVariantList heartrate = samples.value(QLatin1String("heartrate")).toList();
const QVariantList speed = samples.value(QLatin1String("speed")).toList();
Expand Down Expand Up @@ -1955,7 +1961,9 @@ QDomDocument TrainingSession::toTCX(const QString &buildTime) const
lap.appendChild(track);

// Add any enabled extensions.
if (tcxOptions.testFlag(GarminActivityExtension)) {
if (tcxOptions.testFlag(GarminActivityExtension) ||
tcxOptions.testFlag(GarminCourseExtension))
{
QDomElement extensions = doc.createElement(QLatin1String("Extensions"));
lap.appendChild(extensions);

Expand Down Expand Up @@ -1996,7 +2004,37 @@ QDomDocument TrainingSession::toTCX(const QString &buildTime) const
.arg(first(cadence.value(QLatin1String("maximum"))).toUInt())));
}

/// @todo AvgWatts and MaxWatts when power data is available.
/// @todo Steps

// Note, AvgWatts is defined by both the Garmin Activity
// Extension and the Garmin Course Extension schemas.
const QVariantMap power = firstMap(base.value(QLatin1String("power")));
if (power.contains(QLatin1String("average"))) {
lx.appendChild(doc.createElement(QLatin1String("AvgWatts")))
.appendChild(doc.createTextNode(QString::fromLatin1("%1")
.arg(first(power.value(QLatin1String("average"))).toUInt())));
}
if (power.contains(QLatin1String("maximum"))) {
lx.appendChild(doc.createElement(QLatin1String("MaxWatts")))
.appendChild(doc.createTextNode(QString::fromLatin1("%1")
.arg(first(power.value(QLatin1String("maximum"))).toUInt())));
}
}

if (tcxOptions.testFlag(GarminCourseExtension)) {
QDomElement cx = doc.createElement(QLatin1String("CX"));
cx.setAttribute(QLatin1String("xmlns"),
QLatin1String("http://www.garmin.com/xmlschemas/CourseExtension/v1"));
extensions.appendChild(cx);

// Note, AvgWatts is defined by both the Garmin Activity
// Extension and the Garmin Course Extension schemas.
const QVariantMap power = firstMap(base.value(QLatin1String("power")));
if (power.contains(QLatin1String("average"))) {
cx.appendChild(doc.createElement(QLatin1String("AvgWatts")))
.appendChild(doc.createTextNode(QString::fromLatin1("%1")
.arg(first(power.value(QLatin1String("average"))).toUInt())));
}
}
}
}
Expand Down Expand Up @@ -2061,6 +2099,17 @@ QDomDocument TrainingSession::toTCX(const QString &buildTime) const
.appendChild(doc.createTextNode(cadence.at(index).toString()));
}
}

const int currentPowerLeft = (index < powerLeft.length()) ?
first(powerLeft.at(index).toMap().value(QLatin1String("current-power"))).toInt() : 0;
const int currentPowerRight = (index < powerRight.length()) ?
first(powerRight.at(index).toMap().value(QLatin1String("current-power"))).toInt() : 0;
const int currentPower = currentPowerLeft + currentPowerRight;
if (currentPower != 0) {
tpx.appendChild(doc.createElement(QLatin1String("Watts")))
.appendChild(doc.createTextNode(QString::fromLatin1("%1")
.arg(currentPower)));
}
}

if (trackPoint.hasChildNodes()) {
Expand Down
2 changes: 1 addition & 1 deletion src/polar/v2/trainingsession.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ class TrainingSession : public QObject {
enum TcxOption {
ForceTcxUTC = 0x0001,
GarminActivityExtension = 0x0100,
//GarminCourseExtension = 0x0200, //< Needs power support.
GarminCourseExtension = 0x0200,
};
Q_DECLARE_FLAGS(TcxOptions, TcxOption)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?>
<TrainingCenterDatabase xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" xmlns:ax2="http://www.garmin.com/xmlschemas/ActivityExtension/v2">
<TrainingCenterDatabase xmlns:ax2="http://www.garmin.com/xmlschemas/ActivityExtension/v2" xmlns:cx1="http://www.garmin.com/xmlschemas/CourseExtension/v1" xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2">
<Author xsi:type="Application_t">
<Name>Bipolar</Name>
<Build>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?>
<TrainingCenterDatabase xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" xmlns:ax2="http://www.garmin.com/xmlschemas/ActivityExtension/v2">
<TrainingCenterDatabase xmlns:ax2="http://www.garmin.com/xmlschemas/ActivityExtension/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd">
<Author xsi:type="Application_t">
<Name>Bipolar</Name>
<Build>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?>
<TrainingCenterDatabase xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd" xmlns:ax2="http://www.garmin.com/xmlschemas/ActivityExtension/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<TrainingCenterDatabase xmlns:ax2="http://www.garmin.com/xmlschemas/ActivityExtension/v2" xmlns:cx1="http://www.garmin.com/xmlschemas/CourseExtension/v1" xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2">
<Activities>
<Activity Sport="Running">
<Id>2014-07-13T07:26:23+10:00</Id>
Expand Down Expand Up @@ -27082,6 +27082,7 @@
<LX xmlns="http://www.garmin.com/xmlschemas/ActivityExtension/v2">
<AvgSpeed>5.87056</AvgSpeed>
</LX>
<CX xmlns="http://www.garmin.com/xmlschemas/CourseExtension/v1"/>
</Extensions>
</Lap>
<Lap StartTime="2014-07-13T07:56:27+10:00">
Expand Down Expand Up @@ -49498,6 +49499,7 @@
<LX xmlns="http://www.garmin.com/xmlschemas/ActivityExtension/v2">
<AvgSpeed>4.90671</AvgSpeed>
</LX>
<CX xmlns="http://www.garmin.com/xmlschemas/CourseExtension/v1"/>
</Extensions>
</Lap>
<Lap StartTime="2014-07-13T08:21:20+10:00">
Expand Down Expand Up @@ -52924,6 +52926,7 @@
<LX xmlns="http://www.garmin.com/xmlschemas/ActivityExtension/v2">
<AvgSpeed>8.38207</AvgSpeed>
</LX>
<CX xmlns="http://www.garmin.com/xmlschemas/CourseExtension/v1"/>
</Extensions>
</Lap>
<Lap StartTime="2014-07-13T08:25:07+10:00">
Expand Down Expand Up @@ -76375,6 +76378,7 @@
<LX xmlns="http://www.garmin.com/xmlschemas/ActivityExtension/v2">
<AvgSpeed>5.982</AvgSpeed>
</LX>
<CX xmlns="http://www.garmin.com/xmlschemas/CourseExtension/v1"/>
</Extensions>
</Lap>
<Lap StartTime="2014-07-13T08:51:09+10:00">
Expand Down Expand Up @@ -78691,6 +78695,7 @@
<LX xmlns="http://www.garmin.com/xmlschemas/ActivityExtension/v2">
<AvgSpeed>9.00117</AvgSpeed>
</LX>
<CX xmlns="http://www.garmin.com/xmlschemas/CourseExtension/v1"/>
</Extensions>
</Lap>
</Activity>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?>
<TrainingCenterDatabase xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd" xmlns:ax2="http://www.garmin.com/xmlschemas/ActivityExtension/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<TrainingCenterDatabase xmlns:ax2="http://www.garmin.com/xmlschemas/ActivityExtension/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd">
<Activities>
<Activity Sport="Running">
<Id>2014-07-13T07:26:23+10:00</Id>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?>
<TrainingCenterDatabase xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd" xmlns:ax2="http://www.garmin.com/xmlschemas/ActivityExtension/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<TrainingCenterDatabase xmlns:ax2="http://www.garmin.com/xmlschemas/ActivityExtension/v2" xmlns:cx1="http://www.garmin.com/xmlschemas/CourseExtension/v1" xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2">
<Activities>
<Activity Sport="Other">
<Id>2014-07-18T07:48:56+10:00</Id>
Expand Down Expand Up @@ -58315,6 +58315,7 @@
<LX xmlns="http://www.garmin.com/xmlschemas/ActivityExtension/v2">
<AvgSpeed>4.21967</AvgSpeed>
</LX>
<CX xmlns="http://www.garmin.com/xmlschemas/CourseExtension/v1"/>
</Extensions>
</Lap>
</Activity>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?>
<TrainingCenterDatabase xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd" xmlns:ax2="http://www.garmin.com/xmlschemas/ActivityExtension/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<TrainingCenterDatabase xmlns:ax2="http://www.garmin.com/xmlschemas/ActivityExtension/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd">
<Activities>
<Activity Sport="Other">
<Id>2014-07-18T07:48:56+10:00</Id>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?>
<TrainingCenterDatabase xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" xmlns:ax2="http://www.garmin.com/xmlschemas/ActivityExtension/v2">
<TrainingCenterDatabase xmlns:ax2="http://www.garmin.com/xmlschemas/ActivityExtension/v2" xmlns:cx1="http://www.garmin.com/xmlschemas/CourseExtension/v1" xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2">
<Author xsi:type="Application_t">
<Name>Bipolar</Name>
<Build>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?>
<TrainingCenterDatabase xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" xmlns:ax2="http://www.garmin.com/xmlschemas/ActivityExtension/v2">
<TrainingCenterDatabase xmlns:ax2="http://www.garmin.com/xmlschemas/ActivityExtension/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd">
<Author xsi:type="Application_t">
<Name>Bipolar</Name>
<Build>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?>
<TrainingCenterDatabase xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd" xmlns:ax2="http://www.garmin.com/xmlschemas/ActivityExtension/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<TrainingCenterDatabase xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd" xmlns:ax2="http://www.garmin.com/xmlschemas/ActivityExtension/v2" xmlns:cx1="http://www.garmin.com/xmlschemas/CourseExtension/v1">
<Activities>
<Activity Sport="Running">
<Id>2014-08-07T17:25:01+10:00</Id>
Expand Down Expand Up @@ -4565,6 +4565,7 @@
<AvgRunCadence>80</AvgRunCadence>
<MaxRunCadence>84</MaxRunCadence>
</LX>
<CX xmlns="http://www.garmin.com/xmlschemas/CourseExtension/v1"/>
</Extensions>
</Lap>
<Lap StartTime="2014-08-07T17:29:00+10:00">
Expand Down Expand Up @@ -9187,6 +9188,7 @@
<AvgRunCadence>83</AvgRunCadence>
<MaxRunCadence>85</MaxRunCadence>
</LX>
<CX xmlns="http://www.garmin.com/xmlschemas/CourseExtension/v1"/>
</Extensions>
</Lap>
<Lap StartTime="2014-08-07T17:33:02+10:00">
Expand Down Expand Up @@ -13733,6 +13735,7 @@
<AvgRunCadence>83</AvgRunCadence>
<MaxRunCadence>86</MaxRunCadence>
</LX>
<CX xmlns="http://www.garmin.com/xmlschemas/CourseExtension/v1"/>
</Extensions>
</Lap>
<Lap StartTime="2014-08-07T17:37:00+10:00">
Expand Down Expand Up @@ -17082,6 +17085,7 @@
<AvgRunCadence>85</AvgRunCadence>
<MaxRunCadence>89</MaxRunCadence>
</LX>
<CX xmlns="http://www.garmin.com/xmlschemas/CourseExtension/v1"/>
</Extensions>
</Lap>
<Lap StartTime="2014-08-07T17:39:55+10:00">
Expand Down Expand Up @@ -22122,6 +22126,7 @@
<AvgRunCadence>81</AvgRunCadence>
<MaxRunCadence>84</MaxRunCadence>
</LX>
<CX xmlns="http://www.garmin.com/xmlschemas/CourseExtension/v1"/>
</Extensions>
</Lap>
<Lap StartTime="2014-08-07T17:44:19+10:00">
Expand Down Expand Up @@ -27048,6 +27053,7 @@
<AvgRunCadence>82</AvgRunCadence>
<MaxRunCadence>85</MaxRunCadence>
</LX>
<CX xmlns="http://www.garmin.com/xmlschemas/CourseExtension/v1"/>
</Extensions>
</Lap>
<Lap StartTime="2014-08-07T17:48:37+10:00">
Expand Down Expand Up @@ -30606,6 +30612,7 @@
<AvgRunCadence>84</AvgRunCadence>
<MaxRunCadence>86</MaxRunCadence>
</LX>
<CX xmlns="http://www.garmin.com/xmlschemas/CourseExtension/v1"/>
</Extensions>
</Lap>
<Lap StartTime="2014-08-07T17:51:43+10:00">
Expand Down Expand Up @@ -35741,6 +35748,7 @@
<AvgRunCadence>81</AvgRunCadence>
<MaxRunCadence>83</MaxRunCadence>
</LX>
<CX xmlns="http://www.garmin.com/xmlschemas/CourseExtension/v1"/>
</Extensions>
</Lap>
<Lap StartTime="2014-08-07T17:56:12+10:00">
Expand Down Expand Up @@ -40230,6 +40238,7 @@
<AvgRunCadence>81</AvgRunCadence>
<MaxRunCadence>84</MaxRunCadence>
</LX>
<CX xmlns="http://www.garmin.com/xmlschemas/CourseExtension/v1"/>
</Extensions>
</Lap>
<Lap StartTime="2014-08-07T18:00:07+10:00">
Expand Down Expand Up @@ -40717,6 +40726,7 @@
</Track>
<Extensions>
<LX xmlns="http://www.garmin.com/xmlschemas/ActivityExtension/v2"/>
<CX xmlns="http://www.garmin.com/xmlschemas/CourseExtension/v1"/>
</Extensions>
</Lap>
</Activity>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?>
<TrainingCenterDatabase xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd" xmlns:ax2="http://www.garmin.com/xmlschemas/ActivityExtension/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<TrainingCenterDatabase xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd" xmlns:ax2="http://www.garmin.com/xmlschemas/ActivityExtension/v2">
<Activities>
<Activity Sport="Running">
<Id>2014-08-07T17:25:01+10:00</Id>
Expand Down
Loading

0 comments on commit 32603fb

Please sign in to comment.