From 9f377d1fa286817a17a5e5de3786a2d73aeaa822 Mon Sep 17 00:00:00 2001 From: Lorn Potter Date: Mon, 7 Jul 2014 16:58:22 +1000 Subject: 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 Change-Id: I5c1bf3999ad2268c0dba9b3fe511d999c2e63fd9 Reviewed-by: Alex Blasche --- .../sensors/sensorfw/sensorfwaccelerometer.cpp | 1 + src/plugins/sensors/sensorfw/sensorfwals.cpp | 1 + src/plugins/sensors/sensorfw/sensorfwcompass.cpp | 1 + src/plugins/sensors/sensorfw/sensorfwgyroscope.cpp | 1 + .../sensors/sensorfw/sensorfwirproximitysensor.cpp | 1 + .../sensors/sensorfw/sensorfwlightsensor.cpp | 1 + .../sensors/sensorfw/sensorfwmagnetometer.cpp | 1 + .../sensors/sensorfw/sensorfworientationsensor.cpp | 1 + .../sensors/sensorfw/sensorfwproximitysensor.cpp | 3 +- .../sensors/sensorfw/sensorfwrotationsensor.cpp | 1 + .../sensors/sensorfw/sensorfwsensorbase.cpp | 70 ++++++++++++++++++++ src/plugins/sensors/sensorfw/sensorfwsensorbase.h | 77 ++-------------------- src/plugins/sensors/sensorfw/sensorfwtapsensor.cpp | 14 ++-- 13 files changed, 97 insertions(+), 76 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/sensors/sensorfw/sensorfwaccelerometer.cpp b/src/plugins/sensors/sensorfw/sensorfwaccelerometer.cpp index 8efd127b..0ac4e905 100644 --- a/src/plugins/sensors/sensorfw/sensorfwaccelerometer.cpp +++ b/src/plugins/sensors/sensorfw/sensorfwaccelerometer.cpp @@ -74,6 +74,7 @@ void sensorfwaccelerometer::slotFrameAvailable(const QVector& frame) bool sensorfwaccelerometer::doConnect() { + Q_ASSERT(m_sensorInterface); if (m_bufferSize==1) return QObject::connect(m_sensorInterface, SIGNAL(dataAvailable(XYZ)), this, SLOT(slotDataAvailable(XYZ))); return QObject::connect(m_sensorInterface, SIGNAL(frameAvailable(QVector)),this, SLOT(slotFrameAvailable(QVector))); diff --git a/src/plugins/sensors/sensorfw/sensorfwals.cpp b/src/plugins/sensors/sensorfw/sensorfwals.cpp index e5dd051b..a061f14e 100644 --- a/src/plugins/sensors/sensorfw/sensorfwals.cpp +++ b/src/plugins/sensors/sensorfw/sensorfwals.cpp @@ -83,6 +83,7 @@ void Sensorfwals::slotDataAvailable(const Unsigned& data) bool Sensorfwals::doConnect() { + Q_ASSERT(m_sensorInterface); return QObject::connect(m_sensorInterface, SIGNAL(ALSChanged(Unsigned)), this, SLOT(slotDataAvailable(Unsigned))); } diff --git a/src/plugins/sensors/sensorfw/sensorfwcompass.cpp b/src/plugins/sensors/sensorfw/sensorfwcompass.cpp index e565bce3..d2f02888 100644 --- a/src/plugins/sensors/sensorfw/sensorfwcompass.cpp +++ b/src/plugins/sensors/sensorfw/sensorfwcompass.cpp @@ -70,6 +70,7 @@ void SensorfwCompass::slotDataAvailable(const Compass& data) bool SensorfwCompass::doConnect() { + Q_ASSERT(m_sensorInterface); return QObject::connect(m_sensorInterface, SIGNAL(dataAvailable(Compass)), this, SLOT(slotDataAvailable(Compass))); } diff --git a/src/plugins/sensors/sensorfw/sensorfwgyroscope.cpp b/src/plugins/sensors/sensorfw/sensorfwgyroscope.cpp index 6001d477..f802d0de 100644 --- a/src/plugins/sensors/sensorfw/sensorfwgyroscope.cpp +++ b/src/plugins/sensors/sensorfw/sensorfwgyroscope.cpp @@ -75,6 +75,7 @@ void SensorfwGyroscope::slotFrameAvailable(const QVector& frame) bool SensorfwGyroscope::doConnect() { + Q_ASSERT(m_sensorInterface); if (m_bufferSize==1) return QObject::connect(m_sensorInterface, SIGNAL(dataAvailable(XYZ)), this, SLOT(slotDataAvailable(XYZ))); return QObject::connect(m_sensorInterface, SIGNAL(frameAvailable(QVector)),this, SLOT(slotFrameAvailable(QVector))); diff --git a/src/plugins/sensors/sensorfw/sensorfwirproximitysensor.cpp b/src/plugins/sensors/sensorfw/sensorfwirproximitysensor.cpp index 6855158e..145276e3 100644 --- a/src/plugins/sensors/sensorfw/sensorfwirproximitysensor.cpp +++ b/src/plugins/sensors/sensorfw/sensorfwirproximitysensor.cpp @@ -67,6 +67,7 @@ void SensorfwIrProximitySensor::slotDataAvailable(const Proximity& proximity) bool SensorfwIrProximitySensor::doConnect() { + Q_ASSERT(m_sensorInterface); return QObject::connect(m_sensorInterface, SIGNAL(reflectanceDataAvailable(Proximity)), this, SLOT(slotDataAvailable(Proximity))); } diff --git a/src/plugins/sensors/sensorfw/sensorfwlightsensor.cpp b/src/plugins/sensors/sensorfw/sensorfwlightsensor.cpp index 6badd7ce..dda87ea5 100644 --- a/src/plugins/sensors/sensorfw/sensorfwlightsensor.cpp +++ b/src/plugins/sensors/sensorfw/sensorfwlightsensor.cpp @@ -61,6 +61,7 @@ void SensorfwLightSensor::slotDataAvailable(const Unsigned& data) bool SensorfwLightSensor::doConnect() { + Q_ASSERT(m_sensorInterface); return QObject::connect(m_sensorInterface, SIGNAL(ALSChanged(Unsigned)), this, SLOT(slotDataAvailable(Unsigned))); } diff --git a/src/plugins/sensors/sensorfw/sensorfwmagnetometer.cpp b/src/plugins/sensors/sensorfw/sensorfwmagnetometer.cpp index 12465a30..913d301a 100644 --- a/src/plugins/sensors/sensorfw/sensorfwmagnetometer.cpp +++ b/src/plugins/sensors/sensorfw/sensorfwmagnetometer.cpp @@ -88,6 +88,7 @@ void SensorfwMagnetometer::slotFrameAvailable(const QVector& fram bool SensorfwMagnetometer::doConnect() { + Q_ASSERT(m_sensorInterface); if (m_bufferSize==1) return QObject::connect(m_sensorInterface, SIGNAL(dataAvailable(MagneticField)), this, SLOT(slotDataAvailable(MagneticField))); diff --git a/src/plugins/sensors/sensorfw/sensorfworientationsensor.cpp b/src/plugins/sensors/sensorfw/sensorfworientationsensor.cpp index bd91ac26..722d61b6 100644 --- a/src/plugins/sensors/sensorfw/sensorfworientationsensor.cpp +++ b/src/plugins/sensors/sensorfw/sensorfworientationsensor.cpp @@ -78,6 +78,7 @@ void SensorfwOrientationSensor::slotDataAvailable(const Unsigned& data) bool SensorfwOrientationSensor::doConnect() { + Q_ASSERT(m_sensorInterface); return QObject::connect(m_sensorInterface, SIGNAL(orientationChanged(Unsigned)), this, SLOT(slotDataAvailable(Unsigned))); } diff --git a/src/plugins/sensors/sensorfw/sensorfwproximitysensor.cpp b/src/plugins/sensors/sensorfw/sensorfwproximitysensor.cpp index 4d91a024..b8d782d9 100644 --- a/src/plugins/sensors/sensorfw/sensorfwproximitysensor.cpp +++ b/src/plugins/sensors/sensorfw/sensorfwproximitysensor.cpp @@ -46,8 +46,8 @@ char const * const SensorfwProximitySensor::id("sensorfw.proximitysensor"); SensorfwProximitySensor::SensorfwProximitySensor(QSensor *sensor) : SensorfwSensorBase(sensor), + m_initDone(false), m_exClose(false) - , m_initDone(false) { init(); setReading(&m_reading); @@ -81,6 +81,7 @@ void SensorfwProximitySensor::slotDataAvailable(const Unsigned& data) bool SensorfwProximitySensor::doConnect() { + Q_ASSERT(m_sensorInterface); return (QObject::connect(m_sensorInterface, SIGNAL(dataAvailable(Unsigned)), this, SLOT(slotDataAvailable(Unsigned)))); } diff --git a/src/plugins/sensors/sensorfw/sensorfwrotationsensor.cpp b/src/plugins/sensors/sensorfw/sensorfwrotationsensor.cpp index b63e7f6e..87d547c6 100644 --- a/src/plugins/sensors/sensorfw/sensorfwrotationsensor.cpp +++ b/src/plugins/sensors/sensorfw/sensorfwrotationsensor.cpp @@ -71,6 +71,7 @@ void SensorfwRotationSensor::slotFrameAvailable(const QVector& frame) bool SensorfwRotationSensor::doConnect() { + Q_ASSERT(m_sensorInterface); if (m_bufferSize==1) return QObject::connect(m_sensorInterface, SIGNAL(dataAvailable(XYZ)), this, SLOT(slotDataAvailable(XYZ))); return QObject::connect(m_sensorInterface, SIGNAL(frameAvailable(QVector)),this, SLOT(slotFrameAvailable(QVector))); 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 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; +} diff --git a/src/plugins/sensors/sensorfw/sensorfwsensorbase.h b/src/plugins/sensors/sensorfw/sensorfwsensorbase.h index 7cf56844..26bc4aae 100644 --- a/src/plugins/sensors/sensorfw/sensorfwsensorbase.h +++ b/src/plugins/sensors/sensorfw/sensorfwsensorbase.h @@ -77,85 +77,20 @@ protected: template void initSensor(bool &initDone) { - const QString name = sensorName(); if (!initDone) { + if (!m_remoteSensorManager) { + qDebug() << "There is no sensor manager yet, do not initialize" << name; + return; + } if (!m_remoteSensorManager->loadPlugin(name)) { sensorError(KErrNotFound); return; } m_remoteSensorManager->registerSensorInterface(name); } - m_sensorInterface = T::controlInterface(name); - if (!m_sensorInterface) { - m_sensorInterface = const_cast(T::listenInterface(name)); - } - if (!m_sensorInterface) { - sensorError(KErrNotFound); - return; - } - if (!m_sensorInterface) { - sensorError(KErrNotFound); - return; - } - - initDone = true; - - //metadata - QList intervals = m_sensorInterface->getAvailableIntervals(); - - for (int i = 0, l = intervals.size(); i < l; i++) { - qreal intervalMax = ((DataRange)(intervals.at(i))).max; - qreal intervalMin =((DataRange)(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(); - int l = sizes.size(); - for (int i = 0; i < l; 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); - - QByteArray type = sensor()->type(); - if (type == QAmbientLightSensor::type) return; // SensorFW returns lux values, plugin enumerated values - if (type == QIRProximitySensor::type) return; // SensorFW returns raw reflectance values, plugin % of max reflectance - if (name == "accelerometersensor") return; // SensorFW returns milliGs, plugin m/s^2 - if (name == "magnetometersensor") return; // SensorFW returns nanoTeslas, plugin Teslas - if (name == "gyroscopesensor") return; // SensorFW returns DSPs, plugin milliDSPs - - setDescription(m_sensorInterface->description()); - - if (name == "tapsensor") return; - setRanges(); + initDone = initSensorInterface(name); }; @@ -166,7 +101,7 @@ protected: bool reinitIsNeeded; private: - + bool initSensorInterface(QString const &); static SensorManagerInterface* m_remoteSensorManager; int m_prevOutputRange; bool doConnectAfterCheck(); diff --git a/src/plugins/sensors/sensorfw/sensorfwtapsensor.cpp b/src/plugins/sensors/sensorfw/sensorfwtapsensor.cpp index e6f61d9b..01ee7789 100644 --- a/src/plugins/sensors/sensorfw/sensorfwtapsensor.cpp +++ b/src/plugins/sensors/sensorfw/sensorfwtapsensor.cpp @@ -45,8 +45,8 @@ char const * const SensorfwTapSensor::id("sensorfw.tapsensor"); SensorfwTapSensor::SensorfwTapSensor(QSensor *sensor) : SensorfwSensorBase(sensor), + m_initDone(false), m_isOnceStarted(false) - , m_initDone(false) { init(); setReading(&m_reading); @@ -71,9 +71,14 @@ void SensorfwTapSensor::start() } else m_isDoubleTapSensor = b; - if (!m_isOnceStarted || (m_isOnceStarted && isDoubleTapSensor != m_isDoubleTapSensor)) - ((TapSensorChannelInterface*)m_sensorInterface)-> - setTapType(m_isDoubleTapSensor?TapSensorChannelInterface::Double:TapSensorChannelInterface::Single); + if (!m_isOnceStarted || (m_isOnceStarted && isDoubleTapSensor != m_isDoubleTapSensor)) { + TapSensorChannelInterface *iface = static_cast(m_sensorInterface); + if (!iface) { + qWarning() << "Sensor interface is not initialized"; + return; + } + iface->setTapType(m_isDoubleTapSensor?TapSensorChannelInterface::Double:TapSensorChannelInterface::Single); + } SensorfwSensorBase::start(); // Set tap type (single/double) @@ -106,6 +111,7 @@ void SensorfwTapSensor::slotDataAvailable(const Tap& data) bool SensorfwTapSensor::doConnect() { + Q_ASSERT(m_sensorInterface); return QObject::connect(m_sensorInterface, SIGNAL(dataAvailable(Tap)), this, SLOT(slotDataAvailable(Tap))); } -- cgit v1.2.3