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