summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLorn Potter <lorn.potter@nokia.com>2012-07-05 14:38:37 +1000
committerQt by Nokia <qt-info@nokia.com>2012-07-18 05:53:50 +0200
commit359d4411b22801e91978c121cd77bc440ee55e7e (patch)
treeccb53a5ef7092c19563f0ebde6cacc6eb03dcf57 /src
parenta72d15c8a7ca8b89b2160f4e48af5cf69e2a31e7 (diff)
add linux sys accelerometer reader backend
Most of this code comes from QtMobility n900 sensors backend. Change-Id: Iacbf9363ac8fc4b8b737dc857766f02655374db7 Reviewed-by: Lincoln Ramsay <lincoln.ramsay@nokia.com>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/sensors/linux/linux.pro18
-rw-r--r--src/plugins/sensors/linux/linuxsysaccelerometer.cpp194
-rw-r--r--src/plugins/sensors/linux/linuxsysaccelerometer.h77
-rw-r--r--src/plugins/sensors/linux/main.cpp75
-rw-r--r--src/plugins/sensors/linux/plugin.json1
-rw-r--r--src/plugins/sensors/sensors.pro1
6 files changed, 366 insertions, 0 deletions
diff --git a/src/plugins/sensors/linux/linux.pro b/src/plugins/sensors/linux/linux.pro
new file mode 100644
index 00000000..c0059ec7
--- /dev/null
+++ b/src/plugins/sensors/linux/linux.pro
@@ -0,0 +1,18 @@
+load(qt_build_config)
+
+TARGET = qtsensors_linuxsys
+QT = core sensors
+
+load(qt_plugin)
+
+DESTDIR = $$QT.sensors.plugins/sensors
+
+OTHER_FILES = plugin.json
+
+LIBS += -lrt
+HEADERS += linuxsysaccelerometer.h
+SOURCES += linuxsysaccelerometer.cpp \
+main.cpp
+
+target.path += $$[QT_INSTALL_PLUGINS]/sensors
+INSTALLS += target
diff --git a/src/plugins/sensors/linux/linuxsysaccelerometer.cpp b/src/plugins/sensors/linux/linuxsysaccelerometer.cpp
new file mode 100644
index 00000000..e0c6171e
--- /dev/null
+++ b/src/plugins/sensors/linux/linuxsysaccelerometer.cpp
@@ -0,0 +1,194 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "linuxsysaccelerometer.h"
+#include <QtCore/QDebug>
+#include <QtCore/QtGlobal>
+#include <QtCore/QFile>
+#include <QtCore/QDebug>
+#include <QtCore/QTimer>
+
+#include <QtCore/QStringList>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <fcntl.h>
+
+char const * const LinuxSysAccelerometer::id("linuxsys.accelerometer");
+
+// This plugin reads the accelerometer from a sys interface.
+
+// test machine (laptop):
+// QT_ACCEL_FILEPATH=/sys/devices/platform/lis3lv02d/position
+// QT_ACCEL_DATADIVISOR=7
+// QT_ACCEL_DELIMITER=,
+
+quint64 produceTimestamp()
+{
+ struct timespec tv;
+ int ok;
+
+#ifdef CLOCK_MONOTONIC_RAW
+ ok = clock_gettime(CLOCK_MONOTONIC_RAW, &tv);
+ if (ok != 0)
+#endif
+ ok = clock_gettime(CLOCK_MONOTONIC, &tv);
+ Q_ASSERT(ok == 0);
+
+ quint64 result = (tv.tv_sec * 1000000ULL) + (tv.tv_nsec * 0.001); // scale to microseconds
+ return result;
+}
+
+// TODO get output template from env and apply
+// Currently this assumes the output is like:
+// (x,y,z) or x,y,z
+
+LinuxSysAccelerometer::LinuxSysAccelerometer(QSensor *sensor)
+ : QSensorBackend(sensor)
+ , m_timerid(0)
+ , fd(0)
+ , path(QString())
+ , divisor(0)
+ , delimiter(QString())
+{
+ setReading<QAccelerometerReading>(&m_reading);
+ addDataRate(1, 100); // 100Hz
+ addOutputRange(-22.418, 22.418, 0.17651); // 2G
+// not sure how to retrieve proper range
+
+ path = QString::fromLatin1(qgetenv("QT_ACCEL_FILEPATH"));
+ bool ok;
+ divisor = QString::fromLatin1(qgetenv("QT_ACCEL_DATADIVISOR")).toInt(&ok);
+ if (divisor == 0 || !ok) {
+ divisor = 1;
+ }
+ delimiter = QString::fromLatin1(qgetenv("QT_ACCEL_DELIMITER"));
+ file.setFileName(path);
+}
+
+LinuxSysAccelerometer::~LinuxSysAccelerometer()
+{
+ closeFile();
+}
+
+void LinuxSysAccelerometer::start()
+{
+ if (m_timerid)
+ return;
+
+ if (!openFile())
+ return;
+
+ int dataRate = sensor()->dataRate();
+ if (dataRate == 0) {
+ if (sensor()->availableDataRates().count())
+ dataRate = sensor()->availableDataRates().first().second;
+ else
+ dataRate = 1;
+ }
+
+ int interval = 1000 / dataRate;
+
+ if (interval)
+ m_timerid = startTimer(interval);
+}
+
+void LinuxSysAccelerometer::stop()
+{
+ if (m_timerid) {
+ killTimer(m_timerid);
+ m_timerid = 0;
+ }
+ closeFile();
+}
+
+void LinuxSysAccelerometer::poll()
+{
+ if (!file.isOpen())
+ return;
+
+ file.seek(0);
+ QString str = file.readLine();
+ if (str.isEmpty()) {
+ return;
+ }
+ str = str.simplified();
+
+ if (!str.at(0).isNumber() && str.at(0) != '-') {
+ str.remove(0,1);
+ }
+
+ if (!str.at(str.size()-1).isNumber()) {
+ str.chop(1);
+ }
+
+ QStringList accelDataList = str.split(delimiter);
+
+ m_reading.setTimestamp(produceTimestamp());
+ m_reading.setX(-accelDataList.at(0).toFloat() / divisor);
+ m_reading.setY(-accelDataList.at(1).toFloat() / divisor);
+ m_reading.setZ(-accelDataList.at(2).toFloat() / divisor);
+
+ newReadingAvailable();
+}
+
+void LinuxSysAccelerometer::timerEvent(QTimerEvent * /*event*/)
+{
+ poll();
+}
+
+bool LinuxSysAccelerometer::openFile()
+{
+ if (!path.isEmpty()
+ && !file.open(QIODevice::ReadOnly)) {
+ qWarning() << "Could not open file" << strerror(errno);
+ return false;
+ }
+ return true;
+}
+
+void LinuxSysAccelerometer::closeFile()
+{
+ ::close(fd);
+}
+
+
diff --git a/src/plugins/sensors/linux/linuxsysaccelerometer.h b/src/plugins/sensors/linux/linuxsysaccelerometer.h
new file mode 100644
index 00000000..cc74ebbf
--- /dev/null
+++ b/src/plugins/sensors/linux/linuxsysaccelerometer.h
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef LINUXSYSACCELEROMETER_H
+#define LINUXSYSACCELEROMETER_H
+
+#include <qsensorbackend.h>
+#include <qaccelerometer.h>
+#include <QtCore/QFile>
+
+
+class LinuxSysAccelerometer : public QSensorBackend
+{
+public:
+ static char const * const id;
+
+ LinuxSysAccelerometer(QSensor *sensor);
+ ~LinuxSysAccelerometer();
+
+ void start();
+ void stop();
+ void poll();
+ void timerEvent(QTimerEvent * /*event*/);
+
+private:
+ QAccelerometerReading m_reading;
+ int m_timerid;
+
+ bool openFile();
+ void closeFile();
+ int fd;
+ QString path;
+ QFile file;
+ int divisor;
+ QString delimiter;
+};
+
+#endif // LINUXSYSACCELEROMETER_H
+
diff --git a/src/plugins/sensors/linux/main.cpp b/src/plugins/sensors/linux/main.cpp
new file mode 100644
index 00000000..f569ecff
--- /dev/null
+++ b/src/plugins/sensors/linux/main.cpp
@@ -0,0 +1,75 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtSensors module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia 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.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "linuxsysaccelerometer.h"
+
+#include <qsensorplugin.h>
+#include <qsensorbackend.h>
+#include <qsensormanager.h>
+
+#include <QtCore/QFile>
+#include <QtCore/QDebug>
+
+class LinuxSensorPlugin : public QObject, public QSensorPluginInterface, public QSensorBackendFactory
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "com.nokia.Qt.QSensorPluginInterface/1.0" FILE "plugin.json")
+ Q_INTERFACES(QSensorPluginInterface)
+public:
+ void registerSensors()
+ {
+ qDebug() << "loaded the Linux plugin";
+ QString path = QString::fromLatin1(qgetenv("QT_ACCEL_FILEPATH"));
+ if (!path.isEmpty() && !QSensorManager::isBackendRegistered(QAccelerometer::type, LinuxSysAccelerometer::id))
+ QSensorManager::registerBackend(QAccelerometer::type, LinuxSysAccelerometer::id, this);
+ }
+
+ QSensorBackend *createBackend(QSensor *sensor)
+ {
+ if (sensor->identifier() == LinuxSysAccelerometer::id)
+ return new LinuxSysAccelerometer(sensor);
+
+ return 0;
+ }
+};
+
+#include "main.moc"
+
diff --git a/src/plugins/sensors/linux/plugin.json b/src/plugins/sensors/linux/plugin.json
new file mode 100644
index 00000000..8a55b3ae
--- /dev/null
+++ b/src/plugins/sensors/linux/plugin.json
@@ -0,0 +1 @@
+{ "Keys": [ "notused" ] }
diff --git a/src/plugins/sensors/sensors.pro b/src/plugins/sensors/sensors.pro
index 4f8fe034..45a8f197 100644
--- a/src/plugins/sensors/sensors.pro
+++ b/src/plugins/sensors/sensors.pro
@@ -4,3 +4,4 @@ isEmpty(SENSORS_PLUGINS)|contains(SENSORS_PLUGINS, dummy):SUBDIRS += dummy
isEmpty(SENSORS_PLUGINS)|contains(SENSORS_PLUGINS, generic):SUBDIRS += generic
isEmpty(SENSORS_PLUGINS)|contains(SENSORS_PLUGINS, simulator):simulator:SUBDIRS += simulator
isEmpty(SENSORS_PLUGINS)|contains(SENSORS_PLUGINS, blackberry):blackberry:SUBDIRS += blackberry
+isEmpty(SENSORS_PLUGINS)|contains(SENSORS_PLUGINS, linux):linux:SUBDIRS += linux