1 #include "accelerometer.h"
9 #define kFilteringFactor 0.1
11 #define kFileName "/sys/class/i2c-adapter/i2c-3/3-001d/coord"
13 static int sampleIndex=0;
16 * Default constructor for Accelerometer class
19 Accelerometer::Accelerometer()
21 calculate = new Calculate();
23 timer = new QTimer(this);
24 connect(timer, SIGNAL(timeout()), this, SLOT(processData()));
30 * Constructor for Accelerometer class that takes accelerometer sample rate as parameter
32 * @param p_SampleRate the desired sample rate of accelerometer in milliseconds
34 Accelerometer::Accelerometer(int p_SampleRate)
36 calculate = new Calculate();
38 timer = new QTimer(this);
39 connect(timer, SIGNAL(timeout()), this, SLOT(processData()));
40 sampleRate = p_SampleRate;
45 * Default destructor for Accelerometer class
48 Accelerometer::~Accelerometer()
56 void Accelerometer::start()
60 timer->start(sampleRate);
68 void Accelerometer::initValues()
74 trueAccelerationX = 0;
75 trueAccelerationY = 0;
76 trueAccelerationZ = 0;
77 previousAccelerationX = 0;
78 previousAccelerationY = 0;
79 previousAccelerationZ = 0;
82 currentAcceleration = 0;
83 previousAcceleration = 0;
84 totalAcceleration = 0;
88 lastDistanceTraveled = 0;
98 * Calibrate. Purpose of this function is to calibrate
99 * accelerometer when stationary.
102 void Accelerometer::calibrate(void)
104 unsigned int iteration = 0;
107 // Opening the file must be done inside the loop
108 // or else the values obtained from file.readLine();
109 // will be empty for all but the first iteration
110 QFile file(kFileName);
111 if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
117 QRegExp rx("([0-9-]+) ([0-9-]+) ([0-9-]+)");
119 // Read data, parse with regular expressions and process it
120 line = file.readLine();
123 int sampleX = rx.cap(1).toInt();
124 int sampleY = rx.cap(2).toInt();
125 int sampleZ = rx.cap(3).toInt();
127 calibrationX = calibrationX + sampleX; // Accumulate Samples
128 calibrationY = calibrationY + sampleY; // for all axes.
129 calibrationZ = calibrationZ + sampleZ;
134 } while(iteration != 1024); // 1024 times
136 calibrationX = calibrationX>>10; // division by 1024
137 calibrationY = calibrationY>>10;
138 calibrationZ = calibrationZ>>10;
145 void Accelerometer::stop()
151 * Set the sample rate of accelerometer
153 * @param pSampleRate desired sample rate
155 void Accelerometer::setSampleRate(int pSampleRate)
157 sampleRate = pSampleRate;
161 * Get the sample rate of accelerometer
163 * @return sampleRate the sample rate of the accelerometer in milliseconds
165 int Accelerometer::getSampleRate()
170 qreal Accelerometer::getCurrentAcceleration()
172 return currentAcceleration;
175 qreal Accelerometer::getPreviousTotalAcceleration()
177 return previousAcceleration;
180 qreal Accelerometer::getTotalAcceleration()
182 return totalAcceleration;
185 qreal Accelerometer::getDistanceTraveled()
187 return distanceTraveled;
190 qreal Accelerometer::getLastDistanceTraveled()
192 return lastDistanceTraveled;
195 qreal Accelerometer::getAverageSpeed()
200 qreal Accelerometer::getTrueAccelerationX()
202 return trueAccelerationX;
205 qreal Accelerometer::getTrueAccelerationY()
207 return trueAccelerationY;
210 qreal Accelerometer::getTrueAccelerationZ()
212 return trueAccelerationZ;
215 qreal Accelerometer::getPreviousSpeed()
217 return previousSpeed;
220 qreal Accelerometer::getCurrentSpeed()
225 qreal Accelerometer::getIntervalTime()
230 qreal Accelerometer::getTotalTime()
235 int Accelerometer::getCalibrationX()
240 int Accelerometer::getCalibrationY()
245 int Accelerometer::getCalibrationZ()
251 * Processes Accelerometer data
253 * Opens the accelerometer value file for reading and reads and parses accelerometer values.
254 * Forwards data to Calculate class for processing
257 void Accelerometer::processData()
259 QFile file(kFileName);
260 if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
265 // Read data, parse with regular expressions and process it
266 QByteArray line = file.readLine();
267 QRegExp rx("([0-9-]+) ([0-9-]+) ([0-9-]+)");
270 smoothData(rx.cap(1).toInt(), rx.cap(2).toInt(), rx.cap(3).toInt());
273 accelerationX = accelerationX - calibrationX;
274 accelerationX = accelerationY - calibrationY;
275 accelerationX = accelerationZ - calibrationZ;
277 // If the function is run the first time, make sure that there
278 // are no differences with previous and current acceleration
280 previousAccelerationX = accelerationX;
281 previousAccelerationY = accelerationY;
282 previousAccelerationZ = accelerationZ;
286 // Discrimination window for acceleration values
287 /*if ( fabs(accelerationX) < 20 ) { accelerationX = 0; }
288 if ( fabs(accelerationY) < 20 ) { accelerationY = 0; }
289 if ( fabs(accelerationZ) < 20 ) { accelerationZ = 0; }*/
291 // Calculate the current acceleration for each axis
292 trueAccelerationX = (accelerationX - previousAccelerationX) /*/ 1000 * kGravity*/;
293 trueAccelerationY = (accelerationY - previousAccelerationY) /*/ 1000 * kGravity*/;
294 trueAccelerationZ = (accelerationZ - previousAccelerationZ) /*/ 1000 * kGravity*/;
296 // Discrimination window for acceleration values
297 if ( fabs(trueAccelerationX) < 20 ) { trueAccelerationX = 0; }
298 if ( fabs(trueAccelerationY) < 20 ) { trueAccelerationY = 0; }
299 if ( fabs(trueAccelerationZ) < 20 ) { trueAccelerationZ = 0; }
301 previousAccelerationX = accelerationX;
302 previousAccelerationY = accelerationY;
303 previousAccelerationZ = accelerationZ;
305 currentAcceleration = sqrt(trueAccelerationX * trueAccelerationX +
306 trueAccelerationY * trueAccelerationY +
307 trueAccelerationZ * trueAccelerationZ );
309 // Discrimination window for currentAcceleration
310 if ( fabs(currentAcceleration) < 20 ) { currentAcceleration = 0; }
312 // Measure time interval
313 intervalTime = now.restart();
314 intervalTime = intervalTime/1000; // millisecs to secs
315 totalTime = totalTime + intervalTime;
317 // Using calculate class to calculate velocity and distance etc.
318 calculate->calculateParameters(currentAcceleration,intervalTime );
320 currentSpeed = calculate->getCurrentSpeed();
321 distanceTraveled = calculate->getDistanceTraveled();
327 * Smooths Accelerometer data
329 * @param x accelerometer's x-axis input
330 * @param y accelerometer's y-axis input
331 * @param z accelerometer's z-axis input
333 void Accelerometer::smoothData(qreal x, qreal y, qreal z)
340 accelerationX = previousAccelerationX + (accelerationX-previousAccelerationX) * kFilteringFactor;
341 accelerationY = previousAccelerationY + (accelerationY-previousAccelerationY) * kFilteringFactor;
342 accelerationZ = previousAccelerationZ + (accelerationZ-previousAccelerationZ) * kFilteringFactor;