Merge branch 'list_panel'
[situare] / src / gps / gpsposition.cpp
index 6f43d9b..676fda1 100644 (file)
 #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()
@@ -92,12 +106,29 @@ void GPSPosition::update()
     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()
@@ -109,8 +140,31 @@ 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;
+}