Files
GoldenCheetah/src/FortiusController.cpp
Mark Liversedge 43b1c61d6b Add Device Wizard
Introduce a wizard for adding realtime devices since it
is prone to user error, is relatively complicated and is
something most users will only ever do once or twice.

There are several logical updates within this patch:

First; Fix intermittent ANT+ not working
* LibUsb     - check bufRemaining is > 0 not non-zero
* LibUsb     - Always reset the USB stick on open
* ANT.cpp    - Support > 4 channels on USB2
* ANTChannel -  Do not use pairing, but always
*               unassign, assign and set channel id.

Second; Fix device discovery
* Find and discover support in realtime controllers
* Extend Serial.cpp to cover more Serial devices
* Support for 4 or 8 ANT channels for USB1/USB2

Third; Introduce Add Device Wizard with
* General and Specific wizard pages for each device type
* Device pairing with telemetry display
* fixed compile time warnings

Fourth; Update Device Config Page
* use wizard to add new device
* remove edit fields, replaced by wizard
* remove pair, firmware buttons replaced by wizard

Fifth; Deprecate/Remove Device Types
* Null Device - used by developers only
* Quarqd client - replaced by Native ANT+
* GC Server - not implemented yet

I have also introduced a device specific wheel size
and flags for controlling the default selection and
sources for sensor data when in multi-device mode. These
are not yet supported in the code.

Fixes #611.
Fixes #497.
2012-01-21 20:28:33 +00:00

153 lines
3.6 KiB
C++

/*
* Copyright (c) 2011 Mark Liversedge (liversedge@gmail.com)
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc., 51
* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "FortiusController.h"
#include "Fortius.h"
#include "RealtimeData.h"
FortiusController::FortiusController(TrainTool *parent, DeviceConfiguration *dc) : RealtimeController(parent, dc)
{
myFortius = new Fortius (parent);
}
int
FortiusController::start()
{
return myFortius->start();
}
int
FortiusController::restart()
{
return myFortius->restart();
}
int
FortiusController::pause()
{
return myFortius->pause();
}
int
FortiusController::stop()
{
return myFortius->stop();
}
bool
FortiusController::find()
{
return myFortius->find(); // needs to find either unconfigured or configured device
}
bool
FortiusController::discover(DeviceConfiguration *) {return false; } // NOT IMPLEMENTED YET
bool FortiusController::doesPush() { return false; }
bool FortiusController::doesPull() { return true; }
bool FortiusController::doesLoad() { return true; }
/*
* gets called from the GUI to get updated telemetry.
* so whilst we are at it we check button status too and
* act accordingly.
*
*/
void
FortiusController::getRealtimeData(RealtimeData &rtData)
{
int Buttons, Status;
double Power, HeartRate, Cadence, Speed, Load;
if(!myFortius->isRunning())
{
QMessageBox msgBox;
msgBox.setText("Cannot Connect to Fortius");
msgBox.setIcon(QMessageBox::Critical);
msgBox.exec();
parent->Stop(1);
return;
}
// get latest telemetry
myFortius->getTelemetry(Power, HeartRate, Cadence, Speed, Buttons, Status);
//
// PASS BACK TELEMETRY
//
rtData.setWatts(Power);
rtData.setHr(HeartRate);
rtData.setCadence(Cadence);
rtData.setSpeed(Speed);
// get current load
Load = myFortius->getLoad();
// post processing, probably not used
// since its used to compute power for
// non-power devices, but we may add other
// calculations later that might apply
// means we could calculate power based
// upon speed even for a Fortius!
processRealtimeData(rtData);
//
// BUTTONS
//
// ignore other buttons if calibrating
if (parent->calibrating) return;
// ADJUST LOAD
if ((Buttons&FT_PLUS)) parent->Higher();
if ((Buttons&FT_MINUS)) parent->Lower();
// LAP/INTERVAL
if (Buttons&FT_ENTER) parent->newLap();
// CANCEL
if (Buttons&FT_CANCEL) parent->Stop(0);
rtData.setLoad(Load);
}
void FortiusController::pushRealtimeData(RealtimeData &) { } // update realtime data with current values
void
FortiusController::setLoad(double load)
{
myFortius->setLoad(load);
}
void
FortiusController::setGradient(double grade)
{
myFortius->setGradient(grade);
}
void
FortiusController::setMode(int mode)
{
if (mode == RT_MODE_ERGO) mode = FT_ERGOMODE;
if (mode == RT_MODE_SPIN) mode = FT_SSMODE;
myFortius->setMode(mode);
}