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()
76 previousAccelerationX=0;
77 previousAccelerationY=0;
78 previousAccelerationZ=0;
81 currentAcceleration=0;
82 previousAcceleration=0;
87 lastDistanceTraveled=0;
90 reverseAcceleration = false;
94 * Calibrate. Purpose of this function is to calibrate
95 * accelerometer when stationary.
98 void Accelerometer::calibrate(void)
100 unsigned int iteration = 0;
103 // Opening the file must be done inside the loop
104 // or else the values obtained from file.readLine();
105 // will be empty for all but the first iteration
106 QFile file(kFileName);
107 if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
113 QRegExp rx("([0-9-]+) ([0-9-]+) ([0-9-]+)");
115 // Read data, parse with regular expressions and process it
116 line = file.readLine();
119 int sampleX = rx.cap(1).toInt();
120 int sampleY = rx.cap(2).toInt();
121 int sampleZ = rx.cap(3).toInt();
123 calibrationX = calibrationX + sampleX; // Accumulate Samples
124 calibrationY = calibrationY + sampleY; // for all axes.
125 calibrationZ = calibrationZ + sampleZ;
130 } while(iteration != 1024); // 1024 times
132 calibrationX = calibrationX>>10; // division by 1024
133 calibrationY = calibrationY>>10;
134 calibrationZ = calibrationZ>>10;
141 void Accelerometer::stop()
147 * Set the sample rate of accelerometer
149 * @param pSampleRate desired sample rate
151 void Accelerometer::setSampleRate(int pSampleRate)
153 sampleRate = pSampleRate;
157 * Get the sample rate of accelerometer
159 * @return sampleRate the sample rate of the accelerometer in milliseconds
161 int Accelerometer::getSampleRate()
166 qreal Accelerometer::getCurrentAcceleration()
168 return currentAcceleration;
171 qreal Accelerometer::getPreviousTotalAcceleration()
173 return previousAcceleration;
176 qreal Accelerometer::getTotalAcceleration()
178 return totalAcceleration;
181 qreal Accelerometer::getDistanceTraveled()
183 return distanceTraveled;
186 qreal Accelerometer::getLastDistanceTraveled()
188 return lastDistanceTraveled;
191 qreal Accelerometer::getAverageSpeed()
196 qreal Accelerometer::getTrueAccelerationX()
198 return trueAccelerationX;
201 qreal Accelerometer::getTrueAccelerationY()
203 return trueAccelerationY;
206 qreal Accelerometer::getTrueAccelerationZ()
208 return trueAccelerationZ;
211 qreal Accelerometer::getPreviousSpeed()
213 return previousSpeed;
216 qreal Accelerometer::getCurrentSpeed()
221 qreal Accelerometer::getIntervalTime()
226 qreal Accelerometer::getTotalTime()
232 * Processes Accelerometer data
234 * Opens the accelerometer value file for reading and reads and parses accelerometer values.
235 * Forwards data to Calculate class for processing
238 void Accelerometer::processData()
240 QFile file(kFileName);
241 if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
246 // Read data, parse with regular expressions and process it
247 QByteArray line = file.readLine();
248 QRegExp rx("([0-9-]+) ([0-9-]+) ([0-9-]+)");
251 smoothData(rx.cap(1).toInt(), rx.cap(2).toInt(), rx.cap(3).toInt());
254 accelerationX = accelerationX - calibrationX;
255 accelerationX = accelerationY - calibrationY;
256 accelerationX = accelerationZ - calibrationZ;
258 // If the function is run the first time, make sure that there
259 // are no differences with previous and current acceleration
261 previousAccelerationX = accelerationX;
262 previousAccelerationY = accelerationY;
263 previousAccelerationZ = accelerationZ;
267 // Discrimination window for acceleration values
268 /*if ( fabs(accelerationX) < 20 ) { accelerationX = 0; }
269 if ( fabs(accelerationY) < 20 ) { accelerationY = 0; }
270 if ( fabs(accelerationZ) < 20 ) { accelerationZ = 0; }*/
272 // Calculate the current acceleration for each axis
273 trueAccelerationX = (accelerationX - previousAccelerationX) /*/ 1000 * kGravity*/;
274 trueAccelerationY = (accelerationY - previousAccelerationY) /*/ 1000 * kGravity*/;
275 trueAccelerationZ = (accelerationZ - previousAccelerationZ) /*/ 1000 * kGravity*/;
277 // Discrimination window for acceleration values
278 if ( fabs(trueAccelerationX) < 20 ) { trueAccelerationX = 0; }
279 if ( fabs(trueAccelerationY) < 20 ) { trueAccelerationY = 0; }
280 if ( fabs(trueAccelerationZ) < 20 ) { trueAccelerationZ = 0; }
282 previousAccelerationX = accelerationX;
283 previousAccelerationY = accelerationY;
284 previousAccelerationZ = accelerationZ;
286 currentAcceleration = sqrt(trueAccelerationX * trueAccelerationX +
287 trueAccelerationY * trueAccelerationY +
288 trueAccelerationZ * trueAccelerationZ );
290 // Discrimination window for currentAcceleration
291 if ( fabs(currentAcceleration) < 20 ) { currentAcceleration = 0; }
293 // Measure time interval
294 intervalTime = now.restart();
295 intervalTime = intervalTime/1000; // millisecs to secs
296 totalTime = totalTime + intervalTime;
298 // Using calculate class to calculate velocity and distance etc.
299 calculate->calculateParameters(currentAcceleration,intervalTime );
301 currentSpeed = calculate->getCurrentSpeed();
302 distanceTraveled = calculate->getDistanceTraveled();
308 * Smooths Accelerometer data
310 * @param x accelerometer's x-axis input
311 * @param y accelerometer's y-axis input
312 * @param z accelerometer's z-axis input
314 void Accelerometer::smoothData(qreal x, qreal y, qreal z)
320 accelerationX = previousAccelerationX + (accelerationX-previousAccelerationX) * kFilteringFactor;
321 accelerationY = previousAccelerationY + (accelerationY-previousAccelerationY) * kFilteringFactor;
322 accelerationZ = previousAccelerationZ + (accelerationZ-previousAccelerationZ) * kFilteringFactor;