8daf06f9ee867cf4b4b26749ca19c667714b8056
[speedfreak] / Client / accelerometer.cpp
1 /*
2  * Accelerometer class to access the device accelerometer
3  *
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
8  */
9
10 #include "accelerometer.h"
11
12 #include <QDBusConnection>
13 #include <QDBusInterface>
14 #include <QDBusPendingReply>
15
16 #define kFilteringFactor 0.2
17
18 /**
19  * Default constructor for Accelerometer class
20  *
21  */
22 Accelerometer::Accelerometer()
23 {
24     initValues();
25 }
26
27 /**
28  * Default destructor for Accelerometer class
29  *
30  */
31 Accelerometer::~Accelerometer()
32 {
33 }
34
35 /**
36  * Init class members
37  *
38  */
39 void Accelerometer::initValues()
40 {
41     previousAccelerationX = 0;
42     previousAccelerationY = 0;
43     previousAccelerationZ = 0;
44     calibrationX = 0;
45     calibrationY = 0;
46     calibrationZ = 0;
47 }
48
49 /**
50   * Calibrate. Purpose of this function is to calibrate
51   * accelerometer when stationary.
52   *
53   */
54 void Accelerometer::calibrate(void)
55 {
56     unsigned int iteration = 0;
57     qreal sampleX, sampleY, sampleZ;
58
59     do {
60
61         getAcceleration(sampleX, sampleY, sampleZ);
62
63         calibrationX += sampleX; // Accumulate Samples
64         calibrationY += sampleY; // for all axes.
65         calibrationZ += sampleZ;
66
67         iteration++;
68
69     } while(iteration != 1024);        // 1024 times
70
71     calibrationX = calibrationX/1024;  // division by 1024
72     calibrationY = calibrationY/1024;
73     calibrationZ = calibrationZ/1024;
74 }
75
76 /**
77  * Smooths Accelerometer data by applying a low pass filter to data
78  *
79  * @param x accelerometer's x-axis input
80  * @param y accelerometer's y-axis input
81  * @param z accelerometer's z-axis input
82  */
83 void Accelerometer::smoothData(qreal &x, qreal &y, qreal &z)
84 {
85     x = (previousAccelerationX * (1 - kFilteringFactor)) + (x * kFilteringFactor);
86     y = (previousAccelerationY * (1 - kFilteringFactor)) + (y * kFilteringFactor);
87     z = (previousAccelerationZ * (1 - kFilteringFactor)) + (z * kFilteringFactor);
88
89     previousAccelerationX = x;
90     previousAccelerationY = y;
91     previousAccelerationZ = z;
92 }
93
94 /**
95  * Gets the raw acceleration data from accelerometer
96  *
97  * @param x accelerometer's x-axis input
98  * @param y accelerometer's y-axis input
99  * @param z accelerometer's z-axis input
100  */
101 void Accelerometer::getAcceleration(qreal &x, qreal &y, qreal &z)
102 {
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;
112     }
113 }
114
115 /**
116  * Get the x calibration component
117  *
118  * @return calibrationX x calibration component
119  */
120 qreal Accelerometer::getCalibrationX()
121 {
122     return calibrationX;
123 }
124
125 /**
126  * Get the y calibration component
127  *
128  * @return calibrationY y calibration component
129  */
130 qreal Accelerometer::getCalibrationY()
131 {
132     return calibrationY;
133 }
134
135 /**
136  * Get the z calibration component
137  *
138  * @return calibrationZ z calibration component
139  */
140 qreal Accelerometer::getCalibrationZ()
141 {
142     return calibrationZ;
143 }