diff options
author | Lorn Potter <lorn.potter@jollamobile.com> | 2014-07-07 16:58:22 +1000 |
---|---|---|
committer | Lorn Potter <lorn.potter@jollamobile.com> | 2014-07-10 21:58:02 +0200 |
commit | 9f377d1fa286817a17a5e5de3786a2d73aeaa822 (patch) | |
tree | aecefd0f3e6e9f8b74420af1e0ce558ef47fb8f0 /src/plugins/sensors/sensorfw/sensorfwsensorbase.cpp | |
parent | 044486f8b41b9ae7bdfad838be79ec5b2782fed5 (diff) |
Series of crash fixes from Mer, squashed
1)tracing plugin loading
2)m_remoteSensorManager can be nullptr
But it seems it does not solve incorrect initialization in the case
manager interface is nullptr: init() for different sensors does not
check initDone
3)split initSensor() to template function and function
most of initSensor() does not depend on template param, so it is
better to split it -> less code should be generated
4)do not use sensor manager if it is invalid
5)correct class members initialization order
6)assert sensor interface is not null
From what I saw according to logic it should not happen so using
Q_ASSERT for better maintainability
7)check local interface pointer in SensorfwTapSensor::start()
Signed-off-by: Denis Zalevskiy <denis.zalevskiy@jolla.com>
Change-Id: I5c1bf3999ad2268c0dba9b3fe511d999c2e63fd9
Reviewed-by: Alex Blasche <alexander.blasche@digia.com>
Diffstat (limited to 'src/plugins/sensors/sensorfw/sensorfwsensorbase.cpp')
-rw-r--r-- | src/plugins/sensors/sensorfw/sensorfwsensorbase.cpp | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/plugins/sensors/sensorfw/sensorfwsensorbase.cpp b/src/plugins/sensors/sensorfw/sensorfwsensorbase.cpp index 299a75c9..b8e40771 100644 --- a/src/plugins/sensors/sensorfw/sensorfwsensorbase.cpp +++ b/src/plugins/sensors/sensorfw/sensorfwsensorbase.cpp @@ -215,6 +215,11 @@ qreal SensorfwSensorBase::correctionFactor() const void SensorfwSensorBase::connectToSensord() { m_remoteSensorManager = &SensorManagerInterface::instance(); + if (!m_remoteSensorManager->isValid()) { + qWarning() << "SensorManagerInterface is invalid"; + m_remoteSensorManager = 0; + return; + } if (running) { stop(); reinitIsNeeded = true; @@ -228,3 +233,68 @@ void SensorfwSensorBase::sensordUnregistered() m_bufferSize = -1; } +bool SensorfwSensorBase::initSensorInterface(QString const &name) +{ + if (!m_sensorInterface) { + sensorError(KErrNotFound); + return false; + } + + //metadata + const QList<DataRange> intervals = m_sensorInterface->getAvailableIntervals(); + + for (int i = 0, l = intervals.size(); i < l; i++) { + qreal intervalMax = intervals.at(i).max; + qreal intervalMin = intervals.at(i).min; + + if (intervalMin == 0 && intervalMax == 0) { + // 0 interval has different meanings in e.g. magge/acce + // magge -> best-effort + // acce -> lowest possible + // in Qt API setting 0 means default + continue; + } + + qreal rateMin = intervalMax < 1 ? 1 : 1 / intervalMax * 1000; + rateMin = rateMin < 1 ? 1 : rateMin; + + intervalMin = intervalMin < 1 ? 10: intervalMin; // do not divide with 0 + qreal rateMax = 1 / intervalMin * 1000; + addDataRate(rateMin, rateMax); + } + + //bufferSizes + if (m_bufferingSensors.contains(sensor()->identifier())) { + + IntegerRangeList sizes = m_sensorInterface->getAvailableBufferSizes(); + for (int i = 0; i < sizes.size(); i++) { + int second = sizes.at(i).second; + m_maxBufferSize = second > m_bufferSize ? second : m_maxBufferSize; + } + m_maxBufferSize = m_maxBufferSize < 0 ? 1 : m_maxBufferSize; + //SensorFW guarantees to provide the most efficient size first + //TODO: remove from comments + //m_efficientBufferSize = m_sensorInterface->hwBuffering()? (l>0?sizes.at(0).first:1) : 1; + } else { + m_maxBufferSize = 1; + } + + sensor()->setMaxBufferSize(m_maxBufferSize); + sensor()->setEfficientBufferSize(m_efficientBufferSize); + + // TODO deztructor: Leaking abstraction detected. Just copied code + // from initSensor<>() here, need to + QByteArray type = sensor()->type(); + if ((type == QAmbientLightSensor::type) // SensorFW returns lux values, plugin enumerated values + || (type == QIRProximitySensor::type) // SensorFW returns raw reflectance values, plugin % of max reflectance + || (name == "accelerometersensor") // SensorFW returns milliGs, plugin m/s^2 + || (name == "magnetometersensor") // SensorFW returns nanoTeslas, plugin Teslas + || (name == "gyroscopesensor")) // SensorFW returns DSPs, plugin milliDSPs + return true; + + setDescription(m_sensorInterface->description()); + + if (name == "tapsensor") return true; + setRanges(); + return true; +} |