* Accelerometer class to access the device accelerometer
*
* @author Rikhard Kuutti <rikhard.kuutti@fudeco.com>
- * @author Kai Rasilainen
+ * @author Kai Rasilainen <kai.rasilainen@fudeco.com>
+ * @author Jukka Kurttila <jktla@suomi24.fi>
* @copyright (c) 2010 Speed Freak team
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*/
+//#define FROM_FILE //Use this flag to read acceleration data from file, set also filename using fileReader->setFileName
#include "accelerometer.h"
-#include "math.h"
-
-#include <QFile>
-#include <QString>
-#include <QRegExp>
-#include <QTimer>
#include <QDBusConnection>
#include <QDBusInterface>
#include <QDBusPendingReply>
-#define kFilteringFactor 0.2
-
-static int sampleIndex = 0;
+#define kFilteringFactor 0.2
+#define kIterations 100
/**
* Default constructor for Accelerometer class
*/
Accelerometer::Accelerometer()
{
- calculate = new Calculate();
-
- timer = new QTimer(this);
- connect(timer, SIGNAL(timeout()), this, SLOT(processData()));
- sampleRate = 40;
- initValues();
-}
-
-/**
- * Constructor for Accelerometer class that takes accelerometer sample rate as parameter
- *
- * @param p_SampleRate the desired sample rate of accelerometer in milliseconds
- */
-Accelerometer::Accelerometer(int p_SampleRate)
-{
- calculate = new Calculate();
-
-
- timer = new QTimer(this);
- connect(timer, SIGNAL(timeout()), this, SLOT(processData()));
- sampleRate = p_SampleRate;
initValues();
+ calibrateDialog = NULL;
+ //fileReader = new filereader();
+ //fileReader->setFileName("45.txt");
}
/**
*/
Accelerometer::~Accelerometer()
{
-}
-
-/**
- * Start measuring
- *
- */
-void Accelerometer::start()
-{
- initValues();
- //calibrate();
- timer->start(sampleRate);
- now.restart();
+ if(calibrateDialog)
+ delete calibrateDialog;
+ if(fileReader)
+ delete fileReader;
}
/**
*/
void Accelerometer::initValues()
{
- calculate->reset();
- accelerationX = 0;
- accelerationY = 0;
- accelerationZ = 0;
- trueAccelerationX = 0;
- trueAccelerationY = 0;
- trueAccelerationZ = 0;
previousAccelerationX = 0;
previousAccelerationY = 0;
previousAccelerationZ = 0;
- previousSpeed = 0;
- currentSpeed = 0;
- currentAcceleration = 0;
- previousAcceleration = 0;
- totalAcceleration = 0;
- intervalTime = 0;
- totalTime = 0;
- distanceTraveled = 0;
- lastDistanceTraveled = 0;
- averageSpeed = 0;
- sampleRate = 0;
- firstRun = true;
calibrationX = 0;
calibrationY = 0;
calibrationZ = 0;
+ fileReader = NULL;
}
/**
unsigned int iteration = 0;
qreal sampleX, sampleY, sampleZ;
+ calibrateDialog = new CalibrateDialog();
+ calibrateDialog->show();
+ calibrateDialog->resetProgressValue();
+ calibrateDialog->setMaxValue( kIterations + 1 );
+
+#ifdef FROM_FILE
+ unsigned int numberOfIterations = 50;
do {
+ calibrateDialog->setProgressValue(iteration);
- getAcceleration(sampleX, sampleY, sampleZ);
+ fileReader->ReadLine(sampleX,sampleY,sampleZ);
+ //getAcceleration(sampleX, sampleY, sampleZ);
calibrationX += sampleX; // Accumulate Samples
calibrationY += sampleY; // for all axes.
iteration++;
- } while(iteration != 1024); // 1024 times
+ } while(iteration < numberOfIterations); // kIterations times
- calibrationX = calibrationX/1024; // division by 1024
- calibrationY = calibrationY/1024;
- calibrationZ = calibrationZ/1024;
+ calibrationX = calibrationX/numberOfIterations; // division by kIterations
+ calibrationY = calibrationY/numberOfIterations;
+ calibrationZ = calibrationZ/numberOfIterations;
-}
-
-/**
- * Stop measuring
- *
- */
-void Accelerometer::stop()
-{
- timer->stop();
-}
-
-/**
- * Processes Accelerometer data
- *
- * Opens the accelerometer value file for reading and reads and parses accelerometer values.
- * Forwards data to Calculate class for processing
- *
- */
-/*
-void Accelerometer::processData()
-{
- getAcceleration(accelerationX, accelerationY, accelerationZ);
- //smoothData(accelerationX, accelerationY, accelerationZ);
-
- // Apply calibration
- accelerationX = accelerationX - calibrationX;
- accelerationY = accelerationY - calibrationY;
- accelerationZ = accelerationZ - calibrationZ;
-
- // If the function is run the first time, make sure that there
- // are no differences with previous and current acceleration
- if (firstRun) {
- previousAccelerationX = accelerationX;
- previousAccelerationY = accelerationY;
- previousAccelerationZ = accelerationZ;
- firstRun = false;
- }
-
- // Calculate the current acceleration for each axis
- trueAccelerationX = (accelerationX - previousAccelerationX);
- trueAccelerationY = (accelerationY - previousAccelerationY);
- trueAccelerationZ = (accelerationZ - previousAccelerationZ);
-
- previousAccelerationX = accelerationX;
- previousAccelerationY = accelerationY;
- previousAccelerationZ = accelerationZ;
+#else
+ do {
+ calibrateDialog->setProgressValue(iteration);
- currentAcceleration = sqrt((trueAccelerationX * trueAccelerationX) +
- (trueAccelerationY * trueAccelerationY) +
- (trueAccelerationZ * trueAccelerationZ));
+ getAcceleration(sampleX, sampleY, sampleZ);
- // Discrimination window for currentAcceleration
- if ( fabs(currentAcceleration) < 0.10 ) { currentAcceleration = 0; }
+ calibrationX += sampleX; // Accumulate Samples
+ calibrationY += sampleY; // for all axes.
+ calibrationZ += sampleZ;
- // Measure time interval
- intervalTime = now.restart();
- intervalTime = intervalTime/1000; // millisecs to secs
- totalTime = totalTime + intervalTime;
+ iteration++;
- // Using calculate class to calculate velocity and distance etc.
- calculate->calculateParameters(currentAcceleration,intervalTime );
+ } while(iteration != kIterations); // kIterations times
- currentSpeed = calculate->getCurrentSpeed();
- distanceTraveled = calculate->getDistanceTraveled();
+ calibrationX = calibrationX/kIterations; // division by kIterations
+ calibrationY = calibrationY/kIterations;
+ calibrationZ = calibrationZ/kIterations;
+#endif
+ calibrateDialog->close();
}
-*/
+
/**
- * Smooths Accelerometer data
+ * Smooths Accelerometer data by applying a low pass filter to data
*
* @param x accelerometer's x-axis input
* @param y accelerometer's y-axis input
*/
void Accelerometer::smoothData(qreal &x, qreal &y, qreal &z)
{
- accelerationX = x;
- accelerationY = y;
- accelerationZ = z;
+ x = (previousAccelerationX * (1 - kFilteringFactor)) + (x * kFilteringFactor);
+ y = (previousAccelerationY * (1 - kFilteringFactor)) + (y * kFilteringFactor);
+ z = (previousAccelerationZ * (1 - kFilteringFactor)) + (z * kFilteringFactor);
- if (sampleIndex > 0)
- {
- accelerationX = ((previousAccelerationX) * (1-kFilteringFactor)) + (accelerationX * kFilteringFactor);
- accelerationY = ((previousAccelerationY) * (1-kFilteringFactor)) + (accelerationY * kFilteringFactor);
- accelerationZ = ((previousAccelerationZ) * (1-kFilteringFactor)) + (accelerationZ * kFilteringFactor);
- }
- sampleIndex++;
+ previousAccelerationX = x;
+ previousAccelerationY = y;
+ previousAccelerationZ = z;
}
+/**
+ * Gets the raw acceleration data from accelerometer
+ *
+ * @param x accelerometer's x-axis input
+ * @param y accelerometer's y-axis input
+ * @param z accelerometer's z-axis input
+ */
void Accelerometer::getAcceleration(qreal &x, qreal &y, qreal &z)
{
+#ifdef FROM_FILE
+ fileReader->ReadLine(x,y,z);
+#else
QDBusConnection connection(QDBusConnection::systemBus());
if (connection.isConnected()) {
QDBusInterface interface("com.nokia.mce", "/com/nokia/icd", QString(), connection);
y = static_cast<qreal>(reply.argumentAt<4>()) / 1000;
z = static_cast<qreal>(reply.argumentAt<5>()) / 1000;
}
+#endif
}
/**
- * Set the sample rate of accelerometer
+ * Get the x calibration component
*
- * @param pSampleRate desired sample rate
+ * @return calibrationX x calibration component
*/
-void Accelerometer::setSampleRate(int pSampleRate)
+qreal Accelerometer::getCalibrationX()
{
- sampleRate = pSampleRate;
+ return calibrationX;
}
/**
- * Get the sample rate of accelerometer
+ * Get the y calibration component
*
- * @return sampleRate the sample rate of the accelerometer in milliseconds
+ * @return calibrationY y calibration component
*/
-int Accelerometer::getSampleRate()
-{
- return sampleRate;
-}
-
-qreal Accelerometer::getCurrentAcceleration()
-{
- return currentAcceleration;
-}
-
-qreal Accelerometer::getPreviousTotalAcceleration()
-{
- return previousAcceleration;
-}
-
-qreal Accelerometer::getTotalAcceleration()
-{
- return totalAcceleration;
-}
-
-qreal Accelerometer::getDistanceTraveled()
-{
- return distanceTraveled;
-}
-
-qreal Accelerometer::getLastDistanceTraveled()
-{
- return lastDistanceTraveled;
-}
-
-qreal Accelerometer::getAverageSpeed()
-{
- return averageSpeed;
-}
-
-qreal Accelerometer::getTrueAccelerationX()
-{
- return trueAccelerationX;
-}
-
-qreal Accelerometer::getTrueAccelerationY()
-{
- return trueAccelerationY;
-}
-
-qreal Accelerometer::getTrueAccelerationZ()
-{
- return trueAccelerationZ;
-}
-
-qreal Accelerometer::getPreviousSpeed()
-{
- return previousSpeed;
-}
-
-qreal Accelerometer::getCurrentSpeed()
-{
- return currentSpeed;
-}
-
-qreal Accelerometer::getIntervalTime()
-{
- return intervalTime;
-}
-
-qreal Accelerometer::getTotalTime()
-{
- return totalTime;
-}
-
-qreal Accelerometer::getCalibrationX()
-{
- return calibrationX;
-}
-
qreal Accelerometer::getCalibrationY()
{
return calibrationY;
}
+/**
+ * Get the z calibration component
+ *
+ * @return calibrationZ z calibration component
+ */
qreal Accelerometer::getCalibrationZ()
{
return calibrationZ;