diff options
author | Andrew Inwood <ainwood@blackberry.com> | 2014-03-13 18:58:15 -0400 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-03-20 15:27:32 +0100 |
commit | 971fc95eca1d9db93aa4bdb75793dfe83e4a97db (patch) | |
tree | cb3bc54a3d1fab5c98558c5179a6f09da4db2a46 /src | |
parent | 14293dcb7002b185b49ec1ad802055eee63f2473 (diff) | |
download | qtsensors-971fc95eca1d9db93aa4bdb75793dfe83e4a97db.tar.gz |
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>
Diffstat (limited to 'src')
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 36ce08e..5a42d0c 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 3136301..4eb7471 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 396f410..134c2b7 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 17d499e..3326208 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); |