diff --git a/src/polar/v2/trainingsession.cpp b/src/polar/v2/trainingsession.cpp index 760f3927..5118c5cf 100644 --- a/src/polar/v2/trainingsession.cpp +++ b/src/polar/v2/trainingsession.cpp @@ -2102,7 +2102,7 @@ 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)) @@ -2110,7 +2110,8 @@ QDomDocument TrainingSession::toTCX(const QString &buildTime) const #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()); @@ -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); @@ -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())))); diff --git a/src/polar/v2/trainingsession.h b/src/polar/v2/trainingsession.h index 9a99d864..95a6d7ab 100644 --- a/src/polar/v2/trainingsession.h +++ b/src/polar/v2/trainingsession.h @@ -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; }; diff --git a/test/polar/v2/testdata/training-sessions-19401412.tcx b/test/polar/v2/testdata/training-sessions-19401412.tcx index b7427541..4eb6c49c 100644 --- a/test/polar/v2/testdata/training-sessions-19401412.tcx +++ b/test/polar/v2/testdata/training-sessions-19401412.tcx @@ -4,7 +4,7 @@ 2014-07-13T07:26:23+10:00 - 1803.88 + 1803.875 2941.6 13.896 0 @@ -42340,7 +42340,7 @@ - 1561.62 + 1561.625 2594.9 12.888 0