Log File Position Source (C++)▲
Sélectionnez
/**
**************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
***************************************************************************
*/
#include <QtCore>
#include
"logfilepositionsource.h"
LogFilePositionSource::
LogFilePositionSource(QObject *
parent)
:
QGeoPositionInfoSource(parent),
logFile(new
QFile(this
)),
timer(new
QTimer(this
))
{
connect(timer, SIGNAL(timeout()), this
, SLOT(readNextPosition()));
logFile-&
gt;setFileName(":/simplelog.txt"
);
if
(!
logFile-&
gt;open(QIODevice::
ReadOnly))
qWarning() &
lt;&
lt; "Error: cannot open source file"
&
lt;&
lt; logFile-&
gt;fileName();
}
QGeoPositionInfo LogFilePositionSource::
lastKnownPosition(bool
/*fromSatellitePositioningMethodsOnly*/
) const
{
return
lastPosition;
}
LogFilePositionSource::
PositioningMethods LogFilePositionSource::
supportedPositioningMethods() const
{
return
AllPositioningMethods;
}
int
LogFilePositionSource::
minimumUpdateInterval() const
{
return
500
;
}
void
LogFilePositionSource::
startUpdates()
{
int
interval =
updateInterval();
if
(interval &
lt; minimumUpdateInterval())
interval =
minimumUpdateInterval();
timer-&
gt;start(interval);
}
void
LogFilePositionSource::
stopUpdates()
{
timer-&
gt;stop();
}
void
LogFilePositionSource::
requestUpdate(int
/*timeout*/
)
{
// For simplicity, ignore timeout - assume that if data is not available
// now, no data will be added to the file later
if
(logFile-&
gt;canReadLine())
readNextPosition();
else
emit updateTimeout();
}
void
LogFilePositionSource::
readNextPosition()
{
QByteArray line =
logFile-&
gt;readLine().trimmed();
if
(!
line.isEmpty()) {
QList&
lt;QByteArray&
gt; data =
line.split(' '
);
double
latitude;
double
longitude;
bool
hasLatitude =
false
;
bool
hasLongitude =
false
;
QDateTime timestamp =
QDateTime::
fromString(QString(data.value(0
)), Qt::
ISODate);
latitude =
data.value(1
).toDouble(&
amp;hasLatitude);
longitude =
data.value(2
).toDouble(&
amp;hasLongitude);
if
(hasLatitude &
amp;&
amp; hasLongitude &
amp;&
amp; timestamp.isValid()) {
QGeoCoordinate coordinate(latitude, longitude);
QGeoPositionInfo info(coordinate, timestamp);
if
(info.isValid()) {
lastPosition =
info;
emit positionUpdated(info);
}
}
}
}
QGeoPositionInfoSource::
Error LogFilePositionSource::
error() const
{
return
QGeoPositionInfoSource::
NoError;
}