Added custom button for users dialog and changed place of www-button. Www-button...
[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             resultDialog->show();
189             this->hide();
190         }
191     }
192 }
193
194 /**
195   * Resets Accelerometer measurement variables
196   */
197 void AccRealTimeDialog::resetAccelerometerMeasurements()
198 {
199     speed = 0;
200     currentAcceleration = 0;
201     currentSpeed = "";
202     currentTime = 0;
203     isNewRun = true;
204     previousTime = 0;
205     elapsedTime.start();
206     totalTime = "";
207     calculate->reset();
208     vehicleStartedMoving = false;
209     stopMeasureSpeed = 0;
210 }
211
212 void AccRealTimeDialog::Calibrate()
213 {
214     accelerometer->calibrate();
215 }
216
217 void AccRealTimeDialog::on_buttonAbort_clicked()
218 {
219     accelerometerTimer->stop();
220     resetAccelerometerMeasurements();
221     this->close();
222 }
223
224 void AccRealTimeDialog::startAccelerationMeasure()
225 {
226     double temp = stopMeasureSpeed;
227     resetAccelerometerMeasurements();
228     stopMeasureSpeed = temp;
229     accelerometerTimer->start(40);
230 }
231
232 void AccRealTimeDialog::SetStopMeasureSpeed(double speed)
233 {
234     stopMeasureSpeed = speed;
235 }
236
237 /**
238   *This slot function emit accelerationstart sendresult.
239   *
240   **/
241 void AccRealTimeDialog::sendResult(double result)
242 {
243     emit sendresult(result);
244 }
245
246 /**
247   *This slot function kills resultDialog.
248   *
249   **/
250 void AccRealTimeDialog::killResultDialog()
251 {
252     if(resultDialog)
253     {
254         delete resultDialog;
255         resultDialog = NULL;
256     }
257 }