2 * Accelerometer class to access the device accelerometer
4 * @author Rikhard Kuutti <rikhard.kuutti@fudeco.com>
5 * @author Kai Rasilainen <kai.rasilainen@fudeco.com>
6 * @author Jukka Kurttila <jukka.kurttila@fudeco.com>
7 * @copyright (c) 2010 Speed Freak team
8 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
11 #include "accelerometer.h"
13 #include <QDBusConnection>
14 #include <QDBusInterface>
15 #include <QDBusPendingReply>
17 #define kFilteringFactor 0.2
20 * Default constructor for Accelerometer class
23 Accelerometer::Accelerometer()
29 * Default destructor for Accelerometer class
32 Accelerometer::~Accelerometer()
40 void Accelerometer::initValues()
42 previousAccelerationX = 0;
43 previousAccelerationY = 0;
44 previousAccelerationZ = 0;
51 * Calibrate. Purpose of this function is to calibrate
52 * accelerometer when stationary.
55 void Accelerometer::calibrate(void)
57 unsigned int iteration = 0;
58 qreal sampleX, sampleY, sampleZ;
62 getAcceleration(sampleX, sampleY, sampleZ);
64 calibrationX += sampleX; // Accumulate Samples
65 calibrationY += sampleY; // for all axes.
66 calibrationZ += sampleZ;
70 } while(iteration != 1024); // 1024 times
72 calibrationX = calibrationX/1024; // division by 1024
73 calibrationY = calibrationY/1024;
74 calibrationZ = calibrationZ/1024;
78 * Smooths Accelerometer data by applying a low pass filter to data
80 * @param x accelerometer's x-axis input
81 * @param y accelerometer's y-axis input
82 * @param z accelerometer's z-axis input
84 void Accelerometer::smoothData(qreal &x, qreal &y, qreal &z)
86 x = (previousAccelerationX * (1 - kFilteringFactor)) + (x * kFilteringFactor);
87 y = (previousAccelerationY * (1 - kFilteringFactor)) + (y * kFilteringFactor);
88 z = (previousAccelerationZ * (1 - kFilteringFactor)) + (z * kFilteringFactor);
90 previousAccelerationX = x;
91 previousAccelerationY = y;
92 previousAccelerationZ = z;
96 * Gets the raw acceleration data from accelerometer
98 * @param x accelerometer's x-axis input
99 * @param y accelerometer's y-axis input
100 * @param z accelerometer's z-axis input
102 void Accelerometer::getAcceleration(qreal &x, qreal &y, qreal &z)
104 QDBusConnection connection(QDBusConnection::systemBus());
105 if (connection.isConnected()) {
106 QDBusInterface interface("com.nokia.mce", "/com/nokia/icd", QString(), connection);
107 QDBusPendingReply<QString, QString, QString, int, int, int> reply;
108 reply = interface.asyncCall("get_device_orientation");
109 reply.waitForFinished();
110 x = static_cast<qreal>(reply.argumentAt<3>()) / 1000;
111 y = static_cast<qreal>(reply.argumentAt<4>()) / 1000;
112 z = static_cast<qreal>(reply.argumentAt<5>()) / 1000;
117 * Get the x calibration component
119 * @return calibrationX x calibration component
121 qreal Accelerometer::getCalibrationX()
127 * Get the y calibration component
129 * @return calibrationY y calibration component
131 qreal Accelerometer::getCalibrationY()
137 * Get the z calibration component
139 * @return calibrationZ z calibration component
141 qreal Accelerometer::getCalibrationZ()