Bugfix: accelerate send result.
[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         connect(resultDialog, SIGNAL(sendresult(double)), this, SLOT(sendResult(double)));
147         resultDialog->setEnd(stopMeasureSpeed);
148
149         //Put all times from all speeds
150         QMap<int,double> tempMap = calculate->getValuesMap();
151
152         for( int i = 1 ; i <= tempMap.count() ; i++ )
153         {
154             resultDialog->setValue(i*10,tempMap[i*10]);
155         }
156         resultDialog->show();
157         this->hide();
158     }
159 }
160
161 /**
162   * Resets Accelerometer measurement variables
163   */
164 void AccRealTimeDialog::resetAccelerometerMeasurements()
165 {
166     speed = 0;
167     currentAcceleration = 0;
168     currentSpeed = "";
169     currentTime = 0;
170     isNewRun = true;
171     previousTime = 0;
172     elapsedTime.start();
173     totalTime = "";
174     calculate->reset();
175     vehicleStartedMoving = false;
176     stopMeasureSpeed = 0;
177 }
178
179 void AccRealTimeDialog::Calibrate()
180 {
181     accelerometer->calibrate();
182 }
183
184 void AccRealTimeDialog::on_buttonAbort_clicked()
185 {
186     accelerometerTimer->stop();
187     resetAccelerometerMeasurements();
188     this->close();
189 }
190
191 void AccRealTimeDialog::startAccelerationMeasure()
192 {
193     double temp = stopMeasureSpeed;
194     resetAccelerometerMeasurements();
195     stopMeasureSpeed = temp;
196     accelerometerTimer->start(40);
197 }
198
199 void AccRealTimeDialog::SetStopMeasureSpeed(double speed)
200 {
201     stopMeasureSpeed = speed;
202 }
203
204 /**
205   *This slot function emit accelerationstart sendresult.
206   *
207   **/
208 void AccRealTimeDialog::sendResult(double result)
209 {
210     emit sendresult(result);
211 }