Unverified Commit 5c09454c authored by Don Gagne's avatar Don Gagne Committed by GitHub

Merge pull request #7886 from DonLakeFlyer/WizardMode

Wizard Mode for Create Plan
parents 79618021 42897a63
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "CorridorScanPlanCreator.h" #include "CorridorScanPlanCreator.h"
#include "PlanMasterController.h" #include "PlanMasterController.h"
#include "MissionSettingsItem.h" #include "MissionSettingsItem.h"
#include "FixedWingLandingComplexItem.h"
CorridorScanPlanCreator::CorridorScanPlanCreator(PlanMasterController* planMasterController, QObject* parent) CorridorScanPlanCreator::CorridorScanPlanCreator(PlanMasterController* planMasterController, QObject* parent)
: PlanCreator(planMasterController, MissionController::patternCorridorScanName, QStringLiteral("/qmlimages/PlanCreator/CorridorScanPlanCreator.png"), parent) : PlanCreator(planMasterController, MissionController::patternCorridorScanName, QStringLiteral("/qmlimages/PlanCreator/CorridorScanPlanCreator.png"), parent)
...@@ -20,19 +21,16 @@ CorridorScanPlanCreator::CorridorScanPlanCreator(PlanMasterController* planMaste ...@@ -20,19 +21,16 @@ CorridorScanPlanCreator::CorridorScanPlanCreator(PlanMasterController* planMaste
void CorridorScanPlanCreator::createPlan(const QGeoCoordinate& mapCenterCoord) void CorridorScanPlanCreator::createPlan(const QGeoCoordinate& mapCenterCoord)
{ {
_planMasterController->removeAll(); _planMasterController->removeAll();
int seqNum = _missionController->insertComplexMissionItem( VisualMissionItem* takeoffItem = _missionController->insertSimpleMissionItem(mapCenterCoord, -1);
MissionController::patternCorridorScanName, takeoffItem->setWizardMode(true);
mapCenterCoord, _missionController->insertComplexMissionItem(MissionController::patternCorridorScanName, mapCenterCoord, -1)->setWizardMode(true);
_missionController->visualItems()->count());
if (_planMasterController->managerVehicle()->fixedWing()) { if (_planMasterController->managerVehicle()->fixedWing()) {
_missionController->insertComplexMissionItem( FixedWingLandingComplexItem* landingItem = qobject_cast<FixedWingLandingComplexItem*>(_missionController->insertComplexMissionItem(MissionController::patternFWLandingName, mapCenterCoord, -1));
MissionController::patternFWLandingName, landingItem->setWizardMode(true);
mapCenterCoord, landingItem->setLoiterDragAngleOnly(true);
_missionController->visualItems()->count());
} else { } else {
MissionSettingsItem* settingsItem = _missionController->visualItems()->value<MissionSettingsItem*>(0); MissionSettingsItem* settingsItem = _missionController->visualItems()->value<MissionSettingsItem*>(0);
settingsItem->setMissionEndRTL(true); settingsItem->setMissionEndRTL(true);
} }
_missionController->setCurrentPlanViewIndex(seqNum, false); _missionController->setCurrentPlanViewIndex(takeoffItem->sequenceNumber(), true);
} }
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "CustomPlanCreator.h" #include "CustomPlanCreator.h"
#include "PlanMasterController.h" #include "PlanMasterController.h"
#include "MissionSettingsItem.h" #include "MissionSettingsItem.h"
#include "FixedWingLandingComplexItem.h"
CustomPlanCreator::CustomPlanCreator(PlanMasterController* planMasterController, QObject* parent) CustomPlanCreator::CustomPlanCreator(PlanMasterController* planMasterController, QObject* parent)
: PlanCreator(planMasterController, tr("Custom"), QStringLiteral("/qmlimages/PlanCreator/CustomPlanCreator.png"), parent) : PlanCreator(planMasterController, tr("Custom"), QStringLiteral("/qmlimages/PlanCreator/CustomPlanCreator.png"), parent)
...@@ -20,18 +21,18 @@ CustomPlanCreator::CustomPlanCreator(PlanMasterController* planMasterController, ...@@ -20,18 +21,18 @@ CustomPlanCreator::CustomPlanCreator(PlanMasterController* planMasterController,
void CustomPlanCreator::createPlan(const QGeoCoordinate& mapCenterCoord) void CustomPlanCreator::createPlan(const QGeoCoordinate& mapCenterCoord)
{ {
_planMasterController->removeAll(); _planMasterController->removeAll();
int seqNum = _missionController->insertSimpleMissionItem(mapCenterCoord, _missionController->visualItems()->count()); VisualMissionItem* takeoffItem = _missionController->insertSimpleMissionItem(mapCenterCoord, -1);
_missionController->insertSimpleMissionItem(mapCenterCoord.atDistanceAndAzimuth(50, 135), _missionController->visualItems()->count()); takeoffItem->setWizardMode(true);
_missionController->insertSimpleMissionItem(mapCenterCoord.atDistanceAndAzimuth(50, -135), _missionController->visualItems()->count()); _missionController->insertSimpleMissionItem(mapCenterCoord.atDistanceAndAzimuth(50, 135), -1)->setWizardMode(true);
_missionController->insertSimpleMissionItem(mapCenterCoord.atDistanceAndAzimuth(50, -135),-1)->setWizardMode(true);
if (_planMasterController->managerVehicle()->fixedWing()) { if (_planMasterController->managerVehicle()->fixedWing()) {
_missionController->insertComplexMissionItem( FixedWingLandingComplexItem* landingItem = qobject_cast<FixedWingLandingComplexItem*>(_missionController->insertComplexMissionItem(MissionController::patternFWLandingName, mapCenterCoord, -1));
MissionController::patternFWLandingName, landingItem->setWizardMode(true);
mapCenterCoord, landingItem->setLoiterDragAngleOnly(true);
_missionController->visualItems()->count());
} else { } else {
MissionSettingsItem* settingsItem = _missionController->visualItems()->value<MissionSettingsItem*>(0); MissionSettingsItem* settingsItem = _missionController->visualItems()->value<MissionSettingsItem*>(0);
settingsItem->setMissionEndRTL(true); settingsItem->setMissionEndRTL(true);
} }
_missionController->setCurrentPlanViewIndex(seqNum, false); _missionController->setCurrentPlanViewIndex(takeoffItem->sequenceNumber(), true);
} }
...@@ -51,6 +51,7 @@ FixedWingLandingComplexItem::FixedWingLandingComplexItem(Vehicle* vehicle, bool ...@@ -51,6 +51,7 @@ FixedWingLandingComplexItem::FixedWingLandingComplexItem(Vehicle* vehicle, bool
, _dirty (false) , _dirty (false)
, _landingCoordSet (false) , _landingCoordSet (false)
, _ignoreRecalcSignals (false) , _ignoreRecalcSignals (false)
, _loiterDragAngleOnly (false)
, _metaDataMap (FactMetaData::createMapFromJsonFile(QStringLiteral(":/json/FWLandingPattern.FactMetaData.json"), this)) , _metaDataMap (FactMetaData::createMapFromJsonFile(QStringLiteral(":/json/FWLandingPattern.FactMetaData.json"), this))
, _landingDistanceFact (settingsGroup, _metaDataMap[loiterToLandDistanceName]) , _landingDistanceFact (settingsGroup, _metaDataMap[loiterToLandDistanceName])
, _loiterAltitudeFact (settingsGroup, _metaDataMap[loiterAltitudeName]) , _loiterAltitudeFact (settingsGroup, _metaDataMap[loiterAltitudeName])
...@@ -101,6 +102,8 @@ FixedWingLandingComplexItem::FixedWingLandingComplexItem(Vehicle* vehicle, bool ...@@ -101,6 +102,8 @@ FixedWingLandingComplexItem::FixedWingLandingComplexItem(Vehicle* vehicle, bool
connect(this, &FixedWingLandingComplexItem::altitudesAreRelativeChanged, this, &FixedWingLandingComplexItem::exitCoordinateHasRelativeAltitudeChanged); connect(this, &FixedWingLandingComplexItem::altitudesAreRelativeChanged, this, &FixedWingLandingComplexItem::exitCoordinateHasRelativeAltitudeChanged);
connect(this, &FixedWingLandingComplexItem::landingCoordSetChanged, this, &FixedWingLandingComplexItem::readyForSaveStateChanged); connect(this, &FixedWingLandingComplexItem::landingCoordSetChanged, this, &FixedWingLandingComplexItem::readyForSaveStateChanged);
connect(this, &FixedWingLandingComplexItem::wizardModeChanged, this, &FixedWingLandingComplexItem::readyForSaveStateChanged);
if (vehicle->apmFirmware()) { if (vehicle->apmFirmware()) {
// ArduPilot does not support camera commands // ArduPilot does not support camera commands
_stopTakingVideoFact.setRawValue(false); _stopTakingVideoFact.setRawValue(false);
...@@ -712,5 +715,13 @@ void FixedWingLandingComplexItem::_signalLastSequenceNumberChanged(void) ...@@ -712,5 +715,13 @@ void FixedWingLandingComplexItem::_signalLastSequenceNumberChanged(void)
FixedWingLandingComplexItem::ReadyForSaveState FixedWingLandingComplexItem::readyForSaveState(void) const FixedWingLandingComplexItem::ReadyForSaveState FixedWingLandingComplexItem::readyForSaveState(void) const
{ {
return _landingCoordSet ? ReadyForSave : NotReadyForSaveData; return _landingCoordSet && !_wizardMode ? ReadyForSave : NotReadyForSaveData;
}
void FixedWingLandingComplexItem::setLoiterDragAngleOnly(bool loiterDragAngleOnly)
{
if (loiterDragAngleOnly != _loiterDragAngleOnly) {
_loiterDragAngleOnly = loiterDragAngleOnly;
emit loiterDragAngleOnlyChanged(_loiterDragAngleOnly);
}
} }
...@@ -26,21 +26,22 @@ class FixedWingLandingComplexItem : public ComplexMissionItem ...@@ -26,21 +26,22 @@ class FixedWingLandingComplexItem : public ComplexMissionItem
public: public:
FixedWingLandingComplexItem(Vehicle* vehicle, bool flyView, QObject* parent); FixedWingLandingComplexItem(Vehicle* vehicle, bool flyView, QObject* parent);
Q_PROPERTY(Fact* loiterAltitude READ loiterAltitude CONSTANT) Q_PROPERTY(Fact* loiterAltitude READ loiterAltitude CONSTANT)
Q_PROPERTY(Fact* loiterRadius READ loiterRadius CONSTANT) Q_PROPERTY(Fact* loiterRadius READ loiterRadius CONSTANT)
Q_PROPERTY(Fact* landingAltitude READ landingAltitude CONSTANT) Q_PROPERTY(Fact* landingAltitude READ landingAltitude CONSTANT)
Q_PROPERTY(Fact* landingHeading READ landingHeading CONSTANT) Q_PROPERTY(Fact* landingHeading READ landingHeading CONSTANT)
Q_PROPERTY(Fact* valueSetIsDistance READ valueSetIsDistance CONSTANT) Q_PROPERTY(Fact* valueSetIsDistance READ valueSetIsDistance CONSTANT)
Q_PROPERTY(Fact* landingDistance READ landingDistance CONSTANT) Q_PROPERTY(Fact* landingDistance READ landingDistance CONSTANT)
Q_PROPERTY(Fact* glideSlope READ glideSlope CONSTANT) Q_PROPERTY(Fact* glideSlope READ glideSlope CONSTANT)
Q_PROPERTY(bool loiterClockwise MEMBER _loiterClockwise NOTIFY loiterClockwiseChanged) Q_PROPERTY(bool loiterClockwise MEMBER _loiterClockwise NOTIFY loiterClockwiseChanged)
Q_PROPERTY(bool altitudesAreRelative MEMBER _altitudesAreRelative NOTIFY altitudesAreRelativeChanged) Q_PROPERTY(bool altitudesAreRelative MEMBER _altitudesAreRelative NOTIFY altitudesAreRelativeChanged)
Q_PROPERTY(Fact* stopTakingPhotos READ stopTakingPhotos CONSTANT) Q_PROPERTY(Fact* stopTakingPhotos READ stopTakingPhotos CONSTANT)
Q_PROPERTY(Fact* stopTakingVideo READ stopTakingVideo CONSTANT) Q_PROPERTY(Fact* stopTakingVideo READ stopTakingVideo CONSTANT)
Q_PROPERTY(QGeoCoordinate loiterCoordinate READ loiterCoordinate WRITE setLoiterCoordinate NOTIFY loiterCoordinateChanged) Q_PROPERTY(QGeoCoordinate loiterCoordinate READ loiterCoordinate WRITE setLoiterCoordinate NOTIFY loiterCoordinateChanged)
Q_PROPERTY(QGeoCoordinate loiterTangentCoordinate READ loiterTangentCoordinate NOTIFY loiterTangentCoordinateChanged) Q_PROPERTY(QGeoCoordinate loiterTangentCoordinate READ loiterTangentCoordinate NOTIFY loiterTangentCoordinateChanged)
Q_PROPERTY(QGeoCoordinate landingCoordinate READ landingCoordinate WRITE setLandingCoordinate NOTIFY landingCoordinateChanged) Q_PROPERTY(QGeoCoordinate landingCoordinate READ landingCoordinate WRITE setLandingCoordinate NOTIFY landingCoordinateChanged)
Q_PROPERTY(bool landingCoordSet MEMBER _landingCoordSet NOTIFY landingCoordSetChanged) Q_PROPERTY(bool landingCoordSet MEMBER _landingCoordSet NOTIFY landingCoordSetChanged)
Q_PROPERTY(bool loiterDragAngleOnly READ loiterDragAngleOnly WRITE setLoiterDragAngleOnly NOTIFY loiterDragAngleOnlyChanged)
Fact* loiterAltitude (void) { return &_loiterAltitudeFact; } Fact* loiterAltitude (void) { return &_loiterAltitudeFact; }
Fact* loiterRadius (void) { return &_loiterRadiusFact; } Fact* loiterRadius (void) { return &_loiterRadiusFact; }
...@@ -54,9 +55,11 @@ public: ...@@ -54,9 +55,11 @@ public:
QGeoCoordinate landingCoordinate (void) const { return _landingCoordinate; } QGeoCoordinate landingCoordinate (void) const { return _landingCoordinate; }
QGeoCoordinate loiterCoordinate (void) const { return _loiterCoordinate; } QGeoCoordinate loiterCoordinate (void) const { return _loiterCoordinate; }
QGeoCoordinate loiterTangentCoordinate (void) const { return _loiterTangentCoordinate; } QGeoCoordinate loiterTangentCoordinate (void) const { return _loiterTangentCoordinate; }
bool loiterDragAngleOnly (void) const { return _loiterDragAngleOnly; }
void setLandingCoordinate (const QGeoCoordinate& coordinate); void setLandingCoordinate (const QGeoCoordinate& coordinate);
void setLoiterCoordinate (const QGeoCoordinate& coordinate); void setLoiterCoordinate (const QGeoCoordinate& coordinate);
void setLoiterDragAngleOnly (bool loiterDragAngleOnly);
/// Scans the loaded items for a landing pattern complex item /// Scans the loaded items for a landing pattern complex item
static bool scanForItem(QmlObjectListModel* visualItems, bool flyView, Vehicle* vehicle); static bool scanForItem(QmlObjectListModel* visualItems, bool flyView, Vehicle* vehicle);
...@@ -66,7 +69,6 @@ public: ...@@ -66,7 +69,6 @@ public:
static MissionItem* createLandItem (int seqNum, bool altRel, double lat, double lon, double alt, QObject* parent); static MissionItem* createLandItem (int seqNum, bool altRel, double lat, double lon, double alt, QObject* parent);
// Overrides from ComplexMissionItem // Overrides from ComplexMissionItem
double complexDistance (void) const final; double complexDistance (void) const final;
int lastSequenceNumber (void) const final; int lastSequenceNumber (void) const final;
bool load (const QJsonObject& complexObject, int sequenceNumber, QString& errorString) final; bool load (const QJsonObject& complexObject, int sequenceNumber, QString& errorString) final;
...@@ -123,6 +125,7 @@ signals: ...@@ -123,6 +125,7 @@ signals:
void loiterClockwiseChanged (bool loiterClockwise); void loiterClockwiseChanged (bool loiterClockwise);
void altitudesAreRelativeChanged (bool altitudesAreRelative); void altitudesAreRelativeChanged (bool altitudesAreRelative);
void valueSetIsDistanceChanged (bool valueSetIsDistance); void valueSetIsDistanceChanged (bool valueSetIsDistance);
void loiterDragAngleOnlyChanged (bool loiterDragAngleOnly);
private slots: private slots:
void _recalcFromHeadingAndDistanceChange (void); void _recalcFromHeadingAndDistanceChange (void);
...@@ -147,6 +150,7 @@ private: ...@@ -147,6 +150,7 @@ private:
QGeoCoordinate _landingCoordinate; QGeoCoordinate _landingCoordinate;
bool _landingCoordSet; bool _landingCoordSet;
bool _ignoreRecalcSignals; bool _ignoreRecalcSignals;
bool _loiterDragAngleOnly;
QMap<QString, FactMetaData*> _metaDataMap; QMap<QString, FactMetaData*> _metaDataMap;
......
...@@ -349,7 +349,7 @@ int MissionController::_nextSequenceNumber(void) ...@@ -349,7 +349,7 @@ int MissionController::_nextSequenceNumber(void)
} }
} }
int MissionController::insertSimpleMissionItem(QGeoCoordinate coordinate, int visualItemIndex) VisualMissionItem* MissionController::insertSimpleMissionItem(QGeoCoordinate coordinate, int visualItemIndex, bool makeCurrentItem)
{ {
int sequenceNumber = _nextSequenceNumber(); int sequenceNumber = _nextSequenceNumber();
SimpleMissionItem * newItem = new SimpleMissionItem(_controllerVehicle, _flyView, this); SimpleMissionItem * newItem = new SimpleMissionItem(_controllerVehicle, _flyView, this);
...@@ -373,15 +373,23 @@ int MissionController::insertSimpleMissionItem(QGeoCoordinate coordinate, int vi ...@@ -373,15 +373,23 @@ int MissionController::insertSimpleMissionItem(QGeoCoordinate coordinate, int vi
} }
} }
newItem->setMissionFlightStatus(_missionFlightStatus); newItem->setMissionFlightStatus(_missionFlightStatus);
_visualItems->insert(visualItemIndex, newItem); if (visualItemIndex == -1) {
_visualItems->append(newItem);
} else {
_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 // 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); _recalcAllWithClickCoordinate(coordinate);
return newItem->sequenceNumber(); if (makeCurrentItem) {
setCurrentPlanViewIndex(newItem->sequenceNumber(), true);
}
return newItem;
} }
int MissionController::insertROIMissionItem(QGeoCoordinate coordinate, int visualItemIndex) VisualMissionItem* MissionController::insertROIMissionItem(QGeoCoordinate coordinate, int visualItemIndex, bool makeCurrentItem)
{ {
int sequenceNumber = _nextSequenceNumber(); int sequenceNumber = _nextSequenceNumber();
SimpleMissionItem * newItem = new SimpleMissionItem(_controllerVehicle, _flyView, this); SimpleMissionItem * newItem = new SimpleMissionItem(_controllerVehicle, _flyView, this);
...@@ -399,16 +407,24 @@ int MissionController::insertROIMissionItem(QGeoCoordinate coordinate, int visua ...@@ -399,16 +407,24 @@ int MissionController::insertROIMissionItem(QGeoCoordinate coordinate, int visua
newItem->altitude()->setRawValue(prevAltitude); newItem->altitude()->setRawValue(prevAltitude);
newItem->setAltitudeMode(static_cast<QGroundControlQmlGlobal::AltitudeMode>(prevAltitudeMode)); newItem->setAltitudeMode(static_cast<QGroundControlQmlGlobal::AltitudeMode>(prevAltitudeMode));
} }
_visualItems->insert(visualItemIndex, newItem); if (visualItemIndex == -1) {
_visualItems->append(newItem);
} else {
_visualItems->insert(visualItemIndex, newItem);
}
_recalcAll(); _recalcAll();
return newItem->sequenceNumber(); if (makeCurrentItem) {
setCurrentPlanViewIndex(newItem->sequenceNumber(), true);
}
return newItem;
} }
int MissionController::insertComplexMissionItem(QString itemName, QGeoCoordinate mapCenterCoordinate, int visualItemIndex) VisualMissionItem* MissionController::insertComplexMissionItem(QString itemName, QGeoCoordinate mapCenterCoordinate, int visualItemIndex, bool makeCurrentItem)
{ {
ComplexMissionItem* newItem; ComplexMissionItem* newItem = nullptr;
// If the ComplexMissionItem is inserted first, add a TakeOff SimpleMissionItem // If the ComplexMissionItem is inserted first, add a TakeOff SimpleMissionItem
if (_visualItems->count() == 1 && (_controllerVehicle->fixedWing() || _controllerVehicle->vtol() || _controllerVehicle->multiRotor())) { if (_visualItems->count() == 1 && (_controllerVehicle->fixedWing() || _controllerVehicle->vtol() || _controllerVehicle->multiRotor())) {
...@@ -416,7 +432,6 @@ int MissionController::insertComplexMissionItem(QString itemName, QGeoCoordinate ...@@ -416,7 +432,6 @@ int MissionController::insertComplexMissionItem(QString itemName, QGeoCoordinate
visualItemIndex++; visualItemIndex++;
} }
int sequenceNumber = _nextSequenceNumber();
if (itemName == patternSurveyName) { if (itemName == patternSurveyName) {
newItem = new SurveyComplexItem(_controllerVehicle, _flyView, QString() /* kmlFile */, _visualItems /* parent */); newItem = new SurveyComplexItem(_controllerVehicle, _flyView, QString() /* kmlFile */, _visualItems /* parent */);
newItem->setCoordinate(mapCenterCoordinate); newItem->setCoordinate(mapCenterCoordinate);
...@@ -428,15 +443,17 @@ int MissionController::insertComplexMissionItem(QString itemName, QGeoCoordinate ...@@ -428,15 +443,17 @@ int MissionController::insertComplexMissionItem(QString itemName, QGeoCoordinate
newItem = new CorridorScanComplexItem(_controllerVehicle, _flyView, QString() /* kmlFile */, _visualItems /* parent */); newItem = new CorridorScanComplexItem(_controllerVehicle, _flyView, QString() /* kmlFile */, _visualItems /* parent */);
} else { } else {
qWarning() << "Internal error: Unknown complex item:" << itemName; qWarning() << "Internal error: Unknown complex item:" << itemName;
return sequenceNumber; return nullptr;
} }
return _insertComplexMissionItemWorker(newItem, visualItemIndex); _insertComplexMissionItemWorker(newItem, visualItemIndex, makeCurrentItem);
return newItem;
} }
int MissionController::insertComplexMissionItemFromKMLOrSHP(QString itemName, QString file, int visualItemIndex) VisualMissionItem* MissionController::insertComplexMissionItemFromKMLOrSHP(QString itemName, QString file, int visualItemIndex, bool makeCurrentItem)
{ {
ComplexMissionItem* newItem; ComplexMissionItem* newItem = nullptr;
if (itemName == patternSurveyName) { if (itemName == patternSurveyName) {
newItem = new SurveyComplexItem(_controllerVehicle, _flyView, file, _visualItems); newItem = new SurveyComplexItem(_controllerVehicle, _flyView, file, _visualItems);
...@@ -446,13 +463,15 @@ int MissionController::insertComplexMissionItemFromKMLOrSHP(QString itemName, QS ...@@ -446,13 +463,15 @@ int MissionController::insertComplexMissionItemFromKMLOrSHP(QString itemName, QS
newItem = new CorridorScanComplexItem(_controllerVehicle, _flyView, file, _visualItems); newItem = new CorridorScanComplexItem(_controllerVehicle, _flyView, file, _visualItems);
} else { } else {
qWarning() << "Internal error: Unknown complex item:" << itemName; qWarning() << "Internal error: Unknown complex item:" << itemName;
return _nextSequenceNumber(); return nullptr;
} }
return _insertComplexMissionItemWorker(newItem, visualItemIndex); _insertComplexMissionItemWorker(newItem, visualItemIndex, makeCurrentItem);
return newItem;
} }
int MissionController::_insertComplexMissionItemWorker(ComplexMissionItem* complexItem, int visualItemIndex) void MissionController::_insertComplexMissionItemWorker(ComplexMissionItem* complexItem, int visualItemIndex, bool makeCurrentItem)
{ {
int sequenceNumber = _nextSequenceNumber(); int sequenceNumber = _nextSequenceNumber();
bool surveyStyleItem = qobject_cast<SurveyComplexItem*>(complexItem) || bool surveyStyleItem = qobject_cast<SurveyComplexItem*>(complexItem) ||
...@@ -500,7 +519,9 @@ int MissionController::_insertComplexMissionItemWorker(ComplexMissionItem* compl ...@@ -500,7 +519,9 @@ int MissionController::_insertComplexMissionItemWorker(ComplexMissionItem* compl
} }
_recalcAll(); _recalcAll();
return complexItem->sequenceNumber(); if (makeCurrentItem) {
setCurrentPlanViewIndex(complexItem->sequenceNumber(), true);
}
} }
void MissionController::removeMissionItem(int index) void MissionController::removeMissionItem(int index)
......
...@@ -103,28 +103,35 @@ public: ...@@ -103,28 +103,35 @@ public:
Q_INVOKABLE void removeMissionItem(int index); Q_INVOKABLE void removeMissionItem(int index);
/// Add a new simple mission item to the list /// Add a new simple mission item to the list
/// @param visualItemIndex: index to insert at /// @param coordinate: Coordinate for item
/// @return Sequence number for new item /// @param visualItemIndex: index to insert at, -1 for end of list
Q_INVOKABLE int insertSimpleMissionItem(QGeoCoordinate coordinate, int visualItemIndex); /// @param makeCurrentItem: true: Make this item the current item
/// @return Newly created item
Q_INVOKABLE VisualMissionItem* insertSimpleMissionItem(QGeoCoordinate coordinate, int visualItemIndex, bool makeCurrentItem = false);
/// Add a new ROI mission item to the list /// Add a new ROI mission item to the list
/// @param visualItemIndex: index to insert at /// @param coordinate: Coordinate for item
/// @return Sequence number for new item /// @param visualItemIndex: index to insert at, -1 for end of list
Q_INVOKABLE int insertROIMissionItem(QGeoCoordinate coordinate, int visualItemIndex); /// @param makeCurrentItem: true: Make this item the current item
/// @return Newly created item
Q_INVOKABLE VisualMissionItem* insertROIMissionItem(QGeoCoordinate coordinate, int visualItemIndex, bool makeCurrentItem = false);
/// Add a new complex mission item to the list /// Add a new complex mission item to the list
/// @param itemName: Name of complex item to create (from complexMissionItemNames) /// @param itemName: Name of complex item to create (from complexMissionItemNames)
/// @param mapCenterCoordinate: coordinate for current center of map /// @param mapCenterCoordinate: coordinate for current center of map
/// @param visualItemIndex: index to insert at /// @param visualItemIndex: index to insert at, -1 for end of list
/// @return Sequence number for new item /// @param makeCurrentItem: true: Make this item the current item
Q_INVOKABLE int insertComplexMissionItem(QString itemName, QGeoCoordinate mapCenterCoordinate, int visualItemIndex); /// @return Newly created item
Q_INVOKABLE VisualMissionItem* insertComplexMissionItem(QString itemName, QGeoCoordinate mapCenterCoordinate, int visualItemIndex, bool makeCurrentItem = false);
/// Add a new complex mission item to the list /// Add a new complex mission item to the list
/// @param itemName: Name of complex item to create (from complexMissionItemNames) /// @param itemName: Name of complex item to create (from complexMissionItemNames)
/// @param file: kml or shp file to load from shape from /// @param file: kml or shp file to load from shape from
/// @param visualItemIndex: index to insert at, -1 for end /// @param coordinate: Coordinate for item
/// @return Sequence number for new item /// @param visualItemIndex: index to insert at, -1 for end of list
Q_INVOKABLE int insertComplexMissionItemFromKMLOrSHP(QString itemName, QString file, int visualItemIndex); /// @param makeCurrentItem: true: Make this item the current item
/// @return Newly created item
Q_INVOKABLE VisualMissionItem* insertComplexMissionItemFromKMLOrSHP(QString itemName, QString file, int visualItemIndex, bool makeCurrentItem = false);
Q_INVOKABLE void resumeMission(int resumeIndex); Q_INVOKABLE void resumeMission(int resumeIndex);
...@@ -284,7 +291,7 @@ private: ...@@ -284,7 +291,7 @@ private:
void _initLoadedVisualItems(QmlObjectListModel* loadedVisualItems); void _initLoadedVisualItems(QmlObjectListModel* loadedVisualItems);
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);
int _insertComplexMissionItemWorker(ComplexMissionItem* complexItem, int visualItemIndex); void _insertComplexMissionItemWorker(ComplexMissionItem* complexItem, int visualItemIndex, bool makeCurrentItem);
void _warnIfTerrainFrameUsed(void); void _warnIfTerrainFrameUsed(void);
private: private:
......
...@@ -200,6 +200,8 @@ void SimpleMissionItem::_connectSignals(void) ...@@ -200,6 +200,8 @@ void SimpleMissionItem::_connectSignals(void)
connect(this, &SimpleMissionItem::cameraSectionChanged, this, &SimpleMissionItem::_setDirty); connect(this, &SimpleMissionItem::cameraSectionChanged, this, &SimpleMissionItem::_setDirty);
connect(this, &SimpleMissionItem::cameraSectionChanged, this, &SimpleMissionItem::_updateLastSequenceNumber); connect(this, &SimpleMissionItem::cameraSectionChanged, this, &SimpleMissionItem::_updateLastSequenceNumber);
connect(this, &SimpleMissionItem::wizardModeChanged, this, &SimpleMissionItem::readyForSaveStateChanged);
// These are coordinate parameters, they must emit coordinateChanged signal // These are coordinate parameters, they must emit coordinateChanged signal
connect(&_missionItem._param5Fact, &Fact::valueChanged, this, &SimpleMissionItem::_sendCoordinateChanged); connect(&_missionItem._param5Fact, &Fact::valueChanged, this, &SimpleMissionItem::_sendCoordinateChanged);
connect(&_missionItem._param6Fact, &Fact::valueChanged, this, &SimpleMissionItem::_sendCoordinateChanged); connect(&_missionItem._param6Fact, &Fact::valueChanged, this, &SimpleMissionItem::_sendCoordinateChanged);
...@@ -325,6 +327,7 @@ bool SimpleMissionItem::load(QTextStream &loadStream) ...@@ -325,6 +327,7 @@ bool SimpleMissionItem::load(QTextStream &loadStream)
} }
_updateOptionalSections(); _updateOptionalSections();
} }
return success; return success;
} }
...@@ -726,6 +729,10 @@ void SimpleMissionItem::_terrainAltChanged(void) ...@@ -726,6 +729,10 @@ void SimpleMissionItem::_terrainAltChanged(void)
SimpleMissionItem::ReadyForSaveState SimpleMissionItem::readyForSaveState(void) const SimpleMissionItem::ReadyForSaveState SimpleMissionItem::readyForSaveState(void) const
{ {
if (_wizardMode) {
return NotReadyForSaveData;
}
bool terrainReady = !specifiesAltitude() || !qIsNaN(_missionItem._param7Fact.rawValue().toDouble()); bool terrainReady = !specifiesAltitude() || !qIsNaN(_missionItem._param7Fact.rawValue().toDouble());
return terrainReady ? ReadyForSave : NotReadyForSaveTerrain; return terrainReady ? ReadyForSave : NotReadyForSaveTerrain;
} }
......
...@@ -99,7 +99,6 @@ public: ...@@ -99,7 +99,6 @@ public:
const MissionItem& missionItem(void) const { return _missionItem; } const MissionItem& missionItem(void) const { return _missionItem; }
// Overrides from VisualMissionItem // Overrides from VisualMissionItem
bool dirty (void) const final { return _dirty; } bool dirty (void) const final { return _dirty; }
bool isSimpleItem (void) const final { return true; } bool isSimpleItem (void) const final { return true; }
bool isStandaloneCoordinate (void) const final; bool isStandaloneCoordinate (void) const final;
...@@ -154,7 +153,7 @@ private slots: ...@@ -154,7 +153,7 @@ private slots:
void _rebuildFacts (void); void _rebuildFacts (void);
void _rebuildTextFieldFacts (void); void _rebuildTextFieldFacts (void);
void _possibleAdditionalTimeDelayChanged(void); void _possibleAdditionalTimeDelayChanged(void);
void _setDefaultsForCommand (void); void _setDefaultsForCommand (void);
private: private:
void _connectSignals (void); void _connectSignals (void);
......
...@@ -87,6 +87,8 @@ StructureScanComplexItem::StructureScanComplexItem(Vehicle* vehicle, bool flyVie ...@@ -87,6 +87,8 @@ StructureScanComplexItem::StructureScanComplexItem(Vehicle* vehicle, bool flyVie
connect(&_layersFact, &Fact::valueChanged, this, &StructureScanComplexItem::_recalcScanDistance); connect(&_layersFact, &Fact::valueChanged, this, &StructureScanComplexItem::_recalcScanDistance);
connect(&_flightPolygon, &QGCMapPolygon::pathChanged, this, &StructureScanComplexItem::_recalcScanDistance); connect(&_flightPolygon, &QGCMapPolygon::pathChanged, this, &StructureScanComplexItem::_recalcScanDistance);
connect(this, &StructureScanComplexItem::wizardModeChanged, this, &StructureScanComplexItem::readyForSaveStateChanged);
_recalcLayerInfo(); _recalcLayerInfo();
if (!kmlOrShpFile.isEmpty()) { if (!kmlOrShpFile.isEmpty()) {
...@@ -621,5 +623,5 @@ void StructureScanComplexItem::_recalcScanDistance() ...@@ -621,5 +623,5 @@ void StructureScanComplexItem::_recalcScanDistance()
StructureScanComplexItem::ReadyForSaveState StructureScanComplexItem::readyForSaveState(void) const StructureScanComplexItem::ReadyForSaveState StructureScanComplexItem::readyForSaveState(void) const
{ {
return _structurePolygon.isValid() ? ReadyForSave : NotReadyForSaveData; return _structurePolygon.isValid() && !_wizardMode ? ReadyForSave : NotReadyForSaveData;
} }
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "StructureScanPlanCreator.h" #include "StructureScanPlanCreator.h"
#include "PlanMasterController.h" #include "PlanMasterController.h"
#include "MissionSettingsItem.h" #include "MissionSettingsItem.h"
#include "FixedWingLandingComplexItem.h"
StructureScanPlanCreator::StructureScanPlanCreator(PlanMasterController* planMasterController, QObject* parent) StructureScanPlanCreator::StructureScanPlanCreator(PlanMasterController* planMasterController, QObject* parent)
: PlanCreator(planMasterController, MissionController::patternStructureScanName, QStringLiteral("/qmlimages/PlanCreator/StructureScanPlanCreator.png"), parent) : PlanCreator(planMasterController, MissionController::patternStructureScanName, QStringLiteral("/qmlimages/PlanCreator/StructureScanPlanCreator.png"), parent)
...@@ -20,18 +21,16 @@ StructureScanPlanCreator::StructureScanPlanCreator(PlanMasterController* planMas ...@@ -20,18 +21,16 @@ StructureScanPlanCreator::StructureScanPlanCreator(PlanMasterController* planMas
void StructureScanPlanCreator::createPlan(const QGeoCoordinate& mapCenterCoord) void StructureScanPlanCreator::createPlan(const QGeoCoordinate& mapCenterCoord)
{ {
_planMasterController->removeAll(); _planMasterController->removeAll();
int seqNum = _missionController->insertComplexMissionItem( VisualMissionItem* takeoffItem = _missionController->insertSimpleMissionItem(mapCenterCoord, -1);
MissionController::patternStructureScanName, takeoffItem->setWizardMode(true);
mapCenterCoord, _missionController->insertComplexMissionItem(MissionController::patternStructureScanName, mapCenterCoord, -1)->setWizardMode(true);
_missionController->visualItems()->count());
if (_planMasterController->managerVehicle()->fixedWing()) { if (_planMasterController->managerVehicle()->fixedWing()) {
_missionController->insertComplexMissionItem( FixedWingLandingComplexItem* landingItem = qobject_cast<FixedWingLandingComplexItem*>(_missionController->insertComplexMissionItem(MissionController::patternFWLandingName, mapCenterCoord, -1));
MissionController::patternFWLandingName, landingItem->setWizardMode(true);
mapCenterCoord, landingItem->setLoiterDragAngleOnly(true);
_missionController->visualItems()->count());
} else { } else {
MissionSettingsItem* settingsItem = _missionController->visualItems()->value<MissionSettingsItem*>(0); MissionSettingsItem* settingsItem = _missionController->visualItems()->value<MissionSettingsItem*>(0);
settingsItem->setMissionEndRTL(true); settingsItem->setMissionEndRTL(true);
} }
_missionController->setCurrentPlanViewIndex(seqNum, false); _missionController->setCurrentPlanViewIndex(takeoffItem->sequenceNumber(), true);
} }
...@@ -10,6 +10,8 @@ ...@@ -10,6 +10,8 @@
#include "SurveyPlanCreator.h" #include "SurveyPlanCreator.h"
#include "PlanMasterController.h" #include "PlanMasterController.h"
#include "MissionSettingsItem.h" #include "MissionSettingsItem.h"
#include "FixedWingLandingComplexItem.h"
#include "FixedWingLandingComplexItem.h"
SurveyPlanCreator::SurveyPlanCreator(PlanMasterController* planMasterController, QObject* parent) SurveyPlanCreator::SurveyPlanCreator(PlanMasterController* planMasterController, QObject* parent)
: PlanCreator(planMasterController, MissionController::patternSurveyName, QStringLiteral("/qmlimages/PlanCreator/SurveyPlanCreator.png"), parent) : PlanCreator(planMasterController, MissionController::patternSurveyName, QStringLiteral("/qmlimages/PlanCreator/SurveyPlanCreator.png"), parent)
...@@ -20,18 +22,16 @@ SurveyPlanCreator::SurveyPlanCreator(PlanMasterController* planMasterController, ...@@ -20,18 +22,16 @@ SurveyPlanCreator::SurveyPlanCreator(PlanMasterController* planMasterController,
void SurveyPlanCreator::createPlan(const QGeoCoordinate& mapCenterCoord) void SurveyPlanCreator::createPlan(const QGeoCoordinate& mapCenterCoord)
{ {
_planMasterController->removeAll(); _planMasterController->removeAll();
int seqNum = _missionController->insertComplexMissionItem( VisualMissionItem* takeoffItem = _missionController->insertSimpleMissionItem(mapCenterCoord, -1);
MissionController::patternSurveyName, takeoffItem->setWizardMode(true);
mapCenterCoord, _missionController->insertComplexMissionItem(MissionController::patternSurveyName, mapCenterCoord, -1)->setWizardMode(true);
_missionController->visualItems()->count());
if (_planMasterController->managerVehicle()->fixedWing()) { if (_planMasterController->managerVehicle()->fixedWing()) {
_missionController->insertComplexMissionItem( FixedWingLandingComplexItem* landingItem = qobject_cast<FixedWingLandingComplexItem*>(_missionController->insertComplexMissionItem(MissionController::patternFWLandingName, mapCenterCoord, -1));
MissionController::patternFWLandingName, landingItem->setWizardMode(true);
mapCenterCoord, landingItem->setLoiterDragAngleOnly(true);
_missionController->visualItems()->count());
} else { } else {
MissionSettingsItem* settingsItem = _missionController->visualItems()->value<MissionSettingsItem*>(0); MissionSettingsItem* settingsItem = _missionController->visualItems()->value<MissionSettingsItem*>(0);
settingsItem->setMissionEndRTL(true); settingsItem->setMissionEndRTL(true);
} }
_missionController->setCurrentPlanViewIndex(seqNum, false); _missionController->setCurrentPlanViewIndex(takeoffItem->sequenceNumber(), true);
} }
...@@ -106,8 +106,8 @@ TransectStyleComplexItem::TransectStyleComplexItem(Vehicle* vehicle, bool flyVie ...@@ -106,8 +106,8 @@ TransectStyleComplexItem::TransectStyleComplexItem(Vehicle* vehicle, bool flyVie
connect(this, &TransectStyleComplexItem::visualTransectPointsChanged, this, &TransectStyleComplexItem::complexDistanceChanged); connect(this, &TransectStyleComplexItem::visualTransectPointsChanged, this, &TransectStyleComplexItem::complexDistanceChanged);
connect(this, &TransectStyleComplexItem::visualTransectPointsChanged, this, &TransectStyleComplexItem::greatestDistanceToChanged); connect(this, &TransectStyleComplexItem::visualTransectPointsChanged, this, &TransectStyleComplexItem::greatestDistanceToChanged);
connect(this, &TransectStyleComplexItem::followTerrainChanged, this, &TransectStyleComplexItem::_followTerrainChanged);
connect(this, &TransectStyleComplexItem::followTerrainChanged, this, &TransectStyleComplexItem::_followTerrainChanged); connect(this, &TransectStyleComplexItem::wizardModeChanged, this, &TransectStyleComplexItem::readyForSaveStateChanged);
connect(&_surveyAreaPolygon, &QGCMapPolygon::isValidChanged, this, &TransectStyleComplexItem::readyForSaveStateChanged); connect(&_surveyAreaPolygon, &QGCMapPolygon::isValidChanged, this, &TransectStyleComplexItem::readyForSaveStateChanged);
...@@ -494,7 +494,7 @@ TransectStyleComplexItem::ReadyForSaveState TransectStyleComplexItem::readyForSa ...@@ -494,7 +494,7 @@ TransectStyleComplexItem::ReadyForSaveState TransectStyleComplexItem::readyForSa
{ {