From 5499e8c655d945553ea650fa7490a9b2b21e3bf9 Mon Sep 17 00:00:00 2001 From: Gus Grubba Date: Fri, 31 May 2019 11:25:58 -0400 Subject: [PATCH] Switch custom firmware file picker to QtQuick With the switch to QtQuick, all file dialogs from the c++ side no longer work. This was marked as TODO and fell through the cracks. --- src/VehicleSetup/FirmwareUpgrade.qml | 34 ++++++++++++++++--- src/VehicleSetup/FirmwareUpgradeController.cc | 15 ++++---- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/VehicleSetup/FirmwareUpgrade.qml b/src/VehicleSetup/FirmwareUpgrade.qml index 5c6710082..8a4d38e5a 100644 --- a/src/VehicleSetup/FirmwareUpgrade.qml +++ b/src/VehicleSetup/FirmwareUpgrade.qml @@ -79,6 +79,18 @@ SetupPage { _defaultFirmwareIsPX4 = _defaultFirmwareFact.rawValue === _defaultFimwareTypePX4 // we don't want this to be bound and change as radios are selected } + QGCFileDialog { + id: customFirmwareDialog + title: qsTr("Select Firmware File") + nameFilters: [qsTr("Firmware Files (*.px4 *.apj *.bin *.ihx)"), qsTr("All Files (*)")] + selectExisting: true + folder: QGroundControl.settingsManager.appSettings.logSavePath + onAcceptedForLoad: { + controller.flashFirmwareUrl(file) + close() + } + } + FirmwareUpgradeController { id: controller progressBar: progressBar @@ -117,8 +129,9 @@ SetupPage { statusTextArea.append(highlightPrefix + qsTr("Multiple devices detected! Remove all detected devices to perform the firmware upgrade.")) statusTextArea.append(qsTr("Detected [%1]: ").arg(availableDevices.length) + availableDevices.join(", ")) } - - QGroundControl.multiVehicleManager.activeVehicle.autoDisconnect = true + if(QGroundControl.multiVehicleManager.activeVehicle) { + QGroundControl.multiVehicleManager.activeVehicle.autoDisconnect = true + } } else { // We end up here when we detect a board plugged in after we've started upgrade statusTextArea.append(highlightPrefix + qsTr("Found device") + highlightSuffix + ": " + controller.boardType) @@ -210,7 +223,12 @@ SetupPage { } } } - controller.flash(stack, firmwareBuildType, vehicleType) + //-- If custom, get file path + if (firmwareBuildType === FirmwareUpgradeController.CustomFirmware) { + customFirmwareDialog.openForLoad() + } else { + controller.flash(stack, firmwareBuildType, vehicleType) + } hideDialog() } } @@ -220,7 +238,6 @@ SetupPage { cancelFlash() } - Connections { target: firmwarePage onCancelDialog: reject() @@ -304,6 +321,13 @@ SetupPage { Column { + Component.onCompleted: { + if(!QGroundControl.apmFirmwareSupported) { + _defaultFirmwareFact.rawValue = _defaultFimwareTypePX4 + firmwareVersionChanged(firmwareBuildTypeList) + } + } + QGCRadioButton { id: px4FlightStackRadio text: qsTr("PX4 Pro ") @@ -371,7 +395,7 @@ SetupPage { anchors.right: parent.right wrapMode: Text.WordWrap text: qsTr("No Firmware Available") - visible: !controller.downloadingFirmwareList && controller.apmFirmwareNames.length === 0 + visible: !controller.downloadingFirmwareList && (QGroundControl.apmFirmwareSupported && controller.apmFirmwareNames.length === 0) } QGCComboBox { diff --git a/src/VehicleSetup/FirmwareUpgradeController.cc b/src/VehicleSetup/FirmwareUpgradeController.cc index 0c3cb1461..6e63bfd1d 100644 --- a/src/VehicleSetup/FirmwareUpgradeController.cc +++ b/src/VehicleSetup/FirmwareUpgradeController.cc @@ -93,12 +93,17 @@ FirmwareUpgradeController::FirmwareUpgradeController(void) connect(&_eraseTimer, &QTimer::timeout, this, &FirmwareUpgradeController::_eraseProgressTick); +#if !defined(NO_ARDUPILOT_DIALECT) connect(_apmChibiOSSetting, &Fact::rawValueChanged, this, &FirmwareUpgradeController::_buildAPMFirmwareNames); connect(_apmVehicleTypeSetting, &Fact::rawValueChanged, this, &FirmwareUpgradeController::_buildAPMFirmwareNames); +#endif _initFirmwareHash(); _determinePX4StableVersion(); + +#if !defined(NO_ARDUPILOT_DIALECT) _downloadArduPilotManifest(); +#endif } FirmwareUpgradeController::~FirmwareUpgradeController() @@ -478,16 +483,12 @@ QHash* FirmwareUpgradeCo return &_rgFirmwareDynamic; } -/// @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* prgFirmware = _firmwareHashForBoardId(static_cast(_bootloaderBoardID)); - if (firmwareId.firmwareType == CustomFirmware) { - _firmwareFilename = QString(); //-- TODO: QGCQFileDialog::getOpenFileName(nullptr, // Parent to main window - // tr("Select Firmware File"), // Dialog Caption - // QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation), // Initial directory - // tr("Firmware Files (*.px4 *.apj *.bin *.ihx)")); // File filter + _firmwareFilename = QString(); + _errorCancel(tr("Custom firmware selected but no filename given.")); } else { if (prgFirmware->contains(firmwareId)) { _firmwareFilename = prgFirmware->value(firmwareId); @@ -673,6 +674,7 @@ void FirmwareUpgradeController::setSelectedFirmwareBuildType(FirmwareBuildType_t void FirmwareUpgradeController::_buildAPMFirmwareNames(void) { +#if !defined(NO_ARDUPILOT_DIALECT) qCDebug(FirmwareUpgradeLog) << "_buildAPMFirmwareNames"; bool chibios = _apmChibiOSSetting->rawValue().toInt() == 0; @@ -717,6 +719,7 @@ void FirmwareUpgradeController::_buildAPMFirmwareNames(void) } emit apmFirmwareNamesChanged(); +#endif } FirmwareUpgradeController::FirmwareVehicleType_t FirmwareUpgradeController::vehicleTypeFromFirmwareSelectionIndex(int index) -- 2.22.0