summaryrefslogtreecommitdiffstats
path: root/src/plugins/sensors/sensorfw/sensorfwsensorbase.cpp
diff options
context:
space:
mode:
authorLorn Potter <lorn.potter@jollamobile.com>2014-07-07 16:58:22 +1000
committerLorn Potter <lorn.potter@jollamobile.com>2014-07-10 21:58:02 +0200
commit9f377d1fa286817a17a5e5de3786a2d73aeaa822 (patch)
treeaecefd0f3e6e9f8b74420af1e0ce558ef47fb8f0 /src/plugins/sensors/sensorfw/sensorfwsensorbase.cpp
parent044486f8b41b9ae7bdfad838be79ec5b2782fed5 (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.cpp70
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;
+}