Computrainer Calibration Mode on F3

Pressing F3 on the handlebar controller now starts calibration
mode and pauses all video and recording. Pressing F3 again will
resume the workout and restart.

Fixes #392.
This commit is contained in:
Mark Liversedge
2011-11-25 21:22:06 +00:00
parent 0efbfcb740
commit a5f4dc7503
5 changed files with 95 additions and 7 deletions

View File

@@ -52,6 +52,19 @@ const static uint8_t ss_command[56] = {
0x29, 0x00, 0x00, 0x16, 0x40, 0x00, 0xE0
};
const static uint8_t rrc_command[56] = {
0x31, 0x00, 0x00, 0x0e, 0x40, 0x00, 0xe0,
0x69, 0x00, 0x00, 0x0e, 0x08, 0x00, 0xe0,
0x61, 0x00, 0x00, 0x0e, 0x10, 0x00, 0xe0,
0x78, 0x00, 0x00, 0x0e, 0x18, 0x61, 0xc1,
0x4d, 0x00, 0x00, 0x0e, 0x24, 0x00, 0xe0,
0x6e, 0x00, 0x00, 0x0e, 0x2c, 0x57, 0xc1,
0x3d, 0x00, 0x00, 0x0e, 0x34, 0x00, 0xe0,
0x23, 0x00, 0x00, 0x0e, 0x38, 0x16, 0xc2
};
/* ----------------------------------------------------------------------
* CONSTRUCTOR/DESRTUCTOR
* ---------------------------------------------------------------------- */
@@ -753,6 +766,11 @@ int Computrainer::sendCommand(int mode) // writes a command to the device
return rawWrite(SS_Command, 56);
break;
case CT_CALIBRATE :
return rawWrite(const_cast<uint8_t*>(rrc_command), 56);
break;
default :
return -1;
break;

View File

@@ -83,8 +83,9 @@
#define CT_NONE 0x80
/* Device operation mode */
#define CT_ERGOMODE 0x01
#define CT_SSMODE 0x02
#define CT_ERGOMODE 0x01
#define CT_SSMODE 0x02
#define CT_CALIBRATE 0x04
/* UI operation mode */
#define UI_MANUAL 0x01 // using +/- keys to adjust

View File

