Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/MissionManager/MissionController.cc
Original file line number Diff line number Diff line change
Expand Up @@ -643,6 +643,9 @@ bool MissionController::_loadJsonMissionFileV2(const QJsonObject& json, QmlObjec
}
MissionSettingsItem* settingsItem = new MissionSettingsItem(_masterController, _flyView);
settingsItem->setCoordinate(homeCoordinate);
if (json.contains(QStringLiteral("waypointRadius"))) {
settingsItem->waypointRadius()->setRawValue(json[QStringLiteral("waypointRadius")].toDouble());
}
visualItems->insert(0, settingsItem);
qCDebug(MissionControllerLog) << "plannedHomePosition" << homeCoordinate;

Expand Down Expand Up @@ -884,6 +887,7 @@ void MissionController::save(QJsonObject& json)
json[_jsonCruiseSpeedKey] = _controllerVehicle->defaultCruiseSpeed();
json[_jsonHoverSpeedKey] = _controllerVehicle->defaultHoverSpeed();
json[_jsonGlobalPlanAltitudeModeKey] = _globalAltFrame;
json[QStringLiteral("waypointRadius")] = settingsItem->waypointRadius()->rawValue().toDouble();

// Save the visual items

Expand Down
69 changes: 69 additions & 0 deletions src/MissionManager/MissionSettingsItem.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include "MissionItem.h"
#include "QGCMath.h"
#include "Vehicle.h"
#include "ParameterManager.h"
#include "QGCLoggingCategory.h"

