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