Added GPSPosition::isInitialized method.
[situare] / src / gps / gpspositionprivateliblocation.cpp
1 /*
2    Situare - A location system for Facebook
3    Copyright (C) 2010  Ixonos Plc. Authors:
4
5        Jussi Laitinen - jussi.laitinen@ixonos.com
6
7    Situare is free software; you can redistribute it and/or
8    modify it under the terms of the GNU General Public License
9    version 2 as published by the Free Software Foundation.
10
11    Situare is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with Situare; if not, write to the Free Software
18    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
19    USA.
20 */
21
22 #include <QFile>
23 #include <QDir>
24 #include <QApplication>
25 #include <QDebug>
26 #include <QTimer>
27
28 #include "gpscommon.h"
29 #include "gpsposition.h"
30 #include "gpspositionprivateliblocation.h"
31 #include "liblocationwrapper.h"
32
33 GPSPositionPrivate::GPSPositionPrivate(QObject *parent)
34     : QObject(parent),
35       m_liblocationWrapper(0),
36       m_initialized(false),
37       m_running(false),
38       m_updateInterval(DEFAULT_UPDATE_INTERVAL)
39 {
40     qDebug() << __PRETTY_FUNCTION__;
41
42     m_parent = static_cast<GPSPosition*>(parent);
43 }
44
45 bool GPSPositionPrivate::isInitialized()
46 {
47     qDebug() << __PRETTY_FUNCTION__;
48
49     return m_initialized;
50 }
51
52 void GPSPositionPrivate::setMode(GPSPosition::Mode mode, const QString &filePath)
53 {
54     qDebug() << __PRETTY_FUNCTION__;
55
56     Q_UNUSED(filePath);
57
58     if (m_liblocationWrapper) {
59         disconnect(m_liblocationWrapper, 0, 0, 0);
60         delete m_liblocationWrapper;
61     }
62
63     if (mode == GPSPosition::Default) {
64         m_liblocationWrapper = new LiblocationWrapper(this);
65
66         if (!m_liblocationWrapper) {
67             m_initialized = false;
68             emit m_parent->error(123);  ///Change to correct error code
69             return;
70         }
71     }
72
73     if (m_liblocationWrapper) {
74         m_initialized = true;
75         m_liblocationWrapper->init(m_updateInterval);
76
77         connect(m_liblocationWrapper, SIGNAL(locationChanged(const GeoPositionInfo &)),
78                 this, SLOT(positionUpdated(const GeoPositionInfo &)));
79         connect(m_liblocationWrapper, SIGNAL(errorMessage(const QString &)),
80                 this, SLOT(locationError(const QString &)));
81     }
82 }
83
84 void GPSPositionPrivate::start()
85 {
86     qDebug() << __PRETTY_FUNCTION__;
87
88     if (m_initialized && !isRunning()) {
89         m_liblocationWrapper->startUpdates();
90         m_running = true;
91     }
92 }
93
94 void GPSPositionPrivate::stop()
95 {
96     qDebug() << __PRETTY_FUNCTION__;
97
98     if (m_initialized && isRunning()) {
99         m_liblocationWrapper->stopUpdates();
100         m_running = false;
101     }
102 }
103
104 bool GPSPositionPrivate::isRunning()
105 {
106     qDebug() << __PRETTY_FUNCTION__;
107
108     return m_running;
109 }
110
111 QPointF GPSPositionPrivate::lastPosition()
112 {
113     qDebug() << __PRETTY_FUNCTION__;
114
115     GeoPositionInfo positionInfo =  m_liblocationWrapper->lastKnownPosition();
116
117     return QPointF(positionInfo.coordinate().longitude(), positionInfo.coordinate().latitude());
118 }
119
120 void GPSPositionPrivate::requestLastPosition()
121 {
122     qDebug() << __PRETTY_FUNCTION__;
123
124     GeoPositionInfo positionInfo = m_liblocationWrapper->lastKnownPosition();
125
126     if (positionInfo.isValid()) {
127         GeoCoordinate coordinate = positionInfo.coordinate();
128         emit m_parent->position(QPointF(coordinate.longitude(), coordinate.latitude()),
129                       accuracy(positionInfo));
130     }
131 }
132
133 void GPSPositionPrivate::positionUpdated(const GeoPositionInfo &positionInfo)
134 {
135     qDebug() << __PRETTY_FUNCTION__;
136
137     if (positionInfo.coordinate().isValid()) {
138         GeoCoordinate coordinate = positionInfo.coordinate();
139         emit m_parent->position(QPointF(coordinate.longitude(), coordinate.latitude()),
140                       accuracy(positionInfo));
141     }
142 }
143
144 void GPSPositionPrivate::locationError(const QString &errorMessage)
145 {
146     qDebug() << __PRETTY_FUNCTION__;
147
148     Q_UNUSED(errorMessage);
149
150     emit m_parent->error(123);
151 }
152
153 void GPSPositionPrivate::setUpdateInterval(int interval)
154 {
155     qDebug() << __PRETTY_FUNCTION__;
156
157     if (m_updateInterval != interval) {
158         m_updateInterval = interval;
159         m_liblocationWrapper->init(m_updateInterval);
160     }
161 }
162
163 qreal GPSPositionPrivate::accuracy(const GeoPositionInfo &positionInfo)
164 {
165     qDebug() << __PRETTY_FUNCTION__;
166
167     if (!positionInfo.timestamp().isValid())
168         return GPS_ACCURACY_UNDEFINED;
169
170     if (positionInfo.isAccurate())
171         return positionInfo.accuracy();
172     else
173         return GPS_ACCURACY_UNDEFINED;
174 }