Unverified Commit 760e95ac authored by Don Gagne's avatar Don Gagne Committed by GitHub

Merge pull request #8049 from DonLakeFlyer/TakeoffItem

PLan: Takeoff item user model changes
parents d9dba43c fc2781c3
...@@ -17,8 +17,6 @@ import QGroundControl.Palette 1.0 ...@@ -17,8 +17,6 @@ import QGroundControl.Palette 1.0
/// The MissionLineView control is used to add lines between mission items /// The MissionLineView control is used to add lines between mission items
MapItemView { MapItemView {
property bool homePositionValid: true ///< true: show home position, false: don't show home position
delegate: MapPolyline { delegate: MapPolyline {
line.width: 3 line.width: 3
line.color: "#be781c" // Hack, can't get palette to work in here line.color: "#be781c" // Hack, can't get palette to work in here
......
...@@ -377,7 +377,7 @@ VisualMissionItem* MissionController::_insertSimpleMissionItemWorker(QGeoCoordin ...@@ -377,7 +377,7 @@ VisualMissionItem* MissionController::_insertSimpleMissionItemWorker(QGeoCoordin
} }
// We send the click coordinate through here to be able to set the planned home position from the user click location if needed // We send the click coordinate through here to be able to set the planned home position from the user click location if needed
_recalcAllWithClickCoordinate(coordinate); _recalcAllWithCoordinate(coordinate);
if (makeCurrentItem) { if (makeCurrentItem) {
setCurrentPlanViewIndex(newItem->sequenceNumber(), true); setCurrentPlanViewIndex(newItem->sequenceNumber(), true);
...@@ -392,15 +392,11 @@ VisualMissionItem* MissionController::insertSimpleMissionItem(QGeoCoordinate coo ...@@ -392,15 +392,11 @@ VisualMissionItem* MissionController::insertSimpleMissionItem(QGeoCoordinate coo
return _insertSimpleMissionItemWorker(coordinate, MAV_CMD_NAV_WAYPOINT, visualItemIndex, makeCurrentItem); return _insertSimpleMissionItemWorker(coordinate, MAV_CMD_NAV_WAYPOINT, visualItemIndex, makeCurrentItem);
} }
VisualMissionItem* MissionController::insertTakeoffItem(QGeoCoordinate coordinate, int visualItemIndex, bool makeCurrentItem) VisualMissionItem* MissionController::insertTakeoffItem(QGeoCoordinate /*coordinate*/, int visualItemIndex, bool makeCurrentItem)
{ {
int sequenceNumber = _nextSequenceNumber(); int sequenceNumber = _nextSequenceNumber();
TakeoffMissionItem * newItem = new TakeoffMissionItem(_controllerVehicle->vtol() ? MAV_CMD_NAV_VTOL_TAKEOFF : MAV_CMD_NAV_TAKEOFF, _controllerVehicle, _flyView, _settingsItem, this); TakeoffMissionItem * newItem = new TakeoffMissionItem(_controllerVehicle->vtol() ? MAV_CMD_NAV_VTOL_TAKEOFF : MAV_CMD_NAV_TAKEOFF, _managerVehicle, _flyView, _settingsItem, this);
newItem->setSequenceNumber(sequenceNumber); newItem->setSequenceNumber(sequenceNumber);
if (!newItem->coordinate().isValid()) {
newItem->setCoordinate(coordinate);
}
newItem->setWizardMode(true);
_initVisualItem(newItem); _initVisualItem(newItem);
if (newItem->specifiesAltitude()) { if (newItem->specifiesAltitude()) {
...@@ -419,8 +415,7 @@ VisualMissionItem* MissionController::insertTakeoffItem(QGeoCoordinate coordinat ...@@ -419,8 +415,7 @@ VisualMissionItem* MissionController::insertTakeoffItem(QGeoCoordinate coordinat
_visualItems->insert(visualItemIndex, newItem); _visualItems->insert(visualItemIndex, newItem);
} }
// We send the click coordinate through here to be able to set the planned home position from the user click location if needed _recalcAll();
_recalcAllWithClickCoordinate(coordinate);
if (makeCurrentItem) { if (makeCurrentItem) {
setCurrentPlanViewIndex(newItem->sequenceNumber(), true); setCurrentPlanViewIndex(newItem->sequenceNumber(), true);
...@@ -466,7 +461,7 @@ VisualMissionItem* MissionController::insertComplexMissionItem(QString itemName, ...@@ -466,7 +461,7 @@ VisualMissionItem* MissionController::insertComplexMissionItem(QString itemName,
return nullptr; return nullptr;
} }
_insertComplexMissionItemWorker(newItem, visualItemIndex, makeCurrentItem); _insertComplexMissionItemWorker(mapCenterCoordinate, newItem, visualItemIndex, makeCurrentItem);
return newItem; return newItem;
} }
...@@ -486,12 +481,12 @@ VisualMissionItem* MissionController::insertComplexMissionItemFromKMLOrSHP(QStri ...@@ -486,12 +481,12 @@ VisualMissionItem* MissionController::insertComplexMissionItemFromKMLOrSHP(QStri
return nullptr; return nullptr;
} }
_insertComplexMissionItemWorker(newItem, visualItemIndex, makeCurrentItem); _insertComplexMissionItemWorker(QGeoCoordinate(), newItem, visualItemIndex, makeCurrentItem);
return newItem; return newItem;
} }
void MissionController::_insertComplexMissionItemWorker(ComplexMissionItem* complexItem, int visualItemIndex, bool makeCurrentItem) void MissionController::_insertComplexMissionItemWorker(const QGeoCoordinate& mapCenterCoordinate, ComplexMissionItem* complexItem, int visualItemIndex, bool makeCurrentItem)
{ {
int sequenceNumber = _nextSequenceNumber(); int sequenceNumber = _nextSequenceNumber();
bool surveyStyleItem = qobject_cast<SurveyComplexItem*>(complexItem) || bool surveyStyleItem = qobject_cast<SurveyComplexItem*>(complexItem) ||
...@@ -538,7 +533,7 @@ void MissionController::_insertComplexMissionItemWorker(ComplexMissionItem* comp ...@@ -538,7 +533,7 @@ void MissionController::_insertComplexMissionItemWorker(ComplexMissionItem* comp
if(!complexItem->isSimpleItem()) { if(!complexItem->isSimpleItem()) {
connect(complexItem, &ComplexMissionItem::boundingCubeChanged, this, &MissionController::_complexBoundingBoxChanged); connect(complexItem, &ComplexMissionItem::boundingCubeChanged, this, &MissionController::_complexBoundingBoxChanged);
} }
_recalcAll(); _recalcAllWithCoordinate(mapCenterCoordinate);
if (makeCurrentItem) { if (makeCurrentItem) {
setCurrentPlanViewIndex(complexItem->sequenceNumber(), true); setCurrentPlanViewIndex(complexItem->sequenceNumber(), true);
...@@ -1649,6 +1644,7 @@ void MissionController::_recalcChildItems(void) ...@@ -1649,6 +1644,7 @@ void MissionController::_recalcChildItems(void)
void MissionController::_setPlannedHomePositionFromFirstCoordinate(const QGeoCoordinate& clickCoordinate) void MissionController::_setPlannedHomePositionFromFirstCoordinate(const QGeoCoordinate& clickCoordinate)
{ {
bool foundFirstCoordinate = false;
QGeoCoordinate firstCoordinate; QGeoCoordinate firstCoordinate;
if (_settingsItem->coordinate().isValid()) { if (_settingsItem->coordinate().isValid()) {
...@@ -1659,14 +1655,15 @@ void MissionController::_setPlannedHomePositionFromFirstCoordinate(const QGeoCoo ...@@ -1659,14 +1655,15 @@ void MissionController::_setPlannedHomePositionFromFirstCoordinate(const QGeoCoo
for (int i=1; i<_visualItems->count(); i++) { for (int i=1; i<_visualItems->count(); i++) {
VisualMissionItem* item = _visualItems->value<VisualMissionItem*>(i); VisualMissionItem* item = _visualItems->value<VisualMissionItem*>(i);
if (item->specifiesCoordinate()) { if (item->specifiesCoordinate() && item->coordinate().isValid()) {
foundFirstCoordinate = true;
firstCoordinate = item->coordinate(); firstCoordinate = item->coordinate();
break; break;
} }
} }
// No item specifying a coordinate was found, in this case it we have a clickCoordinate use that // No item specifying a coordinate was found, in this case it we have a clickCoordinate use that
if (!firstCoordinate.isValid()) { if (!foundFirstCoordinate) {
firstCoordinate = clickCoordinate; firstCoordinate = clickCoordinate;
} }
...@@ -1677,11 +1674,10 @@ void MissionController::_setPlannedHomePositionFromFirstCoordinate(const QGeoCoo ...@@ -1677,11 +1674,10 @@ void MissionController::_setPlannedHomePositionFromFirstCoordinate(const QGeoCoo
} }
} }
/// @param clickCoordinate The location of the user click when inserting a new item void MissionController::_recalcAllWithCoordinate(const QGeoCoordinate& coordinate)
void MissionController::_recalcAllWithClickCoordinate(QGeoCoordinate& clickCoordinate)
{ {
if (!_flyView) { if (!_flyView) {
_setPlannedHomePositionFromFirstCoordinate(clickCoordinate); _setPlannedHomePositionFromFirstCoordinate(coordinate);
} }
_recalcSequence(); _recalcSequence();
_recalcChildItems(); _recalcChildItems();
...@@ -1692,7 +1688,7 @@ void MissionController::_recalcAllWithClickCoordinate(QGeoCoordinate& clickCoord ...@@ -1692,7 +1688,7 @@ void MissionController::_recalcAllWithClickCoordinate(QGeoCoordinate& clickCoord
void MissionController::_recalcAll(void) void MissionController::_recalcAll(void)
{ {
QGeoCoordinate emptyCoord; QGeoCoordinate emptyCoord;
_recalcAllWithClickCoordinate(emptyCoord); _recalcAllWithCoordinate(emptyCoord);
} }
/// Initializes a new set of mission items /// Initializes a new set of mission items
...@@ -1708,8 +1704,6 @@ void MissionController::_initAllVisualItems(void) ...@@ -1708,8 +1704,6 @@ void MissionController::_initAllVisualItems(void)
} }
} }
_settingsItem->setHomePositionFromVehicle(_managerVehicle);
connect(_settingsItem, &MissionSettingsItem::coordinateChanged, this, &MissionController::_recalcAll); connect(_settingsItem, &MissionSettingsItem::coordinateChanged, this, &MissionController::_recalcAll);
connect(_settingsItem, &MissionSettingsItem::coordinateChanged, this, &MissionController::plannedHomePositionChanged); connect(_settingsItem, &MissionSettingsItem::coordinateChanged, this, &MissionController::plannedHomePositionChanged);
...@@ -1817,39 +1811,14 @@ void MissionController::managerVehicleChanged(Vehicle* managerVehicle) ...@@ -1817,39 +1811,14 @@ void MissionController::managerVehicleChanged(Vehicle* managerVehicle)
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);
connect(_managerVehicle, &Vehicle::homePositionChanged, this, &MissionController::_managerVehicleHomePositionChanged);
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);
if (!_masterController->offline()) {
_managerVehicleHomePositionChanged();
}
emit complexMissionItemNamesChanged(); emit complexMissionItemNamesChanged();
emit resumeMissionIndexChanged(); emit resumeMissionIndexChanged();
} }
void MissionController::_managerVehicleHomePositionChanged(void)
{
if (_visualItems) {
bool currentDirtyBit = dirty();
MissionSettingsItem* settingsItem = qobject_cast<MissionSettingsItem*>(_visualItems->get(0));
if (settingsItem) {
settingsItem->setHomePositionFromVehicle(_managerVehicle);
} else {
qWarning() << "First item is not MissionSettingsItem";
}
if (!currentDirtyBit) {
// Don't let this trip the dirty bit. Otherwise plan will keep getting marked dirty if vehicle home
// changes.
_visualItems->setDirty(false);
}
}
}
void MissionController::_inProgressChanged(bool inProgress) void MissionController::_inProgressChanged(bool inProgress)
{ {
emit syncInProgressChanged(inProgress); emit syncInProgressChanged(inProgress);
...@@ -1858,8 +1827,8 @@ void MissionController::_inProgressChanged(bool inProgress) ...@@ -1858,8 +1827,8 @@ void MissionController::_inProgressChanged(bool inProgress)
bool MissionController::_findPreviousAltitude(int newIndex, double* prevAltitude, int* prevAltitudeMode) bool MissionController::_findPreviousAltitude(int newIndex, double* prevAltitude, int* prevAltitudeMode)
{ {
bool found = false; bool found = false;
double foundAltitude; double foundAltitude = 0;
int foundAltitudeMode; int foundAltitudeMode = QGroundControlQmlGlobal::AltitudeModeNone;
if (newIndex > _visualItems->count()) { if (newIndex > _visualItems->count()) {
return false; return false;
...@@ -1907,9 +1876,8 @@ MissionSettingsItem* MissionController::_addMissionSettings(QmlObjectListModel* ...@@ -1907,9 +1876,8 @@ MissionSettingsItem* MissionController::_addMissionSettings(QmlObjectListModel*
{ {
qCDebug(MissionControllerLog) << "_addMissionSettings"; qCDebug(MissionControllerLog) << "_addMissionSettings";
MissionSettingsItem* settingsItem = new MissionSettingsItem(_controllerVehicle, _flyView, visualItems); MissionSettingsItem* settingsItem = new MissionSettingsItem(_managerVehicle, _flyView, visualItems);
visualItems->insert(0, settingsItem); visualItems->insert(0, settingsItem);
settingsItem->setHomePositionFromVehicle(_managerVehicle);
if (visualItems == _visualItems) { if (visualItems == _visualItems) {
_settingsItem = settingsItem; _settingsItem = settingsItem;
......
...@@ -260,7 +260,6 @@ signals: ...@@ -260,7 +260,6 @@ signals:
private slots: private slots:
void _newMissionItemsAvailableFromVehicle(bool removeAllRequested); void _newMissionItemsAvailableFromVehicle(bool removeAllRequested);
void _itemCommandChanged(void); void _itemCommandChanged(void);
void _managerVehicleHomePositionChanged(void);
void _inProgressChanged(bool inProgress); void _inProgressChanged(bool inProgress);
void _currentMissionIndexChanged(int sequenceNumber); void _currentMissionIndexChanged(int sequenceNumber);
void _recalcWaypointLines(void); void _recalcWaypointLines(void);
...@@ -278,7 +277,7 @@ private: ...@@ -278,7 +277,7 @@ private:
void _init(void); void _init(void);
void _recalcSequence(void); void _recalcSequence(void);
void _recalcChildItems(void); void _recalcChildItems(void);
void _recalcAllWithClickCoordinate(QGeoCoordinate& clickCoordinate); void _recalcAllWithCoordinate(const QGeoCoordinate& coordinate);
void _initAllVisualItems(void); void _initAllVisualItems(void);
void _deinitAllVisualItems(void); void _deinitAllVisualItems(void);
void _initVisualItem(VisualMissionItem* item); void _initVisualItem(VisualMissionItem* item);
...@@ -308,7 +307,7 @@ private: ...@@ -308,7 +307,7 @@ private:
CoordinateVector* _addWaypointLineSegment(CoordVectHashTable& prevItemPairHashTable, VisualItemPair& pair); CoordinateVector* _addWaypointLineSegment(CoordVectHashTable& prevItemPairHashTable, VisualItemPair& pair);
void _addTimeDistance(bool vtolInHover, double hoverTime, double cruiseTime, double extraTime, double distance, int seqNum); void _addTimeDistance(bool vtolInHover, double hoverTime, double cruiseTime, double extraTime, double distance, int seqNum);
VisualMissionItem* _insertSimpleMissionItemWorker(QGeoCoordinate coordinate, MAV_CMD command, int visualItemIndex, bool makeCurrentItem); VisualMissionItem* _insertSimpleMissionItemWorker(QGeoCoordinate coordinate, MAV_CMD command, int visualItemIndex, bool makeCurrentItem);
void _insertComplexMissionItemWorker(ComplexMissionItem* complexItem, int visualItemIndex, bool makeCurrentItem); void _insertComplexMissionItemWorker(const QGeoCoordinate& mapCenterCoordinate, ComplexMissionItem* complexItem, int visualItemIndex, bool makeCurrentItem);
void _warnIfTerrainFrameUsed(void); void _warnIfTerrainFrameUsed(void);
private: private:
......
...@@ -47,17 +47,16 @@ MissionSettingsItem::MissionSettingsItem(Vehicle* vehicle, bool flyView, QObject ...@@ -47,17 +47,16 @@ MissionSettingsItem::MissionSettingsItem(Vehicle* vehicle, bool flyView, QObject
connect(this, &MissionSettingsItem::specifyMissionFlightSpeedChanged, this, &MissionSettingsItem::_setDirtyAndUpdateLastSequenceNumber); connect(this, &MissionSettingsItem::specifyMissionFlightSpeedChanged, this, &MissionSettingsItem::_setDirtyAndUpdateLastSequenceNumber);
connect(&_cameraSection, &CameraSection::itemCountChanged, this, &MissionSettingsItem::_setDirtyAndUpdateLastSequenceNumber); connect(&_cameraSection, &CameraSection::itemCountChanged, this, &MissionSettingsItem::_setDirtyAndUpdateLastSequenceNumber);
connect(&_speedSection, &CameraSection::itemCountChanged, this, &MissionSettingsItem::_setDirtyAndUpdateLastSequenceNumber); connect(&_speedSection, &CameraSection::itemCountChanged, this, &MissionSettingsItem::_setDirtyAndUpdateLastSequenceNumber);
connect(this, &MissionSettingsItem::terrainAltitudeChanged, this, &MissionSettingsItem::_setHomeAltFromTerrain); connect(this, &MissionSettingsItem::terrainAltitudeChanged, this, &MissionSettingsItem::_setHomeAltFromTerrain);
connect(&_cameraSection, &CameraSection::dirtyChanged, this, &MissionSettingsItem::_sectionDirtyChanged);
connect(&_speedSection, &SpeedSection::dirtyChanged, this, &MissionSettingsItem::_sectionDirtyChanged);
connect(&_cameraSection, &CameraSection::specifiedGimbalYawChanged, this, &MissionSettingsItem::specifiedGimbalYawChanged);
connect(&_cameraSection, &CameraSection::specifiedGimbalPitchChanged, this, &MissionSettingsItem::specifiedGimbalPitchChanged);
connect(&_speedSection, &SpeedSection::specifiedFlightSpeedChanged, this, &MissionSettingsItem::specifiedFlightSpeedChanged);
connect(_vehicle, &Vehicle::homePositionChanged, this, &MissionSettingsItem::_updateHomePosition);
connect(&_plannedHomePositionAltitudeFact, &Fact::rawValueChanged, this, &MissionSettingsItem::_updateAltitudeInCoordinate); connect(&_plannedHomePositionAltitudeFact, &Fact::rawValueChanged, this, &MissionSettingsItem::_updateAltitudeInCoordinate);
connect(&_cameraSection, &CameraSection::dirtyChanged, this, &MissionSettingsItem::_sectionDirtyChanged); _updateHomePosition(_vehicle->homePosition());
connect(&_speedSection, &SpeedSection::dirtyChanged, this, &MissionSettingsItem::_sectionDirtyChanged);
connect(&_cameraSection, &CameraSection::specifiedGimbalYawChanged, this, &MissionSettingsItem::specifiedGimbalYawChanged);
connect(&_cameraSection, &CameraSection::specifiedGimbalPitchChanged, this, &MissionSettingsItem::specifiedGimbalPitchChanged);
connect(&_speedSection, &SpeedSection::specifiedFlightSpeedChanged, this, &MissionSettingsItem::specifiedFlightSpeedChanged);
} }
int MissionSettingsItem::lastSequenceNumber(void) const int MissionSettingsItem::lastSequenceNumber(void) const
...@@ -285,3 +284,10 @@ QString MissionSettingsItem::abbreviation(void) const ...@@ -285,3 +284,10 @@ QString MissionSettingsItem::abbreviation(void) const
{ {
return _flyView ? tr("H") : tr("Launch"); return _flyView ? tr("H") : tr("Launch");
} }
void MissionSettingsItem::_updateHomePosition(const QGeoCoordinate& homePosition)
{
if (_flyView) {
setCoordinate(homePosition);
}
}
...@@ -100,6 +100,7 @@ private slots: ...@@ -100,6 +100,7 @@ private slots:
void _updateAltitudeInCoordinate (QVariant value); void _updateAltitudeInCoordinate (QVariant value);
void _setHomeAltFromTerrain (double terrainAltitude); void _setHomeAltFromTerrain (double terrainAltitude);
void _setCoordinateWorker (const QGeoCoordinate& coordinate); void _setCoordinateWorker (const QGeoCoordinate& coordinate);
void _updateHomePosition (const QGeoCoordinate& homePosition);
private: private:
QGeoCoordinate _plannedHomePositionCoordinate; // Does not include altitude QGeoCoordinate _plannedHomePositionCoordinate; // Does not include altitude
......
...@@ -50,15 +50,21 @@ void TakeoffMissionItem::_init(void) ...@@ -50,15 +50,21 @@ void TakeoffMissionItem::_init(void)
{ {
_editorQml = QStringLiteral("qrc:/qml/SimpleItemEditor.qml"); _editorQml = QStringLiteral("qrc:/qml/SimpleItemEditor.qml");
if (_settingsItem->coordinate().isValid()) { QGeoCoordinate homePosition = _vehicle->homePosition();
// Either the user has set a Launch location or it came from a connected vehicle. if (homePosition.isValid()) {
// Use it as starting point. _settingsItem->setCoordinate(homePosition);
setCoordinate(_settingsItem->coordinate());
} }
connect(_settingsItem, &MissionSettingsItem::coordinateChanged, this, &TakeoffMissionItem::launchCoordinateChanged); connect(_settingsItem, &MissionSettingsItem::coordinateChanged, this, &TakeoffMissionItem::launchCoordinateChanged);
_initLaunchTakeoffAtSameLocation(); _initLaunchTakeoffAtSameLocation();
if (_launchTakeoffAtSameLocation && homePosition.isValid()) {
_wizardMode = false;
SimpleMissionItem::setCoordinate(homePosition);
} else {
_wizardMode = true;
}
setDirty(false); setDirty(false);
} }
...@@ -76,19 +82,11 @@ void TakeoffMissionItem::setLaunchTakeoffAtSameLocation(bool launchTakeoffAtSame ...@@ -76,19 +82,11 @@ void TakeoffMissionItem::setLaunchTakeoffAtSameLocation(bool launchTakeoffAtSame
void TakeoffMissionItem::setCoordinate(const QGeoCoordinate& coordinate) void TakeoffMissionItem::setCoordinate(const QGeoCoordinate& coordinate)
{ {
if (this->coordinate().isValid() || !_vehicle->fixedWing()) { if (coordinate != this->coordinate()) {
if (coordinate != this->coordinate()) { SimpleMissionItem::setCoordinate(coordinate);
if (_launchTakeoffAtSameLocation) { if (_launchTakeoffAtSameLocation) {
setLaunchCoordinate(coordinate); _settingsItem->setCoordinate(coordinate);
}
SimpleMissionItem::setCoordinate(coordinate);
}
} else {
// First time setup for fixed wing
if (!launchCoordinate().isValid()) {
setLaunchCoordinate(coordinate);
} }
SimpleMissionItem::setCoordinate(launchCoordinate().atDistanceAndAzimuth(60, 0));
} }
} }
...@@ -99,10 +97,22 @@ bool TakeoffMissionItem::isTakeoffCommand(MAV_CMD command) ...@@ -99,10 +97,22 @@ bool TakeoffMissionItem::isTakeoffCommand(MAV_CMD command)
void TakeoffMissionItem::_initLaunchTakeoffAtSameLocation(void) void TakeoffMissionItem::_initLaunchTakeoffAtSameLocation(void)
{ {
if (_vehicle->fixedWing()) { if (specifiesCoordinate()) {
setLaunchTakeoffAtSameLocation(!specifiesCoordinate()); if (_vehicle->fixedWing()) {
setLaunchTakeoffAtSameLocation(false);
} else {
// PX4 specifies a coordinate for takeoff even for non fixed wing. But it makes more sense to not have a coordinate
// from and end user standpoint. So even for PX4 we try to keep launch and takeoff at the same position. Unless the
// user has moved/loaded launch at a different location than takeoff.
if (coordinate().isValid() && _settingsItem->coordinate().isValid()) {
setLaunchTakeoffAtSameLocation(coordinate().latitude() == _settingsItem->coordinate().latitude() && coordinate().longitude() == _settingsItem->coordinate().longitude());
} else {
setLaunchTakeoffAtSameLocation(true);
}
}
} else { } else {
setLaunchTakeoffAtSameLocation(coordinate().latitude() == _settingsItem->coordinate().latitude() && coordinate().longitude() == _settingsItem->coordinate().longitude()); setLaunchTakeoffAtSameLocation(true);
} }
} }
...@@ -123,3 +133,33 @@ bool TakeoffMissionItem::load(const QJsonObject& json, int sequenceNumber, QStri ...@@ -123,3 +133,33 @@ bool TakeoffMissionItem::load(const QJsonObject& json, int sequenceNumber, QStri
} }
return success; return success;
} }
void TakeoffMissionItem::setLaunchCoordinate(const QGeoCoordinate& launchCoordinate)
{
if (!launchCoordinate.isValid()) {
return;
}
_settingsItem->setCoordinate(launchCoordinate);
if (!coordinate().isValid()) {
QGeoCoordinate takeoffCoordinate;
if (_launchTakeoffAtSameLocation) {
takeoffCoordinate = launchCoordinate;
} else {
double altitude = this->altitude()->rawValue().toDouble();
double distance = 0.0;
if (coordinateHasRelativeAltitude()) {
// Offset for fixed wing climb out of 30 degrees
if (altitude != 0.0) {
distance = altitude / tan(qDegreesToRadians(30.0));
}
} else {
distance = altitude * 1.5;
}
takeoffCoordinate = launchCoordinate.atDistanceAndAzimuth(distance, 0);
}
SimpleMissionItem::setCoordinate(takeoffCoordinate);
}
}
...@@ -29,7 +29,7 @@ public: ...@@ -29,7 +29,7 @@ public:
QGeoCoordinate launchCoordinate (void) const { return _settingsItem->coordinate(); } QGeoCoordinate launchCoordinate (void) const { return _settingsItem->coordinate(); }
bool launchTakeoffAtSameLocation (void) const { return _launchTakeoffAtSameLocation; } bool launchTakeoffAtSameLocation (void) const { return _launchTakeoffAtSameLocation; }
void setLaunchCoordinate (const QGeoCoordinate& launchCoordinate) { _settingsItem->setCoordinate(launchCoordinate); } void setLaunchCoordinate (const QGeoCoordinate& launchCoordinate);
void setLaunchTakeoffAtSameLocation (bool launchTakeoffAtSameLocation); void setLaunchTakeoffAtSameLocation (bool launchTakeoffAtSameLocation);
static bool isTakeoffCommand(MAV_CMD command); static bool isTakeoffCommand(MAV_CMD command);
......
...@@ -179,6 +179,8 @@ Item { ...@@ -179,6 +179,8 @@ Item {
anchors.fill: map anchors.fill: map
z: QGroundControl.zOrderMapItems + 1 // Over item indicators z: QGroundControl.zOrderMapItems + 1 // Over item indicators
readonly property int _decimalPlaces: 8
onClicked: { onClicked: {
var coordinate = map.toCoordinate(Qt.point(mouse.x, mouse.y), false /* clipToViewPort */) var coordinate = map.toCoordinate(Qt.point(mouse.x, mouse.y), false /* clipToViewPort */)
coordinate.latitude = coordinate.latitude.toFixed(_decimalPlaces) coordinate.latitude = coordinate.latitude.toFixed(_decimalPlaces)
......
...@@ -38,8 +38,7 @@ Item { ...@@ -38,8 +38,7 @@ Item {
property real _rowSpacing: ScreenTools.isMobile ? 1 : 0 property real _rowSpacing: ScreenTools.isMobile ? 1 : 0
property real _distance: _statusValid && _currentMissionItem ? _currentMissionItem.distance : NaN property real _distance: _statusValid && _currentMissionItem ? _currentMissionItem.distance : NaN
property real _altDifference: _statusValid && _currentMissionItem ? _currentMissionItem.altDifference : NaN property real _altDifference: _statusValid && _currentMissionItem ? _currentMissionItem.altDifference : NaN
property real _gradient: _statusValid && _currentMissionItem && _currentMissionItem.distance > 0 ? Math.atan(_currentMissionItem.altDifference / _currentMissionItem.distance) : NaN property real _gradient: _statusValid && _currentMissionItem && _currentMissionItem.distance > 0 ? (Math.atan(_currentMissionItem.altDifference / _currentMissionItem.distance) * (180.0/Math.PI)) : NaN
property real _gradientPercent: isNaN(_gradient) ? NaN : _gradient * 100
property real _azimuth: _statusValid && _currentMissionItem ? _currentMissionItem.azimuth : NaN property real _azimuth: _statusValid && _currentMissionItem ? _currentMissionItem.azimuth : NaN
property real _heading: _statusValid && _currentMissionItem ? _currentMissionItem.missionVehicleYaw : NaN property real _heading: _statusValid && _currentMissionItem ? _currentMissionItem.missionVehicleYaw : NaN
property real _missionDistance: _missionValid ? missionDistance : NaN property real _missionDistance: _missionValid ? missionDistance : NaN
...@@ -53,7 +52,7 @@ Item { ...@@ -53,7 +52,7 @@ Item {
property string _distanceText: isNaN(_distance) ? "-.-" : QGroundControl.metersToAppSettingsDistanceUnits(_distance).toFixed(1) + " " + QGroundControl.appSettingsDistanceUnitsString property string _distanceText: isNaN(_distance) ? "-.-" : QGroundControl.metersToAppSettingsDistanceUnits(_distance).toFixed(1) + " " + QGroundControl.appSettingsDistanceUnitsString
property string _altDifferenceText: isNaN(_altDifference) ? "-.-" : QGroundControl.metersToAppSettingsDistanceUnits(_altDifference).toFixed(1) + " " + QGroundControl.appSettingsDistanceUnitsString property string _altDifferenceText: isNaN(_altDifference) ? "-.-" : QGroundControl.metersToAppSettingsDistanceUnits(_altDifference).toFixed(1) + " " + QGroundControl.appSettingsDistanceUnitsString
property string _gradientText: isNaN(_gradient) ? "-.-" : _gradientPercent.toFixed(0) + " %" property string _gradientText: isNaN(_gradient) ? "-.-" : _gradient.toFixed(0) + " %"
property string _azimuthText: isNaN(_azimuth) ? "-.-" : Math.round(_azimuth) % 360 property string _azimuthText: isNaN(_azimuth) ? "-.-" : Math.round(_azimuth) % 360
property string _headingText: isNaN(_azimuth) ? "-.-" : Math.round(_heading) % 360 property string _headingText: isNaN(_azimuth) ? "-.-" : Math.round(_heading) % 360
property string _missionDistanceText: isNaN(_missionDistance) ? "-.-" : QGroundControl.metersToAppSettingsDistanceUnits(_missionDistance).toFixed(0) + " " + QGroundControl.appSettingsDistanceUnitsString property string _missionDistanceText: isNaN(_missionDistance) ? "-.-" : QGroundControl.metersToAppSettingsDistanceUnits(_missionDistance).toFixed(0) + " " + QGroundControl.appSettingsDistanceUnitsString
......
...@@ -63,24 +63,29 @@ Rectangle { ...@@ -63,24 +63,29 @@ Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
spacing: _margin spacing: _margin
visible: missionItem.wizardMode visible: missionItem.isTakeoffItem && missionItem.wizardMode // Hack special case for takeoff item
QGCLabel { QGCLabel {
text: qsTr("Adjust the initial launch location by dragging 'L' indicator to the desired location.") id: initialClickLabel
text: missionItem.launchTakeoffAtSameLocation ?
qsTr("Click in map to set Takeoff location.") :
qsTr("Click in map to set Launch location.")
Layout.fillWidth: true Layout.fillWidth: true
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
visible: !missionItem.launchTakeoffAtSameLocation visible: missionItem.isTakeoffItem && !missionItem.launchCoordinate.isValid
} }
QGCLabel { QGCLabel {
text: qsTr("Adjust the takeoff %1 location by dragging 'T' indicator to the desired location.").arg(missionItem.launchTakeoffAtSameLocation ? "" : qsTr("completion ")) text: qsTr("Adjust the takeoff completion location by dragging 'T' indicator to the desired location.")
Layout.fillWidth: true Layout.fillWidth: true
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
visible: !initialClickLabel.visible
} }
QGCButton { QGCButton {
text: qsTr("Done Adjusting") text: qsTr("Done Adjusting")
Layout.fillWidth: true Layout.fillWidth: true
visible: !initialClickLabel.visible
onClicked: { onClicked: {
missionItem.wizardMode = false missionItem.wizardMode = false
editorRoot.selectNextNotReadyItem() editorRoot.selectNextNotReadyItem()
......
...@@ -46,12 +46,16 @@ Item { ...@@ -46,12 +46,16 @@ Item {
QGCDynamicObjectManager { id: _objMgrCommonVisuals } QGCDynamicObjectManager { id: _objMgrCommonVisuals }
QGCDynamicObjectManager { id: _objMgrEditingVisuals } QGCDynamicObjectManager { id: _objMgrEditingVisuals }
QGCDynamicObjectManager { id: _objMgrMouseClick }
Component.onCompleted: { Component.onCompleted: {
addCommonVisuals() addCommonVisuals()
if (_missionItem.isCurrentItem && map.planView) { if (_missionItem.isCurrentItem && map.planView) {
addEditingVisuals() addEditingVisuals()
} }
if (!_missionItem.launchCoordinate.isValid) {
_objMgrMouseClick.createObject(mouseAreaClickComponent, map, false /* addToMap */)
}
} }
Connections { Connections {
...@@ -127,4 +131,28 @@ Item { ...@@ -127,4 +131,28 @@ Item {
} }
} }
} }
// Mouse area to capture launch location click
Component {
id: mouseAreaClickComponent
MouseArea {
anchors.fill: map
z: QGroundControl.zOrderMapItems + 1 // Over item indicators
readonly property int _decimalPlaces: 8
onClicked: {
var coordinate = map.toCoordinate(Qt.point(mouse.x, mouse.y), false /* clipToViewPort */)
coordinate.latitude = coordinate.latitude.toFixed(_decimalPlaces)
coordinate.longitude = coordinate.longitude.toFixed(_decimalPlaces)
coordinate.altitude = coordinate.altitude.toFixed(_decimalPlaces)
_missionItem.launchCoordinate = coordinate
if (_missionItem.launchTakeoffAtSameLocation) {
_missionItem.wizardMode = false
}
_objMgrMouseClick.destroyObjects()
}
}
}
} }
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