summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTamás Martinec <tamas.martinec@symbio.com>2021-11-09 15:51:38 +0200
committerTamás Martinec <tamas.martinec@symbio.com>2021-11-17 12:15:38 +0200
commit9e6bd24a0672700b710ff36d59e6b38e67473f71 (patch)
tree16659c9a12b1f81087e756d69937de2c66c295ed
parent851ec98b341ed8ad67caac32653178e0bb189bfe (diff)
QtSensors: Implement iOS pressure sensor
Task-number: QTBUG-70877 Pick-to: 6.2 Change-Id: Ibff63b412a1cc5a8234d3c7600ec70a717acab7d Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
-rw-r--r--src/plugins/sensors/ios/CMakeLists.txt1
-rw-r--r--src/plugins/sensors/ios/iospressure.h73
-rw-r--r--src/plugins/sensors/ios/iospressure.mm101
-rw-r--r--src/plugins/sensors/ios/main.mm5
-rw-r--r--src/sensors/doc/src/compatmap.qdoc2
5 files changed, 181 insertions, 1 deletions
diff --git a/src/plugins/sensors/ios/CMakeLists.txt b/src/plugins/sensors/ios/CMakeLists.txt
index 56a47f17..ba60a197 100644
--- a/src/plugins/sensors/ios/CMakeLists.txt
+++ b/src/plugins/sensors/ios/CMakeLists.txt
@@ -38,6 +38,7 @@ qt_internal_extend_target(IOSSensorPlugin CONDITION UIKIT AND NOT TVOS
iosaccelerometer.h iosaccelerometer.mm
iosgyroscope.h iosgyroscope.mm
iosmagnetometer.h iosmagnetometer.mm
+ iospressure.h iospressure.mm
iosmotionmanager.h iosmotionmanager.mm
DEFINES
HAVE_COREMOTION
diff --git a/src/plugins/sensors/ios/iospressure.h b/src/plugins/sensors/ios/iospressure.h
new file mode 100644
index 00000000..f4796e11
--- /dev/null
+++ b/src/plugins/sensors/ios/iospressure.h
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef IOSPRESSURE_H
+#define IOSPRESSURE_H
+
+#include <qsensorbackend.h>
+#include <qpressuresensor.h>
+
+@class CMAltimeter;
+
+QT_BEGIN_NAMESPACE
+
+class IOSPressure : public QSensorBackend
+{
+public:
+ static char const * const id;
+
+ explicit IOSPressure(QSensor *sensor);
+ ~IOSPressure();
+ void timerEvent(QTimerEvent *) override;
+
+ void start() override;
+ void stop() override;
+
+private:
+ Q_DISABLE_COPY_MOVE(IOSPressure)
+ CMAltimeter *m_altimeter = nullptr;
+ QPressureReading m_reading;
+ int m_timer = 0;
+
+ static int s_startCount;
+};
+QT_END_NAMESPACE
+
+#endif // IOSPRESSURE_H
+
diff --git a/src/plugins/sensors/ios/iospressure.mm b/src/plugins/sensors/ios/iospressure.mm
new file mode 100644
index 00000000..8d72dfb6
--- /dev/null
+++ b/src/plugins/sensors/ios/iospressure.mm
@@ -0,0 +1,101 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "iospressure.h"
+#import <CoreMotion/CoreMotion.h>
+
+char const * const IOSPressure::id("ios.pressure");
+
+QT_BEGIN_NAMESPACE
+
+int IOSPressure::s_startCount = 0;
+
+IOSPressure::IOSPressure(QSensor *sensor)
+ : QSensorBackend(sensor)
+{
+ m_altimeter = [[CMAltimeter alloc] init];
+ setReading<QPressureReading>(&m_reading);
+ addDataRate(1, 100); // 100Hz
+}
+
+IOSPressure::~IOSPressure()
+{
+ [m_altimeter stopRelativeAltitudeUpdates];
+ [m_altimeter release];
+}
+
+void IOSPressure::start()
+{
+ if (m_timer != 0)
+ return;
+
+ int hz = sensor()->dataRate();
+ m_timer = startTimer(1000 / (hz == 0 ? 60 : hz));
+ if (++s_startCount == 1) {
+ [m_altimeter startRelativeAltitudeUpdatesToQueue:[NSOperationQueue mainQueue]
+ withHandler:^(CMAltitudeData * _Nullable altitudeData , NSError * _Nullable error) {
+ if (error == nil) {
+ m_reading.setPressure([altitudeData.pressure doubleValue] * 1000);
+ m_reading.setTimestamp(quint64(altitudeData.timestamp * 1e6));
+ }
+ }];
+ }
+}
+
+void IOSPressure::stop()
+{
+ if (m_timer == 0)
+ return;
+
+ killTimer(m_timer);
+ m_timer = 0;
+ if (--s_startCount == 0)
+ [m_altimeter stopRelativeAltitudeUpdates];
+}
+
+void IOSPressure::timerEvent(QTimerEvent *)
+{
+ // skip update if NaN or 0
+ if ((m_reading.pressure() != m_reading.pressure()) ||
+ m_reading.pressure() == 0)
+ return;
+ newReadingAvailable();
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/sensors/ios/main.mm b/src/plugins/sensors/ios/main.mm
index 13c71961..b27ff46e 100644
--- a/src/plugins/sensors/ios/main.mm
+++ b/src/plugins/sensors/ios/main.mm
@@ -47,6 +47,7 @@
#include "iosmagnetometer.h"
#include "ioscompass.h"
#include "iosproximitysensor.h"
+#include "iospressure.h"
#import <CoreLocation/CoreLocation.h>
#ifdef HAVE_COREMOTION
@@ -67,6 +68,8 @@ public:
QSensorManager::registerBackend(QGyroscope::sensorType, IOSGyroscope::id, this);
if ([QIOSMotionManager sharedManager].magnetometerAvailable)
QSensorManager::registerBackend(QMagnetometer::sensorType, IOSMagnetometer::id, this);
+ if ([CMAltimeter isRelativeAltitudeAvailable])
+ QSensorManager::registerBackend(QPressureSensor::sensorType, IOSPressure::id, this);
#endif
#ifdef HAVE_COMPASS
if ([CLLocationManager headingAvailable])
@@ -87,6 +90,8 @@ public:
return new IOSGyroscope(sensor);
if (sensor->identifier() == IOSMagnetometer::id)
return new IOSMagnetometer(sensor);
+ if (sensor->identifier() == IOSPressure::id)
+ return new IOSPressure(sensor);
#endif
#ifdef HAVE_COMPASS
if (sensor->identifier() == IOSCompass::id)
diff --git a/src/sensors/doc/src/compatmap.qdoc b/src/sensors/doc/src/compatmap.qdoc
index ef1340b8..025af476 100644
--- a/src/sensors/doc/src/compatmap.qdoc
+++ b/src/sensors/doc/src/compatmap.qdoc
@@ -127,7 +127,7 @@
<td nowrap="nowrap">Pressure Sensor</td>
<td bgcolor="green"></td>
<td bgcolor="gray"></td>
- <td bgcolor="gray"></td>
+ <td bgcolor="green"></td>
<td bgcolor="gray"></td>
<td bgcolor="gray"></td>
</tr>