@@ -108,6 +108,14 @@ ComputrainerController::getRealtimeData(RealtimeData &rtData)
// BUTTONS
//
// toggle calibration
if (Buttons&CT_F3) {
parent->Calibrate();
}
// ignore other buttons if calibrating
if (parent->calibrating) return;
// ADJUST LOAD
Load = myComputrainer->getLoad();
if ((Buttons&CT_PLUS) && !(Buttons&CT_F3)) {
@@ -118,6 +126,7 @@ ComputrainerController::getRealtimeData(RealtimeData &rtData)
}
rtData.setLoad(Load);
#if 0 // F3 now toggles calibration
// FFWD/REWIND
if ((Buttons&CT_PLUS) && (Buttons&CT_F3)) {
parent->FFwd();
@@ -125,7 +134,7 @@ ComputrainerController::getRealtimeData(RealtimeData &rtData)
if ((Buttons&CT_MINUS) && (Buttons&CT_F3)) {
parent->Rewind();
}
#endif
// LAP/INTERVAL
if (Buttons&CT_F1 && !(Buttons&CT_F3)) {
@@ -164,5 +173,6 @@ ComputrainerController::setMode(int mode)
{
if (mode == RT_MODE_ERGO) mode = CT_ERGOMODE;
if (mode == RT_MODE_SPIN) mode = CT_SSMODE;
if (mode == RT_MODE_CALIBRATE) mode = CT_CALIBRATE;
myComputrainer->setMode(mode);
}

View File

@@ -257,6 +257,7 @@ TrainTool::TrainTool(MainWindow *parent, const QDir &home) : GcWindow(parent), h
deviceController = NULL;
streamController = NULL;
ergFile = NULL;
calibrating = false;
// metric or imperial?
QVariant unit = appsettings->value(this, GC_UNIT);
@@ -677,6 +678,7 @@ void TrainTool::Start() // when start button is pressed
session_elapsed_msec = 0;
lap_time.start();
lap_elapsed_msec = 0;
calibrating = false;
if (status & RT_WORKOUT) {
load_timer->start(LOADRATE); // start recording
@@ -770,6 +772,7 @@ void TrainTool::Stop(int deviceStatus) // when stop button is pressed
deviceController = NULL;
gui_timer->stop();
calibrating = false;
QDateTime now = QDateTime::currentDateTime();
@@ -880,8 +883,10 @@ void TrainTool::guiUpdate() // refreshes the telemetry
rtData.setDistance(displayDistance);
// time
total_msecs = session_elapsed_msec + session_time.elapsed();
lap_msecs = lap_elapsed_msec + lap_time.elapsed();
if (!calibrating) { // freeze time whilst calibrating
total_msecs = session_elapsed_msec + session_time.elapsed();
lap_msecs = lap_elapsed_msec + lap_time.elapsed();
}
rtData.setMsecs(total_msecs);
rtData.setLapMsecs(lap_msecs);
@@ -990,6 +995,8 @@ void TrainTool::diskUpdate()
long Torq = 0, Altitude = 0;
QTextStream recordFileStream(recordFile);
if (calibrating) return;
// convert from milliseconds to minutes
total_msecs = session_elapsed_msec + session_time.elapsed();
Minutes = total_msecs;
@@ -1018,6 +1025,10 @@ void TrainTool::loadUpdate()
int curLap;
long load;
double gradient;
// we hold our horses whilst calibration is taking place...
if (calibrating) return;
// the period between loadUpdate calls is not constant, and not exactly LOADRATE,
// therefore, use a QTime timer to measure the load period
load_msecs += load_period.restart();
@@ -1053,6 +1064,50 @@ void TrainTool::loadUpdate()
}
}
void TrainTool::Calibrate()
{
static QProgressDialog *bar=NULL;
if (deviceController == NULL) return;
// toggle calibration
if (calibrating) {
bar->reset(); // will hide...
// restart gui etc
session_time.start();
lap_time.start();
load_period.restart();
if (status & RT_WORKOUT) load_timer->start(LOADRATE);
main->notifyUnPause(); // get video started again, amongst other things
// back to ergo/slope mode
if (status&RT_MODE_ERGO) deviceController->setMode(RT_MODE_ERGO);
else deviceController->setMode(RT_MODE_SPIN);
} else {
if (bar == NULL) {
QString title = tr("Calibrating...\nPress F3 on Controller when done.");
bar = new QProgressDialog(title, tr("Done"), 0, 0, this);
bar->setWindowModality(Qt::WindowModal);
bar->setMinimumDuration(0);
bar->setAutoClose(true); // hide when reset
connect(bar, SIGNAL(canceled()), this, SLOT(Calibrate()));
}
bar->show();
// pause gui/load but keep recording!
session_elapsed_msec += session_time.elapsed();
lap_elapsed_msec += lap_time.elapsed();
if (status & RT_WORKOUT) load_timer->stop();
load_msecs += load_period.restart();
main->notifyPause(); // get video started again, amongst other things
deviceController->setMode(RT_MODE_CALIBRATE);
}
calibrating = !calibrating;
}
void TrainTool::FFwd()
{
if ((status&RT_RUNNING) == 0) return;

View File

@@ -37,8 +37,10 @@
#include <QDebug>
// Status settings
#define RT_MODE_ERGO 0x0001 // load generation modes
#define RT_MODE_SPIN 0x0002 // spinscan like modes
#define RT_MODE_ERGO 0x0001 // load generation modes
#define RT_MODE_SPIN 0x0002 // spinscan like modes
#define RT_MODE_CALIBRATE 0x0004 // calibrate
#define RT_RUNNING 0x0100 // is running now
#define RT_PAUSED 0x0200 // is paused
#define RT_RECORDING 0x0400 // is recording to disk
@@ -129,6 +131,7 @@ class TrainTool : public GcWindow
void Pause(); // when Paude is pressed
void Stop(int status=0); // when controller wants to stop
void Calibrate(); // toggle calibration mode
void FFwd(); // jump forward when in a workout
void Rewind(); // jump backwards when in a workout
void FFwdLap(); // jump forward to next Lap marker
@@ -214,6 +217,7 @@ class TrainTool : public GcWindow
// everyone else wants this
QCheckBox *recordSelector;
boost::shared_ptr<QFileSystemWatcher> watcher;
bool calibrating;
};
#endif // _GC_TrainTool_h