#include <QtCore/QJsonArray>
Expand All @@ -15,6 +16,7 @@ MissionSettingsItem::MissionSettingsItem(PlanMasterController* masterController,
: ComplexMissionItem (masterController, flyView)
, _managerVehicle (masterController->managerVehicle())
, _plannedHomePositionAltitudeFact (0, _plannedHomePositionAltitudeName, FactMetaData::valueTypeDouble)
, _waypointRadiusFact (0, "Waypoint Radius", FactMetaData::valueTypeDouble)
, _cameraSection (masterController)
, _speedSection (masterController)
{
Expand All @@ -29,6 +31,19 @@ MissionSettingsItem::MissionSettingsItem(PlanMasterController* masterController,
_plannedHomePositionAltitudeFact.setRawValue (_plannedHomePositionAltitudeFact.rawDefaultValue());
setHomePositionSpecialCase(true);

FactMetaData* waypointRadiusMetaData = new FactMetaData(FactMetaData::valueTypeDouble, this);
waypointRadiusMetaData->setRawUnits("m");
waypointRadiusMetaData->setRawIncrement(1);
waypointRadiusMetaData->setDecimalPlaces(1);
waypointRadiusMetaData->setRawUserMin(1.0);
waypointRadiusMetaData->setRawUserMax(32767.0);
waypointRadiusMetaData->setRawDefaultValue(50.0);
_waypointRadiusFact.setMetaData(waypointRadiusMetaData);
_waypointRadiusFact.setRawValue(50.0);

connect(masterController, &PlanMasterController::managerVehicleChanged, this, &MissionSettingsItem::_syncWaypointRadiusWithVehicle);
_syncWaypointRadiusWithVehicle();

_cameraSection.setAvailable(true);
_speedSection.setAvailable(true);

Expand Down Expand Up @@ -243,3 +258,57 @@ void MissionSettingsItem::_updateFlyViewHomePosition(const QGeoCoordinate& homeP
setCoordinate(homePosition);
}
}

Fact* MissionSettingsItem::waypointRadius(void)
{
return &_waypointRadiusFact;
}

void MissionSettingsItem::_syncWaypointRadiusWithVehicle(void)
{
Vehicle* vehicle = masterController()->controllerVehicle();
if (!vehicle || !vehicle->parameterManager()) {
return;
}

static Vehicle* lastVehicle = nullptr;
if (lastVehicle != vehicle) {
if (lastVehicle && lastVehicle->parameterManager()) {
disconnect(lastVehicle->parameterManager(), &ParameterManager::parametersReadyChanged, this, &MissionSettingsItem::_syncWaypointRadiusWithVehicle);
disconnect(lastVehicle->parameterManager(), &ParameterManager::factAdded, this, &MissionSettingsItem::_syncWaypointRadiusWithVehicle);
Comment on lines +274 to +278
}
lastVehicle = vehicle;
_vehicleWaypointRadiusConnected = false;
connect(vehicle->parameterManager(), &ParameterManager::parametersReadyChanged, this, &MissionSettingsItem::_syncWaypointRadiusWithVehicle);
connect(vehicle->parameterManager(), &ParameterManager::factAdded, this, &MissionSettingsItem::_syncWaypointRadiusWithVehicle);
}

Fact* paramFact = nullptr;
if (vehicle->parameterManager()->parameterExists(ParameterManager::defaultComponentId, QStringLiteral("WP_RADIUS"))) {
paramFact = vehicle->parameterManager()->getParameter(ParameterManager::defaultComponentId, QStringLiteral("WP_RADIUS"));
} else if (vehicle->parameterManager()->parameterExists(ParameterManager::defaultComponentId, QStringLiteral("WPNAV_RADIUS"))) {
paramFact = vehicle->parameterManager()->getParameter(ParameterManager::defaultComponentId, QStringLiteral("WPNAV_RADIUS"));
} else if (vehicle->parameterManager()->parameterExists(ParameterManager::defaultComponentId, QStringLiteral("NAV_ACC_RAD"))) {
paramFact = vehicle->parameterManager()->getParameter(ParameterManager::defaultComponentId, QStringLiteral("NAV_ACC_RAD"));
}

if (paramFact && !_vehicleWaypointRadiusConnected) {
_vehicleWaypointRadiusConnected = true;
if (_waypointRadiusFact.rawValue().toDouble() != 50.0) {
paramFact->setRawValue(_waypointRadiusFact.rawValue());
} else if (paramFact->rawValue().toDouble() > 0.0) {
_waypointRadiusFact.setRawValue(paramFact->rawValue());
}
Comment on lines +297 to +301

connect(&_waypointRadiusFact, &Fact::valueChanged, this, [paramFact](QVariant value){
if (paramFact->rawValue() != value) {
paramFact->setRawValue(value);
}
});
Comment on lines +303 to +307
connect(paramFact, &Fact::valueChanged, this, [this](QVariant value){
if (_waypointRadiusFact.rawValue() != value) {
_waypointRadiusFact.setRawValue(value);
}
});
}
}
5 changes: 5 additions & 0 deletions src/MissionManager/MissionSettingsItem.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,12 @@ class MissionSettingsItem : public ComplexMissionItem
Q_PROPERTY(Fact* plannedHomePositionAltitude READ plannedHomePositionAltitude CONSTANT)
Q_PROPERTY(QObject* cameraSection READ cameraSection CONSTANT)
Q_PROPERTY(QObject* speedSection READ speedSection CONSTANT)
Q_PROPERTY(Fact* waypointRadius READ waypointRadius CONSTANT)

Fact* plannedHomePositionAltitude (void) { return &_plannedHomePositionAltitudeFact; }
CameraSection* cameraSection (void) { return &_cameraSection; }
SpeedSection* speedSection (void) { return &_speedSection; }
Fact* waypointRadius (void);

/// Scans the loaded items for settings items
bool scanForMissionSettings(QmlObjectListModel* visualItems, int scanIndex);
Expand Down Expand Up @@ -84,11 +86,14 @@ private slots:
void _updateAltitudeInCoordinate (QVariant value);
void _setHomeAltFromTerrain (double terrainAltitude);
void _updateFlyViewHomePosition (const QGeoCoordinate& homePosition);
void _syncWaypointRadiusWithVehicle (void);

private:
Vehicle* _managerVehicle = nullptr;
QGeoCoordinate _plannedHomePositionCoordinate; // Does not include altitude
Fact _plannedHomePositionAltitudeFact;
Fact _waypointRadiusFact;
bool _vehicleWaypointRadiusConnected = false;
int _sequenceNumber = 0;
CameraSection _cameraSection;
SpeedSection _speedSection;
Expand Down
21 changes: 21 additions & 0 deletions src/MissionManager/PlanMasterController.cc
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#include "PlanMasterController.h"
#include "MissionSettingsItem.h"
#include "ParameterManager.h"
#include "AppMessages.h"
#include "QGCCorePlugin.h"
#include "MultiVehicleManager.h"
Expand Down Expand Up @@ -322,6 +324,25 @@ void PlanMasterController::sendToVehicle(void)
qCCritical(PlanMasterControllerLog) << "PlanMasterController::sendToVehicle called while syncInProgress";
} else {
qCDebug(PlanMasterControllerLog) << "PlanMasterController::sendToVehicle start mission sendToVehicle";

if (_missionController.visualItems() && _missionController.visualItems()->count() > 0) {
MissionSettingsItem* settingsItem = qobject_cast<MissionSettingsItem*>(_missionController.visualItems()->get(0));
if (settingsItem && settingsItem->waypointRadius()) {
Fact* paramFact = nullptr;
if (_managerVehicle->parameterManager()->parameterExists(ParameterManager::defaultComponentId, QStringLiteral("WP_RADIUS"))) {
paramFact = _managerVehicle->parameterManager()->getParameter(ParameterManager::defaultComponentId, QStringLiteral("WP_RADIUS"));
} else if (_managerVehicle->parameterManager()->parameterExists(ParameterManager::defaultComponentId, QStringLiteral("WPNAV_RADIUS"))) {
paramFact = _managerVehicle->parameterManager()->getParameter(ParameterManager::defaultComponentId, QStringLiteral("WPNAV_RADIUS"));
} else if (_managerVehicle->parameterManager()->parameterExists(ParameterManager::defaultComponentId, QStringLiteral("NAV_ACC_RAD"))) {
paramFact = _managerVehicle->parameterManager()->getParameter(ParameterManager::defaultComponentId, QStringLiteral("NAV_ACC_RAD"));
}

if (paramFact) {
paramFact->setRawValue(settingsItem->waypointRadius()->rawValue());
}
}
}

_sendGeoFence = true;
_missionController.sendToVehicle();
}
Expand Down
31 changes: 31 additions & 0 deletions src/MissionManager/SimpleMissionItem.cc
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "SimpleMissionItem.h"
#include "MissionSettingsItem.h"
#include "JsonParsing.h"
#include "MissionCommandTree.h"
#include "MissionCommandUIInfo.h"
Expand All @@ -11,6 +12,7 @@
#include "CameraSection.h"
#include "Vehicle.h"
#include "QGCMath.h"
#include "ParameterManager.h"

#include <QtCore/QStringList>
#include <QtCore/QJsonArray>
Expand Down Expand Up @@ -1156,3 +1158,32 @@ void SimpleMissionItem::_possibleRadiusChanged(void)
emit loiterRadiusChanged(loiterRadius());
}
}

