Commit 4833b5a9 authored by Valentin Platzgummer's avatar Valentin Platzgummer

missionController remaining Time feature edited

parent 5b53eb00
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
#endif #endif
#define UPDATE_TIMEOUT 5000 ///< How often we check for bounding box changes #define UPDATE_TIMEOUT 5000 ///< How often we check for bounding box changes
#define REMAINING_DIST_TIME_UPDATE_INTERVAL 100 ///< How often we check for bounding box changes
QGC_LOGGING_CATEGORY(MissionControllerLog, "MissionControllerLog") QGC_LOGGING_CATEGORY(MissionControllerLog, "MissionControllerLog")
...@@ -83,6 +84,9 @@ MissionController::MissionController(PlanMasterController* masterController, QOb ...@@ -83,6 +84,9 @@ MissionController::MissionController(PlanMasterController* masterController, QOb
_updateTimer.setSingleShot(true); _updateTimer.setSingleShot(true);
connect(&_updateTimer, &QTimer::timeout, this, &MissionController::_updateTimeout); connect(&_updateTimer, &QTimer::timeout, this, &MissionController::_updateTimeout);
_remainingDistanceTimeTimer.setInterval(REMAINING_DIST_TIME_UPDATE_INTERVAL);
connect(&_remainingDistanceTimeTimer, &QTimer::timeout, this, &MissionController::distanceTimeToMissionEnd);
} }
MissionController::~MissionController() MissionController::~MissionController()
...@@ -1668,6 +1672,29 @@ void MissionController::_recalcAll(void) ...@@ -1668,6 +1672,29 @@ void MissionController::_recalcAll(void)
_recalcAllWithClickCoordinate(emptyCoord); _recalcAllWithClickCoordinate(emptyCoord);
} }
void MissionController::_enableDisableRemainingDistTimeCalculation(bool flying)
{
if (flying) {
_remainingDistanceTimeTimer.start();
} else {
_remainingDistanceTimeTimer.stop();
}
}
void MissionController::_updateRemainingDistanceTime()
{
double dist = 0;
double time = 0;
bool success = distanceTimeToMissionEnd(dist, time, _missionManager->currentIndex() /*missionIndex >= 1*/);
if (success) {
_remainingTime = time;
_remainingDistance = dist;
emit remainingTimeChanged();
emit remainingDistanceChanged();
}
}
/// Initializes a new set of mission items /// Initializes a new set of mission items
void MissionController::_initAllVisualItems(void) void MissionController::_initAllVisualItems(void)
{ {
...@@ -1787,8 +1814,6 @@ void MissionController::managerVehicleChanged(Vehicle* managerVehicle) ...@@ -1787,8 +1814,6 @@ void MissionController::managerVehicleChanged(Vehicle* managerVehicle)
connect(_missionManager, &MissionManager::inProgressChanged, this, &MissionController::_inProgressChanged); connect(_missionManager, &MissionManager::inProgressChanged, this, &MissionController::_inProgressChanged);
connect(_missionManager, &MissionManager::progressPct, this, &MissionController::_progressPctChanged); connect(_missionManager, &MissionManager::progressPct, this, &MissionController::_progressPctChanged);
connect(_missionManager, &MissionManager::currentIndexChanged, this, &MissionController::_currentMissionIndexChanged); connect(_missionManager, &MissionManager::currentIndexChanged, this, &MissionController::_currentMissionIndexChanged);
connect(_missionManager, &MissionManager::currentIndexChanged, this, &MissionController::remainingDistanceChanged);
connect(_missionManager, &MissionManager::currentIndexChanged, this, &MissionController::remainingTimeChanged);
connect(_missionManager, &MissionManager::lastCurrentIndexChanged, this, &MissionController::resumeMissionIndexChanged); connect(_missionManager, &MissionManager::lastCurrentIndexChanged, this, &MissionController::resumeMissionIndexChanged);
connect(_missionManager, &MissionManager::resumeMissionReady, this, &MissionController::resumeMissionReady); connect(_missionManager, &MissionManager::resumeMissionReady, this, &MissionController::resumeMissionReady);
connect(_missionManager, &MissionManager::resumeMissionUploadFail, this, &MissionController::resumeMissionUploadFail); connect(_missionManager, &MissionManager::resumeMissionUploadFail, this, &MissionController::resumeMissionUploadFail);
...@@ -1796,6 +1821,7 @@ void MissionController::managerVehicleChanged(Vehicle* managerVehicle) ...@@ -1796,6 +1821,7 @@ void MissionController::managerVehicleChanged(Vehicle* managerVehicle)
connect(_managerVehicle, &Vehicle::defaultCruiseSpeedChanged, this, &MissionController::_recalcMissionFlightStatus); connect(_managerVehicle, &Vehicle::defaultCruiseSpeedChanged, this, &MissionController::_recalcMissionFlightStatus);
connect(_managerVehicle, &Vehicle::defaultHoverSpeedChanged, this, &MissionController::_recalcMissionFlightStatus); connect(_managerVehicle, &Vehicle::defaultHoverSpeedChanged, this, &MissionController::_recalcMissionFlightStatus);
connect(_managerVehicle, &Vehicle::vehicleTypeChanged, this, &MissionController::complexMissionItemNamesChanged); connect(_managerVehicle, &Vehicle::vehicleTypeChanged, this, &MissionController::complexMissionItemNamesChanged);
connect(_managerVehicle, &Vehicle::flyingChanged, this, &MissionController::_enableDisableRemainingDistTimeCalculation);
if (!_masterController->offline()) { if (!_masterController->offline()) {
_managerVehicleHomePositionChanged(_managerVehicle->homePosition()); _managerVehicleHomePositionChanged(_managerVehicle->homePosition());
...@@ -2144,8 +2170,9 @@ int MissionController::currentPlanViewIndex(void) const ...@@ -2144,8 +2170,9 @@ int MissionController::currentPlanViewIndex(void) const
return _currentPlanViewIndex; return _currentPlanViewIndex;
} }
bool MissionController::remainingDistanceAndTime(double &remainingDistance, double &remainingTime, int missionIndex) const bool MissionController::distanceTimeToMissionEnd(double &remainingDistance, double &remainingTime, int missionIndex, bool useVehiclePosition) const
{ {
// input check
if ( _visualItems == nullptr if ( _visualItems == nullptr
|| _visualItems->count() < 1 || _visualItems->count() < 1
|| !_flyView || !_flyView
...@@ -2154,6 +2181,17 @@ bool MissionController::remainingDistanceAndTime(double &remainingDistance, doub ...@@ -2154,6 +2181,17 @@ bool MissionController::remainingDistanceAndTime(double &remainingDistance, doub
return false; return false;
} }
// check if vehicle is flying and fetch vehicle coordinate
QGeoCoordinate vehiclePosition;
if (_managerVehicle && _managerVehicle->flying() && useVehiclePosition) {
vehiclePosition = _managerVehicle->coordinate();
} else {
if (useVehiclePosition) {
useVehiclePosition = false;
qWarning("MissionController::distanceTimeToMissionEnd(): vehicle position can't be used. Either no vehicle connected, or vehicle not flying.");
}
}
remainingDistance = 0; remainingDistance = 0;
remainingTime = 0; remainingTime = 0;
...@@ -2199,6 +2237,17 @@ bool MissionController::remainingDistanceAndTime(double &remainingDistance, doub ...@@ -2199,6 +2237,17 @@ bool MissionController::remainingDistanceAndTime(double &remainingDistance, doub
} }
} }
if (useVehiclePosition) {
SimpleMissionItem* simpleItem = _visualItems->value<SimpleMissionItem*>(missionIndex-1);
if (simpleItem != nullptr) {
double dist = vehiclePosition.distanceTo(simpleItem->coordinate());
double time = dist/currentSpeed;
remainingDistance += dist;
remainingTime += time;
}
}
// iterate over mission items starting at currentMissionIdx-1 and determine time and distance // iterate over mission items starting at currentMissionIdx-1 and determine time and distance
for (int i=missionIndex-1; i<_visualItems->count(); i++) { for (int i=missionIndex-1; i<_visualItems->count(); i++) {
VisualMissionItem* item = qobject_cast<VisualMissionItem*>(_visualItems->get(i)); VisualMissionItem* item = qobject_cast<VisualMissionItem*>(_visualItems->get(i));
...@@ -2286,40 +2335,6 @@ bool MissionController::remainingDistanceAndTime(double &remainingDistance, doub ...@@ -2286,40 +2335,6 @@ bool MissionController::remainingDistanceAndTime(double &remainingDistance, doub
return true; return true;
} }
double MissionController::remainingDistance(int missionIndex) const
{
double remainingDistance = 0, remainingTime = 0;
if (remainingDistanceAndTime(remainingDistance, remainingTime, missionIndex))
return remainingDistance;
return -1;
}
double MissionController::remainingTime(int missionIndex) const
{
double remainingDistance = 0, remainingTime = 0;
if (remainingDistanceAndTime(remainingDistance, remainingTime, missionIndex))
return remainingTime;
return -1;
}
double MissionController::remainingDistance() const
{
if (_missionManager != nullptr)
return remainingDistance(_missionManager->currentIndex());
return -1;
}
double MissionController::remainingTime() const
{
if (_missionManager != nullptr)
return remainingTime(_missionManager->currentIndex());
return -1;
}
VisualMissionItem* MissionController::currentPlanViewItem(void) const VisualMissionItem* MissionController::currentPlanViewItem(void) const
{ {
return _currentPlanViewItem; return _currentPlanViewItem;
......
...@@ -208,11 +208,13 @@ public: ...@@ -208,11 +208,13 @@ public:
int currentMissionIndex (void) const; int currentMissionIndex (void) const;
int resumeMissionIndex (void) const; int resumeMissionIndex (void) const;
int currentPlanViewIndex (void) const; int currentPlanViewIndex (void) const;
bool remainingDistanceAndTime (double &remainingDistance, double &remainingTime, int missionIndex) const; // distance and time to mission end (this function does not take into account current vehicle position, if useVehiclePosition == false)
double remainingDistance (int missionIndex) const; bool distanceTimeToMissionEnd (double &remainingDistance, double &remainingTime, int missionIndex, bool useVehiclePosition) const;
double remainingTime (int missionIndex) const;
double remainingDistance () const; // distance and time to mission end (this function does (!) take into account current vehicle position)
double remainingTime () const; double remainingDistance () const { return _remainingDistance; }
// distance and time to mission end (this function does (!) take into account current vehicle position)
double remainingTime () const { return _remainingTime; }
double missionDistance (void) const { return _missionFlightStatus.totalDistance; } double missionDistance (void) const { return _missionFlightStatus.totalDistance; }
double missionTime (void) const { return _missionFlightStatus.totalTime; } double missionTime (void) const { return _missionFlightStatus.totalTime; }
...@@ -276,6 +278,9 @@ private slots: ...@@ -276,6 +278,9 @@ private slots:
void _updateTimeout(); void _updateTimeout();
void _complexBoundingBoxChanged(); void _complexBoundingBoxChanged();
void _recalcAll(void); void _recalcAll(void);
void _enableDisableRemainingDistTimeCalculation(bool flying);
// updates the fields _remainingTime and_remainingDistance (this function does (!) take into account current vehicle position)
void _updateRemainingDistanceTime();
private: private:
void _init(void); void _init(void);
...@@ -330,8 +335,11 @@ private: ...@@ -330,8 +335,11 @@ private:
int _currentPlanViewIndex; int _currentPlanViewIndex;
VisualMissionItem* _currentPlanViewItem; VisualMissionItem* _currentPlanViewItem;
QTimer _updateTimer; QTimer _updateTimer;
QTimer _remainingDistanceTimeTimer;
QGCGeoBoundingCube _travelBoundingCube; QGCGeoBoundingCube _travelBoundingCube;
QGeoCoordinate _takeoffCoordinate; QGeoCoordinate _takeoffCoordinate;
double _remainingTime; // estimated Time until mission end
double _remainingDistance; // estimated Distance to mission end
static const char* _settingsGroup; static const char* _settingsGroup;
......
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