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