Commit a45768c6 authored by DonLakeFlyer's avatar DonLakeFlyer

Better resume mission generation

Fixed a pile of bugs as well
parent 09bde0c7
...@@ -90,8 +90,9 @@ QGCView { ...@@ -90,8 +90,9 @@ QGCView {
} }
MissionController { MissionController {
id: flyMissionController id: flyMissionController
Component.onCompleted: start(false /* editMode */) Component.onCompleted: start(false /* editMode */)
onResumeMissionReady: guidedActionsController.confirmAction(guidedActionsController.actionResumeMissionReady)
} }
MessageDialog { MessageDialog {
......
...@@ -87,11 +87,6 @@ Item { ...@@ -87,11 +87,6 @@ Item {
onValueChanged: _setInstrumentWidget() onValueChanged: _setInstrumentWidget()
} }
Connections {
target: missionController
onResumeMissionReady: _guidedModeBar.confirmAction(_guidedModeBar.confirmResumeMissionReady)
}
Component.onCompleted: { Component.onCompleted: {
_setInstrumentWidget() _setInstrumentWidget()
} }
......
...@@ -51,7 +51,7 @@ Item { ...@@ -51,7 +51,7 @@ Item {
readonly property string emergencyStopMessage: qsTr("WARNING: This still stop all motors. If vehicle is currently in air it will crash.") readonly property string emergencyStopMessage: qsTr("WARNING: This still stop all motors. If vehicle is currently in air it will crash.")
readonly property string takeoffMessage: qsTr("Takeoff from ground and hold position.") readonly property string takeoffMessage: qsTr("Takeoff from ground and hold position.")
readonly property string startMissionMessage: qsTr("Start the mission which is currently displayed above. If the vehicle is on the ground it will takeoff.") readonly property string startMissionMessage: qsTr("Start the mission which is currently displayed above. If the vehicle is on the ground it will takeoff.")
property string resumeMissionMessage: qsTr("Resume the mission which is displayed above. This will re-generate the mission from waypoint %1, takeoff and continue the mission.").arg(_resumeMissionItem) property string resumeMissionMessage: qsTr("Resume the mission which is displayed above. This will re-generate the mission from waypoint %1, takeoff and continue the mission.").arg(_resumeMissionIndex)
readonly property string resumeMissionReadyMessage: qsTr("Review the modified mission above. Confirm if you want to takeoff and begin mission.") readonly property string resumeMissionReadyMessage: qsTr("Review the modified mission above. Confirm if you want to takeoff and begin mission.")
readonly property string landMessage: qsTr("Land the vehicle at the current position.") readonly property string landMessage: qsTr("Land the vehicle at the current position.")
readonly property string rtlMessage: qsTr("Return to the home position of the vehicle.") readonly property string rtlMessage: qsTr("Return to the home position of the vehicle.")
...@@ -84,7 +84,7 @@ Item { ...@@ -84,7 +84,7 @@ Item {
property bool showTakeoff: _activeVehicle && _activeVehicle.guidedModeSupported && !_activeVehicle.flying && !_activeVehicle.fixedWing property bool showTakeoff: _activeVehicle && _activeVehicle.guidedModeSupported && !_activeVehicle.flying && !_activeVehicle.fixedWing
property bool showLand: _activeVehicle && _activeVehicle.guidedModeSupported && _activeVehicle.armed && !_activeVehicle.fixedWing && !_vehicleInLandMode property bool showLand: _activeVehicle && _activeVehicle.guidedModeSupported && _activeVehicle.armed && !_activeVehicle.fixedWing && !_vehicleInLandMode
property bool showStartMission: _activeVehicle && _missionAvailable && !_missionActive property bool showStartMission: _activeVehicle && _missionAvailable && !_missionActive
property bool showResumeMission: _activeVehicle && !_activeVehicle.flying && _missionAvailable && _resumeMissionItem > 1 property bool showResumeMission: _activeVehicle && !_activeVehicle.flying && _missionAvailable && _resumeMissionIndex > 0
property bool showPause: _activeVehicle && _activeVehicle.armed && _activeVehicle.pauseVehicleSupported && _activeVehicle.flying && !_vehiclePaused property bool showPause: _activeVehicle && _activeVehicle.armed && _activeVehicle.pauseVehicleSupported && _activeVehicle.flying && !_vehiclePaused
property bool showChangeAlt: (_activeVehicle && _activeVehicle.flying) && _activeVehicle.guidedModeSupported && _activeVehicle.armed && !_missionActive property bool showChangeAlt: (_activeVehicle && _activeVehicle.flying) && _activeVehicle.guidedModeSupported && _activeVehicle.armed && !_missionActive
property bool showOrbit: !_hideOrbit && _activeVehicle && _activeVehicle.flying && _activeVehicle.orbitModeSupported && _activeVehicle.armed && !_missionActive property bool showOrbit: !_hideOrbit && _activeVehicle && _activeVehicle.flying && _activeVehicle.orbitModeSupported && _activeVehicle.armed && !_missionActive
...@@ -97,7 +97,7 @@ Item { ...@@ -97,7 +97,7 @@ Item {
property bool _vehiclePaused: _activeVehicle ? _activeVehicle.flightMode === _activeVehicle.pauseFlightMode : false property bool _vehiclePaused: _activeVehicle ? _activeVehicle.flightMode === _activeVehicle.pauseFlightMode : false
property bool _vehicleInRTLMode: _activeVehicle ? _activeVehicle.flightMode === _activeVehicle.rtlFlightMode : false property bool _vehicleInRTLMode: _activeVehicle ? _activeVehicle.flightMode === _activeVehicle.rtlFlightMode : false
property bool _vehicleInLandMode: _activeVehicle ? _activeVehicle.flightMode === _activeVehicle.landFlightMode : false property bool _vehicleInLandMode: _activeVehicle ? _activeVehicle.flightMode === _activeVehicle.landFlightMode : false
property int _resumeMissionItem: missionController.resumeMissionItem property int _resumeMissionIndex: missionController.resumeMissionIndex
property bool _hideEmergenyStop: !QGroundControl.corePlugin.options.guidedBarShowEmergencyStop property bool _hideEmergenyStop: !QGroundControl.corePlugin.options.guidedBarShowEmergencyStop
property bool _hideOrbit: !QGroundControl.corePlugin.options.guidedBarShowOrbit property bool _hideOrbit: !QGroundControl.corePlugin.options.guidedBarShowOrbit
property var _actionData property var _actionData
...@@ -174,6 +174,9 @@ Item { ...@@ -174,6 +174,9 @@ Item {
title = pauseTitle title = pauseTitle
message = pauseMessage message = pauseMessage
break; break;
default:
console.warn("Unknown actionCode", actionCode)
return
} }
showConfirmAction(title, message, actionCode, actionData) showConfirmAction(title, message, actionCode, actionData)
} }
...@@ -191,7 +194,7 @@ Item { ...@@ -191,7 +194,7 @@ Item {
_activeVehicle.guidedModeTakeoff() _activeVehicle.guidedModeTakeoff()
break break
case actionResumeMission: case actionResumeMission:
missionController.resumeMission(missionController.resumeMissionItem) missionController.resumeMission(missionController.resumeMissionIndex)
break break
case actionResumeMissionReady: case actionResumeMissionReady:
_activeVehicle.startMission() _activeVehicle.startMission()
......
...@@ -988,7 +988,18 @@ ...@@ -988,7 +988,18 @@
"decimalPlaces": 0 "decimalPlaces": 0
} }
}, },
{ "id": 2001, "rawName": "MAV_CMD_IMAGE_STOP_CAPTURE", "friendlyName": "Stop image capture" }, {
"id": 2001,
"rawName": "MAV_CMD_IMAGE_STOP_CAPTURE",
"friendlyName": "Stop image capture",
"description": "Stop taking photos.",
"category": "Camera",
"param1": {
"label": "Camera id",
"default": 0,
"decimalPlaces": 0
}
},
{ "id": 2003, "rawName": "MAV_CMD_DO_TRIGGER_CONTROL", "friendlyName": "Trigger control" }, { "id": 2003, "rawName": "MAV_CMD_DO_TRIGGER_CONTROL", "friendlyName": "Trigger control" },
{ {
"id": 2500, "id": 2500,
......
...@@ -671,6 +671,11 @@ void MissionController::loadFromFile(const QString& filename) ...@@ -671,6 +671,11 @@ void MissionController::loadFromFile(const QString& filename)
MissionController::_scanForAdditionalSettings(_visualItems, _activeVehicle); MissionController::_scanForAdditionalSettings(_visualItems, _activeVehicle);
_initAllVisualItems(); _initAllVisualItems();
if (!_activeVehicle->isOfflineEditingVehicle()) {
// Needs a sync to vehicle
setDirty(true);
}
} }
bool MissionController::loadItemsFromFile(Vehicle* vehicle, const QString& filename, QmlObjectListModel** visualItems) bool MissionController::loadItemsFromFile(Vehicle* vehicle, const QString& filename, QmlObjectListModel** visualItems)
...@@ -1221,7 +1226,9 @@ void MissionController::_initAllVisualItems(void) ...@@ -1221,7 +1226,9 @@ void MissionController::_initAllVisualItems(void)
qWarning() << "First item not MissionSettingsItem"; qWarning() << "First item not MissionSettingsItem";
return; return;
} }
_settingsItem->setIsCurrentItem(true); if (_editMode) {
_settingsItem->setIsCurrentItem(true);
}
if (!_editMode && _activeVehicle) { if (!_editMode && _activeVehicle) {
_settingsItem->setCoordinate(_activeVehicle->homePosition()); _settingsItem->setCoordinate(_activeVehicle->homePosition());
...@@ -1309,8 +1316,8 @@ void MissionController::_activeVehicleBeingRemoved(void) ...@@ -1309,8 +1316,8 @@ void MissionController::_activeVehicleBeingRemoved(void)
disconnect(missionManager, &MissionManager::newMissionItemsAvailable, this, &MissionController::_newMissionItemsAvailableFromVehicle); disconnect(missionManager, &MissionManager::newMissionItemsAvailable, this, &MissionController::_newMissionItemsAvailableFromVehicle);
disconnect(missionManager, &MissionManager::inProgressChanged, this, &MissionController::_inProgressChanged); disconnect(missionManager, &MissionManager::inProgressChanged, this, &MissionController::_inProgressChanged);
disconnect(missionManager, &MissionManager::currentItemChanged, this, &MissionController::_currentMissionItemChanged); disconnect(missionManager, &MissionManager::currentIndexChanged, this, &MissionController::_currentMissionIndexChanged);
disconnect(missionManager, &MissionManager::lastCurrentItemChanged, this, &MissionController::resumeMissionItemChanged); disconnect(missionManager, &MissionManager::lastCurrentIndexChanged, this, &MissionController::resumeMissionIndexChanged);
disconnect(missionManager, &MissionManager::resumeMissionReady, this, &MissionController::resumeMissionReady); disconnect(missionManager, &MissionManager::resumeMissionReady, this, &MissionController::resumeMissionReady);
disconnect(_activeVehicle, &Vehicle::homePositionChanged, this, &MissionController::_activeVehicleHomePositionChanged); disconnect(_activeVehicle, &Vehicle::homePositionChanged, this, &MissionController::_activeVehicleHomePositionChanged);
...@@ -1329,8 +1336,8 @@ void MissionController::_activeVehicleSet(void) ...@@ -1329,8 +1336,8 @@ void MissionController::_activeVehicleSet(void)
connect(missionManager, &MissionManager::newMissionItemsAvailable, this, &MissionController::_newMissionItemsAvailableFromVehicle); connect(missionManager, &MissionManager::newMissionItemsAvailable, this, &MissionController::_newMissionItemsAvailableFromVehicle);
connect(missionManager, &MissionManager::inProgressChanged, this, &MissionController::_inProgressChanged); connect(missionManager, &MissionManager::inProgressChanged, this, &MissionController::_inProgressChanged);
connect(missionManager, &MissionManager::currentItemChanged, this, &MissionController::_currentMissionItemChanged); connect(missionManager, &MissionManager::currentIndexChanged, this, &MissionController::_currentMissionIndexChanged);
connect(missionManager, &MissionManager::lastCurrentItemChanged, this, &MissionController::resumeMissionItemChanged); connect(missionManager, &MissionManager::lastCurrentIndexChanged, this, &MissionController::resumeMissionIndexChanged);
connect(missionManager, &MissionManager::resumeMissionReady, this, &MissionController::resumeMissionReady); connect(missionManager, &MissionManager::resumeMissionReady, this, &MissionController::resumeMissionReady);
connect(_activeVehicle, &Vehicle::homePositionChanged, this, &MissionController::_activeVehicleHomePositionChanged); connect(_activeVehicle, &Vehicle::homePositionChanged, this, &MissionController::_activeVehicleHomePositionChanged);
connect(_activeVehicle, &Vehicle::defaultCruiseSpeedChanged, this, &MissionController::_recalcMissionFlightStatus); connect(_activeVehicle, &Vehicle::defaultCruiseSpeedChanged, this, &MissionController::_recalcMissionFlightStatus);
...@@ -1346,7 +1353,7 @@ void MissionController::_activeVehicleSet(void) ...@@ -1346,7 +1353,7 @@ void MissionController::_activeVehicleSet(void)
_activeVehicleHomePositionChanged(_activeVehicle->homePosition()); _activeVehicleHomePositionChanged(_activeVehicle->homePosition());
emit complexMissionItemNamesChanged(); emit complexMissionItemNamesChanged();
emit resumeMissionItemChanged(); emit resumeMissionIndexChanged();
} }
void MissionController::_activeVehicleHomePositionChanged(const QGeoCoordinate& homePosition) void MissionController::_activeVehicleHomePositionChanged(const QGeoCoordinate& homePosition)
...@@ -1457,27 +1464,26 @@ void MissionController::_addMissionSettings(Vehicle* vehicle, QmlObjectListModel ...@@ -1457,27 +1464,26 @@ void MissionController::_addMissionSettings(Vehicle* vehicle, QmlObjectListModel
} }
} }
int MissionController::resumeMissionItem(void) const int MissionController::resumeMissionIndex(void) const
{ {
int resumeIndex = -1; int resumeIndex = 0;
if (!_editMode) { if (!_editMode) {
int firstTrueItemIndex = _activeVehicle->firmwarePlugin()->sendHomePositionToVehicle() ? 1 : 0; resumeIndex = _activeVehicle->missionManager()->lastCurrentIndex() + (_activeVehicle->firmwarePlugin()->sendHomePositionToVehicle() ? 0 : 1);
resumeIndex = _activeVehicle->missionManager()->lastCurrentItem(); if (resumeIndex > 1) {
if (resumeIndex > firstTrueItemIndex) {
if (!_activeVehicle->firmwarePlugin()->sendHomePositionToVehicle()) {
resumeIndex++;
}
// Resume at the item previous to the item we were heading towards // Resume at the item previous to the item we were heading towards
resumeIndex--; resumeIndex--;
} else {
resumeIndex = 0;
} }
} }
qDebug() << "resumeIndex" << resumeIndex;
return resumeIndex; return resumeIndex;
} }
void MissionController::_currentMissionItemChanged(int sequenceNumber) void MissionController::_currentMissionIndexChanged(int sequenceNumber)
{ {
if (!_editMode) { if (!_editMode) {
if (!_activeVehicle->firmwarePlugin()->sendHomePositionToVehicle()) { if (!_activeVehicle->firmwarePlugin()->sendHomePositionToVehicle()) {
......
...@@ -64,7 +64,7 @@ public: ...@@ -64,7 +64,7 @@ public:
Q_PROPERTY(QStringList complexMissionItemNames READ complexMissionItemNames NOTIFY complexMissionItemNamesChanged) Q_PROPERTY(QStringList complexMissionItemNames READ complexMissionItemNames NOTIFY complexMissionItemNamesChanged)
Q_PROPERTY(QGeoCoordinate plannedHomePosition READ plannedHomePosition NOTIFY plannedHomePositionChanged) Q_PROPERTY(QGeoCoordinate plannedHomePosition READ plannedHomePosition NOTIFY plannedHomePositionChanged)
Q_PROPERTY(int resumeMissionItem READ resumeMissionItem NOTIFY resumeMissionItemChanged) Q_PROPERTY(int resumeMissionIndex READ resumeMissionIndex NOTIFY resumeMissionIndexChanged)
Q_PROPERTY(double missionDistance READ missionDistance NOTIFY missionDistanceChanged) Q_PROPERTY(double missionDistance READ missionDistance NOTIFY missionDistanceChanged)
Q_PROPERTY(double missionTime READ missionTime NOTIFY missionTimeChanged) Q_PROPERTY(double missionTime READ missionTime NOTIFY missionTimeChanged)
...@@ -130,7 +130,7 @@ public: ...@@ -130,7 +130,7 @@ public:
QGeoCoordinate plannedHomePosition (void) const; QGeoCoordinate plannedHomePosition (void) const;
/// Returns the item index two which a mission should be resumed. -1 indicates resume mission not available. /// Returns the item index two which a mission should be resumed. -1 indicates resume mission not available.
int resumeMissionItem(void) const; int resumeMissionIndex(void) const;
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; }
...@@ -155,7 +155,7 @@ signals: ...@@ -155,7 +155,7 @@ signals:
void missionCruiseTimeChanged(void); void missionCruiseTimeChanged(void);
void missionMaxTelemetryChanged(double missionMaxTelemetry); void missionMaxTelemetryChanged(double missionMaxTelemetry);
void complexMissionItemNamesChanged(void); void complexMissionItemNamesChanged(void);
void resumeMissionItemChanged(void); void resumeMissionIndexChanged(void);
void resumeMissionReady(void); void resumeMissionReady(void);
void batteryChangePointChanged(int batteryChangePoint); void batteryChangePointChanged(int batteryChangePoint);
void batteriesRequiredChanged(int batteriesRequired); void batteriesRequiredChanged(int batteriesRequired);
...@@ -166,7 +166,7 @@ private slots: ...@@ -166,7 +166,7 @@ private slots:
void _itemCommandChanged(void); void _itemCommandChanged(void);
void _activeVehicleHomePositionChanged(const QGeoCoordinate& homePosition); void _activeVehicleHomePositionChanged(const QGeoCoordinate& homePosition);
void _inProgressChanged(bool inProgress); void _inProgressChanged(bool inProgress);
void _currentMissionItemChanged(int sequenceNumber); void _currentMissionIndexChanged(int sequenceNumber);
void _recalcWaypointLines(void); void _recalcWaypointLines(void);
void _recalcMissionFlightStatus(void); void _recalcMissionFlightStatus(void);
void _updateContainsItems(void); void _updateContainsItems(void);
......
...@@ -27,8 +27,8 @@ MissionManager::MissionManager(Vehicle* vehicle) ...@@ -27,8 +27,8 @@ MissionManager::MissionManager(Vehicle* vehicle)
, _readTransactionInProgress(false) , _readTransactionInProgress(false)
, _writeTransactionInProgress(false) , _writeTransactionInProgress(false)
, _resumeMission(false) , _resumeMission(false)
, _currentMissionItem(-1) , _currentMissionIndex(-1)
, _lastCurrentItem(-1) , _lastCurrentIndex(-1)
{ {
connect(_vehicle, &Vehicle::mavlinkMessageReceived, this, &MissionManager::_mavlinkMessageReceived); connect(_vehicle, &Vehicle::mavlinkMessageReceived, this, &MissionManager::_mavlinkMessageReceived);
...@@ -60,10 +60,10 @@ void MissionManager::_writeMissionItemsWorker(void) ...@@ -60,10 +60,10 @@ void MissionManager::_writeMissionItemsWorker(void)
emit inProgressChanged(true); emit inProgressChanged(true);
_writeMissionCount(); _writeMissionCount();
_currentMissionItem = -1; _currentMissionIndex = -1;
_lastCurrentItem = -1; _lastCurrentIndex = -1;
emit currentItemChanged(-1); emit currentIndexChanged(-1);
emit lastCurrentItemChanged(-1); emit lastCurrentIndexChanged(-1);
} }
...@@ -412,8 +412,8 @@ void MissionManager::_handleMissionItem(const mavlink_message_t& message, bool m ...@@ -412,8 +412,8 @@ void MissionManager::_handleMissionItem(const mavlink_message_t& message, bool m
mavlink_msg_mission_item_int_decode(&message, &missionItem); mavlink_msg_mission_item_int_decode(&message, &missionItem);
command = (MAV_CMD)missionItem.command, command = (MAV_CMD)missionItem.command,
frame = (MAV_FRAME)missionItem.frame, frame = (MAV_FRAME)missionItem.frame,
param1 = missionItem.param1; param1 = missionItem.param1;
param2 = missionItem.param2; param2 = missionItem.param2;
param3 = missionItem.param3; param3 = missionItem.param3;
param4 = missionItem.param4; param4 = missionItem.param4;
...@@ -428,8 +428,8 @@ void MissionManager::_handleMissionItem(const mavlink_message_t& message, bool m ...@@ -428,8 +428,8 @@ void MissionManager::_handleMissionItem(const mavlink_message_t& message, bool m
mavlink_msg_mission_item_decode(&message, &missionItem); mavlink_msg_mission_item_decode(&message, &missionItem);
command = (MAV_CMD)missionItem.command, command = (MAV_CMD)missionItem.command,
frame = (MAV_FRAME)missionItem.frame, frame = (MAV_FRAME)missionItem.frame,
param1 = missionItem.param1; param1 = missionItem.param1;
param2 = missionItem.param2; param2 = missionItem.param2;
param3 = missionItem.param3; param3 = missionItem.param3;
param4 = missionItem.param4; param4 = missionItem.param4;
...@@ -448,7 +448,7 @@ void MissionManager::_handleMissionItem(const mavlink_message_t& message, bool m ...@@ -448,7 +448,7 @@ void MissionManager::_handleMissionItem(const mavlink_message_t& message, bool m
frame = MAV_FRAME_GLOBAL_RELATIVE_ALT; frame = MAV_FRAME_GLOBAL_RELATIVE_ALT;
} }
qCDebug(MissionManagerLog) << "_handleMissionItem sequenceNumber:" << seq << command; qCDebug(MissionManagerLog) << "_handleMissionItem seq:command:current" << seq << command << isCurrentItem;
if (_itemIndicesToRead.contains(seq)) { if (_itemIndicesToRead.contains(seq)) {
_itemIndicesToRead.removeOne(seq); _itemIndicesToRead.removeOne(seq);
...@@ -787,15 +787,16 @@ void MissionManager::_handleMissionCurrent(const mavlink_message_t& message) ...@@ -787,15 +787,16 @@ void MissionManager::_handleMissionCurrent(const mavlink_message_t& message)
mavlink_msg_mission_current_decode(&message, &missionCurrent); mavlink_msg_mission_current_decode(&message, &missionCurrent);
if (missionCurrent.seq != _currentMissionItem) { if (missionCurrent.seq != _currentMissionIndex) {
qCDebug(MissionManagerLog) << "_handleMissionCurrent seq:" << missionCurrent.seq; qCDebug(MissionManagerLog) << "_handleMissionCurrent currentIndex:" << missionCurrent.seq;
_currentMissionItem = missionCurrent.seq; _currentMissionIndex = missionCurrent.seq;
emit currentItemChanged(_currentMissionItem); emit currentIndexChanged(_currentMissionIndex);
} }
if (_vehicle->flightMode() == _vehicle->missionFlightMode() && _currentMissionItem != _lastCurrentItem) { if (_vehicle->flightMode() == _vehicle->missionFlightMode() && _currentMissionIndex != _lastCurrentIndex) {
_lastCurrentItem = _currentMissionItem; qCDebug(MissionManagerLog) << "_handleMissionCurrent lastCurrentIndex:" << _currentMissionIndex;
emit lastCurrentItemChanged(_lastCurrentItem); _lastCurrentIndex = _currentMissionIndex;
emit lastCurrentIndexChanged(_lastCurrentIndex);
} }
} }
...@@ -817,6 +818,14 @@ void MissionManager::generateResumeMission(int resumeIndex) ...@@ -817,6 +818,14 @@ void MissionManager::generateResumeMission(int resumeIndex)
return; return;
} }
for (int i=0; i<_missionItems.count(); i++) {
MissionItem* item = _missionItems[i];
if (item->command() == MAV_CMD_DO_JUMP) {
qgcApp()->showMessage(tr("Unable to generate resume mission due to MAV_CMD_DO_JUMP command."));
return;
}
}
int seqNum = 0; int seqNum = 0;
QList<MissionItem*> resumeMission; QList<MissionItem*> resumeMission;
...@@ -839,9 +848,13 @@ void MissionManager::generateResumeMission(int resumeIndex) ...@@ -839,9 +848,13 @@ void MissionManager::generateResumeMission(int resumeIndex)
bool addHomePosition = _vehicle->firmwarePlugin()->sendHomePositionToVehicle(); bool addHomePosition = _vehicle->firmwarePlugin()->sendHomePositionToVehicle();
int setCurrentIndex = addHomePosition ? 1 : 0; int setCurrentIndex = addHomePosition ? 1 : 0;
int resumeCommandCount = 0;
for (int i=0; i<_missionItems.count(); i++) { for (int i=0; i<_missionItems.count(); i++) {
MissionItem* oldItem = _missionItems[i]; MissionItem* oldItem = _missionItems[i];
if ((i == 0 && addHomePosition) || i >= resumeIndex || includedResumeCommands.contains(oldItem->command())) { if ((i == 0 && addHomePosition) || i >= resumeIndex || includedResumeCommands.contains(oldItem->command())) {
if (i < resumeIndex) {
resumeCommandCount++;
}
MissionItem* newItem = new MissionItem(*oldItem, this); MissionItem* newItem = new MissionItem(*oldItem, this);
newItem->setIsCurrentItem( i == setCurrentIndex); newItem->setIsCurrentItem( i == setCurrentIndex);
newItem->setSequenceNumber(seqNum++); newItem->setSequenceNumber(seqNum++);
...@@ -849,7 +862,91 @@ void MissionManager::generateResumeMission(int resumeIndex) ...@@ -849,7 +862,91 @@ void MissionManager::generateResumeMission(int resumeIndex)
} }
} }
// Handle DO_JUMP seq num update // De-dup and remove no-ops from the commands which were added to the front of the mission
bool foundROI = false;
bool foundCamTrigDist = false;
QList<int> imageStartCameraIds;
QList<int> imageStopCameraIds;
QList<int> videoStartCameraIds;
QList<int> videoStopCameraIds;
while (resumeIndex >= 0) {
MissionItem* resumeItem = resumeMission[resumeIndex];
switch (resumeItem->command()) {
case MAV_CMD_DO_SET_ROI:
// Only keep the last one
if (foundROI) {
resumeMission.removeAt(resumeIndex);
}
foundROI = true;
break;
case MAV_CMD_DO_SET_CAM_TRIGG_DIST:
// Only keep the last one
if (foundCamTrigDist) {
resumeMission.removeAt(resumeIndex);
}
foundCamTrigDist = true;
break;
case MAV_CMD_IMAGE_START_CAPTURE:
{
// FIXME: Handle single image capture
int cameraId = resumeItem->param6();
if (resumeItem->param1() == 0) {
// This is an individual image capture command, remove it
resumeMission.removeAt(resumeIndex);
break;
}
// If we already found an image stop, then all image start/stop commands are useless
// De-dup repeated image start commands
// Otherwise keep only the last image start
if (imageStopCameraIds.contains(cameraId) || imageStartCameraIds.contains(cameraId)) {
resumeMission.removeAt(resumeIndex);
}
if (!imageStopCameraIds.contains(cameraId)) {
imageStopCameraIds.append(cameraId);
}
}
break;
case MAV_CMD_IMAGE_STOP_CAPTURE:
{
int cameraId = resumeItem->param1();
// Image stop only matters to kill all previous image starts
if (!imageStopCameraIds.contains(cameraId)) {
imageStopCameraIds.append(cameraId);
}
resumeMission.removeAt(resumeIndex);
}
break;
case MAV_CMD_VIDEO_START_CAPTURE:
{
int cameraId = resumeItem->param1();
// If we already found an video stop, then all video start/stop commands are useless
// De-dup repeated video start commands
// Otherwise keep only the last video start
if (videoStopCameraIds.contains(cameraId) || videoStopCameraIds.contains(cameraId)) {
resumeMission.removeAt(resumeIndex);
}
if (!videoStopCameraIds.contains(cameraId)) {
videoStopCameraIds.append(cameraId);
}
}
break;
case MAV_CMD_VIDEO_STOP_CAPTURE:
{
int cameraId = resumeItem->param1();
// Video stop only matters to kill all previous video starts
if (!videoStopCameraIds.contains(cameraId)) {
videoStopCameraIds.append(cameraId);
}
resumeMission.removeAt(resumeIndex);
}
break;
default:
break;
}
resumeIndex--;
}
// Send to vehicle // Send to vehicle
_clearAndDeleteMissionItems(); _clearAndDeleteMissionItems();
......
...@@ -38,10 +38,10 @@ public: ...@@ -38,10 +38,10 @@ public:
const QList<MissionItem*>& missionItems(void) { return _missionItems; } const QList<MissionItem*>& missionItems(void) { return _missionItems; }
/// Current mission item as reported by MISSION_CURRENT /// Current mission item as reported by MISSION_CURRENT
int currentItem(void) const { return _currentMissionItem; } int currentIndex(void) const { return _currentMissionIndex; }
/// Last current mission item reported while in Mission flight mode /// Last current mission item reported while in Mission flight mode
int lastCurrentItem(void) const { return _lastCurrentItem; } int lastCurrentIndex(void) const { return _lastCurrentIndex; }
void requestMissionItems(void); void requestMissionItems(void);
...@@ -81,8 +81,8 @@ signals: ...@@ -81,8 +81,8 @@ signals:
void newMissionItemsAvailable(bool removeAllRequested); void newMissionItemsAvailable(bool removeAllRequested);
void inProgressChanged(bool inProgress); void inProgressChanged(bool inProgress);
void error(int errorCode, const QString& errorMsg); void error(int errorCode, const QString& errorMsg);
void currentItemChanged(int currentItem); void currentIndexChanged(int currentIndex);
void lastCurrentItemChanged(int lastCurrentMissionItem); void lastCurrentIndexChanged(int lastCurrentIndex);
void resumeMissionReady(void); void resumeMissionReady(void);
private slots: private slots:
...@@ -134,8 +134,8 @@ private: ...@@ -134,8 +134,8 @@ private:
QMutex _dataMutex; QMutex _dataMutex;
QList<MissionItem*> _missionItems; QList<MissionItem*> _missionItems;
int _currentMissionItem; int _currentMissionIndex;
int _lastCurrentItem; int _lastCurrentIndex;
}; };
#endif #endif
...@@ -109,6 +109,7 @@ SimpleMissionItem::SimpleMissionItem(Vehicle* vehicle, const MissionItem& missio ...@@ -109,6 +109,7 @@ SimpleMissionItem::SimpleMissionItem(Vehicle* vehicle, const MissionItem& missio
_editorQml = QStringLiteral("qrc:/qml/SimpleItemEditor.qml"); _editorQml = QStringLiteral("qrc:/qml/SimpleItemEditor.qml");
_altitudeRelativeToHomeFact.setRawValue(true); _altitudeRelativeToHomeFact.setRawValue(true);
_isCurrentItem = missionItem.isCurrentItem();
_setupMetaData(); _setupMetaData();
_connectSignals(); _connectSignals();
......
...@@ -98,7 +98,7 @@ Rectangle { ...@@ -98,7 +98,7 @@ Rectangle {
MenuItem { MenuItem {
text: qsTr("Insert waypoint") text: qsTr("Insert waypoint")
onTriggered: insert() onTriggered: insertWaypoint()
} }
MenuItem { MenuItem {
...@@ -126,17 +126,18 @@ Rectangle { ...@@ -126,17 +126,18 @@ Rectangle {
MenuItem { MenuItem {
text: qsTr("Change command...") text: qsTr("Change command...")
onTriggered: commandPicker.clicked() onTriggered: commandPicker.clicked()
visible: !_waypointsOnlyMode
} }
MenuSeparator { MenuSeparator {
visible: missionItem.isSimpleItem visible: missionItem.isSimpleItem && !_waypointsOnlyMode
} }
MenuItem { MenuItem {
text: qsTr("Show all values") text: qsTr("Show all values")
checkable: true checkable: true
checked: missionItem.isSimpleItem ? missionItem.rawEdit : false checked: missionItem.isSimpleItem ? missionItem.rawEdit : false
visible: missionItem.isSimpleItem visible: missionItem.isSimpleItem && !_waypointsOnlyMode
onTriggered: { onTriggered: {
if (missionItem.rawEdit) { if (missionItem.rawEdit) {
...@@ -152,38 +153,6 @@ Rectangle { ...@@ -152,38 +153,6 @@ Rectangle {
} }
} }
} }
Menu {
id: waypointsOnlyMenu
MenuItem {
text: qsTr("Insert waypoint")
onTriggered: insertWaypoint()
}
MenuItem {
text: qsTr("Delete")
onTriggered: remove()
}
Menu {
id: waypointsOnlyPatternMenu
title: qsTr("Insert pattern")
Instantiator {
model: missionController.complexMissionItemNames
onObjectAdded: waypointsOnlyPatternMenu.insertItem(index, object)
onObjectRemoved: waypointsOnlyPatternMenu.removeItem(object)
MenuItem {
text: modelData
onTriggered: insertComplexItem(modelData)
}
}
}
}
} }
QGCButton { QGCButton {
......
...@@ -83,13 +83,6 @@ QGCView { ...@@ -83,13 +83,6 @@ QGCView {
property bool _firstRallyLoadComplete: false property bool _firstRallyLoadComplete: false
property bool _firstLoadComplete: false property bool _firstLoadComplete: false
function checkFirstLoadComplete() {
if (!_firstLoadComplete && _firstMissionLoadComplete && _firstRallyLoadComplete && _firstFenceLoadComplete) {
_firstLoadComplete = true
mapFitFunctions.fitMapViewportToAllItems()
}
}
MapFitFunctions { MapFitFunctions {
id: mapFitFunctions id: mapFitFunctions
map: editorMap map: editorMap
...@@ -182,8 +175,6 @@ QGCView { ...@@ -182,8 +175,6 @@ QGCView {
mapFitFunctions.fitMapViewportToMissionItems() mapFitFunctions.fitMapViewportToMissionItems()
} }
setCurrentItem(0) setCurrentItem(0)
_firstMissionLoadComplete = true
checkFirstLoadComplete()
} }
} }
...@@ -212,18 +203,6 @@ QGCView { ...@@ -212,18 +203,6 @@ QGCView {
function fitViewportToItems() { function fitViewportToItems() {
mapFitFunctions.fitMapViewportToFenceItems() mapFitFunctions.fitMapViewportToFenceItems()
} }
onLoadComplete: {
_firstFenceLoadComplete = true
switch (_syncDropDownController) {
case geoFenceController:
mapFitFunctions.fitMapViewportToFenceItems()
break
case missionController:
checkFirstLoadComplete()
break
}
}
} }
RallyPointController { RallyPointController {
...@@ -259,18 +238,6 @@ QGCView { ...@@ -259,18 +238,6 @@ QGCView {
function fitViewportToItems() { function fitViewportToItems() {
mapFitFunctions.fitMapViewportToRallyItems() mapFitFunctions.fitMapViewportToRallyItems()
} }
onLoadComplete: {
_firstRallyLoadComplete = true
switch (_syncDropDownController) {
case rallyPointController:
mapFitFunctions.fitMapViewportToRallyItems()
break
case missionController:
checkFirstLoadComplete()
break
}
}
} }
QGCPalette { id: qgcPal; colorGroupEnabled: enabled } QGCPalette { id: qgcPal; colorGroupEnabled: enabled }
......
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