blob: 3244c478e22a9ab44991bfda43e5c53fd44b1314 [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtPositioning module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** 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.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "widget.h"
#include "ui_widget.h"
#include <QGeoPositionInfoSource>
#include <QDebug>
Widget::Widget(LogWidget *logWidget, QWidget *parent) :
QWidget(parent),
log(logWidget),
ui(new Ui::Widget)
{
ui->setupUi(this);
qDebug() << "Available:" << QGeoPositionInfoSource::availableSources();
m_posSource = QGeoPositionInfoSource::createDefaultSource(this);
if (!m_posSource)
qFatal("No Position Source created!");
connect(m_posSource, SIGNAL(positionUpdated(QGeoPositionInfo)),
this, SLOT(positionUpdated(QGeoPositionInfo)));
connect(ui->horizontalSlider, SIGNAL(valueChanged(int)),
this, SLOT(setInterval(int)));
connect(m_posSource, SIGNAL(updateTimeout()),
this, SLOT(positionTimedOut()));
ui->groupBox->setLayout(ui->gridLayout);
ui->horizontalSlider->setMinimum(m_posSource->minimumUpdateInterval());
ui->labelTimeOut->setVisible(false);
connect(m_posSource, SIGNAL(error(QGeoPositionInfoSource::Error)),
this, SLOT(errorChanged(QGeoPositionInfoSource::Error)));
connect(m_posSource, &QGeoPositionInfoSource::supportedPositioningMethodsChanged,
this, [this]() {
auto methods = m_posSource->supportedPositioningMethods();
const QString status = QStringLiteral("Satellite: %1 ").arg(bool(methods & QGeoPositionInfoSource::SatellitePositioningMethods))
+ QStringLiteral("Non-Satellite: %1").arg(bool(methods & QGeoPositionInfoSource::NonSatellitePositioningMethods));
qDebug() << "Available Positioning Methods Changed" << status;
log->appendLog(status);
});
}
void Widget::positionUpdated(QGeoPositionInfo gpsPos)
{
QGeoCoordinate coord = gpsPos.coordinate();
ui->labelLatitude->setText(QString::number(coord.latitude()));
ui->labelLongitude->setText(QString::number(coord.longitude()));
ui->labelAltitude->setText(QString::number(coord.altitude()));
ui->labelTimeStamp->setText(gpsPos.timestamp().toString());
if (gpsPos.hasAttribute(QGeoPositionInfo::HorizontalAccuracy))
ui->labelHAccuracy->setText(QString::number(gpsPos.attribute(QGeoPositionInfo::HorizontalAccuracy)));
else
ui->labelHAccuracy->setText(QStringLiteral("N/A"));
if (gpsPos.hasAttribute(QGeoPositionInfo::VerticalAccuracy))
ui->labelVAccuracy->setText(QString::number(gpsPos.attribute(QGeoPositionInfo::VerticalAccuracy)));
else
ui->labelVAccuracy->setText(QStringLiteral("N/A"));
if (gpsPos.hasAttribute(QGeoPositionInfo::Direction))
ui->labelDirection->setText(QString::number(gpsPos.attribute(QGeoPositionInfo::Direction)));
else
ui->labelDirection->setText(QStringLiteral("N/A"));
if (gpsPos.hasAttribute(QGeoPositionInfo::GroundSpeed))
ui->labelSpeed->setText(QString::number(gpsPos.attribute(QGeoPositionInfo::GroundSpeed)));
else
ui->labelSpeed->setText(QStringLiteral("N/A"));
log->appendLog(coord.toString());
}
void Widget::positionTimedOut()
{
ui->labelTimeOut->setVisible(true);
}
void Widget::errorChanged(QGeoPositionInfoSource::Error err)
{
ui->labelErrorState->setText(QString::number(err));
m_posSource->stopUpdates();
ui->checkBox->setChecked(false);
}
Widget::~Widget()
{
delete ui;
}
void Widget::setInterval(int msec)
{
m_posSource->setUpdateInterval(msec);
}
void Widget::on_buttonRetrieve_clicked()
{
// Requesting current position for _one_ time
m_posSource->requestUpdate(10000);
}
void Widget::on_buttonStart_clicked()
{
// Either start or stop the current position info source
bool running = ui->checkBox->isChecked();
if (running) {
ui->checkBox->setChecked(false);
m_posSource->stopUpdates();
} else {
ui->checkBox->setChecked(true);
m_posSource->startUpdates();
}
}
void Widget::on_radioButton_clicked()
{
m_posSource->setPreferredPositioningMethods(QGeoPositionInfoSource::NoPositioningMethods);
}
void Widget::on_radioButton_2_clicked()
{
m_posSource->setPreferredPositioningMethods(QGeoPositionInfoSource::SatellitePositioningMethods);
}
void Widget::on_radioButton_3_clicked()
{
m_posSource->setPreferredPositioningMethods(QGeoPositionInfoSource::NonSatellitePositioningMethods);
}
void Widget::on_radioButton_4_clicked()
{
m_posSource->setPreferredPositioningMethods(QGeoPositionInfoSource::AllPositioningMethods);
}
void Widget::on_buttonUpdateSupported_clicked()
{
QGeoPositionInfoSource::PositioningMethods m = m_posSource->supportedPositioningMethods();
QString text;
switch (m) {
case QGeoPositionInfoSource::NoPositioningMethods:
text = QStringLiteral("None");
break;
case QGeoPositionInfoSource::SatellitePositioningMethods:
text = QStringLiteral("Satellite");
break;
case QGeoPositionInfoSource::NonSatellitePositioningMethods:
text = QStringLiteral("Non Satellite");
break;
case QGeoPositionInfoSource::AllPositioningMethods:
text = QStringLiteral("All");
break;
}
ui->labelSupported->setText(text);
}
void Widget::on_buttonResetError_clicked()
{
ui->labelErrorState->setText(QStringLiteral("N/A"));
}