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

Survey initial grid generation

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