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 <jktla@suomi24.fi>
7 * @author Toni Jussila <toni.jussila@fudeco.com>
8 * @copyright (c) 2010 Speed Freak team
9 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
12 //#define FROM_FILE //Use this flag to read acceleration data from file, set also filename using fileReader->setFileName
13 #include "accelerometer.h"
15 #include <QDBusConnection>
16 #include <QDBusInterface>
17 #include <QDBusPendingReply>
19 #define kFilteringFactor 0.2
20 #define kIterations 100
23 * Default constructor for Accelerometer class.
26 Accelerometer::Accelerometer()
29 calibrateDialog = NULL;
30 //fileReader = new filereader();
31 //fileReader->setFileName("45.txt");
35 * Default destructor for Accelerometer class.
36 * Deletes all dynamic objects and sets them to NULL.
38 Accelerometer::~Accelerometer()
41 delete calibrateDialog;
50 void Accelerometer::initValues()
52 previousAccelerationX = 0;
53 previousAccelerationY = 0;
54 previousAccelerationZ = 0;
62 * Calibrate. Purpose of this function is to calibrate
63 * accelerometer when stationary.
66 void Accelerometer::calibrate(void)
68 unsigned int iteration = 0;
69 qreal sampleX, sampleY, sampleZ;
71 calibrateDialog = new CalibrateDialog();
72 calibrateDialog->show();
73 calibrateDialog->resetProgressValue();
74 calibrateDialog->setMaxValue( kIterations + 1 );
77 unsigned int numberOfIterations = 50;
79 calibrateDialog->setProgressValue(iteration);
81 fileReader->ReadLine(sampleX,sampleY,sampleZ);
82 //getAcceleration(sampleX, sampleY, sampleZ);
84 calibrationX += sampleX; // Accumulate Samples
85 calibrationY += sampleY; // for all axes.
86 calibrationZ += sampleZ;
90 } while(iteration < numberOfIterations); // kIterations times
92 calibrationX = calibrationX/numberOfIterations; // division by kIterations
93 calibrationY = calibrationY/numberOfIterations;
94 calibrationZ = calibrationZ/numberOfIterations;
98 calibrateDialog->setProgressValue(iteration);
100 getAcceleration(sampleX, sampleY, sampleZ);
102 calibrationX += sampleX; // Accumulate Samples
103 calibrationY += sampleY; // for all axes.
104 calibrationZ += sampleZ;
108 } while(iteration != kIterations); // kIterations times
110 calibrationX = calibrationX/kIterations; // division by kIterations
111 calibrationY = calibrationY/kIterations;
112 calibrationZ = calibrationZ/kIterations;
114 calibrateDialog->close();
118 * Smooths Accelerometer data by applying a low pass filter to data.
120 * @param x accelerometer's x-axis input
121 * @param y accelerometer's y-axis input
122 * @param z accelerometer's z-axis input
124 void Accelerometer::smoothData(qreal &x, qreal &y, qreal &z)
126 x = (previousAccelerationX * (1 - kFilteringFactor)) + (x * kFilteringFactor);
127 y = (previousAccelerationY * (1 - kFilteringFactor)) + (y * kFilteringFactor);
128 z = (previousAccelerationZ * (1 - kFilteringFactor)) + (z * kFilteringFactor);
130 previousAccelerationX = x;
131 previousAccelerationY = y;
132 previousAccelerationZ = z;
136 * Gets the raw acceleration data from accelerometer.
138 * @param x accelerometer's x-axis input
139 * @param y accelerometer's y-axis input
140 * @param z accelerometer's z-axis input
142 void Accelerometer::getAcceleration(qreal &x, qreal &y, qreal &z)
145 fileReader->ReadLine(x,y,z);
147 QDBusConnection connection(QDBusConnection::systemBus());
148 if (connection.isConnected()) {
149 QDBusInterface interface("com.nokia.mce", "/com/nokia/icd", QString(), connection);
150 QDBusPendingReply<QString, QString, QString, int, int, int> reply;
151 reply = interface.asyncCall("get_device_orientation");
152 reply.waitForFinished();
153 x = static_cast<qreal>(reply.argumentAt<3>()) / 1000;
154 y = static_cast<qreal>(reply.argumentAt<4>()) / 1000;
155 z = static_cast<qreal>(reply.argumentAt<5>()) / 1000;
161 * Get the x calibration component.
163 * @return calibrationX x calibration component
165 qreal Accelerometer::getCalibrationX()
171 * Get the y calibration component.
173 * @return calibrationY y calibration component
175 qreal Accelerometer::getCalibrationY()
181 * Get the z calibration component.
183 * @return calibrationZ z calibration component
185 qreal Accelerometer::getCalibrationZ()