summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Inwood <ainwood@blackberry.com>2014-03-13 18:58:15 -0400
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-03-20 15:27:32 +0100
commit971fc95eca1d9db93aa4bdb75793dfe83e4a97db (patch)
treecb3bc54a3d1fab5c98558c5179a6f09da4db2a46
parent14293dcb7002b185b49ec1ad802055eee63f2473 (diff)
Implement QAccelerometer accelerationModev5.3.0-beta1
The Qt API does not expose Linear Accel and Gravity as separate sensor types, they are different versions of QAccelerometer, accessed by modifying the accelerationMode property. The possible values are Combined, User, and Gravity, which correspond to Acceleration, Linear Acceleration, and Gravity respectively. When constructing the accelerometer backend, the accelerationMode must be queried. The backend must also connect to the accelerationModeChanged signal from the QAccelerometer. I think that the existing implementation of QSensors on Android assumes that there is a one-to-one correspondence between QSensors and AndroidSensorTypes. To fix this assumption, I promoted the m_type attribute of androidcommonsensor.h from private to protected so that a sensor backend can update the Android sensor being used. Task-number: QTBUG-30531 Change-Id: I842d2485109542f74731d179e2720ea55fa248cc Reviewed-by: Fabian Bumberger <fbumberger@rim.com> Reviewed-by: Lorn Potter <lorn.potter@jollamobile.com>
-rw-r--r--src/plugins/sensors/android/src/androidaccelerometer.cpp38
-rw-r--r--src/plugins/sensors/android/src/androidaccelerometer.h7
-rw-r--r--src/plugins/sensors/android/src/androidcommonsensor.h2
-rw-r--r--src/plugins/sensors/android/src/main.cpp5
4 files changed, 49 insertions, 3 deletions
diff --git a/src/plugins/sensors/android/src/androidaccelerometer.cpp b/src/plugins/sensors/android/src/androidaccelerometer.cpp
index 36ce08e3..5a42d0cb 100644
--- a/src/plugins/sensors/android/src/androidaccelerometer.cpp
+++ b/src/plugins/sensors/android/src/androidaccelerometer.cpp
@@ -1,6 +1,7 @@
/****************************************************************************
**
** Copyright (C) 2013 BogDan Vatra <bogdan@kde.org>
+** Copyright (C) 2014 BlackBerry Limited. All rights reserved.
** Contact: http://www.qt-project.org/legal
**
** This file is part of the QtSensors module of the Qt Toolkit.
@@ -43,7 +44,13 @@
AndroidAccelerometer::AndroidAccelerometer(AndroidSensors::AndroidSensorType type, QSensor *sensor)
: AndroidCommonSensor<QAccelerometerReading>(type, sensor)
-{}
+{
+ QAccelerometer * const accelerometer = qobject_cast<QAccelerometer *>(sensor);
+ if (accelerometer) {
+ connect(accelerometer, SIGNAL(accelerationModeChanged(AccelerationMode)),
+ this, SLOT(applyAccelerationMode()));
+ }
+}
void AndroidAccelerometer::onSensorChanged(jlong timestamp, const jfloat *values, uint size)
{
@@ -61,3 +68,32 @@ void AndroidAccelerometer::onAccuracyChanged(jint accuracy)
{
Q_UNUSED(accuracy)
}
+
+void AndroidAccelerometer::applyAccelerationMode()
+{
+ const QAccelerometer * const accelerometer = qobject_cast<QAccelerometer *>(sensor());
+ if (accelerometer) {
+ stop(); //Stop previous sensor and start new one
+ m_type = modeToSensor(accelerometer->accelerationMode());
+ start();
+ }
+}
+AndroidSensors::AndroidSensorType AndroidAccelerometer::modeToSensor(QAccelerometer::AccelerationMode mode)
+{
+ AndroidSensors::AndroidSensorType type;
+
+ switch (mode) {
+ case QAccelerometer::Gravity:
+ type = AndroidSensors::TYPE_GRAVITY;
+ break;
+ case QAccelerometer::User:
+ type = AndroidSensors::TYPE_LINEAR_ACCELERATION;
+ break;
+ default:
+ case QAccelerometer::Combined:
+ type = AndroidSensors::TYPE_ACCELEROMETER;
+ break;
+ }
+
+ return type;
+}
diff --git a/src/plugins/sensors/android/src/androidaccelerometer.h b/src/plugins/sensors/android/src/androidaccelerometer.h
index 31363014..4eb7471e 100644
--- a/src/plugins/sensors/android/src/androidaccelerometer.h
+++ b/src/plugins/sensors/android/src/androidaccelerometer.h
@@ -47,13 +47,18 @@
class AndroidAccelerometer : public AndroidCommonSensor<QAccelerometerReading>
{
+ Q_OBJECT
+
public:
AndroidAccelerometer(AndroidSensors::AndroidSensorType type, QSensor *sensor);
-
+ static AndroidSensors::AndroidSensorType modeToSensor(QAccelerometer::AccelerationMode mode);
private:
void onAccuracyChanged(jint accuracy) Q_DECL_OVERRIDE;
void onSensorChanged(jlong timestamp, const jfloat *values, uint size) Q_DECL_OVERRIDE;
+private Q_SLOTS:
+ void applyAccelerationMode();
+
};
#endif // ANDROIDACCELEROMETER_H
diff --git a/src/plugins/sensors/android/src/androidcommonsensor.h b/src/plugins/sensors/android/src/androidcommonsensor.h
index 396f4105..134c2b75 100644
--- a/src/plugins/sensors/android/src/androidcommonsensor.h
+++ b/src/plugins/sensors/android/src/androidcommonsensor.h
@@ -79,9 +79,9 @@ public:
protected:
ReaderType m_reader;
+ AndroidSensors::AndroidSensorType m_type;
private:
- AndroidSensors::AndroidSensorType m_type;
bool m_isStarted;
};
diff --git a/src/plugins/sensors/android/src/main.cpp b/src/plugins/sensors/android/src/main.cpp
index 17d499ef..3326208b 100644
--- a/src/plugins/sensors/android/src/main.cpp
+++ b/src/plugins/sensors/android/src/main.cpp
@@ -43,6 +43,7 @@
#include <qsensorplugin.h>
#include <qsensorbackend.h>
#include <qsensormanager.h>
+#include <qaccelerometer.h>
#include "androidaccelerometer.h"
#include "androidgyroscope.h"
#include "androidlight.h"
@@ -112,7 +113,11 @@ public:
AndroidSensorType type = static_cast<AndroidSensorType>(sensor->identifier().toInt());
switch (type) {
case TYPE_ACCELEROMETER:
+ {
+ QAccelerometer * const accelerometer = qobject_cast<QAccelerometer *>(sensor);
+ AndroidSensors::AndroidSensorType type = AndroidAccelerometer::modeToSensor(accelerometer->accelerationMode());
return new AndroidAccelerometer(type, sensor);
+ }
case TYPE_AMBIENT_TEMPERATURE:
case TYPE_TEMPERATURE:
return new AndroidTemperature(type, sensor);