18QGC_LOGGING_CATEGORY(FirmwareUpgradeControllerLog,
"Vehicle.VehicleSetup.FirmwareUpgradeController")
19#include <QtCore/QStandardPaths>
20#include <QtCore/QJsonDocument>
21#include <QtCore/QJsonObject>
22#include <QtCore/QJsonArray>
33 {9,
"px4_fmu-v2_default"},
34 {255,
"px4_fmu-v3_default"},
35 {11,
"px4_fmu-v4_default"},
36 {13,
"px4_fmu-v4pro_default"},
37 {20,
"uvify_core_default"},
38 {50,
"px4_fmu-v5_default"},
39 {51,
"px4_fmu-v5x_default"},
40 {52,
"px4_fmu-v6_default"},
41 {53,
"px4_fmu-v6x_default"},
42 {54,
"px4_fmu-v6u_default"},
43 {56,
"px4_fmu-v6c_default"},
44 {57,
"ark_fmu-v6x_default"},
45 {59,
"ark_fpv_default"},
46 {35,
"px4_fmu-v6xrt_default"},
47 {55,
"sky-drones_smartap-airlink_default"},
48 {88,
"airmind_mindpx-v2_default"},
49 {12,
"bitcraze_crazyflie_default"},
50 {14,
"bitcraze_crazyflie21_default"},
51 {42,
"omnibus_f4sd_default"},
52 {33,
"mro_x21_default"},
53 {65,
"intel_aerofc-v1_default"},
54 {123,
"holybro_kakutef7_default"},
55 {41775,
"modalai_fc-v1_default"},
56 {41776,
"modalai_fc-v2_default"},
57 {78,
"holybro_pix32v5_default"},
58 {79,
"holybro_can-gps-v1_default"},
59 {28,
"nxp_fmuk66-v3_default"},
60 {30,
"nxp_fmuk66-e_default"},
61 {31,
"nxp_fmurt1062-v1_default"},
62 {37,
"nxp_mr-tropic_default"},
63 {85,
"freefly_can-rtk-gps_default"},
64 {120,
"cubepilot_cubeyellow_default"},
65 {136,
"mro_x21-777_default"},
66 {139,
"holybro_durandal-v1_default"},
67 {140,
"cubepilot_cubeorange_default"},
68 {1063,
"cubepilot_cubeorangeplus_default"},
69 {141,
"mro_ctrl-zero-f7_default"},
70 {142,
"mro_ctrl-zero-f7-oem_default"},
71 {212,
"thepeach_k1_default"},
72 {213,
"thepeach_r1_default"},
73 {1009,
"cuav_nora_default"},
74 {1010,
"cuav_x7pro_default"},
75 {1017,
"mro_pixracerpro_default"},
76 {1022,
"mro_ctrl-zero-classic_default"},
77 {1023,
"mro_ctrl-zero-h7_default"},
78 {1024,
"mro_ctrl-zero-h7-oem_default"},
79 {1048,
"holybro_kakuteh7_default"},
80 {1053,
"holybro_kakuteh7v2_default"},
81 {1054,
"holybro_kakuteh7mini_default"},
82 {1058,
"holybro_kakuteh7mini_default"},
83 {1105,
"holybro_kakuteh7-wing_default"},
84 {1110,
"jfb_jfb110_default"},
85 {1200,
"jfb_jfb200_default"},
86 {1123,
"siyi_n7_default"},
87 {1124,
"3dr_ctrl-zero-h7-oem-revg_default"},
88 {5600,
"zeroone_x6_default"},
89 {6110,
"svehicle_e2_default"},
90 {7000,
"cuav_7-nano_default"},
91 {7001,
"cuav_fmu-v6x_default"},
92 {7002,
"cuav_x25-evo_default"},
93 {7003,
"cuav_x25-super_default"},
94 {7004,
"cuav_x25-mega_default"}
106 : _singleFirmwareURL (
QGCCorePlugin::instance()->options()->firmwareUpgradeSingleURL())
107 , _singleFirmwareMode (!_singleFirmwareURL.isEmpty())
108 , _downloadingFirmwareList (false)
109 , _statusLog (nullptr)
110 , _selectedFirmwareBuildType (StableFirmware)
112 , _apmBoardDescriptionReplaceText (
"<APMBoardDescription>")
113 , _apmChibiOSSetting (
SettingsManager::instance()->firmwareUpgradeSettings()->apmChibiOS())
114 , _apmVehicleTypeSetting (
SettingsManager::instance()->firmwareUpgradeSettings()->apmVehicleType())
116 _manifestMavFirmwareVersionTypeToFirmwareBuildTypeMap[
"OFFICIAL"] =
StableFirmware;
117 _manifestMavFirmwareVersionTypeToFirmwareBuildTypeMap[
"BETA"] =
BetaFirmware;
118 _manifestMavFirmwareVersionTypeToFirmwareBuildTypeMap[
"DEV"] =
DeveloperFirmware;
120 _manifestMavTypeToFirmwareVehicleTypeMap[
"Copter"] =
CopterFirmware;
121 _manifestMavTypeToFirmwareVehicleTypeMap[
"HELICOPTER"] =
HeliFirmware;
122 _manifestMavTypeToFirmwareVehicleTypeMap[
"FIXED_WING"] =
PlaneFirmware;
123 _manifestMavTypeToFirmwareVehicleTypeMap[
"GROUND_ROVER"] =
RoverFirmware;
124 _manifestMavTypeToFirmwareVehicleTypeMap[
"SUBMARINE"] =
SubFirmware;
127 Q_CHECK_PTR(_threadController);
142 connect(&_eraseTimer, &QTimer::timeout,
this, &FirmwareUpgradeController::_eraseProgressTick);
144#if !defined(QGC_NO_ARDUPILOT_DIALECT)
145 connect(_apmChibiOSSetting, &
Fact::rawValueChanged,
this, &FirmwareUpgradeController::_buildAPMFirmwareNames);
146 connect(_apmVehicleTypeSetting, &
Fact::rawValueChanged,
this, &FirmwareUpgradeController::_buildAPMFirmwareNames);
149 _determinePX4StableVersion();
151#if !defined(QGC_NO_ARDUPILOT_DIALECT)
152 _downloadArduPilotManifest();
171 _bootloaderFound =
false;
172 _startFlashWhenBootloaderFound =
false;
180 qCDebug(FirmwareUpgradeControllerLog) <<
"FirmwareUpgradeController::flash stackType:firmwareType:vehicleType" << stackType << firmwareType << vehicleType;
182 if (_bootloaderFound) {
183 _getFirmwareFile(firmwareId);
186 _startFlashWhenBootloaderFound =
true;
187 _startFlashWhenBootloaderFoundFirmwareIdentity = firmwareId;
188 _firmwareFilename.clear();
194 _firmwareFilename = firmwareFlashUrl;
195 if (_bootloaderFound) {
199 _startFlashWhenBootloaderFound =
true;
216 _flashCancelled =
true;
217 if (_activeDownloader) {
218 _activeDownloader->cancel();
220 _threadController->
cancel();
225 qCDebug(FirmwareUpgradeControllerLog) <<
"flashPort" << systemLocation;
226 _bootloaderFound =
false;
227 _startFlashWhenBootloaderFound =
false;
231void FirmwareUpgradeController::_portsAvailable(
const QVariantList& ports)
233 _availablePorts = ports;
244 for (
const auto& info : ports) {
245 if(info.canFlash()) {
246 info.getBoardInfo(boardType, boardName);
247 names.append(boardName);
254void FirmwareUpgradeController::_foundBoard(
bool firstAttempt,
const QSerialPortInfo& info,
int boardType, QString boardName)
258 if (!boardName.isEmpty()) {
259 _boardTypeName = boardName;
268 _startFlashWhenBootloaderFound =
false;
274 _startFlashWhenBootloaderFound =
true;
275 _startFlashWhenBootloaderFoundFirmwareIdentity = FirmwareIdentifier(
SiKRadio,
281 qCDebug(FirmwareUpgradeControllerLog) << _boardType << _boardTypeName;
286void FirmwareUpgradeController::_noBoardFound(
void)
291void FirmwareUpgradeController::_boardGone(
void)
298void FirmwareUpgradeController::_foundBoardInfo(
int bootloaderVersion,
int boardID,
int flashSize)
300 _bootloaderFound =
true;
301 _bootloaderVersion =
static_cast<uint32_t
>(bootloaderVersion);
302 _bootloaderBoardID =
static_cast<uint32_t
>(boardID);
303 _bootloaderBoardFlashSize =
static_cast<uint32_t
>(flashSize);
305 _appendStatusLog(tr(
"Connected to bootloader:"));
306 _appendStatusLog(tr(
" Version: %1").arg(_bootloaderVersion));
307 _appendStatusLog(tr(
" Board ID: %1").arg(_bootloaderBoardID));
308 _appendStatusLog(tr(
" Flash size: %1").arg(_bootloaderBoardFlashSize));
310 if (_startFlashWhenBootloaderFound) {
311 flash(_startFlashWhenBootloaderFoundFirmwareIdentity);
313 if (_rgManifestFirmwareInfo.length()) {
314 _buildAPMFirmwareNames();
322void FirmwareUpgradeController::_bootloaderSyncFailed(
void)
324 _errorCancel(
"Unable to sync with bootloader.");
327QHash<FirmwareUpgradeController::FirmwareIdentifier, QString>* FirmwareUpgradeController::_firmwareHashForBoardId(
int boardId)
329 _rgFirmwareDynamic.clear();
346 const QString px4Url{
"http://px4-travis.s3.amazonaws.com/Firmware/%1/%2.px4"};
355 return &_rgFirmwareDynamic;
358void FirmwareUpgradeController::_getFirmwareFile(FirmwareIdentifier firmwareId)
360 QHash<FirmwareIdentifier, QString>* prgFirmware = _firmwareHashForBoardId(
static_cast<int>(_bootloaderBoardID));
362 _firmwareFilename = QString();
363 _errorCancel(tr(
"Custom firmware selected but no filename given."));
365 if (prgFirmware->contains(firmwareId)) {
366 _firmwareFilename = prgFirmware->value(firmwareId);
368 _errorCancel(tr(
"Unable to find specified firmware for board type"));
373 if (_firmwareFilename.isEmpty()) {
374 _errorCancel(tr(
"No firmware file selected"));
381void FirmwareUpgradeController::_downloadFirmware(
void)
383 Q_ASSERT(!_firmwareFilename.isEmpty());
385 _flashCancelled =
false;
387 const bool isRemote = _firmwareFilename.startsWith(QStringLiteral(
"http"), Qt::CaseInsensitive);
389 _appendStatusLog(tr(
"Downloading firmware from %1").arg(_firmwareFilename));
391 _appendStatusLog(tr(
"Using firmware file %1").arg(_firmwareFilename));
395 _activeDownloader = downloader;
399 if (!downloader->
start(_firmwareFilename)) {
400 downloader->deleteLater();
401 _activeDownloader =
nullptr;
408void FirmwareUpgradeController::_firmwareDownloadProgress(qint64 curr, qint64 total)
412 _progressBar->setProperty(
"value",
static_cast<float>(curr) /
static_cast<float>(total));
417void FirmwareUpgradeController::_firmwareDownloadComplete(
bool success,
const QString &localFile,
const QString &errorMsg)
419 _activeDownloader =
nullptr;
421 if (_flashCancelled) {
427 const bool isRemote = _firmwareFilename.startsWith(QStringLiteral(
"http"), Qt::CaseInsensitive);
429 _appendStatusLog(tr(
"Download complete"));
437 if (!image->
load(localFile, _bootloaderBoardID)) {
438 _errorCancel(tr(
"Image load failed"));
443 if (!_bootloaderFound) {
444 _errorCancel(tr(
"Bootloader not found"));
448 if (_bootloaderBoardFlashSize != 0 && image->
imageSize() > _bootloaderBoardFlashSize) {
449 _errorCancel(tr(
"Image size of %1 is too large for board flash size %2").arg(image->
imageSize()).arg(_bootloaderBoardFlashSize));
453 _threadController->
flash(image);
454 }
else if (!errorMsg.isEmpty()) {
455 _errorCancel(errorMsg);
476void FirmwareUpgradeController::_flashComplete(
void)
481 _appendStatusLog(tr(
"Upgrade complete"),
true);
486void FirmwareUpgradeController::_error(
const QString&
errorString)
491 _errorCancel(QString(
"Error: %1").arg(
errorString));
494void FirmwareUpgradeController::_status(
const QString& statusString)
496 _appendStatusLog(statusString);
500void FirmwareUpgradeController::_updateProgress(
int curr,
int total)
504 _progressBar->setProperty(
"value",
static_cast<float>(curr) /
static_cast<float>(total));
509void FirmwareUpgradeController::_eraseProgressTick(
void)
512 _progressBar->setProperty(
"value",
static_cast<float>(_eraseTickCount*_eraseTickMsec) /
static_cast<float>(_eraseTotalMsec));
516void FirmwareUpgradeController::_appendStatusLog(
const QString& text,
bool critical)
518 Q_ASSERT(_statusLog);
523 varText = QString(
"<b>%1</b>").arg(text);
528 QMetaObject::invokeMethod(_statusLog,
530 Q_ARG(QString, varText));
533void FirmwareUpgradeController::_errorCancel(
const QString& msg)
535 _appendStatusLog(msg,
false);
536 _appendStatusLog(tr(
"Upgrade cancelled"),
true);
542void FirmwareUpgradeController::_eraseStarted(
void)
546 _eraseTimer.start(_eraseTickMsec);
550void FirmwareUpgradeController::_eraseComplete(
void)
557 _selectedFirmwareBuildType = firmwareType;
559 _buildAPMFirmwareNames();
562void FirmwareUpgradeController::_buildAPMFirmwareNames(
void)
564#if !defined(QGC_NO_ARDUPILOT_DIALECT)
565 bool chibios = _apmChibiOSSetting->
rawValue().toInt() == 0;
572 qCDebug(FirmwareUpgradeControllerLog) << QStringLiteral(
"_buildAPMFirmwareNames description(%1) vid(%2/0x%3) pid(%4/0x%5)").arg(
boardDescription).arg(boardVID).arg(boardVID, 1, 16).arg(boardPID).arg(boardPID, 1, 16);
574 _apmFirmwareNames.clear();
575 _apmFirmwareNamesBestIndex = -1;
576 _apmFirmwareUrls.clear();
578 QString apmDescriptionSuffix(
"-BL");
579 QString boardDescriptionPrefix;
582 int currentIndex = 0;
583 for (
const ManifestFirmwareInfo_t& firmwareInfo: _rgManifestFirmwareInfo) {
585 if (firmwareInfo.firmwareBuildType == _selectedFirmwareBuildType && firmwareInfo.chibios == chibios && firmwareInfo.vehicleType == vehicleType && firmwareInfo.boardId == rawBoardId) {
587 qCDebug(FirmwareUpgradeControllerLog) <<
"Skipping fmuv2 manifest entry for fmuv3 board:" << firmwareInfo.friendlyName <<
boardDescription << firmwareInfo.rgBootloaderPortString << firmwareInfo.url << firmwareInfo.vehicleType;
589 qCDebug(FirmwareUpgradeControllerLog) <<
"Board id match:" << firmwareInfo.friendlyName <<
boardDescription << firmwareInfo.rgBootloaderPortString << firmwareInfo.url << firmwareInfo.vehicleType;
591 if (bootloaderMatch && _apmFirmwareNamesBestIndex == -1 && firmwareInfo.rgBootloaderPortString.contains(
boardDescription)) {
592 _apmFirmwareNamesBestIndex = currentIndex;
593 qCDebug(FirmwareUpgradeControllerLog) <<
"Bootloader best match:" << firmwareInfo.friendlyName <<
boardDescription << firmwareInfo.rgBootloaderPortString << firmwareInfo.url << firmwareInfo.vehicleType;
599 _apmFirmwareNames.append(firmwareInfo.friendlyName);
600 _apmFirmwareUrls.append(firmwareInfo.url);
605 if (_apmFirmwareNamesBestIndex == -1) {
606 _apmFirmwareNamesBestIndex++;
607 if (_apmFirmwareNames.length() > 1) {
608 _apmFirmwareNames.prepend(tr(
"Choose board type"));
609 _apmFirmwareUrls.prepend(QString());
619 if (index < 0 || index >= _apmVehicleTypeFromCurrentVersionList.length()) {
620 qWarning() <<
"Invalid index, index:count" << index << _apmVehicleTypeFromCurrentVersionList.length();
624 return _apmVehicleTypeFromCurrentVersionList[index];
627void FirmwareUpgradeController::_determinePX4StableVersion(
void)
632 if (!downloader->
start(QStringLiteral(
"https://api.github.com/repos/PX4/Firmware/releases"))) {
633 qCWarning(FirmwareUpgradeControllerLog) <<
"PX4 releases github download did not start:" << downloader->
errorString();
634 downloader->deleteLater();
639void FirmwareUpgradeController::_px4ReleasesGithubDownloadComplete(
bool success,
const QString &localFile,
const QString &errorMsg)
642 QFile jsonFile(localFile);
643 if (!jsonFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
644 qCWarning(FirmwareUpgradeControllerLog) <<
"Unable to open github px4 releases json file" << localFile << jsonFile.errorString();
647 QByteArray bytes = jsonFile.readAll();
650 QJsonParseError jsonParseError;
651 QJsonDocument doc = QJsonDocument::fromJson(bytes, &jsonParseError);
652 if (jsonParseError.error != QJsonParseError::NoError) {
653 qCWarning(FirmwareUpgradeControllerLog) <<
"Unable to open px4 releases json document" << localFile << jsonParseError.errorString();
658 if (!doc.isArray()) {
659 qCWarning(FirmwareUpgradeControllerLog) <<
"px4 releases json document is not an array" << localFile;
662 QJsonArray releases = doc.array();
666 bool foundStable =
false;
667 bool foundBeta =
false;
668 for (
int i=0; i<releases.count() && (!foundStable || !foundBeta); i++) {
669 QJsonObject release = releases[i].toObject();
670 if (!foundStable && !release[
"prerelease"].toBool()) {
671 _px4StableVersion = release[
"name"].toString();
673 qCDebug(FirmwareUpgradeControllerLog()) <<
"Found px4 stable version" << _px4StableVersion;
675 }
else if (!foundBeta && release[
"prerelease"].toBool()) {
676 _px4BetaVersion = release[
"name"].toString();
678 qCDebug(FirmwareUpgradeControllerLog()) <<
"Found px4 beta version" << _px4BetaVersion;
684 qCDebug(FirmwareUpgradeControllerLog()) <<
"Unable to find px4 stable version" << localFile;
687 qCDebug(FirmwareUpgradeControllerLog()) <<
"Unable to find px4 beta version" << localFile;
689 }
else if (!errorMsg.isEmpty()) {
690 qCWarning(FirmwareUpgradeControllerLog) <<
"PX4 releases github download failed" << errorMsg;
694void FirmwareUpgradeController::_downloadArduPilotManifest(
void)
696 _downloadingFirmwareList =
true;
704 if (!downloader->
start(QStringLiteral(
"https://firmware.ardupilot.org/manifest.json.gz"))) {
705 qCWarning(FirmwareUpgradeControllerLog) <<
"ArduPilot Manifest download did not start:" << downloader->
errorString();
706 downloader->deleteLater();
707 _downloadingFirmwareList =
false;
712void FirmwareUpgradeController::_ardupilotManifestDownloadComplete(
bool success,
const QString &localFile,
const QString &errorMsg)
714 const auto clearDownloadState = [
this]() {
715 if (_downloadingFirmwareList) {
716 _downloadingFirmwareList =
false;
722 qCDebug(FirmwareUpgradeControllerLog) <<
"_ardupilotManifestDownloadFinished" << localFile;
728 qCWarning(FirmwareUpgradeControllerLog) <<
"Json file read failed" <<
errorString;
729 clearDownloadState();
733 QJsonObject json = doc.object();
734 QJsonArray rgFirmware = json[_manifestFirmwareJsonKey].toArray();
736 for (
int i=0; i<rgFirmware.count(); i++) {
737 const QJsonObject& firmwareJson = rgFirmware[i].toObject();
739 FirmwareVehicleType_t firmwareVehicleType = _manifestMavTypeToFirmwareVehicleType(firmwareJson[_manifestMavTypeJsonKey].toString());
740 FirmwareBuildType_t firmwareBuildType = _manifestMavFirmwareVersionTypeToFirmwareBuildType(firmwareJson[_manifestMavFirmwareVersionTypeJsonKey].toString());
741 QString
format = firmwareJson[_manifestFormatJsonKey].toString();
742 QString platform = firmwareJson[_manifestPlatformKey].toString();
745 if (platform.contains(
"-heli") && firmwareVehicleType !=
HeliFirmware) {
749 _rgManifestFirmwareInfo.append(ManifestFirmwareInfo_t());
750 ManifestFirmwareInfo_t& firmwareInfo = _rgManifestFirmwareInfo.last();
752 firmwareInfo.boardId =
static_cast<uint32_t
>(firmwareJson[_manifestBoardIdJsonKey].toInt());
753 firmwareInfo.firmwareBuildType = firmwareBuildType;
754 firmwareInfo.vehicleType = firmwareVehicleType;
755 firmwareInfo.url = firmwareJson[_manifestUrlJsonKey].toString();
756 firmwareInfo.version = firmwareJson[_manifestMavFirmwareVersionJsonKey].toString();
757 firmwareInfo.chibios =
format == QStringLiteral(
"apj"); firmwareInfo.fmuv2 = platform.contains(QStringLiteral(
"fmuv2"));
759 QJsonArray bootloaderArray = firmwareJson[_manifestBootloaderStrJsonKey].toArray();
760 for (
int j=0; j<bootloaderArray.count(); j++) {
761 firmwareInfo.rgBootloaderPortString.append(bootloaderArray[j].toString());
764 QJsonArray usbidArray = firmwareJson[_manifestUSBIDJsonKey].toArray();
765 for (
int j=0; j<usbidArray.count(); j++) {
766 QStringList vidpid = usbidArray[j].toString().split(
'/');
767 QString vid = vidpid[0];
768 QString pid = vidpid[1];
771 firmwareInfo.rgVID.append(vid.right(vid.length() - 2).toInt(&ok, 16));
772 firmwareInfo.rgPID.append(pid.right(pid.length() - 2).toInt(&ok, 16));
775 QString brandName = firmwareJson[_manifestBrandNameKey].toString();
776 firmwareInfo.friendlyName = QStringLiteral(
"%1 - %2").arg(brandName.isEmpty() ? platform : brandName).arg(firmwareInfo.version);
780 if (_bootloaderFound) {
781 _buildAPMFirmwareNames();
784 clearDownloadState();
785 }
else if (!errorMsg.isEmpty()) {
786 qCWarning(FirmwareUpgradeControllerLog) <<
"ArduPilot Manifest download failed" << errorMsg;
787 clearDownloadState();
793 if (_manifestMavFirmwareVersionTypeToFirmwareBuildTypeMap.contains(manifestMavFirmwareVersionType)) {
794 return _manifestMavFirmwareVersionTypeToFirmwareBuildTypeMap[manifestMavFirmwareVersionType];
802 if (_manifestMavTypeToFirmwareVehicleTypeMap.contains(manifestMavType)) {
803 return _manifestMavTypeToFirmwareVehicleTypeMap[manifestMavType];
uint qHash(const FirmwareUpgradeController::FirmwareIdentifier &firmwareId)
static QMap< int, QString > px4_board_name_map
Unified file download utility with decompression, verification, and QML support.
#define QGC_LOGGING_CATEGORY(name, categoryStr)
static const int boardIDSiKRadio1060
Newer radio based on SI1060 chip.
static const int boardIDSiKRadio1000
Original radio based on SI1000 chip.
static const int boardIDPX4FMUV2
PX4 V2 board, as from USB PID.
static const int boardIDPX4FMUV3
void rawValueChanged(const QVariant &value)
QVariant rawValue() const
Value after translation.
Support for Intel Hex firmware file.
bool load(const QString &imageFilename, uint32_t boardId)
void statusMessage(const QString &warningtring)
uint32_t imageSize(void) const
Returns the number of bytes in the image.
void errorMessage(const QString &errorString)
FirmwareVehicleType_t firmwareVehicleType
AutoPilotStackType_t autopilotStackType
FirmwareBuildType_t firmwareType
Q_INVOKABLE void startBoardSearch(void)
TextArea for log output.
Q_INVOKABLE void flash(AutoPilotStackType_t stackType, FirmwareBuildType_t firmwareType=StableFirmware, FirmwareVehicleType_t vehicleType=DefaultVehicleFirmware)
Called when the firmware type has been selected by the user to continue the flash process.
void apmFirmwareNamesChanged(void)
Q_INVOKABLE FirmwareVehicleType_t vehicleTypeFromFirmwareSelectionIndex(int index)
QString boardDescription(void)
void px4StableVersionChanged(const QString &px4StableVersion)
FirmwareUpgradeController(void)
@Brief Constructs a new FirmwareUpgradeController Widget. This widget is used within the PX4VehicleCo...
Q_INVOKABLE void cancel(void)
Cancels whatever state the upgrade worker thread is in.
void showFirmwareSelectDlg(void)
Q_INVOKABLE void flashSingleFirmwareMode(FirmwareBuildType_t firmwareType)
Called to flash when upgrade is running in singleFirmwareMode.
Q_INVOKABLE void flashPort(const QString &systemLocation)
Selects which serial port to flash. The worker will wait for this port to be in bootloader mode and t...
Q_INVOKABLE QStringList availableBoardsName(void)
Return a human friendly string of available boards.
void selectedFirmwareBuildTypeChanged(FirmwareBuildType_t firmwareType)
QString firmwareTypeAsString(FirmwareBuildType_t type) const
returns firmware type as a string
void setSelectedFirmwareBuildType(FirmwareBuildType_t firmwareType)
void downloadingFirmwareListChanged(bool downloadingFirmwareList)
~FirmwareUpgradeController()
Q_INVOKABLE void flashFirmwareUrl(QString firmwareUrl)
void availablePortsChanged(void)
void setConnectionsAllowed()
Sets the flag to allow new connections to be made.
static LinkManager * instance()
void setConnectionsSuspended(const QString &reason)
static MultiVehicleManager * instance()
Provides methods to interact with the bootloader. The commands themselves are signalled across to PX4...
void updateProgress(int curr, int total)
void portsAvailable(const QVariantList &ports)
void setTargetPort(const QString &systemLocation)
Tells the worker to flash a specific port (selected by the user) when it appears in bootloader mode.
void error(const QString &errorString)
void startFindBoardLoop(void)
Begins the process of searching for a supported board connected to any serial port....
void flash(const FirmwareImage *image)
void foundBoard(bool firstAttempt, const QGCSerialPortInfo &portInfo, int boardType, QString boardName)
void status(const QString &status)
void foundBoardInfo(int bootloaderVersion, int boardID, int flashSize)
Extension mechanism for generic, non-firmware-specific customization of QGC.
File download with progress, decompression, and hash verification.
void finished(bool success, const QString &localPath, const QString &errorMessage)
bool start(const QString &remoteUrl)
QString errorString() const
void setAutoDecompress(bool enabled)
void downloadProgress(qint64 bytesReceived, qint64 totalBytes)
Emitted during download with byte counts.
static QList< QGCSerialPortInfo > availablePorts()
Override of QSerialPortInfo::availablePorts.
Provides information about existing serial ports.
quint16 productIdentifier() const
Returns the 16-bit product number for the serial port, if available; otherwise returns zero.
QString manufacturer() const
Returns the manufacturer string of the serial port, if available; otherwise returns an empty string.
QString portName() const
Returns the name of the serial port.
QString description() const
Returns the description string of the serial port, if available; otherwise returns an empty string.
quint16 vendorIdentifier() const
Returns the 16-bit vendor number for the serial port, if available; otherwise returns zero.
Provides access to all app settings.
bool isJsonFile(const QByteArray &bytes, QJsonDocument &jsonDoc, QString &errorString)
Determines whether an in-memory byte buffer contains parseable JSON content.
FirmwareUpgradeController::FirmwareVehicleType_t vehicleType
FirmwareUpgradeController::FirmwareBuildType_t firmwareType
FirmwareUpgradeController::AutoPilotStackType_t stackType