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