18#include <QtCore/QStandardPaths>
19#include <QtCore/QJsonDocument>
20#include <QtCore/QJsonObject>
21#include <QtCore/QJsonArray>
32 {9,
"px4_fmu-v2_default"},
33 {255,
"px4_fmu-v3_default"},
34 {11,
"px4_fmu-v4_default"},
35 {13,
"px4_fmu-v4pro_default"},
36 {20,
"uvify_core_default"},
37 {50,
"px4_fmu-v5_default"},
38 {51,
"px4_fmu-v5x_default"},
39 {52,
"px4_fmu-v6_default"},
40 {53,
"px4_fmu-v6x_default"},
41 {54,
"px4_fmu-v6u_default"},
42 {56,
"px4_fmu-v6c_default"},
43 {57,
"ark_fmu-v6x_default"},
44 {59,
"ark_fpv_default"},
45 {35,
"px4_fmu-v6xrt_default"},
46 {55,
"sky-drones_smartap-airlink_default"},
47 {88,
"airmind_mindpx-v2_default"},
48 {12,
"bitcraze_crazyflie_default"},
49 {14,
"bitcraze_crazyflie21_default"},
50 {42,
"omnibus_f4sd_default"},
51 {33,
"mro_x21_default"},
52 {65,
"intel_aerofc-v1_default"},
53 {123,
"holybro_kakutef7_default"},
54 {41775,
"modalai_fc-v1_default"},
55 {41776,
"modalai_fc-v2_default"},
56 {78,
"holybro_pix32v5_default"},
57 {79,
"holybro_can-gps-v1_default"},
58 {28,
"nxp_fmuk66-v3_default"},
59 {30,
"nxp_fmuk66-e_default"},
60 {31,
"nxp_fmurt1062-v1_default"},
61 {37,
"nxp_mr-tropic_default"},
62 {85,
"freefly_can-rtk-gps_default"},
63 {120,
"cubepilot_cubeyellow_default"},
64 {136,
"mro_x21-777_default"},
65 {139,
"holybro_durandal-v1_default"},
66 {140,
"cubepilot_cubeorange_default"},
67 {1063,
"cubepilot_cubeorangeplus_default"},
68 {141,
"mro_ctrl-zero-f7_default"},
69 {142,
"mro_ctrl-zero-f7-oem_default"},
70 {212,
"thepeach_k1_default"},
71 {213,
"thepeach_r1_default"},
72 {1009,
"cuav_nora_default"},
73 {1010,
"cuav_x7pro_default"},
74 {1017,
"mro_pixracerpro_default"},
75 {1022,
"mro_ctrl-zero-classic_default"},
76 {1023,
"mro_ctrl-zero-h7_default"},
77 {1024,
"mro_ctrl-zero-h7-oem_default"},
78 {1048,
"holybro_kakuteh7_default"},
79 {1053,
"holybro_kakuteh7v2_default"},
80 {1054,
"holybro_kakuteh7mini_default"},
81 {1058,
"holybro_kakuteh7mini_default"},
82 {1105,
"holybro_kakuteh7-wing_default"},
83 {1110,
"jfb_jfb110_default"},
84 {1200,
"jfb_jfb200_default"},
85 {1123,
"siyi_n7_default"},
86 {1124,
"3dr_ctrl-zero-h7-oem-revg_default"},
87 {5600,
"zeroone_x6_default"},
88 {6110,
"svehicle_e2_default"},
89 {7000,
"cuav_7-nano_default"},
90 {7001,
"cuav_fmu-v6x_default"},
91 {7002,
"cuav_x25-evo_default"},
92 {7003,
"cuav_x25-super_default"}
104 : _singleFirmwareURL (
QGCCorePlugin::instance()->options()->firmwareUpgradeSingleURL())
105 , _singleFirmwareMode (!_singleFirmwareURL.isEmpty())
106 , _downloadingFirmwareList (false)
107 , _statusLog (nullptr)
108 , _selectedFirmwareBuildType (StableFirmware)
110 , _apmBoardDescriptionReplaceText (
"<APMBoardDescription>")
111 , _apmChibiOSSetting (
SettingsManager::instance()->firmwareUpgradeSettings()->apmChibiOS())
112 , _apmVehicleTypeSetting (
SettingsManager::instance()->firmwareUpgradeSettings()->apmVehicleType())
114 _manifestMavFirmwareVersionTypeToFirmwareBuildTypeMap[
"OFFICIAL"] =
StableFirmware;
115 _manifestMavFirmwareVersionTypeToFirmwareBuildTypeMap[
"BETA"] =
BetaFirmware;
116 _manifestMavFirmwareVersionTypeToFirmwareBuildTypeMap[
"DEV"] =
DeveloperFirmware;
118 _manifestMavTypeToFirmwareVehicleTypeMap[
"Copter"] =
CopterFirmware;
119 _manifestMavTypeToFirmwareVehicleTypeMap[
"HELICOPTER"] =
HeliFirmware;
120 _manifestMavTypeToFirmwareVehicleTypeMap[
"FIXED_WING"] =
PlaneFirmware;
121 _manifestMavTypeToFirmwareVehicleTypeMap[
"GROUND_ROVER"] =
RoverFirmware;
122 _manifestMavTypeToFirmwareVehicleTypeMap[
"SUBMARINE"] =
SubFirmware;
125 Q_CHECK_PTR(_threadController);
139 connect(&_eraseTimer, &QTimer::timeout,
this, &FirmwareUpgradeController::_eraseProgressTick);
141#if !defined(QGC_NO_ARDUPILOT_DIALECT)
142 connect(_apmChibiOSSetting, &
Fact::rawValueChanged,
this, &FirmwareUpgradeController::_buildAPMFirmwareNames);
143 connect(_apmVehicleTypeSetting, &
Fact::rawValueChanged,
this, &FirmwareUpgradeController::_buildAPMFirmwareNames);
146 _determinePX4StableVersion();
148#if !defined(QGC_NO_ARDUPILOT_DIALECT)
149 _downloadArduPilotManifest();
155 LinkManager::instance()->setConnectionsAllowed();
158void FirmwareUpgradeController::startBoardSearch(
void)
160 LinkManager::instance()->setConnectionsSuspended(tr(
"Connect not allowed during Firmware Upgrade."));
163 if (!MultiVehicleManager::instance()->activeVehicle()) {
165 LinkManager::instance()->disconnectAll();
168 _bootloaderFound =
false;
169 _startFlashWhenBootloaderFound =
false;
177 qCDebug(FirmwareUpgradeLog) <<
"FirmwareUpgradeController::flash stackType:firmwareType:vehicleType" << stackType << firmwareType << vehicleType;
179 if (_bootloaderFound) {
180 _getFirmwareFile(firmwareId);
183 _startFlashWhenBootloaderFound =
true;
184 _startFlashWhenBootloaderFoundFirmwareIdentity = firmwareId;
185 _firmwareFilename.clear();
191 _firmwareFilename = firmwareFlashUrl;
192 if (_bootloaderFound) {
196 _startFlashWhenBootloaderFound =
true;
213 _threadController->
cancel();
223 for (
const auto& info : ports) {
224 if(info.canFlash()) {
225 info.getBoardInfo(boardType, boardName);
226 names.append(boardName);
233void FirmwareUpgradeController::_foundBoard(
bool firstAttempt,
const QSerialPortInfo& info,
int boardType, QString boardName)
237 _boardTypeName = boardName;
241 _startFlashWhenBootloaderFound =
false;
247 _startFlashWhenBootloaderFound =
true;
248 _startFlashWhenBootloaderFoundFirmwareIdentity = FirmwareIdentifier(
SiKRadio,
254 qCDebug(FirmwareUpgradeLog) << _boardType << _boardTypeName;
259void FirmwareUpgradeController::_noBoardFound(
void)
264void FirmwareUpgradeController::_boardGone(
void)
271void FirmwareUpgradeController::_foundBoardInfo(
int bootloaderVersion,
int boardID,
int flashSize)
273 _bootloaderFound =
true;
274 _bootloaderVersion =
static_cast<uint32_t
>(bootloaderVersion);
275 _bootloaderBoardID =
static_cast<uint32_t
>(boardID);
276 _bootloaderBoardFlashSize =
static_cast<uint32_t
>(flashSize);
278 _appendStatusLog(tr(
"Connected to bootloader:"));
279 _appendStatusLog(tr(
" Version: %1").arg(_bootloaderVersion));
280 _appendStatusLog(tr(
" Board ID: %1").arg(_bootloaderBoardID));
281 _appendStatusLog(tr(
" Flash size: %1").arg(_bootloaderBoardFlashSize));
283 if (_startFlashWhenBootloaderFound) {
284 flash(_startFlashWhenBootloaderFoundFirmwareIdentity);
286 if (_rgManifestFirmwareInfo.length()) {
287 _buildAPMFirmwareNames();
295void FirmwareUpgradeController::_bootloaderSyncFailed(
void)
297 _errorCancel(
"Unable to sync with bootloader.");
300QHash<FirmwareUpgradeController::FirmwareIdentifier, QString>* FirmwareUpgradeController::_firmwareHashForBoardId(
int boardId)
302 _rgFirmwareDynamic.clear();
319 const QString px4Url{
"http://px4-travis.s3.amazonaws.com/Firmware/%1/%2.px4"};
328 return &_rgFirmwareDynamic;
331void FirmwareUpgradeController::_getFirmwareFile(FirmwareIdentifier firmwareId)
333 QHash<FirmwareIdentifier, QString>* prgFirmware = _firmwareHashForBoardId(
static_cast<int>(_bootloaderBoardID));
335 _firmwareFilename = QString();
336 _errorCancel(tr(
"Custom firmware selected but no filename given."));
338 if (prgFirmware->contains(firmwareId)) {
339 _firmwareFilename = prgFirmware->value(firmwareId);
341 _errorCancel(tr(
"Unable to find specified firmware for board type"));
346 if (_firmwareFilename.isEmpty()) {
347 _errorCancel(tr(
"No firmware file selected"));
354void FirmwareUpgradeController::_downloadFirmware(
void)
356 Q_ASSERT(!_firmwareFilename.isEmpty());
358 _appendStatusLog(tr(
"Downloading firmware..."));
359 _appendStatusLog(tr(
" From: %1").arg(_firmwareFilename));
365 if (!downloader->
start(_firmwareFilename)) {
366 downloader->deleteLater();
367 _errorCancel(downloader->errorString());
373void FirmwareUpgradeController::_firmwareDownloadProgress(qint64 curr, qint64 total)
377 _progressBar->setProperty(
"value",
static_cast<float>(curr) /
static_cast<float>(total));
382void FirmwareUpgradeController::_firmwareDownloadComplete(
bool success,
const QString &localFile,
const QString &errorMsg)
385 _appendStatusLog(tr(
"Download complete"));
392 if (!image->
load(localFile, _bootloaderBoardID)) {
393 _errorCancel(tr(
"Image load failed"));
398 if (!_bootloaderFound) {
399 _errorCancel(tr(
"Bootloader not found"));
403 if (_bootloaderBoardFlashSize != 0 && image->
imageSize() > _bootloaderBoardFlashSize) {
404 _errorCancel(tr(
"Image size of %1 is too large for board flash size %2").arg(image->
imageSize()).arg(_bootloaderBoardFlashSize));
408 _threadController->
flash(image);
409 }
else if (!errorMsg.isEmpty()) {
410 _errorCancel(errorMsg);
431void FirmwareUpgradeController::_flashComplete(
void)
436 _appendStatusLog(tr(
"Upgrade complete"),
true);
437 _appendStatusLog(
"------------------------------------------",
false);
439 LinkManager::instance()->setConnectionsAllowed();
442void FirmwareUpgradeController::_error(
const QString&
errorString)
447 _errorCancel(QString(
"Error: %1").arg(
errorString));
450void FirmwareUpgradeController::_status(
const QString& statusString)
452 _appendStatusLog(statusString);
456void FirmwareUpgradeController::_updateProgress(
int curr,
int total)
460 _progressBar->setProperty(
"value",
static_cast<float>(curr) /
static_cast<float>(total));
465void FirmwareUpgradeController::_eraseProgressTick(
void)
468 _progressBar->setProperty(
"value",
static_cast<float>(_eraseTickCount*_eraseTickMsec) /
static_cast<float>(_eraseTotalMsec));
472void FirmwareUpgradeController::_appendStatusLog(
const QString& text,
bool critical)
474 Q_ASSERT(_statusLog);
479 varText = QString(
"<font color=\"yellow\">%1</font>").arg(text);
484 QMetaObject::invokeMethod(_statusLog,
486 Q_ARG(QString, varText));
489void FirmwareUpgradeController::_errorCancel(
const QString& msg)
491 _appendStatusLog(msg,
false);
492 _appendStatusLog(tr(
"Upgrade cancelled"),
true);
493 _appendStatusLog(
"------------------------------------------",
false);
496 LinkManager::instance()->setConnectionsAllowed();
499void FirmwareUpgradeController::_eraseStarted(
void)
503 _eraseTimer.start(_eraseTickMsec);
506void FirmwareUpgradeController::_eraseComplete(
void)
513 _selectedFirmwareBuildType = firmwareType;
515 _buildAPMFirmwareNames();
518void FirmwareUpgradeController::_buildAPMFirmwareNames(
void)
520#if !defined(QGC_NO_ARDUPILOT_DIALECT)
521 bool chibios = _apmChibiOSSetting->rawValue().toInt() == 0;
528 qCDebug(FirmwareUpgradeLog) << 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);
530 _apmFirmwareNames.clear();
531 _apmFirmwareNamesBestIndex = -1;
532 _apmFirmwareUrls.clear();
534 QString apmDescriptionSuffix(
"-BL");
535 QString boardDescriptionPrefix;
538 int currentIndex = 0;
539 for (
const ManifestFirmwareInfo_t& firmwareInfo: _rgManifestFirmwareInfo) {
541 if (firmwareInfo.firmwareBuildType == _selectedFirmwareBuildType && firmwareInfo.chibios == chibios && firmwareInfo.vehicleType == vehicleType && firmwareInfo.boardId == rawBoardId) {
543 qCDebug(FirmwareUpgradeLog) <<
"Skipping fmuv2 manifest entry for fmuv3 board:" << firmwareInfo.friendlyName <<
boardDescription << firmwareInfo.rgBootloaderPortString << firmwareInfo.url << firmwareInfo.vehicleType;
545 qCDebug(FirmwareUpgradeLog) <<
"Board id match:" << firmwareInfo.friendlyName <<
boardDescription << firmwareInfo.rgBootloaderPortString << firmwareInfo.url << firmwareInfo.vehicleType;
547 if (bootloaderMatch && _apmFirmwareNamesBestIndex == -1 && firmwareInfo.rgBootloaderPortString.contains(
boardDescription)) {
548 _apmFirmwareNamesBestIndex = currentIndex;
549 qCDebug(FirmwareUpgradeLog) <<
"Bootloader best match:" << firmwareInfo.friendlyName <<
boardDescription << firmwareInfo.rgBootloaderPortString << firmwareInfo.url << firmwareInfo.vehicleType;
555 _apmFirmwareNames.append(firmwareInfo.friendlyName);
556 _apmFirmwareUrls.append(firmwareInfo.url);
561 if (_apmFirmwareNamesBestIndex == -1) {
562 _apmFirmwareNamesBestIndex++;
563 if (_apmFirmwareNames.length() > 1) {
564 _apmFirmwareNames.prepend(tr(
"Choose board type"));
565 _apmFirmwareUrls.prepend(QString());
575 if (index < 0 || index >= _apmVehicleTypeFromCurrentVersionList.length()) {
576 qWarning() <<
"Invalid index, index:count" << index << _apmVehicleTypeFromCurrentVersionList.length();
580 return _apmVehicleTypeFromCurrentVersionList[index];
583void FirmwareUpgradeController::_determinePX4StableVersion(
void)
588 if (!downloader->
start(QStringLiteral(
"https://api.github.com/repos/PX4/Firmware/releases"))) {
589 qCWarning(FirmwareUpgradeLog) <<
"PX4 releases github download did not start:" << downloader->errorString();
590 downloader->deleteLater();
595void FirmwareUpgradeController::_px4ReleasesGithubDownloadComplete(
bool success,
const QString &localFile,
const QString &errorMsg)
598 QFile jsonFile(localFile);
599 if (!jsonFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
600 qCWarning(FirmwareUpgradeLog) <<
"Unable to open github px4 releases json file" << localFile << jsonFile.errorString();
603 QByteArray bytes = jsonFile.readAll();
606 QJsonParseError jsonParseError;
607 QJsonDocument doc = QJsonDocument::fromJson(bytes, &jsonParseError);
608 if (jsonParseError.error != QJsonParseError::NoError) {
609 qCWarning(FirmwareUpgradeLog) <<
"Unable to open px4 releases json document" << localFile << jsonParseError.errorString();
614 if (!doc.isArray()) {
615 qCWarning(FirmwareUpgradeLog) <<
"px4 releases json document is not an array" << localFile;
618 QJsonArray releases = doc.array();
622 bool foundStable =
false;
623 bool foundBeta =
false;
624 for (
int i=0; i<releases.count() && (!foundStable || !foundBeta); i++) {
625 QJsonObject release = releases[i].toObject();
626 if (!foundStable && !release[
"prerelease"].toBool()) {
627 _px4StableVersion = release[
"name"].toString();
629 qCDebug(FirmwareUpgradeLog()) <<
"Found px4 stable version" << _px4StableVersion;
631 }
else if (!foundBeta && release[
"prerelease"].toBool()) {
632 _px4BetaVersion = release[
"name"].toString();
634 qCDebug(FirmwareUpgradeLog()) <<
"Found px4 beta version" << _px4BetaVersion;
640 qCDebug(FirmwareUpgradeLog()) <<
"Unable to find px4 stable version" << localFile;
643 qCDebug(FirmwareUpgradeLog()) <<
"Unable to find px4 beta version" << localFile;
645 }
else if (!errorMsg.isEmpty()) {
646 qCWarning(FirmwareUpgradeLog) <<
"PX4 releases github download failed" << errorMsg;
650void FirmwareUpgradeController::_downloadArduPilotManifest(
void)
652 _downloadingFirmwareList =
true;
659 downloader->setAutoDecompress(
true);
660 if (!downloader->
start(QStringLiteral(
"https://firmware.ardupilot.org/manifest.json.gz"))) {
661 qCWarning(FirmwareUpgradeLog) <<
"ArduPilot Manifest download did not start:" << downloader->errorString();
662 downloader->deleteLater();
663 _downloadingFirmwareList =
false;
668void FirmwareUpgradeController::_ardupilotManifestDownloadComplete(
bool success,
const QString &localFile,
const QString &errorMsg)
670 const auto clearDownloadState = [
this]() {
671 if (_downloadingFirmwareList) {
672 _downloadingFirmwareList =
false;
678 qCDebug(FirmwareUpgradeLog) <<
"_ardupilotManifestDownloadFinished" << localFile;
684 qCWarning(FirmwareUpgradeLog) <<
"Json file read failed" <<
errorString;
685 clearDownloadState();
689 QJsonObject json = doc.object();
690 QJsonArray rgFirmware = json[_manifestFirmwareJsonKey].toArray();
692 for (
int i=0; i<rgFirmware.count(); i++) {
693 const QJsonObject& firmwareJson = rgFirmware[i].toObject();
695 FirmwareVehicleType_t firmwareVehicleType = _manifestMavTypeToFirmwareVehicleType(firmwareJson[_manifestMavTypeJsonKey].toString());
696 FirmwareBuildType_t firmwareBuildType = _manifestMavFirmwareVersionTypeToFirmwareBuildType(firmwareJson[_manifestMavFirmwareVersionTypeJsonKey].toString());
697 QString format = firmwareJson[_manifestFormatJsonKey].toString();
698 QString platform = firmwareJson[_manifestPlatformKey].toString();
701 if (platform.contains(
"-heli") && firmwareVehicleType !=
HeliFirmware) {
705 _rgManifestFirmwareInfo.append(ManifestFirmwareInfo_t());
706 ManifestFirmwareInfo_t& firmwareInfo = _rgManifestFirmwareInfo.last();
708 firmwareInfo.boardId =
static_cast<uint32_t
>(firmwareJson[_manifestBoardIdJsonKey].toInt());
709 firmwareInfo.firmwareBuildType = firmwareBuildType;
710 firmwareInfo.vehicleType = firmwareVehicleType;
711 firmwareInfo.url = firmwareJson[_manifestUrlJsonKey].toString();
712 firmwareInfo.version = firmwareJson[_manifestMavFirmwareVersionJsonKey].toString();
713 firmwareInfo.chibios = format == QStringLiteral(
"apj"); firmwareInfo.fmuv2 = platform.contains(QStringLiteral(
"fmuv2"));
715 QJsonArray bootloaderArray = firmwareJson[_manifestBootloaderStrJsonKey].toArray();
716 for (
int j=0; j<bootloaderArray.count(); j++) {
717 firmwareInfo.rgBootloaderPortString.append(bootloaderArray[j].toString());
720 QJsonArray usbidArray = firmwareJson[_manifestUSBIDJsonKey].toArray();
721 for (
int j=0; j<usbidArray.count(); j++) {
722 QStringList vidpid = usbidArray[j].toString().split(
'/');
723 QString vid = vidpid[0];
724 QString pid = vidpid[1];
727 firmwareInfo.rgVID.append(vid.right(vid.length() - 2).toInt(&ok, 16));
728 firmwareInfo.rgPID.append(pid.right(pid.length() - 2).toInt(&ok, 16));
731 QString brandName = firmwareJson[_manifestBrandNameKey].toString();
732 firmwareInfo.friendlyName = QStringLiteral(
"%1 - %2").arg(brandName.isEmpty() ? platform : brandName).arg(firmwareInfo.version);
736 if (_bootloaderFound) {
737 _buildAPMFirmwareNames();
740 clearDownloadState();
741 }
else if (!errorMsg.isEmpty()) {
742 qCWarning(FirmwareUpgradeLog) <<
"ArduPilot Manifest download failed" << errorMsg;
743 clearDownloadState();
749 if (_manifestMavFirmwareVersionTypeToFirmwareBuildTypeMap.contains(manifestMavFirmwareVersionType)) {
750 return _manifestMavFirmwareVersionTypeToFirmwareBuildTypeMap[manifestMavFirmwareVersionType];
758 if (_manifestMavTypeToFirmwareVehicleTypeMap.contains(manifestMavType)) {
759 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.
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)
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
bool downloadingFirmwareList MEMBER _downloadingFirmwareList NOTIFY downloadingFirmwareListChanged(QString boardPort READ boardPort NOTIFY boardFound) 1(QString boardDescription READ boardDescription NOTIFY boardFound) 1(QString boardType MEMBER _boardTypeName NOTIFY boardFound) 1(bool pixhawkBoard READ pixhawkBoard NOTIFY boardFound) 1(FirmwareBuildType_t selectedFirmwareBuildType READ selectedFirmwareBuildType WRITE setSelectedFirmwareBuildType NOTIFY selectedFirmwareBuildTypeChanged) 1(QStringList apmFirmwareNames MEMBER _apmFirmwareNames NOTIFY apmFirmwareNamesChanged) 1(int apmFirmwareNamesBestIndex MEMBER _apmFirmwareNamesBestIndex NOTIFY apmFirmwareNamesChanged) 1(QStringList apmFirmwareUrls MEMBER _apmFirmwareUrls NOTIFY apmFirmwareNamesChanged) 1(QString px4StableVersion READ px4StableVersion NOTIFY px4StableVersionChanged) 1(QString px4BetaVersion READ px4BetaVersion NOTIFY px4BetaVersionChanged) 1(QQuickItem *statusLog READ statusLog WRITE setStatusLog) 1(QQuickItem *progressBar READ progressBar WRITE setProgressBar) 1 void startBoardSearch(void)
TextArea for log output.
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)
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...
void cancel(void)
Cancels whatever state the upgrade worker thread is in.
void showFirmwareSelectDlg(void)
void flashSingleFirmwareMode(FirmwareBuildType_t firmwareType)
Called to flash when upgrade is running in singleFirmwareMode.
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)
~FirmwareUpgradeController()
void flashFirmwareUrl(QString firmwareUrl)
Provides methods to interact with the bootloader. The commands themselves are signalled across to PX4...
void updateProgress(int curr, int total)
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)
void finished(bool success, const QString &localPath, const QString &errorMessage)
bool start(const QString &remoteUrl)
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
QString manufacturer() const
QString description() const
quint16 vendorIdentifier() const
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