QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
SerialPortManager.h
Go to the documentation of this file.
1#pragma once
2
3#include <chrono>
4#include <functional>
5#include <memory>
6
7#include <QtCore/QElapsedTimer>
8#include <QtCore/QHash>
9#include <QtCore/QMap>
10#include <QtCore/QObject>
11#include <QtCore/QSet>
12#include <QtCore/QStringList>
13#include <QtQmlIntegration/QtQmlIntegration>
14
15#include "QGCSerialPortInfo.h"
16
18class SerialPortManager : public QObject
19{
20 Q_OBJECT
21 QML_ELEMENT
22 QML_UNCREATABLE("Managed by QGroundControl")
23
24 Q_PROPERTY(QStringList serialPorts READ serialPorts NOTIFY serialPortsChanged)
25 Q_PROPERTY(QStringList serialBaudRates READ supportedBaudRates CONSTANT)
26
27public:
40
42 {
44 };
45
46 using ReservationPtr = std::shared_ptr<const Reservation>;
47 using Enumerator = std::function<QList<Port>()>;
48
50#ifdef Q_OS_WIN
51 // Allow the bootloader to finish before opening a new Windows device.
52 static constexpr std::chrono::milliseconds NEW_PORT_SETTLE_DELAY{6000};
53#else
54 static constexpr std::chrono::milliseconds NEW_PORT_SETTLE_DELAY{1000};
55#endif
56
57 explicit SerialPortManager(QObject* parent = nullptr, Enumerator enumerator = {});
59
62 static bool isPrimaryInterface(const Port& port, QSet<QString>& seenDevices);
63
64 QList<Port> availablePorts();
66 void rescan();
67 QString displayName(const QString& systemLocation);
68
69 QStringList serialPorts() const { return _serialPorts; }
70
71 static QStringList supportedBaudRates();
72 ReservationPtr reservePort(const QString& systemLocation);
73 bool canReservePort(const QString& systemLocation) const;
74 bool isPortReserved(const QString& systemLocation) const;
75 bool anyPortReserved() const;
76
78 ReservationPtr excludeFromAutoConnect(const QString& systemLocation);
79 bool canAutoConnectPort(const QString& systemLocation) const;
80 bool isAutoConnectExcluded(const QString& systemLocation) const;
81
82 void setSinglePortOnly(bool enabled) { _singlePortOnly = enabled; }
83
84signals:
87 void portsEnumerated(const QStringList& availablePorts);
88
89private:
90 static QList<Port> _enumeratePorts();
91 Enumerator _enumerator;
92 QList<Port> _ports;
93 QStringList _serialPorts;
94 QElapsedTimer _scanTimer;
95 QHash<QString, std::weak_ptr<const Reservation>> _reservations;
96 QHash<QString, std::weak_ptr<const Reservation>> _autoConnectExclusions;
97 bool _singlePortOnly = false;
98};
99
103{
104 friend class LinkManagerTest;
106
107public:
109 bool settled(const QString& port, quint64 nowUs)
110 {
111 const auto it = _deadlinesUs.constFind(port);
112 if (it == _deadlinesUs.cend()) {
113 _deadlinesUs.insert(port, nowUs + std::chrono::duration_cast<std::chrono::microseconds>(
115 .count());
116 return false;
117 }
118 return nowUs >= *it;
119 }
120
121 bool contains(const QString& port) const { return _deadlinesUs.contains(port); }
122
123 bool isEmpty() const { return _deadlinesUs.isEmpty(); }
124
125 void remove(const QString& port) { _deadlinesUs.remove(port); }
126
128 template <typename Predicate>
129 void removeIf(Predicate forget)
130 {
131 _deadlinesUs.removeIf([&forget](const auto& it) { return forget(it.key()); });
132 }
133
134 void clear() { _deadlinesUs.clear(); }
135
136private:
137 QMap<QString, quint64> _deadlinesUs;
138};
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)
static constexpr std::chrono::milliseconds NEW_PORT_SETTLE_DELAY
How long a newly listed port settles before automatic connection opens it.
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
void setSinglePortOnly(bool enabled)
void removeIf(Predicate forget)
Forgets the ports forget returns true for.
bool contains(const QString &port) const
bool settled(const QString &port, quint64 nowUs)
Records port as listed at nowUs; true once it has been listed for the settle delay.
void remove(const QString &port)
QGCSerialPortInfo::BoardType_t boardType
QString physicalDeviceId
Shared by interfaces with the same VID/PID/serial; empty when identity is unavailable.