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
10 #include "calculate.h"
18 const double G_ACCELERATION = 9.80665;
19 const double SECONDS_IN_HOUR = 3600;
21 Calculate::Calculate()
26 Calculate::~Calculate()
31 void Calculate::reset()
44 // Getters and setters
46 double Calculate::getAverageSpeed()
51 void Calculate::setAverageSpeed(double value)
56 double Calculate::getCurrentSpeed()
61 void Calculate::setCurrentSpeed(double value)
66 double Calculate::getDistanceTraveled()
68 return distanceTraveled;
71 void Calculate::setDistanceTraveled(double value)
73 distanceTraveled = value;
76 double Calculate::getLastAcceleration()
78 return lastAcceleration;
81 void Calculate::setLastAcceleration(double value)
83 lastAcceleration = value;
86 double Calculate::getLastDistance()
91 void Calculate::setLastDistance(double value)
96 double Calculate::getLastSpeed()
101 void Calculate::setLastSpeed(double value)
106 long Calculate::getNumOfIterations()
108 return numOfIterations;
111 void Calculate::setNumOfIterations(long value)
113 numOfIterations = value;
116 double Calculate::getTotalTime()
121 void Calculate::setTotalTime(double value)
127 * This is a main function for calculating various parameters. Accelerometer
128 * provides currentAcceleration and calling function measures time (seconds).
129 * This function should be called 20-30 times/second to minimize
132 * To be added: params like horsepower.
134 void Calculate::calculateParameters(double currentAcceleration, double seconds)
137 totalTime = (totalTime + seconds);
140 // v(n) = v(n-1)+(a(n) + a(n-1))*(seconds)/2
142 // First integration of acceleration provides speed
143 currentSpeed = (lastSpeed + (((currentAcceleration + lastAcceleration) * seconds) / 2));
145 // Second integration: distance.
146 distanceTraveled = (lastDistance + (((currentSpeed + lastSpeed) * seconds) / 2));
149 averageSpeed = (distanceTraveled / totalTime);
151 // Check for movement
152 accelStoppedCheck(currentAcceleration);
154 lastSpeed = currentSpeed;
155 lastAcceleration = currentAcceleration;
156 lastDistance = distanceTraveled;
160 * This function checks if acceleration has stopped for
161 * a short period of time. Velocity is set to zero to avoid
164 void Calculate::accelStoppedCheck(double currentAcceleration)
167 // counting number of acceleration samples that equals zero
168 if (currentAcceleration==0) {
174 // if count exceeds 25, we assume that velocity is zero