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)
emit coordinateChanged(_coordinate);
emit altitudeChanged(_altitude);
emit headingChanged(_heading);
_lastUpdateTimer.restart();
}
void ADSBVehicle::update(mavlink_adsb_vehicle_t& adsbVehicle)
......@@ -84,4 +85,10 @@ void ADSBVehicle::update(mavlink_adsb_vehicle_t& adsbVehicle)
_heading = newHeading;
emit headingChanged(_heading);
}
_lastUpdateTimer.restart();
}
bool ADSBVehicle::expired()
{
return _lastUpdateTimer.hasExpired(expirationTimeoutMs);
}
......@@ -11,6 +11,7 @@
#include <QObject>
#include <QGeoCoordinate>
#include <QElapsedTimer>
#include "QGCMAVLink.h"
......@@ -39,6 +40,10 @@ public:
void update(mavlink_adsb_vehicle_t& adsbVehicle);
void update(const QGeoCoordinate& location, float heading);
/// check if the vehicle is expired and should be removed
bool expired();
signals:
void coordinateChanged(QGeoCoordinate coordinate);
void callsignChanged(QString callsign);
......@@ -46,9 +51,14 @@ signals:
void headingChanged(double heading);
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;
QString _callsign;
QGeoCoordinate _coordinate;
double _altitude;
double _heading;
QElapsedTimer _lastUpdateTimer;
};
......@@ -251,6 +251,10 @@ Vehicle::Vehicle(LinkInterface* link,
_cameras = _firmwarePlugin->createCameraManager(this);
emit dynamicCamerasChanged();
connect(&_adsbTimer, &QTimer::timeout, this, &Vehicle::_adsbTimerTimeout);
_adsbTimer.setSingleShot(false);
_adsbTimer.start(1000);
_airMapController = new AirMapController(this);
connect(qgcApp()->toolbox()->airMapManager(), &AirMapManager::trafficUpdate, this, &Vehicle::_trafficUpdate);
}
......@@ -2928,7 +2932,6 @@ void Vehicle::_trafficUpdate(QString traffic_id, QString vehicle_id, QGeoCoordin
Q_UNUSED(vehicle_id);
// qDebug() << "traffic update:" << traffic_id << vehicle_id << heading << location;
// TODO: filter based on minimum altitude?
// TODO: remove a vehicle after a timeout?
if (_trafficVehicleMap.contains(traffic_id)) {
_trafficVehicleMap[traffic_id]->update(location, heading);
} else {
......@@ -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:
void _vehicleParamLoaded(bool ready);
void _trafficUpdate(QString traffic_id, QString vehicle_id, QGeoCoordinate location, float heading);
void _adsbTimerTimeout();
private:
bool _containsLink(LinkInterface* link);
......@@ -1028,6 +1029,7 @@ private:
QmlObjectListModel _adsbVehicles;
QMap<uint32_t, ADSBVehicle*> _adsbICAOMap;
QMap<QString, ADSBVehicle*> _trafficVehicleMap;
QTimer _adsbTimer;
// Toolbox references
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