14 changed files with 387 additions and 102 deletions
@ -0,0 +1,95 @@
@@ -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 @@
@@ -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 @@
@@ -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