From 85d7f06e605fcb57cb6bce12ec1f14b5dbebe8ca Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Mon, 14 Sep 2020 17:56:38 -0700 Subject: [PATCH] Fix composite USB detection (#9069) Co-authored-by: Don Gagne --- QGCCommon.pri | 2 -- src/Vehicle/MultiVehicleManager.cc | 2 +- src/comm/QGCSerialPortInfo.cc | 21 +++++++++++++-------- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/QGCCommon.pri b/QGCCommon.pri index d43957e25..024ec02ec 100644 --- a/QGCCommon.pri +++ b/QGCCommon.pri @@ -113,8 +113,6 @@ linux { } else { QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.6 } - #-- Not forcing anything. Let qmake find the latest, installed SDK. - QMAKE_MAC_SDK = macosx10.15 QMAKE_CXXFLAGS += -fvisibility=hidden QMAKE_CXXFLAGS_WARN_ON += -Werror \ -Wno-unused-parameter # gst-plugins-good diff --git a/src/Vehicle/MultiVehicleManager.cc b/src/Vehicle/MultiVehicleManager.cc index db36fe38f..48e057921 100644 --- a/src/Vehicle/MultiVehicleManager.cc +++ b/src/Vehicle/MultiVehicleManager.cc @@ -81,7 +81,7 @@ void MultiVehicleManager::_vehicleHeartbeatInfo(LinkInterface* link, int vehicle // Special case for PX4 Flow if (vehicleId != 81 || componentId != 50) { // Don't create vehicles for components other than the autopilot - qCDebug(MultiVehicleManagerLog()) << "Ignoring heartbeat from unknown component " + qCDebug(MultiVehicleManagerLog()) << "Ignoring heartbeat from unknown component port:vehicleId:componentId:fwType:vehicleType" << link->getName() << vehicleId << componentId diff --git a/src/comm/QGCSerialPortInfo.cc b/src/comm/QGCSerialPortInfo.cc index b4fd03b67..94acb81f2 100644 --- a/src/comm/QGCSerialPortInfo.cc +++ b/src/comm/QGCSerialPortInfo.cc @@ -294,17 +294,22 @@ QString QGCSerialPortInfo::_boardTypeToString(BoardType_t boardType) QList QGCSerialPortInfo::availablePorts(void) { - QList list; - QStringList seenSerialNumbers; + typedef QPair VidPidPair_t; - for(QSerialPortInfo portInfo: QSerialPortInfo::availablePorts()) { + QList list; + QMap seenSerialNumbers; + + for (QSerialPortInfo portInfo: QSerialPortInfo::availablePorts()) { if (!isSystemPort(&portInfo)) { - if (seenSerialNumbers.contains(portInfo.serialNumber())) { - // Some boards are a composite USB device, with the first port being mavlink and the second something else - qCDebug(QGCSerialPortInfoLog) << "Skipping secondary port on same device" << portInfo.portName() << portInfo.serialNumber(); - continue; + if (portInfo.hasVendorIdentifier() && portInfo.hasProductIdentifier() && !portInfo.serialNumber().isEmpty() && portInfo.serialNumber() != "0") { + VidPidPair_t vidPid(portInfo.vendorIdentifier(), portInfo.productIdentifier()); + if (seenSerialNumbers.contains(vidPid) && seenSerialNumbers[vidPid].contains(portInfo.serialNumber())) { + // Some boards are a composite USB device, with the first port being mavlink and the second something else. We only expose to first mavlink port. + qCDebug(QGCSerialPortInfoLog) << "Skipping secondary port on same device" << portInfo.portName() << portInfo.vendorIdentifier() << portInfo.productIdentifier() << portInfo.serialNumber(); + continue; + } + seenSerialNumbers[vidPid].append(portInfo.serialNumber()); } - seenSerialNumbers.append(portInfo.serialNumber()); list << *((QGCSerialPortInfo*)&portInfo); } } -- 2.22.0