From 971fc95eca1d9db93aa4bdb75793dfe83e4a97db Mon Sep 17 00:00:00 2001 From: Andrew Inwood Date: Thu, 13 Mar 2014 18:58:15 -0400 Subject: Implement QAccelerometer accelerationMode 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 Reviewed-by: Lorn Potter --- .../sensors/android/src/androidaccelerometer.cpp | 38 +++++++++++++++++++++- .../sensors/android/src/androidaccelerometer.h | 7 +++- .../sensors/android/src/androidcommonsensor.h | 2 +- src/plugins/sensors/android/src/main.cpp | 5 +++ 4 files changed, 49 insertions(+), 3 deletions(-) (limited to 'src/plugins') 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 +** 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(type, sensor) -{} +{ + QAccelerometer * const accelerometer = qobject_cast(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(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 { + 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 #include #include +#include #include "androidaccelerometer.h" #include "androidgyroscope.h" #include "androidlight.h" @@ -112,7 +113,11 @@ public: AndroidSensorType type = static_cast(sensor->identifier().toInt()); switch (type) { case TYPE_ACCELEROMETER: + { + QAccelerometer * const accelerometer = qobject_cast(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); -- cgit v1.2.3