#include <QDir>
#include <QApplication>
#include <QDebug>
+#include <QTimer>
#include "gpsposition.h"
#include "gpspositioninterface.h"
GPSPosition::GPSPosition(QObject *parent)
: GPSPositionInterface(parent),
+ m_gpsSource(0),
m_running(false),
m_updateInterval(DEFAULT_UPDATE_INTERVAL)
{
- m_gpsSource = QGeoPositionInfoSource::createDefaultSource(this);
+}
+
+GPSPosition::~GPSPosition()
+{
+ stop();
+}
- if (!m_gpsSource) {
+void GPSPosition::setMode(Mode mode, const QString &filePath)
+{
+ if (m_gpsSource) {
+ disconnect(m_gpsSource, 0, 0, 0);
+ delete m_gpsSource;
+ }
+
+ if (mode == GPSPositionInterface::Default)
+ m_gpsSource = QGeoPositionInfoSource::createDefaultSource(this);
+
+ if ((!m_gpsSource) || (mode == GPSPositionInterface::Simulation)) {
+ qDebug() << "Using NMEA info source.";
QNmeaPositionInfoSource *nmeaSource = new QNmeaPositionInfoSource(
QNmeaPositionInfoSource::SimulationMode, this);
- QFile *logFile = new QFile(":/res/dummy/nmealog.txt", this);
+ QFile *logFile = new QFile(filePath, this);
+
nmeaSource->setDevice(logFile);
m_gpsSource = nmeaSource;
-
- emit error(tr("Could not start GPS. Using NMEA data source."));
}
- m_gpsSource->setUpdateInterval(m_updateInterval);
-
- connect(m_gpsSource, SIGNAL(positionUpdated(QGeoPositionInfo)),
- this, SLOT(positionUpdated(QGeoPositionInfo)));
- connect(m_gpsSource, SIGNAL(updateTimeout()), this, SLOT(updateTimeout()));
-}
+ if (m_gpsSource) {
+ connect(m_gpsSource, SIGNAL(positionUpdated(QGeoPositionInfo)),
+ this, SLOT(positionUpdated(QGeoPositionInfo)));
+ connect(m_gpsSource, SIGNAL(updateTimeout()), this, SLOT(updateTimeout()));
-GPSPosition::~GPSPosition()
-{
- stop();
+ m_gpsSource->setUpdateInterval(m_updateInterval);
+ }
}
void GPSPosition::start()
emit m_gpsSource->requestUpdate(DEFAULT_UPDATE_INTERVAL);
}
+void GPSPosition::lastPosition()
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ QGeoCoordinate coordinate = m_gpsSource->lastKnownPosition().coordinate();
+
+ if (coordinate.isValid()) {
+ qreal accuracy = biggerAccuracy(m_gpsSource->lastKnownPosition());
+ emit position(QPointF(coordinate.longitude(), coordinate.latitude()), accuracy);
+ }
+}
+
void GPSPosition::positionUpdated(QGeoPositionInfo positionInfo)
{
qDebug() << __PRETTY_FUNCTION__;
- emit position(QPointF(positionInfo.coordinate().longitude(),
- positionInfo.coordinate().latitude()));
+ if (positionInfo.coordinate().isValid()) {
+
+ qreal accuracy = biggerAccuracy(positionInfo);
+
+ emit position(QPointF(positionInfo.coordinate().longitude(),
+ positionInfo.coordinate().latitude()), accuracy);
+ }
}
void GPSPosition::updateTimeout()
void GPSPosition::setUpdateInterval(int interval)
{
+ qDebug() << __PRETTY_FUNCTION__;
+
if (m_updateInterval != interval) {
m_updateInterval = interval;
m_gpsSource->setUpdateInterval(m_updateInterval);
}
}
+
+qreal GPSPosition::biggerAccuracy(QGeoPositionInfo positionInfo)
+{
+ qDebug() << __PRETTY_FUNCTION__;
+
+ qreal horizontalAccuracy = ACCURACY_UNDEFINED;
+ qreal verticalAccuracy = ACCURACY_UNDEFINED;
+
+ if (positionInfo.hasAttribute(QGeoPositionInfo::HorizontalAccuracy))
+ horizontalAccuracy = positionInfo.attribute(QGeoPositionInfo::HorizontalAccuracy);
+
+ if (positionInfo.hasAttribute(QGeoPositionInfo::VerticalAccuracy))
+ verticalAccuracy = positionInfo.attribute(QGeoPositionInfo::VerticalAccuracy);
+
+ int accuracy = verticalAccuracy;
+
+ if (horizontalAccuracy > accuracy)
+ accuracy = horizontalAccuracy;
+
+ return accuracy;
+}