Bug fixed in carmainwindow.
[speedfreak] / Client / carmainwindow.cpp
1 /*
2  * CarMainWindow main class
3  *
4  * @author     Toni Jussila <toni.jussila@fudeco.com>
5  * @author     Janne Änäkkälä <janne.anakkala@fudeco.com>
6  * @author     Tiina Kivilinna-Korhola <tiina.kivilinna-korhola@fudeco.com>
7  * @author     Olavi Pulkkinen <olavi.pulkkinen@fudeco.com>
8  * @copyright  (c) 2010 Speed Freak team
9  * @license    http://opensource.org/licenses/gpl-license.php GNU Public License
10  */
11
12 #include "carmainwindow.h"
13 #include "math.h"
14
15 /**
16   *Constructor of this class.
17   *@param QWidget pointer to parent object. By default the value is NULL.
18   */
19 CarMainWindow::CarMainWindow(QWidget *parent):QMainWindow(parent), ui(new Ui::CarMainWindow)
20 {
21     ui->setupUi(this);
22     //result = new ResultDialog();
23     //measure = new MeasureDialog();
24     xmlreader = new XmlReader();
25
26     initComboBoxStartTabUnits();
27     initListViewStartTabAccelerationCategories();
28
29     myLogin = new LoginWindow(this);
30     myRegistration = new Registration(this);
31     xmlwriter = new XmlWriter();
32     manager = new QNetworkAccessManager(this);
33     connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(networkResponse(QNetworkReply*)));
34     connect(myRegistration,SIGNAL(sendregistration()),this,SLOT(registrate()));
35     connect(this,SIGNAL(sendresult()),this,SLOT(sendXml()));
36
37     time = 0;
38     speed = 0;
39     timer = new QTimer();
40
41     accelerometer = new Accelerometer();
42     accelerometer->setSampleRate(100);
43
44     measures = new Measures();
45     this->initializeMeasures();
46
47     timer->setInterval(300);
48
49     connect(this->timer, SIGNAL(timeout()), this, SLOT(after_timeout()));
50
51     ui->labelMeasureTabResult->hide();
52
53 }
54
55 /**
56   *Destructor of this class. Should be used to release all allocated resources.
57   */
58 CarMainWindow::~CarMainWindow()
59 {
60     delete ui;
61     //delete result;
62     //delete measure;
63     delete xmlreader;
64     delete xmlwriter;
65     delete manager;
66 }
67
68 /**
69   *This function is used to .
70   *@param
71   */
72 void CarMainWindow::changeEvent(QEvent *e)
73 {
74     QMainWindow::changeEvent(e);
75     switch (e->type()) {
76     case QEvent::LanguageChange:
77         ui->retranslateUi(this);
78         break;
79     default:
80         break;
81     }
82 }
83
84 /**
85   *This slot function is called when ever list view is update. Start-tab view.
86   */
87 void CarMainWindow::on_listViewStartTabAccelerationCategories_clicked(QModelIndex index)
88 {
89     QString str = index.data().toString();
90     QStringList list = str.split("-");
91     QStringList list2 = list[1].split(" ");
92
93     ui->lineEditStartTabMin->setText(list[0]);
94     ui->lineEditStartTabMax->setText(list2[0]);
95     updateComboBoxStartTabUnits(list2[1]);
96 }
97
98 /**
99   *This slot function is called when ever auto start button clicked. Start-tab view.
100   */
101 void CarMainWindow::on_autoStartButton_clicked()
102 {
103
104     //delete measure;
105     //measure = NULL;
106     //measure = new MeasureDialog();
107    // connect(measure, SIGNAL(speedAchieved()), this, SLOT(openResultView()));
108     accelerometer->start();
109     timer->start();
110     // Show measure dialog.
111     //measure->show();
112     ui->tabWidget->setCurrentWidget(this->ui->tabMeasureResult);
113 }
114
115 /**
116   *This slot function is called when ever list view is update. Start-tab view.
117   *@param QString unit.
118   */
119 void CarMainWindow::updateComboBoxStartTabUnits(QString unit)
120 {
121     ui->comboBoxStartTabUnits->setCurrentIndex(ui->comboBoxStartTabUnits->findText(unit, Qt::MatchExactly));
122 }
123
124 /**
125   *This function is used to init unit combobox. Start-tab view.
126   */
127 void CarMainWindow::initComboBoxStartTabUnits()
128 {
129     units << "km/h" << "km" << "h" << "m" << "min" << "Mile" << "Mph" << "in" << "ft" << "yrd";
130     ui->comboBoxStartTabUnits->addItems(units);
131 }
132
133 /**
134   *This function is used to set items to unit combobox. Start-tab view.
135   *@param QStringlist units
136   */
137 void CarMainWindow::setComboBoxStartTabUnits(QStringList units)
138 {
139     ui->comboBoxStartTabUnits->addItems(units);
140 }
141
142 /**
143   *This function is used to init listViewStartTabAccelerationCategories. Start-tab view.
144   */
145 void CarMainWindow::initListViewStartTabAccelerationCategories()
146 {
147     accelerationCategoriesStartTab << "0-40 km/h" << "0-100 km/h"; //<< "0-1/4 Mile" << "0-1/8 Mile" << "0-50 km" << "50-100 Mile" << "0-60 Mph" << "0-100 m" << "0-50 ft" << "0-50 yrd" << "0-500 in";
148     QAbstractItemModel *model = new StringListModel(accelerationCategoriesStartTab);
149     ui->listViewStartTabAccelerationCategories->setModel(model);
150 }
151
152 /**
153   *This function is used to set items to listViewStartTabAccelerationCategories. Start-tab view.
154   *@param QStringlist accelerationCategoriesStartTab
155   */
156 void CarMainWindow::setListViewStartTabAccelerationCategories(QStringList accelerationCategoriesStartTab)
157 {
158     QAbstractItemModel *model = new StringListModel(accelerationCategoriesStartTab);
159     ui->listViewStartTabAccelerationCategories->setModel(model);
160 }
161
162 /**
163   *This function is used to set items to category combobox. Top-tab view.
164   *@param
165   */
166 void CarMainWindow::setCategoryCompoBox()
167 {
168     ui->comboBoxTopCategory->addItems(xmlreader->getTop10List());
169 }
170
171 /**
172   *This function is used to set items to labelTopList. Top-tab view.
173   *@param QString category
174   */
175 void CarMainWindow::setListViewTopList(QString category)
176 {
177     QString topList;
178
179     if (category == "acceleration-0-100")
180     {
181         topList.append(xmlreader->getTop10AccelerationList());
182     }
183
184     else if (category == "Speed")
185     {
186         topList.append(xmlreader->getTop10SpeedList());
187     }
188
189     else if (category == "G-force")
190     {
191         topList.append(xmlreader->getTop10GforceList());
192     }
193     ui->labelTopList->setText(topList);
194 }
195
196 /**
197   *This slot function is called when speed is achieved in measure dialog. Opens result dialog.
198   */
199 void CarMainWindow::openResultView()
200 {
201     //result->saveMeasuresToArray(measure->measures);
202     // Show result dialog.
203     //result->show();
204     QString timeInteger;
205     timeInteger.setNum(this->measures->getTime40kmh());
206     //time = "0 - 40 km/h: ";
207     //time.append(timeInteger);
208     //ui->labelResult40kmh->setText(time);
209     ui->labelMeasureTabResult->show();
210     ui->labelMeasureTabResult->setText(timeInteger);
211     //ui->tabWidget->setCurrentWidget(this->ui->tabMeasureResult);
212 }
213
214 /**
215   *This slot function is called when the server has finished guery.
216   */
217 void CarMainWindow::networkResponse(QNetworkReply *reply)
218 {
219
220 }
221
222 /**
223   *This slot function is called when the user will to send data to server.
224   *@todo Where is this callback connected?
225   */
226 void CarMainWindow::on_pushButton_clicked()
227 {
228      sendXml();
229 }
230
231 /**
232   *This slot function is called when login/logout button is clicked.
233   */
234 void CarMainWindow::on_loginLogoutButton_clicked()
235 {
236     //LoginWindow myLogin;
237
238     myLogin->show();
239     //ui->loginLogoutButton->setText("logout");
240 }
241
242 /**
243   *This slot function is called when registrate button is clicked.
244   */
245 void CarMainWindow::on_registratePushButton_clicked()
246 {
247     myRegistration->show();
248 }
249
250 /**
251   *This slot function is called when ever refresh button clicked. Top-tab view.
252   */
253 void CarMainWindow::on_buttonTopRefresh_clicked()
254 {
255     setCategoryCompoBox();
256 }
257
258 /**
259   *This slot function is called when ever category combobox current index changed. Top-tab view.
260   *@param QString category
261   */
262 void CarMainWindow::on_comboBoxTopCategory_currentIndexChanged(QString category)
263 {
264     setListViewTopList(category);
265 }
266
267 /**
268   *This slot function is called when ever category combobox activated. Top-tab view.
269   *@param QString category
270   */
271 void CarMainWindow::on_comboBoxTopCategory_activated(QString category)
272 {
273     setListViewTopList(category);
274 }
275
276 /**
277   *This slot function is called when set/change user button is clicked.
278   */
279 void CarMainWindow::on_setUserPushButton_clicked()
280 {
281     myLogin->show();
282
283     ui->userNameLabel->setText( "User: " + myLogin->getUserName());
284     ui->setUserPushButton->setText( "Change User");
285 }
286
287 /**
288   *@brief Sends registration information to the server in xml format.
289   *Reads user name, password and emaol address from resuldialogs internal variables.
290   *@todo Replace msg box with better reaction to server`s responce.
291   *@todo Write error handling.
292   */
293 void CarMainWindow::registrate()
294 {
295     qDebug() << "_registrate" ;
296     qDebug() << this->myRegistration->getUserName() << "+" << this->myRegistration->getPassword() << "+" << this->myRegistration->getEmail();
297
298     QBuffer *regbuffer = new QBuffer();
299
300     QNetworkReply *currentDownload;
301
302     QUrl qurl("http//:api.speedfreak-app.com/register");
303     QNetworkRequest request(qurl);
304
305     //write also to a file during development, :
306     xmlwriter->writeXml(this->myRegistration->getUserName(),
307                       this->myRegistration->getPassword(),
308                       this->myRegistration->getEmail());
309     xmlwriter->writeRegistering(regbuffer,
310                       this->myRegistration->getUserName(),
311                       this->myRegistration->getPassword(),
312                       this->myRegistration->getEmail());
313     //Tmp msgbox - later server responce
314     QMessageBox::about(this,"Registrate",this->myRegistration->getUserName() + this->myRegistration->getPassword() + this->myRegistration->getEmail());
315
316     currentDownload = manager->post(request, ("data=" + regbuffer->data()));
317
318     //ackFromServer function gets called when HTTP request is completed
319     connect(currentDownload, SIGNAL(finished()),SLOT(ackOfRegistration()));
320 }
321
322 /**
323   *@brief Sends result(s) to the server in xml format with authentication information in the header.
324   *@todo Write error handling.
325   */
326 void CarMainWindow::sendXml()
327 {
328     qDebug() << "_sendXml";
329
330     QBuffer *xmlbuffer = new QBuffer();
331     QNetworkReply *currentDownload;
332
333     QString credentials = this->myRegistration->getUserName() + ":" + this->myRegistration->getPassword();
334     credentials = "Basic " + credentials.toAscii().toBase64();
335
336     QUrl qurl("http//:api.speedfreak-app.com/update/acceleration-0-40");
337     QNetworkRequest request(qurl);
338
339     request.setRawHeader(QByteArray("Authorization"),credentials.toAscii());
340
341     xmlwriter->writeResult(xmlbuffer);
342
343     currentDownload = manager->post(request, ("data=" + xmlbuffer->data()));
344     //QString data("abcdefg");    //testing
345     //currentDownload = manager->post(request,"data=" + QUrl::toPercentEncoding(data));   //testing
346
347
348     //ackFromServer function gets called when HTTP request is completed
349     connect(currentDownload, SIGNAL(finished()),SLOT(ackOfResult()));
350
351 }
352
353 /**
354   *@brief React to servers responce after result has been sent.
355   *@todo Implement function and write error handling.
356   */
357 void CarMainWindow::ackOfResult()
358 {
359     qDebug() << "Server acknowledged posting of result";
360 }
361
362 /**
363   *@brief React to servers responce after registration has been sent.
364   *@todo Implement function and write error handling.
365   */
366
367 void CarMainWindow::ackOfRegistration()
368 {
369     qDebug() << "Server acknowledged registration";
370 }
371
372
373 /**
374   *@brief Just for development, for the real button is not shown until
375   *measurin started and there are results.
376   *@todo Implement with real code and yet leave sendXml in the bottom in use.
377   */
378
379 void CarMainWindow::on_manualStartButton_clicked()
380 {
381     sendXml();
382 }
383
384 /**
385   * This slot function is called when timer gives timeout signal. Checks current speed
386   * and stores times in measure class.
387   */
388 void CarMainWindow::after_timeout()
389 {
390     QString timeString, speedString;
391     //time++;
392     time = accelerometer->getTotalTime();
393     speed = accelerometer->getCurrentSpeed();
394     //speed = speed +10;
395
396     if (floor(speed) == 10)
397     {
398         measures->setTime10kmh(time);
399     }
400
401     else if (floor(speed) == 20)
402     {
403         measures->setTime20kmh(time);
404     }
405
406     else if (floor(speed) == 30)
407     {
408         measures->setTime30kmh(time);
409     }
410
411     else if (floor(speed) == 40)
412     {
413         measures->setTime40kmh(time);
414     }
415
416     else if (floor(speed) == 50)
417     {
418         measures->setTime50kmh(time);
419     }
420
421     else if (floor(speed) == 60)
422     {
423         measures->setTime60kmh(time);
424     }
425
426     else if (floor(speed) == 70)
427     {
428         measures->setTime70kmh(time);
429     }
430
431     else if (floor(speed) == 80)
432     {
433         measures->setTime80kmh(time);
434     }
435
436     else if (floor(speed) == 90)
437     {
438         measures->setTime90kmh(time);
439     }
440
441     else if (floor(speed) == 100)
442     {
443         measures->setTime100kmh(time);
444     }
445
446     else
447     {
448
449     }
450
451     // If speed is over 40 km/h emits speedAchieved() signal and close this dialog.
452     if (speed >= 40.0)
453     {
454         timer->stop();
455         accelerometer->stop();
456         time = 0;
457         speed = 0;
458         //emit this->speedAchieved();
459         this->openResultView();
460         //this->close();
461
462     }
463
464     // Updates speed and time.
465     else
466     {
467         timeString.setNum(time);
468         speedString.setNum(speed);
469         ui->labelMeasureTabTime->setText(timeString);
470         ui->labelMeasureTabSpeed->setText(speedString);
471
472         timer->start();
473     }
474
475 }
476
477 /**
478   * Initializes measures class's member variables.
479   */
480 void CarMainWindow::initializeMeasures()
481 {
482     measures->setTime10kmh(0);
483     measures->setTime20kmh(0);
484     measures->setTime30kmh(0);
485     measures->setTime40kmh(0);
486     measures->setTime50kmh(0);
487     measures->setTime60kmh(0);
488     measures->setTime70kmh(0);
489     measures->setTime80kmh(0);
490     measures->setTime90kmh(0);
491     measures->setTime100kmh(0);
492 }
493
494 /**
495   * This slot function is called when Abort button is clicked.
496   */
497 void CarMainWindow::on_pushButtonMeasureTabAbort_clicked()
498 {
499     measures->setTime10kmh(0);
500     measures->setTime20kmh(0);
501     measures->setTime30kmh(0);
502     measures->setTime40kmh(0);
503     measures->setTime50kmh(0);
504     measures->setTime60kmh(0);
505     measures->setTime70kmh(0);
506     measures->setTime80kmh(0);
507     measures->setTime90kmh(0);
508     measures->setTime100kmh(0);
509     timer->stop();
510     accelerometer->stop();
511     time = 0;
512     speed = 0;
513     ui->tabWidget->setCurrentWidget(this->ui->StartTab);
514     //this->close();
515 }
516
517 void CarMainWindow::on_pushButtonSendResult_clicked()
518 {
519     emit sendresult();
520 }