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