summaryrefslogtreecommitdiffstats
path: root/src/plugins/sensors/sensorfw/sensorfwsensorbase.cpp
diff options
context:
space:
mode:
authorLorn Potter <lorn.potter@jollamobile.com>2013-03-06 03:45:47 +1000
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-03-05 18:50:48 +0100
commitfe2a949996e1e93f0824f4e49b423b4b57090a72 (patch)
tree88fbb438ab2e5a733436271e7ce14322a536c993 /src/plugins/sensors/sensorfw/sensorfwsensorbase.cpp
parent96d4de7b36188cf8fe87b1d3f840bf9371744956 (diff)
add sensorfw based sensor plugin
ported from qtmobility. Change-Id: Ia4ee6e2b7ecbc441c5f6605f1bbabfec22ddcd09 Reviewed-by: Lorn Potter <lorn.potter@jollamobile.com>
Diffstat (limited to 'src/plugins/sensors/sensorfw/sensorfwsensorbase.cpp')
-rw-r--r--src/plugins/sensors/sensorfw/sensorfwsensorbase.cpp189
1 files changed, 189 insertions, 0 deletions
diff --git a/src/plugins/sensors/sensorfw/sensorfwsensorbase.cpp b/src/plugins/sensors/sensorfw/sensorfwsensorbase.cpp
new file mode 100644
index 00000000..85968e22
--- /dev/null
+++ b/src/plugins/sensors/sensorfw/sensorfwsensorbase.cpp
@@ -0,0 +1,189 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** 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 "sensorfwsensorbase.h"
+
+
+SensorManagerInterface* SensorfwSensorBase::m_remoteSensorManager = 0;
+
+//According to wikipedia link http://en.wikipedia.org/wiki/Standard_gravity
+//const float sensorfwsensorbase::GRAVITY_EARTH = 9.812865328;
+const float SensorfwSensorBase::GRAVITY_EARTH_THOUSANDTH = 0.009812865328;
+const int SensorfwSensorBase::KErrNotFound=-1;
+const int SensorfwSensorBase::KErrInUse=-14;
+QStringList SensorfwSensorBase::m_bufferingSensors = QStringList()
+ <<"sensorfw.accelerometer"<<"sensorfw.magnetometer"
+ <<"sensorfw.gyroscope"<<"sensorfw.rotationsensor";
+
+SensorfwSensorBase::SensorfwSensorBase(QSensor *sensor)
+ : QSensorBackend(sensor), m_sensorInterface(0), m_bufferSize(-1), m_prevOutputRange(0), m_efficientBufferSize(1), m_maxBufferSize(1)
+{
+ if (!m_remoteSensorManager)
+ m_remoteSensorManager = &SensorManagerInterface::instance();
+}
+
+SensorfwSensorBase::~SensorfwSensorBase()
+{
+ if (m_sensorInterface) {
+ stop();
+ delete m_sensorInterface, m_sensorInterface = 0;
+ }
+}
+
+void SensorfwSensorBase::start()
+{
+ if (m_sensorInterface) {
+ // dataRate
+ QByteArray type = sensor()->type();
+ if (type != QTapSensor::type() && type != QProximitySensor::type()) {
+ int dataRate = sensor()->dataRate();
+ int interval = dataRate > 0 ? 1000 / dataRate : 0;
+ // for testing maximum speed
+ //interval = 1;
+ //dataRate = 1000;
+ m_sensorInterface->setInterval(interval);
+ }
+
+ // outputRange
+ int currentRange = sensor()->outputRange();
+ int l = sensor()->outputRanges().size();
+ if (l > 1) {
+ if (currentRange != m_prevOutputRange) {
+//#ifdef Q_WS_MAEMO_6
+ bool isOk = m_sensorInterface->setDataRangeIndex(currentRange); //NOTE THAT THE CHANGE MIGHT NOT SUCCEED, FIRST COME FIRST SERVED
+ if (!isOk) sensorError(KErrInUse);
+ else m_prevOutputRange = currentRange;
+//#else
+// // TODO: remove when sensord integrated, in sensorfw env there is a delay
+// qoutputrange range = sensor()->outputRanges().at(currentRange);
+// qreal correction = 1/correctionFactor();
+// DataRange range1(range.minimum*correction, range.maximum*correction, range.accuracy*correction);
+// m_sensorInterface->requestDataRange(range1);
+// m_prevOutputRange = currentRange;
+//#endif
+ }
+ }
+
+ // always on
+ bool alwaysOn = sensor()->isAlwaysOn();
+ m_sensorInterface->setStandbyOverride(alwaysOn);
+
+ // connects after buffering checks
+ doConnectAfterCheck();
+
+ int returnCode = m_sensorInterface->start().error().type();
+ if (returnCode == 0) return;
+ qWarning() << "m_sensorInterface did not start, error code:" << returnCode;
+ }
+ sensorStopped();
+}
+
+void SensorfwSensorBase::stop()
+{
+ if (m_sensorInterface) m_sensorInterface->stop();
+}
+
+void SensorfwSensorBase::setRanges(qreal correctionFactor)
+{
+ if (!m_sensorInterface) return;
+
+ QList<DataRange> ranges = m_sensorInterface->getAvailableDataRanges();
+
+ for (int i = 0, l = ranges.size(); i < l; i++) {
+ DataRange range = ranges.at(i);
+ qreal rangeMin = range.min * correctionFactor;
+ qreal rangeMax = range.max * correctionFactor;
+ qreal resolution = range.resolution * correctionFactor;
+ addOutputRange(rangeMin, rangeMax, resolution);
+ }
+}
+
+
+bool SensorfwSensorBase::doConnectAfterCheck()
+{
+ if (!m_sensorInterface) return false;
+
+ // buffer size
+ int size = bufferSize();
+ if (size == m_bufferSize) return true;
+
+ if (m_bufferingSensors.contains(sensor()->identifier()))
+ m_sensorInterface->setBufferSize(size);
+ else
+ size = 1;
+
+ // if multiple->single or single->multiple or if uninitialized
+ if ((m_bufferSize > 1 && size == 1) || (m_bufferSize == 1 && size > 1) || m_bufferSize == -1) {
+ m_bufferSize = size;
+ disconnect(this);
+ if (!doConnect()) {
+ qWarning() << "Unable to connect "<< sensorName();
+ return false;
+ }
+ return true;
+ }
+ m_bufferSize = size;
+ return true;
+}
+
+int SensorfwSensorBase::bufferSize() const
+{
+ int bufferSize = sensor()->bufferSize();
+ if (bufferSize == 1)
+ return 1;
+
+ // otherwise check validit
+ if (bufferSize < 1) {
+ qWarning() << "bufferSize cannot be " << bufferSize << ", must be a positive number >= 1";
+ return 1;
+ }
+ if (bufferSize > m_maxBufferSize) {
+ qWarning() << "bufferSize cannot be " << bufferSize << ", MAX value is " << m_maxBufferSize;
+ return m_maxBufferSize;
+ }
+ return bufferSize;
+}
+
+qreal SensorfwSensorBase::correctionFactor() const
+{
+ return 1;
+}
+