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 * @copyright (c) 2010 Speed Freak team
7 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
10 #include "accelerometer.h"
12 #include <QDBusConnection>
13 #include <QDBusInterface>
14 #include <QDBusPendingReply>
16 #define kFilteringFactor 0.2
19 * Default constructor for Accelerometer class
22 Accelerometer::Accelerometer()
28 * Default destructor for Accelerometer class
31 Accelerometer::~Accelerometer()
39 void Accelerometer::initValues()
41 previousAccelerationX = 0;
42 previousAccelerationY = 0;
43 previousAccelerationZ = 0;
50 * Calibrate. Purpose of this function is to calibrate
51 * accelerometer when stationary.
54 void Accelerometer::calibrate(void)
56 unsigned int iteration = 0;
57 qreal sampleX, sampleY, sampleZ;
61 getAcceleration(sampleX, sampleY, sampleZ);
63 calibrationX += sampleX; // Accumulate Samples
64 calibrationY += sampleY; // for all axes.
65 calibrationZ += sampleZ;
69 } while(iteration != 1024); // 1024 times
71 calibrationX = calibrationX/1024; // division by 1024
72 calibrationY = calibrationY/1024;
73 calibrationZ = calibrationZ/1024;
77 * Smooths Accelerometer data by applying a low pass filter to data
79 * @param x accelerometer's x-axis input
80 * @param y accelerometer's y-axis input
81 * @param z accelerometer's z-axis input
83 void Accelerometer::smoothData(qreal &x, qreal &y, qreal &z)
85 x = (previousAccelerationX * (1 - kFilteringFactor)) + (x * kFilteringFactor);
86 y = (previousAccelerationY * (1 - kFilteringFactor)) + (y * kFilteringFactor);
87 z = (previousAccelerationZ * (1 - kFilteringFactor)) + (z * kFilteringFactor);
89 previousAccelerationX = x;
90 previousAccelerationY = y;
91 previousAccelerationZ = z;
95 * Gets the raw acceleration data from accelerometer
97 * @param x accelerometer's x-axis input
98 * @param y accelerometer's y-axis input
99 * @param z accelerometer's z-axis input
101 void Accelerometer::getAcceleration(qreal &x, qreal &y, qreal &z)
103 QDBusConnection connection(QDBusConnection::systemBus());
104 if (connection.isConnected()) {
105 QDBusInterface interface("com.nokia.mce", "/com/nokia/icd", QString(), connection);
106 QDBusPendingReply<QString, QString, QString, int, int, int> reply;
107 reply = interface.asyncCall("get_device_orientation");
108 reply.waitForFinished();
109 x = static_cast<qreal>(reply.argumentAt<3>()) / 1000;
110 y = static_cast<qreal>(reply.argumentAt<4>()) / 1000;
111 z = static_cast<qreal>(reply.argumentAt<5>()) / 1000;
116 * Get the x calibration component
118 * @return calibrationX x calibration component
120 qreal Accelerometer::getCalibrationX()
126 * Get the y calibration component
128 * @return calibrationY y calibration component
130 qreal Accelerometer::getCalibrationY()
136 * Get the z calibration component
138 * @return calibrationZ z calibration component
140 qreal Accelerometer::getCalibrationZ()