diff --git a/src/uas/QGCUASFileManager.cc b/src/uas/QGCUASFileManager.cc index 41b726d993f7f52873cf71bee87b5490470143b4..3728c9690602e96cfb6a9feff5fdf9372eed9995 100644 --- a/src/uas/QGCUASFileManager.cc +++ b/src/uas/QGCUASFileManager.cc @@ -471,15 +471,19 @@ void QGCUASFileManager::_clearAckTimeout(void) /// @brief Called when ack timeout timer fires void QGCUASFileManager::_ackTimeout(void) { - _emitErrorMessage(tr("Timeout waiting for ack")); + // Make sure to set _currentOperation state before emitting error message. Code may respond + // to error message signal by sending another command, which will fail if state is not back + // to idle. FileView UI works this way with the List command. switch (_currentOperation) { case kCORead: _currentOperation = kCOAck; + _emitErrorMessage(tr("Timeout waiting for ack: Sending Terminate command")); _sendTerminateCommand(); break; default: _currentOperation = kCOIdle; + _emitErrorMessage(tr("Timeout waiting for ack")); break; } } diff --git a/src/ui/QGCUASFileView.cc b/src/ui/QGCUASFileView.cc index 0635b4c0534792e5a11c24b48a69c0c7b83bcad5..3164040d3ac6a9c12b2f31e8e9df4d76a4075fc7 100644 --- a/src/ui/QGCUASFileView.cc +++ b/src/ui/QGCUASFileView.cc @@ -40,7 +40,9 @@ QGCUASFileView::QGCUASFileView(QWidget *parent, QGCUASFileManager *manager) : Q_ASSERT(success); success = connect(_ui.treeWidget, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(_currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*))); Q_ASSERT(success); - Q_UNUSED(success); + success = connect(&_listCompleteTimer, SIGNAL(timeout()), this, SLOT(_listCompleteTimeout())); + Q_ASSERT(success); + Q_UNUSED(success); // Silence retail unused variable error } void QGCUASFileView::_downloadFiles(void) @@ -88,8 +90,7 @@ void QGCUASFileView::_refreshTree(void) // Don't queue up more than once _ui.listFilesButton->setEnabled(false); - qDebug() << "List: /"; - _manager->listDirectory("/"); + _requestDirectoryList("/"); } void QGCUASFileView::_treeStatusMessage(const QString& msg) @@ -128,6 +129,8 @@ void QGCUASFileView::_treeErrorMessage(const QString& msg) void QGCUASFileView::_listComplete(void) { + _clearListCompleteTimeout(); + // Walk the current items, traversing down into directories Again: @@ -159,8 +162,7 @@ Again: QTreeWidgetItem* item = _walkItemStack[i]; dir.append("/" + item->text(0)); } - qDebug() << "List:" << dir; - _manager->listDirectory(dir); + _requestDirectoryList(dir); } else { // We have run out of items at the this level, pop the stack and keep going at that level _walkIndexStack.removeLast(); @@ -192,3 +194,30 @@ void QGCUASFileView::_currentItemChanged(QTreeWidgetItem* current, QTreeWidgetIt Q_UNUSED(previous); _ui.downloadButton->setEnabled(current ? (current->type() == _typeFile) : false); } + +void QGCUASFileView::_setupListCompleteTimeout(void) +{ + Q_ASSERT(!_listCompleteTimer.isActive()); + + _listCompleteTimer.setSingleShot(true); + _listCompleteTimer.start(_listCompleteTimerTimeoutMsecs); +} + +void QGCUASFileView::_clearListCompleteTimeout(void) +{ + Q_ASSERT(_listCompleteTimer.isActive()); + + _listCompleteTimer.stop(); +} + +void QGCUASFileView::_listCompleteTimeout(void) +{ + _treeErrorMessage(tr("Timeout waiting for listComplete signal")); +} + +void QGCUASFileView::_requestDirectoryList(const QString& dir) +{ + qDebug() << "List:" << dir; + _setupListCompleteTimeout(); + _manager->listDirectory(dir); +} diff --git a/src/ui/QGCUASFileView.h b/src/ui/QGCUASFileView.h index 0b33e5b3b35e7b1f9b15044546dcecbd8a9a382e..102491587650b3af93d496b23856c0748122ceae 100644 --- a/src/ui/QGCUASFileView.h +++ b/src/ui/QGCUASFileView.h @@ -48,12 +48,20 @@ private slots: void _listComplete(void); void _downloadStatusMessage(const QString& msg); void _currentItemChanged(QTreeWidgetItem* current, QTreeWidgetItem* previous); + void _listCompleteTimeout(void); private: + void _setupListCompleteTimeout(void); + void _clearListCompleteTimeout(void); + void _requestDirectoryList(const QString& dir); + static const int _typeFile = QTreeWidgetItem::UserType + 1; static const int _typeDir = QTreeWidgetItem::UserType + 2; static const int _typeError = QTreeWidgetItem::UserType + 3; + QTimer _listCompleteTimer; ///> Used to signal a timeout waiting for a listComplete signal + static const int _listCompleteTimerTimeoutMsecs = 5000; ///> Timeout in msecs for listComplete timer + QList _walkIndexStack; QList _walkItemStack; Ui::QGCUASFileView _ui;