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()
27 calibrateDialog = NULL;
31 * Default destructor for Accelerometer class
34 Accelerometer::~Accelerometer()
37 delete calibrateDialog;
44 void Accelerometer::initValues()
46 previousAccelerationX = 0;
47 previousAccelerationY = 0;
48 previousAccelerationZ = 0;
55 * Calibrate. Purpose of this function is to calibrate
56 * accelerometer when stationary.
59 void Accelerometer::calibrate(void)
61 unsigned int iteration = 0;
62 qreal sampleX, sampleY, sampleZ;
64 calibrateDialog = new CalibrateDialog();
65 calibrateDialog->show();
66 calibrateDialog->resetProgressValue();
67 calibrateDialog->setMaxValue( kIterations + 1 );
70 calibrateDialog->setProgressValue(iteration);
72 getAcceleration(sampleX, sampleY, sampleZ);
74 calibrationX += sampleX; // Accumulate Samples
75 calibrationY += sampleY; // for all axes.
76 calibrationZ += sampleZ;
80 } while(iteration != kIterations); // kIterations times
82 calibrationX = calibrationX/kIterations; // division by kIterations
83 calibrationY = calibrationY/kIterations;
84 calibrationZ = calibrationZ/kIterations;
86 calibrateDialog->close();
90 * Smooths Accelerometer data by applying a low pass filter to data
92 * @param x accelerometer's x-axis input
93 * @param y accelerometer's y-axis input
94 * @param z accelerometer's z-axis input
96 void Accelerometer::smoothData(qreal &x, qreal &y, qreal &z)
98 x = (previousAccelerationX * (1 - kFilteringFactor)) + (x * kFilteringFactor);
99 y = (previousAccelerationY * (1 - kFilteringFactor)) + (y * kFilteringFactor);
100 z = (previousAccelerationZ * (1 - kFilteringFactor)) + (z * kFilteringFactor);
102 previousAccelerationX = x;
103 previousAccelerationY = y;
104 previousAccelerationZ = z;
108 * Gets the raw acceleration data from accelerometer
110 * @param x accelerometer's x-axis input
111 * @param y accelerometer's y-axis input
112 * @param z accelerometer's z-axis input
114 void Accelerometer::getAcceleration(qreal &x, qreal &y, qreal &z)
116 QDBusConnection connection(QDBusConnection::systemBus());
117 if (connection.isConnected()) {
118 QDBusInterface interface("com.nokia.mce", "/com/nokia/icd", QString(), connection);
119 QDBusPendingReply<QString, QString, QString, int, int, int> reply;
120 reply = interface.asyncCall("get_device_orientation");
121 reply.waitForFinished();
122 x = static_cast<qreal>(reply.argumentAt<3>()) / 1000;
123 y = static_cast<qreal>(reply.argumentAt<4>()) / 1000;
124 z = static_cast<qreal>(reply.argumentAt<5>()) / 1000;
129 * Get the x calibration component
131 * @return calibrationX x calibration component
133 qreal Accelerometer::getCalibrationX()
139 * Get the y calibration component
141 * @return calibrationY y calibration component
143 qreal Accelerometer::getCalibrationY()
149 * Get the z calibration component
151 * @return calibrationZ z calibration component
153 qreal Accelerometer::getCalibrationZ()