Files
GoldenCheetah/src/Context.cpp
Jon Escombe f6ccddcf67 Auto-connect telemetry in train view
Auto connects to the selected train device(s), re-connects if device
selection or configuration changes. Adds a temporary button to
manually toggle connected state.

Emits signal on change of view to support connect/disconnect on view change.
Only gathers telemetry when on train view tab, unless during workout.

Decouples the gui timer from session start/stop. Only updates time and
distance if session is running. Passes the running/paused state into
context, and only updates performance plot while running.

Builds list of active devices when connecting - used to disconnect the
previous selections when they have already changed in the device tree widget.

Disables whichever train view controls are not applicable to the current state.

Dependent on timing, the closing ANT channel can transition into a closed state
before it's checked, resulting in it being re-opened.

When the ANT channel is closed and then immediately re-opened (for instance when
changing the device selection in train view), it may generate a libusb error
message. Adds a small delay to the closing, enabling the device to settle.
2016-01-26 15:56:36 +00:00

141 lines
3.9 KiB
C++

/*
* Copyright (c) 2013 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 "Context.h"
#include "Athlete.h"
#include "RideMetric.h"
#include "UserMetricSettings.h"
#include "UserMetricParser.h"
#include <QXmlInputSource>
#include <QXmlSimpleReader>
#include <QMutex>
static QList<Context*> _contexts;
Context::Context(MainWindow *mainWindow): mainWindow(mainWindow)
{
ride = NULL;
workout = NULL;
videosync = NULL;
isfiltered = ishomefiltered = false;
isCompareIntervals = isCompareDateRanges = false;
isRunning = isPaused = false;
#ifdef GC_HAS_CLOUD_DB
cdbChartListDialog = NULL;
#endif
_contexts.append(this);
}
Context::~Context()
{
int i=_contexts.indexOf(this);
if (i >= 0) _contexts.removeAt(i);
}
void
Context::notifyCompareIntervals(bool state)
{
isCompareIntervals = state;
emit compareIntervalsStateChanged(state);
}
void
Context::notifyCompareIntervalsChanged()
{
if (isCompareIntervals) {
emit compareIntervalsChanged();
}
}
void
Context::notifyCompareDateRanges(bool state)
{
isCompareDateRanges = state;
emit compareDateRangesStateChanged(state);
}
void
Context::notifyCompareDateRangesChanged()
{
if (isCompareDateRanges) {
emit compareDateRangesChanged();
}
}
void
Context::notifyConfigChanged(qint32 state)
{
//if (state & CONFIG_ZONES) qDebug()<<"Zones config changed!";
//if (state & CONFIG_ATHLETE) qDebug()<<"Athlete config changed!";
//if (state & CONFIG_GENERAL) qDebug()<<"General config changed!";
//if (state & CONFIG_PMC) qDebug()<<"PMC constants changed!";
//if (state & CONFIG_UNITS) qDebug()<<"Unit of Measure config changed!";
//if (state & CONFIG_APPEARANCE) qDebug()<<"Appearance config changed!";
//if (state & CONFIG_NOTECOLOR) qDebug()<<"Note color config changed!";
//if (state & CONFIG_FIELDS) qDebug()<<"Metadata config changed!";
if (state & CONFIG_USERMETRICS) userMetricsConfigChanged();
configChanged(state);
}
void
Context::userMetricsConfigChanged()
{
// read em in...
QString metrics = QString("%1/../usermetrics.xml").arg(athlete->home->root().absolutePath());
if (QFile(metrics).exists()) {
QFile metricfile(metrics);
QXmlInputSource source(&metricfile);
QXmlSimpleReader xmlReader;
UserMetricParser handler;
xmlReader.setContentHandler(&handler);
xmlReader.setErrorHandler(&handler);
// parse and get return values
xmlReader.parse(source);
_userMetrics = handler.getSettings();
}
// change the schema version
quint16 changed = RideMetric::userMetricFingerprint(_userMetrics);
if (UserMetricSchemaVersion != changed) {
// we'll fix it
UserMetricSchemaVersion = changed;
// update metric factory
RideMetricFactory::instance().removeUserMetrics();
// now add initial metrics -- what about multiple contexts (?) XXX
foreach(UserMetricSettings m, _userMetrics) {
RideMetricFactory::instance().addMetric(UserMetric(this, m));
}
// tell eveyone else to compute metrics...
foreach(Context *x, _contexts)
if (x != this)
x->notifyConfigChanged(CONFIG_USERMETRICS);
}
}