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