Commit c880c054 authored by Don Gagne's avatar Don Gagne

Fix bugs with offline to online transition

parent 457e2a0a
...@@ -29,6 +29,8 @@ This file is part of the QGROUNDCONTROL project ...@@ -29,6 +29,8 @@ This file is part of the QGROUNDCONTROL project
#include "QGCMessageBox.h" #include "QGCMessageBox.h"
#include "FirmwarePlugin.h" #include "FirmwarePlugin.h"
QGC_LOGGING_CATEGORY(MissionControllerLog, "MissionControllerLog")
const char* MissionController::_settingsGroup = "MissionController"; const char* MissionController::_settingsGroup = "MissionController";
MissionController::MissionController(QObject *parent) MissionController::MissionController(QObject *parent)
...@@ -39,7 +41,7 @@ MissionController::MissionController(QObject *parent) ...@@ -39,7 +41,7 @@ MissionController::MissionController(QObject *parent)
, _activeVehicle(NULL) , _activeVehicle(NULL)
, _liveHomePositionAvailable(false) , _liveHomePositionAvailable(false)
, _autoSync(false) , _autoSync(false)
, _firstMissionItemSync(false) , _firstItemsFromVehicle(false)
, _missionItemsRequested(false) , _missionItemsRequested(false)
, _queuedSend(false) , _queuedSend(false)
{ {
...@@ -48,50 +50,75 @@ MissionController::MissionController(QObject *parent) ...@@ -48,50 +50,75 @@ MissionController::MissionController(QObject *parent)
MissionController::~MissionController() MissionController::~MissionController()
{ {
// Start with empty list
_canEdit = true;
_missionItems = new QmlObjectListModel(this);
_initAllMissionItems();
} }
void MissionController::start(bool editMode) void MissionController::start(bool editMode)
{ {
qCDebug(MissionControllerLog) << "start editMode" << editMode;
_editMode = editMode; _editMode = editMode;
MultiVehicleManager* multiVehicleMgr = MultiVehicleManager::instance(); MultiVehicleManager* multiVehicleMgr = MultiVehicleManager::instance();
connect(multiVehicleMgr, &MultiVehicleManager::activeVehicleChanged, this, &MissionController::_activeVehicleChanged); connect(multiVehicleMgr, &MultiVehicleManager::activeVehicleChanged, this, &MissionController::_activeVehicleChanged);
Vehicle* activeVehicle = multiVehicleMgr->activeVehicle(); _setupMissionItems(true /* fromVehicle */, true /* force */);
if (activeVehicle) {
_activeVehicleChanged(activeVehicle);
} else {
_missionItemsRequested = true;
_newMissionItemsAvailable();
}
} }
void MissionController::_newMissionItemsAvailable(void) void MissionController::_newMissionItemsAvailableFromVehicle(void)
{ {
if (_editMode) { qCDebug(MissionControllerLog) << "_newMissionItemsAvailableFromVehicle";
if (_firstMissionItemSync) {
// This is the first time the vehicle is seeing items. We have to be careful of transitioning from offline _setupMissionItems(true /* fromVehicle */, false /* force */);
// to online. }
_firstMissionItemSync = false; /// @param fromVehicle true: load items from vehicle
if (_missionItems && _missionItems->count() > 1) { /// @param force true: disregard any flags which may prevent load
QGCMessageBox::StandardButton button = QGCMessageBox::warning("Mission Editing", void MissionController::_setupMissionItems(bool fromVehicle, bool force)
"The vehicle has sent a new set of Mission Items. " {
"Do you want to discard your current set of unsaved items and use the ones from the vehicle instead?", qCDebug(MissionControllerLog) << "_setupMissionItems fromVehicle:force:_editMode:_firstItemsFromVehicle" << fromVehicle << force << _editMode << _firstItemsFromVehicle;
QGCMessageBox::Yes | QGCMessageBox::No,
QGCMessageBox::No); MissionManager* missionManager = NULL;
if (button == QGCMessageBox::No) { if (_activeVehicle) {
return; missionManager = _activeVehicle->missionManager();
} else {
qCDebug(MissionControllerLog) << "running offline";
}
if (!force) {
if (_editMode && fromVehicle) {
if (_firstItemsFromVehicle) {
if (missionManager) {
if (missionManager->inProgress()) {
// Still in progress of retrieving items from vehicle, leave current set alone and wait for
// mission manager to finish
qCDebug(MissionControllerLog) << "disregarding due to MissionManager in progress";
return;
} else {
// We have the first set of items from the vehicle. If we haven't already started creating a
// new mission, switch to the items from the vehicle
_firstItemsFromVehicle = false;
if (_missionItems->count() != 1) {
qCDebug(MissionControllerLog) << "disregarding due to existing items";
return;
}
}
} }
} else if (!_missionItemsRequested) {
// We didn't specifically ask for new mission items. Disregard the new set since it is
// the most likely the set we just sent to the vehicle.
qCDebug(MissionControllerLog) << "disregarding due to unrequested notification";
return;
} }
} else if (!_missionItemsRequested) {
// We didn't specifically ask for new mission items. Disregard the new set since it is
// the most likely the set we just sent to the vehicle.
return;
} }
} }
qCDebug(MissionControllerLog) << "fell through to main setup";
_missionItemsRequested = false; _missionItemsRequested = false;
if (_missionItems) { if (_missionItems) {
...@@ -99,17 +126,14 @@ void MissionController::_newMissionItemsAvailable(void) ...@@ -99,17 +126,14 @@ void MissionController::_newMissionItemsAvailable(void)
_missionItems->deleteLater(); _missionItems->deleteLater();
} }
MissionManager* missionManager = NULL; if (!missionManager || !fromVehicle || missionManager->inProgress()) {
if (_activeVehicle) {
missionManager = _activeVehicle->missionManager();
}
if (!missionManager || missionManager->inProgress()) {
_canEdit = true; _canEdit = true;
_missionItems = new QmlObjectListModel(this); _missionItems = new QmlObjectListModel(this);
qCDebug(MissionControllerLog) << "creating empty set";
} else { } else {
_canEdit = missionManager->canEdit(); _canEdit = missionManager->canEdit();
_missionItems = missionManager->copyMissionItems(); _missionItems = missionManager->copyMissionItems();
qCDebug(MissionControllerLog) << "loading from vehicle count"<< _missionItems->count();
} }
_initAllMissionItems(); _initAllMissionItems();
...@@ -121,8 +145,6 @@ void MissionController::getMissionItems(void) ...@@ -121,8 +145,6 @@ void MissionController::getMissionItems(void)
if (activeVehicle) { if (activeVehicle) {
_missionItemsRequested = true; _missionItemsRequested = true;
MissionManager* missionManager = activeVehicle->missionManager();
connect(missionManager, &MissionManager::newMissionItemsAvailable, this, &MissionController::_newMissionItemsAvailable);
activeVehicle->missionManager()->requestMissionItems(); activeVehicle->missionManager()->requestMissionItems();
} }
} }
...@@ -406,15 +428,19 @@ void MissionController::_itemCommandChanged(MavlinkQmlSingleton::Qml_MAV_CMD com ...@@ -406,15 +428,19 @@ void MissionController::_itemCommandChanged(MavlinkQmlSingleton::Qml_MAV_CMD com
void MissionController::_activeVehicleChanged(Vehicle* activeVehicle) void MissionController::_activeVehicleChanged(Vehicle* activeVehicle)
{ {
qCDebug(MissionControllerLog) << "_activeVehicleChanged activeVehicle" << activeVehicle;
if (_activeVehicle) { if (_activeVehicle) {
MissionManager* missionManager = _activeVehicle->missionManager(); MissionManager* missionManager = _activeVehicle->missionManager();
disconnect(missionManager, &MissionManager::newMissionItemsAvailable, this, &MissionController::_newMissionItemsAvailable); disconnect(missionManager, &MissionManager::newMissionItemsAvailable, this, &MissionController::_newMissionItemsAvailableFromVehicle);
disconnect(missionManager, &MissionManager::inProgressChanged, this, &MissionController::_inProgressChanged); disconnect(missionManager, &MissionManager::inProgressChanged, this, &MissionController::_inProgressChanged);
disconnect(_activeVehicle, &Vehicle::homePositionAvailableChanged, this, &MissionController::_activeVehicleHomePositionAvailableChanged); disconnect(_activeVehicle, &Vehicle::homePositionAvailableChanged, this, &MissionController::_activeVehicleHomePositionAvailableChanged);
disconnect(_activeVehicle, &Vehicle::homePositionChanged, this, &MissionController::_activeVehicleHomePositionChanged); disconnect(_activeVehicle, &Vehicle::homePositionChanged, this, &MissionController::_activeVehicleHomePositionChanged);
_activeVehicle = NULL; _activeVehicle = NULL;
_newMissionItemsAvailable();
// When the active vehicle goes away we toss the editor items
_setupMissionItems(false /* fromVehicle */, true /* force */);
_activeVehicleHomePositionAvailableChanged(false); _activeVehicleHomePositionAvailableChanged(false);
} }
...@@ -423,21 +449,13 @@ void MissionController::_activeVehicleChanged(Vehicle* activeVehicle) ...@@ -423,21 +449,13 @@ void MissionController::_activeVehicleChanged(Vehicle* activeVehicle)
if (_activeVehicle) { if (_activeVehicle) {
MissionManager* missionManager = activeVehicle->missionManager(); MissionManager* missionManager = activeVehicle->missionManager();
connect(missionManager, &MissionManager::newMissionItemsAvailable, this, &MissionController::_newMissionItemsAvailable); connect(missionManager, &MissionManager::newMissionItemsAvailable, this, &MissionController::_newMissionItemsAvailableFromVehicle);
connect(missionManager, &MissionManager::inProgressChanged, this, &MissionController::_inProgressChanged); connect(missionManager, &MissionManager::inProgressChanged, this, &MissionController::_inProgressChanged);
connect(_activeVehicle, &Vehicle::homePositionAvailableChanged, this, &MissionController::_activeVehicleHomePositionAvailableChanged); connect(_activeVehicle, &Vehicle::homePositionAvailableChanged, this, &MissionController::_activeVehicleHomePositionAvailableChanged);
connect(_activeVehicle, &Vehicle::homePositionChanged, this, &MissionController::_activeVehicleHomePositionChanged); connect(_activeVehicle, &Vehicle::homePositionChanged, this, &MissionController::_activeVehicleHomePositionChanged);
if (missionManager->inProgress()) { _firstItemsFromVehicle = true;
// Vehicle is still in process of requesting mission items _setupMissionItems(true /* fromVehicle */, false /* force */);
_firstMissionItemSync = true;
} else {
// Vehicle already has mission items
_firstMissionItemSync = false;
}
_missionItemsRequested = true;
_newMissionItemsAvailable();
_activeVehicleHomePositionChanged(_activeVehicle->homePosition()); _activeVehicleHomePositionChanged(_activeVehicle->homePosition());
_activeVehicleHomePositionAvailableChanged(_activeVehicle->homePositionAvailable()); _activeVehicleHomePositionAvailableChanged(_activeVehicle->homePositionAvailable());
......
...@@ -28,6 +28,9 @@ This file is part of the QGROUNDCONTROL project ...@@ -28,6 +28,9 @@ This file is part of the QGROUNDCONTROL project
#include "QmlObjectListModel.h" #include "QmlObjectListModel.h"
#include "Vehicle.h" #include "Vehicle.h"
#include "QGCLoggingCategory.h"
Q_DECLARE_LOGGING_CATEGORY(MissionControllerLog)
class MissionController : public QObject class MissionController : public QObject
{ {
...@@ -72,7 +75,7 @@ signals: ...@@ -72,7 +75,7 @@ signals:
void autoSyncChanged(bool autoSync); void autoSyncChanged(bool autoSync);
private slots: private slots:
void _newMissionItemsAvailable(); void _newMissionItemsAvailableFromVehicle();
void _itemCoordinateChanged(const QGeoCoordinate& coordinate); void _itemCoordinateChanged(const QGeoCoordinate& coordinate);
void _itemCommandChanged(MavlinkQmlSingleton::Qml_MAV_CMD command); void _itemCommandChanged(MavlinkQmlSingleton::Qml_MAV_CMD command);
void _activeVehicleChanged(Vehicle* activeVehicle); void _activeVehicleChanged(Vehicle* activeVehicle);
...@@ -91,6 +94,7 @@ private: ...@@ -91,6 +94,7 @@ private:
void _initMissionItem(MissionItem* item); void _initMissionItem(MissionItem* item);
void _deinitMissionItem(MissionItem* item); void _deinitMissionItem(MissionItem* item);
void _autoSyncSend(void); void _autoSyncSend(void);
void _setupMissionItems(bool fromVehicle, bool force);
private: private:
bool _editMode; bool _editMode;
...@@ -101,7 +105,7 @@ private: ...@@ -101,7 +105,7 @@ private:
bool _liveHomePositionAvailable; bool _liveHomePositionAvailable;
QGeoCoordinate _liveHomePosition; QGeoCoordinate _liveHomePosition;
bool _autoSync; bool _autoSync;
bool _firstMissionItemSync; bool _firstItemsFromVehicle;
bool _missionItemsRequested; bool _missionItemsRequested;
bool _queuedSend; bool _queuedSend;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment