X-Git-Url: http://git.maemo.org/git/?p=speedfreak;a=blobdiff_plain;f=Client%2Fcarmainwindow.cpp;h=5da33b71d655daf542776022249ecf33762cf3a3;hp=0371be117e38849550549f9f3c13f09b2d211c24;hb=b8104711348ebb86e8c93b23067af8f699870626;hpb=5845b8f91e10a07f68ac3327f8dfa79f2e4da47b diff --git a/Client/carmainwindow.cpp b/Client/carmainwindow.cpp index 0371be1..5da33b7 100644 --- a/Client/carmainwindow.cpp +++ b/Client/carmainwindow.cpp @@ -5,6 +5,9 @@ * @author Janne Änäkkälä * @author Tiina Kivilinna-Korhola * @author Olavi Pulkkinen + * @author Rikhard Kuutti + * @author Kai Rasilainen + * @author Jukka Kurttila * @copyright (c) 2010 Speed Freak team * @license http://opensource.org/licenses/gpl-license.php GNU Public License */ @@ -12,6 +15,10 @@ #include "carmainwindow.h" #include "math.h" +#define kAccelerometerSampleRate 40 +#define kFilteringFactor 0.1 +#define kSecondsInHour 3600 + /** *Constructor of this class. *@param QWidget pointer to parent object. By default the value is NULL. @@ -19,50 +26,111 @@ CarMainWindow::CarMainWindow(QWidget *parent):QMainWindow(parent), ui(new Ui::CarMainWindow) { ui->setupUi(this); - //result = new ResultDialog(); + ui->tabWidget->setCurrentWidget(this->ui->StartTab); + + //Disable start buttons before calibration + ui->autoStartButton->setEnabled(false); + ui->manualStartButton->setEnabled(false); + + result = new ResultDialog(); //measure = new MeasureDialog(); - xmlreader = new XmlReader(); + welcomeDialog = new WelcomeDialog(); + welcomeDialog->show(); initComboBoxStartTabUnits(); initListViewStartTabAccelerationCategories(); myLogin = new LoginWindow(this); + myCategorylist = new CategoryList(); + myHttpClient = new HttpClient(this); myRegistration = new Registration(this); - xmlwriter = new XmlWriter(); - manager = new QNetworkAccessManager(this); - connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(networkResponse(QNetworkReply*))); - connect(myRegistration,SIGNAL(sendregistration()),this,SLOT(registrate())); - connect(this,SIGNAL(sendresult()),this,SLOT(sendXml())); - - time = 0; - speed = 0; + connect(myRegistration,SIGNAL(sendregistration()),this,SLOT(regUserToServer())); + connect(myLogin,SIGNAL(userNameChanged()),this,SLOT(userLogin())); + connect(myHttpClient->myXmlreader, SIGNAL(receivedCategoryList()), this, SLOT(setCategoryCompoBox())); + connect(myHttpClient->myXmlreader, SIGNAL(receivedTop10List()), this, SLOT(showTop10())); + myRoute = new RouteDialog( this); + + //GPS + location = new Maemo5Location(this); + gpsData = new GPSData(location); + connect(location,SIGNAL(agnss()),this,SLOT(gpsStatus())); + gpsTime = new QDateTime(); + gpsTimer = new QTimer(); + connect(gpsTimer, SIGNAL(timeout()),this, SLOT(gpsTimerTimeout())); + gpsSpeedNow = 0.0; + gpsSpeedPrevious = 0.0; + gpsAcceleration = 0.0; + timeFromGps = 0.0; //Measure-tab view. + gpsSpeed = 0.0; + + this->time = 0; + this->speed = 0; + counterForSaveResults = 0; timer = new QTimer(); + // Accelerometer accelerometer = new Accelerometer(); - accelerometer->setSampleRate(100); + movingAverageZ = new MovingAverage(10); + + reverseAccelerationFlag = false; + vehicleStartedMoving = false; + isNewRun = true; + isSetup = false; + stopTime = 0; + accelerationStartThreshold = 0.1; + + accelerometerTimer = new QTimer(this); + connect(accelerometerTimer, SIGNAL(timeout()), this, SLOT(readAccelerometerData())); + //accelerometerTimer->start(kAccelerometerSampleRate); + + // Calculate + calculate = new Calculate(); + connect(calculate, SIGNAL(checkPointReached()), this, SLOT(handleCheckPoint())); + + resetAccelerometerMeasurements(); measures = new Measures(); - this->initializeMeasures(); + measures->initializeMembers(); - timer->setInterval(300); + this->timer->setInterval(100); connect(this->timer, SIGNAL(timeout()), this, SLOT(after_timeout())); + connect(myLogin, SIGNAL( userNameChanged()), this, SLOT(updateUserName())); ui->labelMeasureTabResult->hide(); + ui->pushButtonShowResultDialog->setEnabled(false); + ui->pushButtonShowResultDialog->setEnabled(false); + this->setWindowTitle("Speed Freak"); } /** - *Destructor of this class. Should be used to release all allocated resources. + *Destructor of this class. Deletes all dynamic objects and sets them to NULL. */ CarMainWindow::~CarMainWindow() { delete ui; + ui = NULL; //delete result; //delete measure; - delete xmlreader; - delete xmlwriter; - delete manager; + delete myCategorylist; + myCategorylist = NULL; + delete welcomeDialog; + welcomeDialog = NULL; + delete myRoute; + myRoute = NULL; + delete gpsData; + gpsData = NULL; + delete gpsTime; + gpsTime = NULL; + + //Route-tab view + gpsSpeedNow = 0.0; + gpsSpeedPrevious = 0.0; + gpsAcceleration = 0.0; + timeFromGps = 0.0; + gpsSpeed = 0.0; + gpsUpdateTime = 0; } /** @@ -88,27 +156,53 @@ void CarMainWindow::on_listViewStartTabAccelerationCategories_clicked(QModelInde { QString str = index.data().toString(); QStringList list = str.split("-"); - QStringList list2 = list[1].split(" "); + QStringList list3 = list[1].split(" "); + QStringList list2 = list[0].split(" "); - ui->lineEditStartTabMin->setText(list[0]); - ui->lineEditStartTabMax->setText(list2[0]); - updateComboBoxStartTabUnits(list2[1]); + ui->lineEditStartTabMin->setText(list2[1]); + ui->lineEditStartTabMax->setText(list3[0]); + updateComboBoxStartTabUnits(list3[1]); } /** *This slot function is called when ever auto start button clicked. Start-tab view. + *@todo Check setDiagramGapStem(100) <- (choiceInt == 2) */ void CarMainWindow::on_autoStartButton_clicked() { + measures->initializeMembers(); + resetAccelerometerMeasurements(); + ui->pushButtonSendResult->setEnabled(false); + ui->pushButtonShowResultDialog->setEnabled(false); + choice = ui->listViewStartTabAccelerationCategories->currentIndex(); + choiceInt = choice.row(); + //qDebug() << "choiceInt" << choiceInt << " " << catList.at(choiceInt); + if (choiceInt == 0) + { + ui->labelMeasureTabHeader->setText("Accelerate to 40 km/h"); + result->setDiagramGapStem(75); + } + else if (choiceInt == 1) + { + ui->labelMeasureTabHeader->setText("Accelerate to 100 km/h"); + result->setDiagramGapStem(30); + } + else if (choiceInt == 2) + { + ui->labelMeasureTabHeader->setText("Accelerate to 10 km/h"); + result->setDiagramGapStem(100); + } + else + { + ui->labelMeasureTabHeader->setText("Accelerate to 80 km/h"); + result->setDiagramGapStem(37.5); + } + ui->labelMeasureTabResult->setText(""); - //delete measure; - //measure = NULL; - //measure = new MeasureDialog(); - // connect(measure, SIGNAL(speedAchieved()), this, SLOT(openResultView())); - accelerometer->start(); - timer->start(); - // Show measure dialog. - //measure->show(); + this->accelerometerTimer->start(kAccelerometerSampleRate); + this->timer->start(); + this->time = 0; + this->speed = 0; ui->tabWidget->setCurrentWidget(this->ui->tabMeasureResult); } @@ -141,10 +235,19 @@ void CarMainWindow::setComboBoxStartTabUnits(QStringList units) /** *This function is used to init listViewStartTabAccelerationCategories. Start-tab view. + *@todo During development categories index values that are used for measuring are hardcoded + *@todo and accelerationCategoriesStartTab and catList are used instead of using + *@todo CategoryList::categoryList and CategoryList::cats. */ void CarMainWindow::initListViewStartTabAccelerationCategories() { - 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"; + //Connect the user`s choice fron GUI to a correct variable name + catList.insert(0,"acceleration-0-40"); + catList.insert(1,"acceleration-0-100"); + catList.insert(2,"acceleration-0-10"); + + accelerationCategoriesStartTab << "Acceleration 0-40 km/h" << "Acceleration 0-100 km/h" << "Acceleration 0-10 km/h"; + //<< "0-1/4 Mile" << "0-1/8 Mile" << "50-100 Mile" << "0-60 Mph" << "0-100 m" << "0-50 ft" << "0-50 yrd" << "0-500 in"; QAbstractItemModel *model = new StringListModel(accelerationCategoriesStartTab); ui->listViewStartTabAccelerationCategories->setModel(model); } @@ -159,84 +262,50 @@ void CarMainWindow::setListViewStartTabAccelerationCategories(QStringList accele ui->listViewStartTabAccelerationCategories->setModel(model); } -/** - *This function is used to set items to category combobox. Top-tab view. - *@param - */ -void CarMainWindow::setCategoryCompoBox() -{ - ui->comboBoxTopCategory->addItems(xmlreader->getTop10List()); -} - -/** - *This function is used to set items to labelTopList. Top-tab view. - *@param QString category - */ -void CarMainWindow::setListViewTopList(QString category) +void CarMainWindow::setLabelInfoToUser(QString infoText) { - QString topList; - - if (category == "acceleration-0-100") - { - topList.append(xmlreader->getTop10AccelerationList()); - } - - else if (category == "Speed") - { - topList.append(xmlreader->getTop10SpeedList()); - } - - else if (category == "G-force") - { - topList.append(xmlreader->getTop10GforceList()); - } - ui->labelTopList->setText(topList); + ui->labelInfoToUser->setText(infoText); } /** - *This slot function is called when speed is achieved in measure dialog. Opens result dialog. + *This function is used to set items to category combobox. Top-tab view. + *@param */ -void CarMainWindow::openResultView() +void CarMainWindow::setCategoryCompoBox() { - //result->saveMeasuresToArray(measure->measures); - // Show result dialog. - //result->show(); - QString timeInteger; - timeInteger.setNum(this->measures->getTime40kmh()); - //time = "0 - 40 km/h: "; - //time.append(timeInteger); - //ui->labelResult40kmh->setText(time); - ui->labelMeasureTabResult->show(); - ui->labelMeasureTabResult->setText(timeInteger); - //ui->tabWidget->setCurrentWidget(this->ui->tabMeasureResult); + qDebug() << "_setCategoryCompoBox"; + ui->comboBoxTopCategory->addItems(myHttpClient->myXmlreader->myCategoryList->getCategoryList()); } /** - *This slot function is called when the server has finished guery. + *This function prcesses UI updating after a new top10List has been received. + *@todo Check where limitNr is taken, fixed or user input, see on_comboBoxTopCategory_currentIndexChanged. */ -void CarMainWindow::networkResponse(QNetworkReply *reply) +void CarMainWindow::showTop10() { - + int limitNr = 5; + setListViewTopList(recentCategory, limitNr); } /** - *This slot function is called when the user will to send data to server. - *@todo Where is this callback connected? + *This function is used to set items to labelTopList. Top-tab view. + *@param Category + *@param Size, number of results. */ -void CarMainWindow::on_pushButton_clicked() +void CarMainWindow::setListViewTopList(QString category, int size) { - sendXml(); + qDebug() << "_setListViewTopList"; + QString topList; + topList.append(myHttpClient->myXmlreader->myCategoryList->getTopList(category, size)); + ui->labelTopList->setText(topList); } /** - *This slot function is called when login/logout button is clicked. + *This slot function is called when speed is achieved in measure dialog. Opens result dialog. */ -void CarMainWindow::on_loginLogoutButton_clicked() +void CarMainWindow::openResultView() { - //LoginWindow myLogin; - myLogin->show(); - //ui->loginLogoutButton->setText("logout"); } /** @@ -252,269 +321,527 @@ void CarMainWindow::on_registratePushButton_clicked() */ void CarMainWindow::on_buttonTopRefresh_clicked() { - setCategoryCompoBox(); + myHttpClient->requestCategories(); } /** *This slot function is called when ever category combobox current index changed. Top-tab view. - *@param QString category + *@param QString category. + *@todo Check where limitNr is taken, fixed or user input, see showTop10. */ void CarMainWindow::on_comboBoxTopCategory_currentIndexChanged(QString category) { - setListViewTopList(category); + qDebug() << "_on_comboBoxTopCategory_currentIndexChanged: " << category; + recentCategory = category; //for showTop10() + int limitNr = 5; + QString limit = QString::number(limitNr); + myHttpClient->requestTopList(category, limit); } /** - *This slot function is called when ever category combobox activated. Top-tab view. - *@param QString category + *This slot function is called when set/change user button is clicked. */ -void CarMainWindow::on_comboBoxTopCategory_activated(QString category) +void CarMainWindow::on_setUserPushButton_clicked() { - setListViewTopList(category); + myLogin->show(); } /** - *This slot function is called when set/change user button is clicked. + *@brief Just for development, for the real button is not shown until + *measurin started and there are results. + *@todo Implement with real code and yet leave sendXml in the bottom in use. */ -void CarMainWindow::on_setUserPushButton_clicked() +void CarMainWindow::on_manualStartButton_clicked() { - myLogin->show(); - ui->userNameLabel->setText( "User: " + myLogin->getUserName()); - ui->setUserPushButton->setText( "Change User"); } /** - *@brief Sends registration information to the server in xml format. - *Reads user name, password and emaol address from resuldialogs internal variables. - *@todo Replace msg box with better reaction to server`s responce. - *@todo Write error handling. + * This slot function is called when timer gives timeout signal. Checks current speed + * and stores times in measure class. */ -void CarMainWindow::registrate() +void CarMainWindow::after_timeout() { - qDebug() << "_registrate" ; - qDebug() << this->myRegistration->getUserName() << "+" << this->myRegistration->getPassword() << "+" << this->myRegistration->getEmail(); - - QBuffer *regbuffer = new QBuffer(); - - QNetworkReply *currentDownload; - - QUrl qurl("http//:api.speedfreak-app.com/register"); - QNetworkRequest request(qurl); - - //write also to a file during development, : - xmlwriter->writeXml(this->myRegistration->getUserName(), - this->myRegistration->getPassword(), - this->myRegistration->getEmail()); - xmlwriter->writeRegistering(regbuffer, - this->myRegistration->getUserName(), - this->myRegistration->getPassword(), - this->myRegistration->getEmail()); - //Tmp msgbox - later server responce - QMessageBox::about(this,"Registrate",this->myRegistration->getUserName() + this->myRegistration->getPassword() + this->myRegistration->getEmail()); - - currentDownload = manager->post(request, ("data=" + regbuffer->data())); + //IF GPS checkbox is ON + if (ui->gpsOnCheckBox->isChecked()) + { + if ( gpsSpeed > 1.0 ) + { + timeFromGps += 0.1; + } + } - //ackFromServer function gets called when HTTP request is completed - connect(currentDownload, SIGNAL(finished()),SLOT(ackOfRegistration())); + else + { + ui->labelMeasureTabSpeed->setText(QString::number(this->speed)); //Set speed. //Measure-tab view. + ui->labelMeasureTabTime->setText(QString::number(this->time)); //Set time. //Measure-tab view. + } } /** - *@brief Sends result(s) to the server in xml format with authentication information in the header. - *@todo Write error handling. + * This slot function is called when Abort button is clicked. */ -void CarMainWindow::sendXml() +void CarMainWindow::on_pushButtonMeasureTabAbort_clicked() { - qDebug() << "_sendXml"; - - QBuffer *xmlbuffer = new QBuffer(); - QNetworkReply *currentDownload; + ui->pushButtonSendResult->setEnabled(false); + ui->pushButtonShowResultDialog->setEnabled(false); + ui->labelMeasureTabResult->hide(); + ui->labelMeasureTabTime->setText(""); + ui->labelMeasureTabSpeed->setText(""); + measures->initializeMembers(); + this->accelerometerTimer->stop(); + this->timer->stop(); + this->time = 0; + this->speed = 0; + ui->tabWidget->setCurrentWidget(this->ui->StartTab); + //this->close(); - QString credentials = this->myRegistration->getUserName() + ":" + this->myRegistration->getPassword(); - credentials = "Basic " + credentials.toAscii().toBase64(); + //GPS + gpsSpeed = 0.0; + timeFromGps = 0.0; +} - QUrl qurl("http//:api.speedfreak-app.com/update/acceleration-0-40"); - QNetworkRequest request(qurl); +/** + *This slot function is called when pushButtonSendResult is clicked. + *@todo Use real category value. + */ +void CarMainWindow::on_pushButtonSendResult_clicked() +{ + //Pick up relevant category name and pass it to the server + myHttpClient->sendResultXml(catList.at(choiceInt)); + ui->pushButtonSendResult->setEnabled(false); +} - request.setRawHeader(QByteArray("Authorization"),credentials.toAscii()); +void CarMainWindow::updateUserName() +{ + QString newUserName; - xmlwriter->writeResult(xmlbuffer); + newUserName = myLogin->getUserName(); + ui->userNameLabel->setText( "User: " + newUserName); - currentDownload = manager->post(request, ("data=" + xmlbuffer->data())); - //QString data("abcdefg"); //testing - //currentDownload = manager->post(request,"data=" + QUrl::toPercentEncoding(data)); //testing + if (newUserName.length()) + { + ui->setUserPushButton->setText( "Change User"); + this->setWindowTitle("Speed Freak - " + newUserName); + } + else + { + ui->setUserPushButton->setText( "Set User"); + this->setWindowTitle("Speed Freak"); + } +} +void CarMainWindow::regUserToServer() +{ + myHttpClient->requestRegistration(); +} - //ackFromServer function gets called when HTTP request is completed - connect(currentDownload, SIGNAL(finished()),SLOT(ackOfResult())); +void CarMainWindow::on_drawRoutePushButton_clicked() +{ + QString routeFile = QString("route.txt"); + if (myRoute->readRouteFromFile( routeFile) == true) + { + myRoute->show(); + } } -/** - *@brief React to servers responce after result has been sent. - *@todo Implement function and write error handling. - */ -void CarMainWindow::ackOfResult() +void CarMainWindow::on_sendRoutePushButton_clicked() { - qDebug() << "Server acknowledged posting of result"; + myHttpClient->sendRouteXml(); } /** - *@brief React to servers responce after registration has been sent. - *@todo Implement function and write error handling. + * Opens result dialog when show result button is clicked. + * Sends measures as parameter to the resultdialogs saveMeasuresToArray-function. */ - -void CarMainWindow::ackOfRegistration() +void CarMainWindow::on_pushButtonShowResultDialog_clicked() { - qDebug() << "Server acknowledged registration"; + result->saveMeasuresToArray(measures); + this->result->show(); } +void CarMainWindow::userLogin() +{ + myHttpClient->checkLogin(); +} /** - *@brief Just for development, for the real button is not shown until - *measurin started and there are results. - *@todo Implement with real code and yet leave sendXml in the bottom in use. + * Resets Accelerometer measurement variables */ - -void CarMainWindow::on_manualStartButton_clicked() +void CarMainWindow::resetAccelerometerMeasurements() { - sendXml(); + currentAcceleration = 0; + currentAccelerationString = ""; + currentSpeed = ""; + currentTime = 0; + distanceTraveled = ""; + //firstAcceleration = 0; + //horsepower = null; + isNewRun = true; + //lastScreenUpdateInSeconds = 0; + previousTime = 0; + reverseAccelerationFlag = false; + stopWatch.start(); + //accelerometer->stop(); + totalTime = ""; + vehicleStartedMoving = false; + calculate->reset(); } /** - * This slot function is called when timer gives timeout signal. Checks current speed - * and stores times in measure class. + * This function is called to handle checkpoints + *@param totalTime total time elapsed since starting measurements + *@param currentSpeed current speed of the device */ -void CarMainWindow::after_timeout() +void CarMainWindow::handleCheckPoint(double totalTime, double currentSpeed) { - QString timeString, speedString; - //time++; - time = accelerometer->getTotalTime(); - speed = accelerometer->getCurrentSpeed(); - //speed = speed +10; - - if (floor(speed) == 10) + switch (counterForSaveResults) { - measures->setTime10kmh(time); + case 0: + measures->setTime10kmh(totalTime); + break; + + case 1: + measures->setTime20kmh(totalTime); + break; + + case 2: + measures->setTime30kmh(totalTime); + break; + + case 3: + measures->setTime40kmh(totalTime); + break; + + case 4: + measures->setTime50kmh(totalTime); + break; + + case 5: + measures->setTime60kmh(totalTime); + break; + + case 6: + measures->setTime70kmh(totalTime); + break; + + case 7: + measures->setTime80kmh(totalTime); + break; + + case 8: + measures->setTime90kmh(totalTime); + break; + + case 9: + measures->setTime100kmh(totalTime); + break; + + default: + break; } + counterForSaveResults++; - else if (floor(speed) == 20) + if (choiceInt == 0 && measures->getTime40kmh() != 0) { - measures->setTime20kmh(time); + setTimeAxisGapAndShowResult(measures->getTime40kmh()); + this->timer->stop(); + this->accelerometerTimer->stop(); + this->time = 0; + this->speed = 0; + counterForSaveResults = 0; } - - else if (floor(speed) == 30) + else if (choiceInt == 1 && measures->getTime100kmh() != 0) { - measures->setTime30kmh(time); + setTimeAxisGapAndShowResult(measures->getTime100kmh()); + this->timer->stop(); + this->accelerometerTimer->stop(); + this->time = 0; + this->speed = 0; + counterForSaveResults = 0; } - - else if (floor(speed) == 40) + else if (choiceInt == 2 && measures->getTime10kmh() != 0) { - measures->setTime40kmh(time); + setTimeAxisGapAndShowResult(measures->getTime10kmh()); + this->timer->stop(); + this->accelerometerTimer->stop(); + this->time = 0; + this->speed = 0; + counterForSaveResults = 0; } - - else if (floor(speed) == 50) + else if (choiceInt != 1 && choiceInt != 0 && measures->getTime80kmh() != 0) { - measures->setTime50kmh(time); + setTimeAxisGapAndShowResult(measures->getTime80kmh()); + this->timer->stop(); + this->accelerometerTimer->stop(); + this->time = 0; + this->speed = 0; + counterForSaveResults = 0; } - - else if (floor(speed) == 60) + else { - measures->setTime60kmh(time); + qDebug() << "something wrong in handleCheckPoint()"; } +} + +/** + *This function is called to read (and process) data from the accelerometer + */ +void CarMainWindow::readAccelerometerData() +{ + QString s; + double changeInAcceleration = 0; + qreal x, y, z; + + accelerometer->getAcceleration(x, y, z); + + // keep the following line as close to the SetKinematicsProperties method as possible + currentTime = stopWatch.elapsed(); + + //accelerometer->smoothData(x, y, z); + + //Calculate average + movingAverageZ->Enqueue(z); + z = movingAverageZ->Average(); + + // Apply calibration + x -= accelerometer->getCalibrationX(); + y -= accelerometer->getCalibrationY(); + z -= accelerometer->getCalibrationZ(); - else if (floor(speed) == 70) + QString str = QString("acc x: " + QString::number(x) + "\n" + + "acc y: " + QString::number(y) + "\n" + + "acc z: " + QString::number(z) + "\n"); + + currentAcceleration = z;//sqrt(x*x + y*y + z*z); + changeInAcceleration = currentAcceleration; + + if (((fabs(changeInAcceleration) <= accelerationStartThreshold) + && !vehicleStartedMoving)) { - measures->setTime70kmh(time); + return; } - - else if (floor(speed) == 80) + else if(!vehicleStartedMoving) { - measures->setTime80kmh(time); + vehicleStartedMoving = true; + stopWatch.start(); + previousTime = 0; + currentTime = 0; } - else if (floor(speed) == 90) + calculate->calculateParameters(changeInAcceleration, (currentTime - previousTime)/1000); + previousTime = currentTime; + + s.sprintf("%.2f", changeInAcceleration); + currentAccelerationString = s; + + speed = 0.0; + speed = calculate->getCurrentSpeed(); + speed = speed*3.6;//((speed*1000)/kSecondsInHour); + s.sprintf("%.1f", speed); + currentSpeed = s; + + s.sprintf("%.2f", calculate->getDistanceTraveled()); + distanceTraveled = s; + + // TODO + //distanceTraveled; + //horsepower; + + time = calculate->getTotalTime(); + + s.sprintf("%.2f", time); + totalTime = s; + + str.append("ca: " + currentAccelerationString + " G\n" ); + str.append("cspeed: " + currentSpeed + " km/h \n" ); + str.append("dist: " + distanceTraveled + " m \n" ); + str.append("time: " + totalTime + " s \n" ); + + if ((stopTime > 0) && (previousTime >= stopTime)) { - measures->setTime90kmh(time); + // we want to end at a stopping point that the user chose + // output results + resetAccelerometerMeasurements(); } +} + +/** + *This function is used to calibrate accelerometer + */ +void CarMainWindow::calibrateAccelerometer() +{ + resetAccelerometerMeasurements(); + accelerometer->calibrate(); +} - else if (floor(speed) == 100) +/** + *This slot function is called when GPS on checkbox state changed. Route-tab view. + *@param int GPSState + */ +void CarMainWindow::on_gpsOnCheckBox_stateChanged(int GPSState) +{ + //Stop polling GPS. Route-tab view. + if (GPSState == 0) { - measures->setTime100kmh(time); + ui->labelRouteTabGPSStatus->setText("GPS status: GPS off"); + location->stopPollingGPS(); + gpsUpdateTime = 0; + gpsTimer->stop(); } - + //Start polling GPS. Route-tab view. else { - + ui->labelRouteTabGPSStatus->setText("GPS status: GPS on"); + location->startPollingGPS(); } +} - // If speed is over 40 km/h emits speedAchieved() signal and close this dialog. - if (speed >= 40.0) +/** + *This slot function is called when GPS status changed. Route- and measure-tab view. + */ +void CarMainWindow::gpsStatus() +{ + //IF GPS checkbox is ON + if (ui->gpsOnCheckBox->isChecked()) { - timer->stop(); - accelerometer->stop(); - time = 0; - speed = 0; - //emit this->speedAchieved(); - this->openResultView(); - //this->close(); - + //If GPS find 4 satellite. + if (location->getSatellitesInUse() >= 4) + { + //Set gps status. Route-tab view. + ui->labelRouteTabGPSStatus->setText("GPS ready"); + + //Set time. Route-tab view. + gpsTime->setTime_t(location->getTime()); + QString gpsDateNow = gpsTime->toString("dd.MM.yyyy hh:mm:ss"); + ui->labelRouteTabGPSTime->setText("GPS time: " + gpsDateNow); + + //Set latitude & longitude. Route-tab view. + ui->labelRouteTabLatitude->setText("Latitude: " + QString::number(location->getLatitude())); + ui->labelRouteTabLongitude->setText("Longitude: " + QString::number(location->getLongitude())); + + //Set rec status. Route-tab view. + if (ui->startRecPushButton->text() == "Stop recording") + { + ui->labelRouteTabRecStatus->setText("Recorded " + QString::number(gpsData->roundCounter) + " point"); + } + + //Get speed. Route- and Measure-tab view. + gpsSpeed = location->getSpeed(); + + //Set speed. Route-tab view. + ui->labelRouteTabSpeed->setText("Speed:" + QString::number(gpsSpeed) + "km/h +/-" + QString::number(location->getEps()) + "km/h"); + + //Measure-tab view. + if (gpsSpeed < 40.0) + { + ui->labelMeasureTabSpeed->setText(QString::number(gpsSpeed)); //Set speed. //Measure-tab view. + ui->labelMeasureTabTime->setText(QString::number(timeFromGps)); //Set time. //Measure-tab view. + } + //Measure-tab view. + else + { + timer->stop(); //Measure timer + ui->labelMeasureTabResult->setText(QString::number(timeFromGps)); + ui->labelMeasureTabResult->show(); + ui->pushButtonShowResultDialog->setEnabled(true); + ui->pushButtonShowResultDialog->setEnabled(true); + } + } + + //If GPS find less than 4 satellite. + else + { + ui->labelRouteTabGPSStatus->setText("GPS status: Waiting for GPS"); + gpsTimer->stop(); + } + + gpsUpdateTime = 0; + gpsTimer->start(10); } +} - // Updates speed and time. - else - { - timeString.setNum(time); - speedString.setNum(speed); - ui->labelMeasureTabTime->setText(timeString); - ui->labelMeasureTabSpeed->setText(speedString); +/** + *This slot function is called when gps timer timeout(10ms). + */ +void CarMainWindow::gpsTimerTimeout() +{ + int time1000ms = 0; + time1000ms += 10; - timer->start(); + //IF time is 1 second + if (time1000ms == 1000) + { + //Calculate acceleration 1/s + gpsSpeedPrevious = gpsSpeedNow; //Previous speed + gpsSpeedNow = (location->getSpeed())/3.6; //Speed now (m/s) + gpsAcceleration = (gpsSpeedNow - gpsSpeedPrevious)/1; //Calculate acceleration: speed now - previous speed / 1s. + //Set acceleration. Route-tab view. + ui->labelRouteTabAcceleration->setText("Acceleration: " + QString::number( gpsAcceleration ) + " m/s2"); } + gpsUpdateTime++; + //Set GPS update time. Route-tab view. + ui->labelRouteTabGPSUpdateTime->setText("GPS update time: " + QString::number(gpsUpdateTime) + " ms"); } /** - * Initializes measures class's member variables. + *This slot function is called when start rec push button clicked. Route-tab view. */ -void CarMainWindow::initializeMeasures() +void CarMainWindow::on_startRecPushButton_clicked() { - measures->setTime10kmh(0); - measures->setTime20kmh(0); - measures->setTime30kmh(0); - measures->setTime40kmh(0); - measures->setTime50kmh(0); - measures->setTime60kmh(0); - measures->setTime70kmh(0); - measures->setTime80kmh(0); - measures->setTime90kmh(0); - measures->setTime100kmh(0); + //Start route recording. + if (ui->startRecPushButton->text() == "Start recording") + { + ui->startRecPushButton->setText("Stop recording"); + ui->labelRouteTabRecStatus->setText("Recording started"); + gpsData->startRouteRecording(ui->labelRouteTabGPSTime->text()); + } + + //Stop route recording. + else if (ui->startRecPushButton->text() == "Stop recording") + { + ui->startRecPushButton->setText("Start recording"); + ui->labelRouteTabRecStatus->setText("Recording stopped"); + gpsData->stopRouteRecording(ui->labelRouteTabGPSTime->text()); + } } /** - * This slot function is called when Abort button is clicked. + *Sets time axis right way in result dialog and shows target speed result. + *@param double pTime is the target speed result time which is shown to the user. */ -void CarMainWindow::on_pushButtonMeasureTabAbort_clicked() +void CarMainWindow::setTimeAxisGapAndShowResult(double pTime) { - measures->setTime10kmh(0); - measures->setTime20kmh(0); - measures->setTime30kmh(0); - measures->setTime40kmh(0); - measures->setTime50kmh(0); - measures->setTime60kmh(0); - measures->setTime70kmh(0); - measures->setTime80kmh(0); - measures->setTime90kmh(0); - measures->setTime100kmh(0); - timer->stop(); - accelerometer->stop(); - time = 0; - speed = 0; - ui->tabWidget->setCurrentWidget(this->ui->StartTab); - //this->close(); + ui->pushButtonShowResultDialog->setEnabled(true); + ui->pushButtonSendResult->setEnabled(true); + QString timeInteger; + timeInteger.setNum(pTime); + ui->labelMeasureTabResult->show(); + ui->labelMeasureTabResult->setText(timeInteger); + + if (floor(pTime) <= 5) + { + result->setDiagramGapHorizontal(80); + } + + else if (floor(pTime) <= 10) + { + result->setDiagramGapHorizontal(40); + } + + else + { + result->setDiagramGapHorizontal(20); + } } -void CarMainWindow::on_pushButtonSendResult_clicked() +void CarMainWindow::on_calibrateButton_clicked() { - emit sendresult(); + ui->autoStartButton->setEnabled(true); + ui->manualStartButton->setEnabled(true); + + this->accelerometer->calibrate(); } +