1 #include "accelerometer.h"
9 #define kFilteringFactor 0.1
12 static int sampleIndex=0;
14 Accelerometer::Accelerometer()
16 QTimer *timer = new QTimer(this);
17 connect(timer, SIGNAL(timeout()), this, SLOT(processData()));
19 timer->start(sampleRate);
25 Accelerometer::~Accelerometer() {
28 void Accelerometer::start() {
29 timer->start(sampleRate);
33 void Accelerometer::initValues() {
40 previousAccelerationX=0;
41 previousAccelerationY=0;
42 previousAccelerationZ=0;
45 currentAcceleration=0;
46 previousAcceleration=0;
51 lastDistanceTraveled=0;
56 void Accelerometer::stop() {
60 void Accelerometer::setSampleRate(int pSampleRate) {
61 sampleRate = pSampleRate;
64 int Accelerometer::getSampleRate() {
68 qreal Accelerometer::getCurrentAcceleration() {
69 return currentAcceleration;
72 qreal Accelerometer::getPreviousTotalAcceleration() {
73 return previousAcceleration;
76 qreal Accelerometer::getTotalAcceleration() {
77 return totalAcceleration;
80 qreal Accelerometer::getDistanceTraveled() {
81 return distanceTraveled;
84 qreal Accelerometer::getLastDistanceTraveled() {
85 return lastDistanceTraveled;
88 qreal Accelerometer::getAverageSpeed() {
92 qreal Accelerometer::getTrueAccelerationX() {
93 return trueAccelerationX;
96 qreal Accelerometer::getTrueAccelerationY() {
97 return trueAccelerationY;
100 qreal Accelerometer::getTrueAccelerationZ() {
101 return trueAccelerationZ;
104 qreal Accelerometer::getPreviousSpeed() {
105 return previousSpeed;
108 qreal Accelerometer::getCurrentSpeed() {
112 qreal Accelerometer::getintervalTime() {
117 * Processes Accelerometer data
120 void Accelerometer::processData()
122 QFile file("/sys/class/i2c-adapter/i2c-3/3-001d/coord");
123 if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
126 // Read data, parse with regular expressions and process it
127 QByteArray line = file.readLine();
128 QRegExp rx("([0-9-]+) ([0-9-]+) ([0-9-]+)");
131 smoothData(rx.cap(1).toInt(), rx.cap(2).toInt(), rx.cap(3).toInt());
133 trueAccelerationX = (accelerationX - previousAccelerationX)/1000*kGravity;
134 trueAccelerationY = (accelerationY - previousAccelerationY)/1000*kGravity;
135 trueAccelerationZ = (accelerationZ - previousAccelerationZ)/1000*kGravity;
137 previousAccelerationX = accelerationX;
138 previousAccelerationY = accelerationY;
139 previousAccelerationZ = accelerationZ;
141 currentAcceleration = sqrt(trueAccelerationX * trueAccelerationX +
142 trueAccelerationY * trueAccelerationY +
143 trueAccelerationZ * trueAccelerationZ );
145 totalAcceleration = currentAcceleration - previousAcceleration;
147 totalAcceleration = fabs(totalAcceleration);
149 previousAcceleration = currentAcceleration;
152 // x = x0 + v0t + (at^2)/2
155 intervalTime = now.restart();
156 intervalTime = intervalTime/1000; // millisecs to secs
157 totalTime = totalTime + intervalTime;
160 // TODO: do this in smoothdata: implement a better filter.
161 if (totalAcceleration > 0.02) {
162 currentSpeed = ( previousSpeed + ( totalAcceleration * intervalTime ) / 2 );
168 if (currentSpeed > 0.02) {
169 distanceTraveled = ( lastDistanceTraveled + ( ( currentSpeed + previousSpeed ) * intervalTime) / 2 );
171 //distanceTraveled = 0;
174 averageSpeed = distanceTraveled / totalTime;
176 previousSpeed = currentSpeed;
177 lastDistanceTraveled = distanceTraveled;
183 * Smooths Accelerometer data
185 * @param x Accelerometers x-axis raw input
186 * @param y Accelerometers y-axis raw input
187 * @param z Accelerometers z-axis raw input
189 void Accelerometer::smoothData(qreal x, qreal y, qreal z) {
194 accelerationX = previousAccelerationX + (accelerationX-previousAccelerationX) * kFilteringFactor;
195 accelerationY = previousAccelerationY + (accelerationY-previousAccelerationY) * kFilteringFactor;
196 accelerationZ = previousAccelerationZ + (accelerationZ-previousAccelerationZ) * kFilteringFactor;