/**************************************************************************** * * (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.Controls.Styles 1.4 import QtQuick.Dialogs 1.2 import QGroundControl 1.0 import QGroundControl.FactSystem 1.0 import QGroundControl.FactControls 1.0 import QGroundControl.Controls 1.0 import QGroundControl.ScreenTools 1.0 import QGroundControl.MultiVehicleManager 1.0 import QGroundControl.Palette 1.0 Rectangle { id: __mavlinkRoot color: qgcPal.window anchors.fill: parent property real _labelWidth: ScreenTools.defaultFontPixelWidth * 28 property real _valueWidth: ScreenTools.defaultFontPixelWidth * 24 property int _selectedCount: 0 property real _columnSpacing: ScreenTools.defaultFontPixelHeight * 0.25 property bool _uploadedSelected: false property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle property var _showMavlinkLog: QGroundControl.corePlugin.options.showMavlinkLogOptions QGCPalette { id: qgcPal } Connections { target: QGroundControl.mavlinkLogManager onSelectedCountChanged: { _uploadedSelected = false var selected = 0 for(var i = 0; i < QGroundControl.mavlinkLogManager.logFiles.count; i++) { var logFile = QGroundControl.mavlinkLogManager.logFiles.get(i) if(logFile.selected) { selected++ //-- If an uploaded file is selected, disable "Upload" button if(logFile.uploaded) { _uploadedSelected = true } } } _selectedCount = selected } } function saveItems() { QGroundControl.mavlinkSystemID = parseInt(sysidField.text) QGroundControl.mavlinkLogManager.videoURL = videoUrlField.text QGroundControl.mavlinkLogManager.feedback = feedbackTextArea.text QGroundControl.mavlinkLogManager.emailAddress = emailField.text QGroundControl.mavlinkLogManager.description = descField.text QGroundControl.mavlinkLogManager.uploadURL = urlField.text QGroundControl.mavlinkLogManager.emailAddress = emailField.text if(autoUploadCheck.checked && QGroundControl.mavlinkLogManager.emailAddress === "") { autoUploadCheck.checked = false } else { QGroundControl.mavlinkLogManager.enableAutoUpload = autoUploadCheck.checked } } MessageDialog { id: emptyEmailDialog visible: false icon: StandardIcon.Warning standardButtons: StandardButton.Close title: qsTr("MAVLink Logging") text: qsTr("Please enter an email address before uploading MAVLink log files.") } QGCFlickable { clip: true anchors.fill: parent anchors.margins: ScreenTools.defaultFontPixelWidth contentHeight: settingsColumn.height contentWidth: settingsColumn.width flickableDirection: Flickable.VerticalFlick Column { id: settingsColumn width: __mavlinkRoot.width spacing: ScreenTools.defaultFontPixelHeight * 0.5 anchors.margins: ScreenTools.defaultFontPixelWidth //----------------------------------------------------------------- //-- Ground Station Item { width: __mavlinkRoot.width * 0.8 height: gcsLabel.height anchors.margins: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter QGCLabel { id: gcsLabel text: qsTr("Ground Station") font.family: ScreenTools.demiboldFontFamily } } Rectangle { height: gcsColumn.height + (ScreenTools.defaultFontPixelHeight * 2) width: __mavlinkRoot.width * 0.8 color: qgcPal.windowShade anchors.margins: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter Column { id: gcsColumn spacing: _columnSpacing anchors.centerIn: parent Row { spacing: ScreenTools.defaultFontPixelWidth QGCLabel { width: _labelWidth anchors.baseline: sysidField.baseline text: qsTr("MAVLink System ID:") } QGCTextField { id: sysidField text: QGroundControl.mavlinkSystemID.toString() width: _valueWidth inputMethodHints: Qt.ImhFormattedNumbersOnly anchors.verticalCenter: parent.verticalCenter onEditingFinished: { saveItems(); } } } QGCCheckBox { text: qsTr("Emit heartbeat") checked: QGroundControl.multiVehicleManager.gcsHeartBeatEnabled onClicked: { QGroundControl.multiVehicleManager.gcsHeartBeatEnabled = checked } } FactCheckBox { text: fact.shortDescription fact: QGroundControl.settingsManager.appSettings.apmStartMavlinkStreams } QGCCheckBox { text: qsTr("Only accept MAVs with same protocol version") checked: QGroundControl.isVersionCheckEnabled onClicked: { QGroundControl.isVersionCheckEnabled = checked } } } } //----------------------------------------------------------------- //-- Mavlink Status Item { width: __mavlinkRoot.width * 0.8 height: mavStatusLabel.height anchors.margins: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter QGCLabel { id: mavStatusLabel text: qsTr("MAVLink Link Status (Current Vehicle)") font.family: ScreenTools.demiboldFontFamily } } Rectangle { height: mavStatusColumn.height + (ScreenTools.defaultFontPixelHeight * 2) width: __mavlinkRoot.width * 0.8 color: qgcPal.windowShade anchors.margins: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter Column { id: mavStatusColumn width: gcsColumn.width spacing: _columnSpacing anchors.centerIn: parent //----------------------------------------------------------------- Row { spacing: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter QGCLabel { width: _labelWidth text: qsTr("Total messages sent (computed):") anchors.verticalCenter: parent.verticalCenter } QGCLabel { width: _valueWidth text: _activeVehicle ? _activeVehicle.mavlinkSentCount : qsTr("Not Connected") anchors.verticalCenter: parent.verticalCenter } } //----------------------------------------------------------------- Row { spacing: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter QGCLabel { width: _labelWidth text: qsTr("Total messages received:") anchors.verticalCenter: parent.verticalCenter } QGCLabel { width: _valueWidth text: _activeVehicle ? _activeVehicle.mavlinkReceivedCount : qsTr("Not Connected") anchors.verticalCenter: parent.verticalCenter } } //----------------------------------------------------------------- Row { spacing: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter QGCLabel { width: _labelWidth text: qsTr("Total message loss:") anchors.verticalCenter: parent.verticalCenter } QGCLabel { width: _valueWidth text: _activeVehicle ? _activeVehicle.mavlinkLossCount : qsTr("Not Connected") anchors.verticalCenter: parent.verticalCenter } } //----------------------------------------------------------------- Row { spacing: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter QGCLabel { width: _labelWidth text: qsTr("Loss rate:") anchors.verticalCenter: parent.verticalCenter } QGCLabel { width: _valueWidth text: _activeVehicle ? _activeVehicle.mavlinkLossPercent.toFixed(0) + '%' : qsTr("Not Connected") anchors.verticalCenter: parent.verticalCenter } } } } //----------------------------------------------------------------- //-- Mavlink Logging Item { width: __mavlinkRoot.width * 0.8 height: mavlogLabel.height anchors.margins: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter visible: _showMavlinkLog QGCLabel { id: mavlogLabel text: qsTr("MAVLink 2.0 Logging (PX4 Firmware Only)") font.family: ScreenTools.demiboldFontFamily } } Rectangle { height: mavlogColumn.height + (ScreenTools.defaultFontPixelHeight * 2) width: __mavlinkRoot.width * 0.8 color: qgcPal.windowShade anchors.margins: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter visible: _showMavlinkLog Column { id: mavlogColumn width: gcsColumn.width spacing: _columnSpacing anchors.centerIn: parent //----------------------------------------------------------------- //-- Manual Start/Stop Row { spacing: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter QGCLabel { width: _labelWidth text: qsTr("Manual Start/Stop:") anchors.verticalCenter: parent.verticalCenter } QGCButton { text: qsTr("Start Logging") width: (_valueWidth * 0.5) - (ScreenTools.defaultFontPixelWidth * 0.5) enabled: !QGroundControl.mavlinkLogManager.logRunning && QGroundControl.mavlinkLogManager.canStartLog onClicked: QGroundControl.mavlinkLogManager.startLogging() anchors.verticalCenter: parent.verticalCenter } QGCButton { text: qsTr("Stop Logging") width: (_valueWidth * 0.5) - (ScreenTools.defaultFontPixelWidth * 0.5) enabled: QGroundControl.mavlinkLogManager.logRunning onClicked: QGroundControl.mavlinkLogManager.stopLogging() anchors.verticalCenter: parent.verticalCenter } } //----------------------------------------------------------------- //-- Enable auto log on arming QGCCheckBox { text: qsTr("Enable automatic logging") checked: QGroundControl.mavlinkLogManager.enableAutoStart onClicked: { QGroundControl.mavlinkLogManager.enableAutoStart = checked } } } } //----------------------------------------------------------------- //-- Mavlink Logging Item { width: __mavlinkRoot.width * 0.8 height: logLabel.height anchors.margins: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter visible: _showMavlinkLog QGCLabel { id: logLabel text: qsTr("MAVLink 2.0 Log Uploads (PX4 Firmware Only)") font.family: ScreenTools.demiboldFontFamily } } Rectangle { height: logColumn.height + (ScreenTools.defaultFontPixelHeight * 2) width: __mavlinkRoot.width * 0.8 color: qgcPal.windowShade anchors.margins: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter visible: _showMavlinkLog Column { id: logColumn spacing: _columnSpacing anchors.centerIn: parent //----------------------------------------------------------------- //-- Email address Field Row { spacing: ScreenTools.defaultFontPixelWidth QGCLabel { width: _labelWidth anchors.baseline: emailField.baseline text: qsTr("Email address for Log Upload:") } QGCTextField { id: emailField text: QGroundControl.mavlinkLogManager.emailAddress width: _valueWidth inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhEmailCharactersOnly anchors.verticalCenter: parent.verticalCenter onEditingFinished: { saveItems(); } } } //----------------------------------------------------------------- //-- Description Field Row { spacing: ScreenTools.defaultFontPixelWidth QGCLabel { width: _labelWidth anchors.baseline: descField.baseline text: qsTr("Default Description:") } QGCTextField { id: descField text: QGroundControl.mavlinkLogManager.description width: _valueWidth anchors.verticalCenter: parent.verticalCenter onEditingFinished: { saveItems(); } } } //----------------------------------------------------------------- //-- Upload URL Row { spacing: ScreenTools.defaultFontPixelWidth QGCLabel { width: _labelWidth anchors.baseline: urlField.baseline text: qsTr("Default Upload URL") } QGCTextField { id: urlField text: QGroundControl.mavlinkLogManager.uploadURL width: _valueWidth inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhUrlCharactersOnly anchors.verticalCenter: parent.verticalCenter onEditingFinished: { saveItems(); } } } //----------------------------------------------------------------- //-- Video URL Row { spacing: ScreenTools.defaultFontPixelWidth QGCLabel { width: _labelWidth anchors.baseline: videoUrlField.baseline text: qsTr("Video URL:") } QGCTextField { id: videoUrlField text: QGroundControl.mavlinkLogManager.videoURL width: _valueWidth inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhUrlCharactersOnly anchors.verticalCenter: parent.verticalCenter } } //----------------------------------------------------------------- //-- Wind Speed Row { spacing: ScreenTools.defaultFontPixelWidth QGCLabel { width: _labelWidth anchors.baseline: windCombo.baseline text: qsTr("Wind Speed:") } QGCComboBox { id: windCombo width: _valueWidth model: ListModel { id: windItems ListElement { text: "Please Select"; value: -1 } ListElement { text: "Calm"; value: 0 } ListElement { text: "Breeze"; value: 5 } ListElement { text: "Gale"; value: 8 } ListElement { text: "Storm"; value: 10 } } onActivated: { saveItems(); QGroundControl.mavlinkLogManager.windSpeed = windItems.get(index).value //console.log('Set Wind: ' + windItems.get(index).value) } Component.onCompleted: { for(var i = 0; i < windItems.count; i++) { if(windItems.get(i).value === QGroundControl.mavlinkLogManager.windSpeed) { windCombo.currentIndex = i; //console.log('Wind: ' + windItems.get(i).value) break; } } } } } //----------------------------------------------------------------- //-- Flight Rating Row { spacing: ScreenTools.defaultFontPixelWidth QGCLabel { width: _labelWidth anchors.baseline: ratingCombo.baseline text: qsTr("Flight Rating:") } QGCComboBox { id: ratingCombo width: _valueWidth model: ListModel { id: ratingItems ListElement { text: "Please Select"; value: "notset"} ListElement { text: "Crashed (Pilot Error)"; value: "crash_pilot" } ListElement { text: "Crashed (Software or Hardware issue)"; value: "crash_sw_hw" } ListElement { text: "Unsatisfactory"; value: "unsatisfactory" } ListElement { text: "Good"; value: "good" } ListElement { text: "Great"; value: "great" } } onActivated: { saveItems(); QGroundControl.mavlinkLogManager.rating = ratingItems.get(index).value //console.log('Set Rating: ' + ratingItems.get(index).value) } Component.onCompleted: { for(var i = 0; i < ratingItems.count; i++) { if(ratingItems.get(i).value === QGroundControl.mavlinkLogManager.rating) { ratingCombo.currentIndex = i; //console.log('Rating: ' + ratingItems.get(i).value) break; } } } } } //----------------------------------------------------------------- //-- Feedback Row { spacing: ScreenTools.defaultFontPixelWidth QGCLabel { width: _labelWidth text: qsTr("Additional Feedback:") } TextArea { id: feedbackTextArea width: _valueWidth height: ScreenTools.defaultFontPixelHeight * 4 frameVisible: false font.pointSize: ScreenTools.defaultFontPointSize text: QGroundControl.mavlinkLogManager.feedback style: TextAreaStyle { textColor: qgcPal.windowShade backgroundColor: qgcPal.text } } } //----------------------------------------------------------------- //-- Public Log QGCCheckBox { text: qsTr("Make this log publicly available") checked: QGroundControl.mavlinkLogManager.publicLog onClicked: { QGroundControl.mavlinkLogManager.publicLog = checked } } //----------------------------------------------------------------- //-- Automatic Upload QGCCheckBox { id: autoUploadCheck text: qsTr("Enable automatic log uploads") checked: QGroundControl.mavlinkLogManager.enableAutoUpload onClicked: { saveItems(); if(checked && QGroundControl.mavlinkLogManager.emailAddress === "") emptyEmailDialog.open() } } //----------------------------------------------------------------- //-- Delete log after upload QGCCheckBox { text: qsTr("Delete log file after uploading") checked: QGroundControl.mavlinkLogManager.deleteAfterUpload enabled: autoUploadCheck.checked onClicked: { QGroundControl.mavlinkLogManager.deleteAfterUpload = checked } } } } //----------------------------------------------------------------- //-- Log Files Item { width: __mavlinkRoot.width * 0.8 height: logFilesLabel.height anchors.margins: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter visible: _showMavlinkLog QGCLabel { id: logFilesLabel text: qsTr("Saved Log Files") font.family: ScreenTools.demiboldFontFamily } } Rectangle { height: logFilesColumn.height + (ScreenTools.defaultFontPixelHeight * 2) width: __mavlinkRoot.width * 0.8 color: qgcPal.windowShade anchors.margins: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter visible: _showMavlinkLog Column { id: logFilesColumn spacing: _columnSpacing * 4 anchors.centerIn: parent width: ScreenTools.defaultFontPixelWidth * 68 Rectangle { width: ScreenTools.defaultFontPixelWidth * 64 height: ScreenTools.defaultFontPixelHeight * 14 anchors.horizontalCenter: parent.horizontalCenter color: qgcPal.window border.color: qgcPal.text border.width: 0.5 QGCListView { width: ScreenTools.defaultFontPixelWidth * 56 height: ScreenTools.defaultFontPixelHeight * 12 anchors.centerIn: parent orientation: ListView.Vertical model: QGroundControl.mavlinkLogManager.logFiles clip: true delegate: Rectangle { width: ScreenTools.defaultFontPixelWidth * 52 height: selectCheck.height color: qgcPal.window Row { width: ScreenTools.defaultFontPixelWidth * 50 anchors.centerIn: parent spacing: ScreenTools.defaultFontPixelWidth QGCCheckBox { id: selectCheck width: ScreenTools.defaultFontPixelWidth * 4 checked: object.selected enabled: !object.writing && !object.uploading anchors.verticalCenter: parent.verticalCenter onClicked: { object.selected = checked } } QGCLabel { text: object.name width: ScreenTools.defaultFontPixelWidth * 28 color: object.writing ? qgcPal.warningText : qgcPal.text anchors.verticalCenter: parent.verticalCenter } QGCLabel { text: Number(object.size).toLocaleString(Qt.locale(), 'f', 0) visible: !object.uploading && !object.uploaded width: ScreenTools.defaultFontPixelWidth * 20; color: object.writing ? qgcPal.warningText : qgcPal.text horizontalAlignment: Text.AlignRight anchors.verticalCenter: parent.verticalCenter } QGCLabel { text: qsTr("Uploaded") visible: object.uploaded width: ScreenTools.defaultFontPixelWidth * 20; horizontalAlignment: Text.AlignRight anchors.verticalCenter: parent.verticalCenter } ProgressBar { visible: object.uploading && !object.uploaded width: ScreenTools.defaultFontPixelWidth * 20; height: ScreenTools.defaultFontPixelHeight anchors.verticalCenter: parent.verticalCenter minimumValue: 0 maximumValue: 100 value: object.progress * 100.0 } } } } } Row { spacing: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter QGCButton { text: qsTr("Check All") enabled: !QGroundControl.mavlinkLogManager.uploading && !QGroundControl.mavlinkLogManager.logRunning onClicked: { for(var i = 0; i < QGroundControl.mavlinkLogManager.logFiles.count; i++) { var logFile = QGroundControl.mavlinkLogManager.logFiles.get(i) logFile.selected = true } } } QGCButton { text: qsTr("Check None") enabled: !QGroundControl.mavlinkLogManager.uploading && !QGroundControl.mavlinkLogManager.logRunning onClicked: { for(var i = 0; i < QGroundControl.mavlinkLogManager.logFiles.count; i++) { var logFile = QGroundControl.mavlinkLogManager.logFiles.get(i) logFile.selected = false } } } QGCButton { text: qsTr("Delete Selected") enabled: _selectedCount > 0 && !QGroundControl.mavlinkLogManager.uploading && !QGroundControl.mavlinkLogManager.logRunning onClicked: deleteDialog.open() MessageDialog { id: deleteDialog visible: false icon: StandardIcon.Warning standardButtons: StandardButton.Yes | StandardButton.No title: qsTr("Delete Selected Log Files") text: qsTr("Confirm deleting selected log files?") onYes: { QGroundControl.mavlinkLogManager.deleteLog() } } } QGCButton { text: qsTr("Upload Selected") enabled: _selectedCount > 0 && !QGroundControl.mavlinkLogManager.uploading && !QGroundControl.mavlinkLogManager.logRunning && !_uploadedSelected visible: !QGroundControl.mavlinkLogManager.uploading onClicked: { saveItems(); if(QGroundControl.mavlinkLogManager.emailAddress === "") emptyEmailDialog.open() else uploadDialog.open() } MessageDialog { id: uploadDialog visible: false icon: StandardIcon.Question standardButtons: StandardButton.Yes | StandardButton.No title: qsTr("Upload Selected Log Files") text: qsTr("Confirm uploading selected log files?") onYes: { QGroundControl.mavlinkLogManager.uploadLog() } } } QGCButton { text: qsTr("Cancel") enabled: QGroundControl.mavlinkLogManager.uploading && !QGroundControl.mavlinkLogManager.logRunning visible: QGroundControl.mavlinkLogManager.uploading onClicked: cancelDialog.open() MessageDialog { id: cancelDialog visible: false icon: StandardIcon.Warning standardButtons: StandardButton.Yes | StandardButton.No title: qsTr("Cancel Upload") text: qsTr("Confirm canceling the upload process?") onYes: { QGroundControl.mavlinkLogManager.cancelUpload() } } } } } } } } }