Skip to content

Commit

Permalink
Preserve the full TotalTimeSeconds precision in TCX
Browse files Browse the repository at this point in the history
Qt's default `QString::arg` behaviour is to truncate at 6 signifant
digits, but we often have more available from the V800 protobuf data.
  • Loading branch information
pcolby committed Aug 20, 2016
1 parent e788d58 commit 4cc2ac9
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 10 deletions.
24 changes: 17 additions & 7 deletions src/polar/v2/trainingsession.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2102,15 +2102,16 @@ QDomDocument TrainingSession::toTCX(const QString &buildTime) const
QVariantMap base = create; // The base data for this lap.
QVariantMap stats = map.value(STATISTICS).toMap();
QDomElement track = doc.createElement(QLatin1String("Track"));
qint64 durationRemaining = getDuration(firstMap(create.value(QLatin1String("duration"))));
quint64 durationRemaining = getDuration(firstMap(create.value(QLatin1String("duration"))));
double distanceRemaining = first(create.value(QLatin1String("distance"))).toDouble();
for (int index = 0; index < maxIndex; ++index) {
#if (QT_VERSION >= QT_VERSION_CHECK(5, 2, 0))
if ((lap.isNull()) || ((!splits.isEmpty()) && (index * recordInterval > splits.firstKey()))) {
#else
if ((lap.isNull()) || ((!splits.isEmpty()) && (index * recordInterval > splits.constBegin().key()))) {
#endif
double trailingDuration = 0, trailingDistance = 0;
quint64 trailingDuration = 0;
double trailingDistance = 0.0;
if ((!lap.isNull()) && (!splits.isEmpty())) {
#if (QT_VERSION >= QT_VERSION_CHECK(5, 2, 0))
splits.remove(splits.firstKey());
Expand Down Expand Up @@ -2152,8 +2153,7 @@ QDomDocument TrainingSession::toTCX(const QString &buildTime) const
activity.appendChild(lap);

// Add the per-lap (or per-exercise) statistics.
addLapStats(doc, lap, base, stats, trailingDuration / 1000.0,
trailingDistance);
addLapStats(doc, lap, base, stats, trailingDuration, trailingDistance);

track = doc.createElement(QLatin1String("Track"));
lap.appendChild(track);
Expand Down Expand Up @@ -2399,12 +2399,22 @@ QDomDocument TrainingSession::toTCX(const QString &buildTime) const
void TrainingSession::addLapStats(QDomDocument &doc, QDomElement &lap,
const QVariantMap &base,
const QVariantMap &stats,
const double duration,
const quint64 duration,
const double distance) const
{
// Note, we're using an explicit precision argument to QString::arg here
// because QString::arg defaults to the precision to -1, which in turn
// (within QLocale::doubleToString) defaults to a maximum of 6 significant
// digits (not decimal digits, as the QString::arg docs claim), which is not
// always enough for the TotalTimeSeconds value to be accurate to the
// millisecond data that the V800 provides. We use 20 digits here, since
// that's the maximum that could ever be present in a quint64 integer,
// however that's likely to be massive overkill for our use case (but does
// no harm, since only the necessary digits are printed anyway).
lap.appendChild(doc.createElement(QLatin1String("TotalTimeSeconds")))
.appendChild(doc.createTextNode(QString::fromLatin1("%1").arg(qMax(
duration, getDuration(firstMap(base.value(QLatin1String("duration"))))/1000.0))));
.appendChild(doc.createTextNode(QString::fromLatin1("%1").arg(
qMax(duration, getDuration(firstMap(base.value(QLatin1String("duration")))))/1000.0,
0, 'g', 20))); // Since quint64 can have supply more than 20 digits.
lap.appendChild(doc.createElement(QLatin1String("DistanceMeters")))
.appendChild(doc.createTextNode(QString::fromLatin1("%1").arg(qMax(
distance, first(base.value(QLatin1String("distance"))).toDouble()))));
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 @@ -152,7 +152,7 @@ class TrainingSession : public QObject {

void addLapStats(QDomDocument &doc, QDomElement &lap,
const QVariantMap &base, const QVariantMap &stats,
const double duration = 0, const double distance = 0) const;
const quint64 duration = 0, const double distance = 0) const;

};

Expand Down
4 changes: 2 additions & 2 deletions test/polar/v2/testdata/training-sessions-19401412.tcx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<Activity Sport="Running">
<Id>2014-07-13T07:26:23+10:00</Id>
<Lap StartTime="2014-07-13T07:26:23+10:00">
<TotalTimeSeconds>1803.88</TotalTimeSeconds>
<TotalTimeSeconds>1803.875</TotalTimeSeconds>
<DistanceMeters>2941.6</DistanceMeters>
<MaximumSpeed>13.896</MaximumSpeed>
<Calories>0</Calories>
Expand Down Expand Up @@ -42340,7 +42340,7 @@
</Track>
</Lap>
<Lap StartTime="2014-07-13T08:25:07+10:00">
<TotalTimeSeconds>1561.62</TotalTimeSeconds>
<TotalTimeSeconds>1561.625</TotalTimeSeconds>
<DistanceMeters>2594.9</DistanceMeters>
<MaximumSpeed>12.888</MaximumSpeed>
<Calories>0</Calories>
Expand Down

0 comments on commit 4cc2ac9

Please sign in to comment.