2 * Accelerometer class to access the device accelerometer
4 * @author Rikhard Kuutti <rikhard.kuutti@fudeco.com>
5 * @author Kai Rasilainen
6 * @copyright (c) 2010 Speed Freak team
7 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
10 #include "accelerometer.h"
18 #define kFilteringFactor 0.1
20 #define kFileName "/sys/class/i2c-adapter/i2c-3/3-001d/coord"
22 static int sampleIndex=0;
25 * Default constructor for Accelerometer class
28 Accelerometer::Accelerometer()
30 calculate = new Calculate();
32 timer = new QTimer(this);
33 connect(timer, SIGNAL(timeout()), this, SLOT(processData()));
39 * Constructor for Accelerometer class that takes accelerometer sample rate as parameter
41 * @param p_SampleRate the desired sample rate of accelerometer in milliseconds
43 Accelerometer::Accelerometer(int p_SampleRate)
45 calculate = new Calculate();
47 timer = new QTimer(this);
48 connect(timer, SIGNAL(timeout()), this, SLOT(processData()));
49 sampleRate = p_SampleRate;
54 * Default destructor for Accelerometer class
57 Accelerometer::~Accelerometer()
65 void Accelerometer::start()
69 timer->start(sampleRate);
77 void Accelerometer::initValues()
83 trueAccelerationX = 0;
84 trueAccelerationY = 0;
85 trueAccelerationZ = 0;
86 previousAccelerationX = 0;
87 previousAccelerationY = 0;
88 previousAccelerationZ = 0;
91 currentAcceleration = 0;
92 previousAcceleration = 0;
93 totalAcceleration = 0;
97 lastDistanceTraveled = 0;
107 * Calibrate. Purpose of this function is to calibrate
108 * accelerometer when stationary.
111 void Accelerometer::calibrate(void)
113 unsigned int iteration = 0;
116 // Opening the file must be done inside the loop
117 // or else the values obtained from file.readLine();
118 // will be empty for all but the first iteration
119 QFile file(kFileName);
120 if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
126 QRegExp rx("([0-9-]+) ([0-9-]+) ([0-9-]+)");
128 // Read data, parse with regular expressions and process it
129 line = file.readLine();
132 int sampleX = rx.cap(1).toInt();
133 int sampleY = rx.cap(2).toInt();
134 int sampleZ = rx.cap(3).toInt();
136 calibrationX = calibrationX + sampleX; // Accumulate Samples
137 calibrationY = calibrationY + sampleY; // for all axes.
138 calibrationZ = calibrationZ + sampleZ;
143 } while(iteration != 1024); // 1024 times
145 calibrationX = calibrationX>>10; // division by 1024
146 calibrationY = calibrationY>>10;
147 calibrationZ = calibrationZ>>10;
154 void Accelerometer::stop()
160 * Set the sample rate of accelerometer
162 * @param pSampleRate desired sample rate
164 void Accelerometer::setSampleRate(int pSampleRate)
166 sampleRate = pSampleRate;
170 * Get the sample rate of accelerometer
172 * @return sampleRate the sample rate of the accelerometer in milliseconds
174 int Accelerometer::getSampleRate()
179 qreal Accelerometer::getCurrentAcceleration()
181 return currentAcceleration;
184 qreal Accelerometer::getPreviousTotalAcceleration()
186 return previousAcceleration;
189 qreal Accelerometer::getTotalAcceleration()
191 return totalAcceleration;
194 qreal Accelerometer::getDistanceTraveled()
196 return distanceTraveled;
199 qreal Accelerometer::getLastDistanceTraveled()
201 return lastDistanceTraveled;
204 qreal Accelerometer::getAverageSpeed()
209 qreal Accelerometer::getTrueAccelerationX()
211 return trueAccelerationX;
214 qreal Accelerometer::getTrueAccelerationY()
216 return trueAccelerationY;
219 qreal Accelerometer::getTrueAccelerationZ()
221 return trueAccelerationZ;
224 qreal Accelerometer::getPreviousSpeed()
226 return previousSpeed;
229 qreal Accelerometer::getCurrentSpeed()
234 qreal Accelerometer::getIntervalTime()
239 qreal Accelerometer::getTotalTime()
244 int Accelerometer::getCalibrationX()
249 int Accelerometer::getCalibrationY()
254 int Accelerometer::getCalibrationZ()
260 * Processes Accelerometer data
262 * Opens the accelerometer value file for reading and reads and parses accelerometer values.
263 * Forwards data to Calculate class for processing
266 void Accelerometer::processData()
268 QFile file(kFileName);
269 if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
274 // Read data, parse with regular expressions and process it
275 QByteArray line = file.readLine();
276 QRegExp rx("([0-9-]+) ([0-9-]+) ([0-9-]+)");
279 smoothData(rx.cap(1).toInt(), rx.cap(2).toInt(), rx.cap(3).toInt());
282 accelerationX = accelerationX - calibrationX;
283 accelerationX = accelerationY - calibrationY;
284 accelerationX = accelerationZ - calibrationZ;
286 // If the function is run the first time, make sure that there
287 // are no differences with previous and current acceleration
289 previousAccelerationX = accelerationX;
290 previousAccelerationY = accelerationY;
291 previousAccelerationZ = accelerationZ;
295 // Discrimination window for acceleration values
296 /*if ( fabs(accelerationX) < 20 ) { accelerationX = 0; }
297 if ( fabs(accelerationY) < 20 ) { accelerationY = 0; }
298 if ( fabs(accelerationZ) < 20 ) { accelerationZ = 0; }*/
300 // Calculate the current acceleration for each axis
301 trueAccelerationX = (accelerationX - previousAccelerationX) /*/ 1000 * kGravity*/;
302 trueAccelerationY = (accelerationY - previousAccelerationY) /*/ 1000 * kGravity*/;
303 trueAccelerationZ = (accelerationZ - previousAccelerationZ) /*/ 1000 * kGravity*/;
305 // Discrimination window for acceleration values
306 if ( fabs(trueAccelerationX) < 20 ) { trueAccelerationX = 0; }
307 if ( fabs(trueAccelerationY) < 20 ) { trueAccelerationY = 0; }
308 if ( fabs(trueAccelerationZ) < 20 ) { trueAccelerationZ = 0; }
310 previousAccelerationX = accelerationX;
311 previousAccelerationY = accelerationY;
312 previousAccelerationZ = accelerationZ;
314 currentAcceleration = sqrt(trueAccelerationX * trueAccelerationX +
315 trueAccelerationY * trueAccelerationY +
316 trueAccelerationZ * trueAccelerationZ );
318 // Discrimination window for currentAcceleration
319 if ( fabs(currentAcceleration) < 20 ) { currentAcceleration = 0; }
321 // Measure time interval
322 intervalTime = now.restart();
323 intervalTime = intervalTime/1000; // millisecs to secs
324 totalTime = totalTime + intervalTime;
326 // Using calculate class to calculate velocity and distance etc.
327 calculate->calculateParameters(currentAcceleration,intervalTime );
329 currentSpeed = calculate->getCurrentSpeed();
330 distanceTraveled = calculate->getDistanceTraveled();
336 * Smooths Accelerometer data
338 * @param x accelerometer's x-axis input
339 * @param y accelerometer's y-axis input
340 * @param z accelerometer's z-axis input
342 void Accelerometer::smoothData(qreal x, qreal y, qreal z)
349 accelerationX = previousAccelerationX + (accelerationX-previousAccelerationX) * kFilteringFactor;
350 accelerationY = previousAccelerationY + (accelerationY-previousAccelerationY) * kFilteringFactor;
351 accelerationZ = previousAccelerationZ + (accelerationZ-previousAccelerationZ) * kFilteringFactor;