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/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 } } } 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; 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/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 { 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(); diff --git a/src/comm/QGCSerialPortInfo.cc b/src/comm/QGCSerialPortInfo.cc index 56e299f..1818835 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..b5f39db 100644 --- a/src/comm/USBBoardInfo.json +++ b/src/comm/USBBoardInfo.json @@ -20,26 +20,29 @@ { "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": 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" }, { "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 +67,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" } ] }