QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
FirmwareUpgradeController.h
Go to the documentation of this file.
1#pragma once
2
3#include <QtCore/QObject>
4#include <QtCore/QTimer>
5#include <QtGui/QPixmap>
6#include <QtQmlIntegration/QtQmlIntegration>
7#include <QtQuick/QQuickItem>
8
9#include "QGCSerialPortInfo.h"
10
11class PX4FirmwareUpgradeThread;
13class FirmwareImage;
14class Fact;
15
17
18// Firmware Upgrade MVC Controller for FirmwareUpgrade.qml.
19class FirmwareUpgradeController : public QObject
20{
21 Q_OBJECT
22 QML_ELEMENT
23#ifdef QGC_UNITTEST_BUILD
24 friend class FirmwareUpgradeControllerTest; // Unit test
25#endif
26public:
33
40
49
53
55 {
56 public:
60 : autopilotStackType(stack), firmwareType(firmware), firmwareVehicleType(vehicle) {}
61
62 bool operator==(const FirmwareIdentifier& firmwareId) const
63 {
64 return (firmwareId.autopilotStackType == autopilotStackType &&
65 firmwareId.firmwareType == firmwareType &&
66 firmwareId.firmwareVehicleType == firmwareVehicleType);
67 }
68
69 // members
73 };
74
77
78 Q_PROPERTY(bool downloadingFirmwareList MEMBER _downloadingFirmwareList NOTIFY downloadingFirmwareListChanged)
79 Q_PROPERTY(QString boardPort READ boardPort NOTIFY boardFound)
80 Q_PROPERTY(QString boardDescription READ boardDescription NOTIFY boardFound)
81 Q_PROPERTY(QString boardType MEMBER _boardTypeName NOTIFY boardFound)
82 Q_PROPERTY(bool pixhawkBoard READ pixhawkBoard NOTIFY boardFound)
84 Q_PROPERTY(QStringList apmFirmwareNames MEMBER _apmFirmwareNames NOTIFY apmFirmwareNamesChanged)
85 Q_PROPERTY(int apmFirmwareNamesBestIndex MEMBER _apmFirmwareNamesBestIndex NOTIFY apmFirmwareNamesChanged)
86 Q_PROPERTY(QStringList apmFirmwareUrls MEMBER _apmFirmwareUrls NOTIFY apmFirmwareNamesChanged)
87 Q_PROPERTY(QString px4StableVersion READ px4StableVersion NOTIFY px4StableVersionChanged)
88 Q_PROPERTY(QString px4BetaVersion READ px4BetaVersion NOTIFY px4BetaVersionChanged)
89
90
91 Q_PROPERTY(QQuickItem* statusLog READ statusLog WRITE setStatusLog)
92
93
94 Q_PROPERTY(QQuickItem* progressBar READ progressBar WRITE setProgressBar)
95
96
97 Q_INVOKABLE void startBoardSearch(void);
98
100 Q_INVOKABLE void cancel(void);
101
103 Q_INVOKABLE void flash(AutoPilotStackType_t stackType,
104 FirmwareBuildType_t firmwareType = StableFirmware,
106
107 Q_INVOKABLE void flashFirmwareUrl(QString firmwareUrl);
108
110 Q_INVOKABLE void flashSingleFirmwareMode(FirmwareBuildType_t firmwareType);
111
113
114 // overload, not exposed to qml side
115 void flash(const FirmwareIdentifier& firmwareId);
116
117 // Property accessors
118
119 QQuickItem* progressBar(void) { return _progressBar; }
120 void setProgressBar(QQuickItem* progressBar) { _progressBar = progressBar; }
121
122 QQuickItem* statusLog(void) { return _statusLog; }
123 void setStatusLog(QQuickItem* statusLog) { _statusLog = statusLog; }
124
125 QString boardPort(void) { return _boardInfo.portName(); }
126 QString boardDescription(void) { return _boardInfo.description(); }
127
128 FirmwareBuildType_t selectedFirmwareBuildType(void) { return _selectedFirmwareBuildType; }
130 QString firmwareTypeAsString(FirmwareBuildType_t type) const;
131
132 QString px4StableVersion (void) { return _px4StableVersion; }
133 QString px4BetaVersion (void) { return _px4BetaVersion; }
134
135 bool pixhawkBoard(void) const { return _boardType == QGCSerialPortInfo::BoardTypePixhawk; }
136
142 Q_INVOKABLE QStringList availableBoardsName(void);
143
144signals:
145 void boardFound (void);
147 void noBoardFound (void);
148 void boardGone (void);
149 void flashComplete (void);
150 void flashCancelled (void);
151 void error (void);
156 void downloadingFirmwareListChanged (bool downloadingFirmwareList);
157
158private slots:
159 void _firmwareDownloadProgress (qint64 curr, qint64 total);
160 void _firmwareDownloadComplete (bool success, const QString &localFile, const QString &errorMsg);
161 void _foundBoard (bool firstAttempt, const QSerialPortInfo& portInfo, int boardType, QString boardName);
162 void _noBoardFound (void);
163 void _boardGone (void);
164 void _foundBoardInfo (int bootloaderVersion, int boardID, int flashSize);
165 void _error (const QString& errorString);
166 void _status (const QString& statusString);
167 void _bootloaderSyncFailed (void);
168 void _flashComplete (void);
169 void _updateProgress (int curr, int total);
170 void _eraseStarted (void);
171 void _eraseComplete (void);
172 void _eraseProgressTick (void);
173 void _px4ReleasesGithubDownloadComplete (bool success, const QString &localFile, const QString &errorMsg);
174 void _ardupilotManifestDownloadComplete (bool success, const QString &localFile, const QString &errorMsg);
175 void _buildAPMFirmwareNames (void);
176
177private:
178 QHash<FirmwareIdentifier, QString>* _firmwareHashForBoardId(int boardId);
179 void _getFirmwareFile (FirmwareIdentifier firmwareId);
180 void _downloadFirmware (void);
181 void _appendStatusLog (const QString& text, bool critical = false);
182 void _errorCancel (const QString& msg);
183 void _determinePX4StableVersion (void);
184 void _downloadArduPilotManifest (void);
185
186 QString _singleFirmwareURL;
187 bool _singleFirmwareMode;
188 bool _downloadingFirmwareList;
189 QString _portName;
190 QString _portDescription;
191
192 // Firmware hashes
193 QHash<FirmwareIdentifier, QString> _rgSiKRadioFirmware;
194
195 // Hash map for ArduPilot ChibiOS lookup by board name
196 QHash<FirmwareIdentifier, QString> _rgAPMChibiosReplaceNamedBoardFirmware;
197 QHash<FirmwareIdentifier, QString> _rgFirmwareDynamic;
198
199 QMap<FirmwareBuildType_t, QMap<FirmwareVehicleType_t, QString> > _apmVersionMap;
200 QList<FirmwareVehicleType_t> _apmVehicleTypeFromCurrentVersionList;
201
203 bool _bootloaderFound;
204 uint32_t _bootloaderVersion;
205 uint32_t _bootloaderBoardID;
206 uint32_t _bootloaderBoardFlashSize;
207
208 bool _startFlashWhenBootloaderFound;
209 FirmwareIdentifier _startFlashWhenBootloaderFoundFirmwareIdentity;
210
211 QPixmap _boardIcon;
212
213 QString _firmwareFilename;
214
216 PX4FirmwareUpgradeThreadController* _threadController;
217
218 static const int _eraseTickMsec = 500;
219 static const int _eraseTotalMsec = 15000;
220 int _eraseTickCount;
221 QTimer _eraseTimer;
222
223 static const int _findBoardTimeoutMsec = 30000;
224 static const int _findBootloaderTimeoutMsec = 5000;
225
226 QQuickItem* _statusLog;
227 QQuickItem* _progressBar;
228
229 bool _searchingForBoard;
230
231 QSerialPortInfo _boardInfo;
233 QString _boardTypeName;
234
235 FirmwareBuildType_t _selectedFirmwareBuildType;
236
237 FirmwareImage* _image;
238
239 QString _px4StableVersion; // Version strange for latest PX4 stable
240 QString _px4BetaVersion; // Version strange for latest PX4 beta
241
242 const QString _apmBoardDescriptionReplaceText;
243
244 static constexpr const char* _manifestFirmwareJsonKey = "firmware";
245 static constexpr const char* _manifestBoardIdJsonKey = "board_id";
246 static constexpr const char* _manifestMavTypeJsonKey = "mav-type";
247 static constexpr const char* _manifestFormatJsonKey = "format";
248 static constexpr const char* _manifestUrlJsonKey = "url";
249 static constexpr const char* _manifestMavFirmwareVersionTypeJsonKey = "mav-firmware-version-type";
250 static constexpr const char* _manifestUSBIDJsonKey = "USBID";
251 static constexpr const char* _manifestMavFirmwareVersionJsonKey = "mav-firmware-version";
252 static constexpr const char* _manifestBootloaderStrJsonKey = "bootloader_str";
253 static constexpr const char* _manifestLatestKey = "latest";
254 static constexpr const char* _manifestPlatformKey = "platform";
255 static constexpr const char* _manifestBrandNameKey = "brand_name";
256
257 typedef struct {
258 uint32_t boardId;
259 FirmwareBuildType_t firmwareBuildType;
260 FirmwareVehicleType_t vehicleType;
261 QString url;
262 QString version;
263 QStringList rgBootloaderPortString;
264 QList<int> rgVID;
265 QList<int> rgPID;
266 QString friendlyName;
267 bool chibios;
268 bool fmuv2;
269 } ManifestFirmwareInfo_t;
270
271
272 QList<ManifestFirmwareInfo_t> _rgManifestFirmwareInfo;
273 QMap<QString, FirmwareBuildType_t> _manifestMavFirmwareVersionTypeToFirmwareBuildTypeMap;
274 QMap<QString, FirmwareVehicleType_t> _manifestMavTypeToFirmwareVehicleTypeMap;
275 QStringList _apmFirmwareNames;
276 int _apmFirmwareNamesBestIndex = 0;
277 QStringList _apmFirmwareUrls;
278 Fact* _apmChibiOSSetting;
279 Fact* _apmVehicleTypeSetting;
280
281 FirmwareBuildType_t _manifestMavFirmwareVersionTypeToFirmwareBuildType (const QString& manifestMavFirmwareVersionType);
282 FirmwareVehicleType_t _manifestMavTypeToFirmwareVehicleType (const QString& manifestMavType);
283};
284
285// global hashing function
uint qHash(const FirmwareUpgradeController::FirmwareIdentifier &firmwareId)
QString errorString
A Fact is used to hold a single value within the system.
Definition Fact.h:19
Support for Intel Hex firmware file.
FirmwareIdentifier(AutoPilotStackType_t stack=AutoPilotStackPX4, FirmwareBuildType_t firmware=StableFirmware, FirmwareVehicleType_t vehicle=DefaultVehicleFirmware)
bool operator==(const FirmwareIdentifier &firmwareId) const
Supported firmware types. If you modify these you will need to update the qml file as well.
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)
void px4BetaVersionChanged(const QString &px4BetaVersion)
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.
FirmwareBuildType_t selectedFirmwareBuildType(void)
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)
void flashFirmwareUrl(QString firmwareUrl)
void setProgressBar(QQuickItem *progressBar)
void setStatusLog(QQuickItem *statusLog)
Provides methods to interact with the bootloader. The commands themselves are signalled across to PX4...
Provides information about existing serial ports.
QString portName() const
QString description() const