API List Intervals

.. add an intervals=true|false to the fetch
   ride list URL to enable fetching of interval
   metrics as well as ride metrics.

   e.g.
   http://localhost:12021/athlete?intervals=true&metrics=Work,IF
This commit is contained in:
Mark Liversedge
2015-09-14 09:28:04 +01:00
parent 0fd06e4506
commit 022e20fcb8
5 changed files with 84 additions and 17 deletions

View File

@@ -13,6 +13,7 @@ HttpResponse::HttpResponse(QTcpSocket* socket) {
sentLastPart=false;
buffersize=40960;
barry.reserve(40960);
userdata_=NULL;
}
void HttpResponse::setHeader(QByteArray name, QByteArray value) {

View File

@@ -90,6 +90,10 @@ public:
void bwrite(QByteArray data);
void flush();
// user data for response
void setUserData(void *here) { userdata_ = here; }
void *userData() { return userdata_; }
/**
Indicates wheter the body has been sent completely. Used by the connection
handler to terminate the body automatically when necessary.
@@ -143,6 +147,8 @@ private:
int buffersize;
QByteArray barry;
void *userdata_;
};
#endif // HTTPRESPONSE_H

View File

@@ -163,6 +163,48 @@ APIWebService::writeRideLine(QList<int> wanted, RideItem &item, HttpRequest *req
if (item.dateTime.date() < since) return;
if (item.dateTime.date() > before) return;
// are we doing rides or intervals?
listRideSettings *settings = static_cast<listRideSettings *>(response->userData());
if (settings->intervals == true) {
// loop through all available intervals for this ride item
foreach(IntervalItem *interval, item.intervals()){
// date, time, filename
response->bwrite(item.dateTime.date().toString("yyyy/MM/dd").toLocal8Bit());
response->bwrite(", ");
response->bwrite(item.dateTime.time().toString("hh:mm:ss").toLocal8Bit());;
response->bwrite(", ");
response->bwrite(item.fileName.toLocal8Bit());
// now the interval name and type
response->bwrite(", \"");
response->bwrite(interval->name.toLocal8Bit());
response->bwrite("\", ");
response->bwrite(QString("%1").arg(static_cast<int>(interval->type)).toLocal8Bit());
// essentially the same as below .. cut and paste (refactor?XXX)
if (wanted.count()) {
// specific metrics
foreach(int index, wanted) {
double value = interval->metrics()[index];
response->bwrite(",");
response->bwrite(QString("%1").arg(value, 'f').simplified().toLocal8Bit());
}
} else {
// all metrics...
foreach(double value, interval->metrics()) {
response->bwrite(",");
response->bwrite(QString("%1").arg(value, 'f').simplified().toLocal8Bit());
}
}
response->bwrite("\n");
}
} else {
// date, time, filename
response->bwrite(item.dateTime.date().toString("yyyy/MM/dd").toLocal8Bit());
response->bwrite(",");
@@ -187,6 +229,7 @@ APIWebService::writeRideLine(QList<int> wanted, RideItem &item, HttpRequest *req
}
response->bwrite("\n");
}
}
void
APIWebService::listActivity(QString athlete, QStringList paths, HttpRequest &request, HttpResponse &response)

View File

@@ -23,6 +23,10 @@
#include "RideItem.h"
#include <QDir>
struct listRideSettings {
bool intervals;
};
class APIWebService : public HttpRequestHandler
{

View File

@@ -471,6 +471,8 @@ void RideCache::save()
void
APIWebService::listRides(QString athlete, HttpRequest &request, HttpResponse &response)
{
listRideSettings settings;
// the ride db
QString ridedb = QString("%1/%2/cache/rideDB.json").arg(home.absolutePath()).arg(athlete);
QFile rideDB(ridedb);
@@ -485,6 +487,14 @@ APIWebService::listRides(QString athlete, HttpRequest &request, HttpResponse &re
return;
}
// intervals or rides?
QString intervalsp = request.getParameter("intervals");
if (intervalsp.toUpper() == "TRUE") settings.intervals = true;
else settings.intervals = false;
// set user data
response.setUserData(&settings);
// write headings
const RideMetricFactory &factory = RideMetricFactory::instance();
QVector<const RideMetric *> indexed(factory.metricCount());
@@ -507,6 +517,9 @@ APIWebService::listRides(QString athlete, HttpRequest &request, HttpResponse &re
// write headings
response.bwrite("date, time, filename");
// if intervals, add interval name
if (settings.intervals == true) response.bwrite(", interval name, interval type");
int i=0;
foreach(const RideMetric *m, indexed) {