QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
SimulatedPosition.cc
Go to the documentation of this file.
1#include "SimulatedPosition.h"
3#include "Vehicle.h"
5
6#include <QtCore/QDateTime>
7#include <QtCore/QTimer>
8
9QGC_LOGGING_CATEGORY(SimulatedPositionLog, "PositionManager.SimulatedPosition")
10
12 : QGeoPositionInfoSource(parent)
13 , _updateTimer(new QTimer(this))
14{
15 // qCDebug(SimulatedPositionLog) << Q_FUNC_INFO << this;
16
17 _lastPosition.setTimestamp(QDateTime::currentDateTime());
18 _lastPosition.setCoordinate(QGeoCoordinate(47.3977420, 8.5455941, 488.));
19 _lastPosition.setAttribute(QGeoPositionInfo::Attribute::Direction, kHeading);
20 _lastPosition.setAttribute(QGeoPositionInfo::Attribute::GroundSpeed, kHorizontalVelocityMetersPerSec);
21 _lastPosition.setAttribute(QGeoPositionInfo::Attribute::VerticalSpeed, kVerticalVelocityMetersPerSec);
22
23 (void) connect(MultiVehicleManager::instance(), &MultiVehicleManager::vehicleAdded, this, &SimulatedPosition::_vehicleAdded);
24
25 _updateTimer->setSingleShot(false);
26 (void) connect(_updateTimer, &QTimer::timeout, this, &SimulatedPosition::_updatePosition);
27}
28
30{
31 // qCDebug(SimulatedPositionLog) << Q_FUNC_INFO << this;
32}
33
35{
36 _updateTimer->start(qMax(updateInterval(), minimumUpdateInterval()));
37}
38
40{
41 _updateTimer->stop();
42}
43
45{
46 emit errorOccurred(QGeoPositionInfoSource::UpdateTimeoutError);
47}
48
49void SimulatedPosition::_updatePosition()
50{
51 const int intervalMsecs = _updateTimer->interval();
52
53 const QGeoCoordinate coord = _lastPosition.coordinate();
54 const qreal horizontalDistance = kHorizontalVelocityMetersPerSec * (1000. / static_cast<qreal>(intervalMsecs));
55 const qreal verticalDistance = kVerticalVelocityMetersPerSec * (1000. / static_cast<qreal>(intervalMsecs));
56
57 _lastPosition.setCoordinate(coord.atDistanceAndAzimuth(horizontalDistance, kHeading, verticalDistance));
58 emit positionUpdated(_lastPosition);
59}
60
61void SimulatedPosition::_vehicleAdded(Vehicle* vehicle)
62{
63 if (!vehicle) {
64 return;
65 }
66
67 if (vehicle->homePosition().isValid()) {
68 _lastPosition.setCoordinate(vehicle->homePosition());
69 } else {
70 _homePositionChangedConnection = connect(vehicle, &Vehicle::homePositionChanged, this, &SimulatedPosition::_vehicleHomePositionChanged);
71 }
72}
73
74void SimulatedPosition::_vehicleHomePositionChanged(QGeoCoordinate homePosition)
75{
76 if (homePosition.isValid()) {
77 _lastPosition.setCoordinate(homePosition);
78 if (_homePositionChangedConnection) {
79 (void) disconnect(_homePositionChangedConnection);
80 _homePositionChangedConnection = QMetaObject::Connection();
81 }
82 }
83}
#define QGC_LOGGING_CATEGORY(name, categoryStr)
static MultiVehicleManager * instance()
void vehicleAdded(Vehicle *vehicle)
int minimumUpdateInterval() const final
void requestUpdate(int timeout=5000) final
void startUpdates() final
QGeoCoordinate homePosition()
Definition Vehicle.cc:1434
void homePositionChanged(const QGeoCoordinate &homePosition)