diff options
author | Lorn Potter <lorn.potter@nokia.com> | 2012-02-01 10:28:51 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-02-01 06:24:50 +0100 |
commit | 89fbd66b01bab3eca2ed9591f158f28d6e43e9e2 (patch) | |
tree | e41f9c52421a9e011851720f628638870b9d1de0 /src/plugins/sensorgestures/qtsensors/qwhipsensorgesturerecognizer.cpp | |
parent | b643afb7845d4fc15eb469d0d9a1ec18b0dbb254 (diff) |
try harder to make sure gesture dont fire too easily
some gestures will fire when trying other gestures. Make
sure they don't collide and provide false positives as much.
Change-Id: I4abd7d9ee876b77a211ae1b46bcc56f4fdc64ec0
Sanity-Review: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Lorn Potter <lorn.potter@nokia.com>
Diffstat (limited to 'src/plugins/sensorgestures/qtsensors/qwhipsensorgesturerecognizer.cpp')
-rw-r--r-- | src/plugins/sensorgestures/qtsensors/qwhipsensorgesturerecognizer.cpp | 71 |
1 files changed, 59 insertions, 12 deletions
diff --git a/src/plugins/sensorgestures/qtsensors/qwhipsensorgesturerecognizer.cpp b/src/plugins/sensorgestures/qtsensors/qwhipsensorgesturerecognizer.cpp index 94078e47..4869f7e4 100644 --- a/src/plugins/sensorgestures/qtsensors/qwhipsensorgesturerecognizer.cpp +++ b/src/plugins/sensorgestures/qtsensors/qwhipsensorgesturerecognizer.cpp @@ -41,10 +41,26 @@ #include "qwhipsensorgesturerecognizer.h" + +#define _USE_MATH_DEFINES +#include <QtCore/qmath.h> +#ifndef M_PI +#define M_PI 3.14159265358979323846264338327950288419717 +#endif +#ifndef M_PI_2 +#define M_PI_2 1.57079632679489661923 +#endif + + QT_BEGIN_NAMESPACE +inline qreal calcYaw(double Ax, double Ay, double Az) +{ + return (float)atan2(Az, (sqrt(Ax * Ax + Ay * Ay))); +} + QWhipSensorGestureRecognizer::QWhipSensorGestureRecognizer(QObject *parent) : - QSensorGestureRecognizer(parent), whipIt(0) + QSensorGestureRecognizer(parent), whipIt(0), lastX(0) { } @@ -56,6 +72,10 @@ void QWhipSensorGestureRecognizer::create() { accel = new QAccelerometer(this); accel->connectToBackend(); + + orientation = new QOrientationSensor(this); + orientation->connectToBackend(); + timer = new QTimer(this); qoutputrangelist outputranges = accel->outputRanges(); @@ -80,7 +100,7 @@ bool QWhipSensorGestureRecognizer::start() { connect(accel,SIGNAL(readingChanged()),this,SLOT(accelChanged())); active = accel->start(); - + orientation->start(); return active; } @@ -88,6 +108,7 @@ bool QWhipSensorGestureRecognizer::stop() { accel->stop(); active = accel->isActive(); + orientation->stop(); disconnect(accel,SIGNAL(readingChanged()),this,SLOT(accelChanged())); return !active; } @@ -97,30 +118,42 @@ bool QWhipSensorGestureRecognizer::isActive() return active; } -#define WHIP_THRESHOLD_FACTOR 0.85 -#define WHIP_DETECTION_FACTOR 0.3 +#define WHIP_THRESHOLD_FACTOR 0.95 //37 +#define WHIP_DETECTION_FACTOR 0.3 // 11.7 +#define WHIP_DEGREES 25 void QWhipSensorGestureRecognizer::accelChanged() { qreal x = accel->reading()->x(); + qreal difference = lastX - x; + if (abs(difference) < 1) + return; - if (whipIt) { - qreal difference = lastX - x; + qreal y = accel->reading()->y(); + qreal z = accel->reading()->z(); - if ((!wasNegative && difference > accelRange * WHIP_THRESHOLD_FACTOR) - || (wasNegative && difference < -accelRange * WHIP_THRESHOLD_FACTOR)) { + qreal degreesZ = calc(calcYaw(x,y,z)); + if (whipIt) { + if (((!wasNegative && difference > accelRange * WHIP_THRESHOLD_FACTOR) + || (wasNegative && difference < -accelRange * WHIP_THRESHOLD_FACTOR)) + && abs(degreesZ) < WHIP_DEGREES + && abs(detectedX) < abs(x)) { Q_EMIT whip(); Q_EMIT detected("whip"); whipIt = false; } - } else if (x > (accelRange * WHIP_DETECTION_FACTOR) - || x < -(accelRange * WHIP_DETECTION_FACTOR)) { - //start of gesture + } else if (((difference > 0 && difference < accelRange * WHIP_DETECTION_FACTOR) + || (difference < 0 && difference > -accelRange * WHIP_DETECTION_FACTOR)) + && abs(degreesZ) < WHIP_DEGREES + && orientation->reading()->orientation() != QOrientationReading::FaceUp) { + + detectedX = x; +// start of gesture timer->start(); whipIt = true; - if (lastX > 0) + if (difference > 0) wasNegative = false; else wasNegative = true; @@ -133,4 +166,18 @@ void QWhipSensorGestureRecognizer::timeout() whipIt = false; } +qreal QWhipSensorGestureRecognizer::calc(qreal yrot) +{ + qreal aG = 1 * sin(yrot); + qreal aK = 1 * cos(yrot); + + yrot = atan2(aG, aK); + if (yrot > M_PI_2) + yrot = M_PI - yrot; + else if (yrot < -M_PI_2) + yrot = -(M_PI + yrot); + + return yrot * 180 / M_PI; +} + QT_END_NAMESPACE |