SML Lap Swimming support

Samples of swimming type are used to update distance and speed
of periodic samples, cadence is computed counting Stroke events.
Includes test file contributed by Serban Mestecaneanu
This commit is contained in:
Alejandro Martinez
2015-11-18 22:43:43 -03:00
parent b99606197d
commit 66ffaee5db
3 changed files with 8866 additions and 2 deletions

View File

@@ -28,6 +28,8 @@
#include "TimeUtils.h"
#include <cmath>
#define SMLdebug false // Lap Swimming debug
SmlParser::SmlParser(RideFile* rideFile) : rideFile(rideFile)
{
cad = 0;
@@ -35,6 +37,7 @@ SmlParser::SmlParser(RideFile* rideFile) : rideFile(rideFile)
distance = 0;
lastDistance = 0;
lastTime = 0;
lastLength = 0;
lastLat = lastLon = 0;
watts = 0;
alt = 0;
@@ -43,8 +46,10 @@ SmlParser::SmlParser(RideFile* rideFile) : rideFile(rideFile)
hr = 0;
temp = RideFile::NoTemp;
periodic = false;
swimming = false;
header = false;
lap = 0;
strokes = 0;
}
bool
@@ -71,6 +76,7 @@ SmlParser::startElement(const QString&, const QString&,
hr = 0;
temp = RideFile::NoTemp;
periodic = false;
swimming = false;
}
return true;
}
@@ -157,6 +163,11 @@ SmlParser::endElement(const QString&, const QString&, const QString& qName)
else if (qName == "SampleType")
{
periodic = (buffer == "periodic");
swimming = (buffer == "swimming");
}
else if (qName == "Type")
{
if (buffer == "Stroke") strokes++;
}
@@ -219,17 +230,43 @@ SmlParser::endElement(const QString&, const QString&, const QString& qName)
// Record point on periodic samples only
if (periodic && round(time) > round(lastTime)) {
rideFile->appendPoint(round(time), cad, hr, distance, speed, 0,
if (distance > lastDistance) lastDistance = distance;
rideFile->appendPoint(round(time), cad, hr, lastDistance, speed, 0,
watts, alt, lon, lat, 0, 0.0, temp, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, lap);
// update the "lasts"
lastTime = time;
lastDistance = distance;
}
lastLon = lon;
lastLat = lat;
// Update distance, speed and cadence for swimming lengths
if (swimming && distance > 0.0 && time > lastLength) {
if (SMLdebug) qDebug() << "Time" << time << "Distance" << distance << "lastLength" << lastLength << "lastDistance" << lastDistance;
if (distance > lastDistance) {
double deltaSecs = round(time) - lastLength;
double deltaDist = (distance - lastDistance) / deltaSecs;
double kph = 3600.0 * deltaDist;
double cad = 60 * strokes / deltaSecs;
for (int i = rideFile->timeIndex(lastLength);
i>= 0 && i < rideFile->dataPoints().size() &&
rideFile->dataPoints()[i]->secs <= round(time);
++i) {
rideFile->dataPoints()[i]->kph = kph;
rideFile->dataPoints()[i]->cad = cad;
rideFile->dataPoints()[i]->km = lastDistance;
lastDistance += deltaDist;
}
lastDistance = distance;
strokes = 0;
if (kph > 0.0) rideFile->setDataPresent(rideFile->kph, true);
if (cad > 0.0) rideFile->setDataPresent(rideFile->cad, true);
if (SMLdebug) qDebug() << " kph" << kph;
}
lastLength = round(time);
}
}
return true;

View File

@@ -50,6 +50,7 @@ private:
double lastTime;
double time;
double lastDistance;
double lastLength;
double lastLat, lastLon;
double alt;
@@ -62,7 +63,9 @@ private:
double distance;
double watts;
bool periodic;
bool swimming;
int lap;
int strokes;
// header processing state
bool header;

File diff suppressed because it is too large Load Diff