Commit f8ca385d authored by Don Gagne's avatar Don Gagne

Show APM firmware versions when flashing

parent 45e47189
...@@ -262,6 +262,7 @@ HEADERS += \ ...@@ -262,6 +262,7 @@ HEADERS += \
src/QGCComboBox.h \ src/QGCComboBox.h \
src/QGCConfig.h \ src/QGCConfig.h \
src/QGCDockWidget.h \ src/QGCDockWidget.h \
src/QGCFileDownload.h \
src/QGCGeo.h \ src/QGCGeo.h \
src/QGCLoggingCategory.h \ src/QGCLoggingCategory.h \
src/QGCMapPalette.h \ src/QGCMapPalette.h \
...@@ -382,6 +383,7 @@ SOURCES += \ ...@@ -382,6 +383,7 @@ SOURCES += \
src/QGCApplication.cc \ src/QGCApplication.cc \
src/QGCComboBox.cc \ src/QGCComboBox.cc \
src/QGCDockWidget.cc \ src/QGCDockWidget.cc \
src/QGCFileDownload.cc \
src/QGCLoggingCategory.cc \ src/QGCLoggingCategory.cc \
src/QGCMapPalette.cc \ src/QGCMapPalette.cc \
src/QGCPalette.cc \ src/QGCPalette.cc \
......
...@@ -164,7 +164,7 @@ QGCView { ...@@ -164,7 +164,7 @@ QGCView {
var firmwareType = firmwareVersionCombo.model.get(firmwareVersionCombo.currentIndex).firmwareType var firmwareType = firmwareVersionCombo.model.get(firmwareVersionCombo.currentIndex).firmwareType
var vehicleType = FirmwareUpgradeController.DefaultVehicleFirmware var vehicleType = FirmwareUpgradeController.DefaultVehicleFirmware
if (apmFlightStack.checked) { if (apmFlightStack.checked) {
vehicleType = vehicleTypeSelectionCombo.model.get(vehicleTypeSelectionCombo.currentIndex).vehicleType vehicleType = controller.vehicleTypeFromVersionIndex(vehicleTypeSelectionCombo.currentIndex)
} }
controller.flash(stack, firmwareType, vehicleType) controller.flash(stack, firmwareType, vehicleType)
} }
...@@ -199,47 +199,6 @@ QGCView { ...@@ -199,47 +199,6 @@ QGCView {
} }
} }
ListModel {
id: vehicleTypeList
ListElement {
text: "Quad"
vehicleType: FirmwareUpgradeController.QuadFirmware
}
ListElement {
text: "X8"
vehicleType: FirmwareUpgradeController.X8Firmware
}
ListElement {
text: "Hexa"
vehicleType: FirmwareUpgradeController.HexaFirmware
}
ListElement {
text: "Octo"
vehicleType: FirmwareUpgradeController.OctoFirmware
}
ListElement {
text: "Y"
vehicleType: FirmwareUpgradeController.YFirmware
}
ListElement {
text: "Y6"
vehicleType: FirmwareUpgradeController.Y6Firmware
}
ListElement {
text: "Heli"
vehicleType: FirmwareUpgradeController.HeliFirmware
}
ListElement {
text: "Plane"
vehicleType: FirmwareUpgradeController.PlaneFirmware
}
ListElement {
text: "Rover"
vehicleType: FirmwareUpgradeController.RoverFirmware
}
}
ListModel { ListModel {
id: px4FlowTypeList id: px4FlowTypeList
...@@ -274,17 +233,6 @@ QGCView { ...@@ -274,17 +233,6 @@ QGCView {
firmwareVersionCombo.currentIndex = 0 firmwareVersionCombo.currentIndex = 0
} }
function vehicleTypeChanged(model) {
vehicleTypeSelectionCombo.model = null
// All of this bizarre, setting model to null and index to 1 and then to 0 is to work around
// strangeness in the combo box implementation. This sequence of steps correctly changes the combo model
// without generating any warnings and correctly updates the combo text with the new selection.
vehicleTypeSelectionCombo.model = null
vehicleTypeSelectionCombo.model = model
vehicleTypeSelectionCombo.currentIndex = 1
vehicleTypeSelectionCombo.currentIndex = 0
}
QGCRadioButton { QGCRadioButton {
id: px4FlightStack id: px4FlightStack
checked: true checked: true
...@@ -301,10 +249,7 @@ QGCView { ...@@ -301,10 +249,7 @@ QGCView {
text: "APM Flight Stack" text: "APM Flight Stack"
visible: !px4Flow visible: !px4Flow
onClicked: { onClicked: parent.firmwareVersionChanged(firmwareTypeList)
parent.firmwareVersionChanged(firmwareTypeList)
parent.vehicleTypeChanged(vehicleTypeList)
}
} }
QGCLabel { QGCLabel {
...@@ -317,19 +262,21 @@ QGCView { ...@@ -317,19 +262,21 @@ QGCView {
Row { Row {
spacing: 10 spacing: 10
QGCComboBox { QGCComboBox {
id: firmwareVersionCombo id: firmwareVersionCombo
width: 200 width: 200
visible: showFirmwareTypeSelection visible: showFirmwareTypeSelection
model: px4Flow ? px4FlowTypeList : firmwareTypeList model: px4Flow ? px4FlowTypeList : firmwareTypeList
currentIndex: controller.selectedFirmwareType
onActivated: { onActivated: {
if (model.get(index).firmwareType == FirmwareUpgradeController.PX4BetaFirmware || FirmwareUpgradeController.APMBetaFirmware ) { controller.selectedFirmwareType = index
if (model.get(index).firmwareType == FirmwareUpgradeController.BetaFirmware) {
firmwareVersionWarningLabel.visible = true firmwareVersionWarningLabel.visible = true
firmwareVersionWarningLabel.text = "WARNING: BETA FIRMWARE. " + firmwareVersionWarningLabel.text = "WARNING: BETA FIRMWARE. " +
"This firmware version is ONLY intended for beta testers. " + "This firmware version is ONLY intended for beta testers. " +
"Although it has received FLIGHT TESTING, it represents actively changed code. " + "Although it has received FLIGHT TESTING, it represents actively changed code. " +
"Do NOT use for normal operation." "Do NOT use for normal operation."
} else if (model.get(index).firmwareType == FirmwareUpgradeController.PX4DeveloperFirmware || FirmwareUpgradeController.APMDeveloperFirmware) { } else if (model.get(index).firmwareType == FirmwareUpgradeController.DeveloperFirmware) {
firmwareVersionWarningLabel.visible = true firmwareVersionWarningLabel.visible = true
firmwareVersionWarningLabel.text = "WARNING: CONTINUOUS BUILD FIRMWARE. " + firmwareVersionWarningLabel.text = "WARNING: CONTINUOUS BUILD FIRMWARE. " +
"This firmware has NOT BEEN FLIGHT TESTED. " + "This firmware has NOT BEEN FLIGHT TESTED. " +
...@@ -347,7 +294,7 @@ QGCView { ...@@ -347,7 +294,7 @@ QGCView {
id: vehicleTypeSelectionCombo id: vehicleTypeSelectionCombo
width: 200 width: 200
visible: apmFlightStack.checked visible: apmFlightStack.checked
model: vehicleTypeList model: controller.apmAvailableVersions
} }
} }
......
/*===================================================================== /*=====================================================================
QGroundControl Open Source Ground Control Station QGroundControl Open Source Ground Control Station
(c) 2009, 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org> (c) 2009, 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include "Bootloader.h" #include "Bootloader.h"
#include "QGCFileDialog.h" #include "QGCFileDialog.h"
#include "QGCApplication.h" #include "QGCApplication.h"
#include "QGCFileDownload.h"
struct FirmwareToUrlElement_t { struct FirmwareToUrlElement_t {
FirmwareUpgradeController::AutoPilotStackType_t stackType; FirmwareUpgradeController::AutoPilotStackType_t stackType;
...@@ -45,11 +46,12 @@ uint qHash(const FirmwareUpgradeController::FirmwareIdentifier& firmwareId) ...@@ -45,11 +46,12 @@ uint qHash(const FirmwareUpgradeController::FirmwareIdentifier& firmwareId)
} }
/// @Brief Constructs a new FirmwareUpgradeController Widget. This widget is used within the PX4VehicleConfig set of screens. /// @Brief Constructs a new FirmwareUpgradeController Widget. This widget is used within the PX4VehicleConfig set of screens.
FirmwareUpgradeController::FirmwareUpgradeController(void) : FirmwareUpgradeController::FirmwareUpgradeController(void)
_downloadManager(NULL), : _downloadManager(NULL)
_downloadNetworkReply(NULL), , _downloadNetworkReply(NULL)
_statusLog(NULL), , _statusLog(NULL)
_image(NULL) , _selectedFirmwareType(StableFirmware)
, _image(NULL)
{ {
_threadController = new PX4FirmwareUpgradeThreadController(this); _threadController = new PX4FirmwareUpgradeThreadController(this);
Q_CHECK_PTR(_threadController); Q_CHECK_PTR(_threadController);
...@@ -68,6 +70,8 @@ FirmwareUpgradeController::FirmwareUpgradeController(void) : ...@@ -68,6 +70,8 @@ FirmwareUpgradeController::FirmwareUpgradeController(void) :
connect(_threadController, &PX4FirmwareUpgradeThreadController::updateProgress, this, &FirmwareUpgradeController::_updateProgress); connect(_threadController, &PX4FirmwareUpgradeThreadController::updateProgress, this, &FirmwareUpgradeController::_updateProgress);
connect(&_eraseTimer, &QTimer::timeout, this, &FirmwareUpgradeController::_eraseProgressTick); connect(&_eraseTimer, &QTimer::timeout, this, &FirmwareUpgradeController::_eraseProgressTick);
_initFirmwareHash();
} }
FirmwareUpgradeController::~FirmwareUpgradeController() FirmwareUpgradeController::~FirmwareUpgradeController()
...@@ -115,42 +119,45 @@ void FirmwareUpgradeController::cancel(void) ...@@ -115,42 +119,45 @@ void FirmwareUpgradeController::cancel(void)
_threadController->cancel(); _threadController->cancel();
} }
void FirmwareUpgradeController::_foundBoard(bool firstAttempt, const QSerialPortInfo& info, int type) void FirmwareUpgradeController::_foundBoard(bool firstAttempt, const QSerialPortInfo& info, int boardType)
{ {
_foundBoardInfo = info; _foundBoardInfo = info;
switch (type) { _foundBoardType = (QGCSerialPortInfo::BoardType_t)boardType;
case QGCSerialPortInfo::BoardTypePX4FMUV1:
_foundBoardType = "PX4 FMU V1"; switch (boardType) {
_startFlashWhenBootloaderFound = false; case QGCSerialPortInfo::BoardTypePX4FMUV1:
break; _foundBoardTypeName = "PX4 FMU V1";
case QGCSerialPortInfo::BoardTypePX4FMUV2: _startFlashWhenBootloaderFound = false;
case QGCSerialPortInfo::BoardTypePX4FMUV4: break;
_foundBoardType = "Pixhawk"; case QGCSerialPortInfo::BoardTypePX4FMUV2:
_startFlashWhenBootloaderFound = false; case QGCSerialPortInfo::BoardTypePX4FMUV4:
break; _foundBoardTypeName = "Pixhawk";
case QGCSerialPortInfo::BoardTypeAeroCore: _startFlashWhenBootloaderFound = false;
_foundBoardType = "AeroCore"; break;
_startFlashWhenBootloaderFound = false; case QGCSerialPortInfo::BoardTypeAeroCore:
break; _foundBoardTypeName = "AeroCore";
case QGCSerialPortInfo::BoardTypePX4Flow: _startFlashWhenBootloaderFound = false;
_foundBoardType = "PX4 Flow"; break;
_startFlashWhenBootloaderFound = false; case QGCSerialPortInfo::BoardTypePX4Flow:
break; _foundBoardTypeName = "PX4 Flow";
case QGCSerialPortInfo::BoardType3drRadio: _startFlashWhenBootloaderFound = false;
_foundBoardType = "3DR Radio"; break;
if (!firstAttempt) { case QGCSerialPortInfo::BoardType3drRadio:
// Radio always flashes latest firmware, so we can start right away without _foundBoardTypeName = "3DR Radio";
// any further user input. if (!firstAttempt) {
_startFlashWhenBootloaderFound = true; // Radio always flashes latest firmware, so we can start right away without
_startFlashWhenBootloaderFoundFirmwareIdentity = FirmwareIdentifier(ThreeDRRadio, // any further user input.
StableFirmware, _startFlashWhenBootloaderFound = true;
DefaultVehicleFirmware); _startFlashWhenBootloaderFoundFirmwareIdentity = FirmwareIdentifier(ThreeDRRadio,
} StableFirmware,
break; DefaultVehicleFirmware);
}
break;
} }
qCDebug(FirmwareUpgradeLog) << _foundBoardType; qCDebug(FirmwareUpgradeLog) << _foundBoardType;
emit boardFound(); emit boardFound();
_loadAPMVersions(_foundBoardType);
} }
...@@ -334,46 +341,65 @@ void FirmwareUpgradeController::_bootloaderSyncFailed(void) ...@@ -334,46 +341,65 @@ void FirmwareUpgradeController::_bootloaderSyncFailed(void)
_errorCancel("Unable to sync with bootloader."); _errorCancel("Unable to sync with bootloader.");
} }
/// @brief Prompts the user to select a firmware file if needed and moves the state machine to the next state. QHash<FirmwareUpgradeController::FirmwareIdentifier, QString>* FirmwareUpgradeController::_firmwareHashForBoardId(int boardId)
void FirmwareUpgradeController::_getFirmwareFile(FirmwareIdentifier firmwareId)
{ {
// make sure the firmware hashes are populated switch (boardId) {
_initFirmwareHash(); case Bootloader::boardIDPX4FMUV1:
return &_rgPX4FMUV1Firmware;
// Select the firmware set based on board type case Bootloader::boardIDPX4Flow:
return &_rgPX4FLowFirmware;
QHash<FirmwareIdentifier, QString> prgFirmware; case Bootloader::boardIDPX4FMUV2:
return &_rgPX4FMUV2Firmware;
switch (_bootloaderBoardID) { case Bootloader::boardIDPX4FMUV4:
case Bootloader::boardIDPX4FMUV1: return &_rgPX4FMUV4Firmware;
prgFirmware = _rgPX4FMUV1Firmware; case Bootloader::boardIDAeroCore:
break; return &_rgAeroCoreFirmware;
case Bootloader::boardID3DRRadio:
case Bootloader::boardIDPX4Flow: return &_rg3DRRadioFirmware;
prgFirmware = _rgPX4FLowFirmware; default:
break; return NULL;
}
case Bootloader::boardIDPX4FMUV2: }
prgFirmware = _rgPX4FMUV2Firmware;
break;
case Bootloader::boardIDPX4FMUV4: QHash<FirmwareUpgradeController::FirmwareIdentifier, QString>* FirmwareUpgradeController::_firmwareHashForBoardType(QGCSerialPortInfo::BoardType_t boardType)
prgFirmware = _rgPX4FMUV4Firmware; {
break; int boardId;
case Bootloader::boardIDAeroCore: switch (boardType) {
prgFirmware = _rgAeroCoreFirmware; case QGCSerialPortInfo::BoardTypePX4FMUV1:
break; boardId = Bootloader::boardIDPX4FMUV1;
break;
case Bootloader::boardID3DRRadio: case QGCSerialPortInfo::BoardTypePX4FMUV2:
prgFirmware = _rg3DRRadioFirmware; boardId = Bootloader::boardIDPX4FMUV2;
break; break;
case QGCSerialPortInfo::BoardTypePX4FMUV4:
default: boardId = Bootloader::boardIDPX4FMUV4;
break; break;
case QGCSerialPortInfo::BoardTypeAeroCore:
boardId = Bootloader::boardIDAeroCore;
break;
case QGCSerialPortInfo::BoardTypePX4Flow:
boardId = Bootloader::boardIDPX4Flow;
break;
case QGCSerialPortInfo::BoardType3drRadio:
boardId = Bootloader::boardID3DRRadio;
break;
case QGCSerialPortInfo::BoardTypeUnknown:
qWarning() << "Internal error";
boardId = Bootloader::boardIDPX4FMUV2;
break;
} }
return _firmwareHashForBoardId(boardId);
}
/// @brief Prompts the user to select a firmware file if needed and moves the state machine to the next state.
void FirmwareUpgradeController::_getFirmwareFile(FirmwareIdentifier firmwareId)
{
QHash<FirmwareIdentifier, QString>* prgFirmware = _firmwareHashForBoardId(_bootloaderBoardID);
if (prgFirmware.isEmpty() && firmwareId.firmwareType != CustomFirmware) { if (!prgFirmware && firmwareId.firmwareType != CustomFirmware) {
_errorCancel("Attempting to flash an unknown board type, you must select 'Custom firmware file'"); _errorCancel("Attempting to flash an unknown board type, you must select 'Custom firmware file'");
return; return;
} }
...@@ -385,8 +411,8 @@ void FirmwareUpgradeController::_getFirmwareFile(FirmwareIdentifier firmwareId) ...@@ -385,8 +411,8 @@ void FirmwareUpgradeController::_getFirmwareFile(FirmwareIdentifier firmwareId)
"Firmware Files (*.px4 *.bin *.ihx)"); // File filter "Firmware Files (*.px4 *.bin *.ihx)"); // File filter
} else { } else {
if (prgFirmware.contains(firmwareId)) { if (prgFirmware->contains(firmwareId)) {
_firmwareFilename = prgFirmware.value(firmwareId); _firmwareFilename = prgFirmware->value(firmwareId);
} else { } else {
_errorCancel("Unable to find specified firmware download location"); _errorCancel("Unable to find specified firmware download location");
return; return;
...@@ -609,3 +635,123 @@ void FirmwareUpgradeController::_eraseComplete(void) ...@@ -609,3 +635,123 @@ void FirmwareUpgradeController::_eraseComplete(void)
{ {
_eraseTimer.stop(); _eraseTimer.stop();
} }
void FirmwareUpgradeController::_loadAPMVersions(QGCSerialPortInfo::BoardType_t boardType)
{
_apmVersionMap.clear();
QHash<FirmwareIdentifier, QString>* prgFirmware = _firmwareHashForBoardType(boardType);
foreach (FirmwareIdentifier firmwareId, prgFirmware->keys()) {
if (firmwareId.autopilotStackType == AutoPilotStackAPM) {
QString versionFile = QFileInfo(prgFirmware->value(firmwareId)).path() + "/git-version.txt";
qCDebug(FirmwareUpgradeLog) << "Downloading" << versionFile;
QGCFileDownload* downloader = new QGCFileDownload(this);
connect(downloader, &QGCFileDownload::downloadFinished, this, &FirmwareUpgradeController::_apmVersionDownloadFinished);
downloader->download(versionFile);
}
}
}
void FirmwareUpgradeController::_apmVersionDownloadFinished(QString remoteFile, QString localFile)
{
qCDebug(FirmwareUpgradeLog) << "Download complete" << remoteFile << localFile;
// Now read the version file and pull out the version string
QFile versionFile(localFile);
versionFile.open(QIODevice::ReadOnly | QIODevice::Text);
QTextStream stream(&versionFile);
QString versionContents = stream.readAll();
QString version;
QRegularExpression re("APMVERSION: (.*)$");
QRegularExpressionMatch match = re.match(versionContents);
if (match.hasMatch()) {
version = match.captured(1);
}
if (version.isEmpty()) {
qWarning() << "Unable to parse version info from file" << remoteFile;
return;
}
// In order to determine the firmware and vehicle type for this file we find the matching entry in the firmware list
QHash<FirmwareIdentifier, QString>* prgFirmware = _firmwareHashForBoardType(_foundBoardType);
QString remotePath = QFileInfo(remoteFile).path();
foreach (FirmwareIdentifier firmwareId, prgFirmware->keys()) {
if (remotePath == QFileInfo((*prgFirmware)[firmwareId]).path()) {
qCDebug(FirmwareUpgradeLog) << "Adding version to map, version:firwmareType:vehicleType" << version << firmwareId.firmwareType << firmwareId.firmwareVehicleType;
_apmVersionMap[firmwareId.firmwareType][firmwareId.firmwareVehicleType] = version;
}
}
emit apmAvailableVersionsChanged();
}
void FirmwareUpgradeController::setSelectedFirmwareType(FirmwareType_t firmwareType)
{
_selectedFirmwareType = firmwareType;
emit selectedFirmwareTypeChanged(_selectedFirmwareType);
emit apmAvailableVersionsChanged();
}
QStringList FirmwareUpgradeController::apmAvailableVersions(void)
{
QStringList list;
_apmVehicleTypeFromCurrentVersionList.clear();
foreach (FirmwareVehicleType_t vehicleType, _apmVersionMap[_selectedFirmwareType].keys()) {
QString version;
switch (vehicleType) {
case QuadFirmware:
version = "Quad - ";
break;
case X8Firmware:
version = "X8 - ";
break;
case HexaFirmware:
version = "Hexa - ";
break;
case OctoFirmware:
version = "Octo - ";
break;
case YFirmware:
version = "Y - ";
break;
case Y6Firmware:
version = "Y6 - ";
break;
case HeliFirmware:
version = "Heli - ";
break;
case PlaneFirmware:
case RoverFirmware:
case DefaultVehicleFirmware:
break;
}
version += _apmVersionMap[_selectedFirmwareType][vehicleType];
_apmVehicleTypeFromCurrentVersionList.append(vehicleType);
list << version;
}
return list;
}
FirmwareUpgradeController::FirmwareVehicleType_t FirmwareUpgradeController::vehicleTypeFromVersionIndex(int index)
{
if (index < 0 || index >= _apmVehicleTypeFromCurrentVersionList.count()) {
qWarning() << "Invalid index, index:count" << index << _apmVehicleTypeFromCurrentVersionList.count();
return QuadFirmware;
}
return _apmVehicleTypeFromCurrentVersionList[index];
}
...@@ -106,10 +106,12 @@ public: ...@@ -106,10 +106,12 @@ public:
FirmwareUpgradeController(void); FirmwareUpgradeController(void);
~FirmwareUpgradeController(); ~FirmwareUpgradeController();
Q_PROPERTY(QString boardPort READ boardPort NOTIFY boardFound) Q_PROPERTY(QString boardPort READ boardPort NOTIFY boardFound)
Q_PROPERTY(QString boardDescription READ boardDescription NOTIFY boardFound) Q_PROPERTY(QString boardDescription READ boardDescription NOTIFY boardFound)
Q_PROPERTY(QString boardType MEMBER _foundBoardType NOTIFY boardFound) 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)
/// TextArea for log output /// TextArea for log output
Q_PROPERTY(QQuickItem* statusLog READ statusLog WRITE setStatusLog) Q_PROPERTY(QQuickItem* statusLog READ statusLog WRITE setStatusLog)
...@@ -126,6 +128,8 @@ public: ...@@ -126,6 +128,8 @@ public:
Q_INVOKABLE void flash(AutoPilotStackType_t stackType, Q_INVOKABLE void flash(AutoPilotStackType_t stackType,
FirmwareType_t firmwareType = StableFirmware, FirmwareType_t firmwareType = StableFirmware,
FirmwareVehicleType_t vehicleType = DefaultVehicleFirmware ); FirmwareVehicleType_t vehicleType = DefaultVehicleFirmware );
Q_INVOKABLE FirmwareVehicleType_t vehicleTypeFromVersionIndex(int index);
// overload, not exposed to qml side // overload, not exposed to qml side
void flash(const FirmwareIdentifier& firmwareId); void flash(const FirmwareIdentifier& firmwareId);
...@@ -140,6 +144,11 @@ public: ...@@ -140,6 +144,11 @@ public:
QString boardPort(void) { return _foundBoardInfo.portName(); } QString boardPort(void) { return _foundBoardInfo.portName(); }
QString boardDescription(void) { return _foundBoardInfo.description(); } QString boardDescription(void) { return _foundBoardInfo.description(); }
FirmwareType_t selectedFirmwareType(void) { return _selectedFirmwareType; }
void setSelectedFirmwareType(FirmwareType_t firmwareType);
QStringList apmAvailableVersions(void);
signals: signals:
void boardFound(void); void boardFound(void);
...@@ -148,12 +157,14 @@ signals: ...@@ -148,12 +157,14 @@ signals:
void flashComplete(void); void flashComplete(void);
void flashCancelled(void); void flashCancelled(void);
void error(void); void error(void);
void selectedFirmwareTypeChanged(FirmwareType_t firmwareType);
void apmAvailableVersionsChanged(void);
private slots: private slots:
void _downloadProgress(qint64 curr, qint64 total); void _downloadProgress(qint64 curr, qint64 total);
void _downloadFinished(void); void _downloadFinished(void);
void _downloadError(QNetworkReply::NetworkError code); void _downloadError(QNetworkReply::NetworkError code);
void _foundBoard(bool firstAttempt, const QSerialPortInfo& portInfo, int type); void _foundBoard(bool firstAttempt, const QSerialPortInfo& portInfo, int boardType);
void _noBoardFound(void); void _noBoardFound(void);
void _boardGone(); void _boardGone();
void _foundBootloader(int bootloaderVersion, int boardID, int flashSize); void _foundBootloader(int bootloaderVersion, int boardID, int flashSize);
...@@ -165,6 +176,7 @@ private slots: ...@@ -165,6 +176,7 @@ private slots:
void _eraseStarted(void); void _eraseStarted(void);
void _eraseComplete(void); void _eraseComplete(void);
void _eraseProgressTick(void); void _eraseProgressTick(void);
void _apmVersionDownloadFinished(QString remoteFile, QString localFile);
private: private:
void _getFirmwareFile(FirmwareIdentifier firmwareId); void _getFirmwareFile(FirmwareIdentifier firmwareId);
...@@ -172,7 +184,10 @@ private: ...@@ -172,7 +184,10 @@ private:
void _downloadFirmware(void); void _downloadFirmware(void);
void _appendStatusLog(const QString& text, bool critical = false); void _appendStatusLog(const QString& text, bool critical = false);
void _errorCancel(const QString& msg); void _errorCancel(const QString& msg);
void _loadAPMVersions(QGCSerialPortInfo::BoardType_t boardType);
QHash<FirmwareIdentifier, QString>* _firmwareHashForBoardId(int boardId);
QHash<FirmwareIdentifier, QString>* _firmwareHashForBoardType(QGCSerialPortInfo::BoardType_t boardType);
QString _portName; QString _portName;
QString _portDescription; QString _portDescription;
...@@ -184,6 +199,9 @@ private: ...@@ -184,6 +199,9 @@ private:
QHash<FirmwareIdentifier, QString> _rgPX4FLowFirmware; QHash<FirmwareIdentifier, QString> _rgPX4FLowFirmware;
QHash<FirmwareIdentifier, QString> _rg3DRRadioFirmware; QHash<FirmwareIdentifier, QString> _rg3DRRadioFirmware;
QMap<FirmwareType_t, QMap<FirmwareVehicleType_t, QString> > _apmVersionMap;
QList<FirmwareVehicleType_t> _apmVehicleTypeFromCurrentVersionList;
/// Information which comes back from the bootloader /// Information which comes back from the bootloader
bool _bootloaderFound; ///< true: we have received the foundBootloader signals bool _bootloaderFound; ///< true: we have received the foundBootloader signals
uint32_t _bootloaderVersion; ///< Bootloader version uint32_t _bootloaderVersion; ///< Bootloader version
...@@ -216,9 +234,12 @@ private: ...@@ -216,9 +234,12 @@ private:
bool _searchingForBoard; ///< true: searching for board, false: search for bootloader bool _searchingForBoard; ///< true: searching for board, false: search for bootloader
QSerialPortInfo _foundBoardInfo; QSerialPortInfo _foundBoardInfo;
QString _foundBoardType; QGCSerialPortInfo::BoardType_t _foundBoardType;
QString _foundBoardTypeName;
FirmwareType_t _selectedFirmwareType;
FirmwareImage* _image; FirmwareImage* _image;
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment