地面站终端 App
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

246 lines
9.4 KiB

/****************************************************************************
*
* (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* 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()
}
}
}
}
}