地面站终端 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.

518 lines
25 KiB

/****************************************************************************
*
* (c) 2009-2016 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.Controls 2.4
import QtQuick.Layouts 1.11
import QtQuick.Dialogs 1.3
import QGroundControl 1.0
import QGroundControl.Controls 1.0
import QGroundControl.MultiVehicleManager 1.0
import QGroundControl.ScreenTools 1.0
import QGroundControl.Palette 1.0
//-------------------------------------------------------------------------
//-- GPS Indicator
Item {
id: _root
width: pairingRow.width * 1.1
anchors.top: parent.top
anchors.bottom: parent.bottom
property bool _light: qgcPal.globalTheme === QGCPalette.Light && !activeVehicle
property real _contentWidth: ScreenTools.defaultFontPixelWidth * 34
property real _contentSpacing: ScreenTools.defaultFontPixelHeight * 0.5
property real _rectWidth: _contentWidth
property real _rectHeight: _contentWidth * 0.75
property string kPairingManager: qsTr("Pairing Manager")
function runPairing() {
QGroundControl.pairingManager.firstBoot = false
if(QGroundControl.pairingManager.pairedDeviceNameList.length > 0) {
connectionPopup.open()
} else {
mhPopup.open()
}
}
Connections {
target: QGroundControl.pairingManager
//-- Connect automatically once paired
onPairingStatusChanged: {
if(QGroundControl.pairingManager.pairingStatus === PairingManager.PairingSuccess) {
if(QGroundControl.pairingManager.pairedVehicle !== "") {
QGroundControl.pairingManager.connectToPairedDevice(QGroundControl.pairingManager.pairedVehicle)
}
}
}
}
Row {
id: pairingRow
spacing: ScreenTools.defaultFontPixelWidth
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter
QGCColoredImage {
id: pairingIcon
height: parent.height
width: height
color: qgcPal.text
source: "/custom/img/PairingIcon.svg"
sourceSize.width: width
fillMode: Image.PreserveAspectFit
smooth: true
mipmap: true
antialiasing: true
anchors.verticalCenter: parent.verticalCenter
}
QGCLabel {
text: qsTr("Pair Vehicle")
width: !activeVehicle ? (ScreenTools.defaultFontPixelWidth * 12) : 0
visible: !activeVehicle
font.family: ScreenTools.demiboldFontFamily
anchors.verticalCenter: parent.verticalCenter
}
}
MouseArea {
anchors.fill: parent
onClicked: {
runPairing()
}
}
//-------------------------------------------------------------------------
//-- Microhard
Popup {
id: mhPopup
width: mhBody.width
height: mhBody.height
modal: true
focus: true
parent: Overlay.overlay
x: Math.round((mainWindow.width - width) * 0.5)
y: Math.round((mainWindow.height - height) * 0.5)
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
background: Rectangle {
anchors.fill: parent
color: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(1,1,1,0.95) : Qt.rgba(0,0,0,0.75)
radius: ScreenTools.defaultFontPixelWidth * 0.25
}
Item {
id: mhBody
width: mhCol.width + (ScreenTools.defaultFontPixelWidth * 8)
height: mhCol.height + (ScreenTools.defaultFontPixelHeight * 2)
anchors.centerIn: parent
Column {
id: mhCol
spacing: _contentSpacing
anchors.centerIn: parent
Item { width: 1; height: 1; }
QGCLabel {
text: kPairingManager
font.family: ScreenTools.demiboldFontFamily
font.pointSize: ScreenTools.mediumFontPointSize
anchors.horizontalCenter: parent.horizontalCenter
}
Rectangle {
width: _contentWidth
height: 1
color: qgcPal.globalTheme !== QGCPalette.Light ? Qt.rgba(1,1,1,0.25) : Qt.rgba(0,0,0,0.25)
}
Item { width: 1; height: 1; }
QGCLabel {
text: qsTr("To connect to your vehicle, please click on the pairing button in order to put the vehicle in discovery mode")
width: _contentWidth
wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignHCenter
anchors.horizontalCenter: parent.horizontalCenter
}
Item { width: 1; height: ScreenTools.defaultFontPixelHeight * 2; }
QGCColoredImage {
height: ScreenTools.defaultFontPixelHeight * 6
width: height
source: "/custom/img/PairingButton.svg"
sourceSize.height: height
fillMode: Image.PreserveAspectFit
mipmap: true
smooth: true
color: qgcPal.text
anchors.horizontalCenter: parent.horizontalCenter
}
Item { width: 1; height: ScreenTools.defaultFontPixelHeight * 2; }
QGCButton {
text: qsTr("Pair a Vehicle")
width: _contentWidth
anchors.horizontalCenter: parent.horizontalCenter
onClicked: {
mhPopup.close()
progressPopup.open()
QGroundControl.pairingManager.startMicrohardPairing();
}
}
Item { width: 1; height: 1; }
}
}
}
//-------------------------------------------------------------------------
//-- NFC
Popup {
id: nfcPopup
width: nfcBody.width
height: nfcBody.height
modal: true
focus: true
parent: Overlay.overlay
x: Math.round((mainWindow.width - width) * 0.5)
y: Math.round((mainWindow.height - height) * 0.5)
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
background: Rectangle {
anchors.fill: parent
color: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(1,1,1,0.95) : Qt.rgba(0,0,0,0.75)
radius: ScreenTools.defaultFontPixelWidth * 0.25
}
Item {
id: nfcBody
width: nfcCol.width + (ScreenTools.defaultFontPixelWidth * 8)
height: nfcCol.height + (ScreenTools.defaultFontPixelHeight * 2)
anchors.centerIn: parent
Column {
id: nfcCol
spacing: _contentSpacing
anchors.centerIn: parent
Item { width: 1; height: 1; }
QGCLabel {
text: kPairingManager
font.family: ScreenTools.demiboldFontFamily
font.pointSize: ScreenTools.mediumFontPointSize
anchors.horizontalCenter: parent.horizontalCenter
}
Rectangle {
width: _contentWidth
height: 1
color: qgcPal.globalTheme !== QGCPalette.Light ? Qt.rgba(1,1,1,0.25) : Qt.rgba(0,0,0,0.25)
}
Item { width: 1; height: 1; }
Rectangle {
width: _rectWidth
height: _rectHeight
color: Qt.rgba(0,0,0,0)
border.color: qgcPal.text
border.width: 1
anchors.horizontalCenter: parent.horizontalCenter
QGCLabel {
text: "Vehicle and Tablet Graphic"
anchors.centerIn: parent
}
}
Item { width: 1; height: 1; }
QGCLabel {
text: qsTr("Please make sure your vehicle is close to your Ground Station device")
width: _contentWidth
wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignHCenter
anchors.horizontalCenter: parent.horizontalCenter
}
Item { width: 1; height: 1; }
QGCButton {
text: qsTr("Pair Via NFC")
width: _contentWidth
anchors.horizontalCenter: parent.horizontalCenter
onClicked: {
nfcPopup.close()
progressPopup.open()
QGroundControl.pairingManager.startNFCScan();
}
}
Item { width: 1; height: 1; }
}
}
}
//-------------------------------------------------------------------------
//-- Pairing/Connection Progress
Popup {
id: progressPopup
width: progressBody.width
height: progressBody.height
modal: true
focus: true
parent: Overlay.overlay
x: Math.round((mainWindow.width - width) * 0.5)
y: Math.round((mainWindow.height - height) * 0.5)
closePolicy: cancelButton.visible ? Popup.NoAutoClose : (Popup.CloseOnEscape | Popup.CloseOnPressOutside)
background: Rectangle {
anchors.fill: parent
color: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(1,1,1,0.95) : Qt.rgba(0,0,0,0.75)
radius: ScreenTools.defaultFontPixelWidth * 0.25
}
Item {
id: progressBody
width: progressCol.width + (ScreenTools.defaultFontPixelWidth * 8)
height: progressCol.height + (ScreenTools.defaultFontPixelHeight * 2)
anchors.centerIn: parent
Column {
id: progressCol
spacing: _contentSpacing
anchors.centerIn: parent
Item { width: 1; height: 1; }
QGCLabel {
text: kPairingManager
font.family: ScreenTools.demiboldFontFamily
font.pointSize: ScreenTools.mediumFontPointSize
anchors.horizontalCenter: parent.horizontalCenter
}
QGCLabel {
text: QGroundControl.pairingManager ? QGroundControl.pairingManager.pairingStatusStr : ""
visible: !connectedIndicator.visible
anchors.horizontalCenter: parent.horizontalCenter
}
Rectangle {
width: _contentWidth
height: 1
color: qgcPal.globalTheme !== QGCPalette.Light ? Qt.rgba(1,1,1,0.25) : Qt.rgba(0,0,0,0.25)
}
Item { width: 1; height: 1; }
//-- Pairing/Connecting
Item { width: 1; height: ScreenTools.defaultFontPixelHeight * 3; visible: busyIndicator.visible; }
QGCColoredImage {
id: busyIndicator
height: ScreenTools.defaultFontPixelHeight * 4
width: height
source: "/qmlimages/MapSync.svg"
sourceSize.height: height
fillMode: Image.PreserveAspectFit
mipmap: true
smooth: true
color: qgcPal.text
visible: QGroundControl.pairingManager.pairingStatus === PairingManager.PairingActive || QGroundControl.pairingManager.pairingStatus === PairingManager.PairingConnecting
anchors.horizontalCenter: parent.horizontalCenter
RotationAnimation on rotation {
loops: Animation.Infinite
from: 360
to: 0
duration: 720
running: busyIndicator.visible
}
}
Item { width: 1; height: ScreenTools.defaultFontPixelHeight * 3; visible: busyIndicator.visible; }
//-- Error State
Image {
height: ScreenTools.defaultFontPixelHeight * 4
width: height
source: "/custom/img/PairingError.svg"
sourceSize.height: height
fillMode: Image.PreserveAspectFit
mipmap: true
smooth: true
visible: QGroundControl.pairingManager.errorState
anchors.horizontalCenter: parent.horizontalCenter
}
//-- Connection Successful
Image {
id: connectedIndicator
height: width * 0.2
width: _contentWidth
source: "/custom/img/PairingConnected.svg"
sourceSize.height: height
fillMode: Image.PreserveAspectFit
mipmap: true
smooth: true
visible: QGroundControl.pairingManager.pairingStatus === PairingManager.PairingConnected
anchors.horizontalCenter: parent.horizontalCenter
}
Item { width: 1; height: _contentSpacing; visible: connectedIndicator.visible; }
QGCLabel {
text: QGroundControl.pairingManager.pairedVehicle
visible: connectedIndicator.visible
anchors.horizontalCenter: parent.horizontalCenter
}
QGCLabel {
text: qsTr("Connection Successful")
visible: connectedIndicator.visible
anchors.horizontalCenter: parent.horizontalCenter
}
Item { width: 1; height: _contentSpacing; }
//-- Buttons
QGCButton {
width: _contentWidth
visible: QGroundControl.pairingManager ? (QGroundControl.pairingManager.pairingStatus === PairingManager.PairingConnected) : false
text: qsTr("Done")
anchors.horizontalCenter: parent.horizontalCenter
onClicked: {
progressPopup.close()
}
}
QGCButton {
text: qsTr("Pair Another")
width: _contentWidth
visible: QGroundControl.pairingManager ? (QGroundControl.pairingManager.pairingStatus === PairingManager.PairingConnected) : false
anchors.horizontalCenter: parent.horizontalCenter
onClicked: {
progressPopup.close()
mhPopup.open()
}
}
QGCButton {
text: qsTr("Try Again")
width: _contentWidth
visible: QGroundControl.pairingManager ? QGroundControl.pairingManager.errorState : false
anchors.horizontalCenter: parent.horizontalCenter
onClicked: {
progressPopup.close()
runPairing()
}
}
QGCButton {
id: cancelButton
width: _contentWidth
visible: QGroundControl.pairingManager ? (QGroundControl.pairingManager.pairingStatus === PairingManager.PairingActive || QGroundControl.pairingManager.pairingStatus === PairingManager.PairingConnecting || QGroundControl.pairingManager.errorState) : false
text: qsTr("Cancel")
anchors.horizontalCenter: parent.horizontalCenter
onClicked: {
if(QGroundControl.pairingManager.pairingStatus === PairingManager.PairingActive)
QGroundControl.pairingManager.stopPairing()
else {
//-- TODO: Cancel connection to paired device
}
progressPopup.close()
}
}
Item { width: 1; height: 1; }
}
}
}
//-------------------------------------------------------------------------
//-- Connection Manager
Popup {
id: connectionPopup
width: connectionBody.width
height: connectionBody.height
modal: true
focus: true
parent: Overlay.overlay
x: Math.round((mainWindow.width - width) * 0.5)
y: Math.round((mainWindow.height - height) * 0.5)
closePolicy: cancelButton.visible ? Popup.NoAutoClose : (Popup.CloseOnEscape | Popup.CloseOnPressOutside)
background: Rectangle {
anchors.fill: parent
color: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(1,1,1,0.95) : Qt.rgba(0,0,0,0.75)
radius: ScreenTools.defaultFontPixelWidth * 0.25
}
Item {
id: connectionBody
width: connectionCol.width + (ScreenTools.defaultFontPixelWidth * 8)
height: connectionCol.height + (ScreenTools.defaultFontPixelHeight * 2)
anchors.centerIn: parent
Column {
id: connectionCol
spacing: _contentSpacing
anchors.centerIn: parent
Item { width: 1; height: 1; }
QGCLabel {
text: kPairingManager
font.family: ScreenTools.demiboldFontFamily
font.pointSize: ScreenTools.mediumFontPointSize
anchors.horizontalCenter: parent.horizontalCenter
}
Rectangle {
width: _contentWidth
height: 1
color: qgcPal.globalTheme !== QGCPalette.Light ? Qt.rgba(1,1,1,0.25) : Qt.rgba(0,0,0,0.25)
}
Item { width: 1; height: 1; }
QGCLabel {
text: qsTr("List Of Available Devices")
visible: QGroundControl.pairingManager ? (QGroundControl.pairingManager.pairedDeviceNameList.length > 0 && !cancelButton.visible) : false
font.family: ScreenTools.demiboldFontFamily
}
Item { width: 1; height: 1; }
GridLayout {
columns: 3
visible: QGroundControl.pairingManager ? (QGroundControl.pairingManager.pairedDeviceNameList.length > 0 && !cancelButton.visible) : false
columnSpacing: ScreenTools.defaultFontPixelWidth
rowSpacing: ScreenTools.defaultFontPixelHeight * 0.25
anchors.horizontalCenter: parent.horizontalCenter
property var _pairModel: QGroundControl.pairingManager ? QGroundControl.pairingManager.pairedDeviceNameList : []
Repeater {
model: parent._pairModel
delegate: QGCLabel {
text: modelData
Layout.row: index
Layout.column: 0
Layout.minimumWidth:ScreenTools.defaultFontPixelWidth * 14
Layout.fillWidth: true
}
}
Repeater {
model: parent._pairModel
delegate: QGCButton {
text: qsTr("Connect")
Layout.row: index
Layout.column: 1
onClicked: {
QGroundControl.pairingManager.connectToPairedDevice(modelData)
connectionPopup.close()
progressPopup.open()
}
}
}
Repeater {
model: parent._pairModel
delegate: QGCColoredImage {
Layout.preferredWidth: ScreenTools.defaultFontPixelHeight * 1.5
Layout.preferredHeight: ScreenTools.defaultFontPixelHeight * 1.5
sourceSize.height: height
source: "/res/TrashDelete.svg"
color: qgcPal.colorRed
Layout.row: index
Layout.column: 2
MouseArea {
anchors.fill: parent
onClicked: {
removePrompt.open()
}
}
MessageDialog {
id: removePrompt
title: qsTr("Remove Paired Vehicle")
text: qsTr("Confirm removing %1?").arg(modelData)
standardButtons: StandardButton.Yes | StandardButton.No
onNo: removePrompt.close()
onYes: {
QGroundControl.pairingManager.removePairedDevice(modelData)
removePrompt.close()
}
}
}
}
}
Item { width: 1; height: _contentSpacing; }
QGCButton {
width: _contentWidth
text: qsTr("Close")
anchors.horizontalCenter: parent.horizontalCenter
onClicked: {
connectionPopup.close()
}
}
QGCButton {
text: qsTr("Pair Another")
width: _contentWidth
anchors.horizontalCenter: parent.horizontalCenter
onClicked: {
connectionPopup.close()
mhPopup.open()
}
}
Item { width: 1; height: 1; }
}
}
}
}