From 946b7ea89544bb721c91127c262992bc2ad8ba14 Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Sat, 14 Nov 2015 16:41:26 -0800 Subject: [PATCH] Centralize board type detection --- qgroundcontrol.pro | 2 + src/comm/QGCSerialPortInfo.cc | 106 ++++++++++++++++++ .../QGCSerialPortInfo.h} | 44 +++++++- src/main.cc | 12 +- 4 files changed, 154 insertions(+), 10 deletions(-) create mode 100644 src/comm/QGCSerialPortInfo.cc rename src/{SerialPortIds.h => comm/QGCSerialPortInfo.h} (63%) diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index ad837923c..cf3be7b33 100644 --- a/qgroundcontrol.pro +++ b/qgroundcontrol.pro @@ -302,6 +302,7 @@ WindowsBuild { !iOSBuild { HEADERS += \ + src/comm/QGCSerialPortInfo.h \ src/comm/SerialLink.h \ src/ui/SerialConfigurationWindow.h \ } @@ -407,6 +408,7 @@ SOURCES += \ !iOSBuild { SOURCES += \ + src/comm/QGCSerialPortInfo.cc \ src/comm/SerialLink.cc \ src/ui/SerialConfigurationWindow.cc \ } diff --git a/src/comm/QGCSerialPortInfo.cc b/src/comm/QGCSerialPortInfo.cc new file mode 100644 index 000000000..48bbbbd54 --- /dev/null +++ b/src/comm/QGCSerialPortInfo.cc @@ -0,0 +1,106 @@ +/*===================================================================== + + QGroundControl Open Source Ground Control Station + + (c) 2009 - 2015 QGROUNDCONTROL PROJECT + + This file is part of the QGROUNDCONTROL project + + QGROUNDCONTROL is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + QGROUNDCONTROL is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QGROUNDCONTROL. If not, see . + + ======================================================================*/ + +#include "QGCSerialPortInfo.h" + +QGC_LOGGING_CATEGORY(QGCSerialPortInfoLog, "QGCSerialPortInfoLog") + +QGCSerialPortInfo::QGCSerialPortInfo(const QSerialPort & port) : + QSerialPortInfo(port) +{ + +} + +QGCSerialPortInfo::BoardType_t QGCSerialPortInfo::boardType(void) const +{ + if (isNull()) { + return BoardTypeUnknown; + } + + BoardType_t boardType = BoardTypeUnknown; + + switch (vendorIdentifier()) { + case px4VendorId: + if (productIdentifier() == pixhawkFMUV2ProductId || productIdentifier() == pixhawkFMUV2OldBootloaderProductId) { + qCDebug(QGCSerialPortInfoLog) << "Found PX4 FMU V2"; + boardType = BoardTypePX4FMUV2; + } else if (productIdentifier() == pixhawkFMUV1ProductId) { + qCDebug(QGCSerialPortInfoLog) << "Found PX4 FMU V1"; + boardType = BoardTypePX4FMUV1; + } else if (productIdentifier() == px4FlowProductId) { + qCDebug(QGCSerialPortInfoLog) << "Found PX4 Flow"; + boardType = BoardTypePX4Flow; + } else if (productIdentifier() == AeroCoreProductId) { + qCDebug(QGCSerialPortInfoLog) << "Found AeroCore"; + boardType = BoardTypeAeroCore; + } + break; + case threeDRRadioVendorId: + if (productIdentifier() == threeDRRadioProductId) { + qCDebug(QGCSerialPortInfoLog) << "Found 3DR Radio"; + boardType = BoardType3drRadio; + } + break; + } + + if (boardType == BoardTypeUnknown) { + // Fall back to port name matching which could lead to incorrect board mapping. But in some cases the + // vendor and product id do not come through correctly so this is used as a last chance detection method. + if (description() == "PX4 FMU v2.x" || description() == "PX4 BL FMU v2.x") { + qCDebug(QGCSerialPortInfoLog) << "Found PX4 FMU V2 (by name matching fallback)"; + boardType = BoardTypePX4FMUV2; + } else if (description() == "PX4 FMU v1.x" || description() == "PX4 BL FMU v1.x") { + qCDebug(QGCSerialPortInfoLog) << "Found PX4 FMU V1 (by name matching fallback)"; + boardType = BoardTypePX4FMUV1; + } else if (description().startsWith("PX4 FMU")) { + qCDebug(QGCSerialPortInfoLog) << "Found PX4 FMU, assuming V2 (by name matching fallback)"; + boardType = BoardTypePX4FMUV2; + } + } + + return boardType; +} + +QList QGCSerialPortInfo::availablePorts(void) +{ + QList list; + + foreach(QSerialPortInfo portInfo, QSerialPortInfo::availablePorts()) { + list << *((QGCSerialPortInfo*)&portInfo); + } + + return list; +} + +bool QGCSerialPortInfo::boardTypePixhawk(void) const +{ + BoardType_t boardType = this->boardType(); + + return boardType == BoardTypePX4FMUV1 || boardType == BoardTypePX4FMUV2 || boardType == BoardTypeAeroCore; +} + +bool QGCSerialPortInfo::isBootloader(void) const +{ + // FIXME: Check SerialLink bootloade detect code which is different + return boardTypePixhawk() && description().contains("BL"); +} diff --git a/src/SerialPortIds.h b/src/comm/QGCSerialPortInfo.h similarity index 63% rename from src/SerialPortIds.h rename to src/comm/QGCSerialPortInfo.h index f08ed5d9e..7f99a0c8a 100644 --- a/src/SerialPortIds.h +++ b/src/comm/QGCSerialPortInfo.h @@ -21,13 +21,35 @@ ======================================================================*/ -#ifndef SerialPortIds_H -#define SerialPortIds_H +#ifndef QGCSerialPortInfo_H +#define QGCSerialPortInfo_H -// SerialPortInfo Vendor and Product Ids for known boards -class SerialPortIds { +#ifdef __android__ + #include "qserialportinfo.h" +#else + #include +#endif + +#include "QGCLoggingCategory.h" + +Q_DECLARE_LOGGING_CATEGORY(QGCSerialPortInfoLog) +/// QGC's version of Qt QSerialPortInfo. It provides additional information about board types +/// that QGC cares about. +class QGCSerialPortInfo : public QSerialPortInfo +{ public: + typedef enum { + BoardTypePX4FMUV1, + BoardTypePX4FMUV2, + BoardTypePX4Flow, + BoardType3drRadio, + BoardTypeAeroCore, + BoardTypeUnknown + } BoardType_t; + + // Vendor and products ids for the boards we care about + static const int px4VendorId = 9900; ///< Vendor ID for Pixhawk board (V2 and V1) and PX4 Flow static const int pixhawkFMUV2ProductId = 17; ///< Product ID for Pixhawk V2 board @@ -40,6 +62,20 @@ public: static const int threeDRRadioVendorId = 1027; ///< Vendor ID for 3DR Radio static const int threeDRRadioProductId = 24597; ///< Product ID for 3DR Radio + + QGCSerialPortInfo(const QSerialPort & port); + + /// Override of QSerialPortInfo::availablePorts + static QList availablePorts(void); + + BoardType_t boardType(void) const; + + /// @return true: board is a Pixhawk board + bool boardTypePixhawk(void) const; + + /// @return true: Board is currently in bootloader + bool isBootloader(void) const; + }; #endif diff --git a/src/main.cc b/src/main.cc index e104854cc..2de8233a8 100644 --- a/src/main.cc +++ b/src/main.cc @@ -33,13 +33,13 @@ This file is part of the QGROUNDCONTROL project #include #include -#ifndef __mobile__ - #include -#endif - #include "QGCApplication.h" #include "MainWindow.h" +#ifndef __mobile__ + #include "QGCSerialPortInfo.h" +#endif + #ifdef QT_DEBUG #ifndef __mobile__ #include "UnitTest.h" @@ -58,7 +58,7 @@ This file is part of the QGROUNDCONTROL project #endif #ifndef __mobile__ -Q_DECLARE_METATYPE(QSerialPortInfo) + Q_DECLARE_METATYPE(QGCSerialPortInfo) #endif #ifdef Q_OS_WIN @@ -138,7 +138,7 @@ int main(int argc, char *argv[]) #endif qRegisterMetaType(); #ifndef __mobile__ - qRegisterMetaType(); + qRegisterMetaType(); #endif // We statically link our own QtLocation plugin -- 2.22.0