diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc
index 79aa7115226633485b0b0a933101fa3957e51958..510c5efccc7c40371aa97497265650f6bbc8e135 100644
--- a/qgroundcontrol.qrc
+++ b/qgroundcontrol.qrc
@@ -3,6 +3,7 @@
src/FactSystem/FactSystemTest.qml
+ src/ui/toolbar/ArmedIndicator.qml
src/ui/toolbar/BatteryIndicator.qml
src/ui/toolbar/GPSIndicator.qml
src/ui/toolbar/MessageIndicator.qml
diff --git a/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.h b/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.h
index ea33ee76d8a2e391c0a7ed620c7624ef1988e487..8b771c110dcb7d0191f0fca406e3273179ad1da1 100644
--- a/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.h
+++ b/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.h
@@ -76,6 +76,7 @@ public:
QString landFlightMode(void) const override { return QString("Land"); }
QString takeControlFlightMode(void) const override { return QString("Stablize"); }
bool vehicleYawsToNextWaypointInMission(const Vehicle* vehicle) const final;
+ QString autoDisarmParameter(Vehicle* vehicle) final { Q_UNUSED(vehicle); return QStringLiteral("DISARM_DELAY"); }
private:
static bool _remapParamNameIntialized;
diff --git a/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.h b/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.h
index dfa43408138df5e7c12adbfaeba699f55cdaf4f6..7a012e16bb60a870cb5e43cf724572b75abf1cd4 100644
--- a/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.h
+++ b/src/FirmwarePlugin/APM/ArduPlaneFirmwarePlugin.h
@@ -59,6 +59,7 @@ public:
QString offlineEditingParamFile(Vehicle* vehicle) final { Q_UNUSED(vehicle); return QStringLiteral(":/FirmwarePlugin/APM/Plane.OfflineEditing.params"); }
const FirmwarePlugin::remapParamNameMajorVersionMap_t& paramNameRemapMajorVersionMap(void) const final { return _remapParamName; }
int remapParamNameHigestMinorVersionNumber(int majorVersionNumber) const final;
+ QString autoDisarmParameter(Vehicle* vehicle) final { Q_UNUSED(vehicle); return QStringLiteral("LAND_DISARMDELAY"); }
private:
static bool _remapParamNameIntialized;
diff --git a/src/FirmwarePlugin/FirmwarePlugin.cc b/src/FirmwarePlugin/FirmwarePlugin.cc
index 0bb2acc1dbceaf69629bda0d8fb9b2ad27d75970..c89b9c947f039e002a8582498c518409a1492c57 100644
--- a/src/FirmwarePlugin/FirmwarePlugin.cc
+++ b/src/FirmwarePlugin/FirmwarePlugin.cc
@@ -336,6 +336,7 @@ const QVariantList &FirmwarePlugin::toolBarIndicators(const Vehicle* vehicle)
_toolBarIndicatorList.append(QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/RCRSSIIndicator.qml")));
_toolBarIndicatorList.append(QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/BatteryIndicator.qml")));
_toolBarIndicatorList.append(QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/ModeIndicator.qml")));
+ _toolBarIndicatorList.append(QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/ArmedIndicator.qml")));
}
return _toolBarIndicatorList;
}
@@ -445,3 +446,9 @@ void FirmwarePlugin::batteryConsumptionData(Vehicle* vehicle, int& mAhBattery, d
hoverAmps = 0;
cruiseAmps = 0;
}
+
+QString FirmwarePlugin::autoDisarmParameter(Vehicle* vehicle)
+{
+ Q_UNUSED(vehicle);
+ return QString();
+}
diff --git a/src/FirmwarePlugin/FirmwarePlugin.h b/src/FirmwarePlugin/FirmwarePlugin.h
index 034bcfedb87e1415dda5ea104eacd5bf5b29e6ff..20ede07407c410d19018d5782120ebf7fa378097 100644
--- a/src/FirmwarePlugin/FirmwarePlugin.h
+++ b/src/FirmwarePlugin/FirmwarePlugin.h
@@ -282,6 +282,9 @@ public:
/// @param[out] cruiseAmps Current draw in amps during cruise
virtual void batteryConsumptionData(Vehicle* vehicle, int& mAhBattery, double& hoverAmps, double& cruiseAmps) const;
+ // Returns the parameter which control auto-dismar. Assume == 0 means no auto disarm
+ virtual QString autoDisarmParameter(Vehicle* vehicle);
+
// FIXME: Hack workaround for non pluginize FollowMe support
static const char* px4FollowMeFlightMode;
diff --git a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h
index c75bb8dcf6cb655cd0754af9f1648c6b365c98ae..7778c2551209485222d2b2226d953b0557ad72dc 100644
--- a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h
+++ b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h
@@ -67,6 +67,7 @@ public:
QString brandImageIndoor (const Vehicle* vehicle) const override { Q_UNUSED(vehicle); return QStringLiteral("/qmlimages/PX4/BrandImage"); }
QString brandImageOutdoor (const Vehicle* vehicle) const override { Q_UNUSED(vehicle); return QStringLiteral("/qmlimages/PX4/BrandImage"); }
bool vehicleYawsToNextWaypointInMission(const Vehicle* vehicle) const override;
+ QString autoDisarmParameter (Vehicle* vehicle) override { Q_UNUSED(vehicle); return QStringLiteral("COM_DISARM_LAND"); }
protected:
typedef struct {
diff --git a/src/FlightDisplay/FlightDisplayView.qml b/src/FlightDisplay/FlightDisplayView.qml
index 8e6229fff8c9ec05a1f8ac4bebe1907427443af8..e96436ca872d8ca136a808d7f0ffca0bf6f8eb5d 100644
--- a/src/FlightDisplay/FlightDisplayView.qml
+++ b/src/FlightDisplay/FlightDisplayView.qml
@@ -34,6 +34,8 @@ QGCView {
QGCPalette { id: qgcPal; colorGroupEnabled: enabled }
+ property alias guidedController: guidedActionsController
+
property bool activeVehicleJoystickEnabled: _activeVehicle ? _activeVehicle.joystickEnabled : false
property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle
@@ -444,7 +446,7 @@ QGCView {
}
GuidedActionsController {
- id: guidedController
+ id: guidedActionsController
missionController: flyMissionController
z: _flightVideoPipControl.z + 1
diff --git a/src/FlightDisplay/GuidedActionsController.qml b/src/FlightDisplay/GuidedActionsController.qml
index ce73f713c6456a171891eb785b99442d2563fa07..35d9e03b530d5230566ea19da074aedf72c1c3c9 100644
--- a/src/FlightDisplay/GuidedActionsController.qml
+++ b/src/FlightDisplay/GuidedActionsController.qml
@@ -46,8 +46,8 @@ Item {
readonly property string setWaypointTitle: qsTr("Set Waypoint")
readonly property string gotoTitle: qsTr("Goto Location")
- readonly property string armMessage: qsTr("arm")
- readonly property string disarmMessage: qsTr("disarm")
+ readonly property string armMessage: qsTr("Arm the vehicle.")
+ readonly property string disarmMessage: qsTr("Disarm the vehicle")
readonly property string emergencyStopMessage: qsTr("WARNING: This still stop all motors. If vehicle is currently in air it will crash.")
readonly property string takeoffMessage: qsTr("Takeoff from ground and hold position.")
readonly property string startMissionMessage: qsTr("Start the mission which is currently displayed above. If the vehicle is on the ground it will takeoff.")
@@ -109,10 +109,16 @@ Item {
_actionData = actionData
switch (actionCode) {
case actionArm:
+ if (_activeVehicle.flying) {
+ return
+ }
title = armTitle
message = armMessage
break;
case actionDisarm:
+ if (_activeVehicle.flying) {
+ return
+ }
title = disarmTitle
message = disarmMessage
break;
diff --git a/src/Vehicle/Vehicle.cc b/src/Vehicle/Vehicle.cc
index 2bed10cccd83d96fec41c2514b0cbadd80395ec5..f0daf4379766ef36af3ee4acd436efbcba530f05 100644
--- a/src/Vehicle/Vehicle.cc
+++ b/src/Vehicle/Vehicle.cc
@@ -1647,10 +1647,8 @@ void Vehicle::_startMissionRequest(void)
void Vehicle::_parametersReady(bool parametersReady)
{
if (parametersReady) {
+ _setupAutoDisarmSignalling();
_startMissionRequest();
- }
-
- if (parametersReady) {
setJoystickEnabled(_joystickEnabled);
}
}
@@ -2413,6 +2411,29 @@ bool Vehicle::vehicleYawsToNextWaypointInMission(void) const
return _firmwarePlugin->vehicleYawsToNextWaypointInMission(this);
}
+void Vehicle::_setupAutoDisarmSignalling(void)
+{
+ QString param = _firmwarePlugin->autoDisarmParameter(this);
+
+ if (!param.isEmpty() && _parameterManager->parameterExists(FactSystem::defaultComponentId, param)) {
+ Fact* fact = _parameterManager->getParameter(FactSystem::defaultComponentId,param);
+ connect(fact, &Fact::rawValueChanged, this, &Vehicle::autoDisarmChanged);
+ emit autoDisarmChanged();
+ }
+}
+
+bool Vehicle::autoDisarm(void)
+{
+ QString param = _firmwarePlugin->autoDisarmParameter(this);
+
+ if (!param.isEmpty() && _parameterManager->parameterExists(FactSystem::defaultComponentId, param)) {
+ Fact* fact = _parameterManager->getParameter(FactSystem::defaultComponentId,param);
+ return fact->rawValue().toDouble() > 0;
+ }
+
+ return false;
+}
+
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
diff --git a/src/Vehicle/Vehicle.h b/src/Vehicle/Vehicle.h
index 3021a662c5ffd63768fcde8bcebd8fcbc6ed79de..4b9d4b2fb781503a58c5ecef18887cf53d022481 100644
--- a/src/Vehicle/Vehicle.h
+++ b/src/Vehicle/Vehicle.h
@@ -240,6 +240,7 @@ public:
Q_PROPERTY(QGeoCoordinate coordinate READ coordinate NOTIFY coordinateChanged)
Q_PROPERTY(QGeoCoordinate homePosition READ homePosition NOTIFY homePositionChanged)
Q_PROPERTY(bool armed READ armed WRITE setArmed NOTIFY armedChanged)
+ Q_PROPERTY(bool autoDisarm READ autoDisarm NOTIFY autoDisarmChanged)
Q_PROPERTY(bool flightModeSetAvailable READ flightModeSetAvailable CONSTANT)
Q_PROPERTY(QStringList flightModes READ flightModes CONSTANT)
Q_PROPERTY(QString flightMode READ flightMode WRITE setFlightMode NOTIFY flightModeChanged)
@@ -588,6 +589,7 @@ public:
unsigned int telemetryTXBuffer () { return _telemetryTXBuffer; }
unsigned int telemetryLNoise () { return _telemetryLNoise; }
unsigned int telemetryRNoise () { return _telemetryRNoise; }
+ bool autoDisarm ();
Fact* roll (void) { return &_rollFact; }
Fact* heading (void) { return &_headingFact; }
@@ -717,6 +719,7 @@ signals:
void telemetryTXBufferChanged (unsigned int value);
void telemetryLNoiseChanged (unsigned int value);
void telemetryRNoiseChanged (unsigned int value);
+ void autoDisarmChanged (void);
void firmwareMajorVersionChanged(int major);
void firmwareMinorVersionChanged(int minor);
@@ -825,6 +828,7 @@ private:
void _updatePriorityLink(void);
void _commonInit(void);
void _startMissionRequest(void);
+ void _setupAutoDisarmSignalling(void);
int _id; ///< Mavlink system id
int _defaultComponentId;
diff --git a/src/ui/MainWindowInner.qml b/src/ui/MainWindowInner.qml
index a044a712c8d760c95c8acdbdc099fe88da408fdf..3a7ebe1f6caaa33147c805d64e1418f2b85f66a6 100644
--- a/src/ui/MainWindowInner.qml
+++ b/src/ui/MainWindowInner.qml
@@ -265,12 +265,16 @@ Item {
anchors.top: parent.top
opacity: planToolBar.visible ? 0 : 1
z: QGroundControl.zOrderTopMost
+
Component.onCompleted: ScreenTools.availableHeight = parent.height - toolBar.height
onShowSettingsView: mainWindow.showSettingsView()
onShowSetupView: mainWindow.showSetupView()
onShowPlanView: mainWindow.showPlanView()
onShowFlyView: mainWindow.showFlyView()
onShowAnalyzeView: mainWindow.showAnalyzeView()
+ onArmVehicle: flightView.guidedController.confirmAction(flightView.guidedController.actionArm)
+ onDisarmVehicle: flightView.guidedController.confirmAction(flightView.guidedController.actionDisarm)
+
//-- Entire tool bar area disable on cammand
MouseArea {
id: toolbarBlocker
diff --git a/src/ui/toolbar/ArmedIndicator.qml b/src/ui/toolbar/ArmedIndicator.qml
new file mode 100644
index 0000000000000000000000000000000000000000..9428825e5c9d6256c097f83dae3110b98fcdb88c
--- /dev/null
+++ b/src/ui/toolbar/ArmedIndicator.qml
@@ -0,0 +1,42 @@
+/****************************************************************************
+ *
+ * (c) 2009-2016 QGROUNDCONTROL PROJECT
+ *
+ * QGroundControl is licensed according to the terms in the file
+ * COPYING.md in the root of the source code directory.
+ *
+ ****************************************************************************/
+
+import QtQuick 2.3
+import QtQuick.Controls 1.2
+import QtQuick.Layouts 1.2
+
+import QGroundControl 1.0
+import QGroundControl.Controls 1.0
+import QGroundControl.MultiVehicleManager 1.0
+import QGroundControl.ScreenTools 1.0
+import QGroundControl.Palette 1.0
+
+//-------------------------------------------------------------------------
+//-- Armed Indicator
+QGCLabel {
+ anchors.top: parent.top
+ anchors.bottom: parent.bottom
+ verticalAlignment: Text.AlignVCenter
+ text: _armed ? qsTr("Armed") : qsTr("Disarmed")
+ font.pointSize: ScreenTools.mediumFontPointSize
+ color: qgcPal.buttonText
+ visible: !_autoDisarm || _fixedWing
+
+ property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle
+ property bool _autoDisarm: _activeVehicle ? _activeVehicle.autoDisarm : false
+ property bool _fixedWing: _activeVehicle ? _activeVehicle.fixedWing : false
+ property bool _armed: _activeVehicle ? _activeVehicle.armed : false
+
+ QGCPalette { id: qgcPal }
+
+ QGCMouseArea {
+ fillItem: parent
+ onClicked: _armed ? toolBar.disarmVehicle() : toolBar.armVehicle()
+ }
+}
diff --git a/src/ui/toolbar/MainToolBar.qml b/src/ui/toolbar/MainToolBar.qml
index bd51817ef771c8284ebca28186ab23964ccfda29..03101ddca1859dc5def5bd3319e7d4d785d4b28e 100644
--- a/src/ui/toolbar/MainToolBar.qml
+++ b/src/ui/toolbar/MainToolBar.qml
@@ -31,6 +31,8 @@ Rectangle {
signal showPlanView
signal showFlyView
signal showAnalyzeView
+ signal armVehicle
+ signal disarmVehicle
function checkSettingsButton() {
settingsButton.checked = true