From 6f3a14a73e5f74de8f7f365fb2736e065254930f Mon Sep 17 00:00:00 2001 From: Wolfgang Beck Date: Fri, 14 Oct 2011 11:14:01 +1000 Subject: MTMW-347 Replace dataRate with speed in TltSensor Change-Id: Icdca79436d1fe0f0e7f5035ab1e27bc958a9e517 Reviewed-on: http://codereview.qt-project.org/6634 Reviewed-by: Wolfgang Beck --- src/imports/sensors2/qsensor2tilt.cpp | 101 ++++++++++++++++++++++++++++++---- src/imports/sensors2/qsensor2tilt.h | 24 ++++++-- 2 files changed, 109 insertions(+), 16 deletions(-) (limited to 'src') 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 #include +#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& 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 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()); + _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 _dataRate; + Speed _speed; + + friend class tst_Sensors2QMLAPI; }; QT_END_NAMESPACE -- cgit v1.2.3