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