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()
221 * Processes Accelerometer data
223 * Opens the accelerometer value file for reading and reads and parses accelerometer values.
224 * Forwards data to Calculate class for processing
227 void Accelerometer::processData()
229 QFile file(kFileName);
230 if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) return;
232 // Read data, parse with regular expressions and process it
233 QByteArray line = file.readLine();
234 QRegExp rx("([0-9-]+) ([0-9-]+) ([0-9-]+)");
237 smoothData(rx.cap(1).toInt(), rx.cap(2).toInt(), rx.cap(3).toInt());
240 trueAccelerationX = accelerationX - calibrationX;
241 trueAccelerationY = accelerationY - calibrationY;
242 trueAccelerationZ = accelerationZ - calibrationZ;
244 // Discrimination window for acceleration values
245 if (trueAccelerationX <= 30 && trueAccelerationX >= -30) { trueAccelerationX = 0; }
246 if (trueAccelerationY <= 30 && trueAccelerationY >= -30) { trueAccelerationY = 0; }
247 if (trueAccelerationZ <= 30 && trueAccelerationZ >= -30) { trueAccelerationZ = 0; }
249 trueAccelerationX = (accelerationX - previousAccelerationX) /*/ 1000 * kGravity*/;
250 trueAccelerationY = (accelerationY - previousAccelerationY) /*/ 1000 * kGravity*/;
251 trueAccelerationZ = (accelerationZ - previousAccelerationZ) /*/ 1000 * kGravity*/;
253 previousAccelerationX = accelerationX;
254 previousAccelerationY = accelerationY;
255 previousAccelerationZ = accelerationZ;
257 currentAcceleration = sqrt(trueAccelerationX * trueAccelerationX +
258 trueAccelerationY * trueAccelerationY +
259 trueAccelerationZ * trueAccelerationZ );
261 totalAcceleration = currentAcceleration - previousAcceleration;
262 previousAcceleration = currentAcceleration;
264 // Measure time interval
265 intervalTime = now.restart(); // millisecs to secs
266 intervalTime = intervalTime/1000;
267 totalTime = totalTime + intervalTime;
269 // Filter out acceleration caused by noise.
270 if (fabs(currentAcceleration) < 0.09) {
274 // Using calculate class to calculate velocity and distance etc.
275 calculate->CalculateParameters(currentAcceleration,intervalTime );
277 currentSpeed = calculate->CurrentSpeed();
278 distanceTraveled = calculate->DistanceTraveled();
284 * Smooths Accelerometer data
286 * @param x accelerometer's x-axis input
287 * @param y accelerometer's y-axis input
288 * @param z accelerometer's z-axis input
290 void Accelerometer::smoothData(qreal x, qreal y, qreal z)
296 accelerationX = previousAccelerationX + (accelerationX-previousAccelerationX) * kFilteringFactor;
297 accelerationY = previousAccelerationY + (accelerationY-previousAccelerationY) * kFilteringFactor;
298 accelerationZ = previousAccelerationZ + (accelerationZ-previousAccelerationZ) * kFilteringFactor;