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