X-Git-Url: http://git.maemo.org/git/?p=speedfreak;a=blobdiff_plain;f=Client%2Faccelerometer.cpp;h=c2f0bab6fd04aa88fe3fa0383ded027aad093b8d;hp=0f70d0baefcf203c0309d7089cee57020c0a7c08;hb=191e117d32d1e3e4865f51c84b3a2bbc565a49b3;hpb=b7e5e4f21ee31476d5b9d3ceb3b7070b7f6e7101 diff --git a/Client/accelerometer.cpp b/Client/accelerometer.cpp index 0f70d0b..c2f0bab 100644 --- a/Client/accelerometer.cpp +++ b/Client/accelerometer.cpp @@ -1,199 +1,156 @@ -#include "accelerometer.h" -#include "math.h" +/* + * Accelerometer class to access the device accelerometer + * + * @author Rikhard Kuutti + * @author Kai Rasilainen + * @author Jukka Kurttila + * @copyright (c) 2010 Speed Freak team + * @license http://opensource.org/licenses/gpl-license.php GNU Public License + */ -#include -#include -#include -#include +#include "accelerometer.h" -#define kFilteringFactor 0.1 -#define kGravity 9.81 +#include +#include +#include -static int sampleIndex=0; +#define kFilteringFactor 0.2 +#define kIterations 1024 +/** + * Default constructor for Accelerometer class + * + */ Accelerometer::Accelerometer() { - QTimer *timer = new QTimer(this); - connect(timer, SIGNAL(timeout()), this, SLOT(processData())); - sampleRate = 100; - timer->start(sampleRate); - now.restart(); - initValues(); + calibrateDialog = NULL; } -Accelerometer::~Accelerometer() { -} - -void Accelerometer::start() { - timer->start(sampleRate); - now.restart(); -} - -void Accelerometer::initValues() { - 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; -} - -void Accelerometer::stop() { - timer->stop(); +/** + * Default destructor for Accelerometer class + * + */ +Accelerometer::~Accelerometer() +{ + if(calibrateDialog) + delete calibrateDialog; } -void Accelerometer::setSampleRate(int pSampleRate) { - sampleRate = pSampleRate; +/** + * Init class members + * + */ +void Accelerometer::initValues() +{ + previousAccelerationX = 0; + previousAccelerationY = 0; + previousAccelerationZ = 0; + calibrationX = 0; + calibrationY = 0; + calibrationZ = 0; } -int Accelerometer::getSampleRate() { - return sampleRate; -} +/** + * Calibrate. Purpose of this function is to calibrate + * accelerometer when stationary. + * + */ +void Accelerometer::calibrate(void) +{ + unsigned int iteration = 0; + qreal sampleX, sampleY, sampleZ; -qreal Accelerometer::getCurrentAcceleration() { - return currentAcceleration; -} + calibrateDialog = new CalibrateDialog(); + calibrateDialog->show(); + calibrateDialog->resetProgressValue(); + calibrateDialog->setMaxValue( kIterations + 1 ); -qreal Accelerometer::getPreviousTotalAcceleration() { - return previousAcceleration; -} + do { + calibrateDialog->setProgressValue(iteration); -qreal Accelerometer::getTotalAcceleration() { - return totalAcceleration; -} + getAcceleration(sampleX, sampleY, sampleZ); -qreal Accelerometer::getDistanceTraveled() { - return distanceTraveled; -} + calibrationX += sampleX; // Accumulate Samples + calibrationY += sampleY; // for all axes. + calibrationZ += sampleZ; -qreal Accelerometer::getLastDistanceTraveled() { - return lastDistanceTraveled; -} + iteration++; -qreal Accelerometer::getAverageSpeed() { - return averageSpeed; -} + } while(iteration != kIterations); // kIterations times -qreal Accelerometer::getTrueAccelerationX() { - return trueAccelerationX; -} + calibrationX = calibrationX/kIterations; // division by kIterations + calibrationY = calibrationY/kIterations; + calibrationZ = calibrationZ/kIterations; -qreal Accelerometer::getTrueAccelerationY() { - return trueAccelerationY; + calibrateDialog->close(); } -qreal Accelerometer::getTrueAccelerationZ() { - return trueAccelerationZ; -} +/** + * 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 + * @param z accelerometer's z-axis input + */ +void Accelerometer::smoothData(qreal &x, qreal &y, qreal &z) +{ + x = (previousAccelerationX * (1 - kFilteringFactor)) + (x * kFilteringFactor); + y = (previousAccelerationY * (1 - kFilteringFactor)) + (y * kFilteringFactor); + z = (previousAccelerationZ * (1 - kFilteringFactor)) + (z * kFilteringFactor); -qreal Accelerometer::getPreviousSpeed() { - return previousSpeed; + previousAccelerationX = x; + previousAccelerationY = y; + previousAccelerationZ = z; } -qreal Accelerometer::getCurrentSpeed() { - return currentSpeed; +/** + * 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) +{ + QDBusConnection connection(QDBusConnection::systemBus()); + if (connection.isConnected()) { + QDBusInterface interface("com.nokia.mce", "/com/nokia/icd", QString(), connection); + QDBusPendingReply reply; + reply = interface.asyncCall("get_device_orientation"); + reply.waitForFinished(); + x = static_cast(reply.argumentAt<3>()) / 1000; + y = static_cast(reply.argumentAt<4>()) / 1000; + z = static_cast(reply.argumentAt<5>()) / 1000; + } } -qreal Accelerometer::getintervalTime() { - return intervalTime; +/** + * Get the x calibration component + * + * @return calibrationX x calibration component + */ +qreal Accelerometer::getCalibrationX() +{ + return calibrationX; } /** - * Processes Accelerometer data + * Get the y calibration component * + * @return calibrationY y calibration component */ -void Accelerometer::processData() +qreal Accelerometer::getCalibrationY() { - QFile file("/sys/class/i2c-adapter/i2c-3/3-001d/coord"); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) - return; - - // Read data, parse with regular expressions and process it - QByteArray line = file.readLine(); - QRegExp rx("([0-9-]+) ([0-9-]+) ([0-9-]+)"); - rx.indexIn(line); - - smoothData(rx.cap(1).toInt(), rx.cap(2).toInt(), rx.cap(3).toInt()); - - trueAccelerationX = (accelerationX - previousAccelerationX)/1000*kGravity; - trueAccelerationY = (accelerationY - previousAccelerationY)/1000*kGravity; - trueAccelerationZ = (accelerationZ - previousAccelerationZ)/1000*kGravity; - - previousAccelerationX = accelerationX; - previousAccelerationY = accelerationY; - previousAccelerationZ = accelerationZ; - - currentAcceleration = sqrt(trueAccelerationX * trueAccelerationX + - trueAccelerationY * trueAccelerationY + - trueAccelerationZ * trueAccelerationZ ); - - totalAcceleration = currentAcceleration - previousAcceleration; - - totalAcceleration = fabs(totalAcceleration); - - previousAcceleration = currentAcceleration; - - // v = v0 + at - // x = x0 + v0t + (at^2)/2 - // v = (v + v0)/2 - - intervalTime = now.restart(); - intervalTime = intervalTime/1000; // millisecs to secs - totalTime = totalTime + intervalTime; - - // filter noise - // TODO: do this in smoothdata: implement a better filter. - if (totalAcceleration > 0.02) { - currentSpeed = ( previousSpeed + ( totalAcceleration * intervalTime ) / 2 ); - } else { - currentSpeed = 0; - } - - // filter noise - if (currentSpeed > 0.02) { - distanceTraveled = ( lastDistanceTraveled + ( ( currentSpeed + previousSpeed ) * intervalTime) / 2 ); - } else { - //distanceTraveled = 0; - } - - averageSpeed = distanceTraveled / totalTime; - - previousSpeed = currentSpeed; - lastDistanceTraveled = distanceTraveled; - - file.close(); + return calibrationY; } /** - * Smooths Accelerometer data + * Get the z calibration component * - * @param x Accelerometers x-axis raw input - * @param y Accelerometers y-axis raw input - * @param z Accelerometers z-axis raw input + * @return calibrationZ z calibration component */ -void Accelerometer::smoothData(qreal x, qreal y, qreal z) { - accelerationX = x; - accelerationY = y; - accelerationZ = z; - if(sampleIndex>0) { - accelerationX = previousAccelerationX + (accelerationX-previousAccelerationX) * kFilteringFactor; - accelerationY = previousAccelerationY + (accelerationY-previousAccelerationY) * kFilteringFactor; - accelerationZ = previousAccelerationZ + (accelerationZ-previousAccelerationZ) * kFilteringFactor; - } - sampleIndex++; +qreal Accelerometer::getCalibrationZ() +{ + return calibrationZ; }