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()
48 speedCheckPoints.append(10);
49 speedCheckPoints.append(20);
50 speedCheckPoints.append(30);
51 speedCheckPoints.append(40);
57 * This is a main function for calculating various parameters. Accelerometer
58 * provides currentAcceleration and calling function measures time (seconds).
59 * This function should be called 20-30 times/second to minimize
64 void Calculate::calculateParameters(double currentAcceleration, double seconds)
66 double force, power1, power2;
68 currentAcceleration *= G_ACCELERATION;
70 totalTime = (totalTime + seconds);
73 // v(n) = v(n-1)+(a(n) + a(n-1))*(seconds)/2
75 // First integration of acceleration provides speed
76 currentSpeed = (lastSpeed + (((currentAcceleration + lastAcceleration) * seconds) / 2));
78 // Second integration: distance.
79 distanceTraveled = (lastDistance + (((currentSpeed + lastSpeed) * seconds) / 2));
82 averageSpeed = (distanceTraveled / totalTime);
85 force = (carWeight * currentAcceleration);
87 power1 = (force * currentSpeed);
89 power2 = ((AIR_DENSITY * (pow(currentSpeed, 3)
90 * (carFrontalArea * dragCoefficient))) / 2);
92 currentPower = ((power1 + power2) / WATTS_PER_HORSEPOWER);
95 if ((currentPower > peakPower))
97 peakPower = currentPower;
100 if ((currentPower > 0))
102 averagePower = (averagePower + currentPower);
110 if ((lastSpeed == 0))
115 // List of checkpoints
116 if (!(speedCheckPoints.isEmpty()))
118 foreach (double speed, speedCheckPoints)
120 if ((lastCheckpoint != floor(speed)) && (floor(currentSpeed) == floor(speed)))
122 emit checkPointReached(totalTime, currentSpeed);
123 lastCheckpoint = floor(currentSpeed);
128 // Check for movement
129 accelStoppedCheck(currentAcceleration);
131 lastSpeed = currentSpeed;
132 lastAcceleration = currentAcceleration;
133 lastDistance = distanceTraveled;
137 * This function checks if acceleration has stopped for
138 * a short period of time. Velocity is set to zero to avoid
141 void Calculate::accelStoppedCheck(double currentAcceleration)
144 // counting number of acceleration samples that equals zero
145 if (currentAcceleration==0) {
151 // if count exceeds 15, we assume that velocity is zero
158 // Getters and setters
160 double Calculate::getAverageSpeed()
165 void Calculate::setAverageSpeed(double value)
167 averageSpeed = value;
170 double Calculate::getCurrentSpeed()
175 void Calculate::setCurrentSpeed(double value)
177 currentSpeed = value;
180 double Calculate::getDistanceTraveled()
182 return distanceTraveled;
185 void Calculate::setDistanceTraveled(double value)
187 distanceTraveled = value;
190 double Calculate::getLastAcceleration()
192 return lastAcceleration;
195 void Calculate::setLastAcceleration(double value)
197 lastAcceleration = value;
200 double Calculate::getLastDistance()
205 void Calculate::setLastDistance(double value)
207 lastDistance = value;
210 double Calculate::getLastSpeed()
215 void Calculate::setLastSpeed(double value)
220 long Calculate::getNumOfIterations()
222 return numOfIterations;
225 void Calculate::setNumOfIterations(long value)
227 numOfIterations = value;
230 double Calculate::getTotalTime()
235 void Calculate::setTotalTime(double value)
240 double Calculate::getCurrentPower()
245 void Calculate::setCurrentPower(double value)
247 currentPower = value;
250 double Calculate::getPeakPower()
255 void Calculate::setPeakPower(double value)
260 double Calculate::getAveragePower()
262 if (numOfIterations > 0)
264 return (averagePower/numOfIterations);
272 void Calculate::setAveragePower(double value)
274 averagePower = value;