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];
75 * This is a main function for calculating various parameters. Accelerometer
76 * provides currentAcceleration and calling function measures time (seconds).
77 * This function should be called 20-30 times/second to minimize
82 void Calculate::calculateParameters(double currentAcceleration, double seconds)
84 double force, power1, power2;
86 currentAcceleration *= G_ACCELERATION;
88 totalTime = (totalTime + seconds);
91 // v(n) = v(n-1)+(a(n) + a(n-1))*(seconds)/2
93 // First integration of acceleration provides speed
94 currentSpeed = (lastSpeed + (((currentAcceleration + lastAcceleration) * seconds) / 2));
96 // Update maximum speed
97 if (currentSpeed > maxSpeed)
98 maxSpeed = currentSpeed;
100 // Second integration: distance.
101 distanceTraveled = (lastDistance + (((currentSpeed + lastSpeed) * seconds) / 2));
104 averageSpeed = (distanceTraveled / totalTime);
107 force = (carWeight * currentAcceleration);
109 power1 = (force * currentSpeed);
111 power2 = ((AIR_DENSITY * (pow(currentSpeed, 3)
112 * (carFrontalArea * dragCoefficient))) / 2);
114 currentPower = ((power1 + power2) / WATTS_PER_HORSEPOWER);
117 if ((currentPower > peakPower))
119 peakPower = currentPower;
122 if ((currentPower > 0))
124 averagePower = (averagePower + currentPower);
131 if( (checkPoint > 0) && (currentSpeed*3.6 > checkPoint) )
134 if( checkPointCounter <= speedCheckPoints.count() )
137 valuesMap.insert( checkPoint, totalTime );
138 if( checkPointCounter < speedCheckPoints.count() )
140 checkPoint = speedCheckPoints[checkPointCounter];
150 // Check for movement
151 //accelStoppedCheck(currentAcceleration);
153 lastSpeed = currentSpeed;
154 lastAcceleration = currentAcceleration;
155 lastDistance = distanceTraveled;
159 * This function checks if acceleration has stopped for
160 * a short period of time. Velocity is set to zero to avoid
163 void Calculate::accelStoppedCheck(double currentAcceleration)
165 // counting number of acceleration samples that equals zero
166 if (currentAcceleration==0) {
172 // if count exceeds 25, we assume that velocity is zero
179 // Getters and setters
181 double Calculate::getAverageSpeed()
186 void Calculate::setAverageSpeed(double value)
188 averageSpeed = value;
191 double Calculate::getCurrentSpeed()
196 void Calculate::setCurrentSpeed(double value)
198 currentSpeed = value;
201 double Calculate::getDistanceTraveled()
203 return distanceTraveled;
206 void Calculate::setDistanceTraveled(double value)
208 distanceTraveled = value;
211 double Calculate::getLastAcceleration()
213 return lastAcceleration;
216 void Calculate::setLastAcceleration(double value)
218 lastAcceleration = value;
221 double Calculate::getLastDistance()
226 void Calculate::setLastDistance(double value)
228 lastDistance = value;
231 double Calculate::getLastSpeed()
236 void Calculate::setLastSpeed(double value)
241 long Calculate::getNumOfIterations()
243 return numOfIterations;
246 void Calculate::setNumOfIterations(long value)
248 numOfIterations = value;
251 double Calculate::getTotalTime()
256 void Calculate::setTotalTime(double value)
261 double Calculate::getCurrentPower()
266 void Calculate::setCurrentPower(double value)
268 currentPower = value;
271 double Calculate::getPeakPower()
276 void Calculate::setPeakPower(double value)
281 double Calculate::getAveragePower()
283 if (numOfIterations > 0)
285 return (averagePower/numOfIterations);
293 void Calculate::setAveragePower(double value)
295 averagePower = value;
298 double Calculate::getMaxSpeed()
303 void Calculate::setMaxSpeed(double value)
308 QMap<int,double> Calculate::getValuesMap()