2 * Calculate class to process accelerometer data
4 * @author Kai Rasilainen
5 * @copyright (c) 2010 Speed Freak team
6 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
17 const double G_ACCELERATION = 9.80665;
18 const double SECONDS_IN_HOUR = 3600;
19 const double AIR_DENSITY = 1.225;
20 const double WATTS_PER_HORSEPOWER = 745.69987158227025;
22 const double carFrontalArea = 1.5;
23 const double dragCoefficient = 0.31;
24 const int carWeight = 850;
26 Calculate::Calculate()
31 Calculate::~Calculate()
36 void Calculate::reset()
52 if(speedCheckPoints.count() == 0)
54 speedCheckPoints.append(10);
55 speedCheckPoints.append(20);
56 speedCheckPoints.append(30);
57 speedCheckPoints.append(40);
58 speedCheckPoints.append(50);
59 speedCheckPoints.append(60);
60 speedCheckPoints.append(70);
61 speedCheckPoints.append(80);
62 speedCheckPoints.append(90);
63 speedCheckPoints.append(100);
66 checkPointCounter = 0;
67 checkPoint = speedCheckPoints[checkPointCounter];
73 * This is a main function for calculating various parameters. Accelerometer
74 * provides currentAcceleration and calling function measures time (seconds).
75 * This function should be called 20-30 times/second to minimize
80 void Calculate::calculateParameters(double currentAcceleration, double seconds)
82 double force, power1, power2;
84 currentAcceleration *= G_ACCELERATION;
86 totalTime = (totalTime + seconds);
89 // v(n) = v(n-1)+(a(n) + a(n-1))*(seconds)/2
91 // First integration of acceleration provides speed
92 currentSpeed = (lastSpeed + (((currentAcceleration + lastAcceleration) * seconds) / 2));
94 // Update maximum speed
95 if (currentSpeed > maxSpeed)
96 maxSpeed = currentSpeed;
98 // Second integration: distance.
99 distanceTraveled = (lastDistance + (((currentSpeed + lastSpeed) * seconds) / 2));
102 averageSpeed = (distanceTraveled / totalTime);
105 force = (carWeight * currentAcceleration);
107 power1 = (force * currentSpeed);
109 power2 = ((AIR_DENSITY * (pow(currentSpeed, 3)
110 * (carFrontalArea * dragCoefficient))) / 2);
112 currentPower = ((power1 + power2) / WATTS_PER_HORSEPOWER);
115 if ((currentPower > peakPower))
117 peakPower = currentPower;
120 if ((currentPower > 0))
122 averagePower = (averagePower + currentPower);
129 if( (checkPoint > 0) && (currentSpeed*3.6 > checkPoint) )
132 if( checkPointCounter <= speedCheckPoints.count() )
135 valuesMap.insert( checkPoint, totalTime );
136 if( checkPointCounter < speedCheckPoints.count() )
138 checkPoint = speedCheckPoints[checkPointCounter];
148 // Check for movement
149 //accelStoppedCheck(currentAcceleration);
151 lastSpeed = currentSpeed;
152 lastAcceleration = currentAcceleration;
153 lastDistance = distanceTraveled;
157 * This function checks if acceleration has stopped for
158 * a short period of time. Velocity is set to zero to avoid
161 void Calculate::accelStoppedCheck(double currentAcceleration)
163 // counting number of acceleration samples that equals zero
164 if (currentAcceleration==0) {
170 // if count exceeds 25, we assume that velocity is zero
177 // Getters and setters
179 double Calculate::getAverageSpeed()
184 void Calculate::setAverageSpeed(double value)
186 averageSpeed = value;
189 double Calculate::getCurrentSpeed()
194 void Calculate::setCurrentSpeed(double value)
196 currentSpeed = value;
199 double Calculate::getDistanceTraveled()
201 return distanceTraveled;
204 void Calculate::setDistanceTraveled(double value)
206 distanceTraveled = value;
209 double Calculate::getLastAcceleration()
211 return lastAcceleration;
214 void Calculate::setLastAcceleration(double value)
216 lastAcceleration = value;
219 double Calculate::getLastDistance()
224 void Calculate::setLastDistance(double value)
226 lastDistance = value;
229 double Calculate::getLastSpeed()
234 void Calculate::setLastSpeed(double value)
239 long Calculate::getNumOfIterations()
241 return numOfIterations;
244 void Calculate::setNumOfIterations(long value)
246 numOfIterations = value;
249 double Calculate::getTotalTime()
254 void Calculate::setTotalTime(double value)
259 double Calculate::getCurrentPower()
264 void Calculate::setCurrentPower(double value)
266 currentPower = value;
269 double Calculate::getPeakPower()
274 void Calculate::setPeakPower(double value)
279 double Calculate::getAveragePower()
281 if (numOfIterations > 0)
283 return (averagePower/numOfIterations);
291 void Calculate::setAveragePower(double value)
293 averagePower = value;
296 double Calculate::getMaxSpeed()
301 void Calculate::setMaxSpeed(double value)