2 * Calculate class to process accelerometer data
4 * @author Kai Rasilainen
5 * @author Jukka Kurttila <jukka.kurttila@fudeco.com>
6 * @copyright (c) 2010 Speed Freak team
7 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
10 #include "calculate.h"
18 const double G_ACCELERATION = 9.80665;
19 const double SECONDS_IN_HOUR = 3600;
20 const double AIR_DENSITY = 1.225;
21 const double WATTS_PER_HORSEPOWER = 745.69987158227025;
23 const double carFrontalArea = 1.5;
24 const double dragCoefficient = 0.31;
25 const int carWeight = 850;
27 Calculate::Calculate()
32 Calculate::~Calculate()
37 void Calculate::reset()
53 if(speedCheckPoints.count() == 0)
55 speedCheckPoints.append(10);
56 speedCheckPoints.append(20);
57 speedCheckPoints.append(30);
58 speedCheckPoints.append(40);
59 speedCheckPoints.append(50);
60 speedCheckPoints.append(60);
61 speedCheckPoints.append(70);
62 speedCheckPoints.append(80);
63 speedCheckPoints.append(90);
64 speedCheckPoints.append(100);
67 checkPointCounter = 0;
68 checkPoint = speedCheckPoints[checkPointCounter];
74 * This is a main function for calculating various parameters. Accelerometer
75 * provides currentAcceleration and calling function measures time (seconds).
76 * This function should be called 20-30 times/second to minimize
81 void Calculate::calculateParameters(double currentAcceleration, double seconds)
83 double force, power1, power2;
85 currentAcceleration *= G_ACCELERATION;
87 totalTime = (totalTime + seconds);
90 // v(n) = v(n-1)+(a(n) + a(n-1))*(seconds)/2
92 // First integration of acceleration provides speed
93 currentSpeed = (lastSpeed + (((currentAcceleration + lastAcceleration) * seconds) / 2));
95 // Update maximum speed
96 if (currentSpeed > maxSpeed)
97 maxSpeed = currentSpeed;
99 // Second integration: distance.
100 distanceTraveled = (lastDistance + (((currentSpeed + lastSpeed) * seconds) / 2));
103 averageSpeed = (distanceTraveled / totalTime);
106 force = (carWeight * currentAcceleration);
108 power1 = (force * currentSpeed);
110 power2 = ((AIR_DENSITY * (pow(currentSpeed, 3)
111 * (carFrontalArea * dragCoefficient))) / 2);
113 currentPower = ((power1 + power2) / WATTS_PER_HORSEPOWER);
116 if ((currentPower > peakPower))
118 peakPower = currentPower;
121 if ((currentPower > 0))
123 averagePower = (averagePower + currentPower);
130 if( (checkPoint > 0) && (currentSpeed*3.6 > checkPoint) )
133 if( checkPointCounter <= speedCheckPoints.count() )
136 valuesMap.insert( checkPoint, totalTime );
137 if( checkPointCounter < speedCheckPoints.count() )
139 checkPoint = speedCheckPoints[checkPointCounter];
149 // Check for movement
150 //accelStoppedCheck(currentAcceleration);
152 lastSpeed = currentSpeed;
153 lastAcceleration = currentAcceleration;
154 lastDistance = distanceTraveled;
158 * This function checks if acceleration has stopped for
159 * a short period of time. Velocity is set to zero to avoid
162 void Calculate::accelStoppedCheck(double currentAcceleration)
164 // counting number of acceleration samples that equals zero
165 if (currentAcceleration==0) {
171 // if count exceeds 25, we assume that velocity is zero
178 // Getters and setters
180 double Calculate::getAverageSpeed()
185 void Calculate::setAverageSpeed(double value)
187 averageSpeed = value;
190 double Calculate::getCurrentSpeed()
195 void Calculate::setCurrentSpeed(double value)
197 currentSpeed = value;
200 double Calculate::getDistanceTraveled()
202 return distanceTraveled;
205 void Calculate::setDistanceTraveled(double value)
207 distanceTraveled = value;
210 double Calculate::getLastAcceleration()
212 return lastAcceleration;
215 void Calculate::setLastAcceleration(double value)
217 lastAcceleration = value;
220 double Calculate::getLastDistance()
225 void Calculate::setLastDistance(double value)
227 lastDistance = value;
230 double Calculate::getLastSpeed()
235 void Calculate::setLastSpeed(double value)
240 long Calculate::getNumOfIterations()
242 return numOfIterations;
245 void Calculate::setNumOfIterations(long value)
247 numOfIterations = value;
250 double Calculate::getTotalTime()
255 void Calculate::setTotalTime(double value)
260 double Calculate::getCurrentPower()
265 void Calculate::setCurrentPower(double value)
267 currentPower = value;
270 double Calculate::getPeakPower()
275 void Calculate::setPeakPower(double value)
280 double Calculate::getAveragePower()
282 if (numOfIterations > 0)
284 return (averagePower/numOfIterations);
292 void Calculate::setAveragePower(double value)
294 averagePower = value;
297 double Calculate::getMaxSpeed()
302 void Calculate::setMaxSpeed(double value)
307 QMap<int,double> Calculate::getValuesMap()