mirror of
https://github.com/GoldenCheetah/GoldenCheetah.git
synced 2026-02-13 16:18:42 +00:00
Compare commits
5 Commits
v3.4.1-DEV
...
release_1.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
30c877a5f2 | ||
|
|
92d2601a5a | ||
|
|
113375669f | ||
|
|
cd0e9c184b | ||
|
|
28cbe359d4 |
@@ -33,15 +33,18 @@ CommPort::addListFunction(ListFunction f)
|
|||||||
QVector<CommPortPtr>
|
QVector<CommPortPtr>
|
||||||
CommPort::listCommPorts(QString &err)
|
CommPort::listCommPorts(QString &err)
|
||||||
{
|
{
|
||||||
err = "";
|
QStringList errors;
|
||||||
QVector<CommPortPtr> result;
|
QVector<CommPortPtr> result;
|
||||||
for (int i = 0; listFunctions && i < listFunctions->size(); ++i) {
|
for (int i = 0; listFunctions && i < listFunctions->size(); ++i) {
|
||||||
QVector<CommPortPtr> tmp = (*listFunctions)[i](err);
|
QString thisError = "";
|
||||||
if (err == "")
|
QVector<CommPortPtr> tmp = (*listFunctions)[i](thisError);
|
||||||
|
if (thisError == "")
|
||||||
result << tmp;
|
result << tmp;
|
||||||
else
|
else
|
||||||
err += "\n";
|
errors << thisError;
|
||||||
}
|
}
|
||||||
|
if (result.isEmpty() && !errors.isEmpty())
|
||||||
|
err = errors.join("\n");
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,15 +49,18 @@ DownloadRideDialog::DownloadRideDialog(MainWindow *mainWindow,
|
|||||||
}
|
}
|
||||||
|
|
||||||
downloadButton = new QPushButton(tr("&Download"), this);
|
downloadButton = new QPushButton(tr("&Download"), this);
|
||||||
|
eraseRideButton = new QPushButton(tr("&Erase Ride(s)"), this);
|
||||||
rescanButton = new QPushButton(tr("&Rescan"), this);
|
rescanButton = new QPushButton(tr("&Rescan"), this);
|
||||||
cancelButton = new QPushButton(tr("&Cancel"), this);
|
cancelButton = new QPushButton(tr("&Cancel"), this);
|
||||||
|
|
||||||
connect(downloadButton, SIGNAL(clicked()), this, SLOT(downloadClicked()));
|
connect(downloadButton, SIGNAL(clicked()), this, SLOT(downloadClicked()));
|
||||||
|
connect(eraseRideButton, SIGNAL(clicked()), this, SLOT(eraseClicked()));
|
||||||
connect(rescanButton, SIGNAL(clicked()), this, SLOT(scanCommPorts()));
|
connect(rescanButton, SIGNAL(clicked()), this, SLOT(scanCommPorts()));
|
||||||
connect(cancelButton, SIGNAL(clicked()), this, SLOT(cancelClicked()));
|
connect(cancelButton, SIGNAL(clicked()), this, SLOT(cancelClicked()));
|
||||||
|
|
||||||
QHBoxLayout *buttonLayout = new QHBoxLayout;
|
QHBoxLayout *buttonLayout = new QHBoxLayout;
|
||||||
buttonLayout->addWidget(downloadButton);
|
buttonLayout->addWidget(downloadButton);
|
||||||
|
buttonLayout->addWidget(eraseRideButton);
|
||||||
buttonLayout->addWidget(rescanButton);
|
buttonLayout->addWidget(rescanButton);
|
||||||
buttonLayout->addWidget(cancelButton);
|
buttonLayout->addWidget(cancelButton);
|
||||||
|
|
||||||
@@ -81,6 +84,7 @@ DownloadRideDialog::setReadyInstruct()
|
|||||||
"unit is plugged into the computer,\n"
|
"unit is plugged into the computer,\n"
|
||||||
"then click \"Rescan\" to check again."));
|
"then click \"Rescan\" to check again."));
|
||||||
downloadButton->setEnabled(false);
|
downloadButton->setEnabled(false);
|
||||||
|
eraseRideButton->setEnabled(false);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Device &device = Device::device(deviceCombo->currentText());
|
Device &device = Device::device(deviceCombo->currentText());
|
||||||
@@ -90,6 +94,8 @@ DownloadRideDialog::setReadyInstruct()
|
|||||||
else
|
else
|
||||||
label->setText(inst + ", \nthen click Download.");
|
label->setText(inst + ", \nthen click Download.");
|
||||||
downloadButton->setEnabled(true);
|
downloadButton->setEnabled(true);
|
||||||
|
if (deviceCombo->currentText() == "SRM") // only SRM supports erase ride for now
|
||||||
|
eraseRideButton->setEnabled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,8 +106,8 @@ DownloadRideDialog::scanCommPorts()
|
|||||||
QString err;
|
QString err;
|
||||||
devList = CommPort::listCommPorts(err);
|
devList = CommPort::listCommPorts(err);
|
||||||
if (err != "") {
|
if (err != "") {
|
||||||
QString msg = "Warning:\n\n" + err + "You may need to (re)install "
|
QString msg = "Warning(s):\n\n" + err + "\n\nYou may need to (re)install "
|
||||||
"the FTDI drivers before downloading.";
|
"the FTDI or PL2303 drivers before downloading.";
|
||||||
QMessageBox::warning(0, "Error Loading Device Drivers", msg,
|
QMessageBox::warning(0, "Error Loading Device Drivers", msg,
|
||||||
QMessageBox::Ok, QMessageBox::NoButton);
|
QMessageBox::Ok, QMessageBox::NoButton);
|
||||||
}
|
}
|
||||||
@@ -133,6 +139,7 @@ void
|
|||||||
DownloadRideDialog::downloadClicked()
|
DownloadRideDialog::downloadClicked()
|
||||||
{
|
{
|
||||||
downloadButton->setEnabled(false);
|
downloadButton->setEnabled(false);
|
||||||
|
eraseRideButton->setEnabled(false);
|
||||||
rescanButton->setEnabled(false);
|
rescanButton->setEnabled(false);
|
||||||
downloadInProgress = true;
|
downloadInProgress = true;
|
||||||
CommPortPtr dev;
|
CommPortPtr dev;
|
||||||
@@ -211,6 +218,27 @@ DownloadRideDialog::downloadClicked()
|
|||||||
accept();
|
accept();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DownloadRideDialog::eraseClicked()
|
||||||
|
{
|
||||||
|
downloadButton->setEnabled(false);
|
||||||
|
eraseRideButton->setEnabled(false);
|
||||||
|
rescanButton->setEnabled(false);
|
||||||
|
downloadInProgress = true;
|
||||||
|
CommPortPtr dev;
|
||||||
|
for (int i = 0; i < devList.size(); ++i) {
|
||||||
|
if (devList[i]->name() == portCombo->currentText()) {
|
||||||
|
dev = devList[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert(dev);
|
||||||
|
Device &device = Device::device(deviceCombo->currentText());
|
||||||
|
device.cleanup(dev);
|
||||||
|
downloadInProgress = false;
|
||||||
|
accept();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
DownloadRideDialog::cancelClicked()
|
DownloadRideDialog::cancelClicked()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ class DownloadRideDialog : public QDialog
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void downloadClicked();
|
void downloadClicked();
|
||||||
|
void eraseClicked();
|
||||||
void cancelClicked();
|
void cancelClicked();
|
||||||
void setReadyInstruct();
|
void setReadyInstruct();
|
||||||
void scanCommPorts();
|
void scanCommPorts();
|
||||||
@@ -44,7 +45,7 @@ class DownloadRideDialog : public QDialog
|
|||||||
|
|
||||||
MainWindow *mainWindow;
|
MainWindow *mainWindow;
|
||||||
QDir home;
|
QDir home;
|
||||||
QPushButton *downloadButton, *rescanButton, *cancelButton;
|
QPushButton *downloadButton, *eraseRideButton, *rescanButton, *cancelButton;
|
||||||
QComboBox *portCombo, *deviceCombo;
|
QComboBox *portCombo, *deviceCombo;
|
||||||
QLabel *label;
|
QLabel *label;
|
||||||
|
|
||||||
|
|||||||
@@ -93,6 +93,7 @@ PerformanceManagerWindow::PerformanceManagerWindow(MainWindow *mainWindow) :
|
|||||||
SLOT(PMpickerMoved(const QPoint &)));
|
SLOT(PMpickerMoved(const QPoint &)));
|
||||||
connect(metricCombo, SIGNAL(currentIndexChanged(int)),
|
connect(metricCombo, SIGNAL(currentIndexChanged(int)),
|
||||||
this, SLOT(replot()));
|
this, SLOT(replot()));
|
||||||
|
connect(mainWindow, SIGNAL(configChanged()), this, SLOT(configChanged()));
|
||||||
}
|
}
|
||||||
|
|
||||||
PerformanceManagerWindow::~PerformanceManagerWindow()
|
PerformanceManagerWindow::~PerformanceManagerWindow()
|
||||||
@@ -101,6 +102,13 @@ PerformanceManagerWindow::~PerformanceManagerWindow()
|
|||||||
delete sc;
|
delete sc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PerformanceManagerWindow::configChanged()
|
||||||
|
{
|
||||||
|
mainWindow->home.remove("stress.cache");
|
||||||
|
days = 0; // force replot
|
||||||
|
replot();
|
||||||
|
}
|
||||||
|
|
||||||
void PerformanceManagerWindow::setActive(bool value)
|
void PerformanceManagerWindow::setActive(bool value)
|
||||||
{
|
{
|
||||||
if (value)
|
if (value)
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ class PerformanceManagerWindow : public QWidget
|
|||||||
void PMpickerMoved(const QPoint &pos);
|
void PMpickerMoved(const QPoint &pos);
|
||||||
void setPMSizeFromSlider();
|
void setPMSizeFromSlider();
|
||||||
void replot();
|
void replot();
|
||||||
|
void configChanged();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ RideMetric::computeMetrics(const RideFile *ride, const Zones *zones,
|
|||||||
QHash<QString,RideMetric*> done;
|
QHash<QString,RideMetric*> done;
|
||||||
while (!todo.isEmpty()) {
|
while (!todo.isEmpty()) {
|
||||||
QString symbol = todo.takeFirst();
|
QString symbol = todo.takeFirst();
|
||||||
|
if (!factory.haveMetric(symbol)) continue;
|
||||||
const QVector<QString> &deps = factory.dependencies(symbol);
|
const QVector<QString> &deps = factory.dependencies(symbol);
|
||||||
bool ready = true;
|
bool ready = true;
|
||||||
foreach (QString dep, deps) {
|
foreach (QString dep, deps) {
|
||||||
|
|||||||
@@ -114,11 +114,21 @@ class RideMetricFactory {
|
|||||||
QVector<QString> metricNames;
|
QVector<QString> metricNames;
|
||||||
QHash<QString,RideMetric*> metrics;
|
QHash<QString,RideMetric*> metrics;
|
||||||
QHash<QString,QVector<QString>*> dependencyMap;
|
QHash<QString,QVector<QString>*> dependencyMap;
|
||||||
|
bool dependenciesChecked;
|
||||||
|
|
||||||
RideMetricFactory() {}
|
RideMetricFactory() : dependenciesChecked(false) {}
|
||||||
RideMetricFactory(const RideMetricFactory &other);
|
RideMetricFactory(const RideMetricFactory &other);
|
||||||
RideMetricFactory &operator=(const RideMetricFactory &other);
|
RideMetricFactory &operator=(const RideMetricFactory &other);
|
||||||
|
|
||||||
|
void checkDependencies() const {
|
||||||
|
if (dependenciesChecked) return;
|
||||||
|
foreach(const QString &dependee, dependencyMap.keys()) {
|
||||||
|
foreach(const QString &dependency, *dependencyMap[dependee])
|
||||||
|
assert(metrics.contains(dependency));
|
||||||
|
}
|
||||||
|
const_cast<RideMetricFactory*>(this)->dependenciesChecked = true;
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
static RideMetricFactory &instance() {
|
static RideMetricFactory &instance() {
|
||||||
@@ -137,6 +147,7 @@ class RideMetricFactory {
|
|||||||
|
|
||||||
RideMetric *newMetric(const QString &symbol) const {
|
RideMetric *newMetric(const QString &symbol) const {
|
||||||
assert(metrics.contains(symbol));
|
assert(metrics.contains(symbol));
|
||||||
|
checkDependencies();
|
||||||
return metrics.value(symbol)->clone();
|
return metrics.value(symbol)->clone();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -147,11 +158,10 @@ class RideMetricFactory {
|
|||||||
metricNames.append(metric.symbol());
|
metricNames.append(metric.symbol());
|
||||||
if (deps) {
|
if (deps) {
|
||||||
QVector<QString> *copy = new QVector<QString>;
|
QVector<QString> *copy = new QVector<QString>;
|
||||||
for (int i = 0; i < deps->size(); ++i) {
|
for (int i = 0; i < deps->size(); ++i)
|
||||||
assert(metrics.contains((*deps)[i]));
|
|
||||||
copy->append((*deps)[i]);
|
copy->append((*deps)[i]);
|
||||||
}
|
|
||||||
dependencyMap.insert(metric.symbol(), copy);
|
dependencyMap.insert(metric.symbol(), copy);
|
||||||
|
dependenciesChecked = false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -197,6 +197,7 @@ RideSummaryWindow::htmlSummary() const
|
|||||||
summary += "<td align=\"center\" valign=\"bottom\">Interval Name</td>";
|
summary += "<td align=\"center\" valign=\"bottom\">Interval Name</td>";
|
||||||
foreach (QString symbol, intervalMetrics) {
|
foreach (QString symbol, intervalMetrics) {
|
||||||
RideMetricPtr m = metrics.value(symbol);
|
RideMetricPtr m = metrics.value(symbol);
|
||||||
|
if (!m) continue;
|
||||||
summary += "<td align=\"center\" valign=\"bottom\">" + m->name();
|
summary += "<td align=\"center\" valign=\"bottom\">" + m->name();
|
||||||
if (m->units(metricUnits) == "seconds")
|
if (m->units(metricUnits) == "seconds")
|
||||||
; // don't do anything
|
; // don't do anything
|
||||||
@@ -218,6 +219,7 @@ RideSummaryWindow::htmlSummary() const
|
|||||||
summary += "<td align=\"center\">" + interval.name + "</td>";
|
summary += "<td align=\"center\">" + interval.name + "</td>";
|
||||||
foreach (QString symbol, intervalMetrics) {
|
foreach (QString symbol, intervalMetrics) {
|
||||||
RideMetricPtr m = metrics.value(symbol);
|
RideMetricPtr m = metrics.value(symbol);
|
||||||
|
if (!m) continue;
|
||||||
QString s("<td align=\"center\">%1</td>");
|
QString s("<td align=\"center\">%1</td>");
|
||||||
if (m->units(metricUnits) == "seconds")
|
if (m->units(metricUnits) == "seconds")
|
||||||
summary += s.arg(time_to_string(m->value(metricUnits)));
|
summary += s.arg(time_to_string(m->value(metricUnits)));
|
||||||
|
|||||||
@@ -398,6 +398,8 @@ Serial::myListCommPorts(QString &err)
|
|||||||
QVector<CommPortPtr> result;
|
QVector<CommPortPtr> result;
|
||||||
char *devices[MAX_DEVICES];
|
char *devices[MAX_DEVICES];
|
||||||
int devcnt = find_devices(devices, MAX_DEVICES);
|
int devcnt = find_devices(devices, MAX_DEVICES);
|
||||||
|
if (devcnt == 0)
|
||||||
|
err = "No serial devices found.";
|
||||||
for (int i = 0; i < devcnt; ++i) {
|
for (int i = 0; i < devcnt; ++i) {
|
||||||
result.append(CommPortPtr(new Serial(devices[i])));
|
result.append(CommPortPtr(new Serial(devices[i])));
|
||||||
free(devices[i]);
|
free(devices[i]);
|
||||||
|
|||||||
@@ -135,8 +135,8 @@ SrmDevice::cleanup(CommPortPtr dev)
|
|||||||
if (!dev2path(dev, path, err))
|
if (!dev2path(dev, path, err))
|
||||||
assert(false);
|
assert(false);
|
||||||
if (QMessageBox::question(0, "Powercontrol",
|
if (QMessageBox::question(0, "Powercontrol",
|
||||||
"Erase downloaded ride from device memory?",
|
"Erase ride from device memory?",
|
||||||
"&Erase", "&Save Only", "", 1, 1) == 0) {
|
"&Erase", "&Cancel", "", 1, 1) == 0) {
|
||||||
SrmpcConn srm(path);
|
SrmpcConn srm(path);
|
||||||
if(!srm.d || (srmpc_clear_chunks(srm.d) < 0)) {
|
if(!srm.d || (srmpc_clear_chunks(srm.d) < 0)) {
|
||||||
QMessageBox::warning(0, "Error",
|
QMessageBox::warning(0, "Error",
|
||||||
|
|||||||
Reference in New Issue
Block a user