From c9065660c8779c5dbcdb4d39de537c71f15a95fa Mon Sep 17 00:00:00 2001 From: David Jablonski Date: Sat, 25 Dec 2021 10:16:19 +0100 Subject: [PATCH 1/3] QGCCameraControl: allow to read camera information xml via ftp --- src/Camera/QGCCameraControl.cc | 36 ++++++++++++++++++++++++++++++++++ src/Camera/QGCCameraControl.h | 1 + src/Camera/QGCCameraManager.cc | 1 + src/Vehicle/FTPManager.cc | 10 ++++++++-- src/Vehicle/FTPManager.h | 2 +- 5 files changed, 47 insertions(+), 3 deletions(-) diff --git a/src/Camera/QGCCameraControl.cc b/src/Camera/QGCCameraControl.cc index 6c7ef6888960..cf60ba8add6e 100644 --- a/src/Camera/QGCCameraControl.cc +++ b/src/Camera/QGCCameraControl.cc @@ -11,6 +11,7 @@ #include "VideoManager.h" #include "QGCMapEngine.h" #include "QGCCameraManager.h" +#include "FTPManager.h" #include #include @@ -1950,6 +1951,21 @@ QGCCameraControl::_handleDefinitionFile(const QString &url) { //-- First check and see if we have it cached QFile xmlFile(_cacheFile); + + QString ftpPrefix(QStringLiteral("%1://").arg(FTPManager::mavlinkFTPScheme)); + if (url.startsWith(ftpPrefix, Qt::CaseInsensitive)) { + int ver = static_cast(_info.cam_definition_version); + QString fileName = QString::asprintf("%s_%s_%03d.xml", + _vendor.toStdString().c_str(), + _modelName.toStdString().c_str(), + ver); + connect(_vehicle->ftpManager(), &FTPManager::downloadComplete, this, &QGCCameraControl::_ftpDownloadComplete); + _vehicle->ftpManager()->download(url, + qgcApp()->toolbox()->settingsManager()->appSettings()->parameterSavePath().toStdString().c_str(), + fileName); + return; + } + if (!xmlFile.exists()) { qCDebug(CameraControlLog) << "No camera definition file cached"; _httpRequest(url); @@ -2020,6 +2036,26 @@ QGCCameraControl::_downloadFinished() //reply->deleteLater(); } +void QGCCameraControl::_ftpDownloadComplete(const QString& fileName, const QString& errorMsg) +{ + qCDebug(CameraControlLog) << "QGCCameraControl::_ftpDownloadComplete fileName:errorMsg" << fileName << errorMsg; + + disconnect(_vehicle->ftpManager(), &FTPManager::downloadComplete, this, &QGCCameraControl::_ftpDownloadComplete); + QFile xmlFile(fileName); + + if (!xmlFile.exists()) { + qCDebug(CameraControlLog) << "No camera definition file present after ftp download completed"; + return; + } + if (!xmlFile.open(QIODevice::ReadOnly)) { + qWarning() << "Could not read downloaded camera definition file: " << fileName; + return; + } + + QByteArray bytes = xmlFile.readAll(); + emit dataReady(bytes); +} + //----------------------------------------------------------------------------- void QGCCameraControl::_dataReady(QByteArray data) diff --git a/src/Camera/QGCCameraControl.h b/src/Camera/QGCCameraControl.h index b5a25bb5fe8f..b9e13bf8ee9a 100644 --- a/src/Camera/QGCCameraControl.h +++ b/src/Camera/QGCCameraControl.h @@ -372,6 +372,7 @@ protected slots: void _updateRanges (Fact* pFact); void _httpRequest (const QString& url); void _handleDefinitionFile (const QString& url); + void _ftpDownloadComplete (const QString& fileName, const QString& errorMsg); QStringList _loadExclusions (QDomNode option); QStringList _loadUpdates (QDomNode option); diff --git a/src/Camera/QGCCameraManager.cc b/src/Camera/QGCCameraManager.cc index 1e7612497362..907bd36d96ac 100644 --- a/src/Camera/QGCCameraManager.cc +++ b/src/Camera/QGCCameraManager.cc @@ -112,6 +112,7 @@ QGCCameraManager::_handleHeartbeat(const mavlink_message_t &message) mavlink_heartbeat_t heartbeat; mavlink_msg_heartbeat_decode(&message, &heartbeat); //-- First time hearing from this one? + qCDebug(CameraManagerLog) << "Another Hearbeat from " << message.compid; QString sCompID = QString::number(message.compid); if(!_cameraInfoRequest.contains(sCompID)) { qCDebug(CameraManagerLog) << "Hearbeat from " << message.compid; diff --git a/src/Vehicle/FTPManager.cc b/src/Vehicle/FTPManager.cc index 4de60483cbd4..b6fa808f8906 100644 --- a/src/Vehicle/FTPManager.cc +++ b/src/Vehicle/FTPManager.cc @@ -34,7 +34,7 @@ FTPManager::FTPManager(Vehicle* vehicle) Q_ASSERT(sizeof(MavlinkFTP::RequestHeader) == 12); } -bool FTPManager::download(const QString& fromURI, const QString& toDir) +bool FTPManager::download(const QString& fromURI, const QString& toDir, const QString& fileName) { qCDebug(FTPManagerLog) << "download fromURI:" << fromURI << "to:" << toDir; @@ -72,7 +72,11 @@ bool FTPManager::download(const QString& fromURI, const QString& toDir) } lastDirSlashIndex++; // move past slash - _downloadState.fileName = _downloadState.fullPathOnVehicle.right(_downloadState.fullPathOnVehicle.size() - lastDirSlashIndex); + if (fileName.size() == 0) { + _downloadState.fileName = _downloadState.fullPathOnVehicle.right(_downloadState.fullPathOnVehicle.size() - lastDirSlashIndex); + } else { + _downloadState.fileName = fileName; + } qCDebug(FTPManagerLog) << "_downloadState.fullPathOnVehicle:_downloadState.fileName" << _downloadState.fullPathOnVehicle << _downloadState.fileName; @@ -641,6 +645,8 @@ bool FTPManager::_parseURI(const QString& uri, QString& parsedURI, uint8_t& comp if (!ok) { qCWarning(FTPManagerLog) << "Incorrect format for component id" << uri; return false; + } else { + qCDebug(FTPManagerLog) << "Found compId:" << (int)compId; } parsedURI.replace(QRegularExpression("\\[\\;comp\\=\\d+\\]"), ""); } diff --git a/src/Vehicle/FTPManager.h b/src/Vehicle/FTPManager.h index b932c5f7af06..30e3e566db3b 100644 --- a/src/Vehicle/FTPManager.h +++ b/src/Vehicle/FTPManager.h @@ -37,7 +37,7 @@ class FTPManager : public QObject /// @param toDir Local directory to download file to /// @return true: download has started, false: error, no download /// Signals downloadComplete, commandError, commandProgress - bool download(const QString& fromURI, const QString& toDir); + bool download(const QString& fromURI, const QString& toDir, const QString& fileName=""); /// Cancel the current operation /// This will emit downloadComplete() when done, and if there's currently a download in progress From 813cce637562165f7dd5c68b84e6ca282f201cca Mon Sep 17 00:00:00 2001 From: David Jablonski Date: Fri, 14 Jan 2022 14:09:15 +0100 Subject: [PATCH 2/3] applied reviewer comments --- src/Camera/QGCCameraControl.cc | 2 +- src/Vehicle/FTPManager.cc | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Camera/QGCCameraControl.cc b/src/Camera/QGCCameraControl.cc index cf60ba8add6e..8cfb7c7cb6d8 100644 --- a/src/Camera/QGCCameraControl.cc +++ b/src/Camera/QGCCameraControl.cc @@ -2038,7 +2038,7 @@ QGCCameraControl::_downloadFinished() void QGCCameraControl::_ftpDownloadComplete(const QString& fileName, const QString& errorMsg) { - qCDebug(CameraControlLog) << "QGCCameraControl::_ftpDownloadComplete fileName:errorMsg" << fileName << errorMsg; + qCDebug(CameraControlLog) << "FTP Download completed: " << fileName << ", " << errorMsg; disconnect(_vehicle->ftpManager(), &FTPManager::downloadComplete, this, &QGCCameraControl::_ftpDownloadComplete); QFile xmlFile(fileName); diff --git a/src/Vehicle/FTPManager.cc b/src/Vehicle/FTPManager.cc index b6fa808f8906..65950fabcb6c 100644 --- a/src/Vehicle/FTPManager.cc +++ b/src/Vehicle/FTPManager.cc @@ -72,7 +72,7 @@ bool FTPManager::download(const QString& fromURI, const QString& toDir, const QS } lastDirSlashIndex++; // move past slash - if (fileName.size() == 0) { + if (fileName.isEmpty()) { _downloadState.fileName = _downloadState.fullPathOnVehicle.right(_downloadState.fullPathOnVehicle.size() - lastDirSlashIndex); } else { _downloadState.fileName = fileName; @@ -645,9 +645,9 @@ bool FTPManager::_parseURI(const QString& uri, QString& parsedURI, uint8_t& comp if (!ok) { qCWarning(FTPManagerLog) << "Incorrect format for component id" << uri; return false; - } else { - qCDebug(FTPManagerLog) << "Found compId:" << (int)compId; } + + qCDebug(FTPManagerLog) << "Found compId in MAVLink FTP URI: " << compId; parsedURI.replace(QRegularExpression("\\[\\;comp\\=\\d+\\]"), ""); } From 155ba91d78b585914af2851c95222ed2b3ba986c Mon Sep 17 00:00:00 2001 From: David Jablonski Date: Mon, 14 Feb 2022 07:54:54 +0100 Subject: [PATCH 3/3] camera control: do not save ftp downloaded xml file twice --- src/Camera/QGCCameraControl.cc | 1 + src/Camera/QGCCameraManager.cc | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Camera/QGCCameraControl.cc b/src/Camera/QGCCameraControl.cc index 8cfb7c7cb6d8..b4a6936436e9 100644 --- a/src/Camera/QGCCameraControl.cc +++ b/src/Camera/QGCCameraControl.cc @@ -2052,6 +2052,7 @@ void QGCCameraControl::_ftpDownloadComplete(const QString& fileName, const QStri return; } + _cached = true; QByteArray bytes = xmlFile.readAll(); emit dataReady(bytes); } diff --git a/src/Camera/QGCCameraManager.cc b/src/Camera/QGCCameraManager.cc index 907bd36d96ac..1e7612497362 100644 --- a/src/Camera/QGCCameraManager.cc +++ b/src/Camera/QGCCameraManager.cc @@ -112,7 +112,6 @@ QGCCameraManager::_handleHeartbeat(const mavlink_message_t &message) mavlink_heartbeat_t heartbeat; mavlink_msg_heartbeat_decode(&message, &heartbeat); //-- First time hearing from this one? - qCDebug(CameraManagerLog) << "Another Hearbeat from " << message.compid; QString sCompID = QString::number(message.compid); if(!_cameraInfoRequest.contains(sCompID)) { qCDebug(CameraManagerLog) << "Hearbeat from " << message.compid;