2 * Calculate class to process accelerometer data
4 * @author Kai Rasilainen <kai.rasilainen@fudeco.com>
5 * @author Jukka Kurttila <jukka.kurttila@fudeco.com>
6 * @author Toni Jussila <toni.jussila@fudeco.com>
7 * @copyright (c) 2010 Speed Freak team
8 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
11 #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;
22 const double carFrontalArea = 1.5;
23 const double dragCoefficient = 0.31;
24 const int carWeight = 850;
27 * Default constructor for Calculate class.
29 Calculate::Calculate()
35 * Default destructor for Calculate class.
36 * Deletes all dynamic objects and sets them to NULL.
38 Calculate::~Calculate()
44 * This function reset all variables.
46 void Calculate::reset()
62 if(speedCheckPoints.count() == 0)
64 speedCheckPoints.append(10);
65 speedCheckPoints.append(20);
66 speedCheckPoints.append(30);
67 speedCheckPoints.append(40);
68 speedCheckPoints.append(50);
69 speedCheckPoints.append(60);
70 speedCheckPoints.append(70);
71 speedCheckPoints.append(80);
72 speedCheckPoints.append(90);
73 speedCheckPoints.append(100);
75 checkPointCounter = 0;
76 checkPoint = speedCheckPoints[checkPointCounter];
81 * This is a main function for calculating various parameters. Accelerometer
82 * provides currentAcceleration and calling function measures time (seconds).
83 * This function should be called 20-30 times/second to minimize
86 * @param double current acceleration
87 * @param double seconds
89 void Calculate::calculateParameters(double currentAcceleration, double seconds)
91 double force, power1, power2;
93 currentAcceleration *= G_ACCELERATION;
95 totalTime = (totalTime + seconds);
98 // v(n) = v(n-1)+(a(n) + a(n-1))*(seconds)/2
100 // First integration of acceleration provides speed
101 currentSpeed = (lastSpeed + (((currentAcceleration + lastAcceleration) * seconds) / 2));
103 // Update maximum speed
104 if (currentSpeed > maxSpeed)
105 maxSpeed = currentSpeed;
107 // Second integration: distance.
108 distanceTraveled = (lastDistance + (((currentSpeed + lastSpeed) * seconds) / 2));
111 averageSpeed = (distanceTraveled / totalTime);
114 force = (carWeight * currentAcceleration);
116 power1 = (force * currentSpeed);
118 power2 = ((AIR_DENSITY * (pow(currentSpeed, 3)
119 * (carFrontalArea * dragCoefficient))) / 2);
121 currentPower = ((power1 + power2) / WATTS_PER_HORSEPOWER);
124 if ((currentPower > peakPower))
126 peakPower = currentPower;
129 if ((currentPower > 0))
131 averagePower = (averagePower + currentPower);
138 if( (checkPoint > 0) && (currentSpeed*3.6 > checkPoint) )
141 if( checkPointCounter <= speedCheckPoints.count() )
144 valuesMap.insert( checkPoint, totalTime );
145 if( checkPointCounter < speedCheckPoints.count() )
147 checkPoint = speedCheckPoints[checkPointCounter];
157 // Check for movement
158 //accelStoppedCheck(currentAcceleration);
160 lastSpeed = currentSpeed;
161 lastAcceleration = currentAcceleration;
162 lastDistance = distanceTraveled;
166 * This function checks if acceleration has stopped for
167 * a short period of time. Velocity is set to zero to avoid
170 * @param double current acceleration
172 void Calculate::accelStoppedCheck(double currentAcceleration)
174 // counting number of acceleration samples that equals zero
175 if (currentAcceleration==0) {
181 // if count exceeds 25, we assume that velocity is zero
191 * @return double average speed
193 double Calculate::getAverageSpeed()
201 * @param double average speed
203 void Calculate::setAverageSpeed(double value)
205 averageSpeed = value;
211 * @return double current speed
213 double Calculate::getCurrentSpeed()
221 * @param double current speed
223 void Calculate::setCurrentSpeed(double value)
225 currentSpeed = value;
229 * Get travelled distance.
231 * @return double travelled distance
233 double Calculate::getDistanceTraveled()
235 return distanceTraveled;
239 * Set travelled distance.
241 * @param double travelled distance
243 void Calculate::setDistanceTraveled(double value)
245 distanceTraveled = value;
249 * Get last acceleration.
251 * @return double last acceleration
253 double Calculate::getLastAcceleration()
255 return lastAcceleration;
259 * Set last acceleration.
261 * @param double last acceleration
263 void Calculate::setLastAcceleration(double value)
265 lastAcceleration = value;
271 * @return double last distance
273 double Calculate::getLastDistance()
281 * @param double last distance
283 void Calculate::setLastDistance(double value)
285 lastDistance = value;
291 * @return double last speed
293 double Calculate::getLastSpeed()
301 * @param double last speed
303 void Calculate::setLastSpeed(double value)
309 * Get number of iterations.
311 * @return long number of iterations
313 long Calculate::getNumOfIterations()
315 return numOfIterations;
319 * Set number of iterations.
321 * @param long number of iterations
323 void Calculate::setNumOfIterations(long value)
325 numOfIterations = value;
331 * @return double total time
333 double Calculate::getTotalTime()
341 * @param double total time
343 void Calculate::setTotalTime(double value)
351 * @return double current power
353 double Calculate::getCurrentPower()
361 * @param double current power
363 void Calculate::setCurrentPower(double value)
365 currentPower = value;
371 * @return double peek power
373 double Calculate::getPeakPower()
381 * @param double peek power
383 void Calculate::setPeakPower(double value)
391 * @return double average power
393 double Calculate::getAveragePower()
395 if (numOfIterations > 0)
397 return (averagePower/numOfIterations);
408 * @param double average power
410 void Calculate::setAveragePower(double value)
412 averagePower = value;
418 * @return double max speed
420 double Calculate::getMaxSpeed()
428 * @param double max speed
430 void Calculate::setMaxSpeed(double value)
438 * @return QMap<int,double> values map.
440 QMap<int,double> Calculate::getValuesMap()