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()
51 speedCheckPoints.append(10);
52 speedCheckPoints.append(20);
53 speedCheckPoints.append(30);
54 speedCheckPoints.append(40);
60 * This is a main function for calculating various parameters. Accelerometer
61 * provides currentAcceleration and calling function measures time (seconds).
62 * This function should be called 20-30 times/second to minimize
67 void Calculate::calculateParameters(double currentAcceleration, double seconds)
69 double force, power1, power2;
71 currentAcceleration *= G_ACCELERATION;
73 totalTime = (totalTime + seconds);
76 // v(n) = v(n-1)+(a(n) + a(n-1))*(seconds)/2
78 // First integration of acceleration provides speed
79 currentSpeed = (lastSpeed + (((currentAcceleration + lastAcceleration) * seconds) / 2));
81 // Second integration: distance.
82 distanceTraveled = (lastDistance + (((currentSpeed + lastSpeed) * seconds) / 2));
85 averageSpeed = (distanceTraveled / totalTime);
88 force = (carWeight * currentAcceleration);
90 power1 = (force * currentSpeed);
92 power2 = ((AIR_DENSITY * (pow(currentSpeed, 3)
93 * (carFrontalArea * dragCoefficient))) / 2);
95 currentPower = ((power1 + power2) / WATTS_PER_HORSEPOWER);
98 if ((currentPower > peakPower))
100 peakPower = currentPower;
103 if ((currentPower > 0))
105 averagePower = (averagePower + currentPower);
113 if ((lastSpeed == 0))
118 // List of checkpoints
119 if (!(speedCheckPoints.isEmpty()))
121 foreach (double speed, speedCheckPoints)
123 if ((lastCheckpoint != floor(speed)) && (floor(getCurrentSpeed()) == floor(speed)))
125 emit checkPointReached(totalTime, getCurrentSpeed());
126 lastCheckpoint = floor(getCurrentSpeed());
131 // Check for movement
132 //accelStoppedCheck(currentAcceleration);
134 lastSpeed = currentSpeed;
135 lastAcceleration = currentAcceleration;
136 lastDistance = distanceTraveled;
140 * This function checks if acceleration has stopped for
141 * a short period of time. Velocity is set to zero to avoid
145 void Calculate::accelStoppedCheck(double currentAcceleration)
148 // counting number of acceleration samples that equals zero
149 if (currentAcceleration==0) {
155 // if count exceeds 15, we assume that velocity is zero
162 // Getters and setters
164 double Calculate::getAverageSpeed()
169 void Calculate::setAverageSpeed(double value)
171 averageSpeed = value;
174 double Calculate::getCurrentSpeed()
179 void Calculate::setCurrentSpeed(double value)
181 currentSpeed = value;
184 double Calculate::getDistanceTraveled()
186 return distanceTraveled;
189 void Calculate::setDistanceTraveled(double value)
191 distanceTraveled = value;
194 double Calculate::getLastAcceleration()
196 return lastAcceleration;
199 void Calculate::setLastAcceleration(double value)
201 lastAcceleration = value;
204 double Calculate::getLastDistance()
209 void Calculate::setLastDistance(double value)
211 lastDistance = value;
214 double Calculate::getLastSpeed()
219 void Calculate::setLastSpeed(double value)
224 long Calculate::getNumOfIterations()
226 return numOfIterations;
229 void Calculate::setNumOfIterations(long value)
231 numOfIterations = value;
234 double Calculate::getTotalTime()
239 void Calculate::setTotalTime(double value)
244 double Calculate::getCurrentPower()
249 void Calculate::setCurrentPower(double value)
251 currentPower = value;
254 double Calculate::getPeakPower()
259 void Calculate::setPeakPower(double value)
264 double Calculate::getAveragePower()
266 if (numOfIterations > 0)
268 return (averagePower/numOfIterations);
276 void Calculate::setAveragePower(double value)
278 averagePower = value;