summaryrefslogtreecommitdiffstats
path: root/src/plugins/sensorgestures/qtsensors/qwhipsensorgesturerecognizer.cpp
diff options
context:
space:
mode:
authorLorn Potter <lorn.potter@nokia.com>2012-02-01 10:28:51 +1000
committerQt by Nokia <qt-info@nokia.com>2012-02-01 06:24:50 +0100
commit89fbd66b01bab3eca2ed9591f158f28d6e43e9e2 (patch)
treee41f9c52421a9e011851720f628638870b9d1de0 /src/plugins/sensorgestures/qtsensors/qwhipsensorgesturerecognizer.cpp
parentb643afb7845d4fc15eb469d0d9a1ec18b0dbb254 (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.cpp71
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