From 9a339fcab865e01a4c596c07fb9f549bd0c5dc31 Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Sat, 23 Mar 2019 09:05:53 -0700 Subject: [PATCH 1/6] Clean up wasted space --- src/AutoPilotPlugins/Common/SetupPage.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AutoPilotPlugins/Common/SetupPage.qml b/src/AutoPilotPlugins/Common/SetupPage.qml index 2efdf4b..b4a14e9 100644 --- a/src/AutoPilotPlugins/Common/SetupPage.qml +++ b/src/AutoPilotPlugins/Common/SetupPage.qml @@ -86,7 +86,7 @@ QGCView { anchors.right: parent.right wrapMode: Text.WordWrap text: pageDescription - visible: !ScreenTools.isShortScreen + visible: pageDescription !== "" && !ScreenTools.isShortScreen } } } From 9eb431f5160f5272fe541efb342f5ba839b28cbd Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Sat, 23 Mar 2019 09:06:42 -0700 Subject: [PATCH 2/6] ArduPilot: Support flash bootloader --- src/VehicleSetup/FirmwareUpgrade.qml | 39 ++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/src/VehicleSetup/FirmwareUpgrade.qml b/src/VehicleSetup/FirmwareUpgrade.qml index 046312f..113506a 100644 --- a/src/VehicleSetup/FirmwareUpgrade.qml +++ b/src/VehicleSetup/FirmwareUpgrade.qml @@ -23,9 +23,14 @@ import QGroundControl.Controllers 1.0 import QGroundControl.ScreenTools 1.0 SetupPage { - id: firmwarePage - pageComponent: firmwarePageComponent - pageName: "Firmware" // For building setup page title: 'Firmware Setup' + id: firmwarePage + pageComponent: firmwarePageComponent + pageName: qsTr("Firmware") + showAdvanced: _activeVehicle && _activeVehicle.apmFirmware + + property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle + + signal cancelDialog Component { id: firmwarePageComponent @@ -40,7 +45,7 @@ SetupPage { // a better way to hightlight them, or use less highlights. // User visible strings - readonly property string title: "Firmware Setup" // Popup dialog title + readonly property string title: qsTr("Firmware Setup") // Popup dialog title readonly property string highlightPrefix: "" readonly property string highlightSuffix: "" @@ -124,8 +129,8 @@ SetupPage { } onError: { - hideDialog() statusTextArea.append(flashFailText) + firmwarePage.cancelDialog() } } @@ -165,7 +170,11 @@ SetupPage { px4FlightStackRadio2.text = qsTr("PX4 Flight Stack ") + versionString } - Component.onCompleted: updatePX4VersionDisplay() + Component.onCompleted: { + firmwarePage.advanced = false + firmwarePage.showAdvanced = false + updatePX4VersionDisplay() + } function accept() { hideDialog() @@ -195,6 +204,12 @@ SetupPage { cancelFlash() } + + Connections { + target: firmwarePage + onCancelDialog: reject() + } + ExclusiveGroup { id: firmwareGroup } @@ -438,8 +453,16 @@ SetupPage { } ProgressBar { - id: progressBar - Layout.preferredWidth: parent.width + id: progressBar + Layout.preferredWidth: parent.width + visible: !flashBootloaderButton.visible + } + + QGCButton { + id: flashBootloaderButton + text: qsTr("Flash ChibiOS Bootloader") + visible: firmwarePage.advanced + onClicked: _activeVehicle.flashBootloader() } TextArea { From b2b422c397e61f8761c8e03cd522a8e0c9288397 Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Sat, 23 Mar 2019 09:07:28 -0700 Subject: [PATCH 3/6] Add new Manufacturer name fallback for ChibiOS --- src/comm/QGCSerialPortInfo.cc | 92 ++++++++++++++++++++++++++++++++----------- src/comm/QGCSerialPortInfo.h | 8 ++-- src/comm/USBBoardInfo.json | 18 +++++---- 3 files changed, 84 insertions(+), 34 deletions(-) diff --git a/src/comm/QGCSerialPortInfo.cc b/src/comm/QGCSerialPortInfo.cc index 56e299f..539a8c7 100644 --- a/src/comm/QGCSerialPortInfo.cc +++ b/src/comm/QGCSerialPortInfo.cc @@ -18,16 +18,17 @@ QGC_LOGGING_CATEGORY(QGCSerialPortInfoLog, "QGCSerialPortInfoLog") -bool QGCSerialPortInfo::_jsonLoaded = false; -const char* QGCSerialPortInfo::_jsonFileTypeValue = "USBBoardInfo"; -const char* QGCSerialPortInfo::_jsonBoardInfoKey = "boardInfo"; -const char* QGCSerialPortInfo::_jsonBoardFallbackKey = "boardFallback"; -const char* QGCSerialPortInfo::_jsonVendorIDKey = "vendorID"; -const char* QGCSerialPortInfo::_jsonProductIDKey = "productID"; -const char* QGCSerialPortInfo::_jsonBoardClassKey = "boardClass"; -const char* QGCSerialPortInfo::_jsonNameKey = "name"; -const char* QGCSerialPortInfo::_jsonRegExpKey = "regExp"; -const char* QGCSerialPortInfo::_jsonAndroidOnlyKey = "androidOnly"; +bool QGCSerialPortInfo::_jsonLoaded = false; +const char* QGCSerialPortInfo::_jsonFileTypeValue = "USBBoardInfo"; +const char* QGCSerialPortInfo::_jsonBoardInfoKey = "boardInfo"; +const char* QGCSerialPortInfo::_jsonBoardDescriptionFallbackKey = "boardDescriptionFallback"; +const char* QGCSerialPortInfo::_jsonBoardManufacturerFallbackKey = "boardManufacturerFallback"; +const char* QGCSerialPortInfo::_jsonVendorIDKey = "vendorID"; +const char* QGCSerialPortInfo::_jsonProductIDKey = "productID"; +const char* QGCSerialPortInfo::_jsonBoardClassKey = "boardClass"; +const char* QGCSerialPortInfo::_jsonNameKey = "name"; +const char* QGCSerialPortInfo::_jsonRegExpKey = "regExp"; +const char* QGCSerialPortInfo::_jsonAndroidOnlyKey = "androidOnly"; const QGCSerialPortInfo::BoardClassString2BoardType_t QGCSerialPortInfo::_rgBoardClass2BoardType[] = { { "Pixhawk", QGCSerialPortInfo::BoardTypePixhawk }, @@ -37,8 +38,9 @@ const QGCSerialPortInfo::BoardClassString2BoardType_t QGCSerialPortInfo::_rgBoar { "OpenPilot", QGCSerialPortInfo::BoardTypeOpenPilot }, }; -QList QGCSerialPortInfo::_boardInfoList; -QList QGCSerialPortInfo::_boardFallbackList; +QList QGCSerialPortInfo::_boardInfoList; +QList QGCSerialPortInfo::_boardDescriptionFallbackList; +QList QGCSerialPortInfo::_boardManufacturerFallbackList; QGCSerialPortInfo::QGCSerialPortInfo(void) : QSerialPortInfo() @@ -90,8 +92,9 @@ void QGCSerialPortInfo::_loadJsonData(void) // Validate root object keys QList rootKeyInfoList = { - { _jsonBoardInfoKey, QJsonValue::Array, true }, - { _jsonBoardFallbackKey, QJsonValue::Array, true }, + { _jsonBoardInfoKey, QJsonValue::Array, true }, + { _jsonBoardDescriptionFallbackKey, QJsonValue::Array, true }, + { _jsonBoardManufacturerFallbackKey, QJsonValue::Array, true }, }; if (!JsonHelper::validateKeys(json, rootKeyInfoList, errorString)) { qWarning() << errorString; @@ -143,7 +146,7 @@ void QGCSerialPortInfo::_loadJsonData(void) { _jsonAndroidOnlyKey, QJsonValue::Bool, false }, }; - QJsonArray rgBoardFallback = json[_jsonBoardFallbackKey].toArray(); + QJsonArray rgBoardFallback = json[_jsonBoardDescriptionFallbackKey].toArray(); for (int i=0; i _boardInfoList; - static QList _boardFallbackList; + static QList _boardDescriptionFallbackList; + static QList _boardManufacturerFallbackList; }; diff --git a/src/comm/USBBoardInfo.json b/src/comm/USBBoardInfo.json index 358480f..6a91abb 100644 --- a/src/comm/USBBoardInfo.json +++ b/src/comm/USBBoardInfo.json @@ -20,8 +20,6 @@ { "vendorID": 9900, "productID": 22, "boardClass": "Pixhawk", "name": "Crazyflie 2" }, { "vendorID": 9900, "productID": 1, "boardClass": "Pixhawk", "name": "Omnibus F4 SD" }, { "vendorID": 8137, "productID": 28, "boardClass": "Pixhawk", "name": "PX4 NXPHlite v3.x" }, - { "vendorID": 1155, "productID": 22336, "boardClass": "Pixhawk", "name": "ArduPilot ChibiOS" }, - { "vendorID": 4617, "productID": 22336, "boardClass": "Pixhawk", "name": "ArduPilot ChibiOS" }, { "vendorID": 9900, "productID": 21, "boardClass": "PX4 Flow", "name": "PX4 Flow" }, @@ -29,17 +27,17 @@ { "vendorID": 1027, "productID": 24577, "boardClass": "SiK Radio", "name": "SiK Radio", "comment": "3DR Radio on FTDI" }, { "vendorID": 4292, "productID": 60000, "boardClass": "SiK Radio", "name": "SiK Radio", "comment": "SILabs Radio" }, - { "vendorID": 5446, "productID": 424, "boardClass": "RTK GPS", "name": "U-blox RTK GPS", "comment": "U-blox RTK GPS (M8P)" }, - { "vendorID": 5446, "productID": 425, "boardClass": "RTK GPS", "name": "U-blox RTK GPS", "comment": "U-blox RTK GPS (F9P)" }, - { "vendorID": 1317, "productID": 42151, "boardClass": "RTK GPS", "name": "Trimble RTK GPS", "comment": "Trimble RTK GPS" }, - { "vendorID": 5418, "productID": 34240, "boardClass": "RTK GPS", "name": "Septentrio RTK GPS", "comment": "Septentrio RTK GPS" }, + { "vendorID": 5446, "productID": 424, "boardClass": "RTK GPS", "name": "U-blox RTK GPS", "comment": "U-blox RTK GPS (M8P)" }, + { "vendorID": 5446, "productID": 425, "boardClass": "RTK GPS", "name": "U-blox RTK GPS", "comment": "U-blox RTK GPS (F9P)" }, + { "vendorID": 1317, "productID": 42151, "boardClass": "RTK GPS", "name": "Trimble RTK GPS" }, + { "vendorID": 5418, "productID": 34240, "boardClass": "RTK GPS", "name": "Septentrio RTK GPS" }, { "vendorID": 8352, "productID": 16732, "boardClass": "OpenPilot", "name": "OpenPilot OPLink" }, { "vendorID": 8352, "productID": 16733, "boardClass": "OpenPilot", "name": "OpenPilot CC3D" }, { "vendorID": 8352, "productID": 16734, "boardClass": "OpenPilot", "name": "OpenPilot Revolution" }, { "vendorID": 8352, "productID": 16848, "boardClass": "OpenPilot", "name": "Taulabs Sparky2" } ], - "boardFallback": [ + "boardDescriptionFallback": [ { "regExp": "^PX4 FMU v5.x$", "boardClass": "Pixhawk" }, { "regExp": "^PX4 BL FMU v5.x$", "boardClass": "Pixhawk" }, { "regExp": "^PX4 FMU v4.x PRO$", "boardClass": "Pixhawk" }, @@ -64,5 +62,11 @@ { "regExp": "PX4.*Flow", "boardClass": "PX4 Flow" }, { "regExp": "^FT231X USB UART$", "boardClass": "SiK Radio" }, { "regExp": "USB UART$", "boardClass": "SiK Radio", "androidOnly": true, "comment": "Very broad fallback, too dangerous for non-android" } + ], + + "boardManufacturerFallback": [ + { "regExp": "^ArduPilot$", "boardClass": "Pixhawk" }, + { "regExp": "^Hex/ProfiCNC$", "boardClass": "Pixhawk" }, + { "regExp": "^Holybro$", "boardClass": "Pixhawk" } ] } From ddc1fa61855efa75f73d91e5b72a41fecc96397a Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Sat, 23 Mar 2019 09:07:43 -0700 Subject: [PATCH 4/6] ArduPilot: Flash bootloader support --- src/Vehicle/Vehicle.cc | 13 +++++++++++++ src/Vehicle/Vehicle.h | 4 ++++ 2 files changed, 17 insertions(+) diff --git a/src/Vehicle/Vehicle.cc b/src/Vehicle/Vehicle.cc index 9f540b7..64eadc7 100644 --- a/src/Vehicle/Vehicle.cc +++ b/src/Vehicle/Vehicle.cc @@ -3849,6 +3849,19 @@ int Vehicle::versionCompare(int major, int minor, int patch) return _firmwarePlugin->versionCompare(this, major, minor, patch); } +#if !defined(NO_ARDUPILOT_DIALECT) +void Vehicle::flashBootloader(void) +{ + sendMavCommand(defaultComponentId(), + MAV_CMD_FLASH_BOOTLOADER, + true, // show error + 0, 0, 0, 0, // param 1-4 not used + 290876); // magic number + +} +#endif + + //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- diff --git a/src/Vehicle/Vehicle.h b/src/Vehicle/Vehicle.h index cba6240..530a4ed 100644 --- a/src/Vehicle/Vehicle.h +++ b/src/Vehicle/Vehicle.h @@ -756,6 +756,10 @@ public: /// @param percent 0-no power, 100-full power Q_INVOKABLE void motorTest(int motor, int percent); +#if !defined(NO_ARDUPILOT_DIALECT) + Q_INVOKABLE void flashBootloader(void); +#endif + bool guidedModeSupported (void) const; bool pauseVehicleSupported (void) const; bool orbitModeSupported (void) const; From 99d87c3457d2ba1ed14cb50ef8bd061f3e85b626 Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Sat, 23 Mar 2019 09:08:24 -0700 Subject: [PATCH 5/6] Full support for ChibiOS flash, including PX4 flash on ChibiOS bootloader --- src/VehicleSetup/Bootloader.h | 2 +- src/VehicleSetup/FirmwareUpgradeController.cc | 111 +++++++++++--------------- src/VehicleSetup/PX4FirmwareUpgradeThread.cc | 1 + 3 files changed, 48 insertions(+), 66 deletions(-) diff --git a/src/VehicleSetup/Bootloader.h b/src/VehicleSetup/Bootloader.h index d2d3c19..a7b990b 100644 --- a/src/VehicleSetup/Bootloader.h +++ b/src/VehicleSetup/Bootloader.h @@ -64,7 +64,7 @@ public: static const int boardIDPX4FMUV1 = 5; ///< PX4 V1 board, as from USB PID static const int boardIDPX4FMUV2 = 9; ///< PX4 V2 board, as from USB PID static const int boardIDPX4FMUV4 = 11; ///< PX4 V4 board, as from USB PID - static const int boardIDPX4FMUV4PRO = 13; ///< PX4 V4PRO board, as from USB PID + static const int boardIDPX4FMUV4PRO = 13; ///< PX4 V4PRO board, as from USB PID static const int boardIDPX4FMUV5 = 50; ///< PX4 V5 board, as from USB PID static const int boardIDPX4Flow = 6; ///< PX4 Flow board, as from USB PID static const int boardIDAeroCore = 98; ///< Gumstix AeroCore board, as from USB PID diff --git a/src/VehicleSetup/FirmwareUpgradeController.cc b/src/VehicleSetup/FirmwareUpgradeController.cc index 3d189f4..ffd305a 100644 --- a/src/VehicleSetup/FirmwareUpgradeController.cc +++ b/src/VehicleSetup/FirmwareUpgradeController.cc @@ -363,48 +363,44 @@ void FirmwareUpgradeController::_initFirmwareHash() // PX4 Firmwares for (const FirmwareType_t& firmwareType: px4MapFirmwareTypeToDir.keys()) { QString dir = px4MapFirmwareTypeToDir[firmwareType]; - _rgFMUV5Firmware.insert (FirmwareIdentifier(AutoPilotStackPX4, firmwareType, DefaultVehicleFirmware), px4Url.arg(dir).arg("v5")); - _rgFMUV4PROFirmware.insert (FirmwareIdentifier(AutoPilotStackPX4, firmwareType, DefaultVehicleFirmware), px4Url.arg(dir).arg("v4pro")); - _rgFMUV4Firmware.insert (FirmwareIdentifier(AutoPilotStackPX4, firmwareType, DefaultVehicleFirmware), px4Url.arg(dir).arg("v4")); - _rgFMUV3Firmware.insert (FirmwareIdentifier(AutoPilotStackPX4, firmwareType, DefaultVehicleFirmware), px4Url.arg(dir).arg("v3")); - _rgPX4FMUV2Firmware.insert (FirmwareIdentifier(AutoPilotStackPX4, firmwareType, DefaultVehicleFirmware), px4Url.arg(dir).arg("v2")); + _rgFMUV5Firmware.insert (FirmwareIdentifier(AutoPilotStackPX4, firmwareType, DefaultVehicleFirmware), px4Url.arg(dir).arg("v5")); + _rgFMUV4PROFirmware.insert (FirmwareIdentifier(AutoPilotStackPX4, firmwareType, DefaultVehicleFirmware), px4Url.arg(dir).arg("v4pro")); + _rgFMUV4Firmware.insert (FirmwareIdentifier(AutoPilotStackPX4, firmwareType, DefaultVehicleFirmware), px4Url.arg(dir).arg("v4")); + _rgFMUV3Firmware.insert (FirmwareIdentifier(AutoPilotStackPX4, firmwareType, DefaultVehicleFirmware), px4Url.arg(dir).arg("v3")); + _rgPX4FMUV2Firmware.insert (FirmwareIdentifier(AutoPilotStackPX4, firmwareType, DefaultVehicleFirmware), px4Url.arg(dir).arg("v2")); } #if !defined(NO_ARDUPILOT_DIALECT) - // ArduPilot Firmwares + // ArduPilot non-ChibiOS Firmwares for direct board id to fmu mappings for (const FirmwareType_t& firmwareType: apmMapFirmwareTypeToDir.keys()) { QString firmwareTypeDir = apmMapFirmwareTypeToDir[firmwareType]; for (const FirmwareVehicleType_t& vehicleType: apmMapVehicleTypeToDir.keys()) { QString vehicleTypeDir = apmMapVehicleTypeToDir[vehicleType]; QString px4Dir = apmMapVehicleTypeToPX4Dir[vehicleType]; QString filename = apmMapVehicleTypeToFilename[vehicleType]; - _rgFMUV5Firmware.insert (FirmwareIdentifier(AutoPilotStackAPM, firmwareType, vehicleType), apmUrl.arg(vehicleTypeDir).arg(firmwareTypeDir).arg(px4Dir).arg(filename).arg("5")); - _rgFMUV4Firmware.insert (FirmwareIdentifier(AutoPilotStackAPM, firmwareType, vehicleType), apmUrl.arg(vehicleTypeDir).arg(firmwareTypeDir).arg(px4Dir).arg(filename).arg("4")); - _rgFMUV3Firmware.insert (FirmwareIdentifier(AutoPilotStackAPM, firmwareType, vehicleType), apmUrl.arg(vehicleTypeDir).arg(firmwareTypeDir).arg(px4Dir).arg(filename).arg("3")); + _rgFMUV5Firmware.insert (FirmwareIdentifier(AutoPilotStackAPM, firmwareType, vehicleType), apmUrl.arg(vehicleTypeDir).arg(firmwareTypeDir).arg(px4Dir).arg(filename).arg("5")); + _rgFMUV4Firmware.insert (FirmwareIdentifier(AutoPilotStackAPM, firmwareType, vehicleType), apmUrl.arg(vehicleTypeDir).arg(firmwareTypeDir).arg(px4Dir).arg(filename).arg("4")); + _rgFMUV3Firmware.insert (FirmwareIdentifier(AutoPilotStackAPM, firmwareType, vehicleType), apmUrl.arg(vehicleTypeDir).arg(firmwareTypeDir).arg(px4Dir).arg(filename).arg("3")); _rgPX4FMUV2Firmware.insert (FirmwareIdentifier(AutoPilotStackAPM, firmwareType, vehicleType), apmUrl.arg(vehicleTypeDir).arg(firmwareTypeDir).arg(px4Dir).arg(filename).arg("2")); } } -#endif -#if !defined(NO_ARDUPILOT_DIALECT) - // ArduPilot ChibiOS Firmwares when board id is is a known type. These are added directly into the various board type hashes. + // ArduPilot ChibiOS Firmwares for direct board id to fmu mappings. Used when bootloader is not new ArduPilot bootloader. for (const FirmwareType_t& firmwareType: apmMapFirmwareTypeToDir.keys()) { QString firmwareTypeDir = apmMapFirmwareTypeToDir[firmwareType]; for (const FirmwareVehicleType_t& vehicleType: apmChibiOSMapVehicleTypeToDir.keys()) { QString vehicleTypeDir = apmChibiOSMapVehicleTypeToDir[vehicleType]; QString fmuDir = apmChibiOSMapVehicleTypeToFmuDir[vehicleType]; QString filename = apmChibiOSMapVehicleTypeToFilename[vehicleType]; - _rgFMUV5Firmware.insert (FirmwareIdentifier(AutoPilotStackAPM, firmwareType, vehicleType), apmChibiOSUrl.arg(vehicleTypeDir).arg(firmwareTypeDir).arg("5").arg(fmuDir).arg(filename)); - _rgFMUV4Firmware.insert (FirmwareIdentifier(AutoPilotStackAPM, firmwareType, vehicleType), apmChibiOSUrl.arg(vehicleTypeDir).arg(firmwareTypeDir).arg("4").arg(fmuDir).arg(filename)); - _rgFMUV3Firmware.insert (FirmwareIdentifier(AutoPilotStackAPM, firmwareType, vehicleType), apmChibiOSUrl.arg(vehicleTypeDir).arg(firmwareTypeDir).arg("3").arg(fmuDir).arg(filename)); - _rgPX4FMUV2Firmware.insert (FirmwareIdentifier(AutoPilotStackAPM, firmwareType, vehicleType), apmChibiOSUrl.arg(vehicleTypeDir).arg(firmwareTypeDir).arg("2").arg(fmuDir).arg(filename)); + _rgFMUV5Firmware.insert (FirmwareIdentifier(AutoPilotStackAPM, firmwareType, vehicleType), apmChibiOSUrl.arg(vehicleTypeDir).arg(firmwareTypeDir).arg("5").arg(fmuDir).arg(filename)); + _rgFMUV4Firmware.insert (FirmwareIdentifier(AutoPilotStackAPM, firmwareType, vehicleType), apmChibiOSUrl.arg(vehicleTypeDir).arg(firmwareTypeDir).arg("4").arg(fmuDir).arg(filename)); + _rgFMUV3Firmware.insert (FirmwareIdentifier(AutoPilotStackAPM, firmwareType, vehicleType), apmChibiOSUrl.arg(vehicleTypeDir).arg(firmwareTypeDir).arg("3").arg(fmuDir).arg(filename)); + _rgPX4FMUV2Firmware.insert (FirmwareIdentifier(AutoPilotStackAPM, firmwareType, vehicleType), apmChibiOSUrl.arg(vehicleTypeDir).arg(firmwareTypeDir).arg("2").arg(fmuDir).arg(filename)); } } -#endif -#if !defined(NO_ARDUPILOT_DIALECT) // ArduPilot ChibiOS Firmwares when board id is an unknown type but follows ArduPilot port info naming conventions. - // This is only used if the board using the ArduPilot port naming scheme. + // This is only used if the board is using the new ArduPilot bootloader port naming scheme. for (const FirmwareType_t& firmwareType: apmMapFirmwareTypeToDir.keys()) { QString firmwareTypeDir = apmMapFirmwareTypeToDir[firmwareType]; for (const FirmwareVehicleType_t& vehicleType: apmChibiOSMapVehicleTypeToDir.keys()) { @@ -487,85 +483,75 @@ void FirmwareUpgradeController::_bootloaderSyncFailed(void) QHash* FirmwareUpgradeController::_firmwareHashForBoardId(int boardId) { - QHash* rgFirmware; + + _rgFirmwareDynamic.clear(); switch (boardId) { case Bootloader::boardIDPX4Flow: - rgFirmware = &_rgPX4FLowFirmware; + _rgFirmwareDynamic = _rgPX4FLowFirmware; break; case Bootloader::boardIDPX4FMUV2: - rgFirmware = &_rgPX4FMUV2Firmware; + _rgFirmwareDynamic = _rgPX4FMUV2Firmware; break; case Bootloader::boardIDPX4FMUV3: - rgFirmware = &_rgFMUV3Firmware; + _rgFirmwareDynamic = _rgFMUV3Firmware; break; case Bootloader::boardIDPX4FMUV4: - rgFirmware = &_rgFMUV4Firmware; + _rgFirmwareDynamic = _rgFMUV4Firmware; break; case Bootloader::boardIDPX4FMUV4PRO: - rgFirmware = &_rgFMUV4PROFirmware; + _rgFirmwareDynamic = _rgFMUV4PROFirmware; break; case Bootloader::boardIDPX4FMUV5: - rgFirmware = &_rgFMUV5Firmware; + _rgFirmwareDynamic = _rgFMUV5Firmware; break; case Bootloader::boardIDAeroCore: - rgFirmware = &_rgAeroCoreFirmware; + _rgFirmwareDynamic = _rgAeroCoreFirmware; break; case Bootloader::boardIDAUAVX2_1: - rgFirmware = &_rgAUAVX2_1Firmware; + _rgFirmwareDynamic = _rgAUAVX2_1Firmware; break; case Bootloader::boardIDMINDPXFMUV2: - rgFirmware = &_rgMindPXFMUV2Firmware; + _rgFirmwareDynamic = _rgMindPXFMUV2Firmware; break; case Bootloader::boardIDTAPV1: - rgFirmware = &_rgTAPV1Firmware; + _rgFirmwareDynamic = _rgTAPV1Firmware; break; case Bootloader::boardIDASCV1: - rgFirmware = &_rgASCV1Firmware; + _rgFirmwareDynamic = _rgASCV1Firmware; break; case Bootloader::boardIDCrazyflie2: - rgFirmware = &_rgCrazyflie2Firmware; + _rgFirmwareDynamic = _rgCrazyflie2Firmware; break; case Bootloader::boardIDOmnibusF4SD: - rgFirmware = &_rgOmnibusF4SDFirmware; + _rgFirmwareDynamic = _rgOmnibusF4SDFirmware; break; case Bootloader::boardIDNXPHliteV3: - rgFirmware = &_rgNXPHliteV3Firmware; + _rgFirmwareDynamic = _rgNXPHliteV3Firmware; break; case Bootloader::boardID3DRRadio: - rgFirmware = &_rg3DRRadioFirmware; + _rgFirmwareDynamic = _rg3DRRadioFirmware; break; default: - rgFirmware = Q_NULLPTR; + // Unknown board id + break; } - if (rgFirmware) { - _rgFirmwareDynamic = *rgFirmware; - } else { - _rgFirmwareDynamic.clear(); - } + // Check for ArduPilot ChibiOS bootloader + QStringList rgManufacturers = { QStringLiteral("ArduPilot"), QStringLiteral("Hex/ProfiCNC"), QStringLiteral("Holybro") }; + QString apmDescriptionSuffix("-BL"); + if (rgManufacturers.contains(_foundBoardInfo.manufacturer()) && _foundBoardInfo.description().endsWith(apmDescriptionSuffix)) { + // Board ios using a ChibiOS bootloader. Prefer naming scheme from that over board ids for ArduPilot entries. - // Special case handling for ArduPilot named ChibiOS board - if (_foundBoardInfo.manufacturer() == QStringLiteral("ArduPilot") || _foundBoardInfo.manufacturer() == QStringLiteral("Hex/ProfiCNC")) { - // Remove the ChibiOS by board id entries from the list - for (const FirmwareIdentifier& firmwareId: _rgFirmwareDynamic.keys()) { - switch (firmwareId.firmwareVehicleType) { - case CopterChibiOSFirmware: - case HeliChibiOSFirmware: - case PlaneChibiOSFirmware: - case RoverChibiOSFirmware: - case SubChibiOSFirmware: - _rgAPMChibiosReplaceNamedBoardFirmware.remove(firmwareId); - break; - default: - break; - } + // First remove the ChibiOS by board id entries from the list + for (const FirmwareIdentifier& firmwareId: _rgAPMChibiosReplaceNamedBoardFirmware.keys()) { + _rgFirmwareDynamic.remove(firmwareId); } - // Add the ChibiOS by board description entries to the list + // Now add the ChibiOS by board description entries to the list for (const FirmwareIdentifier& firmwareId: _rgAPMChibiosReplaceNamedBoardFirmware.keys()) { QString namedUrl = _rgAPMChibiosReplaceNamedBoardFirmware[firmwareId]; - _rgFirmwareDynamic.insert(firmwareId, namedUrl.replace(_apmBoardDescriptionReplaceText, _foundBoardInfo.description().left(_foundBoardInfo.description().length() - 3))); + _rgFirmwareDynamic.insert(firmwareId, namedUrl.replace(_apmBoardDescriptionReplaceText, _foundBoardInfo.description().left(_foundBoardInfo.description().length() - apmDescriptionSuffix.length()))); } } @@ -577,21 +563,16 @@ void FirmwareUpgradeController::_getFirmwareFile(FirmwareIdentifier firmwareId) { QHash* prgFirmware = _firmwareHashForBoardId(static_cast(_bootloaderBoardID)); - if (!prgFirmware && firmwareId.firmwareType != CustomFirmware) { - _errorCancel(tr("Attempting to flash an unknown board type, you must select 'Custom firmware file'")); - return; - } - if (firmwareId.firmwareType == CustomFirmware) { _firmwareFilename = QGCQFileDialog::getOpenFileName(nullptr, // Parent to main window tr("Select Firmware File"), // Dialog Caption QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation), // Initial directory - tr("Firmware Files (*.px4 *.bin *.ihx)")); // File filter + tr("Firmware Files (*.px4 *.apj *.bin *.ihx)")); // File filter } else { if (prgFirmware->contains(firmwareId)) { _firmwareFilename = prgFirmware->value(firmwareId); } else { - _errorCancel(tr("Unable to find specified firmware download location")); + _errorCancel(tr("Unable to find specified firmware for board type")); return; } } diff --git a/src/VehicleSetup/PX4FirmwareUpgradeThread.cc b/src/VehicleSetup/PX4FirmwareUpgradeThread.cc index 5cfcf8d..7b70c29 100644 --- a/src/VehicleSetup/PX4FirmwareUpgradeThread.cc +++ b/src/VehicleSetup/PX4FirmwareUpgradeThread.cc @@ -125,6 +125,7 @@ bool PX4FirmwareUpgradeThreadWorker::_findBoardFromPorts(QGCSerialPortInfo& port qCDebug(FirmwareUpgradeVerboseLog) << "Serial Port --------------"; qCDebug(FirmwareUpgradeVerboseLog) << "\tboard type" << boardType; qCDebug(FirmwareUpgradeVerboseLog) << "\tboard name" << boardName; + qCDebug(FirmwareUpgradeVerboseLog) << "\tmanufacturer:" << info.manufacturer(); qCDebug(FirmwareUpgradeVerboseLog) << "\tport name:" << info.portName(); qCDebug(FirmwareUpgradeVerboseLog) << "\tdescription:" << info.description(); qCDebug(FirmwareUpgradeVerboseLog) << "\tsystem location:" << info.systemLocation(); From 38c368a52f46124075aebac7a2c0babf567ea76c Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Tue, 26 Mar 2019 10:05:18 -0700 Subject: [PATCH 6/6] Better specifications for ArduPilot ChibiOS and Holybro --- ChangeLog.md | 3 +-- src/comm/QGCSerialPortInfo.cc | 2 +- src/comm/USBBoardInfo.json | 5 +++++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index e230561..a93f909 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,12 +6,11 @@ Note: This file only contains high level features or important fixes. ### 3.6.0 - Daily Build +* Improved support for flashing/connecting to ChibiOS bootloaders boards. * Making the camera API available to all firmwares, not just PX4. * ArduPilot: Support configurable mavlink stream rates. Available from Settings/Mavlink page. * Major rewrite and bug fix pass through Structure Scan. Previous version had such bad problems that it can no longer be supported. Plans with Structure Scan will need to be recreated. New QGC will not load old Structure Scan plans. -* Major rewrite and bug fix pass through Structure Scan. Previous version had such bad problems that it can no longer be supported. Plans with Structure Scan will need to be recreated. New QGC will not load old Structure Scan plans. - ### 3.5.1 - Not yet released * Fix tile set count but in OfflineMaps which would cause image and elevation tile set to have incorrect counts and be incorrectly marked as download incomplete. diff --git a/src/comm/QGCSerialPortInfo.cc b/src/comm/QGCSerialPortInfo.cc index 539a8c7..1818835 100644 --- a/src/comm/QGCSerialPortInfo.cc +++ b/src/comm/QGCSerialPortInfo.cc @@ -225,7 +225,7 @@ bool QGCSerialPortInfo::getBoardInfo(QGCSerialPortInfo::BoardType_t& boardType, for (int i=0; i<_boardInfoList.count(); i++) { const BoardInfo_t& boardInfo = _boardInfoList[i]; - if (vendorIdentifier() == boardInfo.vendorId && productIdentifier() == boardInfo.productId) { + if (vendorIdentifier() == boardInfo.vendorId && (productIdentifier() == boardInfo.productId || boardInfo.productId == 0)) { boardType = boardInfo.boardType; name = boardInfo.name; return true; diff --git a/src/comm/USBBoardInfo.json b/src/comm/USBBoardInfo.json index 6a91abb..b5f39db 100644 --- a/src/comm/USBBoardInfo.json +++ b/src/comm/USBBoardInfo.json @@ -21,6 +21,11 @@ { "vendorID": 9900, "productID": 1, "boardClass": "Pixhawk", "name": "Omnibus F4 SD" }, { "vendorID": 8137, "productID": 28, "boardClass": "Pixhawk", "name": "PX4 NXPHlite v3.x" }, + { "vendorID": 1155, "productID": 22336, "boardClass": "Pixhawk", "name": "ArduPilot ChibiOS" }, + { "vendorID": 4617, "productID": 22336, "boardClass": "Pixhawk", "name": "ArduPilot ChibiOS" }, + + { "vendorID": 12642, "productID": 0, "boardClass": "Pixhawk", "name": "Holybro" }, + { "vendorID": 9900, "productID": 21, "boardClass": "PX4 Flow", "name": "PX4 Flow" }, { "vendorID": 1027, "productID": 24597, "boardClass": "SiK Radio", "name": "SiK Radio", "comment": "3DR Radio" },