Commit 3f64f28b authored by Beat Küng's avatar Beat Küng

AirMap traffic: remove inactive vehicles after a timeout of 5 seconds

parent b0fcbe05
...@@ -41,6 +41,7 @@ void ADSBVehicle::update(const QGeoCoordinate& location, float heading) ...@@ -41,6 +41,7 @@ void ADSBVehicle::update(const QGeoCoordinate& location, float heading)
emit coordinateChanged(_coordinate); emit coordinateChanged(_coordinate);
emit altitudeChanged(_altitude); emit altitudeChanged(_altitude);
emit headingChanged(_heading); emit headingChanged(_heading);
_lastUpdateTimer.restart();
} }
void ADSBVehicle::update(mavlink_adsb_vehicle_t& adsbVehicle) void ADSBVehicle::update(mavlink_adsb_vehicle_t& adsbVehicle)
...@@ -84,4 +85,10 @@ void ADSBVehicle::update(mavlink_adsb_vehicle_t& adsbVehicle) ...@@ -84,4 +85,10 @@ void ADSBVehicle::update(mavlink_adsb_vehicle_t& adsbVehicle)
_heading = newHeading; _heading = newHeading;
emit headingChanged(_heading); emit headingChanged(_heading);
} }
_lastUpdateTimer.restart();
}
bool ADSBVehicle::expired()
{
return _lastUpdateTimer.hasExpired(expirationTimeoutMs);
} }
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <QObject> #include <QObject>
#include <QGeoCoordinate> #include <QGeoCoordinate>
#include <QElapsedTimer>
#include "QGCMAVLink.h" #include "QGCMAVLink.h"
...@@ -39,6 +40,10 @@ public: ...@@ -39,6 +40,10 @@ public:
void update(mavlink_adsb_vehicle_t& adsbVehicle); void update(mavlink_adsb_vehicle_t& adsbVehicle);
void update(const QGeoCoordinate& location, float heading); void update(const QGeoCoordinate& location, float heading);
/// check if the vehicle is expired and should be removed
bool expired();
signals: signals:
void coordinateChanged(QGeoCoordinate coordinate); void coordinateChanged(QGeoCoordinate coordinate);
void callsignChanged(QString callsign); void callsignChanged(QString callsign);
...@@ -46,9 +51,14 @@ signals: ...@@ -46,9 +51,14 @@ signals:
void headingChanged(double heading); void headingChanged(double heading);
private: private:
static constexpr qint64 expirationTimeoutMs = 5000; ///< timeout with no update in ms after which the vehicle is removed.
///< AirMap sends updates for each vehicle every second.
uint32_t _icaoAddress; uint32_t _icaoAddress;
QString _callsign; QString _callsign;
QGeoCoordinate _coordinate; QGeoCoordinate _coordinate;
double _altitude; double _altitude;
double _heading; double _heading;
QElapsedTimer _lastUpdateTimer;
}; };
...@@ -251,6 +251,10 @@ Vehicle::Vehicle(LinkInterface* link, ...@@ -251,6 +251,10 @@ Vehicle::Vehicle(LinkInterface* link,
_cameras = _firmwarePlugin->createCameraManager(this); _cameras = _firmwarePlugin->createCameraManager(this);
emit dynamicCamerasChanged(); emit dynamicCamerasChanged();
connect(&_adsbTimer, &QTimer::timeout, this, &Vehicle::_adsbTimerTimeout);
_adsbTimer.setSingleShot(false);
_adsbTimer.start(1000);
_airMapController = new AirMapController(this); _airMapController = new AirMapController(this);
connect(qgcApp()->toolbox()->airMapManager(), &AirMapManager::trafficUpdate, this, &Vehicle::_trafficUpdate); connect(qgcApp()->toolbox()->airMapManager(), &AirMapManager::trafficUpdate, this, &Vehicle::_trafficUpdate);
} }
...@@ -2928,7 +2932,6 @@ void Vehicle::_trafficUpdate(QString traffic_id, QString vehicle_id, QGeoCoordin ...@@ -2928,7 +2932,6 @@ void Vehicle::_trafficUpdate(QString traffic_id, QString vehicle_id, QGeoCoordin
Q_UNUSED(vehicle_id); Q_UNUSED(vehicle_id);
// qDebug() << "traffic update:" << traffic_id << vehicle_id << heading << location; // qDebug() << "traffic update:" << traffic_id << vehicle_id << heading << location;
// TODO: filter based on minimum altitude? // TODO: filter based on minimum altitude?
// TODO: remove a vehicle after a timeout?
if (_trafficVehicleMap.contains(traffic_id)) { if (_trafficVehicleMap.contains(traffic_id)) {
_trafficVehicleMap[traffic_id]->update(location, heading); _trafficVehicleMap[traffic_id]->update(location, heading);
} else { } else {
...@@ -2938,6 +2941,20 @@ void Vehicle::_trafficUpdate(QString traffic_id, QString vehicle_id, QGeoCoordin ...@@ -2938,6 +2941,20 @@ void Vehicle::_trafficUpdate(QString traffic_id, QString vehicle_id, QGeoCoordin
} }
} }
void Vehicle::_adsbTimerTimeout()
{
// TODO: take into account _adsbICAOMap as well? Needs to be tested, especially the timeout
for (auto it = _trafficVehicleMap.begin(); it != _trafficVehicleMap.end();) {
if (it.value()->expired()) {
_adsbVehicles.removeOne(it.value());
delete it.value();
it = _trafficVehicleMap.erase(it);
} else {
++it;
}
}
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
......
...@@ -848,6 +848,7 @@ private slots: ...@@ -848,6 +848,7 @@ private slots:
void _vehicleParamLoaded(bool ready); void _vehicleParamLoaded(bool ready);
void _trafficUpdate(QString traffic_id, QString vehicle_id, QGeoCoordinate location, float heading); void _trafficUpdate(QString traffic_id, QString vehicle_id, QGeoCoordinate location, float heading);
void _adsbTimerTimeout();
private: private:
bool _containsLink(LinkInterface* link); bool _containsLink(LinkInterface* link);
...@@ -1028,6 +1029,7 @@ private: ...@@ -1028,6 +1029,7 @@ private:
QmlObjectListModel _adsbVehicles; QmlObjectListModel _adsbVehicles;
QMap<uint32_t, ADSBVehicle*> _adsbICAOMap; QMap<uint32_t, ADSBVehicle*> _adsbICAOMap;
QMap<QString, ADSBVehicle*> _trafficVehicleMap; QMap<QString, ADSBVehicle*> _trafficVehicleMap;
QTimer _adsbTimer;
// Toolbox references // Toolbox references
FirmwarePluginManager* _firmwarePluginManager; FirmwarePluginManager* _firmwarePluginManager;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment