[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