diff --git a/src/RideFile.cpp b/src/RideFile.cpp index fe8b40bf2..97291ffd0 100644 --- a/src/RideFile.cpp +++ b/src/RideFile.cpp @@ -21,8 +21,51 @@ #include "Settings.h" #include "Units.h" #include +#include // for std::lower_bound #include +#define mark() \ +{ \ + addInterval(start, previous->secs + recIntSecs_, \ + QString("%1").arg(interval)); \ + ++interval; \ + start = point->secs; \ +} + +void +RideFile::fillInIntervals() +{ + if (dataPoints_.empty()) + return; + intervals_.clear(); + double start = 0.0; + int interval = dataPoints().first()->interval; + const RideFilePoint *point, *previous; + foreach (point, dataPoints()) { + if (point->interval != interval) + mark(); + previous = point; + } + mark(); +} + +struct ComparePoints { + bool operator()(const RideFilePoint *p1, const RideFilePoint *p2) { + return p1->secs < p2->secs; + } +}; + +int +RideFile::intervalBegin(const RideFileInterval &interval) const +{ + RideFilePoint p; + p.secs = interval.start; + QVector::const_iterator i = std::lower_bound( + dataPoints_.begin(), dataPoints_.end(), &p, ComparePoints()); + assert(i != dataPoints_.end()); + return i - dataPoints_.begin(); +} + void RideFile::writeAsCsv(QFile &file, bool bIsMetric) const { diff --git a/src/RideFile.h b/src/RideFile.h index 478475660..312f9c135 100644 --- a/src/RideFile.h +++ b/src/RideFile.h @@ -63,6 +63,15 @@ struct RideFileDataPresent kph(false), nm(false), watts(false), alt(false), interval(false) {} }; +struct RideFileInterval +{ + double start, stop; + QString name; + RideFileInterval() : start(0.0), stop(0.0) {} + RideFileInterval(double start, double stop, QString name) : + start(start), stop(stop), name(name) {} +}; + class RideFile { private: @@ -72,6 +81,7 @@ class RideFile QVector dataPoints_; RideFileDataPresent dataPresent; QString deviceType_; + QList intervals_; public: @@ -99,6 +109,13 @@ class RideFile double kph, double nm, double watts, double alt, int interval, double bs=0.0); + const QList &intervals() const { return intervals_; } + void addInterval(double start, double stop, const QString &name) { + intervals_.append(RideFileInterval(start, stop, name)); + } + void fillInIntervals(); + int intervalBegin(const RideFileInterval &interval) const; + void writeAsCsv(QFile &file, bool bIsMetric) const; void resetDataPresent();