diff options
author | Lorn Potter <lorn.potter@nokia.com> | 2012-05-22 10:10:28 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-05-24 05:08:15 +0200 |
commit | c8c03ee6b2a4d7de1ca13cb5848589c8a6134d4d (patch) | |
tree | 33e668372c98457551e5b55aa2262efcd41b0cc5 /src/plugins/sensorgestures | |
parent | 17d908ba5205513e9ed0be33aebeb3736bda0326 (diff) |
make hover gesture work better
make hover work when the ir prox is calibrated.
Also make sure that a hand moving up after doing a cover does not
trigger a hover signal.
Change-Id: I8925c4d7dd53302b9d9950989e37ad991216f621
Reviewed-by: Lincoln Ramsay <lincoln.ramsay@nokia.com>
Diffstat (limited to 'src/plugins/sensorgestures')
-rw-r--r-- | src/plugins/sensorgestures/qtsensors/qhoversensorgesturerecognizer.cpp | 86 | ||||
-rw-r--r-- | src/plugins/sensorgestures/qtsensors/qhoversensorgesturerecognizer.h | 7 |
2 files changed, 67 insertions, 26 deletions
diff --git a/src/plugins/sensorgestures/qtsensors/qhoversensorgesturerecognizer.cpp b/src/plugins/sensorgestures/qtsensors/qhoversensorgesturerecognizer.cpp index 1534a669..b19973f6 100644 --- a/src/plugins/sensorgestures/qtsensors/qhoversensorgesturerecognizer.cpp +++ b/src/plugins/sensorgestures/qtsensors/qhoversensorgesturerecognizer.cpp @@ -47,7 +47,7 @@ QT_BEGIN_NAMESPACE QHoverSensorGestureRecognizer::QHoverSensorGestureRecognizer(QObject *parent) : QSensorGestureRecognizer(parent), - hoverOk(0), lastLightReading(0), detecting(0), active(0), initialReflectance(0) + hoverOk(0), detecting(0), active(0), initialReflectance(0), useHack(0) { } @@ -57,15 +57,10 @@ QHoverSensorGestureRecognizer::~QHoverSensorGestureRecognizer() void QHoverSensorGestureRecognizer::create() { - timer = new QTimer(this); - connect(timer,SIGNAL(timeout()),this,SLOT(timeout())); - timer->setSingleShot(true); - timer->setInterval(1000); - timer2 = new QTimer(this); connect(timer2,SIGNAL(timeout()),this,SLOT(timeout2())); timer2->setSingleShot(true); - timer2->setInterval(5000); + timer2->setInterval(3000); } QString QHoverSensorGestureRecognizer::id() const @@ -83,6 +78,9 @@ bool QHoverSensorGestureRecognizer::start() active = false; } detecting = false; + detectedHigh = 0; + initialReflectance = 0; + useHack = false; return active; } @@ -92,9 +90,6 @@ bool QHoverSensorGestureRecognizer::stop() disconnect(QtSensorGestureSensorHandler::instance(),SIGNAL(irProximityReadingChanged(QIRProximityReading *)), this,SLOT(irProximityReadingChanged(QIRProximityReading *))); active = false; - timer->stop(); - timer2->stop(); - initialReflectance = 0; return active; } @@ -106,37 +101,86 @@ bool QHoverSensorGestureRecognizer::isActive() void QHoverSensorGestureRecognizer::irProximityReadingChanged(QIRProximityReading *reading) { reflectance = reading->reflectance(); + if (reflectance == 0) + return; - if (initialReflectance == 0) + if (initialReflectance == 0) { initialReflectance = reflectance; + } + + if (initialReflectance > .2) { + useHack = true; + initialReflectance -= .1; + } + if (useHack) + reflectance -= .1; + + if (detecting && !hoverOk) { + detectedHigh = qMax(detectedHigh, reflectance); + } + + if (reflectance > 0.4) { + // if close stop detecting + hoverOk = false; + detecting = false; + detectedHigh = 0; + } + + + qreal detectedPercent = 100 - (detectedHigh / reflectance * 100); - if (!detecting && reflectance - initialReflectance > 0.1) { + qint16 percentCheck; + if (useHack) + percentCheck = -60; + else + percentCheck = -101; + + if (!detecting + && checkForHovering()) { detecting = true; - timer->start(); - timer2->start(); detectedHigh = reflectance; - - } else if (hoverOk && detecting - && reflectance - initialReflectance < 0 - && initialReflectance / reflectance > 0.98) { + } else if (detecting + && detectedPercent < percentCheck + && !checkForHovering()) { // went light again after 1 seconds Q_EMIT hover(); Q_EMIT detected("hover"); hoverOk = false; detecting = false; + detectedHigh = 0; + timer2->stop(); } - if (reflectance > .60) - detecting = false; + if (detecting && reflectance < 0.2) { + timeout(); + } +} + +bool QHoverSensorGestureRecognizer::checkForHovering() +{ + if ( (reflectance > 0.2 && reflectance < 0.4) + && (initialReflectance - reflectance) < -0.1) + return true; + + return false; } + void QHoverSensorGestureRecognizer::timeout() { - hoverOk = true; + if (checkForHovering()) { + hoverOk = true; + timer2->start(); + } else { + detecting = false; + detectedHigh = 0; + } } void QHoverSensorGestureRecognizer::timeout2() { detecting = false; + hoverOk = false; + detectedHigh = 0; } QT_END_NAMESPACE diff --git a/src/plugins/sensorgestures/qtsensors/qhoversensorgesturerecognizer.h b/src/plugins/sensorgestures/qtsensors/qhoversensorgesturerecognizer.h index 1e8cd051..27b30151 100644 --- a/src/plugins/sensorgestures/qtsensors/qhoversensorgesturerecognizer.h +++ b/src/plugins/sensorgestures/qtsensors/qhoversensorgesturerecognizer.h @@ -72,20 +72,17 @@ private slots: void timeout(); void timeout2(); private: -// bool proximity; qreal reflectance; - QTimer *timer; QTimer *timer2; bool hoverOk; - qreal lastLightReading; bool detecting; qreal detectedHigh; - qreal lastProx; bool active; qreal initialReflectance; - + bool checkForHovering(); + bool useHack; }; QT_END_NAMESPACE |