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
18 #define kIterations 1024
21 * Default constructor for Accelerometer class
24 Accelerometer::Accelerometer()
30 * Default destructor for Accelerometer class
33 Accelerometer::~Accelerometer()
41 void Accelerometer::initValues()
43 previousAccelerationX = 0;
44 previousAccelerationY = 0;
45 previousAccelerationZ = 0;
52 * Calibrate. Purpose of this function is to calibrate
53 * accelerometer when stationary.
56 void Accelerometer::calibrate(void)
58 unsigned int iteration = 0;
59 qreal sampleX, sampleY, sampleZ;
61 calibrateDialog = new CalibrateDialog();
62 calibrateDialog->show();
63 calibrateDialog->resetProgressValue();
66 calibrateDialog->setProgressValue(iteration);
68 getAcceleration(sampleX, sampleY, sampleZ);
70 calibrationX += sampleX; // Accumulate Samples
71 calibrationY += sampleY; // for all axes.
72 calibrationZ += sampleZ;
76 } while(iteration != kIterations); // kIterations times
78 calibrationX = calibrationX/kIterations; // division by kIterations
79 calibrationY = calibrationY/kIterations;
80 calibrationZ = calibrationZ/kIterations;
82 calibrateDialog->hide();
86 * Smooths Accelerometer data by applying a low pass filter to data
88 * @param x accelerometer's x-axis input
89 * @param y accelerometer's y-axis input
90 * @param z accelerometer's z-axis input
92 void Accelerometer::smoothData(qreal &x, qreal &y, qreal &z)
94 x = (previousAccelerationX * (1 - kFilteringFactor)) + (x * kFilteringFactor);
95 y = (previousAccelerationY * (1 - kFilteringFactor)) + (y * kFilteringFactor);
96 z = (previousAccelerationZ * (1 - kFilteringFactor)) + (z * kFilteringFactor);
98 previousAccelerationX = x;
99 previousAccelerationY = y;
100 previousAccelerationZ = z;
104 * Gets the raw acceleration data from accelerometer
106 * @param x accelerometer's x-axis input
107 * @param y accelerometer's y-axis input
108 * @param z accelerometer's z-axis input
110 void Accelerometer::getAcceleration(qreal &x, qreal &y, qreal &z)
112 QDBusConnection connection(QDBusConnection::systemBus());
113 if (connection.isConnected()) {
114 QDBusInterface interface("com.nokia.mce", "/com/nokia/icd", QString(), connection);
115 QDBusPendingReply<QString, QString, QString, int, int, int> reply;
116 reply = interface.asyncCall("get_device_orientation");
117 reply.waitForFinished();
118 x = static_cast<qreal>(reply.argumentAt<3>()) / 1000;
119 y = static_cast<qreal>(reply.argumentAt<4>()) / 1000;
120 z = static_cast<qreal>(reply.argumentAt<5>()) / 1000;
125 * Get the x calibration component
127 * @return calibrationX x calibration component
129 qreal Accelerometer::getCalibrationX()
135 * Get the y calibration component
137 * @return calibrationY y calibration component
139 qreal Accelerometer::getCalibrationY()
145 * Get the z calibration component
147 * @return calibrationZ z calibration component
149 qreal Accelerometer::getCalibrationZ()