3#include <QtCore/QApplicationStatic>
16 : QObject(parent), _enumerator(enumerator ? std::move(enumerator) : &_enumeratePorts)
21 return _serialPortManager();
26 if (port.physicalDeviceId.isEmpty()) {
29 const qsizetype seen = seenDevices.size();
30 seenDevices.insert(port.physicalDeviceId);
31 return seenDevices.size() != seen;
34QList<SerialPortManager::Port> SerialPortManager::_enumeratePorts()
39 if (info.hasVendorIdentifier() && info.hasProductIdentifier() && !info.serialNumber().isEmpty() &&
40 info.serialNumber() != QStringLiteral(
"0")) {
41 port.physicalDeviceId = QStringLiteral(
"%1:%2:%3")
42 .arg(info.vendorIdentifier())
43 .arg(info.productIdentifier())
44 .arg(info.serialNumber());
46 port.description = info.description();
47 port.systemLocation = info.systemLocation().trimmed();
48 port.portName = info.portName().trimmed();
51 const QString label =
port.description.isEmpty() ? info.manufacturer() :
port.description;
52 if (!label.isEmpty()) {
53 port.displayName = QStringLiteral(
"%1 (%2)").arg(label,
port.portName);
56 (void) info.getBoardInfo(
port.boardType,
port.boardName);
57 port.bootloader = info.isBootloader();
67 if ((_singlePortOnly &&
anyPortReserved()) || (_scanTimer.isValid() && _scanTimer.elapsed() < 1000)) {
70 _ports = _enumerator();
72 QStringList identities;
75 for (
const Port& port : std::as_const(_ports)) {
77 identities.append(port.systemLocation);
78 identities.append(port.portName);
90 _scanTimer.invalidate();
96 const QString name = systemLocation.trimmed();
98 for (
const auto& port : ports) {
99 if (port.systemLocation == name || port.portName == name) {
100 return port.displayName.isEmpty() ? port.portName : port.displayName;
108 const QString port = systemLocation.trimmed();
112 for (
auto it = _reservations.begin(); it != _reservations.end();) {
113 it = it.value().expired() ? _reservations.erase(it) : std::next(it);
115 auto reservation = std::make_shared<const Reservation>(
Reservation{port});
116 _reservations.insert(port, reservation);
122 return !_reservations.value(systemLocation.trimmed()).expired();
127 for (
const auto& reservation : _reservations) {
128 if (!reservation.expired()) {
137 return !systemLocation.trimmed().isEmpty() && !
isPortReserved(systemLocation) &&
143 const QString port = systemLocation.trimmed();
144 if (port.isEmpty()) {
147 for (
auto it = _autoConnectExclusions.begin(); it != _autoConnectExclusions.end();) {
148 it = it.value().expired() ? _autoConnectExclusions.erase(it) : std::next(it);
150 if (
auto existing = _autoConnectExclusions.value(port).lock()) {
153 auto exclusion = std::make_shared<const Reservation>(
Reservation{port});
154 _autoConnectExclusions.insert(port, exclusion);
165 static const QSet<qint32> kDefaultSupportedBaudRates = {
202 QSet<qint32> mergedBaudRateSet(kDefaultSupportedBaudRates.constBegin(), kDefaultSupportedBaudRates.constEnd());
203 (void) mergedBaudRateSet.unite(
204 QSet<qint32>(activeSupportedBaudRates.constBegin(), activeSupportedBaudRates.constEnd()));
206 QList<qint32> mergedBaudRateList = mergedBaudRateSet.values();
207 std::sort(mergedBaudRateList.begin(), mergedBaudRateList.end());
209 QStringList supportBaudRateStrings{};
210 supportBaudRateStrings.reserve(mergedBaudRateList.size());
211 for (
const qint32 rate : std::as_const(mergedBaudRateList)) {
212 supportBaudRateStrings.append(QString::number(rate));
215 return supportBaudRateStrings;
220 return !_autoConnectExclusions.value(systemLocation.trimmed()).expired();
Q_APPLICATION_STATIC(ADSBVehicleManager, _adsbVehicleManager, SettingsManager::instance() ->adsbVehicleManagerSettings())
#define QGC_LOGGING_CATEGORY(name, categoryStr)
QGC's version of Qt QSerialPortInfo. It provides additional information about board types that QGC ca...
static QList< qint32 > standardBaudRates()
Returns a list of available standard baud rates supported by the target platform.
Shared serial inventory and exclusive claims. Called on the application thread.
static SerialPortManager * instance()
bool anyPortReserved() const
std::shared_ptr< const Reservation > ReservationPtr
static QStringList supportedBaudRates()
bool canReservePort(const QString &systemLocation) const
bool isAutoConnectExcluded(const QString &systemLocation) const
void serialPortsChanged()
bool isPortReserved(const QString &systemLocation) const
bool canAutoConnectPort(const QString &systemLocation) const
static bool isPrimaryInterface(const Port &port, QSet< QString > &seenDevices)
ReservationPtr excludeFromAutoConnect(const QString &systemLocation)
Routing exclusions survive reconnects without marking the hardware occupied.
QList< Port > availablePorts()
QString displayName(const QString &systemLocation)
void portsEnumerated(const QStringList &availablePorts)
Emitted only after a fresh scan, never for a retained Android snapshot. Includes native names and pat...
std::function< QList< Port >()> Enumerator
ReservationPtr reservePort(const QString &systemLocation)
void rescan()
As availablePorts(), without reusing a scan made less than a second ago.
QStringList serialPorts() const
GPSCommandSequence port(QByteArrayView port, unsigned baud)
Clears the SBF output of port, keeps a serial port at the link's baud, and selects SBF and the WGS84 ...