Enroute Flight Navigation
A navigation app for VFR pilots
TrafficDataProvider.h
1/***************************************************************************
2 * Copyright (C) 2021-2024 by Stefan Kebekus *
3 * stefan.kebekus@gmail.com *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 3 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
20
21#pragma once
22
23#include <QNetworkDatagram>
24#include <QStandardPaths>
25#include <QUdpSocket>
26
27#include "GlobalObject.h"
28#include "positioning/PositionInfoSource_Abstract.h"
29#include "traffic/ConnectionInfo.h"
30#include "traffic/TrafficDataSource_Abstract.h"
31
32namespace Traffic {
33
54 Q_OBJECT
55 QML_ELEMENT
56 QML_SINGLETON
57
58public:
63 explicit TrafficDataProvider(QObject *parent = nullptr);
64
65 // No default constructor, important for QML singleton
66 explicit TrafficDataProvider() = delete;
67
68 // factory function for QML singleton
69 static Traffic::TrafficDataProvider* create(QQmlEngine* /*unused*/, QJSEngine* /*unused*/)
70 {
72 }
73
74 //
75 // Properties
76 //
77
84
90 Q_PROPERTY(QList<Traffic::TrafficDataSource_Abstract*> dataSources READ dataSources NOTIFY dataSourcesChanged)
91
92
101
110
119 Q_PROPERTY(QList<Traffic::TrafficFactor_WithPosition*> trafficObjects READ trafficObjects CONSTANT)
120
128
137
146
153 Q_PROPERTY(Traffic::Warning warning READ warning NOTIFY warningChanged)
154
155
156
157 //
158 // Getter Methods
159 //
160
165 [[nodiscard]] bool currentSourceIsInternetService() const {return m_currentSourceIsInternetService.value();}
166
171 [[nodiscard]] QBindable<bool> bindableCurrentSourceIsInternetService() const {return &m_currentSourceIsInternetService;}
172
177 [[nodiscard]] QList<Traffic::TrafficDataSource_Abstract*> dataSources() const;
178
183 [[nodiscard]] Units::Distance pressureAltitude() const {return m_pressureAltitude.value();}
184
189 [[nodiscard]] QBindable<Units::Distance> bindablePressureAltitude() const {return &m_pressureAltitude;}
190
195 [[nodiscard]] bool receivingHeartbeat() const
196 {
197 return m_receivingHeartbeat.value();
198 }
199
204 [[nodiscard]] QBindable<bool> bindableReceivingHeartbeat() const
205 {
206 return &m_receivingHeartbeat;
207 }
208
213 [[nodiscard]] QList<Traffic::TrafficFactor_WithPosition*> trafficObjects() const
214 {
215 return m_trafficObjects;
216 }
217
223 {
224 return m_trafficObjectWithoutPosition;
225 }
226
231 [[nodiscard]] QString trafficReceiverRuntimeError() const
232 {
233 return m_trafficReceiverRuntimeError;
234 }
235
240 [[nodiscard]] QString trafficReceiverSelfTestError() const
241 {
242 return m_trafficReceiverSelfTestError;
243 }
244
249 [[nodiscard]] Traffic::Warning warning() const
250 {
251 return m_Warning;
252 }
253
254
255
256 //
257 // Methods
258 //
259
269
279 Q_INVOKABLE QString addDataSource(const Traffic::ConnectionInfo &connectionInfo);
280
289 Q_INVOKABLE QString addDataSource_UDP(quint16 port);
290
299 Q_INVOKABLE QString addDataSource_SerialPort(const QString& portName);
300
311 Q_INVOKABLE QString addDataSource_TCP(const QString& host, quint16 port);
312
319 Q_INVOKABLE QString addDataSource_OGN();
320
329
330signals:
333
341 void passwordRequest(const QString& SSID);
342
349 void passwordStorageRequest(const QString& SSID, const QString& password);
350
353
356
359
362
363public slots:
372
378
389 void setPassword(const QString& SSID, const QString &password);
390
391private slots:
392 // Identical to addDataSource, but handles Bluetooth Classic connections only.
393 QString addDataSource_BluetoothClassic(const Traffic::ConnectionInfo &connectionInfo);
394
395 // Identical to addDataSource, but handles Bluetooth Low Energy connections only.
396 QString addDataSource_BluetoothLowEnergy(const Traffic::ConnectionInfo &connectionInfo);
397
398 // Clear all data sources
399 void clearDataSources();
400
401 // Intializations that are moved out of the constructor, in order to avoid
402 // nested uses of constructors in Global.
403 void deferredInitialization();
404
405 // Sends out foreflight broadcast message See
406 // https://www.foreflight.com/connect/spec/
407 void foreFlightBroadcast();
408
409 // Load connection infos from file and create connections
410 void loadConnectionInfos();
411
412 // Called if one of the sources indicates a heartbeat change
413 void onCurrentSourceChanged();
414
415 // Called if one of the sources reports traffic (position unknown)
416 void onTrafficFactorWithPosition(const Traffic::TrafficFactor_WithPosition& factor);
417
418 // Called if one of the sources reports traffic (position known)
419 void onTrafficFactorWithoutPosition(const Traffic::TrafficFactor_DistanceOnly& factor);
420
421 // Called if one of the sources reports or clears an error string
422 void onTrafficReceiverSelfTestError();
423
424 // Called if one of the sources reports or clears an error string
425 void onTrafficReceiverRuntimeError();
426
427 // Resetter method
428 void resetWarning();
429
430 // Save connection infos to file
431 void saveConnectionInfos();
432
433 // Setter method
434 void setWarning(const Traffic::Warning& warning);
435
436private:
437 //
438 // Compute Methods
439 //
440
441 QString computeStatusString();
442
443 // UDP Socket for ForeFlight Broadcast messages.
444 // See https://www.foreflight.com/connect/spec/
445 QNetworkDatagram foreFlightBroadcastDatagram {R"({"App":"Enroute Flight Navigation","GDL90":{"port":4000}})", QHostAddress::Broadcast, 63093};
446 QUdpSocket foreFlightBroadcastSocket;
447 QTimer foreFlightBroadcastTimer;
448
449 // Targets
450 QList<Traffic::TrafficFactor_WithPosition *> m_trafficObjects;
451 QPointer<Traffic::TrafficFactor_DistanceOnly> m_trafficObjectWithoutPosition;
452
453 // TrafficData Sources
454 QProperty<QList<QPointer<Traffic::TrafficDataSource_Abstract>>> m_dataSources;
455
456 QProperty<QPointer<Traffic::TrafficDataSource_Abstract>> m_currentSource;
457 QPropertyNotifier m_currentSourceNotifier;
458 QPointer<Traffic::TrafficDataSource_Abstract> computeCurrentSource();
459
460 QProperty<bool> m_currentSourceIsInternetService;
461
462 // Property cache
463 Traffic::Warning m_Warning;
464 QTimer m_WarningTimer;
465 QString m_trafficReceiverRuntimeError;
466 QString m_trafficReceiverSelfTestError;
467
468 QProperty<Units::Distance> m_pressureAltitude;
469 Units::Distance computePressureAltitude();
470
471 // Reconnect
472 QTimer reconnectionTimer;
473
474 Q_OBJECT_BINDABLE_PROPERTY(Traffic::TrafficDataProvider, bool, m_receivingHeartbeat, &Traffic::TrafficDataProvider::receivingHeartbeatChanged);
475 bool computeReceivingHeartbeat();
476
477 // Standard file name for saveConnectionInfos()
478 QString stdFileName{QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + u"/connectionInfos.data"_s};
479};
480
481} // namespace Traffic
static Q_INVOKABLE Traffic::TrafficDataProvider * trafficDataProvider()
Pointer to appplication-wide static TrafficDataProvider instance.
Abstract base class for all classes that provide geographic position information.
Connection to a traffic data receiver.
QString trafficReceiverSelfTestError
String describing the traffic data receiver errors found in self-test.
QString trafficReceiverRuntimeError
String describing the current traffic data receiver errors.
bool currentSourceIsInternetService
Internet service flag.
void passwordStorageRequest(const QString &SSID, const QString &password)
Password storage request.
void passwordRequest(const QString &SSID)
Password request.
QString trafficReceiverSelfTestError() const
Getter function for the property with the same name.
Traffic::TrafficFactor_DistanceOnly * trafficObjectWithoutPosition() const
Getter method for property with the same name.
QList< Traffic::TrafficDataSource_Abstract * > dataSources
Traffic data sources.
QBindable< bool > bindableReceivingHeartbeat() const
Getter method for property with the same name.
Q_INVOKABLE QString addDataSource_TCP(const QString &host, quint16 port)
Add an additional data source.
Traffic::Warning warning
Current traffic warning.
QList< Traffic::TrafficDataSource_Abstract * > dataSources() const
Getter method for property with the same name.
Q_INVOKABLE QString addDataSource_UDP(quint16 port)
Add an additional data source.
QList< Traffic::TrafficFactor_WithPosition * > trafficObjects() const
Getter method for property with the same name.
QString trafficReceiverRuntimeError() const
Getter function for the property with the same name.
bool receivingHeartbeat() const
Getter method for property with the same name.
bool receivingHeartbeat
Heartbeat indicator.
Units::Distance pressureAltitude
Pressure altitude.
void receivingHeartbeatChanged()
Notifier signal.
void connectToTrafficReceiver()
Start attempt to connect to traffic receiver.
void trafficReceiverRuntimeErrorChanged()
Notifier signal.
Q_INVOKABLE QString addDataSource_SerialPort(const QString &portName)
Add an additional data source.
void trafficReceiverSelfTestErrorChanged()
Notifier signal.
void dataSourcesChanged()
Notifier signal.
void setPassword(const QString &SSID, const QString &password)
Send password to the traffic data sources.
Q_INVOKABLE void removeDataSource(Traffic::TrafficDataSource_Abstract *source)
Remove data sources.
void disconnectFromTrafficReceiver()
Disconnect from traffic receiver.
Traffic::Warning warning() const
Getter method for property with the same name.
void addDataSource(Traffic::TrafficDataSource_Abstract *source)
Add an additional data source.
Q_INVOKABLE QString addDataSource_OGN()
Add an additional data source.
TrafficDataProvider(QObject *parent=nullptr)
Default constructor.
QBindable< Units::Distance > bindablePressureAltitude() const
Getter method for property with the same name.
QList< Traffic::TrafficFactor_WithPosition * > trafficObjects
Traffic objects whose position is known.
QBindable< bool > bindableCurrentSourceIsInternetService() const
Getter method for property with the same name.
Units::Distance pressureAltitude() const
Getter method for property with the same name.
Traffic::TrafficFactor_DistanceOnly * trafficObjectWithoutPosition
Most relevant traffic object whose position is not known.
void warningChanged(const Traffic::Warning &)
Notifier signal.
Q_INVOKABLE QString addDataSource(const Traffic::ConnectionInfo &connectionInfo)
Add an additional data source.
Base class for all traffic receiver data sources.
Traffic factor where only distance is known.
Traffic factor whose precise position is known.
Traffic warning.
Definition Warning.h:40
Convenience class for distance computations.
Definition Distance.h:35
Conversion between units used in aviation.
Definition Angle.h:34