From 308c8f2a9630c8dd03d3d129b4d28fbefe4b1467 Mon Sep 17 00:00:00 2001 From: DonLakeFlyer Date: Sun, 29 Apr 2018 23:34:41 -0700 Subject: [PATCH 1/4] Fix incorrect signal hookup causing by alt calc --- src/MissionManager/MissionSettingsItem.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MissionManager/MissionSettingsItem.cc b/src/MissionManager/MissionSettingsItem.cc index abe14a4..3ddc6c3 100644 --- a/src/MissionManager/MissionSettingsItem.cc +++ b/src/MissionManager/MissionSettingsItem.cc @@ -57,7 +57,7 @@ MissionSettingsItem::MissionSettingsItem(Vehicle* vehicle, QObject* parent) connect(this, &MissionSettingsItem::terrainAltitudeChanged, this, &MissionSettingsItem::_setHomeAltFromTerrain); - connect(&_plannedHomePositionAltitudeFact, &Fact::valueChanged, this, &MissionSettingsItem::_updateAltitudeInCoordinate); + connect(&_plannedHomePositionAltitudeFact, &Fact::rawValueChanged, this, &MissionSettingsItem::_updateAltitudeInCoordinate); connect(&_cameraSection, &CameraSection::dirtyChanged, this, &MissionSettingsItem::_sectionDirtyChanged); connect(&_speedSection, &SpeedSection::dirtyChanged, this, &MissionSettingsItem::_sectionDirtyChanged); From 8e4fc06e03e7eaa71f53ad0ecf013c1f0d230f3a Mon Sep 17 00:00:00 2001 From: DonLakeFlyer Date: Sun, 29 Apr 2018 23:35:00 -0700 Subject: [PATCH 2/4] Add support for mavlink terrain frame --- src/FirmwarePlugin/APM/APMFirmwarePlugin.h | 1 + src/FirmwarePlugin/FirmwarePlugin.cc | 6 +++ src/FirmwarePlugin/FirmwarePlugin.h | 3 ++ src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h | 1 + src/MissionManager/SimpleMissionItem.cc | 60 +++++++++++++++++++++-------- src/MissionManager/SimpleMissionItem.h | 10 +++-- src/MissionManager/SimpleMissionItemTest.cc | 10 ++--- src/PlanView/SimpleItemEditor.qml | 27 +++++++++---- src/Vehicle/Vehicle.cc | 6 +++ src/Vehicle/Vehicle.h | 12 +++--- 10 files changed, 98 insertions(+), 38 deletions(-) diff --git a/src/FirmwarePlugin/APM/APMFirmwarePlugin.h b/src/FirmwarePlugin/APM/APMFirmwarePlugin.h index 1353e0c..336f3ee 100644 --- a/src/FirmwarePlugin/APM/APMFirmwarePlugin.h +++ b/src/FirmwarePlugin/APM/APMFirmwarePlugin.h @@ -102,6 +102,7 @@ public: QObject* loadParameterMetaData (const QString& metaDataFile) override; QString brandImageIndoor (const Vehicle* vehicle) const override { Q_UNUSED(vehicle); return QStringLiteral("/qmlimages/APM/BrandImage"); } QString brandImageOutdoor (const Vehicle* vehicle) const override { Q_UNUSED(vehicle); return QStringLiteral("/qmlimages/APM/BrandImage"); } + bool supportsTerrainFrame (void) const override { return true; } protected: /// All access to singleton is through stack specific implementation diff --git a/src/FirmwarePlugin/FirmwarePlugin.cc b/src/FirmwarePlugin/FirmwarePlugin.cc index 96efc3a..39b5c76 100644 --- a/src/FirmwarePlugin/FirmwarePlugin.cc +++ b/src/FirmwarePlugin/FirmwarePlugin.cc @@ -150,6 +150,12 @@ bool FirmwarePlugin::supportsJSButton(void) return false; } +bool FirmwarePlugin::supportsTerrainFrame(void) const +{ + // Generic firmware supports this since we don't know + return true; +} + bool FirmwarePlugin::adjustIncomingMavlinkMessage(Vehicle* vehicle, mavlink_message_t* message) { Q_UNUSED(vehicle); diff --git a/src/FirmwarePlugin/FirmwarePlugin.h b/src/FirmwarePlugin/FirmwarePlugin.h index 07971cd..c161e09 100644 --- a/src/FirmwarePlugin/FirmwarePlugin.h +++ b/src/FirmwarePlugin/FirmwarePlugin.h @@ -180,6 +180,9 @@ public: /// (CompassMot). Default is true. virtual bool supportsMotorInterference(void); + /// Returns true if the firmware supports MAV_FRAME_GLOBAL_TERRAIN_ALT + virtual bool supportsTerrainFrame(void) const; + /// Called before any mavlink message is processed by Vehicle such that the firmwre plugin /// can adjust any message characteristics. This is handy to adjust or differences in mavlink /// spec implementations such that the base code can remain mavlink generic. diff --git a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h index 7aefe54..ddc69af 100644 --- a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h +++ b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h @@ -71,6 +71,7 @@ public: QGCCameraManager* createCameraManager (Vehicle* vehicle) override; QGCCameraControl* createCameraControl (const mavlink_camera_information_t* info, Vehicle* vehicle, int compID, QObject* parent = NULL) override; uint32_t highLatencyCustomModeTo32Bits (uint16_t hlCustomMode) override; + bool supportsTerrainFrame (void) const override { return false; } protected: typedef struct { diff --git a/src/MissionManager/SimpleMissionItem.cc b/src/MissionManager/SimpleMissionItem.cc index 76ebceb..ba960dc 100644 --- a/src/MissionManager/SimpleMissionItem.cc +++ b/src/MissionManager/SimpleMissionItem.cc @@ -80,12 +80,6 @@ SimpleMissionItem::SimpleMissionItem(Vehicle* vehicle, QObject* parent) setDefaultsForCommand(); _rebuildFacts(); - - connect(&_missionItem, &MissionItem::specifiedFlightSpeedChanged, this, &SimpleMissionItem::specifiedFlightSpeedChanged); - - connect(this, &SimpleMissionItem::sequenceNumberChanged, this, &SimpleMissionItem::lastSequenceNumberChanged); - connect(this, &SimpleMissionItem::cameraSectionChanged, this, &SimpleMissionItem::_setDirty); - connect(this, &SimpleMissionItem::cameraSectionChanged, this, &SimpleMissionItem::_updateLastSequenceNumber); } SimpleMissionItem::SimpleMissionItem(Vehicle* vehicle, bool editMode, const MissionItem& missionItem, QObject* parent) @@ -98,7 +92,6 @@ SimpleMissionItem::SimpleMissionItem(Vehicle* vehicle, bool editMode, const Miss , _cameraSection (NULL) , _commandTree (qgcApp()->toolbox()->missionCommandTree()) , _supportedCommandFact (0, "Command:", FactMetaData::valueTypeUint32) - , _altitudeMode (missionItem.relativeAltitude() ? AltitudeRelative : AltitudeAMSL) , _altitudeFact (0, "Altitude", FactMetaData::valueTypeDouble) , _amslAltAboveTerrainFact (0, "Alt above terrain", FactMetaData::valueTypeDouble) , _param1MetaData (FactMetaData::valueTypeDouble) @@ -112,6 +105,25 @@ SimpleMissionItem::SimpleMissionItem(Vehicle* vehicle, bool editMode, const Miss { _editorQml = QStringLiteral("qrc:/qml/SimpleItemEditor.qml"); + struct MavFrame2AltMode_s { + MAV_FRAME mavFrame; + AltitudeMode altMode; + }; + + const struct MavFrame2AltMode_s rgMavFrame2AltMode[] = { + { MAV_FRAME_GLOBAL_TERRAIN_ALT, AltitudeTerrainFrame }, + { MAV_FRAME_GLOBAL, AltitudeAbsolute }, + { MAV_FRAME_GLOBAL_RELATIVE_ALT, AltitudeRelative }, + }; + _altitudeMode = AltitudeRelative; + for (size_t i=0; isupportsTerrainFrame(); } CameraSection* cameraSection (void) { return _cameraSection; } SpeedSection* speedSection (void) { return _speedSection; } @@ -141,6 +144,7 @@ signals: void cameraSectionChanged (QObject* cameraSection); void speedSectionChanged (QObject* cameraSection); void altitudeModeChanged (void); + void supportsTerrainFrameChanged(void); private slots: void _setDirty (void); diff --git a/src/MissionManager/SimpleMissionItemTest.cc b/src/MissionManager/SimpleMissionItemTest.cc index 1e8cc54..7a91914 100644 --- a/src/MissionManager/SimpleMissionItemTest.cc +++ b/src/MissionManager/SimpleMissionItemTest.cc @@ -53,11 +53,11 @@ const SimpleMissionItemTest::FactValue_t SimpleMissionItemTest::_rgFactValuesDoJ const SimpleMissionItemTest::ItemExpected_t SimpleMissionItemTest::_rgItemExpected[] = { // Text field facts count Fact Values Altitude Altitude Mode { sizeof(SimpleMissionItemTest::_rgFactValuesWaypoint)/sizeof(SimpleMissionItemTest::_rgFactValuesWaypoint[0]), SimpleMissionItemTest::_rgFactValuesWaypoint, 70.1234567, SimpleMissionItem::AltitudeRelative }, - { sizeof(SimpleMissionItemTest::_rgFactValuesLoiterUnlim)/sizeof(SimpleMissionItemTest::_rgFactValuesLoiterUnlim[0]), SimpleMissionItemTest::_rgFactValuesLoiterUnlim, 70.1234567, SimpleMissionItem::AltitudeAMSL }, + { sizeof(SimpleMissionItemTest::_rgFactValuesLoiterUnlim)/sizeof(SimpleMissionItemTest::_rgFactValuesLoiterUnlim[0]), SimpleMissionItemTest::_rgFactValuesLoiterUnlim, 70.1234567, SimpleMissionItem::AltitudeAbsolute }, { sizeof(SimpleMissionItemTest::_rgFactValuesLoiterTurns)/sizeof(SimpleMissionItemTest::_rgFactValuesLoiterTurns[0]), SimpleMissionItemTest::_rgFactValuesLoiterTurns, 70.1234567, SimpleMissionItem::AltitudeRelative }, - { sizeof(SimpleMissionItemTest::_rgFactValuesLoiterTime)/sizeof(SimpleMissionItemTest::_rgFactValuesLoiterTime[0]), SimpleMissionItemTest::_rgFactValuesLoiterTime, 70.1234567, SimpleMissionItem::AltitudeAMSL }, + { sizeof(SimpleMissionItemTest::_rgFactValuesLoiterTime)/sizeof(SimpleMissionItemTest::_rgFactValuesLoiterTime[0]), SimpleMissionItemTest::_rgFactValuesLoiterTime, 70.1234567, SimpleMissionItem::AltitudeAbsolute }, { 0, NULL, 70.1234567, SimpleMissionItem::AltitudeRelative }, - { sizeof(SimpleMissionItemTest::_rgFactValuesTakeoff)/sizeof(SimpleMissionItemTest::_rgFactValuesTakeoff[0]), SimpleMissionItemTest::_rgFactValuesTakeoff, 70.1234567, SimpleMissionItem::AltitudeAMSL }, + { sizeof(SimpleMissionItemTest::_rgFactValuesTakeoff)/sizeof(SimpleMissionItemTest::_rgFactValuesTakeoff[0]), SimpleMissionItemTest::_rgFactValuesTakeoff, 70.1234567, SimpleMissionItem::AltitudeAbsolute }, { sizeof(SimpleMissionItemTest::_rgFactValuesDoJump)/sizeof(SimpleMissionItemTest::_rgFactValuesDoJump[0]), SimpleMissionItemTest::_rgFactValuesDoJump, qQNaN(), SimpleMissionItem::AltitudeRelative }, }; @@ -222,7 +222,7 @@ void SimpleMissionItemTest::_testSignals(void) QVERIFY(_spyVisualItem->checkOnlySignalByMask(dirtyChangedMask)); _spyVisualItem->clearAllSignals(); - _simpleItem->setAltitudeMode(_simpleItem->altitudeMode() == SimpleMissionItem::AltitudeRelative ? SimpleMissionItem::AltitudeAMSL : SimpleMissionItem::AltitudeRelative); + _simpleItem->setAltitudeMode(_simpleItem->altitudeMode() == SimpleMissionItem::AltitudeRelative ? SimpleMissionItem::AltitudeAbsolute : SimpleMissionItem::AltitudeRelative); QVERIFY(_spySimpleItem->checkOnlySignalByMask(dirtyChangedMask | friendlyEditAllowedChangedMask | altitudeModeChangedMask | coordinateHasRelativeAltitudeChangedMask)); _spySimpleItem->clearAllSignals(); _spyVisualItem->clearAllSignals(); @@ -314,7 +314,7 @@ void SimpleMissionItemTest::_testAltitudePropogation(void) QCOMPARE(_simpleItem->altitude()->rawValue().toDouble(), _simpleItem->missionItem().param7()); QCOMPARE(_simpleItem->missionItem().frame(), MAV_FRAME_GLOBAL_RELATIVE_ALT); - _simpleItem->setAltitudeMode(SimpleMissionItem::AltitudeAMSL); + _simpleItem->setAltitudeMode(SimpleMissionItem::AltitudeAbsolute); _simpleItem->altitude()->setRawValue(_simpleItem->altitude()->rawValue().toDouble() + 1); QCOMPARE(_simpleItem->altitude()->rawValue().toDouble(), _simpleItem->missionItem().param7()); QCOMPARE(_simpleItem->missionItem().frame(), MAV_FRAME_GLOBAL); diff --git a/src/PlanView/SimpleItemEditor.qml b/src/PlanView/SimpleItemEditor.qml index d9bbe4f..b4675d5 100644 --- a/src/PlanView/SimpleItemEditor.qml +++ b/src/PlanView/SimpleItemEditor.qml @@ -17,9 +17,14 @@ Rectangle { color: qgcPal.windowShadeDark radius: _radius - property bool _specifiesAltitude: missionItem.specifiesAltitude - property bool _altModeIsTerrain: missionItem.altitudeMode === 2 - property real _margin: ScreenTools.defaultFontPixelHeight / 2 + property bool _specifiesAltitude: missionItem.specifiesAltitude + property real _margin: ScreenTools.defaultFontPixelHeight / 2 + property bool _supportsTerrainFrame: missionItem + + readonly property int _altModeRelative: 0 + readonly property int _altModeAbsolute: 1 + readonly property int _altModeAboveTerrain: 2 + readonly property int _altModeTerrainFrame: 3 ExclusiveGroup { id: altRadios @@ -93,9 +98,10 @@ Rectangle { } RowLayout { - QGCRadioButton { text: qsTr("Rel"); exclusiveGroup: altRadios; checked: missionItem.altitudeMode === value; readonly property int value: 0 } - QGCRadioButton { text: qsTr("Abs"); exclusiveGroup: altRadios; checked: missionItem.altitudeMode === value; readonly property int value: 1 } - QGCRadioButton { text: qsTr("AGL"); exclusiveGroup: altRadios; checked: missionItem.altitudeMode === value; readonly property int value: 2 } + QGCRadioButton { text: qsTr("Rel"); exclusiveGroup: altRadios; checked: missionItem.altitudeMode === value; readonly property int value: _altModeRelative } + QGCRadioButton { text: qsTr("Abs"); exclusiveGroup: altRadios; checked: missionItem.altitudeMode === value; readonly property int value: _altModeAbsolute } + QGCRadioButton { text: qsTr("AGL"); exclusiveGroup: altRadios; checked: missionItem.altitudeMode === value; readonly property int value: _altModeAboveTerrain } + QGCRadioButton { text: qsTr("TerrF"); exclusiveGroup: altRadios; checked: missionItem.altitudeMode === value; visible: missionItem.supportsTerrainFrame; readonly property int value: _altModeTerrainFrame } } FactValueSlider { @@ -107,17 +113,22 @@ Rectangle { RowLayout { spacing: _margin + visible: missionItem.altitudeMode === _altModeAboveTerrain QGCLabel { text: qsTr("Calculated Abs Alt") font.pointSize: ScreenTools.smallFontPointSize - visible: _altModeIsTerrain } QGCLabel { text: missionItem.amslAltAboveTerrain.valueString + " " + missionItem.amslAltAboveTerrain.units - visible: _altModeIsTerrain } } + + QGCLabel { + text: qsTr("Using terrain reference frame") + font.pointSize: ScreenTools.smallFontPointSize + visible: missionItem.altitudeMode === _altModeTerrainFrame + } } } diff --git a/src/Vehicle/Vehicle.cc b/src/Vehicle/Vehicle.cc index 6f0596e..a6adf28 100644 --- a/src/Vehicle/Vehicle.cc +++ b/src/Vehicle/Vehicle.cc @@ -494,6 +494,7 @@ void Vehicle::prepareDelete() void Vehicle::_offlineFirmwareTypeSettingChanged(QVariant value) { _firmwareType = static_cast(value.toInt()); + _firmwarePlugin = _firmwarePluginManager->firmwarePluginForAutopilot(_firmwareType, _vehicleType); emit firmwareTypeChanged(); if (_firmwareType == MAV_AUTOPILOT_ARDUPILOTMEGA) { _capabilityBits = 0; @@ -2452,6 +2453,11 @@ bool Vehicle::supportsMotorInterference(void) const return _firmwarePlugin->supportsMotorInterference(); } +bool Vehicle::supportsTerrainFrame(void) const +{ + return _firmwarePlugin->supportsTerrainFrame(); +} + QString Vehicle::vehicleTypeName() const { static QMap typeNames = { { MAV_TYPE_GENERIC, tr("Generic micro air vehicle" )}, diff --git a/src/Vehicle/Vehicle.h b/src/Vehicle/Vehicle.h index 1b6bbd3..f410e13 100644 --- a/src/Vehicle/Vehicle.h +++ b/src/Vehicle/Vehicle.h @@ -457,6 +457,7 @@ public: Q_PROPERTY(QString hobbsMeter READ hobbsMeter NOTIFY hobbsMeterChanged) Q_PROPERTY(bool vtolInFwdFlight READ vtolInFwdFlight WRITE setVtolInFwdFlight NOTIFY vtolInFwdFlightChanged) Q_PROPERTY(bool highLatencyLink READ highLatencyLink NOTIFY highLatencyLinkChanged) + Q_PROPERTY(bool supportsTerrainFrame READ supportsTerrainFrame NOTIFY firmwareTypeChanged) // Vehicle state used for guided control Q_PROPERTY(bool flying READ flying NOTIFY flyingChanged) ///< Vehicle is flying @@ -665,11 +666,12 @@ public: bool rover(void) const; bool sub(void) const; - bool supportsThrottleModeCenterZero(void) const; - bool supportsNegativeThrust(void) const; - bool supportsRadio(void) const; - bool supportsJSButton(void) const; - bool supportsMotorInterference(void) const; + bool supportsThrottleModeCenterZero (void) const; + bool supportsNegativeThrust (void) const; + bool supportsRadio (void) const; + bool supportsJSButton (void) const; + bool supportsMotorInterference (void) const; + bool supportsTerrainFrame (void) const; void setGuidedMode(bool guidedMode); From 2acf7606de1fba8b9f53c610fa622148dfe36bef Mon Sep 17 00:00:00 2001 From: DonLakeFlyer Date: Mon, 30 Apr 2018 10:37:35 -0700 Subject: [PATCH 3/4] Make sure item starts out clean --- src/MissionManager/SimpleMissionItem.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/MissionManager/SimpleMissionItem.cc b/src/MissionManager/SimpleMissionItem.cc index ba960dc..71a1fad 100644 --- a/src/MissionManager/SimpleMissionItem.cc +++ b/src/MissionManager/SimpleMissionItem.cc @@ -80,6 +80,8 @@ SimpleMissionItem::SimpleMissionItem(Vehicle* vehicle, QObject* parent) setDefaultsForCommand(); _rebuildFacts(); + + setDirty(false); } SimpleMissionItem::SimpleMissionItem(Vehicle* vehicle, bool editMode, const MissionItem& missionItem, QObject* parent) @@ -140,6 +142,8 @@ SimpleMissionItem::SimpleMissionItem(Vehicle* vehicle, bool editMode, const Miss // Signal coordinate changed to kick off terrain query emit coordinateChanged(coordinate()); + + setDirty(false); } SimpleMissionItem::SimpleMissionItem(const SimpleMissionItem& other, QObject* parent) @@ -169,8 +173,8 @@ SimpleMissionItem::SimpleMissionItem(const SimpleMissionItem& other, QObject* pa _setupMetaData(); _connectSignals(); _updateOptionalSections(); - _rebuildFacts(); + setDirty(false); } void SimpleMissionItem::_connectSignals(void) From 5caf5df7d6454ec9ced03156d1f781f3e626676c Mon Sep 17 00:00:00 2001 From: DonLakeFlyer Date: Mon, 30 Apr 2018 10:37:47 -0700 Subject: [PATCH 4/4] Fix altitude visibility --- src/PlanView/SimpleItemEditor.qml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/PlanView/SimpleItemEditor.qml b/src/PlanView/SimpleItemEditor.qml index b4675d5..93b5b64 100644 --- a/src/PlanView/SimpleItemEditor.qml +++ b/src/PlanView/SimpleItemEditor.qml @@ -79,10 +79,11 @@ Rectangle { } Rectangle { - anchors.left: parent.left - anchors.right: parent.right - height: altColumn.y + altColumn.height + _margin - color: qgcPal.windowShade + anchors.left: parent.left + anchors.right: parent.right + height: altColumn.y + altColumn.height + _margin + color: qgcPal.windowShade + visible: _specifiesAltitude Column { id: altColumn @@ -108,7 +109,6 @@ Rectangle { fact: missionItem.altitude digitCount: 3 incrementSlots: 1 - visible: _specifiesAltitude } RowLayout {