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 #include <QDBusConnection>
19 #include <QDBusInterface>
20 #include <QDBusPendingReply>
22 #define kFilteringFactor 0.2
24 static int sampleIndex = 0;
27 * Default constructor for Accelerometer class
30 Accelerometer::Accelerometer()
32 calculate = new Calculate();
34 timer = new QTimer(this);
35 connect(timer, SIGNAL(timeout()), this, SLOT(processData()));
41 * Constructor for Accelerometer class that takes accelerometer sample rate as parameter
43 * @param p_SampleRate the desired sample rate of accelerometer in milliseconds
45 Accelerometer::Accelerometer(int p_SampleRate)
47 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;
141 void Accelerometer::stop()
147 * Processes Accelerometer data
149 * Opens the accelerometer value file for reading and reads and parses accelerometer values.
150 * Forwards data to Calculate class for processing
154 void Accelerometer::processData()
156 getAcceleration(accelerationX, accelerationY, accelerationZ);
157 //smoothData(accelerationX, accelerationY, accelerationZ);
160 accelerationX = accelerationX - calibrationX;
161 accelerationY = accelerationY - calibrationY;
162 accelerationZ = accelerationZ - calibrationZ;
164 // If the function is run the first time, make sure that there
165 // are no differences with previous and current acceleration
167 previousAccelerationX = accelerationX;
168 previousAccelerationY = accelerationY;
169 previousAccelerationZ = accelerationZ;
173 // Calculate the current acceleration for each axis
174 trueAccelerationX = (accelerationX - previousAccelerationX);
175 trueAccelerationY = (accelerationY - previousAccelerationY);
176 trueAccelerationZ = (accelerationZ - previousAccelerationZ);
178 previousAccelerationX = accelerationX;
179 previousAccelerationY = accelerationY;
180 previousAccelerationZ = accelerationZ;
182 currentAcceleration = sqrt((trueAccelerationX * trueAccelerationX) +
183 (trueAccelerationY * trueAccelerationY) +
184 (trueAccelerationZ * trueAccelerationZ));
186 // Discrimination window for currentAcceleration
187 if ( fabs(currentAcceleration) < 0.10 ) { currentAcceleration = 0; }
189 // Measure time interval
190 intervalTime = now.restart();
191 intervalTime = intervalTime/1000; // millisecs to secs
192 totalTime = totalTime + intervalTime;
194 // Using calculate class to calculate velocity and distance etc.
195 calculate->calculateParameters(currentAcceleration,intervalTime );
197 currentSpeed = calculate->getCurrentSpeed();
198 distanceTraveled = calculate->getDistanceTraveled();
202 * Smooths Accelerometer data
204 * @param x accelerometer's x-axis input
205 * @param y accelerometer's y-axis input
206 * @param z accelerometer's z-axis input
208 void Accelerometer::smoothData(qreal &x, qreal &y, qreal &z)
216 accelerationX = ((previousAccelerationX) * (1-kFilteringFactor)) + (accelerationX * kFilteringFactor);
217 accelerationY = ((previousAccelerationY) * (1-kFilteringFactor)) + (accelerationY * kFilteringFactor);
218 accelerationZ = ((previousAccelerationZ) * (1-kFilteringFactor)) + (accelerationZ * kFilteringFactor);
223 void Accelerometer::getAcceleration(qreal &x, qreal &y, qreal &z)
225 QDBusConnection connection(QDBusConnection::systemBus());
226 if (connection.isConnected()) {
227 QDBusInterface interface("com.nokia.mce", "/com/nokia/icd", QString(), connection);
228 QDBusPendingReply<QString, QString, QString, int, int, int> reply;
229 reply = interface.asyncCall("get_device_orientation");
230 reply.waitForFinished();
231 x = static_cast<qreal>(reply.argumentAt<3>()) / 1000;
232 y = static_cast<qreal>(reply.argumentAt<4>()) / 1000;
233 z = static_cast<qreal>(reply.argumentAt<5>()) / 1000;
238 * Set the sample rate of accelerometer
240 * @param pSampleRate desired sample rate
242 void Accelerometer::setSampleRate(int pSampleRate)
244 sampleRate = pSampleRate;
248 * Get the sample rate of accelerometer
250 * @return sampleRate the sample rate of the accelerometer in milliseconds
252 int Accelerometer::getSampleRate()
257 qreal Accelerometer::getCurrentAcceleration()
259 return currentAcceleration;
262 qreal Accelerometer::getPreviousTotalAcceleration()
264 return previousAcceleration;
267 qreal Accelerometer::getTotalAcceleration()
269 return totalAcceleration;
272 qreal Accelerometer::getDistanceTraveled()
274 return distanceTraveled;
277 qreal Accelerometer::getLastDistanceTraveled()
279 return lastDistanceTraveled;
282 qreal Accelerometer::getAverageSpeed()
287 qreal Accelerometer::getTrueAccelerationX()
289 return trueAccelerationX;
292 qreal Accelerometer::getTrueAccelerationY()
294 return trueAccelerationY;
297 qreal Accelerometer::getTrueAccelerationZ()
299 return trueAccelerationZ;
302 qreal Accelerometer::getPreviousSpeed()
304 return previousSpeed;
307 qreal Accelerometer::getCurrentSpeed()
312 qreal Accelerometer::getIntervalTime()
317 qreal Accelerometer::getTotalTime()
322 qreal Accelerometer::getCalibrationX()
327 qreal Accelerometer::getCalibrationY()
332 qreal Accelerometer::getCalibrationZ()