diff --git a/src/Vehicle/MAVLinkLogManager.cc b/src/Vehicle/MAVLinkLogManager.cc index 567b7d935df7b1d952866449f475d7928d3bb163..11effa34c537052eab1aa41f4d816110b9244978 100644 --- a/src/Vehicle/MAVLinkLogManager.cc +++ b/src/Vehicle/MAVLinkLogManager.cc @@ -21,16 +21,23 @@ QGC_LOGGING_CATEGORY(MAVLinkLogManagerLog, "MAVLinkLogManagerLog") -static const char* kEmailAddressKey = "MAVLinkLogEmail"; -static const char* kDescriptionsKey = "MAVLinkLogDescription"; +static const char* kMAVLinkLogGroup = "MAVLinkLogGroup"; +static const char* kEmailAddressKey = "Email"; +static const char* kDescriptionsKey = "Description"; static const char* kDefaultDescr = "QGroundControl Session"; -static const char* kPx4URLKey = "MAVLinkLogURL"; +static const char* kPx4URLKey = "LogURL"; static const char* kDefaultPx4URL = "http://logs.px4.io/upload"; -static const char* kEnableAutoUploadKey = "EnableAutoUploadKey"; -static const char* kEnableAutoStartKey = "EnableAutoStartKey"; -static const char* kEnableDeletetKey = "EnableDeleteKey"; +static const char* kEnableAutoUploadKey = "EnableAutoUpload"; +static const char* kEnableAutoStartKey = "EnableAutoStart"; +static const char* kEnableDeletetKey = "EnableDelete"; static const char* kUlogExtension = ".ulg"; static const char* kSidecarExtension = ".uploaded"; +static const char* kVideoURLKey = "VideoURL"; +static const char* kWindSpeedKey = "WindSpeed"; +static const char* kRateKey = "RateKey"; +static const char* kPublicLogKey = "PublicLog"; +static const char* kFeedback = "feedback"; +static const char* kVideoURL = "videoUrl"; //----------------------------------------------------------------------------- MAVLinkLogFiles::MAVLinkLogFiles(MAVLinkLogManager* manager, const QString& filePath, bool newFile) @@ -299,15 +306,22 @@ MAVLinkLogManager::MAVLinkLogManager(QGCApplication* app) , _loggingDisabled(false) , _logProcessor(NULL) , _deleteAfterUpload(false) + , _windSpeed(-1) + , _publicLog(false) { //-- Get saved settings QSettings settings; + settings.beginGroup(kMAVLinkLogGroup); setEmailAddress(settings.value(kEmailAddressKey, QString()).toString()); setDescription(settings.value(kDescriptionsKey, QString(kDefaultDescr)).toString()); setUploadURL(settings.value(kPx4URLKey, QString(kDefaultPx4URL)).toString()); + setVideoURL(settings.value(kVideoURLKey, QString()).toString()); setEnableAutoUpload(settings.value(kEnableAutoUploadKey, true).toBool()); setEnableAutoStart(settings.value(kEnableAutoStartKey, true).toBool()); setDeleteAfterUpload(settings.value(kEnableDeletetKey, false).toBool()); + setWindSpeed(settings.value(kWindSpeedKey, -1).toInt()); + setRating(settings.value(kRateKey, "notset").toString()); + setPublicLog(settings.value(kPublicLogKey, true).toBool()); //-- Logging location _logPath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); _logPath += "/MAVLinkLogs"; @@ -353,6 +367,7 @@ MAVLinkLogManager::setEmailAddress(QString email) { _emailAddress = email; QSettings settings; + settings.beginGroup(kMAVLinkLogGroup); settings.setValue(kEmailAddressKey, email); emit emailAddressChanged(); } @@ -363,6 +378,7 @@ MAVLinkLogManager::setDescription(QString description) { _description = description; QSettings settings; + settings.beginGroup(kMAVLinkLogGroup); settings.setValue(kDescriptionsKey, description); emit descriptionChanged(); } @@ -376,16 +392,37 @@ MAVLinkLogManager::setUploadURL(QString url) _uploadURL = kDefaultPx4URL; } QSettings settings; + settings.beginGroup(kMAVLinkLogGroup); settings.setValue(kPx4URLKey, _uploadURL); emit uploadURLChanged(); } +//----------------------------------------------------------------------------- +void +MAVLinkLogManager::setFeedback(QString fb) +{ + _feedback = fb; + emit feedbackChanged(); +} + +//----------------------------------------------------------------------------- +void +MAVLinkLogManager::setVideoURL(QString url) +{ + _videoURL = url; + QSettings settings; + settings.beginGroup(kMAVLinkLogGroup); + settings.setValue(kVideoURLKey, url); + emit videoURLChanged(); +} + //----------------------------------------------------------------------------- void MAVLinkLogManager::setEnableAutoUpload(bool enable) { _enableAutoUpload = enable; QSettings settings; + settings.beginGroup(kMAVLinkLogGroup); settings.setValue(kEnableAutoUploadKey, enable); emit enableAutoUploadChanged(); } @@ -396,6 +433,7 @@ MAVLinkLogManager::setEnableAutoStart(bool enable) { _enableAutoStart = enable; QSettings settings; + settings.beginGroup(kMAVLinkLogGroup); settings.setValue(kEnableAutoStartKey, enable); emit enableAutoStartChanged(); } @@ -406,10 +444,44 @@ MAVLinkLogManager::setDeleteAfterUpload(bool enable) { _deleteAfterUpload = enable; QSettings settings; + settings.beginGroup(kMAVLinkLogGroup); settings.setValue(kEnableDeletetKey, enable); emit deleteAfterUploadChanged(); } +//----------------------------------------------------------------------------- +void +MAVLinkLogManager::setWindSpeed(int speed) +{ + _windSpeed = speed; + QSettings settings; + settings.beginGroup(kMAVLinkLogGroup); + settings.setValue(kWindSpeedKey, speed); + emit windSpeedChanged(); +} + +//----------------------------------------------------------------------------- +void +MAVLinkLogManager::setRating(QString rate) +{ + _rating = rate; + QSettings settings; + settings.beginGroup(kMAVLinkLogGroup); + settings.setValue(kRateKey, rate); + emit ratingChanged(); +} + +//----------------------------------------------------------------------------- +void +MAVLinkLogManager::setPublicLog(bool pub) +{ + _publicLog = pub; + QSettings settings; + settings.beginGroup(kMAVLinkLogGroup); + settings.setValue(kPublicLogKey, pub); + emit publicLogChanged(); +} + //----------------------------------------------------------------------------- bool MAVLinkLogManager::uploading() @@ -619,17 +691,41 @@ MAVLinkLogManager::_sendLog(const QString& logFile) QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); QHttpPart emailPart = create_form_part("email", _emailAddress); QHttpPart descriptionPart = create_form_part("description", _description); - QHttpPart sourcePart = create_form_part("source", "QGroundControl"); - QHttpPart versionPart = create_form_part("version", _app->applicationVersion()); - QHttpPart logPart; - logPart.setHeader(QNetworkRequest::ContentTypeHeader, "application/octet-stream"); - logPart.setHeader(QNetworkRequest::ContentDispositionHeader, QString("form-data; name=\"filearg\"; filename=\"%1\"").arg(fi.fileName())); - logPart.setBodyDevice(file); + QHttpPart sourcePart = create_form_part("source", "QGroundControl"); + QHttpPart versionPart = create_form_part("version", _app->applicationVersion()); + QHttpPart typePart = create_form_part("type", "flightreport"); + QHttpPart windPart = create_form_part("windSpeed", QString::number(_windSpeed)); + QHttpPart ratingPart = create_form_part("rating", _rating); + QHttpPart publicPart = create_form_part("public", _publicLog ? "true" : "false"); //-- Assemble request and POST it multiPart->append(emailPart); multiPart->append(descriptionPart); multiPart->append(sourcePart); multiPart->append(versionPart); + multiPart->append(typePart); + multiPart->append(windPart); + multiPart->append(ratingPart); + multiPart->append(publicPart); + //-- Optional + QHttpPart feedbackPart; + if(_feedback.isEmpty()) { + feedbackPart = create_form_part(kFeedback, "None Given"); + } else { + feedbackPart = create_form_part(kFeedback, _feedback); + } + multiPart->append(feedbackPart); + QHttpPart videoPart; + if(_videoURL.isEmpty()) { + videoPart = create_form_part(kVideoURL, "None"); + } else { + videoPart = create_form_part(kVideoURL, _videoURL); + } + multiPart->append(videoPart); + //-- Actual Log File + QHttpPart logPart; + logPart.setHeader(QNetworkRequest::ContentTypeHeader, "application/octet-stream"); + logPart.setHeader(QNetworkRequest::ContentDispositionHeader, QString("form-data; name=\"filearg\"; filename=\"%1\"").arg(fi.fileName())); + logPart.setBodyDevice(file); multiPart->append(logPart); file->setParent(multiPart); QNetworkRequest request(_uploadURL); diff --git a/src/Vehicle/MAVLinkLogManager.h b/src/Vehicle/MAVLinkLogManager.h index dd1051542acb70e828403307d74d0f1e8b632d78..a64b8998f724403405ad8241edc0cf0c6f4e5ba6 100644 --- a/src/Vehicle/MAVLinkLogManager.h +++ b/src/Vehicle/MAVLinkLogManager.h @@ -112,13 +112,18 @@ public: Q_PROPERTY(QString emailAddress READ emailAddress WRITE setEmailAddress NOTIFY emailAddressChanged) Q_PROPERTY(QString description READ description WRITE setDescription NOTIFY descriptionChanged) Q_PROPERTY(QString uploadURL READ uploadURL WRITE setUploadURL NOTIFY uploadURLChanged) + Q_PROPERTY(QString feedback READ feedback WRITE setFeedback NOTIFY feedbackChanged) + Q_PROPERTY(QString videoURL READ videoURL WRITE setVideoURL NOTIFY videoURLChanged) Q_PROPERTY(bool enableAutoUpload READ enableAutoUpload WRITE setEnableAutoUpload NOTIFY enableAutoUploadChanged) Q_PROPERTY(bool enableAutoStart READ enableAutoStart WRITE setEnableAutoStart NOTIFY enableAutoStartChanged) Q_PROPERTY(bool deleteAfterUpload READ deleteAfterUpload WRITE setDeleteAfterUpload NOTIFY deleteAfterUploadChanged) + Q_PROPERTY(bool publicLog READ publicLog WRITE setPublicLog NOTIFY publicLogChanged) Q_PROPERTY(bool uploading READ uploading NOTIFY uploadingChanged) Q_PROPERTY(bool logRunning READ logRunning NOTIFY logRunningChanged) Q_PROPERTY(bool canStartLog READ canStartLog NOTIFY canStartLogChanged) Q_PROPERTY(QmlObjectListModel* logFiles READ logFiles NOTIFY logFilesChanged) + Q_PROPERTY(int windSpeed READ windSpeed WRITE setWindSpeed NOTIFY windSpeedChanged) + Q_PROPERTY(QString rating READ rating WRITE setRating NOTIFY ratingChanged) Q_INVOKABLE void uploadLog (); Q_INVOKABLE void deleteLog (); @@ -129,21 +134,31 @@ public: QString emailAddress () { return _emailAddress; } QString description () { return _description; } QString uploadURL () { return _uploadURL; } + QString feedback () { return _feedback; } + QString videoURL () { return _videoURL; } bool enableAutoUpload () { return _enableAutoUpload; } bool enableAutoStart () { return _enableAutoStart; } bool uploading (); bool logRunning () { return _logRunning; } bool canStartLog () { return _vehicle != NULL; } bool deleteAfterUpload () { return _deleteAfterUpload; } + bool publicLog () { return _publicLog; } + int windSpeed () { return _windSpeed; } + QString rating () { return _rating; } QmlObjectListModel* logFiles () { return &_logFiles; } void setEmailAddress (QString email); void setDescription (QString description); void setUploadURL (QString url); + void setFeedback (QString feedback); + void setVideoURL (QString url); void setEnableAutoUpload (bool enable); void setEnableAutoStart (bool enable); void setDeleteAfterUpload(bool enable); + void setWindSpeed (int speed); + void setRating (QString rate); + void setPublicLog (bool publicLog); // Override from QGCTool void setToolbox (QGCToolbox *toolbox); @@ -152,6 +167,7 @@ signals: void emailAddressChanged (); void descriptionChanged (); void uploadURLChanged (); + void feedbackChanged (); void enableAutoUploadChanged (); void enableAutoStartChanged (); void logFilesChanged (); @@ -164,6 +180,10 @@ signals: void logRunningChanged (); void canStartLogChanged (); void deleteAfterUploadChanged (); + void windSpeedChanged (); + void ratingChanged (); + void videoURLChanged (); + void publicLogChanged (); private slots: void _uploadFinished (); @@ -188,7 +208,9 @@ private: QString _description; QString _emailAddress; QString _uploadURL; + QString _feedback; QString _logPath; + QString _videoURL; bool _enableAutoUpload; bool _enableAutoStart; QNetworkAccessManager* _nam; @@ -199,6 +221,9 @@ private: bool _loggingDisabled; MAVLinkLogProcessor* _logProcessor; bool _deleteAfterUpload; + int _windSpeed; + QString _rating; + bool _publicLog; }; #endif diff --git a/src/ui/preferences/MavlinkSettings.qml b/src/ui/preferences/MavlinkSettings.qml index b33f1e718716daa13acff1407770305ce1c3ba49..4de149c26c9df00d4df30b09001094dbd1105050 100644 --- a/src/ui/preferences/MavlinkSettings.qml +++ b/src/ui/preferences/MavlinkSettings.qml @@ -52,6 +52,22 @@ Rectangle { } } + 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 @@ -111,7 +127,7 @@ Rectangle { inputMethodHints: Qt.ImhFormattedNumbersOnly anchors.verticalCenter: parent.verticalCenter onEditingFinished: { - QGroundControl.mavlinkSystemID = parseInt(sysidField.text) + saveItems(); } } } @@ -234,11 +250,7 @@ Rectangle { inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhEmailCharactersOnly anchors.verticalCenter: parent.verticalCenter onEditingFinished: { - QGroundControl.mavlinkLogManager.emailAddress = emailField.text - if(emailField.text === "") { - autoUploadCheck.checked = false - QGroundControl.mavlinkLogManager.enableAutoUpload = false - } + saveItems(); } } } @@ -257,7 +269,7 @@ Rectangle { width: _valueWidth anchors.verticalCenter: parent.verticalCenter onEditingFinished: { - QGroundControl.mavlinkLogManager.description = descField.text + saveItems(); } } } @@ -277,24 +289,140 @@ Rectangle { inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhUrlCharactersOnly anchors.verticalCenter: parent.verticalCenter onEditingFinished: { - QGroundControl.mavlinkLogManager.uploadURL = urlField.text + 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: { - QGroundControl.mavlinkLogManager.emailAddress = emailField.text - if(checked && QGroundControl.mavlinkLogManager.emailAddress === "") { - checked = false + saveItems(); + if(checked && QGroundControl.mavlinkLogManager.emailAddress === "") emptyEmailDialog.open() - } else { - QGroundControl.mavlinkLogManager.enableAutoUpload = checked - } } } //----------------------------------------------------------------- @@ -443,7 +571,7 @@ Rectangle { enabled: _selectedCount > 0 && !QGroundControl.mavlinkLogManager.uploading && !QGroundControl.mavlinkLogManager.logRunning && !_uploadedSelected visible: !QGroundControl.mavlinkLogManager.uploading onClicked: { - QGroundControl.mavlinkLogManager.emailAddress = emailField.text + saveItems(); if(QGroundControl.mavlinkLogManager.emailAddress === "") emptyEmailDialog.open() else