From f2f289b5048eab47901fe75dd41770ffd630dead Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Wed, 24 Aug 2016 15:29:14 +0200 Subject: IOSCompass: calculate correct calibration level A compass has 360 degrees, not 365. Change-Id: I2f0628fa0151434b1b529fbefd1a4bab9de99a8a Reviewed-by: Edward Welbourne --- src/plugins/sensors/ios/ioscompass.mm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/plugins/sensors/ios/ioscompass.mm b/src/plugins/sensors/ios/ioscompass.mm index 9bb5b44a..5f3d1abc 100644 --- a/src/plugins/sensors/ios/ioscompass.mm +++ b/src/plugins/sensors/ios/ioscompass.mm @@ -65,8 +65,8 @@ QT_BEGIN_NAMESPACE quint64 timestamp = quint64(newHeading.timestamp.timeIntervalSinceReferenceDate * 1e6); double accuracy = newHeading.headingAccuracy; // Accuracy is the maximum number of degrees the reading can be off. The QtSensors scale - // goes from 1 to 0, with 1 being the best (0 degrees off), and 0 worst (365 degrees off): - qreal calibrationLevel = (accuracy < 0) ? 0 : qMax(0., 1 - (accuracy / 365)); + // goes from 1 to 0, with 1 being the best (0 degrees off), and 0 worst (360 degrees off): + qreal calibrationLevel = (accuracy < 0) ? 0 : qMax(0., 1 - (accuracy / 360)); qreal heading = qreal(newHeading.magneticHeading); m_iosCompass->headingChanged(heading, timestamp, calibrationLevel); } -- cgit v1.2.3 From 46d9a630a88fc5388dec7fd99289d0e9e0e1f680 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Wed, 24 Aug 2016 14:19:40 +0200 Subject: iOS: protect OS sensors from being stopped when shared by several Qt sensors When a Qt sensor is told to stop, it automatically stops the underlying OS sensor as well. This caused a problem when several Qt sensors were running, since stopping one would stop them all. This patch will add a ref count for each affected sensor, so that we keep track of when it's safe to start and stop the underlying OS sensor. Task-number: QTBUG-54977 Change-Id: If06c4daac22916feef2f4c7bd521363d74f342a6 Reviewed-by: Edward Welbourne Reviewed-by: Lorn Potter --- src/plugins/sensors/ios/iosaccelerometer.h | 2 ++ src/plugins/sensors/ios/iosaccelerometer.mm | 14 ++++++++++-- src/plugins/sensors/ios/iosgyroscope.h | 2 ++ src/plugins/sensors/ios/iosgyroscope.mm | 14 ++++++++++-- src/plugins/sensors/ios/iosmagnetometer.h | 3 +++ src/plugins/sensors/ios/iosmagnetometer.mm | 32 ++++++++++++++++++++------- src/plugins/sensors/ios/iosproximitysensor.h | 2 ++ src/plugins/sensors/ios/iosproximitysensor.mm | 14 ++++++++++-- 8 files changed, 69 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/plugins/sensors/ios/iosaccelerometer.h b/src/plugins/sensors/ios/iosaccelerometer.h index 05de7a26..94a2ed8e 100644 --- a/src/plugins/sensors/ios/iosaccelerometer.h +++ b/src/plugins/sensors/ios/iosaccelerometer.h @@ -56,6 +56,8 @@ private: CMMotionManager *m_motionManager; QAccelerometerReading m_reading; int m_timer; + + static int s_startCount; }; QT_END_NAMESPACE diff --git a/src/plugins/sensors/ios/iosaccelerometer.mm b/src/plugins/sensors/ios/iosaccelerometer.mm index 570d58ba..dbeef017 100644 --- a/src/plugins/sensors/ios/iosaccelerometer.mm +++ b/src/plugins/sensors/ios/iosaccelerometer.mm @@ -40,6 +40,8 @@ char const * const IOSAccelerometer::id("ios.accelerometer"); QT_BEGIN_NAMESPACE +int IOSAccelerometer::s_startCount = 0; + IOSAccelerometer::IOSAccelerometer(QSensor *sensor) : QSensorBackend(sensor) , m_motionManager([QIOSMotionManager sharedManager]) @@ -52,16 +54,24 @@ IOSAccelerometer::IOSAccelerometer(QSensor *sensor) void IOSAccelerometer::start() { + if (m_timer != 0) + return; + int hz = sensor()->dataRate(); m_timer = startTimer(1000 / (hz == 0 ? 60 : hz)); - [m_motionManager startAccelerometerUpdates]; + if (++s_startCount == 1) + [m_motionManager startAccelerometerUpdates]; } void IOSAccelerometer::stop() { - [m_motionManager stopAccelerometerUpdates]; + if (m_timer == 0) + return; + killTimer(m_timer); m_timer = 0; + if (--s_startCount == 0) + [m_motionManager stopAccelerometerUpdates]; } void IOSAccelerometer::timerEvent(QTimerEvent *) diff --git a/src/plugins/sensors/ios/iosgyroscope.h b/src/plugins/sensors/ios/iosgyroscope.h index f5c429d7..0b185233 100644 --- a/src/plugins/sensors/ios/iosgyroscope.h +++ b/src/plugins/sensors/ios/iosgyroscope.h @@ -56,6 +56,8 @@ private: CMMotionManager *m_motionManager; QGyroscopeReading m_reading; int m_timer; + + static int s_startCount; }; QT_END_NAMESPACE diff --git a/src/plugins/sensors/ios/iosgyroscope.mm b/src/plugins/sensors/ios/iosgyroscope.mm index fa051dac..0a4699c1 100644 --- a/src/plugins/sensors/ios/iosgyroscope.mm +++ b/src/plugins/sensors/ios/iosgyroscope.mm @@ -38,6 +38,8 @@ char const * const IOSGyroscope::id("ios.gyroscope"); QT_BEGIN_NAMESPACE +int IOSGyroscope::s_startCount = 0; + IOSGyroscope::IOSGyroscope(QSensor *sensor) : QSensorBackend(sensor) , m_motionManager([QIOSMotionManager sharedManager]) @@ -50,16 +52,24 @@ IOSGyroscope::IOSGyroscope(QSensor *sensor) void IOSGyroscope::start() { + if (m_timer != 0) + return; + int hz = sensor()->dataRate(); m_timer = startTimer(1000 / (hz == 0 ? 60 : hz)); - [m_motionManager startGyroUpdates]; + if (++s_startCount == 1) + [m_motionManager startGyroUpdates]; } void IOSGyroscope::stop() { - [m_motionManager stopGyroUpdates]; + if (m_timer == 0) + return; + killTimer(m_timer); m_timer = 0; + if (--s_startCount == 0) + [m_motionManager stopGyroUpdates]; } void IOSGyroscope::timerEvent(QTimerEvent *) diff --git a/src/plugins/sensors/ios/iosmagnetometer.h b/src/plugins/sensors/ios/iosmagnetometer.h index f6430f5d..b8e611d2 100644 --- a/src/plugins/sensors/ios/iosmagnetometer.h +++ b/src/plugins/sensors/ios/iosmagnetometer.h @@ -60,6 +60,9 @@ private: QMagnetometerReading m_reading; int m_timer; bool m_returnGeoValues; + + static int s_magnetometerStartCount; + static int s_deviceMotionStartCount; }; QT_END_NAMESPACE diff --git a/src/plugins/sensors/ios/iosmagnetometer.mm b/src/plugins/sensors/ios/iosmagnetometer.mm index 6c4fbaad..5326a762 100644 --- a/src/plugins/sensors/ios/iosmagnetometer.mm +++ b/src/plugins/sensors/ios/iosmagnetometer.mm @@ -38,6 +38,9 @@ QT_BEGIN_NAMESPACE char const * const IOSMagnetometer::id("ios.magnetometer"); +int IOSMagnetometer::s_magnetometerStartCount = 0; +int IOSMagnetometer::s_deviceMotionStartCount = 0; + IOSMagnetometer::IOSMagnetometer(QSensor *sensor) : QSensorBackend(sensor) , m_motionManager([QIOSMotionManager sharedManager]) @@ -55,24 +58,37 @@ IOSMagnetometer::IOSMagnetometer(QSensor *sensor) void IOSMagnetometer::start() { + if (m_timer != 0) + return; + int hz = sensor()->dataRate(); m_timer = startTimer(1000 / (hz == 0 ? 60 : hz)); m_returnGeoValues = static_cast(sensor())->returnGeoValues(); - if (m_returnGeoValues) - [m_motionManager startDeviceMotionUpdates]; - else - [m_motionManager startMagnetometerUpdates]; + if (m_returnGeoValues) { + if (++s_deviceMotionStartCount == 1) + [m_motionManager startDeviceMotionUpdates]; + } else { + if (++s_magnetometerStartCount == 1) + [m_motionManager startMagnetometerUpdates]; + } } void IOSMagnetometer::stop() { - if (m_returnGeoValues) - [m_motionManager stopDeviceMotionUpdates]; - else - [m_motionManager stopMagnetometerUpdates]; + if (m_timer == 0) + return; + killTimer(m_timer); m_timer = 0; + + if (m_returnGeoValues) { + if (--s_deviceMotionStartCount == 0) + [m_motionManager stopDeviceMotionUpdates]; + } else { + if (--s_magnetometerStartCount == 0) + [m_motionManager stopMagnetometerUpdates]; + } } void IOSMagnetometer::timerEvent(QTimerEvent *) diff --git a/src/plugins/sensors/ios/iosproximitysensor.h b/src/plugins/sensors/ios/iosproximitysensor.h index 147bc230..5a6b38ca 100644 --- a/src/plugins/sensors/ios/iosproximitysensor.h +++ b/src/plugins/sensors/ios/iosproximitysensor.h @@ -58,6 +58,8 @@ public: private: ProximitySensorCallback *m_proximitySensorCallback; QProximityReading m_reading; + + static int s_startCount; }; QT_END_NAMESPACE diff --git a/src/plugins/sensors/ios/iosproximitysensor.mm b/src/plugins/sensors/ios/iosproximitysensor.mm index 6905e5cc..0d673d12 100644 --- a/src/plugins/sensors/ios/iosproximitysensor.mm +++ b/src/plugins/sensors/ios/iosproximitysensor.mm @@ -39,6 +39,8 @@ char const * const IOSProximitySensor::id("ios.proximitysensor"); QT_BEGIN_NAMESPACE +int IOSProximitySensor::s_startCount = 0; + @interface ProximitySensorCallback : NSObject { IOSProximitySensor *m_iosProximitySensor; @@ -104,8 +106,12 @@ IOSProximitySensor::~IOSProximitySensor() void IOSProximitySensor::start() { + if (m_proximitySensorCallback) + return; + m_proximitySensorCallback = [[ProximitySensorCallback alloc] initWithQIOSProximitySensor:this]; - [UIDevice currentDevice].proximityMonitoringEnabled = YES; + if (++s_startCount == 1) + [UIDevice currentDevice].proximityMonitoringEnabled = YES; } void IOSProximitySensor::proximityChanged(bool close) @@ -117,9 +123,13 @@ void IOSProximitySensor::proximityChanged(bool close) void IOSProximitySensor::stop() { - [UIDevice currentDevice].proximityMonitoringEnabled = NO; + if (!m_proximitySensorCallback) + return; + [m_proximitySensorCallback release]; m_proximitySensorCallback = 0; + if (--s_startCount == 0) + [UIDevice currentDevice].proximityMonitoringEnabled = NO; } QT_END_NAMESPACE -- cgit v1.2.3 From 0032fd615097baeff2414e352e095bc412000941 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Fri, 26 Aug 2016 12:03:30 +0200 Subject: Fix loading of QML plugins Since commit 709f6370884b110def2e4665df8fa7bbf5fae734 the plugin loader is strict about requiring the correct interface id, to avoid loading unrelated plugins in the loader thread (which they may not be prepared to do). Change-Id: I84e4d927489f9a14615db399b560af4b352bf045 Reviewed-by: Alex Blasche --- src/imports/sensors/sensors.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/imports/sensors/sensors.cpp b/src/imports/sensors/sensors.cpp index c6f61c22..d1f5bb48 100644 --- a/src/imports/sensors/sensors.cpp +++ b/src/imports/sensors/sensors.cpp @@ -93,7 +93,7 @@ static QObject *global_object_50(QQmlEngine *, QJSEngine *) class QtSensorsDeclarativeModule : public QQmlExtensionPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface" FILE "plugin.json") + Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid FILE "plugin.json") public: QtSensorsDeclarativeModule(QObject *parent = 0) : QQmlExtensionPlugin(parent) { initResources(); } virtual void registerTypes(const char *uri) -- cgit v1.2.3