summaryrefslogtreecommitdiffstats
path: root/src/imports/sensors2
diff options
context:
space:
mode:
authorWolfgang Beck <wolfgang.beck@nokia.com>2011-10-14 11:14:01 +1000
committerQt by Nokia <qt-info@nokia.com>2011-10-14 03:34:01 +0200
commit6f3a14a73e5f74de8f7f365fb2736e065254930f (patch)
tree38a87388e18c183032e52b73d8f17b7929c3a8a5 /src/imports/sensors2
parent3d9fa0cf5aaf51fa4fd234c3d9aa11e11a4a74d2 (diff)
MTMW-347 Replace dataRate with speed in TltSensor
Change-Id: Icdca79436d1fe0f0e7f5035ab1e27bc958a9e517 Reviewed-on: http://codereview.qt-project.org/6634 Reviewed-by: Wolfgang Beck <wolfgang.beck@nokia.com>
Diffstat (limited to 'src/imports/sensors2')
-rw-r--r--src/imports/sensors2/qsensor2tilt.cpp101
-rw-r--r--src/imports/sensors2/qsensor2tilt.h24
2 files changed, 109 insertions, 16 deletions
diff --git a/src/imports/sensors2/qsensor2tilt.cpp b/src/imports/sensors2/qsensor2tilt.cpp
index 978ec19d..b173b0db 100644
--- a/src/imports/sensors2/qsensor2tilt.cpp
+++ b/src/imports/sensors2/qsensor2tilt.cpp
@@ -45,6 +45,8 @@
#include <QtCore/QDebug>
#include <QtCore/QStringList>
+#define MAXRATE 30
+
QT_BEGIN_NAMESPACE
/*!
@@ -66,6 +68,7 @@ QSensor2Tilt::QSensor2Tilt(QObject* parent)
, _roll(0)
, _calibratedPitch(0)
, _calibratedRoll(0)
+ , _speed(QSensor2Tilt::Slow)
{
_accel = new QAccelerometer(this);
_accel->addFilter(this);
@@ -75,21 +78,92 @@ QSensor2Tilt::~QSensor2Tilt()
{
}
+int searchDataRate(const QList<int>& datarates, int value)
+{
+ int l = 0;
+ int r = datarates.count() - 1;
+ int m = (l + r) / 2;
+
+ while (l <= r) {
+ m = (l + r) / 2;
+ if (datarates[m] == value)
+ break;
+ else if (datarates[m] < value)
+ r = m - 1;
+ else
+ l = m + 1;
+ }
+ if (m > 0){
+ int ddr = datarates[m - 1];
+ ddr -= value;
+ int ddr1 = datarates[m] - value;
+ if (ddr1 < 0) ddr1 = -ddr1;
+ if (ddr < ddr1)
+ return datarates[m - 1];
+ }
+
+ return datarates[m];
+}
+
+void QSensor2Tilt::createRunModeDataRateMap()
+{
+ _dataRate.clear();
+ qrangelist rl = _accel->availableDataRates();
+
+ //1. make a list of all available datarates
+ QList<int> dr;
+ foreach (const qrange &r, rl) {
+ for (int i = r.first; i <= r.second; i++){
+ if (i <= MAXRATE){
+ if (!dr.contains(i))
+ dr.append(i);
+ }
+ }
+ }
+
+ //2. Sort the list
+ if (dr.count() > 0){
+ qSort(dr.begin(), dr.end(), qGreater<int>());
+ _dataRate.insert(QSensor2Tilt::Slow, searchDataRate(dr, 2));
+ _dataRate.insert(QSensor2Tilt::Medium, searchDataRate(dr, 10));
+ _dataRate.insert(QSensor2Tilt::Fast, searchDataRate(dr, 20));
+ }
+}
+
/*!
- \qmlproperty bool QtSensors5::TiltSensor::dataRate
- Holds the data rate that the sensor should be run at.
+ \qmlproperty bool QtSensors5::TiltSensor::speed
+ Holds the speed that the sensor should be run at.
+ Default is Slow.
+
+ \table
+ \row
+ \o TiltSensor.Slow
+ \o The sensor runs in slow mode.
+ \o Closest available datarate at 2Hz.
+ \row
+ \o TiltSensor.Medium
+ \o The sensor runs in medium mode.
+ \o Closest available datarate at 10Hz.
+ \row
+ \o TiltSensor.Fast
+ \o The sensor runs in fast mode.
+ \o Closest available datarate at 20Hz.
+ \endtable
*/
-int QSensor2Tilt::dataRate()
+QSensor2Tilt::Speed QSensor2Tilt::speed()
{
- return _accel->dataRate();
+ return _speed;
}
-void QSensor2Tilt::setDataRate(int val)
+void QSensor2Tilt::setSpeed(const QSensor2Tilt::Speed val)
{
- if (val != dataRate()){
- _accel->setDataRate(val);
- emit dataRateChanged();
+ if (_dataRate.keys().contains(val)){
+ if (_dataRate.value(val) != _accel->dataRate()){
+ _accel->setDataRate(_dataRate.value(val));
+ emit speedChanged();
+ }
}
+ _speed = val;
}
/*!
@@ -101,14 +175,19 @@ bool QSensor2Tilt::enabled()
return _accel->isActive();
}
-void QSensor2Tilt::setEnabled(bool val)
+void QSensor2Tilt::setEnabled(const bool val)
{
bool active = enabled();
if (active != val){
if (val){
+ bool readDatarateMap = !_accel->isConnectedToBackend();
bool ret = _accel->start();
if (!ret)
qWarning() << "couldn't start the sensor.";
+ else if (readDatarateMap){
+ createRunModeDataRateMap();
+ setSpeed(_speed);
+ }
}
else
_accel->stop();
@@ -224,7 +303,9 @@ inline qreal calcTheta(double Ax, double Ay, double Az)
/*!
\qmlsignal QtSensors5::TiltSensor::tiltChanged(qreal deltaX, qreal deltaY)
This signal is emitted whenever the change from at leat one of the rotation values was higher than the accuracy.
- The angle value is based on the specified unit (Degree or Radian) \sa {unit_property} {TiltSensor.unit}.
+ The angle value is based on the specified unit (Degree or Radian).
+
+ \sa {QtSensors5::TiltSensor::unit} {TiltSensor.unit}
*/
qreal QSensor2Tilt::accuracy()
{
diff --git a/src/imports/sensors2/qsensor2tilt.h b/src/imports/sensors2/qsensor2tilt.h
index bf6c2b93..7b8f1977 100644
--- a/src/imports/sensors2/qsensor2tilt.h
+++ b/src/imports/sensors2/qsensor2tilt.h
@@ -51,11 +51,11 @@ QT_BEGIN_NAMESPACE
class QSensor2Tilt : public QObject, public QAccelerometerFilter
{
Q_OBJECT
- Q_ENUMS(Unit)
+ Q_ENUMS(Unit Speed)
Q_PROPERTY(qreal yRotation READ yRotation NOTIFY yRotationChanged)
Q_PROPERTY(qreal xRotation READ xRotation NOTIFY xRotationChanged)
Q_PROPERTY(Unit unit READ unit WRITE setUnit NOTIFY unitChanged)
- Q_PROPERTY(int dataRate READ dataRate WRITE setDataRate NOTIFY dataRateChanged)
+ Q_PROPERTY(Speed speed READ speed WRITE setSpeed NOTIFY speedChanged)
Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged)
Q_PROPERTY(qreal accuracy READ accuracy WRITE setAccuracy NOTIFY accuracyChanged)
Q_PROPERTY(QByteArray settings READ settings WRITE setSettings)
@@ -70,11 +70,18 @@ public:
, Degrees
};
+ enum Speed{
+ Slow = 0
+ , Medium
+ , Fast
+ };
+
+
Q_SIGNALS:
void unitChanged();
void yRotationChanged();
void xRotationChanged();
- void dataRateChanged();
+ void speedChanged();
void enabledChanged();
void tiltChanged(qreal deltaX, qreal deltaY);
void accuracyChanged();
@@ -86,14 +93,15 @@ private:
qreal xRotation();
Unit unit();
void setUnit(const Unit val);
- int dataRate();
- void setDataRate(const int val);
+ Speed speed();
+ void setSpeed(const Speed val);
bool enabled();
- void setEnabled(bool val);
+ void setEnabled(const bool val);
qreal accuracy();
void setAccuracy(const qreal val);
QByteArray settings() const;
void setSettings(const QByteArray val);
+ void createRunModeDataRateMap();
QAccelerometer* _accel;
qreal _yRotation;
@@ -104,6 +112,10 @@ private:
qreal _roll;
qreal _calibratedPitch;
qreal _calibratedRoll;
+ QMap<Speed, int> _dataRate;
+ Speed _speed;
+
+ friend class tst_Sensors2QMLAPI;
};
QT_END_NAMESPACE