Add virtual power support for BT-ATS trainer

Add "BT Advanced Training System" to dropdown.
Implement 3rd-order polynomial to get power from speed.

Fixes #246.
This commit is contained in:
Darren Hague
2011-01-26 23:50:03 +00:00
committed by Mark Liversedge
parent 963c28c7a8
commit 073079a6e7
5 changed files with 29 additions and 3 deletions

View File

@@ -368,6 +368,7 @@ DevicePage::DevicePage(QWidget *parent) : QWidget(parent)
virtualPower->addItem("Power - Kurt Kinetic Cyclone");
virtualPower->addItem("Power - Kurt Kinetic Road Machine");
virtualPower->addItem("Power - Cyclops Fluid 2");
virtualPower->addItem("Power - BT Advanced Training System");
virtualPower->setCurrentIndex(0);
// THIS CODE IS DISABLED FOR THIS RELEASE XXX

View File

@@ -160,6 +160,7 @@ QuarqdClient::parseElement(QString &strBuf) // updates QuarqdClient::telemetry
if (value > 0) {
// TODO: let wheel size be a configurable, default now to 2101 mm
telemetry.setSpeed((value*2101/1000*60)/1000); // meter/minute -> meter/hour -> km/hour
telemetry.setWheelRpm(value);
lastReadSpeed = elapsedTime.elapsed();
}
telemetry.setTime(getTimeStamp(str));

View File

@@ -80,6 +80,19 @@ RealtimeController::processRealtimeData(RealtimeData &rtData)
// http://thebikegeek.blogspot.com/2009/12/while-we-wait-for-better-and-better.html
rtData.setWatts((0.0115*(mph*mph*mph)) - ((0.0137)*(mph*mph)) + ((8.9788)*(mph)));
}
case 4 : // BT-ATS - BT Advanced Training System
{
// v is expressed in revs/second
double v = rtData.getWheelRpm()/60.0;
// using the algorithm from Steven Sansonetti of BT:
// This is a 3rd order polynomial, where P = av3 + bv2 + cv + d
// where:
double a = 2.90390167E-01; // ( 0.290390167)
double b = - 4.61311774E-02; // ( -0.0461311774)
double c = 5.92125507E-01; // (0.592125507)
double d = 0.0;
rtData.setWatts(a*v*v*v + b*v*v +c*v + d);
}
default : // unknown - do nothing
break;
}
@@ -101,6 +114,8 @@ RealtimeController::processSetup()
break;
case 3 : // TODO Cyclops Fluid 2 - use an algorithm
break;
case 4 : // TODO BT-ATS - BT Advanced Training System - use an algorithm
break;
default : // unknown - do nothing
break;
}

View File

@@ -21,7 +21,7 @@
RealtimeData::RealtimeData()
{
watts = hr = speed = cadence = load = 0;
watts = hr = speed = wheelRpm = cadence = load = 0;
time = 0;
}
@@ -41,6 +41,10 @@ void RealtimeData::setSpeed(double speed)
{
this->speed = speed;
}
void RealtimeData::setWheelRpm(double wheelRpm)
{
this->wheelRpm = wheelRpm;
}
void RealtimeData::setCadence(double aCadence)
{
cadence = aCadence;
@@ -66,6 +70,10 @@ double RealtimeData::getSpeed()
{
return speed;
}
double RealtimeData::getWheelRpm()
{
return wheelRpm;
}
double RealtimeData::getCadence()
{
return cadence;

View File

@@ -32,19 +32,20 @@ public:
void setHr(double hr);
void setTime(long time);
void setSpeed(double speed);
void setWheelRpm(double wheelRpm);
void setCadence(double aCadence);
void setLoad(double load);
double getWatts();
double getHr();
long getTime();
double getSpeed();
double getWheelRpm();
double getCadence();
double getLoad();
private:
double hr, watts, speed, load;
unsigned long time;
double hr, watts, speed, wheelRpm, load;
double cadence; // in rpm
};