Added feature: Show travelled distance in routesavedialog and routedialog.
[speedfreak] / Client / routesavedialog.cpp
1 /*
2  * Route save dialog class
3  *
4  * @author     Toni Jussila <toni.jussila@fudeco.com>
5  * @copyright  (c) 2010 Speed Freak team
6  * @license    http://opensource.org/licenses/gpl-license.php GNU Public License
7  */
8
9 #include "routesavedialog.h"
10 #include "ui_routesavedialog.h"
11 #include <QDebug>
12
13 /**
14   *Constructor of this class.
15   *@param QWidget pointer to parent object. By default the value is NULL.
16   */
17 RouteSaveDialog::RouteSaveDialog(QWidget *parent) :
18     QDialog(parent), ui(new Ui::RouteSaveDialog){
19
20     qDebug() << "__RouteSaveDialog";
21     ui->setupUi(this);
22     this->setWindowTitle("Tracking");
23
24     routeDialog = NULL;
25     location = NULL;
26     gpsData = NULL;
27     helpRoutingDialog = NULL;
28
29     //Clear variables
30     averageSpeed = 0.0;
31     speed = 0.0;
32     allSpeeds = 0.0;
33     speedCount = 0;
34
35     //Button settings
36     buttonStatus = true;
37     pixmapRouteStop = new QPixmap("Graphics/route_stop.png");
38     pixmapRouteStart = new QPixmap("Graphics/route_start.png");
39     iconRouteStop = new QIcon(*pixmapRouteStop);
40     iconRouteStart = new QIcon(*pixmapRouteStart);
41     QSize iconSize(125, 125);
42     ui->buttonRouteStartStop->setIconSize(iconSize);
43     ui->buttonRouteStartStop->setIcon(*iconRouteStart);
44     ui->buttonRouteStartStop->setAutoFillBackground(true);
45     ui->buttonRouteStartStop->setStyleSheet("background-color: rgb(0, 0, 0); color: rgb(255, 255, 255)");
46     ui->pushButtonInfo->setAutoFillBackground(true);
47     ui->pushButtonInfo->setStyleSheet("background-color: rgb(0, 0, 0); color: rgb(255, 255, 255)");
48
49     //Satellite picture and label
50     ui->labelRouteSatelliteStatus->setVisible(0);
51     ui->labelRouteSatellitePicture->setVisible(0);
52     //ui->labelRouteSatellitePicture->setPixmap(QPixmap("Graphics/satellite_vista.png"));
53     timerSatellitePicture = new QTimer();
54     timerSatellitePicture->setInterval(400);
55     connect(timerSatellitePicture, SIGNAL(timeout()),this, SLOT(timerSatellitePictureTimeout()));
56     ui->labelUserInfo->setText("Push start button");  //User info label
57
58     //Invisible or clear labels
59     ui->labelRouteStatus->setVisible(0);
60     ui->labelRoutePicture->setVisible(0);
61     ui->labelGpsSpeed->setVisible(0); //GPS speed label
62     ui->labelGpsAvgSpeed->setVisible(0); //GPS average speed label
63     ui->labelDistance->setVisible(0); //GPS distance label
64     ui->labelSignalStrength->setText(""); //GPS signal strength label
65     timerRoutePicture = new QTimer();
66     timerRoutePicture->setInterval(400);
67     connect(timerRoutePicture, SIGNAL(timeout()),this, SLOT(timerRoutePictureTimeout()));
68
69     //GPS
70     location = new Maemo5Location(this);
71     gpsData = new GPSData(location);
72     connect(location,SIGNAL(agnss()),this,SLOT(gpsStatus()));
73 }
74
75 /**
76   *Destructor of this class. Deletes all dynamic objects and sets them to NULL.
77   */
78 RouteSaveDialog::~RouteSaveDialog()
79 {
80     qDebug() << "__~RouteSaveDialog";
81     if(ui)
82         delete ui;
83     if(gpsData)
84         delete gpsData;
85     if(location)
86         delete location;
87     if(routeDialog)
88         delete routeDialog;
89
90     delete timerSatellitePicture;
91     delete timerRoutePicture;
92     delete pixmapRouteStop;
93     delete pixmapRouteStart;
94     delete iconRouteStop;
95     delete iconRouteStart;
96 }
97
98 /**
99   *
100   */
101 void RouteSaveDialog::changeEvent(QEvent *e)
102 {
103     QDialog::changeEvent(e);
104     switch (e->type()) {
105     case QEvent::LanguageChange:
106         ui->retranslateUi(this);
107         break;
108     default:
109         break;
110     }
111 }
112
113 /**
114   *This slot function is called when route start/stop button clicked.
115   */
116 void RouteSaveDialog::on_buttonRouteStartStop_clicked()
117 {
118     if ( buttonStatus == true )//If start button clicked
119     {
120         qDebug() << "__start button clicked";
121
122         //Clear variables
123         averageSpeed = 0.0;
124         speed = 0.0;
125         allSpeeds = 0.0;
126         speedCount = 1;
127
128         buttonStatus = false;
129         ui->buttonRouteStartStop->setIcon(*iconRouteStop);
130         location->startPollingGPS();
131         gpsStatus();
132     }
133     else //If stop button clicked
134     {
135         qDebug() << "__stop button clicked";
136         buttonStatus = true;
137         ui->buttonRouteStartStop->setIcon(*iconRouteStart);
138
139         //Satellite picture and label
140         ui->labelRouteSatelliteStatus->setText("Searching satellite");
141         ui->labelRouteSatelliteStatus->setVisible(0);
142         ui->labelRouteSatellitePicture->setVisible(0);
143         timerSatellitePicture->stop();
144
145         //Route picture and label
146         ui->labelRouteStatus->setVisible(0);
147         ui->labelRoutePicture->setVisible(0);
148         timerRoutePicture->stop();
149         location->stopPollingGPS();
150
151         QString routeFile = QString("routetemp.xml");
152         if (routeDialog->readRouteFromFile( routeFile ) == true)
153         {
154             if(!routeDialog)
155                 routeDialog = new RouteDialog(this);
156             connect(routeDialog, SIGNAL(sendroute()), this, SLOT(sendRoute()));
157             routeDialog->show();
158         }
159
160         //Set GPS speed labels in visible
161         ui->labelGpsSpeed->setVisible(0);
162         ui->labelGpsAvgSpeed->setVisible(0);
163
164         //GPS distance label
165         ui->labelDistance->setVisible(0);
166
167         //Stop route recording
168         gpsData->stopRouteRecording();
169
170         //User info label
171         ui->labelUserInfo->setText("Push start button");
172     }
173 }
174
175 /**
176   *This slot function is called when satellite picture timer timeout(400ms).
177   */
178 void RouteSaveDialog::timerSatellitePictureTimeout()
179 {
180     //If satellite picture visible.
181     if (ui->labelRouteSatellitePicture->isVisible() == 1)
182     {
183         ui->labelRouteSatelliteStatus->setVisible(0);
184         ui->labelRouteSatellitePicture->setVisible(0);
185     }
186     else
187     {
188         ui->labelRouteSatelliteStatus->setVisible(1);
189         ui->labelRouteSatellitePicture->setVisible(1);
190     }
191     timerSatellitePicture->start();
192 }
193
194 /**
195   *This slot function is called when route picture timer timeout(400ms).
196   */
197 void RouteSaveDialog::timerRoutePictureTimeout()
198 {
199     //If route picture visible.
200     if (ui->labelRoutePicture->isVisible() == 1)
201     {
202         ui->labelRouteStatus->setVisible(0);
203         ui->labelRoutePicture->setVisible(0);
204     }
205     else
206     {
207         ui->labelRouteStatus->setVisible(1);
208         ui->labelRoutePicture->setVisible(1);
209     }
210     timerRoutePicture->start();
211 }
212
213 /**
214   * This slot function is called when GPS update location.
215   */
216 void RouteSaveDialog::gpsStatus()
217 {
218     //IF GPS start button clicked
219     if (buttonStatus == false)
220     {
221         //ui->labelSignalStrength->setText(QString::number(location->getSignalStrength()));    //Returns average signal strength of satellites which are in use.
222
223         //If GPS find 4 or more satellite and signal stregth is 30 or more.
224         if (location->getSatellitesInUse() >= 4 && location->getSignalStrength() >= 30)
225         {
226             //Satellite picture and label
227             ui->labelRouteSatelliteStatus->setText("GPS Ready");
228             ui->labelRouteSatelliteStatus->setVisible(1);
229             ui->labelRouteSatellitePicture->setVisible(1);
230             timerSatellitePicture->stop();
231
232             //Route picture and label
233             ui->labelRouteStatus->setText("Recorded " + QString::number(gpsData->roundCounter) + " route point");
234             ui->labelUserInfo->setText("Recorded " + QString::number(gpsData->roundCounter) + " route point");
235             ui->labelRouteStatus->setVisible(1);
236             ui->labelRoutePicture->setVisible(1);
237             timerRoutePicture->start();
238
239             //Get GPS speed
240             speed = location->getSpeed();
241
242             //Set GPS speed
243             gpsSpeed.sprintf("%.0f", speed);
244             ui->labelGpsSpeed->setText(gpsSpeed + " km/h");
245             ui->labelGpsSpeed->setVisible(1);
246
247             //Set GPS average speed
248             allSpeeds += speed;
249             averageSpeed = allSpeeds/speedCount;
250             gpsSpeed.sprintf("%.0f",averageSpeed);
251             ui->labelGpsAvgSpeed->setText("Average: " + gpsSpeed + " km/h");
252             ui->labelGpsAvgSpeed->setVisible(1);
253             speedCount++;
254
255             //Set distance traveled.
256             distanceString.sprintf("%.3f", gpsData->getDistanceTraveled());
257             ui->labelDistance->setText(distanceString + " km");
258             ui->labelDistance->setVisible(1);
259
260             //Start route recording
261             gpsData->startRouteRecording();
262         }
263         else //If GPS find less than 4 satellite or signal strength is poor.
264         {
265             //Satellite picture and label
266             ui->labelRouteSatelliteStatus->setText("Searching satellite");
267             ui->labelUserInfo->setText("Searching satellite");
268             ui->labelRouteSatelliteStatus->setVisible(1);
269             ui->labelRouteSatellitePicture->setVisible(1);
270             timerSatellitePicture->start();
271
272             //Route picture and label
273             ui->labelRouteStatus->setVisible(0);
274             ui->labelRoutePicture->setVisible(0);
275             timerRoutePicture->stop();
276
277             //Set GPS speed labels in visible
278             ui->labelGpsSpeed->setVisible(0);
279             ui->labelGpsAvgSpeed->setVisible(0);
280
281             //GPS distance label
282             ui->labelDistance->setVisible(0);
283         }
284     }
285     else //If stop button clicked
286     {
287         //Satellite picture and label
288         ui->labelRouteSatelliteStatus->setText("Searching satellite");
289         ui->labelUserInfo->setText("Push start button");
290         ui->labelRouteSatelliteStatus->setVisible(0);
291         ui->labelRouteSatellitePicture->setVisible(0);
292         timerSatellitePicture->stop();
293
294         //Route picture and label
295         ui->labelRouteStatus->setVisible(0);
296         ui->labelRoutePicture->setVisible(0);
297         timerRoutePicture->stop();
298
299         //Set GPS speed labels in visible
300         ui->labelGpsSpeed->setVisible(0);
301         ui->labelGpsAvgSpeed->setVisible(0);
302
303         //GPS distance label
304         ui->labelDistance->setVisible(0);
305     }
306 }
307
308 /**
309   * This slot function is called when routeDialog emit sendroute (sendPushButton).
310   */
311 void RouteSaveDialog::sendRoute()
312 {
313     emit sendroute(); //Emit mainwindow clientSendRoute
314 }
315
316 /**
317   * This slot function called when ever info button clicked.
318   */
319 void RouteSaveDialog::on_pushButtonInfo_clicked()
320 {
321     if(!helpRoutingDialog)
322     {
323         helpRoutingDialog = new HelpRoutingDialog;
324     }
325     connect(helpRoutingDialog, SIGNAL(rejected()), this, SLOT(killHelpDialog()));
326     helpRoutingDialog->show();
327 }
328
329 /**
330   * This slot function called when ever dialog rejected.
331   */
332 void RouteSaveDialog::killHelpDialog()
333 {
334     if(helpRoutingDialog)
335     {
336         qDebug() << "__Route save kill: helpRoutingDialog";
337         delete helpRoutingDialog;
338         helpRoutingDialog = NULL;
339     }
340 }
341
342 /**
343   * This function return speed average.
344   * @return double average speed
345   */
346 double RouteSaveDialog::getAverageSpeed()
347 {
348     return averageSpeed;
349 }
350
351 /**
352   * This function return distance traveled in QString.
353   * @return QString distance traveled
354   */
355 QString RouteSaveDialog::getDistanceTraveled()
356 {
357     return distanceString;
358 }