diff --git a/src/VehicleSetup/FirmwareUpgrade.qml b/src/VehicleSetup/FirmwareUpgrade.qml index 6cce0ceb1bbd92721653405f3828262eeeae604e..0e5758d104601ab7bf1e9b76278f7ff823ca0d49 100644 --- a/src/VehicleSetup/FirmwareUpgrade.qml +++ b/src/VehicleSetup/FirmwareUpgrade.qml @@ -221,7 +221,7 @@ QGCView { id: px4FlightStack checked: true exclusiveGroup: firmwareGroup - text: qsTr("PX4 Flight Stack") + text: qsTr("PX4 Flight Stack ") + controller.px4StableVersion visible: !px4Flow onClicked: parent.firmwareVersionChanged(firmwareTypeList) diff --git a/src/VehicleSetup/FirmwareUpgradeController.cc b/src/VehicleSetup/FirmwareUpgradeController.cc index 8e704a94810906e12c7e9ca440864f3a91fa1106..1b4abbfc3544a146c1b383bb9c66b7d91e8c18c3 100644 --- a/src/VehicleSetup/FirmwareUpgradeController.cc +++ b/src/VehicleSetup/FirmwareUpgradeController.cc @@ -33,6 +33,8 @@ #include #include +#include +#include struct FirmwareToUrlElement_t { FirmwareUpgradeController::AutoPilotStackType_t stackType; @@ -75,6 +77,7 @@ FirmwareUpgradeController::FirmwareUpgradeController(void) connect(&_eraseTimer, &QTimer::timeout, this, &FirmwareUpgradeController::_eraseProgressTick); _initFirmwareHash(); + _determinePX4StableVersion(); } FirmwareUpgradeController::~FirmwareUpgradeController() @@ -827,3 +830,40 @@ FirmwareUpgradeController::FirmwareVehicleType_t FirmwareUpgradeController::vehi return _apmVehicleTypeFromCurrentVersionList[index]; } + +void FirmwareUpgradeController::_determinePX4StableVersion(void) +{ + QGCFileDownload* downloader = new QGCFileDownload(this); + connect(downloader, &QGCFileDownload::downloadFinished, this, &FirmwareUpgradeController::_px4StableGithubDownloadFinished); + connect(downloader, &QGCFileDownload::error, this, &FirmwareUpgradeController::_px4StableGithubDownloadError); + downloader->download(QStringLiteral("https://api.github.com/repos/PX4/Firmware/releases/latest")); +} + +void FirmwareUpgradeController::_px4StableGithubDownloadFinished(QString remoteFile, QString localFile) +{ + Q_UNUSED(remoteFile); + + QFile jsonFile(localFile); + if (!jsonFile.open(QIODevice::ReadOnly | QIODevice::Text)) { + qWarning() << "Unable to open github json file" << localFile << jsonFile.errorString(); + return; + } + QByteArray bytes = jsonFile.readAll(); + jsonFile.close(); + + QJsonParseError jsonParseError; + QJsonDocument doc = QJsonDocument::fromJson(bytes, &jsonParseError); + if (jsonParseError.error != QJsonParseError::NoError) { + qWarning() << "Unable to open json document" << localFile << jsonParseError.errorString(); + return; + } + QJsonObject json = doc.object(); + + _px4StableVersion = json["name"].toString(); + emit px4StableVersionChanged(_px4StableVersion); +} + +void FirmwareUpgradeController::_px4StableGithubDownloadError(QString errorMsg) +{ + qWarning() << "PX4 stable github download failed" << errorMsg; +} diff --git a/src/VehicleSetup/FirmwareUpgradeController.h b/src/VehicleSetup/FirmwareUpgradeController.h index 07357d6a8142ddb16d5dfe3331db8859776792e2..4ccbc5ce2d79b0f69b2df5212b022877e4f4e5e2 100644 --- a/src/VehicleSetup/FirmwareUpgradeController.h +++ b/src/VehicleSetup/FirmwareUpgradeController.h @@ -111,6 +111,7 @@ public: Q_PROPERTY(QString boardType MEMBER _foundBoardTypeName NOTIFY boardFound) Q_PROPERTY(FirmwareType_t selectedFirmwareType READ selectedFirmwareType WRITE setSelectedFirmwareType NOTIFY selectedFirmwareTypeChanged) Q_PROPERTY(QStringList apmAvailableVersions READ apmAvailableVersions NOTIFY apmAvailableVersionsChanged) + Q_PROPERTY(QString px4StableVersion READ px4StableVersion NOTIFY px4StableVersionChanged) /// TextArea for log output Q_PROPERTY(QQuickItem* statusLog READ statusLog WRITE setStatusLog) @@ -150,6 +151,7 @@ public: QString firmwareTypeAsString(FirmwareType_t type) const; QStringList apmAvailableVersions(void); + QString px4StableVersion(void) { return _px4StableVersion; } signals: void boardFound(void); @@ -160,6 +162,7 @@ signals: void error(void); void selectedFirmwareTypeChanged(FirmwareType_t firmwareType); void apmAvailableVersionsChanged(void); + void px4StableVersionChanged(const QString& px4StableVersion); private slots: void _downloadProgress(qint64 curr, qint64 total); @@ -178,6 +181,8 @@ private slots: void _eraseComplete(void); void _eraseProgressTick(void); void _apmVersionDownloadFinished(QString remoteFile, QString localFile); + void _px4StableGithubDownloadFinished(QString remoteFile, QString localFile); + void _px4StableGithubDownloadError(QString errorMsg); private: void _getFirmwareFile(FirmwareIdentifier firmwareId); @@ -188,6 +193,7 @@ private: void _loadAPMVersions(QGCSerialPortInfo::BoardType_t boardType); QHash* _firmwareHashForBoardId(int boardId); QHash* _firmwareHashForBoardType(QGCSerialPortInfo::BoardType_t boardType); + void _determinePX4StableVersion(void); QString _portName; QString _portDescription; @@ -243,6 +249,8 @@ private: FirmwareType_t _selectedFirmwareType; FirmwareImage* _image; + + QString _px4StableVersion; // Version strange for latest PX4 stable }; // global hashing function