helpForUsers files 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 <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
10  */
11
12 //#define FROM_FILE //Use this flag to read acceleration data from file, set also filename using fileReader->setFileName
13 #include "accelerometer.h"
14
15 #include <QDBusConnection>
16 #include <QDBusInterface>
17 #include <QDBusPendingReply>
18
19 #define kFilteringFactor 0.2
20 #define kIterations      100
21
22 /**
23   * Default constructor for Accelerometer class.
24   *
25   */
26 Accelerometer::Accelerometer()
27 {
28     initValues();
29     calibrateDialog = NULL;
30     //fileReader = new filereader();
31     //fileReader->setFileName("45.txt");
32 }
33
34 /**
35   * Default destructor for Accelerometer class.
36   * Deletes all dynamic objects and sets them to NULL.
37   */
38 Accelerometer::~Accelerometer()
39 {
40     if(calibrateDialog)
41         delete calibrateDialog;
42     if(fileReader)
43         delete fileReader;
44 }
45
46 /**
47   * Init class members.
48   *
49   */
50 void Accelerometer::initValues()
51 {
52     previousAccelerationX = 0;
53     previousAccelerationY = 0;
54     previousAccelerationZ = 0;
55     calibrationX = 0;
56     calibrationY = 0;
57     calibrationZ = 0;
58     fileReader = NULL;
59 }
60
61 /**
62   * Calibrate. Purpose of this function is to calibrate
63   * accelerometer when stationary.
64   *
65   */
66 void Accelerometer::calibrate(void)
67 {
68     unsigned int iteration = 0;
69     qreal sampleX, sampleY, sampleZ;
70
71     calibrateDialog = new CalibrateDialog();
72     calibrateDialog->show();
73     calibrateDialog->resetProgressValue();
74     calibrateDialog->setMaxValue( kIterations + 1 );
75
76 #ifdef FROM_FILE
77     unsigned int numberOfIterations = 50;
78     do {
79         calibrateDialog->setProgressValue(iteration);
80
81         fileReader->ReadLine(sampleX,sampleY,sampleZ);
82         //getAcceleration(sampleX, sampleY, sampleZ);
83
84         calibrationX += sampleX; // Accumulate Samples
85         calibrationY += sampleY; // for all axes.
86         calibrationZ += sampleZ;
87
88         iteration++;
89
90     } while(iteration < numberOfIterations);        // kIterations times
91
92     calibrationX = calibrationX/numberOfIterations;  // division by kIterations
93     calibrationY = calibrationY/numberOfIterations;
94     calibrationZ = calibrationZ/numberOfIterations;
95
96 #else
97     do {
98         calibrateDialog->setProgressValue(iteration);
99
100         getAcceleration(sampleX, sampleY, sampleZ);
101
102         calibrationX += sampleX; // Accumulate Samples
103         calibrationY += sampleY; // for all axes.
104         calibrationZ += sampleZ;
105
106         iteration++;
107
108     } while(iteration != kIterations);        // kIterations times
109
110     calibrationX = calibrationX/kIterations;  // division by kIterations
111     calibrationY = calibrationY/kIterations;
112     calibrationZ = calibrationZ/kIterations;
113 #endif
114     calibrateDialog->close();
115 }
116
117 /**
118   * Smooths Accelerometer data by applying a low pass filter to data.
119   *
120   * @param x accelerometer's x-axis input
121   * @param y accelerometer's y-axis input
122   * @param z accelerometer's z-axis input
123   */
124 void Accelerometer::smoothData(qreal &x, qreal &y, qreal &z)
125 {
126     x = (previousAccelerationX * (1 - kFilteringFactor)) + (x * kFilteringFactor);
127     y = (previousAccelerationY * (1 - kFilteringFactor)) + (y * kFilteringFactor);
128     z = (previousAccelerationZ * (1 - kFilteringFactor)) + (z * kFilteringFactor);
129
130     previousAccelerationX = x;
131     previousAccelerationY = y;
132     previousAccelerationZ = z;
133 }
134
135 /**
136   * Gets the raw acceleration data from accelerometer.
137   *
138   * @param x accelerometer's x-axis input
139   * @param y accelerometer's y-axis input
140   * @param z accelerometer's z-axis input
141   */
142 void Accelerometer::getAcceleration(qreal &x, qreal &y, qreal &z)
143 {
144 #ifdef FROM_FILE
145     fileReader->ReadLine(x,y,z);
146 #else
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;
156     }
157 #endif
158 }
159
160 /**
161   * Get the x calibration component.
162   *
163   * @return calibrationX x calibration component
164   */
165 qreal Accelerometer::getCalibrationX()
166 {
167     return calibrationX;
168 }
169
170 /**
171   * Get the y calibration component.
172   *
173   * @return calibrationY y calibration component
174   */
175 qreal Accelerometer::getCalibrationY()
176 {
177     return calibrationY;
178 }
179
180 /**
181   * Get the z calibration component.
182   *
183   * @return calibrationZ z calibration component
184   */
185 qreal Accelerometer::getCalibrationZ()
186 {
187     return calibrationZ;
188 }