3 * Copyright (C) 2011 Roman Moravcik
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
36 #include "mainwindow.h"
37 #include "gpscompasswindow.h"
38 #include "satelliteviewwindow.h"
41 #include "satellitesignalstrengthwindow.h"
44 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
46 m_satellitesInView = 0;
47 m_satellitesInUse = 0;
49 m_screenLocked = false;
52 m_position = QGeoPositionInfoSource::createDefaultSource(0);
54 connect(m_position, SIGNAL(positionUpdated(const QGeoPositionInfo &)), this,
55 SLOT(onPositionUpdated(const QGeoPositionInfo &)));
57 m_position->setUpdateInterval(3);
58 m_position->startUpdates();
61 m_satellite = QGeoSatelliteInfoSource::createDefaultSource(0);
63 connect(m_satellite, SIGNAL(satellitesInViewUpdated(const QList<QGeoSatelliteInfo> &)), this,
64 SLOT(onSatellitesInViewUpdated(const QList<QGeoSatelliteInfo> &)));
65 connect(m_satellite, SIGNAL(satellitesInUseUpdated(const QList<QGeoSatelliteInfo> &)), this,
66 SLOT(onSatellitesInUseUpdated(const QList<QGeoSatelliteInfo> &)));
68 m_satellite->startUpdates();
76 registerScreenLockMonitor();
80 MainWindow::~MainWindow()
83 m_satellite->stopUpdates();
88 m_position->stopUpdates();
92 void MainWindow::createUi()
94 QWidget *widget = new QWidget;
95 setCentralWidget(widget);
98 const CAknAppUiBase::TAppUiOrientation uiOrientation = CAknAppUi::EAppUiOrientationPortrait;
99 CAknAppUi* appUi = dynamic_cast<CAknAppUi*> (CEikonEnv::Static()->AppUi());
102 appUi->SetOrientationL(uiOrientation);
105 #elif defined(Q_WS_MAEMO_5)
106 setAttribute(Qt::WA_Maemo5PortraitOrientation, true);
107 setAttribute(Qt::WA_Maemo5StackedWindow);
110 setWindowTitle(tr("GPSData"));
112 QVBoxLayout *mainLayout = new QVBoxLayout();
113 widget->setLayout(mainLayout);
115 QFormLayout *layout = new QFormLayout();
116 layout->setMargin(8);
117 layout->setSpacing(8);
118 layout->setLabelAlignment(Qt::AlignLeft);
119 mainLayout->addLayout(layout);
121 m_latitude = new QLabel();
122 m_latitude->setDisabled(true);
123 layout->addRow(tr("Latitude:"), m_latitude);
125 m_longitude = new QLabel();
126 m_longitude->setDisabled(true);
127 layout->addRow(tr("Longtitude:"), m_longitude);
129 m_accuracy = new QLabel();
130 m_accuracy->setDisabled(true);
131 layout->addRow(tr("Accuracy:"), m_accuracy);
133 m_altitude = new QLabel();
134 m_altitude->setDisabled(true);
135 layout->addRow(tr("Altitude:"), m_altitude);
137 m_altitudeAccuracy = new QLabel();
138 m_altitudeAccuracy->setDisabled(true);
139 layout->addRow(tr("Altitude accura.:"), m_altitudeAccuracy);
141 m_direction = new QLabel();
142 m_direction->setDisabled(true);
143 layout->addRow(tr("Direction:"), m_direction);
145 m_magneticDeclination = new QLabel();
146 m_magneticDeclination->setDisabled(true);
147 layout->addRow(tr("Magnetic declin.:"), m_magneticDeclination);
149 m_groundSpeed = new QLabel();
150 m_groundSpeed->setDisabled(true);
151 layout->addRow(tr("Ground speed:"), m_groundSpeed);
153 m_verticalSpeed = new QLabel();
154 m_verticalSpeed->setDisabled(true);
155 layout->addRow(tr("Vertical speed:"), m_verticalSpeed);
157 m_mode = new QLabel();
158 m_mode->setDisabled(true);
159 layout->addRow(tr("Mode:"), m_mode);
161 m_time = new QLabel();
162 m_time->setDisabled(true);
163 layout->addRow(tr("GPS Timestamp:"), m_time);
165 m_satUsedView = new QLabel();
166 m_satUsedView->setDisabled(true);
167 layout->addRow(tr("Used/View sat.:"), m_satUsedView);
170 m_satelliteSignalStrength = new SatelliteSignalStrength();
171 m_satelliteSignalStrength->showTitle(true);
172 mainLayout->addWidget(m_satelliteSignalStrength);
176 void MainWindow::createMenu()
179 #if defined(Q_OS_SYMBIAN)
180 QAction *menuSoftkey = new QAction(tr("Menu"), this);
181 menuSoftkey->setSoftKeyRole(QAction::PositiveSoftKey);
182 addAction(menuSoftkey);
184 QMenu *menu = new QMenu();
185 menuSoftkey->setMenu(menu);
187 QMenuBar *menu = new QMenuBar();
192 QAction *satelliteSignalStrengthAction = new QAction(tr("Signal strength"), this);
193 menu->addAction(satelliteSignalStrengthAction);
194 connect(satelliteSignalStrengthAction, SIGNAL(triggered()), this, SLOT(onSatelliteSignalStrengthMenuClicked()));
197 QAction *satelliteViewAction = new QAction(tr("Satellite view"), this);
198 menu->addAction(satelliteViewAction);
199 connect(satelliteViewAction, SIGNAL(triggered()), this, SLOT(onSatelliteViewMenuClicked()));
201 QAction *gpsCompassAction = new QAction(tr("GPS compass"), this);
202 menu->addAction(gpsCompassAction);
203 connect(gpsCompassAction, SIGNAL(triggered()), this, SLOT(onGpsCompassMenuClicked()));
207 void MainWindow::updateUi()
209 /* Don't update if window is not visible */
213 if (m_positionInfo.isValid()){
214 m_latitude->setText(convertCoordinate(m_positionInfo.coordinate().latitude(), LatitudeCoordinate));
215 m_longitude->setText(convertCoordinate(m_positionInfo.coordinate().longitude(), LongitudeCoordinate));
217 if ((!qIsNaN(m_positionInfo.coordinate().altitude())) &&
218 (m_positionInfo.coordinate().type() != QGeoCoordinate::InvalidCoordinate)) {
219 m_altitude->setText(formatLength(m_positionInfo.coordinate().altitude()));
221 if (m_positionInfo.hasAttribute(QGeoPositionInfo::VerticalAccuracy))
222 m_altitudeAccuracy->setText(formatLength(m_positionInfo.attribute(QGeoPositionInfo::VerticalAccuracy)));
224 m_altitudeAccuracy->clear();
227 m_altitudeAccuracy->clear();
230 if (m_positionInfo.coordinate().type() == QGeoCoordinate::Coordinate2D)
231 m_mode->setText("2D");
232 else if (m_positionInfo.coordinate().type() == QGeoCoordinate::Coordinate3D)
233 m_mode->setText("3D");
237 m_time->setText(m_positionInfo.timestamp().toString("dd.MM.yyyy hh:mm:ss"));
239 if (m_positionInfo.hasAttribute(QGeoPositionInfo::HorizontalAccuracy))
240 m_accuracy->setText(formatLength(m_positionInfo.attribute(QGeoPositionInfo::HorizontalAccuracy)));
244 if (m_positionInfo.hasAttribute(QGeoPositionInfo::GroundSpeed))
245 m_groundSpeed->setText(convertSpeed(m_positionInfo.attribute(QGeoPositionInfo::GroundSpeed)));
247 m_groundSpeed->clear();
249 if (m_positionInfo.hasAttribute(QGeoPositionInfo::VerticalSpeed))
250 m_verticalSpeed->setText(convertSpeed(m_positionInfo.attribute(QGeoPositionInfo::VerticalSpeed)));
252 m_verticalSpeed->clear();
254 if (m_positionInfo.hasAttribute(QGeoPositionInfo::Direction))
255 m_direction->setText(formatDirection(m_positionInfo.attribute(QGeoPositionInfo::Direction)));
257 m_direction->clear();
259 if (m_positionInfo.hasAttribute(QGeoPositionInfo::MagneticVariation))
260 m_magneticDeclination->setText(formatDirection(m_positionInfo.attribute(QGeoPositionInfo::MagneticVariation)));
262 m_magneticDeclination->clear();
264 m_satUsedView->setText(QString::number(m_satellitesInUse) + " / " + QString::number(m_satellitesInView));
266 m_latitude->setText(tr("Waiting for GPS data"));
267 m_longitude->clear();
270 m_altitudeAccuracy->clear();
271 m_direction->clear();
272 m_groundSpeed->clear();
273 m_verticalSpeed->clear();
276 m_satUsedView->clear();
280 QString MainWindow::convertCoordinate(double coordinate, CoordinateType type) const
283 QChar degree(0x00B0);
285 double coordinateAbs = qAbs(coordinate);
286 double coordinateMin = (coordinateAbs - int(coordinateAbs)) * 60;
287 double coordinateSec = (coordinateMin - int(coordinateMin)) * 60;
289 s = QString("%1%2 %3' %4\"")
290 .arg(QString::number(int(coordinateAbs)))
292 .arg(QString::number(int(coordinateMin)))
293 .arg(QString::number(coordinateSec, 'f', 3));
295 if (type == LatitudeCoordinate) {
310 QString MainWindow::convertSpeed(double speed) const
314 s.sprintf("%.2f km/h", speed * 3.6);
319 QString MainWindow::formatLength(double length) const
324 s.sprintf("%.2f km", length / 10000);
326 s.sprintf("%.2f m", length);
331 QString MainWindow::formatDirection(double length) const
334 QChar degree(0x00B0);
336 s = QString("%1%2").arg(QString::number(length, 'f', 2)).arg(degree);
341 void MainWindow::onPositionUpdated(const QGeoPositionInfo &position)
348 if (position.isValid()) {
349 m_positionInfo = position;
354 void MainWindow::onSatellitesInViewUpdated(const QList<QGeoSatelliteInfo> &satellites)
360 m_satelliteSignalStrength->updateWidget(satellites, false);
362 m_satellitesInView = satellites.count();
366 void MainWindow::onSatellitesInUseUpdated(const QList<QGeoSatelliteInfo> &satellites)
372 m_satelliteSignalStrength->updateWidget(satellites, true);
374 m_satellitesInUse = satellites.count();
379 void MainWindow::satelliteSignalStrengthMenuClicked()
381 SatelliteSignalStrengthWindow *satelliteSignalStrengthWindow = new SatelliteSignalStrengthWindow(this);
382 satelliteSignalStrengthWindow->setSatelliteInfoSource(m_satellite);
383 satelliteSignalStrengthWindow->showMaximized();
387 void MainWindow::onSatelliteViewMenuClicked()
389 SatelliteViewWindow *satelliteViewWindow = new SatelliteViewWindow(this);
390 satelliteViewWindow->setSatelliteInfoSource(m_satellite);
391 #if defined(Q_OS_SYMBIAN)
392 satelliteViewWindow->showMaximized();
393 #elif defined(Q_WS_MAEMO_5)
394 satelliteViewWindow->show();
398 void MainWindow::onGpsCompassMenuClicked()
400 GpsCompassWindow *gpsCompassWindow = new GpsCompassWindow(this);
401 gpsCompassWindow->setPositionInfoSource(m_position);
402 #if defined(Q_OS_SYMBIAN) || defined(Q_WS_MAEMO_5)
403 gpsCompassWindow->showMaximized();
405 gpsCompassWindow->show();
410 void MainWindow::registerScreenLockMonitor()
412 QDBusConnection::systemBus().connect("",
413 "/com/nokia/mce/signal",
414 "com.nokia.mce.signal",
417 SLOT(onScreenLocked(QString)));
420 void MainWindow::onScreenLocked(QString state)
424 if(state == "unlocked")
429 if (m_screenLocked != locked) {
430 m_screenLocked = locked;
431 emit screenLocked(m_screenLocked);