From 219623b633244195611d2410fbe3e583c3454852 Mon Sep 17 00:00:00 2001 From: Gatis Paeglis Date: Wed, 9 Oct 2013 15:22:16 +0200 Subject: Don't crash when sensor drivers are missing Task-number:QTRD-2420 Change-Id: I17dc3fb95eeecaea218cc70548b72ce86a015161 Reviewed-by: Eirik Aavitsland --- .../sensors/eandroid/eandroidsensordevice.cpp | 34 +++++++++++++++------- .../sensors/eandroid/eandroidsensordevice.h | 3 +- 2 files changed, 25 insertions(+), 12 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/sensors/eandroid/eandroidsensordevice.cpp b/src/plugins/sensors/eandroid/eandroidsensordevice.cpp index 178ef8f..7e4caed 100644 --- a/src/plugins/sensors/eandroid/eandroidsensordevice.cpp +++ b/src/plugins/sensors/eandroid/eandroidsensordevice.cpp @@ -41,12 +41,18 @@ void EventReaderThread::run() EAndroidSensorDevice::EAndroidSensorDevice() : m_eventThread(0), m_sensorModule(0), - m_availableSensorsList(0) + m_sensorDevice(0), + m_availableSensorsList(0), + m_initSuccess(true) { - initSensorDevice(); - m_eventThread = new EventReaderThread(this); - connect(m_eventThread, SIGNAL(eventPending()), this, + m_initSuccess = initSensorDevice(); + if (m_initSuccess) { + m_eventThread = new EventReaderThread(this); + connect(m_eventThread, SIGNAL(eventPending()), this, SLOT(processSensorEvents()), Qt::QueuedConnection); + } else { + qWarning("Failed to initialize sensor module. Possibly a missing sensor driver?"); + } } EAndroidSensorDevice* EAndroidSensorDevice::m_instance = 0; @@ -149,24 +155,30 @@ QString EAndroidSensorDevice::description(int type) const int EAndroidSensorDevice::availableSensors(sensor_t const** list) const { - return m_sensorModule->get_sensors_list(m_sensorModule, list); + if (m_initSuccess) + return m_sensorModule->get_sensors_list(m_sensorModule, list); + return 0; } -void EAndroidSensorDevice::initSensorDevice() +bool EAndroidSensorDevice::initSensorDevice() { int err = 0; err = hw_get_module(SENSORS_HARDWARE_MODULE_ID, (hw_module_t const**)&m_sensorModule); - if (err != 0) + if (err != 0 || !m_sensorModule) { qWarning("hw_get_module() failed (%s)\n", strerror(-err)); + return false; + } - if (m_sensorModule) { - err = sensors_open(&m_sensorModule->common, &m_sensorDevice); - if (err != 0) - qWarning("sensors_open() failed (%s)\n", strerror(-err)); + err = sensors_open(&m_sensorModule->common, &m_sensorDevice); + if (err != 0 || !m_sensorDevice) { + qWarning("sensors_open() failed (%s)\n", strerror(-err)); + return false; } + m_availableSensors = m_sensorModule->get_sensors_list(m_sensorModule, &m_availableSensorsList); + return true; } void EAndroidSensorDevice::processSensorEvents() const diff --git a/src/plugins/sensors/eandroid/eandroidsensordevice.h b/src/plugins/sensors/eandroid/eandroidsensordevice.h index 6d9a64b..b34580e 100644 --- a/src/plugins/sensors/eandroid/eandroidsensordevice.h +++ b/src/plugins/sensors/eandroid/eandroidsensordevice.h @@ -52,7 +52,7 @@ public: QString description(int type) const; protected: - void initSensorDevice(); + bool initSensorDevice(); int indexForType(int type) const; void setActive(int type, bool enable); void setDelay(int type, int dataRateHz) const; @@ -73,6 +73,7 @@ private: sensors_poll_device_t* m_sensorDevice; sensor_t const* m_availableSensorsList; int m_availableSensors; + bool m_initSuccess; ListenersHash m_listenersHash; }; -- cgit v1.2.3