SimulatedPosition.cc 2.34 KB
Newer Older
1 2 3 4 5 6 7 8
/****************************************************************************
 *
 *   (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
 *
 * QGroundControl is licensed according to the terms in the file
 * COPYING.md in the root of the source code directory.
 *
 ****************************************************************************/
Jimmy Johnson's avatar
Jimmy Johnson committed
9 10 11 12 13 14 15 16

#include <QtCore>
#include <QDateTime>
#include <QDate>

#include "SimulatedPosition.h"

SimulatedPosition::SimulatedPosition()
17
    : QGeoPositionInfoSource(nullptr)
Jimmy Johnson's avatar
Jimmy Johnson committed
18
{
19
    _updateTimer.setSingleShot(false);
Jimmy Johnson's avatar
Jimmy Johnson committed
20

21 22 23 24 25 26
    // Initialize position to normal PX4 Gazebo home position
    _lastPosition.setTimestamp(QDateTime::currentDateTime());
    _lastPosition.setCoordinate(QGeoCoordinate(47.3977420, 8.5455941, 488));
    _lastPosition.setAttribute(QGeoPositionInfo::Attribute::Direction, _heading);
    _lastPosition.setAttribute(QGeoPositionInfo::Attribute::GroundSpeed, _horizontalVelocityMetersPerSec);
    _lastPosition.setAttribute(QGeoPositionInfo::Attribute::VerticalSpeed, _verticalVelocityMetersPerSec);
Jimmy Johnson's avatar
Jimmy Johnson committed
27

28
    connect(&_updateTimer, &QTimer::timeout, this, &SimulatedPosition::updatePosition);
Jimmy Johnson's avatar
Jimmy Johnson committed
29 30 31 32
}

QGeoPositionInfo SimulatedPosition::lastKnownPosition(bool /*fromSatellitePositioningMethodsOnly*/) const
{
33
    return _lastPosition;
Jimmy Johnson's avatar
Jimmy Johnson committed
34 35 36 37 38 39 40
}

SimulatedPosition::PositioningMethods SimulatedPosition::supportedPositioningMethods() const
{
    return AllPositioningMethods;
}

41
void SimulatedPosition::startUpdates(void)
Jimmy Johnson's avatar
Jimmy Johnson committed
42
{
43
    _updateTimer.start(qMax(updateInterval(), minimumUpdateInterval()));
Jimmy Johnson's avatar
Jimmy Johnson committed
44 45
}

46
void SimulatedPosition::stopUpdates(void)
Jimmy Johnson's avatar
Jimmy Johnson committed
47
{
48
    _updateTimer.stop();
Jimmy Johnson's avatar
Jimmy Johnson committed
49 50 51 52 53 54 55
}

void SimulatedPosition::requestUpdate(int /*timeout*/)
{
    emit updateTimeout();
}

56
void SimulatedPosition::updatePosition(void)
Jimmy Johnson's avatar
Jimmy Johnson committed
57
{
58
    int intervalMsecs = _updateTimer.interval();
Jimmy Johnson's avatar
Jimmy Johnson committed
59

60 61 62
    QGeoCoordinate  coord =                 _lastPosition.coordinate();
    double          horizontalDistance =    _horizontalVelocityMetersPerSec * (1000.0 / static_cast<double>(intervalMsecs));
    double          verticalDistance =      _verticalVelocityMetersPerSec * (1000.0 / static_cast<double>(intervalMsecs));
Jimmy Johnson's avatar
Jimmy Johnson committed
63

64
    _lastPosition.setCoordinate(coord.atDistanceAndAzimuth(horizontalDistance, _heading, verticalDistance));
Jimmy Johnson's avatar
Jimmy Johnson committed
65

66
    emit positionUpdated(_lastPosition);
Jimmy Johnson's avatar
Jimmy Johnson committed
67 68 69 70 71 72 73 74
}

QGeoPositionInfoSource::Error SimulatedPosition::error() const
{
    return QGeoPositionInfoSource::NoError;
}