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()));
29 Accelerometer::Accelerometer(int p_SampleRate)
31 calculate = new Calculate();
33 timer = new QTimer(this);
34 connect(timer, SIGNAL(timeout()), this, SLOT(processData()));
35 sampleRate = p_SampleRate;
40 * Default destructor for Accelerometer class
43 Accelerometer::~Accelerometer() {
50 void Accelerometer::start() {
53 timer->start(sampleRate);
61 void Accelerometer::initValues() {
68 previousAccelerationX=0;
69 previousAccelerationY=0;
70 previousAccelerationZ=0;
73 currentAcceleration=0;
74 previousAcceleration=0;
79 lastDistanceTraveled=0;
82 reverseAcceleration = false;
86 * Calibrate. Purpose of this function is to calibrate
87 * accelerometer when stationary.
90 void Accelerometer::calibrate(void) {
91 QFile file(kFileName);
92 if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) return;
94 unsigned int iteration;
97 QRegExp rx("([0-9-]+) ([0-9-]+) ([0-9-]+)");
100 // Read data, parse with regular expressions and process it
101 line = file.readLine();
104 int Sample_X = rx.cap(1).toInt();
105 int Sample_Y = rx.cap(2).toInt();
106 int Sample_Z = rx.cap(3).toInt();
108 sstatex += Sample_X; // Accumulate Samples
109 sstatey += Sample_Y; // for all axes.
113 }while(iteration!=1024); // 1024 times
115 sstatex = sstatex>>10; // division by 1024
116 sstatey = sstatey>>10;
117 sstatez = sstatez>>10;
126 void Accelerometer::stop() {
131 * Set the sample rate of accelerometer
133 * @param int pSampleRate desired sample rate
135 void Accelerometer::setSampleRate(int pSampleRate) {
136 sampleRate = pSampleRate;
139 int Accelerometer::getSampleRate() {
143 qreal Accelerometer::getCurrentAcceleration() {
144 return currentAcceleration;
147 qreal Accelerometer::getPreviousTotalAcceleration() {
148 return previousAcceleration;
151 qreal Accelerometer::getTotalAcceleration() {
152 return totalAcceleration;
155 qreal Accelerometer::getDistanceTraveled() {
156 return distanceTraveled;
159 qreal Accelerometer::getLastDistanceTraveled() {
160 return lastDistanceTraveled;
163 qreal Accelerometer::getAverageSpeed() {
167 qreal Accelerometer::getTrueAccelerationX() {
168 return trueAccelerationX;
171 qreal Accelerometer::getTrueAccelerationY() {
172 return trueAccelerationY;
175 qreal Accelerometer::getTrueAccelerationZ() {
176 return trueAccelerationZ;
179 qreal Accelerometer::getPreviousSpeed() {
180 return previousSpeed;
183 qreal Accelerometer::getCurrentSpeed() {
187 qreal Accelerometer::getIntervalTime() {
192 * Processes Accelerometer data
195 void Accelerometer::processData()
197 QFile file(kFileName);
198 if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) return;
200 // Read data, parse with regular expressions and process it
201 QByteArray line = file.readLine();
203 QRegExp rx("([0-9-]+) ([0-9-]+) ([0-9-]+)");
206 smoothData(rx.cap(1).toInt(), rx.cap(2).toInt(), rx.cap(3).toInt());
209 trueAccelerationX = accelerationX - sstatex;
210 trueAccelerationY = accelerationY - sstatey;
211 trueAccelerationZ = accelerationZ - sstatez;
213 // Discrimination window for acceleration values
214 if (trueAccelerationX <= 30 && trueAccelerationX >= -30) { trueAccelerationX = 0; }
215 if (trueAccelerationY <= 30 && trueAccelerationY >= -30) { trueAccelerationY = 0; }
216 if (trueAccelerationZ <= 30 && trueAccelerationZ >= -30) { trueAccelerationZ = 0; }
218 trueAccelerationX = (accelerationX - previousAccelerationX) / 1000 * kGravity;
219 trueAccelerationY = (accelerationY - previousAccelerationY) / 1000 * kGravity;
220 trueAccelerationZ = (accelerationZ - previousAccelerationZ) / 1000 * kGravity;
222 previousAccelerationX = accelerationX;
223 previousAccelerationY = accelerationY;
224 previousAccelerationZ = accelerationZ;
226 currentAcceleration = sqrt(trueAccelerationX * trueAccelerationX +
227 trueAccelerationY * trueAccelerationY +
228 trueAccelerationZ * trueAccelerationZ );
230 totalAcceleration = currentAcceleration - previousAcceleration;
231 previousAcceleration = currentAcceleration;
233 // Measure time interval
234 intervalTime = now.restart(); // millisecs to secs
235 intervalTime = intervalTime/1000;
236 totalTime = totalTime + intervalTime;
238 // Filter out acceleration caused by noise.
239 if (fabs(currentAcceleration) < 0.09) {
243 // Using calculate class to calculate velocity and distance etc.
244 calculate->CalculateParameters(currentAcceleration,intervalTime );
246 currentSpeed = calculate->CurrentSpeed();
247 distanceTraveled = calculate->DistanceTraveled();
252 * Smooths Accelerometer data
254 * @param qreal x Accelerometers x-axis raw input
255 * @param qreal y Accelerometers y-axis raw input
256 * @param qreal z Accelerometers z-axis raw input
258 void Accelerometer::smoothData(qreal x, qreal y, qreal z) {
263 accelerationX = previousAccelerationX + (accelerationX-previousAccelerationX) * kFilteringFactor;
264 accelerationY = previousAccelerationY + (accelerationY-previousAccelerationY) * kFilteringFactor;
265 accelerationZ = previousAccelerationZ + (accelerationZ-previousAccelerationZ) * kFilteringFactor;