Added measures.h and measures.cpp files. Changed resultdialog.h, .cpp and measuredial...
[speedfreak] / Client / calculate.cpp
1 #include "calculate.h"
2 #include <math.h>
3
4 #include <QFile>
5 #include <QString>
6 #include <QTimer>
7 #include <QRegExp>
8
9 const double G_ACCELERATION = 9.80665;
10 const double SECONDS_IN_HOUR = 3600;
11
12 Calculate::Calculate()
13 {
14     this->reset();
15 }
16
17 Calculate::~Calculate()
18 {
19
20 }
21
22 void Calculate::reset()
23 {
24     averageSpeed = 0;
25     currentSpeed = 0;
26     distanceTraveled = 0;
27     lastAcceleration = 0;
28     lastDistance = 0;
29     lastSpeed = 0;
30     numOfIterations = 0;
31     totalTime = 0;
32     count = 0;
33 }
34
35 // Getters and setters
36
37 double Calculate::getAverageSpeed()
38 {
39     return averageSpeed;
40 }
41
42 void Calculate::setAverageSpeed(double value)
43 {
44     averageSpeed = value;
45 }
46
47 double Calculate::getCurrentSpeed()
48 {
49     return currentSpeed;
50 }
51
52 void Calculate::setCurrentSpeed(double value)
53 {
54     currentSpeed = value;
55 }
56
57 double Calculate::getDistanceTraveled()
58 {
59     return distanceTraveled;
60 }
61
62 void Calculate::setDistanceTraveled(double value)
63 {
64     distanceTraveled = value;
65 }
66
67 double Calculate::getLastAcceleration()
68 {
69     return lastAcceleration;
70 }
71
72 void Calculate::setLastAcceleration(double value)
73 {
74     lastAcceleration = value;
75 }
76
77 double Calculate::getLastDistance()
78 {
79     return lastDistance;
80 }
81
82 void Calculate::setLastDistance(double value)
83 {
84     lastDistance = value;
85 }
86
87 double Calculate::getLastSpeed()
88 {
89     return lastSpeed;
90 }
91
92 void Calculate::setLastSpeed(double value)
93 {
94     lastSpeed = value;
95 }
96
97 long Calculate::getNumOfIterations()
98 {
99     return numOfIterations;
100 }
101
102 void Calculate::setNumOfIterations(long value)
103 {
104     numOfIterations = value;
105 }
106
107 double Calculate::getTotalTime()
108 {
109     return totalTime;
110 }
111
112 void Calculate::setTotalTime(double value)
113 {
114     totalTime = value;
115 }
116
117 /**
118   * This is a main function for calculating various parameters. Accelerometer
119   * provides currentAcceleration and calling function measures time (seconds).
120   * This function should be called 20-30 times/second to minimize
121   * calculation error.
122
123   * To be added: params like horsepower.
124   */
125 void Calculate::calculateParameters(double currentAcceleration, double seconds)
126 {
127     numOfIterations++;
128     totalTime = (totalTime + seconds);
129
130     // v=v0 + a*t
131     // v(n) = v(n-1)+(a(n) + a(n-1))*(seconds)/2
132
133     // First integration of acceleration provides speed
134     currentSpeed = (lastSpeed + (((currentAcceleration + lastAcceleration) * seconds) / 2));
135
136     // Second integration: distance.
137     distanceTraveled = (lastDistance + (((currentSpeed + lastSpeed) * seconds) / 2));
138
139     // Average speed
140     averageSpeed = (distanceTraveled / totalTime);
141
142     // Check for movement
143     accelStoppedCheck(currentAcceleration);
144
145     lastSpeed = currentSpeed;
146     lastAcceleration = currentAcceleration;
147     lastDistance = distanceTraveled;
148 }
149
150 /**
151   * This function checks if acceleration has stopped for
152   * a short period of time. Velocity is set to zero to avoid
153   * distance errors.
154   */
155 void Calculate::accelStoppedCheck(double currentAcceleration)
156 {
157
158     // counting number of acceleration samples that equals zero
159     if (currentAcceleration==0) {
160         count++;
161     } else {
162         count = 0;
163     }
164
165     // if count exceeds 25, we assume that velocity is zero
166     if (count >= 25)
167     {
168         currentSpeed=0;
169     }
170 }
171
172