bool SimpleMissionItem::showWaypointRadius(void) const
{
Fact* fact = const_cast<SimpleMissionItem*>(this)->waypointRadius();
return command() == MAV_CMD_NAV_WAYPOINT && fact && fact->rawValue().toDouble() > 0.0;
}
Comment on lines +1162 to +1166

Fact* SimpleMissionItem::waypointRadius(void)
{
Fact* fact = nullptr;
if (_masterController && _masterController->missionController() && _masterController->missionController()->visualItems()) {
QmlObjectListModel* visualItems = _masterController->missionController()->visualItems();
if (visualItems->count() > 0) {
MissionSettingsItem* settingsItem = qobject_cast<MissionSettingsItem*>(visualItems->get(0));
if (settingsItem) {
fact = settingsItem->waypointRadius();
}
}
}

if (fact && !_waypointRadiusConnected) {
_waypointRadiusConnected = true;
connect(fact, &Fact::valueChanged, this, [this](QVariant value){
emit waypointRadiusChanged(value.toDouble());
emit showWaypointRadiusChanged();
});
}
return fact;
}
7 changes: 7 additions & 0 deletions src/MissionManager/SimpleMissionItem.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ class SimpleMissionItem : public VisualMissionItem
Q_PROPERTY(Fact* altitude READ altitude CONSTANT) ///< Altitude as specified by altitudeFrame. Not necessarily true mission item altitude
Q_PROPERTY(QGroundControlQmlGlobal::AltitudeFrame altitudeFrame READ altitudeFrame WRITE setAltitudeFrame NOTIFY altitudeFrameChanged)
Q_PROPERTY(Fact* amslAltAboveTerrain READ amslAltAboveTerrain CONSTANT) ///< Actual AMSL altitude for item if altitudeFrame is AltitudeFrameCalcAboveTerrain or AltitudeFrameTerrain
Q_PROPERTY(Fact* waypointRadius READ waypointRadius CONSTANT)
Q_PROPERTY(bool showWaypointRadius READ showWaypointRadius NOTIFY showWaypointRadiusChanged)
Q_PROPERTY(int command READ command WRITE setCommand NOTIFY commandChanged)
Q_PROPERTY(bool isLoiterItem READ isLoiterItem NOTIFY isLoiterItemChanged)
Q_PROPERTY(bool showLoiterRadius READ showLoiterRadius NOTIFY showLoiterRadiusChanged)
Expand Down Expand Up @@ -68,6 +70,8 @@ class SimpleMissionItem : public VisualMissionItem
QGroundControlQmlGlobal::AltitudeFrame altitudeFrame(void) const { return _altitudeFrame; }
Fact* altitude (void) { return &_altitudeFact; }
Fact* amslAltAboveTerrain (void) { return &_amslAltAboveTerrainFact; }
Fact* waypointRadius (void);
bool showWaypointRadius (void) const;
bool isLoiterItem (void) const;
bool showLoiterRadius (void) const;
double loiterRadius (void) const;
Expand Down Expand Up @@ -147,6 +151,8 @@ class SimpleMissionItem : public VisualMissionItem
void isLoiterItemChanged (void);
void showLoiterRadiusChanged (void);
void loiterRadiusChanged (double loiterRadius);
void waypointRadiusChanged (double waypointRadius);
void showWaypointRadiusChanged (void);

