Merge branch 'feature/popups'
[speedfreak] / Client / accrealtimedialog.cpp
1 /*
2  * Acceleration info in real time dialog
3  *
4  * @author      Jukka Kurttila <jukka.kurttila@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 "accrealtimedialog.h"
10 #include "ui_accrealtimedialog.h"
11 #include <math.h>
12
13 AccRealTimeDialog::AccRealTimeDialog(QWidget *parent) :
14     QDialog(parent),
15     ui(new Ui::AccRealTimeDialog)
16 {
17     ui->setupUi(this);
18
19     accelerometer = new Accelerometer();
20     movingAverageZ = new MovingAverage(10);
21     calculate = new Calculate();
22     accelerationStartThreshold = 0.1;
23
24     accelerometerTimer = new QTimer(this);
25     connect(accelerometerTimer, SIGNAL(timeout()), this, SLOT(readAccelerometerData()));
26     isNewRun = true;
27     updateScreenCounter = 0;
28     resetAccelerometerMeasurements();
29
30     resultDialog = NULL;
31 }
32
33 AccRealTimeDialog::~AccRealTimeDialog()
34 {
35     delete ui;
36     delete accelerometer;
37     delete accelerometerTimer;
38     delete calculate;
39     delete movingAverageZ;
40     if(resultDialog)
41         delete resultDialog;
42 }
43
44 void AccRealTimeDialog::changeEvent(QEvent *e)
45 {
46     QDialog::changeEvent(e);
47     switch (e->type()) {
48     case QEvent::LanguageChange:
49         ui->retranslateUi(this);
50         break;
51     default:
52         break;
53     }
54 }
55 /**
56   *This function is called to read (and process) data from the accelerometer
57   */
58 void AccRealTimeDialog::readAccelerometerData()
59 {
60     QString s;
61     double changeInAcceleration = 0;
62     qreal x, y, z;
63
64     accelerometer->getAcceleration(x, y, z);
65
66     //  keep the following line as close to the SetKinematicsProperties method as possible
67     currentTime = elapsedTime.elapsed();
68
69     //accelerometer->smoothData(x, y, z);
70
71     //Calculate average
72     movingAverageZ->Enqueue(z);
73     z = movingAverageZ->Average();
74
75     // Apply calibration
76     x -= accelerometer->getCalibrationX();
77     y -= accelerometer->getCalibrationY();
78     z -= accelerometer->getCalibrationZ();
79
80 //    QString str = QString("acc x: " + QString::number(x) + "\n" +
81 //                          "acc y: " + QString::number(y) + "\n" +
82 //                          "acc z: " + QString::number(z) + "\n");
83
84     currentAcceleration = z;//sqrt(x*x + y*y + z*z);
85     changeInAcceleration = currentAcceleration;
86
87     if (((fabs(changeInAcceleration) <= accelerationStartThreshold)
88                 && !vehicleStartedMoving))
89     {
90         return;
91     }
92     else if(!vehicleStartedMoving)
93     {
94         vehicleStartedMoving = true;
95         elapsedTime.start();
96         previousTime = 0;
97         currentTime = 0;
98     }
99
100     calculate->calculateParameters(changeInAcceleration, (currentTime - previousTime)/1000);
101     previousTime = currentTime;
102
103     //s.sprintf("%.2f", changeInAcceleration);
104     //currentAccelerationString = s;
105
106     speed = 0;
107     speed = calculate->getCurrentSpeed();
108     //Convert to km/h
109     speed = speed*3.6;
110     s.sprintf("%.1f", speed);
111     currentSpeed = s;
112
113     //s.sprintf("%.2f", calculate->getDistanceTraveled());
114     //distanceTraveled = s;
115
116     // TODO
117     //distanceTraveled;
118     //horsepower;
119
120     time = calculate->getTotalTime();
121
122     s.sprintf("%.2f", time);
123     totalTime = s;
124
125     //str.append("ca: " + currentAccelerationString + " G\n" );
126     //str.append("cspeed: " + currentSpeed + " km/h \n" );
127     //str.append("dist: " + distanceTraveled + " m \n" );
128     //str.append("time: " + totalTime + " s \n" );
129
130     if( updateScreenCounter == 5 )
131     {
132         ui->realSpeedLabel->setText( currentSpeed );
133         ui->timeLabel->setText( totalTime );
134         updateScreenCounter = 0;
135     }
136     updateScreenCounter++;
137
138     //Open result dialog if target speed reached
139     if( (stopMeasureSpeed > 0) && (speed > stopMeasureSpeed) )
140     {
141         this->accelerometerTimer->stop();
142         if(!resultDialog)
143         {
144             resultDialog = new ResultDialog(this);
145         }
146         resultDialog->setEnd(stopMeasureSpeed);
147
148         //Put all times from all speeds
149         QMap<int,double> tempMap = calculate->getValuesMap();
150
151         for( int i = 1 ; i <= tempMap.count() ; i++ )
152         {
153             resultDialog->setValue(i*10,tempMap[i*10]);
154         }
155         resultDialog->show();
156         this->hide();
157     }
158 }
159
160 /**
161   * Resets Accelerometer measurement variables
162   */
163 void AccRealTimeDialog::resetAccelerometerMeasurements()
164 {
165     speed = 0;
166     currentAcceleration = 0;
167     currentSpeed = "";
168     currentTime = 0;
169     isNewRun = true;
170     previousTime = 0;
171     elapsedTime.start();
172     totalTime = "";
173     calculate->reset();
174     vehicleStartedMoving = false;
175     stopMeasureSpeed = 0;
176 }
177 void AccRealTimeDialog::Calibrate()
178 {
179     accelerometer->calibrate();
180 }
181
182 void AccRealTimeDialog::on_buttonAbort_clicked()
183 {
184     accelerometerTimer->stop();
185     resetAccelerometerMeasurements();
186     this->close();
187 }
188 void AccRealTimeDialog::startAccelerationMeasure()
189 {
190     double temp = stopMeasureSpeed;
191     resetAccelerometerMeasurements();
192     stopMeasureSpeed = temp;
193     accelerometerTimer->start(40);
194 }
195 void AccRealTimeDialog::SetStopMeasureSpeed(double speed)
196 {
197     stopMeasureSpeed = speed;
198 }