/**************************************************************************** * * (c) 2009-2020 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.11 import QtQuick.Layouts 1.11 import QGroundControl 1.0 import QGroundControl.Controls 1.0 import QGroundControl.MultiVehicleManager 1.0 import QGroundControl.ScreenTools 1.0 import QGroundControl.Palette 1.0 RowLayout { id: _root spacing: 0 property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle property var _vehicleInAir: _activeVehicle ? _activeVehicle.flying || _activeVehicle.landing : false property bool _vtolInFWDFlight: _activeVehicle ? _activeVehicle.vtolInFwdFlight : false property bool _armed: _activeVehicle ? _activeVehicle.armed : false property real _margins: ScreenTools.defaultFontPixelWidth property real _spacing: ScreenTools.defaultFontPixelWidth / 2 QGCLabel { id: mainStatusLabel text: mainStatusText() font.pointSize: _vehicleInAir ? ScreenTools.defaultFontPointSize : ScreenTools.largeFontPointSize property string _commLostText: qsTr("Communication Lost") property string _readyToFlyText: qsTr("Ready To Fly") property string _notReadyToFlyText: qsTr("Not Ready") property string _disconnectedText: qsTr("Disconnected") property string _armedText: qsTr("Armed") property string _flyingText: qsTr("Flying") property string _landingText: qsTr("Landing") function mainStatusText() { var statusText if (_activeVehicle) { if (_communicationLost) { _mainStatusBGColor = "red" return mainStatusLabel._commLostText } if (_activeVehicle.armed) { _mainStatusBGColor = "green" if (_activeVehicle.flying) { return mainStatusLabel._flyingText } else if (_activeVehicle.landing) { return mainStatusLabel._landingText } else { return mainStatusLabel._armedText } } else { if (_activeVehicle.readyToFlyAvailable) { if (_activeVehicle.readyToFly) { _mainStatusBGColor = "green" return mainStatusLabel._readyToFlyText } else { _mainStatusBGColor = "yellow" return mainStatusLabel._notReadyToFlyText } } else { // Best we can do is determine readiness based on AutoPilot component setup and health indicators from SYS_STATUS if (_activeVehicle.allSensorsHealthy && _activeVehicle.autopilot.setupComplete) { _mainStatusBGColor = "green" return mainStatusLabel._readyToFlyText } else { _mainStatusBGColor = "yellow" return mainStatusLabel._notReadyToFlyText } } } } else { _mainStatusBGColor = qgcPal.brandingPurple return mainStatusLabel._disconnectedText } } MouseArea { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter height: _root.height enabled: _activeVehicle onClicked: mainWindow.showIndicatorPopup(mainStatusLabel, sensorStatusInfoComponent) } } Item { width: ScreenTools.defaultFontPixelWidth height: 1 } QGCColoredImage { id: flightModeIcon width: height height: ScreenTools.defaultFontPixelHeight * 0.75 fillMode: Image.PreserveAspectFit mipmap: true color: qgcPal.text source: "/qmlimages/FlightModesComponentIcon.png" visible: _activeVehicle } Item { Layout.preferredWidth: ScreenTools.defaultFontPixelWidth * (_vehicleInAir ? ScreenTools.largeFontPointRatio : 1) / 3 height: 1 visible: flightModeMenu.visible } FlightModeMenu { id: flightModeMenu Layout.preferredHeight: _root.height verticalAlignment: Text.AlignVCenter font.pointSize: _vehicleInAir ? ScreenTools.largeFontPointSize : ScreenTools.defaultFontPointSize mouseAreaLeftMargin: -(flightModeMenu.x - flightModeIcon.x) visible: _activeVehicle } Item { Layout.preferredWidth: ScreenTools.defaultFontPixelWidth * ScreenTools.largeFontPointRatio height: 1 visible: vtolModeLabel.visible } QGCLabel { id: vtolModeLabel Layout.preferredHeight: _root.height verticalAlignment: Text.AlignVCenter text: _vtolInFWDFlight ? qsTr("FW(vtol)") : qsTr("MR(vtol)") font.pointSize: ScreenTools.largeFontPointSize visible: _activeVehicle ? _activeVehicle.vtol && _vehicleInAir : false QGCMouseArea { anchors.fill: parent onClicked: mainWindow.showIndicatorPopup(vtolModeLabel, vtolTransitionComponent) } } Component { id: sensorStatusInfoComponent Rectangle { width: mainLayout.width + (_margins * 2) height: mainLayout.height + (_margins * 2) radius: ScreenTools.defaultFontPixelHeight * 0.5 color: qgcPal.window border.color: qgcPal.text ColumnLayout { id: mainLayout anchors.margins: _margins anchors.top: parent.top anchors.left: parent.left spacing: _spacing QGCLabel { Layout.alignment: Qt.AlignHCenter text: qsTr("Sensor Status") } GridLayout { rowSpacing: _spacing columnSpacing: _spacing rows: _activeVehicle.sysStatusSensorInfo.sensorNames.length flow: GridLayout.TopToBottom Repeater { model: _activeVehicle.sysStatusSensorInfo.sensorNames QGCLabel { text: modelData } } Repeater { model: _activeVehicle.sysStatusSensorInfo.sensorStatus QGCLabel { text: modelData } } } QGCButton { Layout.alignment: Qt.AlignHCenter text: _armed ? qsTr("Disarm") : (forceArm ? qsTr("Force Arm") : qsTr("Arm")) property bool forceArm: false onPressAndHold: forceArm = true onClicked: { if (_armed) { mainWindow.disarmVehicleRequest() } else { if (forceArm) { mainWindow.forceArmVehicleRequest() } else { mainWindow.armVehicleRequest() } } forceArm = false mainWindow.hideIndicatorPopup() } } } } } Component { id: vtolTransitionComponent Rectangle { width: mainLayout.width + (_margins * 2) height: mainLayout.height + (_margins * 2) radius: ScreenTools.defaultFontPixelHeight * 0.5 color: qgcPal.window border.color: qgcPal.text QGCButton { id: mainLayout anchors.margins: _margins anchors.top: parent.top anchors.left: parent.left text: _vtolInFWDFlight ? qsTr("Transition to Multi-Rotor") : qsTr("Transition to Fixed Wing") onClicked: { if (_vtolInFWDFlight) { mainWindow.vtolTransitionToMRFlightRequest() } else { mainWindow.vtolTransitionToFwdFlightRequest() } mainWindow.hideIndicatorPopup() } } } } }