private slots:
void _setDirty (void);
Expand Down Expand Up @@ -177,6 +183,7 @@ private slots:
bool _rawEdit = false;
bool _dirty = false;
bool _ignoreDirtyChangeSignals = false;
bool _waypointRadiusConnected = false;
QGeoCoordinate _mapCenterHint;
SpeedSection* _speedSection = nullptr;
CameraSection* _cameraSection = nullptr;
Expand Down
7 changes: 7 additions & 0 deletions src/PlanView/MissionDefaultsEditor.qml
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,13 @@ Rectangle {
fact: QGroundControl.settingsManager.appSettings.defaultMissionItemAltitude
}

FactTextFieldSlider {
Layout.fillWidth: true
label: qsTr("Waypoint Radius")
fact: _root._settingsItem ? _root._settingsItem.waypointRadius : null
visible: fact !== null
}

FactTextFieldSlider {
Layout.fillWidth: true
label: qsTr("Flight Speed")
Expand Down
7 changes: 7 additions & 0 deletions src/PlanView/MissionSettingsEditor.qml
Original file line number Diff line number Diff line change
Expand Up @@ -61,5 +61,12 @@ Rectangle {
visible: _showCameraSection && cameraSection.checked
}
}

FactTextFieldSlider {
Layout.fillWidth: true
label: qsTr("Waypoint Radius")
fact: root.missionItem.waypointRadius
visible: fact !== null
}
}
}
Loading
Loading