From acd094c6d795a597d3b899633e207d65f79ea746 Mon Sep 17 00:00:00 2001 From: Thomas McGuire Date: Tue, 8 Jan 2013 11:55:10 +0100 Subject: QAccelerometer: Add AccelerationMode property MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a new property to be able to toggle effects of gravity on or off. Implement the Blackberry backend side of this as well. QTBUG-25842 Change-Id: I15c4cae72373f48b0153b83c6aa3d27b66538c87 Reviewed-by: Lorn Potter Reviewed-by: Sérgio Martins --- src/sensors/qaccelerometer.cpp | 78 ++++++++++++++++++++++++++++++++++++++++-- src/sensors/qaccelerometer.h | 20 +++++++++++ src/sensors/qaccelerometer_p.h | 13 +++++++ src/sensors/qsensor.cpp | 5 +++ src/sensors/qsensor.h | 1 + 5 files changed, 115 insertions(+), 2 deletions(-) (limited to 'src/sensors') diff --git a/src/sensors/qaccelerometer.cpp b/src/sensors/qaccelerometer.cpp index 4aeedf42..9b9bd346 100644 --- a/src/sensors/qaccelerometer.cpp +++ b/src/sensors/qaccelerometer.cpp @@ -152,6 +152,29 @@ void QAccelerometerReading::setZ(qreal z) char const * const QAccelerometer::type("QAccelerometer"); +/*! + \enum QAccelerometer::AccelerationMode + + \brief This enum represents the acceleration mode of an acceleration sensor. + + The acceleration mode controls how the sensor reports acceleration. QAccelerometer::Combined + is the only mode in which the values can be directly physically measured, the others are an + approximation. + + \value Combined Both the acceleration caused by gravity and the acceleration caused by the + user moving the device is reported combined. + \value Gravity Only the acceleration caused by gravity is reported. Movements of the device + caused by the user have no effect other than changing the direction when the + device is rotated. + \value User Only the acceleration caused by the user moving the device is reported, the + effect of gravity is canceled out. A device at rest therefore should report + values of, or close to, zero. + In other APIs, this mode might be known as \e {linear acceleration}. + + \sa QAccelerometer::accelerationMode + \since 5.1 +*/ + /*! \class QAccelerometer \ingroup sensors_type @@ -161,7 +184,11 @@ char const * const QAccelerometer::type("QAccelerometer"); The only behavioural difference is that this class sets the type properly. - This class also features a reading() function that returns a QAccelerometerReading instead of a QSensorReading. + It also supports changing the acceleration mode, which controls whether the force of gravity + is included in the accelerometer values or not. + + Furthermore, this class features a reading() function that returns a QAccelerometerReading + instead of a QSensorReading. For details about how the sensor works, see \l QAccelerometerReading. @@ -172,7 +199,7 @@ char const * const QAccelerometer::type("QAccelerometer"); Construct the sensor as a child of \a parent. */ QAccelerometer::QAccelerometer(QObject *parent) - : QSensor(QAccelerometer::type, parent) + : QSensor(QAccelerometer::type, *new QAccelerometerPrivate, parent) { } @@ -183,6 +210,45 @@ QAccelerometer::~QAccelerometer() { } +/*! + \property QAccelerometer::accelerationMode + \brief The acceleration mode controls how acceleration values are reported. + \since 5.1 + + The acceleration mode controls how the acceleration sensor reports its values. + The default mode is QAccelerometer::Combined, which means the acceleration caused + by gravity is included in the reported values. + + Acceleration caused by gravity and acceleration caused by the user moving the device + are physically impossible to distinguish because of general relativity. Most devices use + sensor fusion to figure out which parts of the acceleration is caused by gravity, for example + by using a rotation sensor to calculate the gravity direction and assuming a fixed magnitude + for gravity. Therefore the result is only an approximation and may be inaccurate. + The QAccelerometer::Combined mode is the most accurate one, as it does not involve approximating + the gravity. + + Not all backends and devices might support setting the acceleration mode. For those cases, the + default mode QAccelerometer::Combined is used, changing it has no effect. +*/ +QAccelerometer::AccelerationMode QAccelerometer::accelerationMode() const +{ + Q_D(const QAccelerometer); + return d->accelerationMode; +} + +/*! + Sets the acceleration mode to \a accelerationMode. + \since 5.1 +*/ +void QAccelerometer::setAccelerationMode(QAccelerometer::AccelerationMode accelerationMode) +{ + Q_D(QAccelerometer); + if (d->accelerationMode != accelerationMode) { + d->accelerationMode = accelerationMode; + emit accelerationModeChanged(d->accelerationMode); + } +} + /*! \fn QAccelerometer::reading() const @@ -191,6 +257,14 @@ QAccelerometer::~QAccelerometer() \sa QSensor::reading() */ +/*! + \fn QAccelerometer::accelerationModeChanged(AccelerationMode accelerationMode) + + Emitted when the acceleration mode was changed. + + \since 5.1 +*/ + #include "moc_qaccelerometer.cpp" QT_END_NAMESPACE diff --git a/src/sensors/qaccelerometer.h b/src/sensors/qaccelerometer.h index 734ce97e..d230eb1f 100644 --- a/src/sensors/qaccelerometer.h +++ b/src/sensors/qaccelerometer.h @@ -77,16 +77,36 @@ private: bool filter(QSensorReading *reading) { return filter(static_cast(reading)); } }; +class QAccelerometerPrivate; + class Q_SENSORS_EXPORT QAccelerometer : public QSensor { Q_OBJECT + Q_ENUMS(AccelerationMode) + Q_PROPERTY(AccelerationMode accelerationMode READ accelerationMode WRITE setAccelerationMode + NOTIFY accelerationModeChanged) public: explicit QAccelerometer(QObject *parent = 0); virtual ~QAccelerometer(); + + // Keep this enum in sync with QmlAccelerometer::AccelerationMode + enum AccelerationMode { + Combined, + Gravity, + User + }; + + AccelerationMode accelerationMode() const; + void setAccelerationMode(AccelerationMode accelerationMode); + QAccelerometerReading *reading() const { return static_cast(QSensor::reading()); } static char const * const type; +Q_SIGNALS: + void accelerationModeChanged(AccelerationMode accelerationMode); + private: + Q_DECLARE_PRIVATE(QAccelerometer) Q_DISABLE_COPY(QAccelerometer) }; diff --git a/src/sensors/qaccelerometer_p.h b/src/sensors/qaccelerometer_p.h index dd60fd19..371535bf 100644 --- a/src/sensors/qaccelerometer_p.h +++ b/src/sensors/qaccelerometer_p.h @@ -53,6 +53,8 @@ // We mean it. // +#include "qsensor_p.h" + QT_BEGIN_HEADER QT_BEGIN_NAMESPACE @@ -71,6 +73,17 @@ public: qreal z; }; +class QAccelerometerPrivate : public QSensorPrivate +{ +public: + QAccelerometerPrivate() + : accelerationMode(QAccelerometer::Combined) + { + } + + QAccelerometer::AccelerationMode accelerationMode; +}; + QT_END_NAMESPACE QT_END_HEADER diff --git a/src/sensors/qsensor.cpp b/src/sensors/qsensor.cpp index 81cb6530..4c3715c2 100644 --- a/src/sensors/qsensor.cpp +++ b/src/sensors/qsensor.cpp @@ -200,6 +200,11 @@ void QSensorPrivate::init(const QByteArray &sensorType) \value FieldOfView The backend specifies its field of view, which can be read from the QLightSensor::fieldOfView property. + The features of QAccelerometer are: + + \value AccelerationMode The backend supports switching the acceleration mode + of the acceleromter with the QAccelerometer::accelerationMode property. + \omitvalue Reserved \sa QSensor::isFeatureSupported() diff --git a/src/sensors/qsensor.h b/src/sensors/qsensor.h index 46d011d3..f142ca4d 100644 --- a/src/sensors/qsensor.h +++ b/src/sensors/qsensor.h @@ -104,6 +104,7 @@ public: AlwaysOn, GeoValues, FieldOfView, + AccelerationMode, Reserved = 257 // Make sure at least 2 bytes are used for the enum to avoid breaking BC later }; -- cgit v1.2.3