Commit f109339e authored by Gus Grubba's avatar Gus Grubba

Set mission bounding box as ROI if one exists.

parent 98088b35
...@@ -94,22 +94,24 @@ AirMapFlightPlanManager::startFlightPlanning(PlanMasterController *planControlle ...@@ -94,22 +94,24 @@ AirMapFlightPlanManager::startFlightPlanning(PlanMasterController *planControlle
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void bool
AirMapFlightPlanManager::_createFlightPlan() AirMapFlightPlanManager::_collectFlightDtata()
{ {
_flight.reset(); if(!_planController || !_planController->missionController()) {
return false;
}
//-- Get flight bounding cube and prepare (box) polygon //-- Get flight bounding cube and prepare (box) polygon
QGCGeoBoundingCube bc = _planController->missionController()->travelBoundingCube(); QGCGeoBoundingCube bc = *_planController->missionController()->travelBoundingCube();
if(!bc.area()) { if(!bc.isValid() || !bc.area()) {
//-- TODO: If single point, we need to set a point and a radius instead //-- TODO: If single point, we need to set a point and a radius instead
return; qCDebug(AirMapManagerLog) << "Not enough points for a flight plan.";
return false;
} }
_flight.maxAltitude = fmax(bc.pointNW.altitude(), bc.pointSE.altitude()); _flight.maxAltitude = fmax(bc.pointNW.altitude(), bc.pointSE.altitude());
_flight.takeoffCoord = _planController->missionController()->takeoffCoordinate(); _flight.takeoffCoord = _planController->missionController()->takeoffCoordinate();
_flight.coords = bc.polygon2D(); _flight.coords = bc.polygon2D();
_flight.bc = bc;
emit missionAreaChanged();
//-- Flight Date/Time //-- Flight Date/Time
if(_flightStartTime.isNull() || _flightStartTime < QDateTime::currentDateTime()) { if(_flightStartTime.isNull() || _flightStartTime < QDateTime::currentDateTime()) {
_flightStartTime = QDateTime::currentDateTime().addSecs(5 * 60); _flightStartTime = QDateTime::currentDateTime().addSecs(5 * 60);
...@@ -119,15 +121,28 @@ AirMapFlightPlanManager::_createFlightPlan() ...@@ -119,15 +121,28 @@ AirMapFlightPlanManager::_createFlightPlan()
_flightEndTime = _flightStartTime.addSecs(30 * 60); _flightEndTime = _flightStartTime.addSecs(30 * 60);
emit flightEndTimeChanged(); emit flightEndTimeChanged();
} }
return true;
}
//-----------------------------------------------------------------------------
void
AirMapFlightPlanManager::_createFlightPlan()
{
_flight.reset();
//-- Get flight data
if(!_collectFlightDtata()) {
return;
}
qCDebug(AirMapManagerLog) << "About to create flight plan"; qCDebug(AirMapManagerLog) << "About to create flight plan";
qCDebug(AirMapManagerLog) << "Takeoff: " << _flight.takeoffCoord; qCDebug(AirMapManagerLog) << "Takeoff: " << _flight.takeoffCoord;
qCDebug(AirMapManagerLog) << "Bounding box:" << bc.pointNW << bc.pointSE; qCDebug(AirMapManagerLog) << "Bounding box:" << _flight.bc.pointNW << _flight.bc.pointSE;
qCDebug(AirMapManagerLog) << "Flight Start:" << _flightStartTime; qCDebug(AirMapManagerLog) << "Flight Start:" << _flightStartTime;
qCDebug(AirMapManagerLog) << "Flight End: " << _flightEndTime; qCDebug(AirMapManagerLog) << "Flight End: " << _flightEndTime;
//-- Not Yet //-- Not Yet
//return; return;
if (_pilotID == "") { if (_pilotID == "") {
//-- Need to get the pilot id before uploading the flight plan //-- Need to get the pilot id before uploading the flight plan
...@@ -259,6 +274,17 @@ AirMapFlightPlanManager::_updateFlightPlan() ...@@ -259,6 +274,17 @@ AirMapFlightPlanManager::_updateFlightPlan()
// little to do with those used when creating it. // little to do with those used when creating it.
qCDebug(AirMapManagerLog) << "Updating flight plan"; qCDebug(AirMapManagerLog) << "Updating flight plan";
//-- Get flight data
if(!_collectFlightDtata()) {
return;
}
qCDebug(AirMapManagerLog) << "About to update the flight plan";
qCDebug(AirMapManagerLog) << "Takeoff: " << _flight.takeoffCoord;
qCDebug(AirMapManagerLog) << "Bounding box:" << _flight.bc.pointNW << _flight.bc.pointSE;
qCDebug(AirMapManagerLog) << "Flight Start:" << _flightStartTime;
qCDebug(AirMapManagerLog) << "Flight End: " << _flightEndTime;
_state = State::FlightUpdate; _state = State::FlightUpdate;
std::weak_ptr<LifetimeChecker> isAlive(_instance); std::weak_ptr<LifetimeChecker> isAlive(_instance);
_shared.doRequestWithLogin([this, isAlive](const QString& login_token) { _shared.doRequestWithLogin([this, isAlive](const QString& login_token) {
......
...@@ -36,6 +36,7 @@ public: ...@@ -36,6 +36,7 @@ public:
bool valid () override { return _valid; } bool valid () override { return _valid; }
QmlObjectListModel* advisories () override { return &_advisories; } QmlObjectListModel* advisories () override { return &_advisories; }
QmlObjectListModel* ruleSets () override { return &_rulesets; } QmlObjectListModel* ruleSets () override { return &_rulesets; }
QGCGeoBoundingCube* missionArea () override { return &_flight.bc; }
AirspaceAdvisoryProvider::AdvisoryColor airspaceColor () override { return _airspaceColor; } AirspaceAdvisoryProvider::AdvisoryColor airspaceColor () override { return _airspaceColor; }
void startFlightPlanning (PlanMasterController* planController) override; void startFlightPlanning (PlanMasterController* planController) override;
...@@ -54,6 +55,7 @@ private: ...@@ -54,6 +55,7 @@ private:
void _updateFlightPlan (); void _updateFlightPlan ();
void _createFlightPlan (); void _createFlightPlan ();
void _deleteFlightPlan (); void _deleteFlightPlan ();
bool _collectFlightDtata ();
private: private:
enum class State { enum class State {
...@@ -66,10 +68,12 @@ private: ...@@ -66,10 +68,12 @@ private:
}; };
struct Flight { struct Flight {
QGCGeoBoundingCube bc;
QList<QGeoCoordinate> coords; QList<QGeoCoordinate> coords;
QGeoCoordinate takeoffCoord; QGeoCoordinate takeoffCoord;
float maxAltitude = 0; float maxAltitude = 0;
void reset() { void reset() {
bc.reset();
coords.clear(); coords.clear();
maxAltitude = 0; maxAltitude = 0;
} }
......
...@@ -46,11 +46,13 @@ public: ...@@ -46,11 +46,13 @@ public:
Q_PROPERTY(bool valid READ valid NOTIFY advisoryChanged) Q_PROPERTY(bool valid READ valid NOTIFY advisoryChanged)
Q_PROPERTY(QmlObjectListModel* advisories READ advisories NOTIFY advisoryChanged) Q_PROPERTY(QmlObjectListModel* advisories READ advisories NOTIFY advisoryChanged)
Q_PROPERTY(QmlObjectListModel* ruleSets READ ruleSets NOTIFY advisoryChanged) Q_PROPERTY(QmlObjectListModel* ruleSets READ ruleSets NOTIFY advisoryChanged)
Q_PROPERTY(QGCGeoBoundingCube* missionArea READ missionArea NOTIFY missionAreaChanged)
Q_PROPERTY(AirspaceAdvisoryProvider::AdvisoryColor airspaceColor READ airspaceColor NOTIFY advisoryChanged) Q_PROPERTY(AirspaceAdvisoryProvider::AdvisoryColor airspaceColor READ airspaceColor NOTIFY advisoryChanged)
virtual PermitStatus flightPermitStatus () const { return PermitNone; } virtual PermitStatus flightPermitStatus () const { return PermitNone; }
virtual QDateTime flightStartTime () const = 0; virtual QDateTime flightStartTime () const = 0;
virtual QDateTime flightEndTime () const = 0; virtual QDateTime flightEndTime () const = 0;
virtual QGCGeoBoundingCube* missionArea () = 0;
virtual bool valid () = 0; ///< Current advisory list is valid virtual bool valid () = 0; ///< Current advisory list is valid
virtual QmlObjectListModel* advisories () = 0; ///< List of AirspaceAdvisory virtual QmlObjectListModel* advisories () = 0; ///< List of AirspaceAdvisory
virtual QmlObjectListModel* ruleSets () = 0; ///< List of AirspaceRuleSet virtual QmlObjectListModel* ruleSets () = 0; ///< List of AirspaceRuleSet
...@@ -65,4 +67,5 @@ signals: ...@@ -65,4 +67,5 @@ signals:
void flightStartTimeChanged (); void flightStartTimeChanged ();
void flightEndTimeChanged (); void flightEndTimeChanged ();
void advisoryChanged (); void advisoryChanged ();
void missionAreaChanged ();
}; };
...@@ -70,15 +70,28 @@ void AirspaceManager::setToolbox(QGCToolbox* toolbox) ...@@ -70,15 +70,28 @@ void AirspaceManager::setToolbox(QGCToolbox* toolbox)
_flightPlan = _instantiateAirspaceFlightPlanProvider(); _flightPlan = _instantiateAirspaceFlightPlanProvider();
} }
void AirspaceManager::setROI(const QGeoCoordinate& pointNW, const QGeoCoordinate& pointSE) void AirspaceManager::setROI(const QGeoCoordinate& pointNW, const QGeoCoordinate& pointSE, bool planView)
{ {
if(planView) {
//-- Is there a mission?
if(_flightPlan->flightPermitStatus() != AirspaceFlightPlanProvider::PermitNone) {
//-- Is there a polygon to work with?
if(_flightPlan->missionArea()->isValid() && _flightPlan->missionArea()->area() > 0.0) {
_setROI(*_flightPlan->missionArea());
return;
}
}
}
//-- Use screen coordinates (what you see is what you get)
_setROI(QGCGeoBoundingCube(pointNW, pointSE)); _setROI(QGCGeoBoundingCube(pointNW, pointSE));
} }
void AirspaceManager::_setROI(const QGCGeoBoundingCube& roi) void AirspaceManager::_setROI(const QGCGeoBoundingCube& roi)
{ {
_roi = roi; if(_roi != roi) {
_roiUpdateTimer.start(); _roi = roi;
_roiUpdateTimer.start();
}
} }
void AirspaceManager::_updateToROI() void AirspaceManager::_updateToROI()
......
...@@ -65,7 +65,7 @@ public: ...@@ -65,7 +65,7 @@ public:
Q_PROPERTY(AirspaceFlightPlanProvider* flightPlan READ flightPlan CONSTANT) Q_PROPERTY(AirspaceFlightPlanProvider* flightPlan READ flightPlan CONSTANT)
Q_PROPERTY(bool airspaceVisible READ airspaceVisible WRITE setAirspaceVisible NOTIFY airspaceVisibleChanged) Q_PROPERTY(bool airspaceVisible READ airspaceVisible WRITE setAirspaceVisible NOTIFY airspaceVisibleChanged)
Q_INVOKABLE void setROI (const QGeoCoordinate& pointNW, const QGeoCoordinate& pointSE); Q_INVOKABLE void setROI (const QGeoCoordinate& pointNW, const QGeoCoordinate& pointSE, bool planView);
AirspaceWeatherInfoProvider* weatherInfo () { return _weatherProvider; } AirspaceWeatherInfoProvider* weatherInfo () { return _weatherProvider; }
AirspaceAdvisoryProvider* advisories () { return _advisories; } AirspaceAdvisoryProvider* advisories () { return _advisories; }
......
...@@ -62,7 +62,7 @@ FlightMap { ...@@ -62,7 +62,7 @@ FlightMap {
var coordinateNW = flightMap.toCoordinate(Qt.point(0,0), false /* clipToViewPort */) var coordinateNW = flightMap.toCoordinate(Qt.point(0,0), false /* clipToViewPort */)
var coordinateSE = flightMap.toCoordinate(Qt.point(width,height), false /* clipToViewPort */) var coordinateSE = flightMap.toCoordinate(Qt.point(width,height), false /* clipToViewPort */)
if(coordinateNW.isValid && coordinateSE.isValid) { if(coordinateNW.isValid && coordinateSE.isValid) {
QGroundControl.airspaceManager.setROI(coordinateNW, coordinateSE) QGroundControl.airspaceManager.setROI(coordinateNW, coordinateSE, false /*planView*/)
} }
} }
} }
......
...@@ -1435,6 +1435,8 @@ void MissionController::_recalcMissionFlightStatus() ...@@ -1435,6 +1435,8 @@ void MissionController::_recalcMissionFlightStatus()
} }
} }
} }
_updateTimer.start(UPDATE_TIMEOUT);
} }
// This will update the sequence numbers to be sequential starting from 0 // This will update the sequence numbers to be sequential starting from 0
......
...@@ -90,6 +90,7 @@ public: ...@@ -90,6 +90,7 @@ public:
Q_PROPERTY(int batteryChangePoint READ batteryChangePoint NOTIFY batteryChangePointChanged) Q_PROPERTY(int batteryChangePoint READ batteryChangePoint NOTIFY batteryChangePointChanged)
Q_PROPERTY(int batteriesRequired READ batteriesRequired NOTIFY batteriesRequiredChanged) Q_PROPERTY(int batteriesRequired READ batteriesRequired NOTIFY batteriesRequiredChanged)
Q_PROPERTY(QGCGeoBoundingCube* travelBoundingCube READ travelBoundingCube NOTIFY missionBoundingCubeChanged)
Q_INVOKABLE void removeMissionItem(int index); Q_INVOKABLE void removeMissionItem(int index);
...@@ -125,7 +126,7 @@ public: ...@@ -125,7 +126,7 @@ public:
bool loadJsonFile(QFile& file, QString& errorString); bool loadJsonFile(QFile& file, QString& errorString);
bool loadTextFile(QFile& file, QString& errorString); bool loadTextFile(QFile& file, QString& errorString);
QGCGeoBoundingCube travelBoundingCube () { return _travelBoundingCube; } QGCGeoBoundingCube* travelBoundingCube () { return &_travelBoundingCube; }
QGeoCoordinate takeoffCoordinate () { return _takeoffCoordinate; } QGeoCoordinate takeoffCoordinate () { return _takeoffCoordinate; }
// Overrides from PlanElementController // Overrides from PlanElementController
......
...@@ -73,9 +73,9 @@ QGCView { ...@@ -73,9 +73,9 @@ QGCView {
function addComplexItem(complexItemName) { function addComplexItem(complexItemName) {
var coordinate = editorMap.center var coordinate = editorMap.center
coordinate.latitude = coordinate.latitude.toFixed(_decimalPlaces) coordinate.latitude = coordinate.latitude.toFixed(_decimalPlaces)
coordinate.longitude = coordinate.longitude.toFixed(_decimalPlaces) coordinate.longitude = coordinate.longitude.toFixed(_decimalPlaces)
coordinate.altitude = coordinate.altitude.toFixed(_decimalPlaces) coordinate.altitude = coordinate.altitude.toFixed(_decimalPlaces)
insertComplexMissionItem(complexItemName, coordinate, _missionController.visualItems.count) insertComplexMissionItem(complexItemName, coordinate, _missionController.visualItems.count)
} }
...@@ -89,7 +89,7 @@ QGCView { ...@@ -89,7 +89,7 @@ QGCView {
var coordinateNW = editorMap.toCoordinate(Qt.point(0,0), false /* clipToViewPort */) var coordinateNW = editorMap.toCoordinate(Qt.point(0,0), false /* clipToViewPort */)
var coordinateSE = editorMap.toCoordinate(Qt.point(width,height), false /* clipToViewPort */) var coordinateSE = editorMap.toCoordinate(Qt.point(width,height), false /* clipToViewPort */)
if(coordinateNW.isValid && coordinateSE.isValid) { if(coordinateNW.isValid && coordinateSE.isValid) {
QGroundControl.airspaceManager.setROI(coordinateNW, coordinateSE) QGroundControl.airspaceManager.setROI(coordinateNW, coordinateSE, true /*planView*/)
} }
} }
} }
......
...@@ -25,14 +25,23 @@ QGCGeoBoundingCube::isValid() const ...@@ -25,14 +25,23 @@ QGCGeoBoundingCube::isValid() const
pointNW.longitude() != MaxEast && pointSE.longitude() != MaxWest && pointNW.altitude() < MaxAlt and pointSE.altitude() > MinAlt; pointNW.longitude() != MaxEast && pointSE.longitude() != MaxWest && pointNW.altitude() < MaxAlt and pointSE.altitude() > MinAlt;
} }
//-----------------------------------------------------------------------------
void
QGCGeoBoundingCube::reset()
{
pointSE = QGeoCoordinate();
pointNW = QGeoCoordinate();
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
QGeoCoordinate QGeoCoordinate
QGCGeoBoundingCube::center() const QGCGeoBoundingCube::center() const
{ {
if(!isValid())
return QGeoCoordinate();
double lat = (((pointNW.latitude() + 90.0) + (pointSE.latitude() + 90.0)) / 2.0) - 90.0; double lat = (((pointNW.latitude() + 90.0) + (pointSE.latitude() + 90.0)) / 2.0) - 90.0;
double lon = (((pointNW.longitude() + 180.0) + (pointSE.longitude() + 180.0)) / 2.0) - 180.0; double lon = (((pointNW.longitude() + 180.0) + (pointSE.longitude() + 180.0)) / 2.0) - 180.0;
double alt = (pointNW.altitude() + pointSE.altitude()) / 2.0; double alt = (pointNW.altitude() + pointSE.altitude()) / 2.0;
//qDebug() << pointNW << pointSE << QGeoCoordinate(lat, lon, alt);
return QGeoCoordinate(lat, lon, alt); return QGeoCoordinate(lat, lon, alt);
} }
...@@ -41,11 +50,13 @@ QList<QGeoCoordinate> ...@@ -41,11 +50,13 @@ QList<QGeoCoordinate>
QGCGeoBoundingCube::polygon2D() const QGCGeoBoundingCube::polygon2D() const
{ {
QList<QGeoCoordinate> coords; QList<QGeoCoordinate> coords;
coords.append(QGeoCoordinate(pointNW.latitude(), pointNW.longitude(), pointSE.altitude())); if(isValid()) {
coords.append(QGeoCoordinate(pointNW.latitude(), pointSE.longitude(), pointSE.altitude())); coords.append(QGeoCoordinate(pointNW.latitude(), pointNW.longitude(), pointSE.altitude()));
coords.append(QGeoCoordinate(pointSE.latitude(), pointSE.longitude(), pointSE.altitude())); coords.append(QGeoCoordinate(pointNW.latitude(), pointSE.longitude(), pointSE.altitude()));
coords.append(QGeoCoordinate(pointSE.latitude(), pointNW.longitude(), pointSE.altitude())); coords.append(QGeoCoordinate(pointSE.latitude(), pointSE.longitude(), pointSE.altitude()));
coords.append(QGeoCoordinate(pointNW.latitude(), pointNW.longitude(), pointSE.altitude())); coords.append(QGeoCoordinate(pointSE.latitude(), pointNW.longitude(), pointSE.altitude()));
coords.append(QGeoCoordinate(pointNW.latitude(), pointNW.longitude(), pointSE.altitude()));
}
return coords; return coords;
} }
...@@ -53,6 +64,8 @@ QGCGeoBoundingCube::polygon2D() const ...@@ -53,6 +64,8 @@ QGCGeoBoundingCube::polygon2D() const
double double
QGCGeoBoundingCube::width() const QGCGeoBoundingCube::width() const
{ {
if(!isValid())
return 0.0;
QGeoCoordinate ne = QGeoCoordinate(pointNW.latitude(), pointSE.longitude()); QGeoCoordinate ne = QGeoCoordinate(pointNW.latitude(), pointSE.longitude());
return pointNW.distanceTo(ne); return pointNW.distanceTo(ne);
} }
...@@ -61,6 +74,8 @@ QGCGeoBoundingCube::width() const ...@@ -61,6 +74,8 @@ QGCGeoBoundingCube::width() const
double double
QGCGeoBoundingCube::height() const QGCGeoBoundingCube::height() const
{ {
if(!isValid())
return 0.0;
QGeoCoordinate sw = QGeoCoordinate(pointSE.latitude(), pointNW.longitude()); QGeoCoordinate sw = QGeoCoordinate(pointSE.latitude(), pointNW.longitude());
return pointNW.distanceTo(sw); return pointNW.distanceTo(sw);
} }
...@@ -69,6 +84,8 @@ QGCGeoBoundingCube::height() const ...@@ -69,6 +84,8 @@ QGCGeoBoundingCube::height() const
double double
QGCGeoBoundingCube::area() const QGCGeoBoundingCube::area() const
{ {
if(!isValid())
return 0.0;
// Area in km^2 // Area in km^2
double a = (height() / 1000.0) * (width() / 1000.0); double a = (height() / 1000.0) * (width() / 1000.0);
//qDebug() << "Area:" << a; //qDebug() << "Area:" << a;
...@@ -79,5 +96,7 @@ QGCGeoBoundingCube::area() const ...@@ -79,5 +96,7 @@ QGCGeoBoundingCube::area() const
double double
QGCGeoBoundingCube::radius() const QGCGeoBoundingCube::radius() const
{ {
if(!isValid())
return 0.0;
return pointNW.distanceTo(pointSE) / 2.0; return pointNW.distanceTo(pointSE) / 2.0;
} }
...@@ -39,8 +39,9 @@ public: ...@@ -39,8 +39,9 @@ public:
Q_PROPERTY(QGeoCoordinate pointNW MEMBER pointNW CONSTANT) Q_PROPERTY(QGeoCoordinate pointNW MEMBER pointNW CONSTANT)
Q_PROPERTY(QGeoCoordinate pointSE MEMBER pointNW CONSTANT) Q_PROPERTY(QGeoCoordinate pointSE MEMBER pointNW CONSTANT)
Q_INVOKABLE bool isValid() const; Q_INVOKABLE void reset ();
Q_INVOKABLE QGeoCoordinate center() const; Q_INVOKABLE bool isValid () const;
Q_INVOKABLE QGeoCoordinate center () const;
inline bool operator ==(const QGCGeoBoundingCube& other) inline bool operator ==(const QGCGeoBoundingCube& other)
{ {
...@@ -61,10 +62,11 @@ public: ...@@ -61,10 +62,11 @@ public:
//-- 2D //-- 2D
QList<QGeoCoordinate> polygon2D() const; QList<QGeoCoordinate> polygon2D() const;
double width () const;
double height () const; Q_INVOKABLE double width () const;
double area () const; Q_INVOKABLE double height () const;
double radius () const; Q_INVOKABLE double area () const;
Q_INVOKABLE double radius () const;
QGeoCoordinate pointNW; QGeoCoordinate pointNW;
QGeoCoordinate pointSE; QGeoCoordinate pointSE;
......
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