Commit 45dceec3 authored by Don Gagne's avatar Don Gagne

Survey initial grid generation

parent 4e9d37b5
...@@ -173,14 +173,15 @@ QGCView { ...@@ -173,14 +173,15 @@ QGCView {
id: _dropButtonsExclusiveGroup id: _dropButtonsExclusiveGroup
} }
function setCurrentItem(index) { function setCurrentItem(sequenceNumber) {
_currentMissionItem = undefined _currentMissionItem = undefined
for (var i=0; i<_visualItems.count; i++) { for (var i=0; i<_visualItems.count; i++) {
if (i == index) { var visualItem = _visualItems.get(i)
_currentMissionItem = _visualItems.get(i) if (visualItem.sequenceNumber == sequenceNumber) {
_currentMissionItem = visualItem
_currentMissionItem.isCurrentItem = true _currentMissionItem.isCurrentItem = true
} else { } else {
_visualItems.get(i).isCurrentItem = false visualItem.isCurrentItem = false
} }
} }
} }
...@@ -306,8 +307,8 @@ QGCView { ...@@ -306,8 +307,8 @@ QGCView {
coordinate.longitude = coordinate.longitude.toFixed(_decimalPlaces) coordinate.longitude = coordinate.longitude.toFixed(_decimalPlaces)
coordinate.altitude = coordinate.altitude.toFixed(_decimalPlaces) coordinate.altitude = coordinate.altitude.toFixed(_decimalPlaces)
if (addMissionItemsButton.checked) { if (addMissionItemsButton.checked) {
var index = controller.insertSimpleMissionItem(coordinate, controller.visualItems.count) var sequenceNumber = controller.insertSimpleMissionItem(coordinate, controller.visualItems.count)
setCurrentItem(index) setCurrentItem(sequenceNumber)
} else { } else {
editorMap.mapClicked(coordinate) editorMap.mapClicked(coordinate)
} }
...@@ -364,13 +365,7 @@ QGCView { ...@@ -364,13 +365,7 @@ QGCView {
} }
} }
// Add the simple mission items to the map // Add the complex mission item polygon to the map
MapItemView {
model: controller.visualItems
delegate: missionItemComponent
}
// Add the complex mission items to the map
MapItemView { MapItemView {
model: controller.complexVisualItems model: controller.complexVisualItems
delegate: polygonItemComponent delegate: polygonItemComponent
...@@ -386,6 +381,16 @@ QGCView { ...@@ -386,6 +381,16 @@ QGCView {
} }
} }
// Add the complex mission item grid to the map
MapItemView {
model: controller.complexVisualItems
delegate: MapPolyline {
line.color: "white"
path: object.gridPoints
}
}
// Add the complex mission item exit coordinates // Add the complex mission item exit coordinates
MapItemView { MapItemView {
model: controller.complexVisualItems model: controller.complexVisualItems
...@@ -404,6 +409,12 @@ QGCView { ...@@ -404,6 +409,12 @@ QGCView {
} }
} }
// Add the simple mission items to the map
MapItemView {
model: controller.visualItems
delegate: missionItemComponent
}
Component { Component {
id: missionItemComponent id: missionItemComponent
...@@ -417,10 +428,8 @@ QGCView { ...@@ -417,10 +428,8 @@ QGCView {
onClicked: setCurrentItem(object.sequenceNumber) onClicked: setCurrentItem(object.sequenceNumber)
function updateItemIndicator() function updateItemIndicator() {
{ if (object.isCurrentItem && itemIndicator.visible && object.specifiesCoordinate && object.isSimpleItem) {
if (object.isCurrentItem && itemIndicator.visible &&
object.specifiesCoordinate && object.isSimpleItem) {
// Setup our drag item // Setup our drag item
itemDragger.visible = true itemDragger.visible = true
itemDragger.missionItem = Qt.binding(function() { return object }) itemDragger.missionItem = Qt.binding(function() { return object })
...@@ -516,8 +525,8 @@ QGCView { ...@@ -516,8 +525,8 @@ QGCView {
} }
onInsert: { onInsert: {
controller.insertSimpleMissionItem(editorMap.center, i) var sequenceNumber = controller.insertSimpleMissionItem(editorMap.center, i)
setCurrentItem(i) setCurrentItem(sequenceNumber)
} }
onMoveHomeToMapCenter: controller.visualItems.get(0).coordinate = editorMap.center onMoveHomeToMapCenter: controller.visualItems.get(0).coordinate = editorMap.center
...@@ -567,8 +576,8 @@ QGCView { ...@@ -567,8 +576,8 @@ QGCView {
coordinate.latitude = coordinate.latitude.toFixed(_decimalPlaces) coordinate.latitude = coordinate.latitude.toFixed(_decimalPlaces)
coordinate.longitude = coordinate.longitude.toFixed(_decimalPlaces) coordinate.longitude = coordinate.longitude.toFixed(_decimalPlaces)
coordinate.altitude = coordinate.altitude.toFixed(_decimalPlaces) coordinate.altitude = coordinate.altitude.toFixed(_decimalPlaces)
var index = controller.insertComplexMissionItem(coordinate, controller.visualItems.count) var sequenceNumber = controller.insertComplexMissionItem(coordinate, controller.visualItems.count)
setCurrentItem(index) setCurrentItem(sequenceNumber)
checked = false checked = false
addMissionItemsButton.checked = false addMissionItemsButton.checked = false
} }
...@@ -775,7 +784,7 @@ QGCView { ...@@ -775,7 +784,7 @@ QGCView {
QGCButton { QGCButton {
text: "Send to vehicle" text: "Send to vehicle"
enabled: !controller.syncInProgress enabled: _activeVehicle && !controller.syncInProgress
onClicked: { onClicked: {
syncButton.hideDropDown() syncButton.hideDropDown()
...@@ -785,7 +794,7 @@ QGCView { ...@@ -785,7 +794,7 @@ QGCView {
QGCButton { QGCButton {
text: "Load from vehicle" text: "Load from vehicle"
enabled: !controller.syncInProgress enabled: _activeVehicle && !controller.syncInProgress
onClicked: { onClicked: {
syncButton.hideDropDown() syncButton.hideDropDown()
......
...@@ -29,7 +29,7 @@ Rectangle { ...@@ -29,7 +29,7 @@ Rectangle {
anchors.margins: _margin anchors.margins: _margin
anchors.top: parent.top anchors.top: parent.top
anchors.left: parent.left anchors.left: parent.left
width: availableWidth anchors.right: parent.right
spacing: _margin spacing: _margin
Connections { Connections {
...@@ -47,6 +47,30 @@ Rectangle { ...@@ -47,6 +47,30 @@ Rectangle {
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
} }
Repeater {
model: [ missionItem.gridAltitude, missionItem.gridAngle, missionItem.gridSpacing ]
Item {
anchors.left: parent.left
anchors.right: parent.right
height: textField.height
QGCLabel {
anchors.baseline: textField.baseline
anchors.left: parent.left
text: modelData.name
}
FactTextField {
id: textField
anchors.right: parent.right
width: _editFieldWidth
showUnits: true
fact: modelData
}
}
}
QGCButton { QGCButton {
text: _addPointsMode ? "Finished" : "Draw Polygon" text: _addPointsMode ? "Finished" : "Draw Polygon"
onClicked: { onClicked: {
......
This diff is collapsed.
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include "VisualMissionItem.h" #include "VisualMissionItem.h"
#include "MissionItem.h" #include "MissionItem.h"
#include "Fact.h"
class ComplexMissionItem : public VisualMissionItem class ComplexMissionItem : public VisualMissionItem
{ {
...@@ -35,19 +36,30 @@ public: ...@@ -35,19 +36,30 @@ public:
ComplexMissionItem(Vehicle* vehicle, QObject* parent = NULL); ComplexMissionItem(Vehicle* vehicle, QObject* parent = NULL);
ComplexMissionItem(const ComplexMissionItem& other, QObject* parent = NULL); ComplexMissionItem(const ComplexMissionItem& other, QObject* parent = NULL);
Q_PROPERTY(Fact* gridAltitude READ gridAltitude CONSTANT)
Q_PROPERTY(Fact* gridAngle READ gridAngle CONSTANT)
Q_PROPERTY(Fact* gridSpacing READ gridSpacing CONSTANT)
Q_PROPERTY(QVariantList polygonPath READ polygonPath NOTIFY polygonPathChanged) Q_PROPERTY(QVariantList polygonPath READ polygonPath NOTIFY polygonPathChanged)
Q_PROPERTY(int lastSequenceNumber READ lastSequenceNumber NOTIFY lastSequenceNumberChanged) Q_PROPERTY(int lastSequenceNumber READ lastSequenceNumber NOTIFY lastSequenceNumberChanged)
Q_PROPERTY(QVariantList gridPoints READ gridPoints NOTIFY gridPointsChanged)
Q_INVOKABLE void clearPolygon(void); Q_INVOKABLE void clearPolygon(void);
Q_INVOKABLE void addPolygonCoordinate(const QGeoCoordinate coordinate); Q_INVOKABLE void addPolygonCoordinate(const QGeoCoordinate coordinate);
QVariantList polygonPath(void) { return _polygonPath; } QVariantList polygonPath(void) { return _polygonPath; }
QVariantList gridPoints (void) { return _gridPoints; }
QList<MissionItem*>& missionItems(void) { return _missionItems; } Fact* gridAltitude(void) { return &_gridAltitudeFact; }
Fact* gridAngle(void) { return &_gridAngleFact; }
Fact* gridSpacing(void) { return &_gridSpacingFact; }
/// @return The last sequence number used by this item. Takes into account child items of the complex item /// @return The last sequence number used by this item. Takes into account child items of the complex item
int lastSequenceNumber(void) const; int lastSequenceNumber(void) const;
/// Returns the mission items associated with the complex item. Caller is responsible for freeing. Calling
/// delete on returned QmlObjectListModel will free all memory including internal items.
QmlObjectListModel* getMissionItems(void) const;
/// Load the complex mission item from Json /// Load the complex mission item from Json
/// @param complexObject Complex mission item json object /// @param complexObject Complex mission item json object
/// @param[out] errorString Error if load fails /// @param[out] errorString Error if load fails
...@@ -78,22 +90,47 @@ public: ...@@ -78,22 +90,47 @@ public:
signals: signals:
void polygonPathChanged(void); void polygonPathChanged(void);
void lastSequenceNumberChanged(int lastSequenceNumber); void lastSequenceNumberChanged(int lastSequenceNumber);
void altitudeChanged(double altitude);
void gridAngleChanged(double gridAngle);
void gridPointsChanged(void);
private: private:
typedef struct Point_s {
double x;
double y;
Point_s(double x, double y) {
this->x = x;
this->y = y;
}
} Point_t;
void _clear(void); void _clear(void);
void _setExitCoordinate(const QGeoCoordinate& coordinate); void _setExitCoordinate(const QGeoCoordinate& coordinate);
void _clearGrid(void);
void _generateGrid(void);
void _gridGenerator(const QList<Point_t>& polygonPoints, QList<Point_t>& gridPoints);
int _sequenceNumber; int _sequenceNumber;
bool _dirty; bool _dirty;
QVariantList _polygonPath; QVariantList _polygonPath;
QList<MissionItem*> _missionItems; QVariantList _gridPoints;
QGeoCoordinate _coordinate; QGeoCoordinate _coordinate;
QGeoCoordinate _exitCoordinate; QGeoCoordinate _exitCoordinate;
double _altitude;
double _gridAngle;
Fact _gridAltitudeFact;
Fact _gridAngleFact;
Fact _gridSpacingFact;
static const char* _jsonVersionKey; static const char* _jsonVersionKey;
static const char* _jsonTypeKey; static const char* _jsonTypeKey;
static const char* _jsonPolygonKey; static const char* _jsonPolygonKey;
static const char* _jsonIdKey; static const char* _jsonIdKey;
static const char* _jsonGridAltitudeKey;
static const char* _jsonGridAngleKey;
static const char* _jsonGridSpacingKey;
static const char* _complexType; static const char* _complexType;
}; };
......
...@@ -132,28 +132,28 @@ void MissionController::sendMissionItems(void) ...@@ -132,28 +132,28 @@ void MissionController::sendMissionItems(void)
{ {
if (_activeVehicle) { if (_activeVehicle) {
// Convert to MissionItems so we can send to vehicle // Convert to MissionItems so we can send to vehicle
QList<MissionItem*> missionItems; QList<MissionItem*> missionItems;
int sequenceNumber = 0;
for (int i=0; i<_visualItems->count(); i++) { for (int i=0; i<_visualItems->count(); i++) {
VisualMissionItem* visualItem = qobject_cast<VisualMissionItem*>(_visualItems->get(i)); VisualMissionItem* visualItem = qobject_cast<VisualMissionItem*>(_visualItems->get(i));
if (visualItem->isSimpleItem()) { if (visualItem->isSimpleItem()) {
MissionItem& missionItem = qobject_cast<SimpleMissionItem*>(visualItem)->missionItem(); missionItems.append(new MissionItem(qobject_cast<SimpleMissionItem*>(visualItem)->missionItem()));
missionItem.setSequenceNumber(sequenceNumber++);
missionItems.append(&missionItem);
} else { } else {
ComplexMissionItem* complexItem = qobject_cast<ComplexMissionItem*>(visualItem); ComplexMissionItem* complexItem = qobject_cast<ComplexMissionItem*>(visualItem);
for (int j=0; j<complexItem->missionItems().count(); j++) { QmlObjectListModel* complexMissionItems = complexItem->getMissionItems();
MissionItem* missionItem = complexItem->missionItems()[i]; for (int j=0; j<complexMissionItems->count(); j++) {
missionItem->setSequenceNumber(sequenceNumber++); missionItems.append(new MissionItem(*qobject_cast<MissionItem*>(complexMissionItems->get(j))));
missionItems.append(missionItem);
} }
delete complexMissionItems;
} }
} }
_activeVehicle->missionManager()->writeMissionItems(missionItems); _activeVehicle->missionManager()->writeMissionItems(missionItems);
_visualItems->setDirty(false); _visualItems->setDirty(false);
for (int i=0; i<missionItems.count(); i++) {
delete missionItems[i];
}
} }
} }
...@@ -175,8 +175,9 @@ int MissionController::_nextSequenceNumber(void) ...@@ -175,8 +175,9 @@ int MissionController::_nextSequenceNumber(void)
int MissionController::insertSimpleMissionItem(QGeoCoordinate coordinate, int i) int MissionController::insertSimpleMissionItem(QGeoCoordinate coordinate, int i)
{ {
int sequenceNumber = _nextSequenceNumber();
SimpleMissionItem * newItem = new SimpleMissionItem(_activeVehicle, this); SimpleMissionItem * newItem = new SimpleMissionItem(_activeVehicle, this);
newItem->setSequenceNumber(_nextSequenceNumber()); newItem->setSequenceNumber(sequenceNumber);
newItem->setCoordinate(coordinate); newItem->setCoordinate(coordinate);
newItem->setCommand(MavlinkQmlSingleton::MAV_CMD_NAV_WAYPOINT); newItem->setCommand(MavlinkQmlSingleton::MAV_CMD_NAV_WAYPOINT);
_initVisualItem(newItem); _initVisualItem(newItem);
...@@ -198,13 +199,14 @@ int MissionController::insertSimpleMissionItem(QGeoCoordinate coordinate, int i) ...@@ -198,13 +199,14 @@ int MissionController::insertSimpleMissionItem(QGeoCoordinate coordinate, int i)
_recalcAll(); _recalcAll();
return _visualItems->count() - 1; return sequenceNumber;
} }
int MissionController::insertComplexMissionItem(QGeoCoordinate coordinate, int i) int MissionController::insertComplexMissionItem(QGeoCoordinate coordinate, int i)
{ {
int sequenceNumber = _nextSequenceNumber();
ComplexMissionItem* newItem = new ComplexMissionItem(_activeVehicle, this); ComplexMissionItem* newItem = new ComplexMissionItem(_activeVehicle, this);
newItem->setSequenceNumber(_nextSequenceNumber()); newItem->setSequenceNumber(sequenceNumber);
newItem->setCoordinate(coordinate); newItem->setCoordinate(coordinate);
_initVisualItem(newItem); _initVisualItem(newItem);
...@@ -213,7 +215,7 @@ int MissionController::insertComplexMissionItem(QGeoCoordinate coordinate, int i ...@@ -213,7 +215,7 @@ int MissionController::insertComplexMissionItem(QGeoCoordinate coordinate, int i
_recalcAll(); _recalcAll();
return _visualItems->count() - 1; return sequenceNumber;
} }
void MissionController::removeMissionItem(int index) void MissionController::removeMissionItem(int index)
...@@ -771,7 +773,7 @@ void MissionController::_recalcChildItems(void) ...@@ -771,7 +773,7 @@ void MissionController::_recalcChildItems(void)
if (item->specifiesCoordinate()) { if (item->specifiesCoordinate()) {
item->childItems()->clear(); item->childItems()->clear();
currentParentItem = item; currentParentItem = item;
} else { } else if (item->isSimpleItem()) {
currentParentItem->childItems()->append(item); currentParentItem->childItems()->append(item);
} }
} }
...@@ -860,13 +862,16 @@ void MissionController::_initVisualItem(VisualMissionItem* visualItem) ...@@ -860,13 +862,16 @@ void MissionController::_initVisualItem(VisualMissionItem* visualItem)
if (visualItem->isSimpleItem()) { if (visualItem->isSimpleItem()) {
// We need to track commandChanged on simple item since recalc has special handling for takeoff command // We need to track commandChanged on simple item since recalc has special handling for takeoff command
SimpleMissionItem* simpleItem = qobject_cast<SimpleMissionItem*>(visualItem); SimpleMissionItem* simpleItem = qobject_cast<SimpleMissionItem*>(visualItem);
if (simpleItem) { if (simpleItem) {
connect(&simpleItem->missionItem()._commandFact, &Fact::valueChanged, this, &MissionController::_itemCommandChanged); connect(&simpleItem->missionItem()._commandFact, &Fact::valueChanged, this, &MissionController::_itemCommandChanged);
} else { } else {
qWarning() << "isSimpleItem == true, yet not SimpleMissionItem"; qWarning() << "isSimpleItem == true, yet not SimpleMissionItem";
} }
} else {
// We need to track changes of lastSequenceNumber so we can recalc sequence numbers for subsequence items
ComplexMissionItem* complexItem = qobject_cast<ComplexMissionItem*>(visualItem);
connect(complexItem, &ComplexMissionItem::lastSequenceNumberChanged, this, &MissionController::_recalcSequence);
} }
} }
......
...@@ -59,10 +59,14 @@ public: ...@@ -59,10 +59,14 @@ public:
Q_INVOKABLE void removeAllMissionItems(void); Q_INVOKABLE void removeAllMissionItems(void);
Q_INVOKABLE QStringList getMobileMissionFiles(void); Q_INVOKABLE QStringList getMobileMissionFiles(void);
/// @param i: index to insert at /// Add a new simple mission item to the list
/// @param i: index to insert at
/// @return Sequence number for new item
Q_INVOKABLE int insertSimpleMissionItem(QGeoCoordinate coordinate, int i); Q_INVOKABLE int insertSimpleMissionItem(QGeoCoordinate coordinate, int i);
/// @param i: index to insert at /// Add a new complex mission item to the list
/// @param i: index to insert at
/// @return Sequence number for new item
Q_INVOKABLE int insertComplexMissionItem(QGeoCoordinate coordinate, int i); Q_INVOKABLE int insertComplexMissionItem(QGeoCoordinate coordinate, int i);
// Property accessors // Property accessors
......
...@@ -117,16 +117,13 @@ public slots: ...@@ -117,16 +117,13 @@ public slots:
signals: signals:
void commandChanged (int command); void commandChanged (int command);
void coordinateChanged (const QGeoCoordinate& coordinate);
void exitCoordinateChanged (const QGeoCoordinate& exitCoordinate);
//void dirtyChanged (bool dirty);
void frameChanged (int frame); void frameChanged (int frame);
void friendlyEditAllowedChanged (bool friendlyEditAllowed); void friendlyEditAllowedChanged (bool friendlyEditAllowed);
void headingDegreesChanged (double heading); void headingDegreesChanged (double heading);
void rawEditChanged (bool rawEdit); void rawEditChanged (bool rawEdit);
void uiModelChanged (void); void uiModelChanged (void);
void showHomePositionChanged (bool showHomePosition); void showHomePositionChanged (bool showHomePosition);
private slots: private slots:
void _setDirtyFromSignal(void); void _setDirtyFromSignal(void);
void _sendCommandChanged(void); void _sendCommandChanged(void);
......
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