Skip to content

Commit 6055c11

Browse files
mbernasocchijef-n
authored andcommittedFeb 8, 2012
android goodies (pull request #94):
[Marco Bernasocchi] - adding needed files to support internal GPS via QtMobility, implementation of QgsQtLocationConnection is only a stub - cleaning up methods names - adding mobility to CMakeLists - testing - added hack to test parseData() - adding more parsing stuff - Adding debugging info and making connection fail if no QtSatellite datasource available - Initial working GPS with coordinates bug (values shifted) - Adding Initial GPS support to android using QtLocation - Adding Ground speed and direction - put ok button on top of widget to make it usable until scroll area is added (HACK to be Reverted later) - added vertical and horizontal accurancy - Removing test values qtlocationconnection - refactor debug messages - adding compass plugin - trying NathanW suggestion - adding new compass plugin - Fixed satellitesUpdated signals - removing setDataRate - temporarely removed calibrationLevel display to be reverted when https://sourceforge.net/p/necessitas/tickets/153/ is fixed - addin comment - making QLineEdits readonly - added calibration level support [Jürgen E. Fischer] - squashed, reindented and skipped some already addressed changes to qgisapp and vector layer provider
1 parent d2b5ed9 commit 6055c11

23 files changed

+1537
-100
lines changed
 

‎CMakeLists.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,17 @@ IF (WITH_BINDINGS)
8080
SET (BINDINGS_GLOBAL_INSTALL FALSE CACHE BOOL "Install bindings to global python directory? (might need root)")
8181
ENDIF (WITH_BINDINGS)
8282

83+
#BUILD WITH QtMobility by default on android only. Other platform can force it
84+
IF (ANDROID)
85+
SET (DEFAULT_WITH_QTMOBILITY TRUE)
86+
ELSE (ANDROID)
87+
SET (DEFAULT_WITH_QTMOBILITY FALSE)
88+
ENDIF (ANDROID)
89+
SET (WITH_QTMOBILITY ${DEFAULT_WITH_QTMOBILITY} CACHE BOOL "Determines QtMobility related code should be build (for example internal GPS)")
90+
IF (WITH_QTMOBILITY)
91+
FIND_PACKAGE(QtMobility 1.1.0)
92+
ENDIF (WITH_QTMOBILITY)
93+
8394
SET (WITH_GLOBE FALSE CACHE BOOL "Determines whether Globe plugin should be built")
8495
IF (WITH_GLOBE)
8596
SET(QT_USE_QTOPENGL 1)

‎cmake/FindQtMobility.cmake

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
INCLUDE(FindQt4)
2+
3+
set(MOBILITY_CONFIG_MKSPECS_FILE "")
4+
IF(EXISTS "${QT_MKSPECS_DIR}/features/mobilityconfig.prf")
5+
set(MOBILITY_CONFIG_MKSPECS_FILE "${QT_MKSPECS_DIR}/features/mobilityconfig.prf")
6+
ELSEIF(EXISTS "${QT_MKSPECS_DIR}/features/mobility.prf")
7+
set(MOBILITY_CONFIG_MKSPECS_FILE "${CMAKE_CURRENT_SOURCE_DIR}/cmakes/mobilityconfig.prf")
8+
ENDIF()
9+
10+
macro(export_component component)
11+
IF(NOT ${MOBILITY_CONFIG_MKSPECS_FILE} STREQUAL "")
12+
FILE(READ ${MOBILITY_CONFIG_MKSPECS_FILE} MOBILITY_FILE_CONTENTS)
13+
STRING(TOLOWER ${component} _COMPONENT)
14+
IF(${MOBILITY_FILE_CONTENTS} MATCHES "MOBILITY_CONFIG=.*${_COMPONENT}.*")
15+
STRING(TOUPPER ${component} _COMPONENT)
16+
SET(QT_MOBILITY_${_COMPONENT}_FOUND 1)
17+
SET(QT_MOBILITY_${_COMPONENT}_INCLUDE_DIR ${QT_MOBILITY_PARENT_INCLUDE_DIR}/Qt${component})
18+
SET(QT_MOBILITY_${_COMPONENT}_LIBRARY Qt${component})
19+
ADD_DEFINITIONS(-DHAVE_QT_MOBILITY_${_COMPONENT})
20+
ENDIF()
21+
ENDIF()
22+
endmacro()
23+
24+
set(VERSION_INFO "")
25+
set(FEATURE_FILE_PREFIX "${QT_MKSPECS_DIR}/features/mobility")
26+
27+
if(DEFINED MOBILITY_VERSION)
28+
if(MOBILITY_VERSION STREQUAL "1.1" AND EXISTS "${FEATURE_FILE_PREFIX}11.prf")
29+
set(MOBILITY_PRF_FILE "${FEATURE_FILE_PREFIX}11.prf")
30+
set(VERSION_INFO "1.1")
31+
elseif(MOBILITY_VERSION STREQUAL "1.2" AND EXISTS "${FEATURE_FILE_PREFIX}12.prf")
32+
set(MOBILITY_PRF_FILE "${FEATURE_FILE_PREFIX}12.prf")
33+
set(VERSION_INFO "1.2")
34+
elseif(MOBILITY_VERSION STREQUAL "default" AND EXISTS "${FEATURE_FILE_PREFIX}.prf")
35+
set(MOBILITY_PRF_FILE "${FEATURE_FILE_PREFIX}.prf")
36+
set(VERSION_INFO "system's default")
37+
else()
38+
message(STATUS "Couldn't find QtMobility version: ${MOBILITY_VERSION}")
39+
endif()
40+
endif()
41+
42+
if(NOT DEFINED MOBILITY_PRF_FILE)
43+
if(EXISTS "${FEATURE_FILE_PREFIX}.prf")
44+
set(MOBILITY_PRF_FILE "${FEATURE_FILE_PREFIX}.prf")
45+
set(VERSION_INFO "system's default")
46+
elseif(EXISTS "${FEATURE_FILE_PREFIX}12.prf")
47+
set(MOBILITY_PRF_FILE "${FEATURE_FILE_PREFIX}12.prf")
48+
set(VERSION_INFO "1.2")
49+
elseif(EXISTS "${FEATURE_FILE_PREFIX}11.prf")
50+
set(MOBILITY_PRF_FILE "${FEATURE_FILE_PREFIX}11.prf")
51+
set(VERSION_INFO "1.1")
52+
else()
53+
message(FATAL_ERROR "Couldn't find any version of QtMobility.")
54+
endif()
55+
endif()
56+
57+
message(STATUS "Using QtMobility version: ${VERSION_INFO}")
58+
59+
IF(DEFINED MOBILITY_PRF_FILE)
60+
FILE(READ ${MOBILITY_PRF_FILE} MOBILITY_FILE_CONTENTS)
61+
62+
STRING(REGEX MATCH "MOBILITY_PREFIX=([^\n]+)" QT_MOBILITY_PREFIX "${MOBILITY_FILE_CONTENTS}")
63+
SET(QT_MOBILITY_PREFIX ${CMAKE_MATCH_1})
64+
65+
STRING(REGEX MATCH "MOBILITY_INCLUDE=([^\n]+)" QT_MOBILITY_INCLUDE_DIR "${MOBILITY_FILE_CONTENTS}")
66+
SET(QT_MOBILITY_INCLUDE_DIR ${CMAKE_MATCH_1})
67+
68+
STRING(REGEX MATCH "MOBILITY_LIB=([^\n]+)" "\\1" QT_MOBILITY_LIBRARY "${MOBILITY_FILE_CONTENTS}")
69+
SET(QT_MOBILITY_LIBRARY_DIR ${CMAKE_MATCH_1})
70+
71+
#VERSION
72+
IF(NOT ${MOBILITY_CONFIG_MKSPECS_FILE} STREQUAL "")
73+
FILE(READ ${MOBILITY_CONFIG_MKSPECS_FILE} MOBILITY_CONFIG_FILE_CONTENTS)
74+
STRING(REGEX MATCH "MOBILITY_VERSION = ([^\n]+)" QT_MOBILITY_VERSION "${MOBILITY_CONFIG_FILE_CONTENTS}")
75+
SET(QT_MOBILITY_VERSION ${CMAKE_MATCH_1})
76+
77+
STRING(REGEX MATCH "MOBILITY_MAJOR_VERSION = ([^\n]+)" QT_MOBILITY_MAJOR_VERSION "${MOBILITY_CONFIG_FILE_CONTENTS}")
78+
SET(QT_MOBILITY_MAJOR_VERSION ${CMAKE_MATCH_1})
79+
80+
STRING(REGEX MATCH "MOBILITY_MINOR_VERSION = ([^\n]+)" QT_MOBILITY_MINOR_VERSION "${MOBILITY_CONFIG_FILE_CONTENTS}")
81+
SET(QT_MOBILITY_MINOR_VERSION ${CMAKE_MATCH_1})
82+
83+
STRING(REGEX MATCH "MOBILITY_PATCH_VERSION = ([^\n]+)" QT_MOBILITY_PATCH_VERSION "${MOBILITY_CONFIG_FILE_CONTENTS}")
84+
SET(QT_MOBILITY_PATCH_VERSION ${CMAKE_MATCH_1})
85+
86+
message(STATUS "QtMobility version: ${QT_MOBILITY_VERSION}")
87+
ELSE()
88+
SET(QT_MOBILITY_VERSION 1.0.0)
89+
SET(QT_MOBILITY_MAJOR_VERSION 1)
90+
SET(QT_MOBILITY_MINOR_VERSION 0)
91+
SET(QT_MOBILITY_PATCH_VERSION 0)
92+
ENDIF()
93+
94+
SET(QT_MOBILITY_PARENT_INCLUDE_DIR ${QT_MOBILITY_INCLUDE_DIR})
95+
SET(QT_MOBILITY_INCLUDE_DIR ${QT_MOBILITY_INCLUDE_DIR}/QtMobility)
96+
97+
IF(QtMobility_FIND_VERSION_EXACT)
98+
IF(QT_MOBILITY_VERSION VERSION_EQUAL QtMobility_FIND_VERSION)
99+
SET(QT_MOBILITY_FOUND TRUE)
100+
ELSE()
101+
SET(QT_MOBILITY_FOUND FALSE)
102+
IF(QT_MOBILITY_VERSION VERSION_LESS QtMobility_FIND_VERSION)
103+
SET(QT_MOBILITY_TOO_OLD TRUE)
104+
ELSE()
105+
SET(QT_MOBILITY_TOO_NEW TRUE)
106+
ENDIF()
107+
ENDIF()
108+
ELSE()
109+
IF(QT_MOBILITY_VERSION VERSION_LESS QtMobility_FIND_VERSION)
110+
SET(QT_MOBILITY_FOUND FALSE)
111+
SET(QT_MOBILITY_TOO_OLD TRUE)
112+
ELSE()
113+
SET(QT_MOBILITY_FOUND TRUE)
114+
ENDIF()
115+
ENDIF()
116+
ELSE()
117+
SET(QT_MOBILITY_FOUND NOTFOUND)
118+
SET(QT_MOBILITY_PREFIX NOTFOUND)
119+
SET(QT_MOBILITY_INCLUDE NOTFOUND)
120+
SET(QT_MOBILITY_LIB NOTFOUND)
121+
ENDIF()
122+
123+
IF(NOT QT_MOBILITY_FOUND)
124+
if(QT_MOBILITY_TOO_OLD)
125+
MESSAGE(FATAL_ERROR "The installed QtMobility version ${QT_MOBILITY_VERSION} it too old, version ${QtMobility_FIND_VERSION} is required.")
126+
ELSEIF(QT_MOBILITY_TOO_NEW)
127+
MESSAGE(FATAL_ERROR "The installed QtMobility version ${QT_MOBILITY_VERSION} it too new, version ${QtMobility_FIND_VERSION} is required.")
128+
ELSE()
129+
MESSAGE(FATAL_ERROR "QtMobility not found.")
130+
ENDIF()
131+
ELSE()
132+
INCLUDE_DIRECTORIES(${QT_MOBILITY_INCLUDE_DIR})
133+
export_component(Bearer)
134+
export_component(Feedback)
135+
export_component(Gallery)
136+
export_component(PublishSubscribe)
137+
export_component(Location)
138+
export_component(Organizer)
139+
export_component(ServiceFramework)
140+
export_component(SystemInfo)
141+
export_component(Contacts)
142+
export_component(Connectivity)
143+
export_component(Messaging)
144+
export_component(Versit)
145+
export_component(Sensors)
146+
# VersitOrganizer
147+
if(QT_MOBILITY_VERSIT_FOUND AND QT_MOBILITY_ORGANIZER_FOUND)
148+
SET(QT_MOBILITY_VERSITORGANIZER_FOUND 1)
149+
SET(QT_MOBILITY_VERSITORGANIZER_INCLUDE_DIR ${QT_MOBILITY_PARENT_INCLUDE_DIR}/QtVersitOrganizer)
150+
SET(QT_MOBILITY_VERSITORGANIZER_LIBRARY QtVersitOrganizer)
151+
endif()
152+
153+
# MultimediaKit - it's just 'multimedia' in the .prf file.
154+
IF(NOT ${MOBILITY_CONFIG_MKSPECS_FILE} STREQUAL "")
155+
FILE(READ ${MOBILITY_CONFIG_MKSPECS_FILE} MOBILITY_FILE_CONTENTS)
156+
IF(${MOBILITY_FILE_CONTENTS} MATCHES "MOBILITY_CONFIG=.*multimedia.*")
157+
SET(QT_MOBILITY_MULTIMEDIAKIT_FOUND 1)
158+
SET(QT_MOBILITY_MULTIMEDIAKIT_INCLUDE_DIR ${QT_MOBILITY_PARENT_INCLUDE_DIR}/QtMultimediaKit)
159+
SET(QT_MOBILITY_MULTIMEDIAKIT_LIBRARY QtMultimediaKit)
160+
ENDIF()
161+
ENDIF()
162+
163+
ENDIF()

‎src/app/gps/qgsgpsinformationwidget.cpp

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/***************************************************************************
2-
qgsgpsinformationwidget.h - description
2+
qgsgpsinformationwidget.cpp - description
33
-------------------
44
begin : Sat Jan 01 2010
55
copyright : (C) 2010 by Tim Sutton and Marco Hugentobler
@@ -184,6 +184,10 @@ QgsGPSInformationWidget::QgsGPSInformationWidget( QgsMapCanvas * thepCanvas, QWi
184184
{
185185
mRadAutodetect->setChecked( true );
186186
}
187+
else if ( myPortMode == "internalGPS" )
188+
{
189+
mRadInternal->setChecked( true );
190+
}
187191
else if ( myPortMode == "explicitPort" )
188192
{
189193
mRadUserPath->setChecked( true );
@@ -192,6 +196,11 @@ QgsGPSInformationWidget::QgsGPSInformationWidget( QgsMapCanvas * thepCanvas, QWi
192196
{
193197
mRadGpsd->setChecked( true );
194198
}
199+
//disable the internal port method if build is without QtLocation
200+
#ifndef HAVE_QT_MOBILITY_LOCATION
201+
mRadInternal->setDisabled( true );
202+
mRadAutodetect->setChecked( true );
203+
#endif
195204

196205
//auto digitising behaviour
197206
mCbxAutoAddVertices->setChecked( mySettings.value( "/gps/autoAddVertices", "false" ).toBool() );
@@ -256,6 +265,10 @@ QgsGPSInformationWidget::~QgsGPSInformationWidget()
256265
{
257266
mySettings.setValue( "/gps/portMode", "scanPorts" );
258267
}
268+
else if ( mRadInternal->isChecked() )
269+
{
270+
mySettings.setValue( "/gps/portMode", "internalGPS" );
271+
}
259272
else if ( mRadUserPath->isChecked() )
260273
{
261274
mySettings.setValue( "/gps/portMode", "explicitPort" );
@@ -406,6 +419,10 @@ void QgsGPSInformationWidget::connectGps()
406419
{
407420
port = QString( "%1:%2:%3" ).arg( mGpsdHost->text() ).arg( mGpsdPort->text() ).arg( mGpsdDevice->text() );
408421
}
422+
else if ( mRadInternal->isChecked() )
423+
{
424+
port = QString( "internalGPS" );
425+
}
409426

410427
mGPSPlainTextEdit->appendPlainText( tr( "Connecting..." ) );
411428
showStatusBarMessage( tr( "Connecting to GPS device..." ) );
@@ -678,10 +695,12 @@ void QgsGPSInformationWidget::displayGPSInformation( const QgsGPSInformation& in
678695
mTxtDateTime->setText( info.utcDateTime.toString( mDateTimeFormat ) ); //user specified format string for testing the millisecond part of time
679696
}
680697
mTxtSpeed->setText( tr( "%1 km/h" ).arg( info.speed, 0, 'f', 1 ) );
681-
mTxtDirection->setText( QString::number( info.direction, 'f', 1 ) );
698+
mTxtDirection->setText( QString::number( info.direction, 'f', 1 ) + QString::fromUtf8( "°" ) );
682699
mTxtHdop->setText( QString::number( info.hdop, 'f', 1 ) );
683700
mTxtVdop->setText( QString::number( info.vdop, 'f', 1 ) );
684701
mTxtPdop->setText( QString::number( info.pdop, 'f', 1 ) );
702+
mTxtHacc->setText( QString::number( info.hacc, 'f', 1 ) + "m" );
703+
mTxtVacc->setText( QString::number( info.vacc, 'f', 1 ) + "m" );
685704
mTxtFixMode->setText( info.fixMode == 'A' ? tr( "Automatic" ) : info.fixMode == 'M' ? tr( "Manual" ) : "" ); // A=automatic 2d/3d, M=manual; allowing for anything else
686705
mTxtFixType->setText( info.fixType == 3 ? tr( "3D" ) : info.fixType == 2 ? tr( "2D" ) : info.fixType == 1 ? tr( "No fix" ) : QString::number( info.fixType ) ); // 1=no fix, 2=2D, 3=3D; allowing for anything else
687706
mTxtQuality->setText( info.quality == 2 ? tr( "Differential" ) : info.quality == 1 ? tr( "Non-differential" ) : info.quality == 0 ? tr( "No position" ) : info.quality > 2 ? QString::number( info.quality ) : "" ); // allowing for anything else
@@ -794,7 +813,7 @@ void QgsGPSInformationWidget::on_mBtnAddVertex_clicked( )
794813

795814
void QgsGPSInformationWidget::addVertex( )
796815
{
797-
816+
QgsDebugMsg( "Adding Vertex" );
798817
if ( !mpRubberBand )
799818
{
800819
createRubberBand( );

‎src/core/CMakeLists.txt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,13 @@ ELSE(WIN32)
191191
ADD_DEFINITIONS(-D_TTY_POSIX_)
192192
ENDIF(WIN32)
193193

194+
IF (QT_MOBILITY_LOCATION_FOUND)
195+
SET(QGIS_CORE_SRCS
196+
${QGIS_CORE_SRCS}
197+
gps/qgsqtlocationconnection.cpp
198+
)
199+
ENDIF (QT_MOBILITY_LOCATION_FOUND)
200+
194201
IF (WITH_INTERNAL_SPATIALITE)
195202
IF (WIN32 OR APPLE OR ANDROID)
196203
INCLUDE_DIRECTORIES(${ICONV_INCLUDE_DIR})
@@ -274,6 +281,13 @@ SET(QGIS_CORE_MOC_HDRS
274281
gps/qextserialport/qextserialenumerator.h
275282
)
276283

284+
IF (QT_MOBILITY_LOCATION_FOUND)
285+
SET(QGIS_CORE_MOC_HDRS
286+
${QGIS_CORE_MOC_HDRS}
287+
gps/qgsqtlocationconnection.h
288+
)
289+
ENDIF (QT_MOBILITY_LOCATION_FOUND)
290+
277291
QT4_WRAP_CPP(QGIS_CORE_MOC_SRCS ${QGIS_CORE_MOC_HDRS})
278292

279293
# install headers
@@ -394,6 +408,13 @@ SET(QGIS_CORE_HDRS
394408
qgsspatialindex.h
395409
)
396410

411+
IF (QT_MOBILITY_LOCATION_FOUND)
412+
SET(QGIS_CORE_HDRS
413+
${QGIS_CORE_HDRS}
414+
gps/qgsqtlocationconnection.h
415+
)
416+
ENDIF (QT_MOBILITY_LOCATION_FOUND)
417+
397418
INCLUDE_DIRECTORIES(
398419
${CMAKE_CURRENT_SOURCE_DIR}
399420
composer
@@ -494,6 +515,10 @@ IF(APPLE)
494515
TARGET_LINK_LIBRARIES(qgis_core "-framework CoreFoundation -framework IOKit")
495516
ENDIF(APPLE)
496517

518+
IF (QT_MOBILITY_LOCATION_FOUND)
519+
TARGET_LINK_LIBRARIES(qgis_core ${QT_MOBILITY_LOCATION_LIBRARY})
520+
ENDIF (QT_MOBILITY_LOCATION_FOUND)
521+
497522
TARGET_LINK_LIBRARIES(qgis_core
498523
${QT_QTMAIN_LIBRARY}
499524
${QT_QTXML_LIBRARY}

‎src/core/gps/qgsgpsconnection.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ void QgsGPSConnection::clearLastGPSInformation()
9494
mLastGPSInformation.satellitesInView.clear();
9595
mLastGPSInformation.speed = 0;
9696
mLastGPSInformation.vdop = 0;
97+
mLastGPSInformation.hacc = -1;
98+
mLastGPSInformation.vacc = -1;
9799
mLastGPSInformation.quality = -1; // valid values: 0,1,2, maybe others
98100
mLastGPSInformation.satellitesUsed = 0;
99101
mLastGPSInformation.fixMode = ' ';

‎src/core/gps/qgsgpsconnection.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ struct CORE_EXPORT QgsGPSInformation
4444
double pdop;
4545
double hdop;
4646
double vdop;
47+
double hacc; //horizontal accurancy in meters
48+
double vacc; //vertical accurancy in meters
4749
QDateTime utcDateTime;
4850
QChar fixMode;
4951
int fixType;

‎src/core/gps/qgsgpsdetector.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222
#include "qgsnmeaconnection.h"
2323
#include "qgsgpsdconnection.h"
2424

25+
#ifdef HAVE_QT_MOBILITY_LOCATION
26+
#include "qgsqtlocationconnection.h"
27+
#endif
28+
2529
#include <QStringList>
2630
#include <QFileInfo>
2731
#include <QTimer>
@@ -30,6 +34,10 @@ QList< QPair<QString, QString> > QgsGPSDetector::availablePorts()
3034
{
3135
QList< QPair<QString, QString> > devs;
3236

37+
// try local QtLocation first
38+
#ifdef HAVE_QT_MOBILITY_LOCATION
39+
devs << QPair<QString, QString>( "internalGPS", tr( "internal GPS" ) );
40+
#endif
3341
// try local gpsd first
3442
devs << QPair<QString, QString>( "localhost:2947:", tr( "local gpsd" ) );
3543

@@ -145,6 +153,15 @@ void QgsGPSDetector::advance()
145153

146154
mConn = new QgsGpsdConnection( gpsParams[0], gpsParams[1].toShort(), gpsParams[2] );
147155
}
156+
else if ( mPortList[ mPortIndex ].first.contains( "internalGPS" ) )
157+
{
158+
#ifdef HAVE_QT_MOBILITY_LOCATION
159+
mConn = new QgsQtLocationConnection();
160+
#else
161+
qWarning( "QT_MOBILITY_LOCATION not found and mPortList matches internalGPS, this should never happen" );
162+
#endif
163+
}
164+
148165
else
149166
{
150167
QextSerialPort *serial = new QextSerialPort( mPortList[ mPortIndex ].first, QextSerialPort::EventDriven );

0 commit comments

Comments
 (0)
Please sign in to comment.