summaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--src/plugins/sensors/ios/iosaccelerometer.h2
-rw-r--r--src/plugins/sensors/ios/iosaccelerometer.mm14
-rw-r--r--src/plugins/sensors/ios/iosgyroscope.h2
-rw-r--r--src/plugins/sensors/ios/iosgyroscope.mm14
-rw-r--r--src/plugins/sensors/ios/iosmagnetometer.h3
-rw-r--r--src/plugins/sensors/ios/iosmagnetometer.mm32
-rw-r--r--src/plugins/sensors/ios/iosproximitysensor.h2
-rw-r--r--src/plugins/sensors/ios/iosproximitysensor.mm14
8 files changed, 69 insertions, 14 deletions
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<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 *)
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