From 8f7670d93bcbc01defacab5e55f742d1cb9c6d53 Mon Sep 17 00:00:00 2001 From: Greg Lonnon Date: Sun, 17 Jul 2011 19:52:09 -0600 Subject: [PATCH] realtime mode: during a workout, if the +/- keys are hit during a workout, then the rider is able to control the controlller manually. When the next Lap marker is hit, the workout continues. Signed-off-by: Greg Lonnon --- src/TrainTool.cpp | 33 +++++++++++++++++++++++++++++++-- src/TrainTool.h | 3 +++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/TrainTool.cpp b/src/TrainTool.cpp index 9ead0ccaf..354a79dcb 100644 --- a/src/TrainTool.cpp +++ b/src/TrainTool.cpp @@ -183,6 +183,7 @@ TrainTool::TrainTool(MainWindow *parent, const QDir &home) : GcWindow(parent), h load_msecs = total_msecs = lap_msecs = 0; displayWorkoutDistance = displayDistance = displayPower = displayHeartRate = displaySpeed = displayCadence = displayGradient = displayLoad = 0; + manualOverride = false; rideFile = boost::shared_ptr(new RideFile(QDateTime::currentDateTime(),1)); @@ -621,6 +622,7 @@ void TrainTool::Stop(int deviceStatus) // when stop button is pressed hrcount = 0; spdcount = 0; lodcount = 0; + manualOverride = false; displayWorkoutLap = displayLap =0; session_elapsed_msec = 0; session_time.restart(); @@ -812,6 +814,7 @@ void TrainTool::metricsUpdate() void TrainTool::loadUpdate() { + int curLap; long load; double gradient; // the period between loadUpdate calls is not constant, and not exactly LOADRATE, @@ -821,7 +824,18 @@ void TrainTool::loadUpdate() if (deviceController == NULL) return; if (status&RT_MODE_ERGO) { - load = ergFile->wattsAt(load_msecs, displayWorkoutLap); + load = ergFile->wattsAt(load_msecs, curLap); + + if(displayWorkoutLap != curLap) + { + // we are onto a new lap/interval, reset the override + manualOverride = false; + } + if(manualOverride == false) + { + displayLoad = load; + } + displayWorkoutLap = curLap; // we got to the end! if (load == -100) { @@ -832,7 +846,18 @@ void TrainTool::loadUpdate() main->notifySetNow(load_msecs); } } else { - gradient = ergFile->gradientAt(displayWorkoutDistance*1000, displayWorkoutLap); + gradient = ergFile->gradientAt(displayWorkoutDistance*1000, curLap); + + if(displayWorkoutLap != curLap) + { + // we are onto a new lap/interval, reset the override + manualOverride = false; + } + if(manualOverride == false) + { + displayGradient = gradient; + } + displayWorkoutLap = curLap; // we got to the end! if (gradient == -100) { @@ -882,6 +907,8 @@ void TrainTool::Higher() { if (deviceController == NULL) return; + manualOverride = true; + if (status&RT_MODE_ERGO) displayLoad += 5; else displayGradient += 0.1; @@ -897,6 +924,8 @@ void TrainTool::Lower() { if (deviceController == NULL) return; + manualOverride = true; + if (status&RT_MODE_ERGO) displayLoad -= 5; else displayGradient -= 0.1; diff --git a/src/TrainTool.h b/src/TrainTool.h index 8bc5fdb02..4f66fd5e6 100644 --- a/src/TrainTool.h +++ b/src/TrainTool.h @@ -179,6 +179,9 @@ class TrainTool : public GcWindow double kjoules; double bikescore; double xpower; + bool manualOverride; // during an erg woprkout, if the Higher/Lower + // signals are called, it switches to manual + // until the next lap/interval // for non-zero average calcs int pwrcount, cadcount, hrcount, spdcount, lodcount, grdcount; // for NZ average calc