14 changed files with 387 additions and 102 deletions
@ -0,0 +1,95 @@ |
|||||||
|
/*===================================================================== |
||||||
|
|
||||||
|
QGroundControl Open Source Ground Control Station |
||||||
|
|
||||||
|
(c) 2009, 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org> |
||||||
|
|
||||||
|
This file is part of the QGROUNDCONTROL project |
||||||
|
|
||||||
|
QGROUNDCONTROL is free software: you can redistribute it and/or modify |
||||||
|
it under the terms of the GNU General Public License as published by |
||||||
|
the Free Software Foundation, either version 3 of the License, or |
||||||
|
(at your option) any later version. |
||||||
|
|
||||||
|
QGROUNDCONTROL is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>. |
||||||
|
|
||||||
|
======================================================================*/ |
||||||
|
|
||||||
|
import QtQuick 2.4 |
||||||
|
import QtQuick.Controls 1.3 |
||||||
|
import QtQuick.Dialogs 1.2 |
||||||
|
import QtLocation 5.3 |
||||||
|
import QtPositioning 5.3 |
||||||
|
|
||||||
|
import QGroundControl 1.0 |
||||||
|
import QGroundControl.FlightMap 1.0 |
||||||
|
import QGroundControl.ScreenTools 1.0 |
||||||
|
import QGroundControl.Controls 1.0 |
||||||
|
import QGroundControl.Palette 1.0 |
||||||
|
|
||||||
|
/// The MissionItemView control is used to add Mission Item Indicators to a FlightMap. |
||||||
|
MapItemView { |
||||||
|
id: _root |
||||||
|
|
||||||
|
property real zOrderMapItems ///< Z order for indicator |
||||||
|
property var itemDragger ///< Set to item drag control if you want to support drag |
||||||
|
|
||||||
|
delegate: MissionItemIndicator { |
||||||
|
id: itemIndicator |
||||||
|
label: object.sequenceNumber == 0 ? "H" : object.sequenceNumber |
||||||
|
isCurrentItem: object.isCurrentItem |
||||||
|
coordinate: object.coordinate |
||||||
|
z: zOrderMapItems |
||||||
|
visible: object.specifiesCoordinate |
||||||
|
|
||||||
|
onClicked: setCurrentItem(object.sequenceNumber) |
||||||
|
|
||||||
|
Connections { |
||||||
|
target: object |
||||||
|
|
||||||
|
onIsCurrentItemChanged: { |
||||||
|
if (isCurrentItem) { |
||||||
|
if (_root.itemDragger) { |
||||||
|
// Setup our drag item |
||||||
|
if (object.sequenceNumber != 0) { |
||||||
|
_root.itemDragger.visible = true |
||||||
|
_root.itemDragger.missionItem = Qt.binding(function() { return object }) |
||||||
|
_root.itemDragger.missionItemIndicator = Qt.binding(function() { return itemIndicator }) |
||||||
|
} else { |
||||||
|
_root.itemDragger.clearItem() |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Zoom the map and move to the new position |
||||||
|
_root.parent.zoomLevel = _root.parent.maxZoomLevel |
||||||
|
_root.parent.latitude = object.coordinate.latitude |
||||||
|
_root.parent.longitude = object.coordinate.longitude |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// These are the non-coordinate child mission items attached to this item |
||||||
|
Row { |
||||||
|
anchors.top: parent.top |
||||||
|
anchors.left: parent.right |
||||||
|
|
||||||
|
Repeater { |
||||||
|
model: object.childItems |
||||||
|
|
||||||
|
delegate: MissionItemIndexLabel { |
||||||
|
label: object.sequenceNumber |
||||||
|
isCurrentItem: object.isCurrentItem |
||||||
|
z: 2 |
||||||
|
|
||||||
|
onClicked: setCurrentItem(object.sequenceNumber) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,158 @@ |
|||||||
|
/*=====================================================================
|
||||||
|
|
||||||
|
QGroundControl Open Source Ground Control Station |
||||||
|
|
||||||
|
(c) 2009, 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
|
||||||
|
|
||||||
|
This file is part of the QGROUNDCONTROL project |
||||||
|
|
||||||
|
QGROUNDCONTROL is free software: you can redistribute it and/or modify |
||||||
|
it under the terms of the GNU General Public License as published by |
||||||
|
the Free Software Foundation, either version 3 of the License, or |
||||||
|
(at your option) any later version. |
||||||
|
|
||||||
|
QGROUNDCONTROL is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
======================================================================*/ |
||||||
|
|
||||||
|
#include "MissionController.h" |
||||||
|
#include "ScreenToolsController.h" |
||||||
|
#include "MultiVehicleManager.h" |
||||||
|
#include "MissionManager.h" |
||||||
|
#include "CoordinateVector.h" |
||||||
|
|
||||||
|
MissionController::MissionController(QObject *parent) |
||||||
|
: QObject(parent) |
||||||
|
, _missionItems(NULL) |
||||||
|
, _activeVehicle(NULL) |
||||||
|
{ |
||||||
|
MultiVehicleManager* multiVehicleMgr = MultiVehicleManager::instance(); |
||||||
|
|
||||||
|
connect(multiVehicleMgr, &MultiVehicleManager::activeVehicleChanged, this, &MissionController::_activeVehicleChanged); |
||||||
|
|
||||||
|
Vehicle* activeVehicle = multiVehicleMgr->activeVehicle(); |
||||||
|
if (activeVehicle) { |
||||||
|
_activeVehicleChanged(activeVehicle); |
||||||
|
} else { |
||||||
|
_newMissionItemsAvailable(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
MissionController::~MissionController() |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
void MissionController::_newMissionItemsAvailable(void) |
||||||
|
{ |
||||||
|
if (_missionItems) { |
||||||
|
_missionItems->deleteLater(); |
||||||
|
} |
||||||
|
|
||||||
|
MissionManager* missionManager = NULL; |
||||||
|
Vehicle* activeVehicle = MultiVehicleManager::instance()->activeVehicle(); |
||||||
|
if (activeVehicle) { |
||||||
|
missionManager = activeVehicle->missionManager(); |
||||||
|
} |
||||||
|
|
||||||
|
if (!missionManager || missionManager->inProgress()) { |
||||||
|
_missionItems = new QmlObjectListModel(this); |
||||||
|
} else { |
||||||
|
_missionItems = missionManager->copyMissionItems(); |
||||||
|
} |
||||||
|
|
||||||
|
_initAllMissionItems(); |
||||||
|
} |
||||||
|
|
||||||
|
void MissionController::_recalcWaypointLines(void) |
||||||
|
{ |
||||||
|
bool firstCoordinateItem = true; |
||||||
|
MissionItem* lastCoordinateItem = qobject_cast<MissionItem*>(_missionItems->get(0)); |
||||||
|
|
||||||
|
_waypointLines.clear(); |
||||||
|
|
||||||
|
for (int i=1; i<_missionItems->count(); i++) { |
||||||
|
MissionItem* item = qobject_cast<MissionItem*>(_missionItems->get(i)); |
||||||
|
|
||||||
|
if (item->specifiesCoordinate()) { |
||||||
|
if (firstCoordinateItem) { |
||||||
|
if (item->command() == MavlinkQmlSingleton::MAV_CMD_NAV_TAKEOFF) { |
||||||
|
// The first coordinate we hit is a takeoff command so link back to home position
|
||||||
|
_waypointLines.append(new CoordinateVector(qobject_cast<MissionItem*>(_missionItems->get(0))->coordinate(), item->coordinate())); |
||||||
|
} else { |
||||||
|
// First coordiante is not a takeoff command, it does not link backwards to anything
|
||||||
|
} |
||||||
|
firstCoordinateItem = false; |
||||||
|
} else { |
||||||
|
// Subsequent coordinate items link to last coordinate item
|
||||||
|
_waypointLines.append(new CoordinateVector(lastCoordinateItem->coordinate(), item->coordinate())); |
||||||
|
} |
||||||
|
lastCoordinateItem = item; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
emit waypointLinesChanged(); |
||||||
|
} |
||||||
|
|
||||||
|
// This will update the child item hierarchy
|
||||||
|
void MissionController::_recalcChildItems(void) |
||||||
|
{ |
||||||
|
MissionItem* currentParentItem = qobject_cast<MissionItem*>(_missionItems->get(0)); |
||||||
|
|
||||||
|
currentParentItem->childItems()->clear(); |
||||||
|
|
||||||
|
for (int i=1; i<_missionItems->count(); i++) { |
||||||
|
MissionItem* item = qobject_cast<MissionItem*>(_missionItems->get(i)); |
||||||
|
|
||||||
|
// Set up non-coordinate item child hierarchy
|
||||||
|
if (item->specifiesCoordinate()) { |
||||||
|
item->childItems()->clear(); |
||||||
|
currentParentItem = item; |
||||||
|
} else { |
||||||
|
currentParentItem->childItems()->append(item); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void MissionController::_recalcAll(void) |
||||||
|
{ |
||||||
|
_recalcChildItems(); |
||||||
|
_recalcWaypointLines(); |
||||||
|
} |
||||||
|
|
||||||
|
/// Initializes a new set of mission items which may have come from the vehicle or have been loaded from a file
|
||||||
|
void MissionController::_initAllMissionItems(void) |
||||||
|
{ |
||||||
|
// Add the home position item to the front
|
||||||
|
MissionItem* homeItem = new MissionItem(this); |
||||||
|
homeItem->setHomePositionSpecialCase(true); |
||||||
|
homeItem->setCommand(MavlinkQmlSingleton::MAV_CMD_NAV_WAYPOINT); |
||||||
|
_missionItems->insert(0, homeItem); |
||||||
|
|
||||||
|
_recalcChildItems(); |
||||||
|
_recalcWaypointLines(); |
||||||
|
|
||||||
|
emit missionItemsChanged(); |
||||||
|
} |
||||||
|
|
||||||
|
void MissionController::_activeVehicleChanged(Vehicle* activeVehicle) |
||||||
|
{ |
||||||
|
if (_activeVehicle) { |
||||||
|
MissionManager* missionManager = _activeVehicle->missionManager(); |
||||||
|
disconnect(missionManager, &MissionManager::newMissionItemsAvailable, this, &MissionController::_newMissionItemsAvailable); |
||||||
|
_activeVehicle = NULL; |
||||||
|
} |
||||||
|
|
||||||
|
_activeVehicle = activeVehicle; |
||||||
|
|
||||||
|
if (_activeVehicle) { |
||||||
|
MissionManager* missionManager = activeVehicle->missionManager(); |
||||||
|
connect(missionManager, &MissionManager::newMissionItemsAvailable, this, &MissionController::_newMissionItemsAvailable); |
||||||
|
_newMissionItemsAvailable(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,69 @@ |
|||||||
|
/*=====================================================================
|
||||||
|
|
||||||
|
QGroundControl Open Source Ground Control Station |
||||||
|
|
||||||
|
(c) 2009, 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
|
||||||
|
|
||||||
|
This file is part of the QGROUNDCONTROL project |
||||||
|
|
||||||
|
QGROUNDCONTROL is free software: you can redistribute it and/or modify |
||||||
|
it under the terms of the GNU General Public License as published by |
||||||
|
the Free Software Foundation, either version 3 of the License, or |
||||||
|
(at your option) any later version. |
||||||
|
|
||||||
|
QGROUNDCONTROL is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
======================================================================*/ |
||||||
|
|
||||||
|
#ifndef MissionController_H |
||||||
|
#define MissionController_H |
||||||
|
|
||||||
|
#include <QObject> |
||||||
|
|
||||||
|
#include "QmlObjectListModel.h" |
||||||
|
#include "Vehicle.h" |
||||||
|
|
||||||
|
/// MissionController is a read only controller for Mission Items
|
||||||
|
class MissionController : public QObject |
||||||
|
{ |
||||||
|
Q_OBJECT |
||||||
|
|
||||||
|
public: |
||||||
|
MissionController(QObject* parent = NULL); |
||||||
|
~MissionController(); |
||||||
|
|
||||||
|
Q_PROPERTY(QmlObjectListModel* missionItems READ missionItems NOTIFY missionItemsChanged) |
||||||
|
Q_PROPERTY(QmlObjectListModel* waypointLines READ waypointLines NOTIFY waypointLinesChanged) |
||||||
|
|
||||||
|
// Property accessors
|
||||||
|
|
||||||
|
QmlObjectListModel* missionItems(void) { return _missionItems; } |
||||||
|
QmlObjectListModel* waypointLines(void) { return &_waypointLines; } |
||||||
|
|
||||||
|
signals: |
||||||
|
void missionItemsChanged(void); |
||||||
|
void waypointLinesChanged(void); |
||||||
|
|
||||||
|
private slots: |
||||||
|
void _newMissionItemsAvailable(); |
||||||
|
void _activeVehicleChanged(Vehicle* activeVehicle); |
||||||
|
|
||||||
|
private: |
||||||
|
void _recalcWaypointLines(void); |
||||||
|
void _recalcChildItems(void); |
||||||
|
void _recalcAll(void); |
||||||
|
void _initAllMissionItems(void); |
||||||
|
|
||||||
|
private: |
||||||
|
QmlObjectListModel* _missionItems; |
||||||
|
QmlObjectListModel _waypointLines; |
||||||
|
Vehicle* _activeVehicle; |
||||||
|
}; |
||||||
|
|
||||||
|
#endif |
Loading…
Reference in new issue