X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fgps%2Fgpsposition.cpp;h=e286cbb6f9a728af6293ba86e920cf37096cc455;hb=3f812b04b53620610ea4fcf567802f5ea046714d;hp=6f43d9b2eb8ebbc085af3e4b0c4fd204bded22b5;hpb=d5604828b81b01799ef30ce016b5e76b817e3aad;p=situare diff --git a/src/gps/gpsposition.cpp b/src/gps/gpsposition.cpp index 6f43d9b..e286cbb 100644 --- a/src/gps/gpsposition.cpp +++ b/src/gps/gpsposition.cpp @@ -25,37 +25,51 @@ #include #include #include +#include #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); + if (m_gpsSource) { + connect(m_gpsSource, SIGNAL(positionUpdated(QGeoPositionInfo)), + this, SLOT(positionUpdated(QGeoPositionInfo))); + connect(m_gpsSource, SIGNAL(updateTimeout()), this, SLOT(updateTimeout())); - 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,35 @@ void GPSPosition::update() emit m_gpsSource->requestUpdate(DEFAULT_UPDATE_INTERVAL); } -void GPSPosition::positionUpdated(QGeoPositionInfo positionInfo) +QPointF GPSPosition::lastPosition() +{ + QGeoCoordinate coordinate = m_gpsSource->lastKnownPosition().coordinate(); + return QPointF(coordinate.longitude(), coordinate.latitude()); +} + +void GPSPosition::requestLastPosition() { qDebug() << __PRETTY_FUNCTION__; - emit position(QPointF(positionInfo.coordinate().longitude(), - positionInfo.coordinate().latitude())); + 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__ << positionInfo; + + if (positionInfo.coordinate().isValid()) { + + qreal accuracy = biggerAccuracy(positionInfo); + + emit position(QPointF(positionInfo.coordinate().longitude(), + positionInfo.coordinate().latitude()), accuracy); + } } void GPSPosition::updateTimeout() @@ -109,8 +146,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; +}