Commit 27216843 authored by Don Gagne's avatar Don Gagne

Merge pull request #2899 from DonLakeFlyer/ExitCoordinate

Add complex mission item exit coordinate support
parents 2fcdda7f b4efe205
......@@ -33,6 +33,7 @@ MapQuickItem {
id: _item
property var missionItem
property int sequenceNumber
signal clicked
......@@ -43,10 +44,9 @@ MapQuickItem {
MissionItemIndexLabel {
id: _label
isCurrentItem: _isCurrentItem
label: _sequenceNumber == 0 ? "H" : missionItem.sequenceNumber
label: sequenceNumber == 0 ? "H" : sequenceNumber
onClicked: _item.clicked()
property bool _isCurrentItem: missionItem ? missionItem.isCurrentItem : false
property bool _sequenceNumber: missionItem ? missionItem.sequenceNumber : 0
}
}
......@@ -41,6 +41,7 @@ MapItemView {
visible: object.specifiesCoordinate && (index != 0 || object.showHomePosition)
z: QGroundControl.zOrderMapItems
missionItem: object
sequenceNumber: object.sequenceNumber
// These are the non-coordinate child mission items attached to this item
Row {
......
......@@ -134,8 +134,6 @@ QGCFlickable {
width: barRow.width
height: 1
color: "red"
Component.onCompleted: console.log(anchors.topMargin, xBar.height, _barBadValue, _barMaximum, _barMinimum)
}
QGCLabel {
......
......@@ -366,8 +366,42 @@ QGCView {
// Add the simple mission items to the map
MapItemView {
model: controller.visualItems
delegate: missionItemComponent
model: controller.visualItems
delegate: missionItemComponent
}
// Add the complex mission items to the map
MapItemView {
model: controller.complexVisualItems
delegate: polygonItemComponent
}
Component {
id: polygonItemComponent
MapPolygon {
color: 'green'
path: object.polygonPath
opacity: 0.5
}
}
// Add the complex mission item exit coordinates
MapItemView {
model: controller.complexVisualItems
delegate: exitCoordinateComponent
}
Component {
id: exitCoordinateComponent
MissionItemIndicator {
coordinate: object.exitCoordinate
z: QGroundControl.zOrderMapItems
missionItem: object
sequenceNumber: object.lastSequenceNumber
visible: object.specifiesCoordinate
}
}
Component {
......@@ -379,18 +413,18 @@ QGCView {
visible: object.specifiesCoordinate
z: QGroundControl.zOrderMapItems
missionItem: object
sequenceNumber: object.sequenceNumber
onClicked: setCurrentItem(object.sequenceNumber)
function updateItemIndicator()
{
if (object.isCurrentItem && itemIndicator.visible) {
if (object.specifiesCoordinate) {
// Setup our drag item
itemDragger.visible = true
itemDragger.missionItem = Qt.binding(function() { return object })
itemDragger.missionItemIndicator = Qt.binding(function() { return itemIndicator })
}
if (object.isCurrentItem && itemIndicator.visible &&
object.specifiesCoordinate && object.isSimpleItem) {
// Setup our drag item
itemDragger.visible = true
itemDragger.missionItem = Qt.binding(function() { return object })
itemDragger.missionItemIndicator = Qt.binding(function() { return itemIndicator })
}
}
......@@ -421,22 +455,6 @@ QGCView {
}
}
// Add the complex mission items to the map
MapItemView {
model: controller.complexVisualItems
delegate: polygonItemComponent
}
Component {
id: polygonItemComponent
MapPolygon {
color: 'green'
path: object.polygonPath
opacity: 0.5
}
}
// Add lines between waypoints
MissionLineView {
model: controller.waypointLines
......
......@@ -33,6 +33,7 @@ const char* ComplexMissionItem::_complexType = "survey";
ComplexMissionItem::ComplexMissionItem(Vehicle* vehicle, QObject* parent)
: VisualMissionItem(vehicle, parent)
, _sequenceNumber(0)
, _dirty(false)
{
MissionItem missionItem;
......@@ -44,6 +45,7 @@ ComplexMissionItem::ComplexMissionItem(Vehicle* vehicle, QObject* parent)
ComplexMissionItem::ComplexMissionItem(const ComplexMissionItem& other, QObject* parent)
: VisualMissionItem(other, parent)
, _sequenceNumber(other.sequenceNumber())
, _dirty(false)
{
......@@ -51,8 +53,18 @@ ComplexMissionItem::ComplexMissionItem(const ComplexMissionItem& other, QObject*
void ComplexMissionItem::clearPolygon(void)
{
_polygonPath.clear();
// Bug workaround, see below
while (_polygonPath.count() > 1) {
_polygonPath.takeLast();
}
emit polygonPathChanged();
// Although this code should remove the polygon from the map it doesn't. There appears
// to be a bug in MapPolygon which causes it to not be redrawn if the list is empty. So
// we work around it by using the code above to remove all bu the last point which in turn
// will cause the polygon to go away.
_polygonPath.clear();
emit specifiesCoordinateChanged();
}
void ComplexMissionItem::addPolygonCoordinate(const QGeoCoordinate coordinate)
......@@ -60,15 +72,18 @@ void ComplexMissionItem::addPolygonCoordinate(const QGeoCoordinate coordinate)
_polygonPath << QVariant::fromValue(coordinate);
emit polygonPathChanged();
// FIXME: Hack, first polygon point sets entry coordinate
if (_polygonPath.count() == 1) {
int pointCount = _polygonPath.count();
if (pointCount == 1) {
setCoordinate(coordinate);
} else if (pointCount == 3) {
emit specifiesCoordinateChanged();
}
_setExitCoordinate(coordinate);
}
int ComplexMissionItem::nextSequenceNumber(void) const
int ComplexMissionItem::lastSequenceNumber(void) const
{
return _sequenceNumber + _missionItems.count();
return _sequenceNumber + _missionItems.count() - 1;
}
void ComplexMissionItem::setCoordinate(const QGeoCoordinate& coordinate)
......@@ -126,11 +141,15 @@ void ComplexMissionItem::save(QJsonObject& saveObject) const
void ComplexMissionItem::setSequenceNumber(int sequenceNumber)
{
VisualMissionItem::setSequenceNumber(sequenceNumber);
if (_sequenceNumber != sequenceNumber) {
_sequenceNumber = sequenceNumber;
// Update internal mission items to new numbering
for (int i=0; i<_missionItems.count(); i++) {
_missionItems[i]->setSequenceNumber(sequenceNumber++);
// Update internal mission items to new numbering
for (int i=0; i<_missionItems.count(); i++) {
_missionItems[i]->setSequenceNumber(sequenceNumber++);
}
emit sequenceNumberChanged(sequenceNumber);
}
}
......@@ -217,10 +236,12 @@ bool ComplexMissionItem::load(const QJsonObject& complexObject, QString& errorSt
int itemCount = _missionItems.count();
if (itemCount > 0) {
setCoordinate(_missionItems[0]->coordinate());
_setExitCoordinate(_missionItems[itemCount - 1]->coordinate());
_coordinate = _missionItems[0]->coordinate();
_exitCoordinate = _missionItems[itemCount - 1]->coordinate();
}
qDebug() << coordinate() << exitCoordinate() << _missionItems[0]->coordinate() << _missionItems[1]->coordinate();
return true;
}
......@@ -236,3 +257,8 @@ void ComplexMissionItem::_setExitCoordinate(const QGeoCoordinate& coordinate)
}
}
}
bool ComplexMissionItem::specifiesCoordinate(void) const
{
return _polygonPath.count() > 2;
}
......@@ -35,7 +35,8 @@ public:
ComplexMissionItem(Vehicle* vehicle, QObject* parent = NULL);
ComplexMissionItem(const ComplexMissionItem& other, QObject* parent = NULL);
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_INVOKABLE void clearPolygon(void);
Q_INVOKABLE void addPolygonCoordinate(const QGeoCoordinate coordinate);
......@@ -44,8 +45,8 @@ public:
QList<MissionItem*>& missionItems(void) { return _missionItems; }
/// @return The next sequence number to use after this item. Takes into account child items of the complex item
int nextSequenceNumber(void) const;
/// @return The last sequence number used by this item. Takes into account child items of the complex item
int lastSequenceNumber(void) const;
/// Load the complex mission item from Json
/// @param complexObject Complex mission item json object
......@@ -58,11 +59,12 @@ public:
bool dirty (void) const final { return _dirty; }
bool isSimpleItem (void) const final { return false; }
bool isStandaloneCoordinate (void) const final { return false; }
bool specifiesCoordinate (void) const final { return true; }
bool specifiesCoordinate (void) const final;
QString commandDescription (void) const final { return "Survey"; }
QString commandName (void) const final { return "Survey"; }
QGeoCoordinate coordinate (void) const final { return _coordinate; }
QGeoCoordinate exitCoordinate (void) const final { return _exitCoordinate; }
int sequenceNumber (void) const final { return _sequenceNumber; }
bool coordinateHasRelativeAltitude (void) const final { return true; }
bool exitCoordinateHasRelativeAltitude (void) const final { return true; }
......@@ -75,11 +77,13 @@ public:
signals:
void polygonPathChanged(void);
void lastSequenceNumberChanged(int lastSequenceNumber);
private:
void _clear(void);
void _setExitCoordinate(const QGeoCoordinate& coordinate);
int _sequenceNumber;
bool _dirty;
QVariantList _polygonPath;
QList<MissionItem*> _missionItems;
......
......@@ -157,10 +157,26 @@ void MissionController::sendMissionItems(void)
}
}
int MissionController::_nextSequenceNumber(void)
{
if (_visualItems->count() == 0) {
qWarning() << "Internal error: Empty visual item list";
return 0;
} else {
VisualMissionItem* lastItem = qobject_cast<VisualMissionItem*>(_visualItems->get(_visualItems->count() - 1));
if (lastItem->isSimpleItem()) {
return lastItem->sequenceNumber() + 1;
} else {
return qobject_cast<ComplexMissionItem*>(lastItem)->lastSequenceNumber() + 1;
}
}
}
int MissionController::insertSimpleMissionItem(QGeoCoordinate coordinate, int i)
{
SimpleMissionItem * newItem = new SimpleMissionItem(_activeVehicle, this);
newItem->setSequenceNumber(_visualItems->count());
newItem->setSequenceNumber(_nextSequenceNumber());
newItem->setCoordinate(coordinate);
newItem->setCommand(MavlinkQmlSingleton::MAV_CMD_NAV_WAYPOINT);
_initVisualItem(newItem);
......@@ -188,7 +204,7 @@ int MissionController::insertSimpleMissionItem(QGeoCoordinate coordinate, int i)
int MissionController::insertComplexMissionItem(QGeoCoordinate coordinate, int i)
{
ComplexMissionItem* newItem = new ComplexMissionItem(_activeVehicle, this);
newItem->setSequenceNumber(_visualItems->count());
newItem->setSequenceNumber(_nextSequenceNumber());
newItem->setCoordinate(coordinate);
_initVisualItem(newItem);
......@@ -240,7 +256,7 @@ void MissionController::removeAllMissionItems(void)
}
}
bool MissionController::_loadJsonMissionFile(const QByteArray& bytes, QmlObjectListModel* missionItems, QString& errorString)
bool MissionController::_loadJsonMissionFile(const QByteArray& bytes, QmlObjectListModel* visualItems, QmlObjectListModel* complexItems, QString& errorString)
{
QJsonParseError jsonParseError;
QJsonDocument jsonDoc(QJsonDocument::fromJson(bytes, &jsonParseError));
......@@ -274,52 +290,81 @@ bool MissionController::_loadJsonMissionFile(const QByteArray& bytes, QmlObjectL
return false;
}
// Simple items
if (json.contains(jsonSimpleItemsKey)) {
QJsonArray itemArray(json[jsonSimpleItemsKey].toArray());
foreach (const QJsonValue& itemValue, itemArray) {
if (!itemValue.isObject()) {
errorString = QStringLiteral("Mission item is not an object");
return false;
}
// Read complex items
QJsonArray complexArray(json[_jsonComplexItemsKey].toArray());
qCDebug(MissionControllerLog) << "Json load: complex item count" << complexArray.count();
for (int i=0; i<complexArray.count(); i++) {
const QJsonValue& itemValue = complexArray[i];
SimpleMissionItem* item = new SimpleMissionItem(_activeVehicle, this);
if (item->load(itemValue.toObject(), errorString)) {
missionItems->append(item);
} else {
return false;
}
if (!itemValue.isObject()) {
errorString = QStringLiteral("Mission item is not an object");
return false;
}
ComplexMissionItem* item = new ComplexMissionItem(_activeVehicle, this);
if (item->load(itemValue.toObject(), errorString)) {
qCDebug(MissionControllerLog) << "Json load: complex item start:stop" << item->sequenceNumber() << item->lastSequenceNumber();
complexItems->append(item);
} else {
return false;
}
}
// Complex items
if (json.contains(_jsonComplexItemsKey)) {
QJsonArray itemArray(json[_jsonComplexItemsKey].toArray());
foreach (const QJsonValue& itemValue, itemArray) {
// Read simple items, interspersing complex items into the full list
int nextSimpleItemIndex= 0;
int nextComplexItemIndex= 0;
int nextSequenceNumber = 1; // Start with 1 since home is in 0
QJsonArray itemArray(json[jsonSimpleItemsKey].toArray());
qCDebug(MissionControllerLog) << "Json load: simple item loop start simpleItemCount:ComplexItemCount" << itemArray.count() << complexItems->count();
do {
qCDebug(MissionControllerLog) << "Json load: simple item loop nextSimpleItemIndex:nextComplexItemIndex:nextSequenceNumber" << nextSimpleItemIndex << nextComplexItemIndex << nextSequenceNumber;
// If there is a complex item that should be next in sequence add it in
if (nextComplexItemIndex < complexItems->count()) {
ComplexMissionItem* complexItem = qobject_cast<ComplexMissionItem*>(complexItems->get(nextComplexItemIndex));
if (complexItem->sequenceNumber() == nextSequenceNumber) {
qCDebug(MissionControllerLog) << "Json load: injecting complex item expectedSequence:actualSequence:" << nextSequenceNumber << complexItem->sequenceNumber();
visualItems->append(complexItem);
nextSequenceNumber = complexItem->lastSequenceNumber() + 1;
nextComplexItemIndex++;
continue;
}
}
// Add the next available simple item
if (nextSimpleItemIndex < itemArray.count()) {
const QJsonValue& itemValue = itemArray[nextSimpleItemIndex++];
if (!itemValue.isObject()) {
errorString = QStringLiteral("Mission item is not an object");
return false;
}
ComplexMissionItem* item = new ComplexMissionItem(_activeVehicle, this);
SimpleMissionItem* item = new SimpleMissionItem(_activeVehicle, this);
if (item->load(itemValue.toObject(), errorString)) {
missionItems->append(item);
qCDebug(MissionControllerLog) << "Json load: adding simple item expectedSequence:actualSequence" << nextSequenceNumber << item->sequenceNumber();
visualItems->append(item);
} else {
return false;
}
nextSequenceNumber++;
}
}
} while (nextSimpleItemIndex < itemArray.count() || nextComplexItemIndex < complexItems->count());
if (json.contains(_jsonPlannedHomePositionKey)) {
SimpleMissionItem* item = new SimpleMissionItem(_activeVehicle, this);
if (item->load(json[_jsonPlannedHomePositionKey].toObject(), errorString)) {
missionItems->insert(0, item);
visualItems->insert(0, item);
} else {
return false;
}
} else {
_addPlannedHomePosition(missionItems, true /* addToCenter */);
_addPlannedHomePosition(visualItems, true /* addToCenter */);
}
return true;
......@@ -383,7 +428,8 @@ void MissionController::_loadMissionFromFile(const QString& filename)
return;
}
QmlObjectListModel* newMissionItems = new QmlObjectListModel(this);
QmlObjectListModel* newVisualItems = new QmlObjectListModel(this);
QmlObjectListModel* newComplexItems = new QmlObjectListModel(this);
QFile file(filename);
......@@ -396,14 +442,22 @@ void MissionController::_loadMissionFromFile(const QString& filename)
QString firstLine = stream.readLine();
if (firstLine.contains(QRegExp("QGC.*WPL"))) {
stream.seek(0);
_loadTextMissionFile(stream, newMissionItems, errorString);
_loadTextMissionFile(stream, newVisualItems, errorString);
} else {
_loadJsonMissionFile(bytes, newMissionItems, errorString);
_loadJsonMissionFile(bytes, newVisualItems, newComplexItems, errorString);
}
}
if (!errorString.isEmpty()) {
delete newMissionItems;
for (int i=0; i<newVisualItems->count(); i++) {
newVisualItems->get(i)->deleteLater();
}
for (int i=0; i<newComplexItems->count(); i++) {
newComplexItems->get(i)->deleteLater();
}
delete newVisualItems;
delete newComplexItems;
qgcApp()->showMessage(errorString);
return;
}
......@@ -412,7 +466,13 @@ void MissionController::_loadMissionFromFile(const QString& filename)
_deinitAllVisualItems();
_visualItems->deleteListAndContents();
}
_visualItems = newMissionItems;
if (_complexItems) {
_complexItems->deleteLater();
}
_visualItems = newVisualItems;
_complexItems = newComplexItems;
if (_visualItems->count() == 0) {
_addPlannedHomePosition(_visualItems, true /* addToCenter */);
}
......@@ -647,7 +707,7 @@ void MissionController::_recalcWaypointLines(void)
item->setAltDifference(altDifference);
item->setAzimuth(azimuth);
item->setDistance(distance);
_waypointLines.append(new CoordinateVector(lastCoordinateItem->coordinate(), item->coordinate()));
_waypointLines.append(new CoordinateVector(lastCoordinateItem->isSimpleItem() ? lastCoordinateItem->coordinate() : lastCoordinateItem->exitCoordinate(), item->coordinate()));
}
lastCoordinateItem = item;
}
......@@ -689,7 +749,7 @@ void MissionController::_recalcSequence(void)
ComplexMissionItem* complexItem = qobject_cast<ComplexMissionItem*>(item);
if (complexItem) {
sequenceNumber = complexItem->nextSequenceNumber();
sequenceNumber = complexItem->lastSequenceNumber() + 1;
} else {
qWarning() << "isSimpleItem == false, yet not ComplexMissionItem";
}
......@@ -748,8 +808,6 @@ void MissionController::_initAllVisualItems(void)
homeItem->setShowHomePosition(true);
}
qDebug() << "home item" << homeItem->coordinate();
QmlObjectListModel* newComplexItems = new QmlObjectListModel(this);
for (int i=0; i<_visualItems->count(); i++) {
VisualMissionItem* item = qobject_cast<VisualMissionItem*>(_visualItems->get(i));
......@@ -796,6 +854,7 @@ void MissionController::_initVisualItem(VisualMissionItem* visualItem)
_visualItems->setDirty(false);
connect(visualItem, &VisualMissionItem::coordinateChanged, this, &MissionController::_itemCoordinateChanged);
connect(visualItem, &VisualMissionItem::specifiesCoordinateChanged, this, &MissionController::_recalcWaypointLines);
connect(visualItem, &VisualMissionItem::coordinateHasRelativeAltitudeChanged, this, &MissionController::_recalcWaypointLines);
connect(visualItem, &VisualMissionItem::exitCoordinateHasRelativeAltitudeChanged, this, &MissionController::_recalcWaypointLines);
......@@ -921,7 +980,6 @@ void MissionController::_dirtyChanged(bool dirty)
void MissionController::_autoSyncSend(void)
{
qDebug() << "Auto-syncing with vehicle";
_queuedSend = false;
if (_visualItems) {
sendMissionItems();
......
......@@ -113,10 +113,11 @@ private:
void _addPlannedHomePosition(QmlObjectListModel* visualItems, bool addToCenter);
double _normalizeLat(double lat);
double _normalizeLon(double lon);
bool _loadJsonMissionFile(const QByteArray& bytes, QmlObjectListModel* visualItems, QString& errorString);
bool _loadJsonMissionFile(const QByteArray& bytes, QmlObjectListModel* visualItems, QmlObjectListModel* complexItems, QString& errorString);
bool _loadTextMissionFile(QTextStream& stream, QmlObjectListModel* visualItems, QString& errorString);
void _loadMissionFromFile(const QString& file);
void _saveMissionToFile(const QString& file);
int _nextSequenceNumber(void);
private:
bool _editMode;
......
......@@ -190,6 +190,9 @@ void SimpleMissionItem::_connectSignals(void)
// These fact signals must alway signal out through SimpleMissionItem signals
connect(&_missionItem._commandFact, &Fact::valueChanged, this, &SimpleMissionItem::_sendCommandChanged);
connect(&_missionItem._frameFact, &Fact::valueChanged, this, &SimpleMissionItem::_sendFrameChanged);
// Sequence number is kept in mission iteem, so we need to propogate signal up as well
connect(&_missionItem, &MissionItem::sequenceNumberChanged, this, &SimpleMissionItem::sequenceNumberChanged);
}
void SimpleMissionItem::_setupMetaData(void)
......@@ -574,7 +577,6 @@ void SimpleMissionItem::setCommand(MavlinkQmlSingleton::Qml_MAV_CMD command)
void SimpleMissionItem::setCoordinate(const QGeoCoordinate& coordinate)
{
if (_missionItem.coordinate() != coordinate) {
qDebug() << _missionItem.coordinate() << coordinate;
_missionItem.setCoordinate(coordinate);
}
}
......@@ -582,5 +584,4 @@ void SimpleMissionItem::setCoordinate(const QGeoCoordinate& coordinate)
void SimpleMissionItem::setSequenceNumber(int sequenceNumber)
{
_missionItem.setSequenceNumber(sequenceNumber);
VisualMissionItem::setSequenceNumber(sequenceNumber);
}
......@@ -101,6 +101,7 @@ public:
QString commandName (void) const final;
QGeoCoordinate coordinate (void) const final { return _missionItem.coordinate(); }
QGeoCoordinate exitCoordinate (void) const final { return coordinate(); }
int sequenceNumber (void) const final { return _missionItem.sequenceNumber(); }
bool coordinateHasRelativeAltitude (void) const final { return _missionItem.relativeAltitude(); }
bool exitCoordinateHasRelativeAltitude (void) const final { return coordinateHasRelativeAltitude(); }
......
......@@ -31,7 +31,6 @@ This file is part of the QGROUNDCONTROL project
VisualMissionItem::VisualMissionItem(Vehicle* vehicle, QObject* parent)
: QObject(parent)
, _vehicle(vehicle)
, _sequenceNumber(0)
, _isCurrentItem(false)
, _dirty(false)
, _altDifference(0.0)
......@@ -45,7 +44,6 @@ VisualMissionItem::VisualMissionItem(Vehicle* vehicle, QObject* parent)
VisualMissionItem::VisualMissionItem(const VisualMissionItem& other, QObject* parent)
: QObject(parent)
, _vehicle(NULL)
, _sequenceNumber(0)
, _isCurrentItem(false)
, _dirty(false)
, _altDifference(0.0)
......@@ -60,7 +58,6 @@ const VisualMissionItem& VisualMissionItem::operator=(const VisualMissionItem& o
{
_vehicle = other._vehicle;
setSequenceNumber(other._sequenceNumber);
setIsCurrentItem(other._isCurrentItem);
setDirty(other._dirty);
setAltDifference(other._altDifference);
......@@ -106,11 +103,3 @@ void VisualMissionItem::setAzimuth(double azimuth)
_azimuth = azimuth;
emit azimuthChanged(_azimuth);
}
void VisualMissionItem::setSequenceNumber (int sequenceNumber)
{
if (_sequenceNumber != sequenceNumber) {
_sequenceNumber = sequenceNumber;
emit sequenceNumberChanged(_sequenceNumber);
}
}
......@@ -99,7 +99,6 @@ public:
double azimuth (void) const { return _azimuth; }
double distance (void) const { return _distance; }
bool isCurrentItem (void) const { return _isCurrentItem; }
int sequenceNumber (void) const { return _sequenceNumber; }
QmlObjectListModel* childItems(void) { return &_childItems; }
......@@ -111,10 +110,6 @@ public:
Vehicle* vehicle(void) { return _vehicle; }
// Virtuals which may be overriden by derived classes
virtual void setSequenceNumber(int sequenceNumber);
// Pure virtuals which must be provides by derived classes
virtual bool dirty (void) const = 0;
......@@ -125,6 +120,7 @@ public:
virtual QString commandName (void) const = 0;
virtual QGeoCoordinate coordinate (void) const = 0;
virtual QGeoCoordinate exitCoordinate (void) const = 0;
virtual int sequenceNumber (void) const = 0;
virtual bool coordinateHasRelativeAltitude (void) const = 0;
virtual bool exitCoordinateHasRelativeAltitude (void) const = 0;
......@@ -132,6 +128,7 @@ public:
virtual void setDirty (bool dirty) = 0;
virtual void setCoordinate (const QGeoCoordinate& coordinate) = 0;
virtual void setSequenceNumber (int sequenceNumber) = 0;
/// Save the item(s) in Json format
/// @param saveObject Save the item to this json object
......@@ -159,7 +156,6 @@ signals:
protected:
Vehicle* _vehicle;
int _sequenceNumber;
bool _isCurrentItem;
bool _dirty;
double _altDifference; ///< Difference in altitude from previous waypoint
......
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