summaryrefslogtreecommitdiffstats
path: root/src/plugins/sensors/ios/iosaccelerometer.mm
diff options
context:
space:
mode:
authorLorn Potter <lorn.potter@gmail.com>2012-11-24 20:39:46 +1000
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-03-12 10:22:35 +0100
commit94d62b006d145f4f3df6bd5299d412aa0d6a9c87 (patch)
tree6436a048a04e8e25b41167fe36b83ed757f6651e /src/plugins/sensors/ios/iosaccelerometer.mm
parent1f266d31dcdf1ced8a6d05f57a1ff77848d21f3e (diff)
iOS: implement accelerometer for iOS
This change implements an accelerometer for iOS. Change-Id: Id6de98427312bc0be42935fd9704117665d1e4a2 Reviewed-by: Thomas McGuire <thomas.mcguire@kdab.com>
Diffstat (limited to 'src/plugins/sensors/ios/iosaccelerometer.mm')
-rw-r--r--src/plugins/sensors/ios/iosaccelerometer.mm143
1 files changed, 143 insertions, 0 deletions
diff --git a/src/plugins/sensors/ios/iosaccelerometer.mm b/src/plugins/sensors/ios/iosaccelerometer.mm
new file mode 100644
index 00000000..ef7d2a6d
--- /dev/null
+++ b/src/plugins/sensors/ios/iosaccelerometer.mm
@@ -0,0 +1,143 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Lorn Potter
+** Contact: http://www.qt-project.org/legal
+**
+** 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 Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "iosaccelerometer.h"
+#include "iosmotionmanager.h"
+
+#include <UIKit/UIAccelerometer.h>
+#include <CoreMotion/CMMotionManager.h>
+
+char const * const IOSAccelerometer::id("ios.accelerometer");
+
+@interface QtIoAccelListener : NSObject
+{
+ IOSAccelerometer *m_qiosAccelerometer;
+ NSOperationQueue *m_updateQueue;
+}
+@end
+
+@implementation QtIoAccelListener
+
+-(id)initWithQIOSAccelerometer:(IOSAccelerometer *) qiosAccelerometer
+{
+ self = [super init];
+ if (self) {
+ m_qiosAccelerometer = qiosAccelerometer;
+ m_updateQueue = [[NSOperationQueue alloc] init];
+ }
+ return self;
+}
+
+-(void)dealloc
+{
+ [m_updateQueue release];
+ [super dealloc];
+}
+
+-(void)startAccelerometer
+{
+ CMMotionManager *motionManager = [QIOSMotionManager sharedManager];
+
+ if (motionManager.deviceMotionAvailable) {
+ [motionManager startAccelerometerUpdatesToQueue:m_updateQueue withHandler:^(CMAccelerometerData *data, NSError *error) {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ Q_UNUSED(error);
+ CMAcceleration acc = data.acceleration;
+ // Convert from G to m/s2, and flip axes:
+ const qreal G = 9.8066;
+ qreal x = qreal(acc.x) * G * -1;
+ qreal y = qreal(acc.y) * G * -1;
+ qreal z = qreal(acc.z) * G * -1;
+ m_qiosAccelerometer->readingsChanged(quint64(data.timestamp), x, y, z);
+ });
+ }];
+ }
+}
+
+-(void)stopAccelerometer
+{
+ [[QIOSMotionManager sharedManager] stopAccelerometerUpdates];
+}
+
+-(void)setInterval:(NSTimeInterval) interval
+{
+ [QIOSMotionManager sharedManager].accelerometerUpdateInterval = interval;
+}
+
+@end
+
+QT_BEGIN_NAMESPACE
+
+IOSAccelerometer::IOSAccelerometer(QSensor *sensor)
+ : QSensorBackend(sensor)
+ , m_listener([[QtIoAccelListener alloc] initWithQIOSAccelerometer:this])
+{
+ setReading<QAccelerometerReading>(&m_reading);
+ addDataRate(1, 100); // 100Hz
+ addOutputRange(-22.418, 22.418, 0.17651); // 2G
+}
+
+IOSAccelerometer::~IOSAccelerometer()
+{
+ [m_listener dealloc];
+}
+
+void IOSAccelerometer::start()
+{
+ [m_listener startAccelerometer];
+}
+
+void IOSAccelerometer::stop()
+{
+ [m_listener stopAccelerometer];
+}
+
+void IOSAccelerometer::readingsChanged(quint64 ts, qreal x, qreal y, qreal z)
+{
+ m_reading.setTimestamp(ts);
+ m_reading.setX(x);
+ m_reading.setY(y);
+ m_reading.setZ(z);
+
+ newReadingAvailable();
+}
+
+QT_END_NAMESPACE