diff --git a/src/MissionManager/MissionController.cc b/src/MissionManager/MissionController.cc index 3c76c8158ae8ce6b3996515fdbcb9a326f6141db..c0b6816b6673a92fd4c283479b1361092e3afb96 100644 --- a/src/MissionManager/MissionController.cc +++ b/src/MissionManager/MissionController.cc @@ -57,6 +57,7 @@ MissionController::MissionController(QObject *parent) , _surveyMissionItemName(tr("Survey")) , _fwLandingMissionItemName(tr("Fixed Wing Landing")) , _appSettings(qgcApp()->toolbox()->settingsManager()->appSettings()) + , _progressPct(0) { _resetMissionFlightStatus(); } @@ -1307,6 +1308,7 @@ void MissionController::activeVehicleBeingRemoved(void) disconnect(missionManager, &MissionManager::newMissionItemsAvailable, this, &MissionController::_newMissionItemsAvailableFromVehicle); disconnect(missionManager, &MissionManager::inProgressChanged, this, &MissionController::_inProgressChanged); + disconnect(missionManager, &MissionManager::progressPct, this, &MissionController::_progressPctChanged); disconnect(missionManager, &MissionManager::currentIndexChanged, this, &MissionController::_currentMissionIndexChanged); disconnect(missionManager, &MissionManager::lastCurrentIndexChanged, this, &MissionController::resumeMissionIndexChanged); disconnect(missionManager, &MissionManager::resumeMissionReady, this, &MissionController::resumeMissionReady); @@ -1334,6 +1336,7 @@ void MissionController::activeVehicleSet(Vehicle* activeVehicle) connect(missionManager, &MissionManager::newMissionItemsAvailable, this, &MissionController::_newMissionItemsAvailableFromVehicle); connect(missionManager, &MissionManager::inProgressChanged, this, &MissionController::_inProgressChanged); + connect(missionManager, &MissionManager::progressPct, this, &MissionController::_progressPctChanged); connect(missionManager, &MissionManager::currentIndexChanged, this, &MissionController::_currentMissionIndexChanged); connect(missionManager, &MissionManager::lastCurrentIndexChanged, this, &MissionController::resumeMissionIndexChanged); connect(missionManager, &MissionManager::resumeMissionReady, this, &MissionController::resumeMissionReady); @@ -1610,3 +1613,11 @@ void MissionController::clearCameraPoints(void) { _cameraPoints.clearAndDeleteContents(); } + +void MissionController::_progressPctChanged(double progressPct) +{ + if (!qFuzzyCompare(progressPct, _progressPct)) { + _progressPct = progressPct; + emit progressPctChanged(progressPct); + } +} diff --git a/src/MissionManager/MissionController.h b/src/MissionManager/MissionController.h index 100b51b8b39538844ad4266e5f06243f9b247910..0ccaa6d7c87fc2aade2cc689638959e2d08897ca 100644 --- a/src/MissionManager/MissionController.h +++ b/src/MissionManager/MissionController.h @@ -66,6 +66,8 @@ public: Q_PROPERTY(QStringList complexMissionItemNames READ complexMissionItemNames NOTIFY complexMissionItemNamesChanged) Q_PROPERTY(QGeoCoordinate plannedHomePosition READ plannedHomePosition NOTIFY plannedHomePositionChanged) + Q_PROPERTY(double progressPct READ progressPct NOTIFY progressPctChanged) + Q_PROPERTY(int resumeMissionIndex READ resumeMissionIndex NOTIFY resumeMissionIndexChanged) Q_PROPERTY(double missionDistance READ missionDistance NOTIFY missionDistanceChanged) @@ -129,6 +131,7 @@ public: QmlObjectListModel* cameraPoints (void) { return &_cameraPoints; } QStringList complexMissionItemNames (void) const; QGeoCoordinate plannedHomePosition (void) const; + double progressPct (void) const { return _progressPct; } /// Returns the item index two which a mission should be resumed. -1 indicates resume mission not available. int resumeMissionIndex(void) const; @@ -161,6 +164,7 @@ signals: void batteryChangePointChanged(int batteryChangePoint); void batteriesRequiredChanged(int batteriesRequired); void plannedHomePositionChanged(QGeoCoordinate plannedHomePosition); + void progressPctChanged(double progressPct); private slots: void _newMissionItemsAvailableFromVehicle(bool removeAllRequested); @@ -172,6 +176,7 @@ private slots: void _recalcMissionFlightStatus(void); void _updateContainsItems(void); void _cameraFeedback(QGeoCoordinate imageCoordinate, int index); + void _progressPctChanged(double progressPct); private: void _init(void); @@ -216,6 +221,7 @@ private: QString _surveyMissionItemName; QString _fwLandingMissionItemName; AppSettings* _appSettings; + double _progressPct; static const char* _settingsGroup; diff --git a/src/MissionManager/MissionManager.cc b/src/MissionManager/MissionManager.cc index 358b1c7d2a0479308d413359723d990339838eeb..ceca20cf5202071d765961a1428f06c65365bdc5 100644 --- a/src/MissionManager/MissionManager.cc +++ b/src/MissionManager/MissionManager.cc @@ -49,6 +49,7 @@ void MissionManager::_writeMissionItemsWorker(void) _lastMissionRequest = -1; emit newMissionItemsAvailable(_missionItems.count() == 0); + emit progressPct(0); qCDebug(MissionManagerLog) << "writeMissionItems count:" << _missionItems.count(); @@ -500,6 +501,8 @@ void MissionManager::_handleMissionItem(const mavlink_message_t& message, bool m _startAckTimeout(AckMissionItem); return; } + + emit progressPct((double)seq / (double)_missionItems.count()); _retryCount = 0; if (_itemIndicesToRead.count() == 0) { @@ -532,6 +535,8 @@ void MissionManager::_handleMissionRequest(const mavlink_message_t& message, boo return; } + emit progressPct((double)missionRequest.seq / (double)_missionItems.count()); + _lastMissionRequest = missionRequest.seq; if (!_itemIndicesToWrite.contains(missionRequest.seq)) { qCDebug(MissionManagerLog) << "_handleMissionRequest sequence number requested which has already been sent, sending again:" << missionRequest.seq; @@ -857,6 +862,8 @@ QString MissionManager::_missionResultToString(MAV_MISSION_RESULT result) void MissionManager::_finishTransaction(bool success) { + emit progressPct(1); + if (!success && _transactionInProgress == TransactionRead) { // Read from vehicle failed, clear partial list _clearAndDeleteMissionItems(); @@ -907,6 +914,8 @@ void MissionManager::_removeAllWorker(void) qCDebug(MissionManagerLog) << "_removeAllWorker"; + emit progressPct(0); + _dedicatedLink = _vehicle->priorityLink(); mavlink_msg_mission_clear_all_pack_chan(qgcApp()->toolbox()->mavlinkProtocol()->getSystemId(), qgcApp()->toolbox()->mavlinkProtocol()->getComponentId(), diff --git a/src/MissionManager/MissionManager.h b/src/MissionManager/MissionManager.h index b15ad967e9b06aa898ac15718c9b7734033b6498..dd040a6978594e40d8aa430e720630ffb6b9ac3f 100644 --- a/src/MissionManager/MissionManager.h +++ b/src/MissionManager/MissionManager.h @@ -85,6 +85,7 @@ signals: void lastCurrentIndexChanged(int lastCurrentIndex); void resumeMissionReady(void); void cameraFeedback(QGeoCoordinate imageCoordinate, int index); + void progressPct(double progressPercentPct); private slots: void _mavlinkMessageReceived(const mavlink_message_t& message); diff --git a/src/PlanView/PlanToolBar.qml b/src/PlanView/PlanToolBar.qml index fbfc757b4089a27cc551cb2e042a9ca20e9f76c5..df2fca8284a2428d3cce46a30d61e085ab8a1a2e 100644 --- a/src/PlanView/PlanToolBar.qml +++ b/src/PlanView/PlanToolBar.qml @@ -57,6 +57,8 @@ Rectangle { property real _missionTime: _missionValid ? missionTime : NaN property int _batteryChangePoint: _controllerValid ? planMasterController.missionController.batteryChangePoint : -1 property int _batteriesRequired: _controllerValid ? planMasterController.missionController.batteriesRequired : -1 + property real _controllerProgressPct: _controllerValid ? planMasterController.missionController.progressPct : 0 + property bool _syncInProgress: _controllerValid ? planMasterController.missionController.syncInProgress : false property string _distanceText: isNaN(_distance) ? "-.-" : QGroundControl.metersToAppSettingsDistanceUnits(_distance).toFixed(1) + " " + QGroundControl.appSettingsDistanceUnitsString property string _altDifferenceText: isNaN(_altDifference) ? "-.-" : QGroundControl.metersToAppSettingsDistanceUnits(_altDifference).toFixed(1) + " " + QGroundControl.appSettingsDistanceUnitsString @@ -110,6 +112,32 @@ Rectangle { } } + // Progress bar + + on_ControllerProgressPctChanged: { + if (_controllerProgressPct === 1) { + resetProgressTimer.start() + } else if (_controllerProgressPct > 0) { + progressBar.visible = true + } + } + + Timer { + id: resetProgressTimer + interval: 1000 + onTriggered: progressBar.visible = false + } + + Rectangle { + id: progressBar + anchors.left: parent.left + anchors.bottom: parent.bottom + height: 2 + width: _controllerProgressPct * parent.width + color: qgcPal.colorGreen + visible: false + } + RowLayout { anchors.top: parent.top anchors.bottom: parent.bottom diff --git a/src/ui/toolbar/MainToolBar.qml b/src/ui/toolbar/MainToolBar.qml index 03101ddca1859dc5def5bd3319e7d4d785d4b28e..3f350be870ef61b03555d138d9af2cb74bc7aa4e 100644 --- a/src/ui/toolbar/MainToolBar.qml +++ b/src/ui/toolbar/MainToolBar.qml @@ -211,5 +211,4 @@ Rectangle { width: _activeVehicle ? _activeVehicle.parameterManager.loadProgress * parent.width : 0 color: qgcPal.colorGreen } - }