6#include <QtCore/QThread>
7#include <QtCore/QTimer>
10 : _controller(controller)
24void PX4FirmwareUpgradeThreadWorker::_init(
void)
28 _findBoardTimer =
new QTimer(
this);
29 _findBoardTimer->setSingleShot(
true);
30 _findBoardTimer->setInterval(500);
31 connect(_findBoardTimer, &QTimer::timeout,
this, &PX4FirmwareUpgradeThreadWorker::_findBoardOnce);
34void PX4FirmwareUpgradeThreadWorker::_cancel(
void)
36 qCDebug(FirmwareUpgradeVerboseLog) <<
"_cancel";
40 _bootloader->deleteLater();
41 _bootloader =
nullptr;
45void PX4FirmwareUpgradeThreadWorker::_startFindBoardLoop(
void)
48 _findBoardFirstAttempt =
true;
52void PX4FirmwareUpgradeThreadWorker::_findBoardOnce(
void)
54 qCDebug(FirmwareUpgradeVerboseLog) <<
"_findBoardOnce";
60 if (_findBoardFromPorts(portInfo, boardType, boardName)) {
63 _foundBoardPortInfo = portInfo;
64 emit
foundBoard(_findBoardFirstAttempt, portInfo, boardType, boardName);
65 if (!_findBoardFirstAttempt) {
71 uint32_t bootloaderVersion;
74 if (_bootloader->
getBoardInfo(bootloaderVersion, boardId, flashSize)) {
88 qCDebug(FirmwareUpgradeLog) <<
"Board gone";
90 }
else if (_findBoardFirstAttempt) {
95 _findBoardFirstAttempt =
false;
96 _findBoardTimer->start();
102 info.getBoardInfo(boardType, boardName);
104 qCDebug(FirmwareUpgradeVerboseLog) <<
"Serial Port --------------";
105 qCDebug(FirmwareUpgradeVerboseLog) <<
"\tboard type" << boardType;
106 qCDebug(FirmwareUpgradeVerboseLog) <<
"\tboard name" << boardName;
107 qCDebug(FirmwareUpgradeVerboseLog) <<
"\tmanufacturer:" << info.manufacturer();
108 qCDebug(FirmwareUpgradeVerboseLog) <<
"\tport name:" << info.portName();
109 qCDebug(FirmwareUpgradeVerboseLog) <<
"\tdescription:" << info.description();
110 qCDebug(FirmwareUpgradeVerboseLog) <<
"\tsystem location:" << info.systemLocation();
111 qCDebug(FirmwareUpgradeVerboseLog) <<
"\tvendor ID:" << info.vendorIdentifier();
112 qCDebug(FirmwareUpgradeVerboseLog) <<
"\tproduct ID:" << info.productIdentifier();
114 if (info.canFlash()) {
123void PX4FirmwareUpgradeThreadWorker::_reboot(
void)
128void PX4FirmwareUpgradeThreadWorker::_flash(
void)
130 qCDebug(FirmwareUpgradeLog) <<
"PX4FirmwareUpgradeThreadWorker::_flash";
138 emit
status(tr(
"Programming new version..."));
141 qCDebug(FirmwareUpgradeLog) <<
"Program complete";
142 emit
status(
"Program complete");
144 qCDebug(FirmwareUpgradeLog) <<
"Program failed:" << _bootloader->
errorString();
148 emit
status(tr(
"Verifying program..."));
151 qCDebug(FirmwareUpgradeLog) <<
"Verify complete";
152 emit
status(tr(
"Verify complete"));
154 qCDebug(FirmwareUpgradeLog) <<
"Verify failed:" << _bootloader->
errorString();
159 emit
status(tr(
"Rebooting board"));
162 _bootloader->
close();
163 _bootloader->deleteLater();
164 _bootloader =
nullptr;
173 _bootloader->
close();
174 _bootloader->deleteLater();
175 _bootloader =
nullptr;
178bool PX4FirmwareUpgradeThreadWorker::_erase(
void)
180 qCDebug(FirmwareUpgradeLog) <<
"PX4FirmwareUpgradeThreadWorker::_erase";
183 emit
status(tr(
"Erasing previous program..."));
185 if (_bootloader->
erase()) {
186 qCDebug(FirmwareUpgradeLog) <<
"Erase complete";
187 emit
status(tr(
"Erase complete"));
191 qCDebug(FirmwareUpgradeLog) <<
"Erase failed:" << _bootloader->
errorString();
201 _workerThread =
new QThread(
this);
202 _worker->moveToThread(_workerThread);
215 _workerThread->start();
222 _workerThread->quit();
223 _workerThread->wait();
225 delete _workerThread;
230 qCDebug(FirmwareUpgradeLog) <<
"PX4FirmwareUpgradeThreadController::findBoard";
236 qCDebug(FirmwareUpgradeLog) <<
"PX4FirmwareUpgradeThreadController::cancel";
Bootloader Utility routines. Works with PX4 and 3DR Radio bootloaders.
bool program(const FirmwareImage *image)
void updateProgress(int curr, int total)
Signals progress indicator for long running bootloader utility routines.
QString errorString(void)
bool initFlashSequence(void)
bool open(const QString portName)
bool verify(const FirmwareImage *image)
bool getBoardInfo(uint32_t &bootloaderVersion, uint32_t &boardID, uint32_t &flashSize)
Support for Intel Hex firmware file.
Provides methods to interact with the bootloader. The commands themselves are signalled across to PX4...
~PX4FirmwareUpgradeThreadController(void)
void _rebootOnThread(void)
void _flashOnThread(void)
void _startFindBoardLoopOnThread(void)
void _initThreadWorker(void)
PX4FirmwareUpgradeThreadController(QObject *parent=nullptr)
void startFindBoardLoop(void)
Begins the process of searching for a supported board connected to any serial port....
void flash(const FirmwareImage *image)
const FirmwareImage * image(void)
Used to run bootloader commands on a separate thread. These routines are mainly meant to to be called...
void foundBoard(bool firstAttempt, const QGCSerialPortInfo &portInfo, int type, QString boardName)
void error(const QString &errorString)
void foundBoardInfo(int bootloaderVersion, int boardID, int flashSize)
~PX4FirmwareUpgradeThreadWorker()
void status(const QString &statusText)
PX4FirmwareUpgradeThreadWorker(PX4FirmwareUpgradeThreadController *controller)
void updateProgress(int curr, int total)
Error
Error codes for decompression operations.