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
62 * To be added: params like horsepower.
64 void Calculate::calculateParameters(double currentAcceleration, double seconds)
66 double force, power1, power2;
68 totalTime = (totalTime + seconds);
71 // v(n) = v(n-1)+(a(n) + a(n-1))*(seconds)/2
73 // First integration of acceleration provides speed
74 currentSpeed = (lastSpeed + (((currentAcceleration + lastAcceleration) * seconds) / 2));
76 // Second integration: distance.
77 distanceTraveled = (lastDistance + (((currentSpeed + lastSpeed) * seconds) / 2));
80 averageSpeed = (distanceTraveled / totalTime);
83 force = (carWeight * currentAcceleration);
85 power1 = (force * currentSpeed);
87 power2 = ((AIR_DENSITY * (pow(currentSpeed, 3)
88 * (carFrontalArea * dragCoefficient))) / 2);
90 currentPower = ((power1 + power2) / WATTS_PER_HORSEPOWER);
93 if ((currentPower > peakPower))
95 peakPower = currentPower;
98 if ((currentPower > 0))
100 averagePower = (averagePower + currentPower);
108 if ((lastSpeed == 0))
113 // List of checkpoints
114 if (!(speedCheckPoints.isEmpty()))
116 foreach (double speed, speedCheckPoints)
118 if ((lastCheckpoint != floor(speed)) && (floor(currentSpeed) == floor(speed)))
120 emit checkPointReached(totalTime, currentSpeed);
121 lastCheckpoint = floor(currentSpeed);
126 // Check for movement
127 accelStoppedCheck(currentAcceleration);
129 lastSpeed = currentSpeed;
130 lastAcceleration = currentAcceleration;
131 lastDistance = distanceTraveled;
135 * This function checks if acceleration has stopped for
136 * a short period of time. Velocity is set to zero to avoid
139 void Calculate::accelStoppedCheck(double currentAcceleration)
142 // counting number of acceleration samples that equals zero
143 if (currentAcceleration==0) {
149 // if count exceeds 25, we assume that velocity is zero
156 // Getters and setters
158 double Calculate::getAverageSpeed()
163 void Calculate::setAverageSpeed(double value)
165 averageSpeed = value;
168 double Calculate::getCurrentSpeed()
173 void Calculate::setCurrentSpeed(double value)
175 currentSpeed = value;
178 double Calculate::getDistanceTraveled()
180 return distanceTraveled;
183 void Calculate::setDistanceTraveled(double value)
185 distanceTraveled = value;
188 double Calculate::getLastAcceleration()
190 return lastAcceleration;
193 void Calculate::setLastAcceleration(double value)
195 lastAcceleration = value;
198 double Calculate::getLastDistance()
203 void Calculate::setLastDistance(double value)
205 lastDistance = value;
208 double Calculate::getLastSpeed()
213 void Calculate::setLastSpeed(double value)
218 long Calculate::getNumOfIterations()
220 return numOfIterations;
223 void Calculate::setNumOfIterations(long value)
225 numOfIterations = value;
228 double Calculate::getTotalTime()
233 void Calculate::setTotalTime(double value)