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 QFile file(kFileName);
101 if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) return;
103 unsigned int iteration = 0;
106 QRegExp rx("([0-9-]+) ([0-9-]+) ([0-9-]+)");
109 // Read data, parse with regular expressions and process it
110 line = file.readLine();
113 int sampleX = rx.cap(1).toInt();
114 int sampleY = rx.cap(2).toInt();
115 int sampleZ = rx.cap(3).toInt();
117 calibrationX += sampleX; // Accumulate Samples
118 calibrationY += sampleY; // for all axes.
119 calibrationZ += sampleZ;
122 } while(iteration!=1024); // 1024 times
124 calibrationX = calibrationX>>10; // division by 1024
125 calibrationY = calibrationY>>10;
126 calibrationZ = calibrationZ>>10;
135 void Accelerometer::stop()
141 * Set the sample rate of accelerometer
143 * @param pSampleRate desired sample rate
145 void Accelerometer::setSampleRate(int pSampleRate)
147 sampleRate = pSampleRate;
151 * Get the sample rate of accelerometer
153 * @return sampleRate the sample rate of the accelerometer in milliseconds
155 int Accelerometer::getSampleRate()
160 qreal Accelerometer::getCurrentAcceleration()
162 return currentAcceleration;
165 qreal Accelerometer::getPreviousTotalAcceleration()
167 return previousAcceleration;
170 qreal Accelerometer::getTotalAcceleration()
172 return totalAcceleration;
175 qreal Accelerometer::getDistanceTraveled()
177 return distanceTraveled;
180 qreal Accelerometer::getLastDistanceTraveled()
182 return lastDistanceTraveled;
185 qreal Accelerometer::getAverageSpeed()
190 qreal Accelerometer::getTrueAccelerationX()
192 return trueAccelerationX;
195 qreal Accelerometer::getTrueAccelerationY()
197 return trueAccelerationY;
200 qreal Accelerometer::getTrueAccelerationZ()
202 return trueAccelerationZ;
205 qreal Accelerometer::getPreviousSpeed()
207 return previousSpeed;
210 qreal Accelerometer::getCurrentSpeed()
215 qreal Accelerometer::getIntervalTime()
220 qreal Accelerometer::getTotalTime()
226 * Processes Accelerometer data
228 * Opens the accelerometer value file for reading and reads and parses accelerometer values.
229 * Forwards data to Calculate class for processing
232 void Accelerometer::processData()
234 QFile file(kFileName);
235 if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) return;
237 // Read data, parse with regular expressions and process it
238 QByteArray line = file.readLine();
239 QRegExp rx("([0-9-]+) ([0-9-]+) ([0-9-]+)");
242 smoothData(rx.cap(1).toInt(), rx.cap(2).toInt(), rx.cap(3).toInt());
245 trueAccelerationX = accelerationX - calibrationX;
246 trueAccelerationY = accelerationY - calibrationY;
247 trueAccelerationZ = accelerationZ - calibrationZ;
249 // Discrimination window for acceleration values
250 if (trueAccelerationX <= 30 && trueAccelerationX >= -30) { trueAccelerationX = 0; }
251 if (trueAccelerationY <= 30 && trueAccelerationY >= -30) { trueAccelerationY = 0; }
252 if (trueAccelerationZ <= 30 && trueAccelerationZ >= -30) { trueAccelerationZ = 0; }
254 trueAccelerationX = (accelerationX - previousAccelerationX) /*/ 1000 * kGravity*/;
255 trueAccelerationY = (accelerationY - previousAccelerationY) /*/ 1000 * kGravity*/;
256 trueAccelerationZ = (accelerationZ - previousAccelerationZ) /*/ 1000 * kGravity*/;
258 previousAccelerationX = accelerationX;
259 previousAccelerationY = accelerationY;
260 previousAccelerationZ = accelerationZ;
262 currentAcceleration = sqrt(trueAccelerationX * trueAccelerationX +
263 trueAccelerationY * trueAccelerationY +
264 trueAccelerationZ * trueAccelerationZ );
266 totalAcceleration = currentAcceleration - previousAcceleration;
267 previousAcceleration = currentAcceleration;
269 // Measure time interval
270 intervalTime = now.restart(); // millisecs to secs
271 intervalTime = intervalTime/1000;
272 totalTime = totalTime + intervalTime;
274 // Filter out acceleration caused by noise.
275 if (fabs(currentAcceleration) < 0.09) {
279 // Using calculate class to calculate velocity and distance etc.
280 calculate->calculateParameters(currentAcceleration,intervalTime );
282 currentSpeed = calculate->getCurrentSpeed();
283 distanceTraveled = calculate->getDistanceTraveled();
289 * Smooths Accelerometer data
291 * @param x accelerometer's x-axis input
292 * @param y accelerometer's y-axis input
293 * @param z accelerometer's z-axis input
295 void Accelerometer::smoothData(qreal x, qreal y, qreal z)
301 accelerationX = previousAccelerationX + (accelerationX-previousAccelerationX) * kFilteringFactor;
302 accelerationY = previousAccelerationY + (accelerationY-previousAccelerationY) * kFilteringFactor;
303 accelerationZ = previousAccelerationZ + (accelerationZ-previousAccelerationZ) * kFilteringFactor;