summaryrefslogtreecommitdiffstats
path: root/src/plugins/sensors/ios/iosmagnetometer.mm
diff options
context:
space:
mode:
authorRichard Moe Gustavsen <richard.gustavsen@qt.io>2016-08-24 14:19:40 +0200
committerRichard Moe Gustavsen <richard.gustavsen@qt.io>2016-08-25 07:57:22 +0000
commit46d9a630a88fc5388dec7fd99289d0e9e0e1f680 (patch)
tree282f24c50f249090994791e7224af2b82e31db62 /src/plugins/sensors/ios/iosmagnetometer.mm
parentf2f289b5048eab47901fe75dd41770ffd630dead (diff)
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 <edward.welbourne@qt.io> Reviewed-by: Lorn Potter <lorn.potter@canonical.com>
Diffstat (limited to 'src/plugins/sensors/ios/iosmagnetometer.mm')
-rw-r--r--src/plugins/sensors/ios/iosmagnetometer.mm32
1 files changed, 24 insertions, 8 deletions
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<QMagnetometer *>(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 *)