7import QGroundControl.FactControls
8import QGroundControl.Controls
15 property real _labelWidth: ScreenTools.defaultFontPixelWidth * 28
16 property real _valueWidth: ScreenTools.defaultFontPixelWidth * 24
17 property int _selectedCount: 0
18 property real _columnSpacing: ScreenTools.defaultFontPixelHeight * 0.25
19 property bool _uploadedSelected: false
20 property bool _showMavlinkLog: QGroundControl.corePlugin.options.showPX4LogTransferOptions
21 property bool _showAPMStreamRates: QGroundControl.apmFirmwareSupported && QGroundControl.settingsManager.apmMavlinkStreamRateSettings.visible && _isAPM
22 property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle
23 property bool _isPX4: _activeVehicle ? _activeVehicle.px4Firmware : true
24 property bool _isAPM: _activeVehicle ? _activeVehicle.apmFirmware : true
25 property Fact _disableDataPersistenceFact: QGroundControl.settingsManager.appSettings.disableAllPersistence
26 property bool _disableDataPersistence: _disableDataPersistenceFact ? _disableDataPersistenceFact.rawValue : false
27 property var _mavlinkLogManager: _activeVehicle ? _activeVehicle.mavlinkLogManager : null
29 QGCPalette { id: qgcPal }
32 target: _mavlinkLogManager
33 onSelectedCountChanged: {
34 _uploadedSelected = false
36 for(var i = 0; i < _mavlinkLogManager.logFiles.count; i++) {
37 var logFile = _mavlinkLogManager.logFiles.get(i)
38 if(logFile.selected) {
40 //-- If an uploaded file is selected, disable "Upload" button
41 if(logFile.uploaded) {
42 _uploadedSelected = true
46 _selectedCount = selected
50 function saveItems() {
51 _mavlinkLogManager.videoURL = videoUrlField.text
52 _mavlinkLogManager.feedback = feedbackTextArea.text
53 _mavlinkLogManager.emailAddress = emailField.text
54 _mavlinkLogManager.description = descField.text
55 _mavlinkLogManager.uploadURL = urlField.text
56 _mavlinkLogManager.emailAddress = emailField.text
57 if(autoUploadCheck.checked && _mavlinkLogManager.emailAddress === "") {
58 autoUploadCheck.checked = false
60 _mavlinkLogManager.enableAutoUpload = autoUploadCheck.checked
67 //icon: StandardIcon.Warning
68 buttons: MessageDialog.Close
69 title: qsTr("MAVLink Logging")
70 text: qsTr("Please enter an email address before uploading MAVLink log files.")
76 anchors.margins: ScreenTools.defaultFontPixelWidth
77 contentHeight: settingsColumn.height
78 contentWidth: settingsColumn.width
79 flickableDirection: Flickable.VerticalFlick
83 width: __mavlinkRoot.width
84 spacing: ScreenTools.defaultFontPixelHeight * 0.5
85 anchors.margins: ScreenTools.defaultFontPixelWidth
87 //-----------------------------------------------------------------
90 width: __mavlinkRoot.width * 0.8
91 height: mavlogLabel.height
92 anchors.margins: ScreenTools.defaultFontPixelWidth
93 anchors.horizontalCenter: parent.horizontalCenter
94 visible: _showMavlinkLog && _isPX4
97 text: qsTr("MAVLink 2.0 Logging (PX4 Pro Only)")
102 height: mavlogColumn.height + (ScreenTools.defaultFontPixelHeight * 2)
103 width: __mavlinkRoot.width * 0.8
104 color: qgcPal.windowShade
105 anchors.margins: ScreenTools.defaultFontPixelWidth
106 anchors.horizontalCenter: parent.horizontalCenter
107 visible: _showMavlinkLog && _isPX4
110 spacing: _columnSpacing
111 anchors.centerIn: parent
112 //-----------------------------------------------------------------
113 //-- Manual Start/Stop
115 spacing: ScreenTools.defaultFontPixelWidth
116 anchors.horizontalCenter: parent.horizontalCenter
119 text: qsTr("Manual Start/Stop:")
120 anchors.verticalCenter: parent.verticalCenter
123 text: qsTr("Start Logging")
124 width: (_valueWidth * 0.5) - (ScreenTools.defaultFontPixelWidth * 0.5)
125 enabled: !_mavlinkLogManager.logRunning && _mavlinkLogManager.canStartLog && !_disableDataPersistence
126 onClicked: _mavlinkLogManager.startLogging()
127 anchors.verticalCenter: parent.verticalCenter
130 text: qsTr("Stop Logging")
131 width: (_valueWidth * 0.5) - (ScreenTools.defaultFontPixelWidth * 0.5)
132 enabled: _mavlinkLogManager.logRunning && !_disableDataPersistence
133 onClicked: _mavlinkLogManager.stopLogging()
134 anchors.verticalCenter: parent.verticalCenter
137 //-----------------------------------------------------------------
138 //-- Enable auto log on arming
140 text: qsTr("Enable automatic logging")
141 checked: _mavlinkLogManager.enableAutoStart
142 enabled: !_disableDataPersistence
144 _mavlinkLogManager.enableAutoStart = checked
149 //-----------------------------------------------------------------
152 width: __mavlinkRoot.width * 0.8
153 height: logLabel.height
154 anchors.margins: ScreenTools.defaultFontPixelWidth
155 anchors.horizontalCenter: parent.horizontalCenter
156 visible: _showMavlinkLog && _isPX4
159 text: qsTr("MAVLink 2.0 Log Uploads (PX4 Pro Only)")
164 height: logColumn.height + (ScreenTools.defaultFontPixelHeight * 2)
165 width: __mavlinkRoot.width * 0.8
166 color: qgcPal.windowShade
167 anchors.margins: ScreenTools.defaultFontPixelWidth
168 anchors.horizontalCenter: parent.horizontalCenter
169 visible: _showMavlinkLog && _isPX4
172 spacing: _columnSpacing
173 anchors.centerIn: parent
174 //-----------------------------------------------------------------
175 //-- Email address Field
177 spacing: ScreenTools.defaultFontPixelWidth
180 anchors.baseline: emailField.baseline
181 text: qsTr("Email address for Log Upload:")
185 text: _mavlinkLogManager.emailAddress
187 enabled: !_disableDataPersistence
188 inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhEmailCharactersOnly
189 anchors.verticalCenter: parent.verticalCenter
195 //-----------------------------------------------------------------
196 //-- Description Field
198 spacing: ScreenTools.defaultFontPixelWidth
201 anchors.baseline: descField.baseline
202 text: qsTr("Default Description:")
206 text: _mavlinkLogManager.description
208 enabled: !_disableDataPersistence
209 anchors.verticalCenter: parent.verticalCenter
215 //-----------------------------------------------------------------
218 spacing: ScreenTools.defaultFontPixelWidth
221 anchors.baseline: urlField.baseline
222 text: qsTr("Default Upload URL")
226 text: _mavlinkLogManager.uploadURL
228 enabled: !_disableDataPersistence
229 inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhUrlCharactersOnly
230 anchors.verticalCenter: parent.verticalCenter
236 //-----------------------------------------------------------------
239 spacing: ScreenTools.defaultFontPixelWidth
242 anchors.baseline: videoUrlField.baseline
243 text: qsTr("Video URL:")
247 text: _mavlinkLogManager.videoURL
249 enabled: !_disableDataPersistence
250 inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhUrlCharactersOnly
251 anchors.verticalCenter: parent.verticalCenter
254 //-----------------------------------------------------------------
257 spacing: ScreenTools.defaultFontPixelWidth
260 anchors.baseline: windCombo.baseline
261 text: qsTr("Wind Speed:")
266 enabled: !_disableDataPersistence
270 ListElement { text: qsTr("Please Select"); value: -1 }
271 ListElement { text: qsTr("Calm"); value: 0 }
272 ListElement { text: qsTr("Breeze"); value: 5 }
273 ListElement { text: qsTr("Gale"); value: 8 }
274 ListElement { text: qsTr("Storm"); value: 10 }
276 onActivated: (index) => {
278 _mavlinkLogManager.windSpeed = windItems.get(index).value
279 //console.log('Set Wind: ' + windItems.get(index).value)
281 Component.onCompleted: {
282 for(var i = 0; i < windItems.count; i++) {
283 if(windItems.get(i).value === _mavlinkLogManager.windSpeed) {
284 windCombo.currentIndex = i;
285 //console.log('Wind: ' + windItems.get(i).value)
292 //-----------------------------------------------------------------
295 spacing: ScreenTools.defaultFontPixelWidth
298 anchors.baseline: ratingCombo.baseline
299 text: qsTr("Flight Rating:")
304 enabled: !_disableDataPersistence
308 ListElement { text: qsTr("Please Select"); value: "notset"}
309 ListElement { text: qsTr("Crashed (Pilot Error)"); value: "crash_pilot" }
310 ListElement { text: qsTr("Crashed (Software or Hardware issue)"); value: "crash_sw_hw" }
311 ListElement { text: qsTr("Unsatisfactory"); value: "unsatisfactory" }
312 ListElement { text: qsTr("Good"); value: "good" }
313 ListElement { text: qsTr("Great"); value: "great" }
315 onActivated: (index) => {
317 _mavlinkLogManager.rating = ratingItems.get(index).value
318 //console.log('Set Rating: ' + ratingItems.get(index).value)
320 Component.onCompleted: {
321 for(var i = 0; i < ratingItems.count; i++) {
322 if(ratingItems.get(i).value === _mavlinkLogManager.rating) {
323 ratingCombo.currentIndex = i;
324 //console.log('Rating: ' + ratingItems.get(i).value)
331 //-----------------------------------------------------------------
334 spacing: ScreenTools.defaultFontPixelWidth
337 text: qsTr("Additional Feedback:")
342 height: ScreenTools.defaultFontPixelHeight * 4
343 font.pointSize: ScreenTools.defaultFontPointSize
344 text: _mavlinkLogManager.feedback
345 enabled: !_disableDataPersistence
346 color: qgcPal.textFieldText
347 background: Rectangle { color: qgcPal.textField }
350 //-----------------------------------------------------------------
353 text: qsTr("Make this log publicly available")
354 checked: _mavlinkLogManager.publicLog
355 enabled: !_disableDataPersistence
357 _mavlinkLogManager.publicLog = checked
360 //-----------------------------------------------------------------
361 //-- Automatic Upload
364 text: qsTr("Enable automatic log uploads")
365 checked: _mavlinkLogManager.enableAutoUpload
366 enabled: !_disableDataPersistence
369 if(checked && _mavlinkLogManager.emailAddress === "")
370 emptyEmailDialog.open()
373 //-----------------------------------------------------------------
374 //-- Delete log after upload
376 text: qsTr("Delete log file after uploading")
377 checked: _mavlinkLogManager.deleteAfterUpload
378 enabled: autoUploadCheck.checked && !_disableDataPersistence
380 _mavlinkLogManager.deleteAfterUpload = checked
385 //-----------------------------------------------------------------
388 width: __mavlinkRoot.width * 0.8
389 height: logFilesLabel.height
390 anchors.margins: ScreenTools.defaultFontPixelWidth
391 anchors.horizontalCenter: parent.horizontalCenter
392 visible: _showMavlinkLog
395 text: qsTr("Saved Log Files")
400 height: logFilesColumn.height + (ScreenTools.defaultFontPixelHeight * 2)
401 width: __mavlinkRoot.width * 0.8
402 color: qgcPal.windowShade
403 anchors.margins: ScreenTools.defaultFontPixelWidth
404 anchors.horizontalCenter: parent.horizontalCenter
405 visible: _showMavlinkLog
408 spacing: _columnSpacing * 4
409 anchors.centerIn: parent
410 width: ScreenTools.defaultFontPixelWidth * 68
412 width: ScreenTools.defaultFontPixelWidth * 64
413 height: ScreenTools.defaultFontPixelHeight * 14
414 anchors.horizontalCenter: parent.horizontalCenter
416 border.color: qgcPal.text
419 width: ScreenTools.defaultFontPixelWidth * 56
420 height: ScreenTools.defaultFontPixelHeight * 12
421 anchors.centerIn: parent
422 orientation: ListView.Vertical
423 model: _mavlinkLogManager.logFiles
425 delegate: Rectangle {
426 width: ScreenTools.defaultFontPixelWidth * 52
427 height: selectCheck.height
430 width: ScreenTools.defaultFontPixelWidth * 50
431 anchors.centerIn: parent
432 spacing: ScreenTools.defaultFontPixelWidth
435 width: ScreenTools.defaultFontPixelWidth * 4
436 checked: object.selected
437 enabled: !object.writing && !object.uploading
438 anchors.verticalCenter: parent.verticalCenter
440 object.selected = checked
445 width: ScreenTools.defaultFontPixelWidth * 28
446 color: object.writing ? qgcPal.warningText : qgcPal.text
447 anchors.verticalCenter: parent.verticalCenter
450 text: Number(object.size).toLocaleString(Qt.locale(), 'f', 0)
451 visible: !object.uploading && !object.uploaded
452 width: ScreenTools.defaultFontPixelWidth * 20;
453 color: object.writing ? qgcPal.warningText : qgcPal.text
454 horizontalAlignment: Text.AlignRight
455 anchors.verticalCenter: parent.verticalCenter
458 text: qsTr("Uploaded")
459 visible: object.uploaded
460 width: ScreenTools.defaultFontPixelWidth * 20;
461 horizontalAlignment: Text.AlignRight
462 anchors.verticalCenter: parent.verticalCenter
465 visible: object.uploading && !object.uploaded
466 width: ScreenTools.defaultFontPixelWidth * 20;
467 height: ScreenTools.defaultFontPixelHeight
468 anchors.verticalCenter: parent.verticalCenter
471 value: object.progress * 100.0
478 spacing: ScreenTools.defaultFontPixelWidth
479 anchors.horizontalCenter: parent.horizontalCenter
481 text: qsTr("Check All")
482 enabled: !_mavlinkLogManager.uploading && !_mavlinkLogManager.logRunning
484 for(var i = 0; i < _mavlinkLogManager.logFiles.count; i++) {
485 var logFile = _mavlinkLogManager.logFiles.get(i)
486 logFile.selected = true
491 text: qsTr("Check None")
492 enabled: !_mavlinkLogManager.uploading && !_mavlinkLogManager.logRunning
494 for(var i = 0; i < _mavlinkLogManager.logFiles.count; i++) {
495 var logFile = _mavlinkLogManager.logFiles.get(i)
496 logFile.selected = false
501 text: qsTr("Delete Selected")
502 enabled: _selectedCount > 0 && !_mavlinkLogManager.uploading && !_mavlinkLogManager.logRunning
503 onClicked: deleteDialog.open()
507 //icon: StandardIcon.Warning
508 buttons: MessageDialog.Yes | MessageDialog.No
509 title: qsTr("Delete Selected Log Files")
510 text: qsTr("Confirm deleting selected log files?")
511 onButtonClicked: function (button, role) {
513 case MessageDialog.Yes:
514 _mavlinkLogManager.deleteLog()
521 text: qsTr("Upload Selected")
522 enabled: _selectedCount > 0 && !_mavlinkLogManager.uploading && !_mavlinkLogManager.logRunning && !_uploadedSelected
523 visible: !_mavlinkLogManager.uploading
526 if(_mavlinkLogManager.emailAddress === "")
527 emptyEmailDialog.open()
534 //icon: StandardIcon.Question
535 buttons: MessageDialog.Yes | MessageDialog.No
536 title: qsTr("Upload Selected Log Files")
537 text: qsTr("Confirm uploading selected log files?")
538 onButtonClicked: function (button, role) {
540 case MessageDialog.Yes:
541 _mavlinkLogManager.uploadLog()
549 enabled: _mavlinkLogManager.uploading && !_mavlinkLogManager.logRunning
550 visible: _mavlinkLogManager.uploading
551 onClicked: cancelDialog.open()
555 //icon: StandardIcon.Warning
556 buttons: MessageDialog.Yes | MessageDialog.No
557 title: qsTr("Cancel Upload")
558 text: qsTr("Confirm canceling the upload process?")
559 onButtonClicked: function (button, role) {
561 case MessageDialog.Yes:
562 _mavlinkLogManager.cancelUpload()