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/imports/sensors/plugins.qmltypes | 76 ++++++++++++--------- src/imports/sensors/qmlaccelerometer.cpp | 21 ++++++ src/imports/sensors/qmlaccelerometer.h | 15 +++++ src/imports/sensors/sensors.cpp | 35 ++++++++++ src/imports/sensors/sensors.pro | 2 +- src/plugins/sensors/blackberry/bbaccelerometer.cpp | 38 +++++++++++ src/plugins/sensors/blackberry/bbaccelerometer.h | 4 ++ src/plugins/sensors/blackberry/bbsensorbackend.cpp | 16 +++++ src/plugins/sensors/blackberry/bbsensorbackend.h | 3 + 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 + 14 files changed, 293 insertions(+), 34 deletions(-) (limited to 'src') diff --git a/src/imports/sensors/plugins.qmltypes b/src/imports/sensors/plugins.qmltypes index 687a1f25..00d8c366 100644 --- a/src/imports/sensors/plugins.qmltypes +++ b/src/imports/sensors/plugins.qmltypes @@ -3,18 +3,32 @@ import QtQuick.tooling 1.1 // This file describes the plugin-supplied types contained in the library. // It is used for QML tooling purposes only. // -// This file was auto-generated with the command 'qmlplugindump QtSensors 5.0 /home/thomas/src/qtbase/imports/'. +// This file was auto-generated with the command 'qmlplugindump QtSensors 5.0 /home/thomas/src/qtbase/qml'. Module { Component { name: "QmlAccelerometer" prototype: "QmlSensor" - exports: ["Accelerometer 5.0"] + exports: ["Accelerometer 5.0", "Accelerometer 5.1"] + exportMetaObjectRevisions: [0, 1] + Enum { + name: "AccelerationMode" + values: { + "Combined": 0, + "Gravity": 1, + "User": 2 + } + } + Property { name: "accelerationMode"; revision: 1; type: "AccelerationMode" } + Signal { + name: "accelerationModeChanged" + Parameter { name: "accelerationMode"; type: "AccelerationMode" } + } } Component { name: "QmlAccelerometerReading" prototype: "QmlSensorReading" - exports: ["AccelerometerReading 5.0"] + exports: ["AccelerometerReading 5.0", "AccelerometerReading 5.1"] Property { name: "x"; type: "double"; isReadonly: true } Property { name: "y"; type: "double"; isReadonly: true } Property { name: "z"; type: "double"; isReadonly: true } @@ -22,35 +36,35 @@ Module { Component { name: "QmlAmbientLightSensor" prototype: "QmlSensor" - exports: ["AmbientLightSensor 5.0"] + exports: ["AmbientLightSensor 5.0", "AmbientLightSensor 5.1"] } Component { name: "QmlAmbientLightSensorReading" prototype: "QmlSensorReading" - exports: ["AmbientLightReading 5.0"] + exports: ["AmbientLightReading 5.0", "AmbientLightReading 5.1"] Property { name: "lightLevel"; type: "QAmbientLightReading::LightLevel"; isReadonly: true } } Component { name: "QmlCompass" prototype: "QmlSensor" - exports: ["Compass 5.0"] + exports: ["Compass 5.0", "Compass 5.1"] } Component { name: "QmlCompassReading" prototype: "QmlSensorReading" - exports: ["CompassReading 5.0"] + exports: ["CompassReading 5.0", "CompassReading 5.1"] Property { name: "azimuth"; type: "double"; isReadonly: true } Property { name: "calibrationLevel"; type: "double"; isReadonly: true } } Component { name: "QmlGyroscope" prototype: "QmlSensor" - exports: ["Gyroscope 5.0"] + exports: ["Gyroscope 5.0", "Gyroscope 5.1"] } Component { name: "QmlGyroscopeReading" prototype: "QmlSensorReading" - exports: ["GyroscopeReading 5.0"] + exports: ["GyroscopeReading 5.0", "GyroscopeReading 5.1"] Property { name: "x"; type: "double"; isReadonly: true } Property { name: "y"; type: "double"; isReadonly: true } Property { name: "z"; type: "double"; isReadonly: true } @@ -58,35 +72,35 @@ Module { Component { name: "QmlIRProximitySensor" prototype: "QmlSensor" - exports: ["IRProximitySensor 5.0"] + exports: ["IRProximitySensor 5.0", "IRProximitySensor 5.1"] } Component { name: "QmlIRProximitySensorReading" prototype: "QmlSensorReading" - exports: ["IRProximityReading 5.0"] + exports: ["IRProximityReading 5.0", "IRProximityReading 5.1"] Property { name: "reflectance"; type: "double"; isReadonly: true } } Component { name: "QmlLightSensor" prototype: "QmlSensor" - exports: ["LightSensor 5.0"] + exports: ["LightSensor 5.0", "LightSensor 5.1"] Property { name: "fieldOfView"; type: "double"; isReadonly: true } } Component { name: "QmlLightSensorReading" prototype: "QmlSensorReading" - exports: ["LightReading 5.0"] + exports: ["LightReading 5.0", "LightReading 5.1"] Property { name: "illuminance"; type: "double"; isReadonly: true } } Component { name: "QmlMagnetometer" prototype: "QmlSensor" - exports: ["Magnetometer 5.0"] + exports: ["Magnetometer 5.0", "Magnetometer 5.1"] } Component { name: "QmlMagnetometerReading" prototype: "QmlSensorReading" - exports: ["MagnetometerReading 5.0"] + exports: ["MagnetometerReading 5.0", "MagnetometerReading 5.1"] Property { name: "x"; type: "double"; isReadonly: true } Property { name: "y"; type: "double"; isReadonly: true } Property { name: "z"; type: "double"; isReadonly: true } @@ -95,35 +109,35 @@ Module { Component { name: "QmlOrientationSensor" prototype: "QmlSensor" - exports: ["OrientationSensor 5.0"] + exports: ["OrientationSensor 5.0", "OrientationSensor 5.1"] } Component { name: "QmlOrientationSensorReading" prototype: "QmlSensorReading" - exports: ["OrientationReading 5.0"] + exports: ["OrientationReading 5.0", "OrientationReading 5.1"] Property { name: "orientation"; type: "QOrientationReading::Orientation"; isReadonly: true } } Component { name: "QmlProximitySensor" prototype: "QmlSensor" - exports: ["ProximitySensor 5.0"] + exports: ["ProximitySensor 5.0", "ProximitySensor 5.1"] } Component { name: "QmlProximitySensorReading" prototype: "QmlSensorReading" - exports: ["ProximityReading 5.0"] + exports: ["ProximityReading 5.0", "ProximityReading 5.1"] Property { name: "near"; type: "bool"; isReadonly: true } } Component { name: "QmlRotationSensor" prototype: "QmlSensor" - exports: ["RotationSensor 5.0"] + exports: ["RotationSensor 5.0", "RotationSensor 5.1"] Property { name: "hasZ"; type: "bool"; isReadonly: true } } Component { name: "QmlRotationSensorReading" prototype: "QmlSensorReading" - exports: ["RotationReading 5.0"] + exports: ["RotationReading 5.0", "RotationReading 5.1"] Property { name: "x"; type: "double"; isReadonly: true } Property { name: "y"; type: "double"; isReadonly: true } Property { name: "z"; type: "double"; isReadonly: true } @@ -131,7 +145,7 @@ Module { Component { name: "QmlSensor" prototype: "QObject" - exports: ["Sensor 5.0"] + exports: ["Sensor 5.0", "Sensor 5.1"] Property { name: "identifier"; type: "string" } Property { name: "type"; type: "string"; isReadonly: true } Property { name: "connectedToBackend"; type: "bool"; isReadonly: true } @@ -151,7 +165,7 @@ Module { Component { name: "QmlSensorGesture" prototype: "QObject" - exports: ["SensorGesture 5.0"] + exports: ["SensorGesture 5.0", "SensorGesture 5.1"] Property { name: "availableGestures"; type: "QStringList"; isReadonly: true } Property { name: "gestures"; type: "QStringList" } Property { name: "validGestures"; type: "QStringList"; isReadonly: true } @@ -165,7 +179,7 @@ Module { Component { name: "QmlSensorGlobal" prototype: "QObject" - exports: ["QmlSensors 5.0"] + exports: ["QmlSensors 5.0", "QmlSensors 5.1"] Signal { name: "availableSensorsChanged" } Method { name: "sensorTypes"; type: "QStringList" } Method { @@ -182,7 +196,7 @@ Module { Component { name: "QmlSensorOutputRange" prototype: "QObject" - exports: ["OutputRange 5.0"] + exports: ["OutputRange 5.0", "OutputRange 5.1"] Property { name: "minimum"; type: "double"; isReadonly: true } Property { name: "maximum"; type: "double"; isReadonly: true } Property { name: "accuracy"; type: "double"; isReadonly: true } @@ -190,26 +204,26 @@ Module { Component { name: "QmlSensorRange" prototype: "QObject" - exports: ["Range 5.0"] + exports: ["Range 5.0", "Range 5.1"] Property { name: "minimum"; type: "int"; isReadonly: true } Property { name: "maximum"; type: "int"; isReadonly: true } } Component { name: "QmlSensorReading" prototype: "QObject" - exports: ["SensorReading 5.0"] + exports: ["SensorReading 5.0", "SensorReading 5.1"] Property { name: "timestamp"; type: "qulonglong"; isReadonly: true } } Component { name: "QmlTapSensor" prototype: "QmlSensor" - exports: ["TapSensor 5.0"] + exports: ["TapSensor 5.0", "TapSensor 5.1"] Property { name: "returnDoubleTapEvents"; type: "bool" } } Component { name: "QmlTapSensorReading" prototype: "QmlSensorReading" - exports: ["TapReading 5.0"] + exports: ["TapReading 5.0", "TapReading 5.1"] Property { name: "tapDirection"; type: "QTapReading::TapDirection"; isReadonly: true } Property { name: "doubleTap"; type: "bool"; isReadonly: true } Signal { name: "isDoubleTapChanged" } @@ -217,13 +231,13 @@ Module { Component { name: "QmlTiltSensor" prototype: "QmlSensor" - exports: ["TiltSensor 5.0"] + exports: ["TiltSensor 5.0", "TiltSensor 5.1"] Method { name: "calibrate" } } Component { name: "QmlTiltSensorReading" prototype: "QmlSensorReading" - exports: ["TiltReading 5.0"] + exports: ["TiltReading 5.0", "TiltReading 5.1"] Property { name: "yRotation"; type: "double"; isReadonly: true } Property { name: "xRotation"; type: "double"; isReadonly: true } } diff --git a/src/imports/sensors/qmlaccelerometer.cpp b/src/imports/sensors/qmlaccelerometer.cpp index 390f8beb..6fc82eab 100644 --- a/src/imports/sensors/qmlaccelerometer.cpp +++ b/src/imports/sensors/qmlaccelerometer.cpp @@ -65,12 +65,33 @@ QmlAccelerometer::QmlAccelerometer(QObject *parent) : QmlSensor(parent) , m_sensor(new QAccelerometer(this)) { + connect(m_sensor, SIGNAL(accelerationModeChanged(AccelerationMode)), + this, SIGNAL(accelerationModeChanged(AccelerationMode))); } QmlAccelerometer::~QmlAccelerometer() { } +/*! + \qmlproperty AccelerationMode Accelerometer::accelerationMode + \since QtSensors 5.1 + + This property holds the current acceleration mode. + + Please see QAccelerometer::accelerationMode for information about this property. +*/ + +QmlAccelerometer::AccelerationMode QmlAccelerometer::accelerationMode() const +{ + return static_cast(m_sensor->accelerationMode()); +} + +void QmlAccelerometer::setAccelerationMode(QmlAccelerometer::AccelerationMode accelerationMode) +{ + m_sensor->setAccelerationMode(static_cast(accelerationMode)); +} + QmlSensorReading *QmlAccelerometer::createReading() const { return new QmlAccelerometerReading(m_sensor); diff --git a/src/imports/sensors/qmlaccelerometer.h b/src/imports/sensors/qmlaccelerometer.h index 95785ed4..b2dc671f 100644 --- a/src/imports/sensors/qmlaccelerometer.h +++ b/src/imports/sensors/qmlaccelerometer.h @@ -52,10 +52,25 @@ class QAccelerometer; class QmlAccelerometer : public QmlSensor { Q_OBJECT + Q_ENUMS(AccelerationMode) + Q_PROPERTY(AccelerationMode accelerationMode READ accelerationMode WRITE setAccelerationMode + NOTIFY accelerationModeChanged REVISION 1) public: explicit QmlAccelerometer(QObject *parent = 0); ~QmlAccelerometer(); + // Keep this enum in sync with QAccelerometer::AccelerationMode + enum AccelerationMode { + Combined, + Gravity, + User + }; + + AccelerationMode accelerationMode() const; + void setAccelerationMode(AccelerationMode accelerationMode); + +signals: + void accelerationModeChanged(AccelerationMode accelerationMode); private: QSensor *sensor() const Q_DECL_OVERRIDE; diff --git a/src/imports/sensors/sensors.cpp b/src/imports/sensors/sensors.cpp index 50ccdf93..95fc8ccc 100644 --- a/src/imports/sensors/sensors.cpp +++ b/src/imports/sensors/sensors.cpp @@ -125,6 +125,41 @@ public: qmlRegisterUncreatableType(package, major, minor, "TiltReading", QLatin1String("Cannot create TiltReading")); qmlRegisterType (package, major, minor, "SensorGesture"); + + // Register the 5.1 interfaces + major = 5; + minor = 1; + qmlRegisterSingletonType (package, major, minor, "QmlSensors", global_object_50); + qmlRegisterUncreatableType(package, major, minor, "Range", QLatin1String("Cannot create Range")); + qmlRegisterUncreatableType(package, major, minor, "OutputRange", QLatin1String("Cannot create OutputRange")); + qmlRegisterUncreatableType(package, major, minor, "Sensor", QLatin1String("Cannot create Sensor")); + qmlRegisterUncreatableType(package, major, minor, "SensorReading", QLatin1String("Cannot create SensorReading")); + qmlRegisterType (package, major, minor, "Accelerometer"); + qmlRegisterUncreatableType(package, major, minor, "AccelerometerReading", QLatin1String("Cannot create AccelerometerReading")); + qmlRegisterType (package, major, minor, "AmbientLightSensor"); + qmlRegisterUncreatableType(package, major, minor, "AmbientLightReading", QLatin1String("Cannot create AmbientLightReading")); + qmlRegisterType (package, major, minor, "Compass"); + qmlRegisterUncreatableType(package, major, minor, "CompassReading", QLatin1String("Cannot create CompassReading")); + qmlRegisterType (package, major, minor, "Gyroscope"); + qmlRegisterUncreatableType(package, major, minor, "GyroscopeReading", QLatin1String("Cannot create GyroscopeReading")); + qmlRegisterType (package, major, minor, "IRProximitySensor"); + qmlRegisterUncreatableType(package, major, minor, "IRProximityReading", QLatin1String("Cannot create IRProximityReading")); + qmlRegisterType (package, major, minor, "LightSensor"); + qmlRegisterUncreatableType(package, major, minor, "LightReading", QLatin1String("Cannot create LightReading")); + qmlRegisterType (package, major, minor, "Magnetometer"); + qmlRegisterUncreatableType(package, major, minor, "MagnetometerReading", QLatin1String("Cannot create MagnetometerReading")); + qmlRegisterType (package, major, minor, "OrientationSensor"); + qmlRegisterUncreatableType(package, major, minor, "OrientationReading", QLatin1String("Cannot create OrientationReading")); + qmlRegisterType (package, major, minor, "ProximitySensor"); + qmlRegisterUncreatableType(package, major, minor, "ProximityReading", QLatin1String("Cannot create ProximityReading")); + qmlRegisterType (package, major, minor, "RotationSensor"); + qmlRegisterUncreatableType(package, major, minor, "RotationReading", QLatin1String("Cannot create RotationReading")); + qmlRegisterType (package, major, minor, "TapSensor"); + qmlRegisterUncreatableType(package, major, minor, "TapReading", QLatin1String("Cannot create TapReading")); + qmlRegisterType (package, major, minor, "TiltSensor"); + qmlRegisterUncreatableType(package, major, minor, "TiltReading", QLatin1String("Cannot create TiltReading")); + + qmlRegisterType (package, major, minor, "SensorGesture"); } }; diff --git a/src/imports/sensors/sensors.pro b/src/imports/sensors/sensors.pro index 210ceac1..76362014 100644 --- a/src/imports/sensors/sensors.pro +++ b/src/imports/sensors/sensors.pro @@ -1,7 +1,7 @@ CXX_MODULE = sensors TARGET = declarative_sensors TARGETPATH = QtSensors -IMPORT_VERSION = 5.0 # Doesn't matter, as long as it's a valid version?! +IMPORT_VERSION = 5.1 # Doesn't matter, as long as it's a valid version?! QT += qml sensors sensors-private diff --git a/src/plugins/sensors/blackberry/bbaccelerometer.cpp b/src/plugins/sensors/blackberry/bbaccelerometer.cpp index dcbd7fcc..0826cf7a 100644 --- a/src/plugins/sensors/blackberry/bbaccelerometer.cpp +++ b/src/plugins/sensors/blackberry/bbaccelerometer.cpp @@ -44,6 +44,12 @@ BbAccelerometer::BbAccelerometer(QSensor *sensor) : BbSensorBackend(devicePath(), SENSOR_TYPE_ACCELEROMETER, sensor) { setDescription(QLatin1String("X, Y, and Z axes accelerations in m/s^2")); + + QAccelerometer * const accelerometer = qobject_cast(sensor); + if (accelerometer) { + connect(accelerometer, SIGNAL(accelerationModeChanged(AccelerationMode)), + this, SLOT(applyAccelerationMode())); + } } bool BbAccelerometer::updateReadingFromEvent(const sensor_event_t &event, QAccelerometerReading *reading) @@ -58,7 +64,39 @@ bool BbAccelerometer::updateReadingFromEvent(const sensor_event_t &event, QAccel return true; } +void BbAccelerometer::start() +{ + applyAccelerationMode(); + BbSensorBackend::start(); +} + QString BbAccelerometer::devicePath() { return QLatin1String("/dev/sensor/accel"); } + +void BbAccelerometer::applyAccelerationMode() +{ + const QAccelerometer * const accelerometer = qobject_cast(sensor()); + if (accelerometer) { + QString fileName; + sensor_type_e sensorType; + switch (accelerometer->accelerationMode()) { + case QAccelerometer::Gravity: + fileName = QLatin1String("/dev/sensor/gravity"); + sensorType = SENSOR_TYPE_GRAVITY; + break; + case QAccelerometer::User: + fileName = QLatin1String("/dev/sensor/linAccel"); + sensorType = SENSOR_TYPE_LINEAR_ACCEL; + break; + default: + case QAccelerometer::Combined: + fileName = devicePath(); + sensorType = SENSOR_TYPE_ACCELEROMETER; + break; + } + + setDevice(fileName, sensorType); + } +} diff --git a/src/plugins/sensors/blackberry/bbaccelerometer.h b/src/plugins/sensors/blackberry/bbaccelerometer.h index aa47873c..3071c801 100644 --- a/src/plugins/sensors/blackberry/bbaccelerometer.h +++ b/src/plugins/sensors/blackberry/bbaccelerometer.h @@ -51,10 +51,14 @@ class BbAccelerometer : public BbSensorBackend public: explicit BbAccelerometer(QSensor *sensor); + void start() Q_DECL_OVERRIDE; static QString devicePath(); protected: bool updateReadingFromEvent(const sensor_event_t &event, QAccelerometerReading *reading) Q_DECL_OVERRIDE; + +private Q_SLOTS: + void applyAccelerationMode(); }; #endif diff --git a/src/plugins/sensors/blackberry/bbsensorbackend.cpp b/src/plugins/sensors/blackberry/bbsensorbackend.cpp index fa8c89be..324929fd 100644 --- a/src/plugins/sensors/blackberry/bbsensorbackend.cpp +++ b/src/plugins/sensors/blackberry/bbsensorbackend.cpp @@ -107,6 +107,21 @@ sensor_type_e BbSensorBackendBase::sensorType() const return m_sensorType; } +void BbSensorBackendBase::setDevice(const QString &deviceFile, sensor_type_e sensorType) +{ + if (deviceFile != m_deviceFile.fileName()) { + setPaused(true); + delete m_socketNotifier.take(); + m_deviceFile.close(); + + m_sensorType = sensorType; + m_deviceFile.setFileName(deviceFile); + initSensorInfo(); + if (m_started) + start(); // restart with new device file + } +} + void BbSensorBackendBase::initSensorInfo() { if (!m_deviceFile.open(QFile::ReadOnly | QFile::Unbuffered)) { @@ -283,6 +298,7 @@ bool BbSensorBackendBase::isFeatureSupported(QSensor::Feature feature) const switch (feature) { case QSensor::AlwaysOn: case QSensor::Buffering: + case QSensor::AccelerationMode: return true; case QSensor::Reserved: case QSensor::GeoValues: diff --git a/src/plugins/sensors/blackberry/bbsensorbackend.h b/src/plugins/sensors/blackberry/bbsensorbackend.h index 7e2ad0ec..cd9a0e22 100644 --- a/src/plugins/sensors/blackberry/bbsensorbackend.h +++ b/src/plugins/sensors/blackberry/bbsensorbackend.h @@ -75,8 +75,11 @@ public: protected: BbGuiHelper *guiHelper() const; QFile& deviceFile(); + sensor_type_e sensorType() const; + void setDevice(const QString &deviceFile, sensor_type_e sensorType); + // This is called while the device file is open during initalization and gives a subclass // an opportunity to do additional initalization. virtual void additionalDeviceInit(); 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