[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdeedu/marble/src/plugins/positionprovider/gpsd
From:       Eckhart Wörner <ewoerner () kde ! org>
Date:       2009-05-24 18:10:23
Message-ID: 1243188623.920258.6509.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 972368 by ewoerner:

Move gpsd provider to its own thread
This removes lockups when no gps is present and probably fixes other bugs as well
CCBUG: 171548
CCBUG: 178530


 M  +5 -1      CMakeLists.txt  
 A             GpsdConnection.cpp   [License: LGPL]
 A             GpsdConnection.h   [License: LGPL]
 M  +29 -32    GpsdPositionProviderPlugin.cpp  
 M  +4 -7      GpsdPositionProviderPlugin.h  
 A             GpsdThread.cpp   [License: LGPL]
 A             GpsdThread.h   [License: LGPL]


--- trunk/KDE/kdeedu/marble/src/plugins/positionprovider/gpsd/CMakeLists.txt \
#972367:972368 @@ -9,7 +9,11 @@
 
 include(${QT_USE_FILE})
 
-set( gpsd_SRCS GpsdPositionProviderPlugin.cpp )
+set( gpsd_SRCS
+ GpsdConnection.cpp
+ GpsdPositionProviderPlugin.cpp
+ GpsdThread.cpp
+)
 
 set( GpsdPositionProviderPlugin_LIBS ${libgps_LIBRARIES} )
 
--- trunk/KDE/kdeedu/marble/src/plugins/positionprovider/gpsd/GpsdPositionProviderPlugin.cpp \
#972367:972368 @@ -10,7 +10,7 @@
 
 #include "GpsdPositionProviderPlugin.h"
 
-#include <QtCore/QDebug>
+#include "GpsdThread.h"
 
 
 
@@ -43,41 +43,36 @@
 
 void GpsdPositionProviderPlugin::initialize()
 {
-    m_gpsdData = m_gpsd.open();
-    m_timer = new QTimer;
-    connect( m_timer, SIGNAL( timeout() ), this, SLOT( update() ) );
-    m_timer->start( 1000 );
-    m_initialized = true;
+    m_thread = new GpsdThread;
+    connect( m_thread, SIGNAL( gpsdInfo( gps_data_t ) ),
+             this, SLOT( update( gps_data_t ) ) );
+    m_thread->start();
 }
 
-void GpsdPositionProviderPlugin::update() {
-    //Check that m_gpsd->open() has successfully completed
-    if ( m_gpsdData != 0 ) {
-        m_gpsdData = m_gpsd.query( "o" );
-        PositionProviderStatus oldStatus = m_status;
-        GeoDataCoordinates oldPosition = m_position;
-        if (m_gpsdData->status == STATUS_NO_FIX)
-            m_status = PositionProviderStatusUnavailable;
-        else {
-            m_status = PositionProviderStatusAvailable;
-            m_position.set( m_gpsdData->fix.longitude, m_gpsdData->fix.latitude,
-            m_gpsdData->fix.altitude, GeoDataCoordinates::Degree );
-            m_accuracy.level = GeoDataAccuracy::Detailed;
-            // FIXME: Add real values here
-            m_accuracy.horizontal = 5;
-            m_accuracy.vertical = 5;
-        }
-        if (m_status != oldStatus)
-            emit statusChanged( m_status );
-        // FIXME: Check whether position has changed first
-        if (m_status == PositionProviderStatusAvailable)
-            emit positionChanged( m_position, m_accuracy );
+void GpsdPositionProviderPlugin::update(gps_data_t data) {
+    PositionProviderStatus oldStatus = m_status;
+    GeoDataCoordinates oldPosition = m_position;
+    if (data.status == STATUS_NO_FIX)
+        m_status = PositionProviderStatusUnavailable;
+    else {
+        m_status = PositionProviderStatusAvailable;
+        m_position.set( data.fix.longitude, data.fix.latitude,
+        data.fix.altitude, GeoDataCoordinates::Degree );
+        m_accuracy.level = GeoDataAccuracy::Detailed;
+        // FIXME: Add real values here
+        m_accuracy.horizontal = 5;
+        m_accuracy.vertical = 5;
     }
+    if (m_status != oldStatus)
+        emit statusChanged( m_status );
+    // FIXME: Check whether position has changed first
+    if (m_status == PositionProviderStatusAvailable)
+        emit positionChanged( m_position, m_accuracy );
 }
 
 bool GpsdPositionProviderPlugin::isInitialized() const
 {
-    return m_initialized;
+    return m_thread;
 }
 
 PositionProviderPlugin* GpsdPositionProviderPlugin::newInstance() const
@@ -97,12 +92,14 @@
     return m_accuracy;
 }
 
-GpsdPositionProviderPlugin::GpsdPositionProviderPlugin() : m_initialized(false) {}
+GpsdPositionProviderPlugin::GpsdPositionProviderPlugin() : m_thread( 0 ) {}
 
 GpsdPositionProviderPlugin::~GpsdPositionProviderPlugin()
 {
-    if (m_initialized) {
-        delete m_timer;
+    if (m_thread) {
+        m_thread->exit();
+        m_thread->wait();
+        delete m_thread;
     }
 }
 
--- trunk/KDE/kdeedu/marble/src/plugins/positionprovider/gpsd/GpsdPositionProviderPlugin.h \
#972367:972368 @@ -13,8 +13,6 @@
 
 #include "PositionProviderPlugin.h"
 
-#include <QtCore/QTimer>
-
 #include <libgpsmm.h>
 
 
@@ -22,6 +20,8 @@
 namespace Marble
 {
 
+class GpsdThread;
+
 class GpsdPositionProviderPlugin: public PositionProviderPlugin
 {
     Q_OBJECT
@@ -45,16 +45,13 @@
     virtual GeoDataAccuracy accuracy() const;
     
  private:
-    bool m_initialized;
-    gpsmm m_gpsd;
-    gps_data_t* m_gpsdData;
-    QTimer* m_timer;
+    GpsdThread* m_thread;
     PositionProviderStatus m_status;
     GeoDataCoordinates m_position;
     GeoDataAccuracy m_accuracy;
     
  private slots:
-    void update();
+    void update(gps_data_t data);
 };
 
 }


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic