From b24f154ad45d74abb63a559300f244a6bb3029af Mon Sep 17 00:00:00 2001 From: m_thread Date: Fri, 23 Jan 2015 00:44:50 +0100 Subject: [PATCH] OP-1628 Added handling of autoupdate when board connection is in progress. --- .../plugins/uploader/uploadergadgetwidget.cpp | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp b/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp index ac416a8c6..87003cc14 100644 --- a/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp +++ b/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp @@ -667,6 +667,28 @@ bool UploaderGadgetWidget::autoUpdateCapable() bool UploaderGadgetWidget::autoUpdate(bool erase) { + ExtensionSystem::PluginManager *pluginManager = ExtensionSystem::PluginManager::instance(); + Q_ASSERT(pluginManager); + TelemetryManager *telemetryManager = pluginManager->getObject(); + Q_ASSERT(telemetryManager); + + if (USBMonitor::instance()->availableDevices(0x20a0, -1, -1, -1).length() > 0 && + telemetryManager->connectionState() != TelemetryManager::TELEMETRY_CONNECTED) { + // Wait for the board to completely connect + ResultEventLoop eventLoop; + connect(telemetryManager, SIGNAL(connected()), &eventLoop, SLOT(success())); + + qDebug() << "WAITING..."; + if (telemetryManager->connectionState() != TelemetryManager::TELEMETRY_CONNECTED + && eventLoop.run(AUTOUPDATE_TIMEOUT) != 0) { + emit progressUpdate(FAILURE, QVariant()); + emit autoUpdateFailed(); + return false; + } + qDebug() << "DONE WAITING..."; + + disconnect(telemetryManager, SIGNAL(connected()), &eventLoop, SLOT(success())); + } if (USBMonitor::instance()->availableDevices(0x20a0, -1, -1, -1).length() == 0) { ConnectionWaiter waiter(1, BOARD_EVENT_TIMEOUT); connect(&waiter, SIGNAL(timeChanged(int)), this, SLOT(autoUpdateConnectProgress(int))); @@ -677,7 +699,6 @@ bool UploaderGadgetWidget::autoUpdate(bool erase) } } else { ResultEventLoop eventLoop; - connect(this, SIGNAL(bootloaderSuccess()), &eventLoop, SLOT(success())); connect(this, SIGNAL(bootloaderFailed()), &eventLoop, SLOT(fail())); @@ -782,15 +803,9 @@ bool UploaderGadgetWidget::autoUpdate(bool erase) // Wait for board to connect to GCS again after boot and erase // For older board like CC3D this can take some time - ExtensionSystem::PluginManager *pluginManager = ExtensionSystem::PluginManager::instance(); - Q_ASSERT(pluginManager); - TelemetryManager *telemetryManager = pluginManager->getObject(); - Q_ASSERT(telemetryManager); - if (!telemetryManager->isConnected()) { progressUpdate(BOOTING, erase ? tr(" and erasing settings") : QVariant()); ResultEventLoop eventLoop; - connect(telemetryManager, SIGNAL(connected()), &eventLoop, SLOT(success())); if (eventLoop.run(AUTOUPDATE_TIMEOUT) != 0) {