Revision control

++ // Copyright (C) 2016 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
++ #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)));
++
++ ui->groupBox->setLayout(ui->gridLayout);
++ ui->horizontalSlider->setMinimum(m_posSource->minimumUpdateInterval());
++ ui->labelTimeOut->setVisible(false);
++
++ connect(m_posSource, SIGNAL(errorOccurred(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)
++ {
++ if (err == QGeoPositionInfoSource::UpdateTimeoutError) {
++ // handle timeout
++ positionTimedOut();
++ } else {
++ // handle other errors
++ 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"));
++ }