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"
17 #include <QDBusConnection>
18 #include <QDBusInterface>
19 #include <QDBusPendingReply>
21 #define kFilteringFactor 0.1
23 #define kFileName "/sys/class/i2c-adapter/i2c-3/3-001d/coord"
25 static int sampleIndex=0;
28 * Default constructor for Accelerometer class
31 Accelerometer::Accelerometer()
33 calculate = new Calculate();
35 timer = new QTimer(this);
36 connect(timer, SIGNAL(timeout()), this, SLOT(processData()));
42 * Constructor for Accelerometer class that takes accelerometer sample rate as parameter
44 * @param p_SampleRate the desired sample rate of accelerometer in milliseconds
46 Accelerometer::Accelerometer(int p_SampleRate)
48 calculate = new Calculate();
50 timer = new QTimer(this);
51 connect(timer, SIGNAL(timeout()), this, SLOT(processData()));
52 sampleRate = p_SampleRate;
57 * Default destructor for Accelerometer class
60 Accelerometer::~Accelerometer()
68 void Accelerometer::start()
72 timer->start(sampleRate);
80 void Accelerometer::initValues()
86 trueAccelerationX = 0;
87 trueAccelerationY = 0;
88 trueAccelerationZ = 0;
89 previousAccelerationX = 0;
90 previousAccelerationY = 0;
91 previousAccelerationZ = 0;
94 currentAcceleration = 0;
95 previousAcceleration = 0;
96 totalAcceleration = 0;
100 lastDistanceTraveled = 0;
110 * Calibrate. Purpose of this function is to calibrate
111 * accelerometer when stationary.
114 void Accelerometer::calibrate(void)
116 unsigned int iteration = 0;
117 qreal sampleX, sampleY, sampleZ;
121 getAcceleration(sampleX, sampleY, sampleZ);
123 calibrationX += sampleX; // Accumulate Samples
124 calibrationY += sampleY; // for all axes.
125 calibrationZ += sampleZ;
129 } while(iteration != 1024); // 1024 times
131 calibrationX = calibrationX/1024; // division by 1024
132 calibrationY = calibrationY/1024;
133 calibrationZ = calibrationZ/1024;
140 void Accelerometer::stop()
146 * Processes Accelerometer data
148 * Opens the accelerometer value file for reading and reads and parses accelerometer values.
149 * Forwards data to Calculate class for processing
152 void Accelerometer::processData()
154 getAcceleration(accelerationX, accelerationY, accelerationZ);
155 //smoothData(accelerationX, accelerationY, accelerationZ);
158 accelerationX = accelerationX - calibrationX;
159 accelerationY = accelerationY - calibrationY;
160 accelerationZ = accelerationZ - calibrationZ;
162 // If the function is run the first time, make sure that there
163 // are no differences with previous and current acceleration
165 previousAccelerationX = accelerationX;
166 previousAccelerationY = accelerationY;
167 previousAccelerationZ = accelerationZ;
171 // Calculate the current acceleration for each axis
172 trueAccelerationX = (accelerationX - previousAccelerationX);
173 trueAccelerationY = (accelerationY - previousAccelerationY);
174 trueAccelerationZ = (accelerationZ - previousAccelerationZ);
176 previousAccelerationX = accelerationX;
177 previousAccelerationY = accelerationY;
178 previousAccelerationZ = accelerationZ;
180 currentAcceleration = sqrt((trueAccelerationX * trueAccelerationX) +
181 (trueAccelerationY * trueAccelerationY) +
182 (trueAccelerationZ * trueAccelerationZ));
184 // Discrimination window for currentAcceleration
185 if ( fabs(currentAcceleration) < 0.10 ) { currentAcceleration = 0; }
187 // Measure time interval
188 intervalTime = now.restart();
189 intervalTime = intervalTime/1000; // millisecs to secs
190 totalTime = totalTime + intervalTime;
192 // Using calculate class to calculate velocity and distance etc.
193 calculate->calculateParameters(currentAcceleration,intervalTime );
195 currentSpeed = calculate->getCurrentSpeed();
196 distanceTraveled = calculate->getDistanceTraveled();
200 * Smooths Accelerometer data
202 * @param x accelerometer's x-axis input
203 * @param y accelerometer's y-axis input
204 * @param z accelerometer's z-axis input
206 void Accelerometer::smoothData(qreal x, qreal y, qreal z)
213 accelerationX = previousAccelerationX + (accelerationX-previousAccelerationX) * kFilteringFactor;
214 accelerationY = previousAccelerationY + (accelerationY-previousAccelerationY) * kFilteringFactor;
215 accelerationZ = previousAccelerationZ + (accelerationZ-previousAccelerationZ) * kFilteringFactor;
220 void Accelerometer::getAcceleration(qreal &x, qreal &y, qreal &z)
223 QFile file(kFileName);
224 if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
229 // Read data, parse with regular expressions and process it
230 QByteArray line = file.readLine();
231 QRegExp rx("([0-9-]+) ([0-9-]+) ([0-9-]+)");
234 x = rx.cap(1).toInt()/1000;
235 y = rx.cap(2).toInt()/1000;
236 z = rx.cap(3).toInt()/1000;
241 QDBusConnection connection(QDBusConnection::systemBus());
242 if (connection.isConnected()) {
243 QDBusInterface interface("com.nokia.mce", "/com/nokia/icd", QString(), connection);
244 QDBusPendingReply<QString, QString, QString, int, int, int> reply;
245 reply = interface.asyncCall("get_device_orientation");
246 reply.waitForFinished();
247 x = static_cast<qreal>(reply.argumentAt<3>()) / 1000;
248 y = static_cast<qreal>(reply.argumentAt<4>()) / 1000;
249 z = static_cast<qreal>(reply.argumentAt<5>()) / 1000;
254 * Set the sample rate of accelerometer
256 * @param pSampleRate desired sample rate
258 void Accelerometer::setSampleRate(int pSampleRate)
260 sampleRate = pSampleRate;
264 * Get the sample rate of accelerometer
266 * @return sampleRate the sample rate of the accelerometer in milliseconds
268 int Accelerometer::getSampleRate()
273 qreal Accelerometer::getCurrentAcceleration()
275 return currentAcceleration;
278 qreal Accelerometer::getPreviousTotalAcceleration()
280 return previousAcceleration;
283 qreal Accelerometer::getTotalAcceleration()
285 return totalAcceleration;
288 qreal Accelerometer::getDistanceTraveled()
290 return distanceTraveled;
293 qreal Accelerometer::getLastDistanceTraveled()
295 return lastDistanceTraveled;
298 qreal Accelerometer::getAverageSpeed()
303 qreal Accelerometer::getTrueAccelerationX()
305 return trueAccelerationX;
308 qreal Accelerometer::getTrueAccelerationY()
310 return trueAccelerationY;
313 qreal Accelerometer::getTrueAccelerationZ()
315 return trueAccelerationZ;
318 qreal Accelerometer::getPreviousSpeed()
320 return previousSpeed;
323 qreal Accelerometer::getCurrentSpeed()
328 qreal Accelerometer::getIntervalTime()
333 qreal Accelerometer::getTotalTime()
338 qreal Accelerometer::getCalibrationX()
343 qreal Accelerometer::getCalibrationY()
348 qreal Accelerometer::getCalibrationZ()