Fixed bugs 5711 and 5832. Now graph's line wont draw out of the diagram and messagebo...
[speedfreak] / Client / accrealtimedialog.cpp
1 /*
2  * Acceleration info in real time dialog
3  *
4  * @author      Jukka Kurttila <jukka.kurttila@fudeco.com>
5  * @author      Toni Jussila    <toni.jussila@fudeco.com>
6  * @copyright   (c) 2010 Speed Freak team
7  * @license     http://opensource.org/licenses/gpl-license.php GNU Public License
8  */
9
10 #include "accrealtimedialog.h"
11 #include "ui_accrealtimedialog.h"
12 #include <math.h>
13
14 AccRealTimeDialog::AccRealTimeDialog(QWidget *parent) :
15     QDialog(parent),
16     ui(new Ui::AccRealTimeDialog)
17 {
18     ui->setupUi(this);
19
20     accelerometer = new Accelerometer();
21     movingAverageZ = new MovingAverage(10);
22     movingAverageY = new MovingAverage(10);
23     calculate = new Calculate();
24     accelerationStartThreshold = 0.1;
25
26     accelerometerTimer = new QTimer(this);
27     connect(accelerometerTimer, SIGNAL(timeout()), this, SLOT(readAccelerometerData()));
28     isNewRun = true;
29     updateScreenCounter = 0;
30     resetAccelerometerMeasurements();
31
32     resultDialog = NULL;
33 }
34
35 AccRealTimeDialog::~AccRealTimeDialog()
36 {
37     delete ui;
38     delete accelerometer;
39     delete accelerometerTimer;
40     delete calculate;
41     delete movingAverageZ;
42     delete movingAverageY;
43     if(resultDialog)
44         delete resultDialog;
45 }
46
47 void AccRealTimeDialog::changeEvent(QEvent *e)
48 {
49     QDialog::changeEvent(e);
50     switch (e->type()) {
51     case QEvent::LanguageChange:
52         ui->retranslateUi(this);
53         break;
54     default:
55         break;
56     }
57 }
58 /**
59   *This function is called to read (and process) data from the accelerometer
60   */
61 void AccRealTimeDialog::readAccelerometerData()
62 {
63     QString s;
64     double changeInAcceleration = 0;
65     qreal x, y, z;
66
67     accelerometer->getAcceleration(x, y, z);
68
69     //  keep the following line as close to the SetKinematicsProperties method as possible
70     currentTime = elapsedTime.elapsed();
71
72     //accelerometer->smoothData(x, y, z);
73
74     //Calculate average for Z
75     movingAverageZ->Enqueue(z);
76     z = movingAverageZ->Average();
77     //Calculate average for Y
78     movingAverageY->Enqueue(y);
79     y = movingAverageY->Average();
80
81     // Apply calibration
82     x -= accelerometer->getCalibrationX();
83     y -= accelerometer->getCalibrationY();
84     z -= accelerometer->getCalibrationZ();
85
86     qreal calY = accelerometer->getCalibrationY();
87     qreal calZ = accelerometer->getCalibrationZ();
88
89     if(calY < 0)
90         calY = -calY;
91     if(calZ < 0)
92         calZ = -calZ;
93
94     //Take acceleration from more affecting axel
95     if(calZ < calY)
96     {
97         z = z*(1+calZ/2);
98         currentAcceleration = z;
99     }
100     else
101     {
102         y = y*(1+calY/2);
103         currentAcceleration = -y;
104     }
105
106     //screen up: y = 0, z = -1
107     //screen front: y = -1, z = 0
108
109 //    QString str = QString("acc x: " + QString::number(x) + "\n" +
110 //                          "acc y: " + QString::number(y) + "\n" +
111 //                          "acc z: " + QString::number(z) + "\n");
112
113     //currentAcceleration = z;//sqrt(x*x + y*y + z*z);
114     //qDebug("y: %f, calibZ: %f, calibY: %f\n",y,accelerometer->getCalibrationZ(),accelerometer->getCalibrationY());
115     changeInAcceleration = currentAcceleration;
116
117     if (((fabs(changeInAcceleration) <= accelerationStartThreshold)
118                 && !vehicleStartedMoving))
119     {
120         return;
121     }
122     else if(!vehicleStartedMoving)
123     {
124         vehicleStartedMoving = true;
125         elapsedTime.start();
126         previousTime = 0;
127         currentTime = 0;
128     }
129
130     calculate->calculateParameters(changeInAcceleration, (currentTime - previousTime)/1000);
131     previousTime = currentTime;
132
133     //s.sprintf("%.2f", changeInAcceleration);
134     //currentAccelerationString = s;
135
136     speed = 0;
137     speed = calculate->getCurrentSpeed();
138     //Convert to km/h
139     speed = speed*3.6;
140     s.sprintf("%.1f", speed);
141     currentSpeed = s;
142
143     //s.sprintf("%.2f", calculate->getDistanceTraveled());
144     //distanceTraveled = s;
145
146     // TODO
147     //distanceTraveled;
148     //horsepower;
149
150     time = calculate->getTotalTime();
151
152     s.sprintf("%.2f", time);
153     totalTime = s;
154
155     //str.append("ca: " + currentAccelerationString + " G\n" );
156     //str.append("cspeed: " + currentSpeed + " km/h \n" );
157     //str.append("dist: " + distanceTraveled + " m \n" );
158     //str.append("time: " + totalTime + " s \n" );
159
160     if( updateScreenCounter == 5 )
161     {
162         ui->realSpeedLabel->setText( currentSpeed );
163         ui->timeLabel->setText( totalTime );
164         updateScreenCounter = 0;
165     }
166     updateScreenCounter++;
167
168     //Open result dialog if target speed reached
169     if( (stopMeasureSpeed > 0) && (speed > stopMeasureSpeed) )
170     {
171         this->accelerometerTimer->stop();
172         if(!resultDialog)
173         {
174             resultDialog = new ResultDialog(this);
175             connect(resultDialog, SIGNAL(rejected()), this, SLOT(killResultDialog()));
176             connect(resultDialog, SIGNAL(sendresult(double)), this, SLOT(sendResult(double)));
177         }
178         if(resultDialog)
179         {
180             resultDialog->setEnd(stopMeasureSpeed);
181             //Put all times from all speeds
182             QMap<int,double> tempMap = calculate->getValuesMap();
183
184             for( int i = 1 ; i <= tempMap.count() ; i++ )
185             {
186                 resultDialog->setValue(i*10,tempMap[i*10]);
187             }
188             calculate->reset();
189             resultDialog->show();
190             this->hide();
191         }
192     }
193 }
194
195 /**
196   * Resets Accelerometer measurement variables
197   */
198 void AccRealTimeDialog::resetAccelerometerMeasurements()
199 {
200     speed = 0;
201     currentAcceleration = 0;
202     currentSpeed = "";
203     currentTime = 0;
204     isNewRun = true;
205     previousTime = 0;
206     elapsedTime.start();
207     totalTime = "";
208     calculate->reset();
209     vehicleStartedMoving = false;
210     stopMeasureSpeed = 0;
211 }
212
213 void AccRealTimeDialog::Calibrate()
214 {
215     accelerometer->calibrate();
216 }
217
218 void AccRealTimeDialog::on_buttonAbort_clicked()
219 {
220     accelerometerTimer->stop();
221     resetAccelerometerMeasurements();
222     this->close();
223 }
224
225 void AccRealTimeDialog::startAccelerationMeasure()
226 {
227     double temp = stopMeasureSpeed;
228     resetAccelerometerMeasurements();
229     stopMeasureSpeed = temp;
230     accelerometerTimer->start(40);
231 }
232
233 void AccRealTimeDialog::SetStopMeasureSpeed(double speed)
234 {
235     stopMeasureSpeed = speed;
236 }
237
238 /**
239   *This slot function emit accelerationstart sendresult.
240   *
241   **/
242 void AccRealTimeDialog::sendResult(double result)
243 {
244     emit sendresult(result);
245 }
246
247 /**
248   *This slot function kills resultDialog.
249   *
250   **/
251 void AccRealTimeDialog::killResultDialog()
252 {
253     if(resultDialog)
254     {
255         delete resultDialog;
256         resultDialog = NULL;
257     }
258 }