Commit 36de7a37 authored by DonLakeFlyer's avatar DonLakeFlyer

parent f9fed02a
......@@ -17,11 +17,11 @@ import QGroundControl.Palette 1.0
/// The MissionLineView control is used to add lines between mission items
MapItemView {
property bool showSpecialVisual: false
delegate: MapPolyline {
line.width: 3
line.color: "#be781c" // Hack, can't get palette to work in here
line.color: object && showSpecialVisual && object.specialVisual ? "green" : "#be781c" // Hack, can't get palette to work in here
z: QGroundControl.zOrderWaypointLines
path: object && object.coordinate1.isValid && object.coordinate2.isValid ? [ object.coordinate1, object.coordinate2 ] : []
path: object && object.coordinate1.isValid && object.coordinate2.isValid ? [ object.coordinate1, object.coordinate2 ] : []
}
}
......@@ -444,6 +444,7 @@ VisualMissionItem* MissionController::insertROIMissionItem(QGeoCoordinate coordi
simpleItem->setCommand(MAV_CMD_DO_SET_ROI) ;
simpleItem->missionItem().setParam1(MAV_ROI_LOCATION);
}
_recalcROISpecialVisuals();
return simpleItem;
}
......@@ -455,6 +456,7 @@ VisualMissionItem* MissionController::insertCancelROIMissionItem(int visualItemI
simpleItem->setCommand(MAV_CMD_DO_SET_ROI) ;
simpleItem->missionItem().setParam1(MAV_ROI_NONE);
}
_recalcROISpecialVisuals();
return simpleItem;
}
......@@ -555,15 +557,15 @@ void MissionController::_insertComplexMissionItemWorker(const QGeoCoordinate& ma
}
}
void MissionController::removeMissionItem(int index)
void MissionController::removeMissionItem(int viIndex)
{
if (index <= 0 || index >= _visualItems->count()) {
qWarning() << "MissionController::removeMissionItem called with bad index - count:index" << _visualItems->count() << index;
if (viIndex <= 0 || viIndex >= _visualItems->count()) {
qWarning() << "MissionController::removeMissionItem called with bad index - count:index" << _visualItems->count() << viIndex;
return;
}
bool removeSurveyStyle = _visualItems->value<SurveyComplexItem*>(index) || _visualItems->value<CorridorScanComplexItem*>(index);
VisualMissionItem* item = qobject_cast<VisualMissionItem*>(_visualItems->removeAt(index));
bool removeSurveyStyle = _visualItems->value<SurveyComplexItem*>(viIndex) || _visualItems->value<CorridorScanComplexItem*>(viIndex);
VisualMissionItem* item = qobject_cast<VisualMissionItem*>(_visualItems->removeAt(viIndex));
_deinitVisualItem(item);
item->deleteLater();
......@@ -1163,6 +1165,39 @@ CoordinateVector* MissionController::_addWaypointLineSegment(CoordVectHashTable&
return coordVector;
}
void MissionController::_recalcROISpecialVisuals(void)
{
return;
VisualMissionItem* lastCoordinateItem = qobject_cast<VisualMissionItem*>(_visualItems->get(0));
bool roiActive = false;
for (int i=1; i<_visualItems->count(); i++) {
VisualMissionItem* visualItem = qobject_cast<VisualMissionItem*>(_visualItems->get(i));
SimpleMissionItem* simpleItem = qobject_cast<SimpleMissionItem*>(visualItem);
VisualItemPair viPair;
if (simpleItem) {
if (roiActive) {
if (_isROICancelItem(simpleItem)) {
roiActive = false;
}
} else {
if (_isROIBeginItem(simpleItem)) {
roiActive = true;
}
}
}
if (visualItem->specifiesCoordinate() && !visualItem->isStandaloneCoordinate()) {
viPair = VisualItemPair(lastCoordinateItem, visualItem);
if (_linesTable.contains(viPair)) {
_linesTable[viPair]->setSpecialVisual(roiActive);
}
lastCoordinateItem = visualItem;
}
}
}
void MissionController::_recalcWaypointLines(void)
{
VisualItemPair lastSegmentVisualItemPair;
......@@ -1172,7 +1207,8 @@ void MissionController::_recalcWaypointLines(void)
bool linkEndToHome = false;
bool linkStartToHome = _managerVehicle->rover() ? true : false;
bool foundRTL = false;
bool homePositionValid = _settingsItem->coordinate().isValid();
bool homePositionValid = _settingsItem->coordinate().isValid();
bool roiActive = false;
qCDebug(MissionControllerLog) << "_recalcWaypointLines homePositionValid" << homePositionValid;
......@@ -1190,10 +1226,20 @@ void MissionController::_recalcWaypointLines(void)
// Grovel through the list of items keeping track of things needed to correctly draw waypoints lines
for (int i=1; i<_visualItems->count(); i++) {
VisualMissionItem* visualItem = qobject_cast<VisualMissionItem*>(_visualItems->get(i));
SimpleMissionItem* simpleItem = qobject_cast<SimpleMissionItem*>(visualItem);
VisualMissionItem* visualItem = qobject_cast<VisualMissionItem*>(_visualItems->get(i));
SimpleMissionItem* simpleItem = qobject_cast<SimpleMissionItem*>(visualItem);
if (simpleItem) {
if (roiActive) {
if (_isROICancelItem(simpleItem)) {
roiActive = false;
}
} else {
if (_isROIBeginItem(simpleItem)) {
roiActive = true;
}
}
MAV_CMD command = simpleItem->mavCommand();
switch (command) {
case MAV_CMD_NAV_TAKEOFF:
......@@ -1235,6 +1281,7 @@ void MissionController::_recalcWaypointLines(void)
lastSegmentVisualItemPair = VisualItemPair(lastCoordinateItemBeforeRTL, visualItem);
if (!_flyView || addDirectionArrow) {
CoordinateVector* coordVector = _addWaypointLineSegment(old_table, lastSegmentVisualItemPair);
coordVector->setSpecialVisual(roiActive);
if (addDirectionArrow) {
_directionArrows.append(coordVector);
}
......@@ -1255,7 +1302,8 @@ void MissionController::_recalcWaypointLines(void)
if (_flyView) {
_waypointPath.append(QVariant::fromValue(_settingsItem->coordinate()));
}
_addWaypointLineSegment(old_table, lastSegmentVisualItemPair);
CoordinateVector* coordVector = _addWaypointLineSegment(old_table, lastSegmentVisualItemPair);
coordVector->setSpecialVisual(roiActive);
}
// Add direction arrow to last segment
......@@ -2164,6 +2212,21 @@ void MissionController::_managerRemoveAllComplete(bool error)
}
}
bool MissionController::_isROIBeginItem(SimpleMissionItem* simpleItem)
{
return simpleItem->mavCommand() == MAV_CMD_DO_SET_ROI_LOCATION ||
simpleItem->mavCommand() == MAV_CMD_DO_SET_ROI_WPNEXT_OFFSET ||
(simpleItem->mavCommand() == MAV_CMD_DO_SET_ROI &&
static_cast<int>(simpleItem->missionItem().param1()) == MAV_ROI_LOCATION);
}
bool MissionController::_isROICancelItem(SimpleMissionItem* simpleItem)
{
return simpleItem->mavCommand() == MAV_CMD_DO_SET_ROI_NONE ||
(simpleItem->mavCommand() == MAV_CMD_DO_SET_ROI &&
static_cast<int>(simpleItem->missionItem().param1()) == MAV_ROI_NONE);
}
void MissionController::setCurrentPlanViewSeqNum(int sequenceNumber, bool force)
{
if (_visualItems && (force || sequenceNumber != _currentPlanViewSeqNum)) {
......@@ -2178,6 +2241,7 @@ void MissionController::setCurrentPlanViewSeqNum(int sequenceNumber, bool force)
_isInsertTakeoffValid = true;
_isInsertLandValid = true;
_isROIActive = false;
_isROIBeginCurrentItem = false;
_flyThroughCommandsAllowed = true;
for (int viIndex=0; viIndex<_visualItems->count(); viIndex++) {
......@@ -2222,20 +2286,18 @@ void MissionController::setCurrentPlanViewSeqNum(int sequenceNumber, bool force)
if (simpleItem) {
if (pVI->sequenceNumber() <= sequenceNumber) {
if (_isROIActive) {
if (simpleItem->mavCommand() == MAV_CMD_DO_SET_ROI_NONE ||
(simpleItem->mavCommand() == MAV_CMD_DO_SET_ROI &&
simpleItem->missionItem().param1() == MAV_ROI_NONE)) {
if (_isROICancelItem(simpleItem)) {
_isROIActive = false;
}
} else {
if (simpleItem->mavCommand() == MAV_CMD_DO_SET_ROI_LOCATION ||
simpleItem->mavCommand() == MAV_CMD_DO_SET_ROI_WPNEXT_OFFSET ||
(simpleItem->mavCommand() == MAV_CMD_DO_SET_ROI &&
simpleItem->missionItem().param1() == MAV_ROI_LOCATION)) {
if (_isROIBeginItem(simpleItem)) {
_isROIActive = true;
}
}
}
if (pVI->sequenceNumber() == sequenceNumber && _isROIBeginItem(simpleItem)) {
_isROIBeginCurrentItem = true;
}
}
if (pVI->sequenceNumber() == sequenceNumber) {
......@@ -2287,6 +2349,7 @@ void MissionController::setCurrentPlanViewSeqNum(int sequenceNumber, bool force)
emit isInsertTakeoffValidChanged();
emit isInsertLandValidChanged();
emit isROIActiveChanged();
emit isROIBeginCurrentItemChanged();
emit flyThroughCommandsAllowedChanged();
}
}
......
......@@ -96,9 +96,10 @@ public:
Q_PROPERTY(bool isInsertTakeoffValid MEMBER _isInsertTakeoffValid NOTIFY isInsertTakeoffValidChanged)
Q_PROPERTY(bool isInsertLandValid MEMBER _isInsertLandValid NOTIFY isInsertLandValidChanged)
Q_PROPERTY(bool isROIActive MEMBER _isROIActive NOTIFY isROIActiveChanged)
Q_PROPERTY(bool isROIBeginCurrentItem MEMBER _isROIBeginCurrentItem NOTIFY isROIBeginCurrentItemChanged)
Q_PROPERTY(bool flyThroughCommandsAllowed MEMBER _flyThroughCommandsAllowed NOTIFY flyThroughCommandsAllowedChanged)
Q_INVOKABLE void removeMissionItem(int index);
Q_INVOKABLE void removeMissionItem(int viIndex);
/// Add a new simple mission item to the list
/// @param coordinate: Coordinate for item
......@@ -263,6 +264,7 @@ signals:
void isInsertTakeoffValidChanged (void);
void isInsertLandValidChanged (void);
void isROIActiveChanged (void);
void isROIBeginCurrentItemChanged (void);
void flyThroughCommandsAllowedChanged (void);
private slots:
......@@ -286,6 +288,7 @@ private:
void _recalcSequence(void);
void _recalcChildItems(void);
void _recalcAllWithCoordinate(const QGeoCoordinate& coordinate);
void _recalcROISpecialVisuals(void);
void _initAllVisualItems(void);
void _deinitAllVisualItems(void);
void _initVisualItem(VisualMissionItem* item);
......@@ -317,6 +320,8 @@ private:
VisualMissionItem* _insertSimpleMissionItemWorker(QGeoCoordinate coordinate, MAV_CMD command, int visualItemIndex, bool makeCurrentItem);
void _insertComplexMissionItemWorker(const QGeoCoordinate& mapCenterCoordinate, ComplexMissionItem* complexItem, int visualItemIndex, bool makeCurrentItem);
void _warnIfTerrainFrameUsed(void);
bool _isROIBeginItem(SimpleMissionItem* simpleItem);
bool _isROICancelItem(SimpleMissionItem* simpleItem);
private:
MissionManager* _missionManager;
......@@ -344,6 +349,7 @@ private:
bool _isInsertLandValid = true;
bool _isROIActive = false;
bool _flyThroughCommandsAllowed = true;
bool _isROIBeginCurrentItem = false;
static const char* _settingsGroup;
......
......@@ -430,7 +430,8 @@ Item {
// Add lines between waypoints
MissionLineView {
model: _editingLayer == _layerMission ? _missionController.waypointLines : undefined
showSpecialVisual: _missionController.isROIBeginCurrentItem
model: _editingLayer == _layerMission ? _missionController.waypointLines : undefined
}
MapItemView {
......
......@@ -44,3 +44,11 @@ void CoordinateVector::setCoordinate2(const QGeoCoordinate &coordinate)
emit coordinate2Changed(_coordinate2);
}
}
void CoordinateVector::setSpecialVisual(bool specialVisual)
{
if (_specialVisual != specialVisual) {
_specialVisual = specialVisual;
emit specialVisualChanged(specialVisual);
}
}
......@@ -21,25 +21,30 @@ public:
CoordinateVector(QObject* parent = nullptr);
CoordinateVector(const QGeoCoordinate& coordinate1, const QGeoCoordinate& coordinate2, QObject* parent = nullptr);
Q_PROPERTY(QGeoCoordinate coordinate1 MEMBER _coordinate1 NOTIFY coordinate1Changed)
Q_PROPERTY(QGeoCoordinate coordinate2 MEMBER _coordinate2 NOTIFY coordinate2Changed)
Q_PROPERTY(QGeoCoordinate coordinate1 MEMBER _coordinate1 NOTIFY coordinate1Changed)
Q_PROPERTY(QGeoCoordinate coordinate2 MEMBER _coordinate2 NOTIFY coordinate2Changed)
Q_PROPERTY(bool specialVisual READ specialVisual WRITE setSpecialVisual NOTIFY specialVisualChanged)
QGeoCoordinate coordinate1(void) const { return _coordinate1; }
QGeoCoordinate coordinate2(void) const { return _coordinate2; }
QGeoCoordinate coordinate1(void) const { return _coordinate1; }
QGeoCoordinate coordinate2(void) const { return _coordinate2; }
bool specialVisual(void) const { return _specialVisual; }
void setCoordinates(const QGeoCoordinate& coordinate1, const QGeoCoordinate& coordinate2);
void setSpecialVisual(bool specialVisual);
public slots:
void setCoordinate1(const QGeoCoordinate& coordinate);
void setCoordinate2(const QGeoCoordinate& coordinate);
signals:
void coordinate1Changed(QGeoCoordinate coordinate);
void coordinate2Changed(QGeoCoordinate coordinate);
void coordinate1Changed (QGeoCoordinate coordinate);
void coordinate2Changed (QGeoCoordinate coordinate);
void specialVisualChanged (bool specialVisual);
private:
QGeoCoordinate _coordinate1;
QGeoCoordinate _coordinate2;
bool _specialVisual = false;
};
#endif
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