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