From 13d887d2950551fee4d8639a9b1cb164e307704e Mon Sep 17 00:00:00 2001 From: Pawit Pornkitprasan Date: Fri, 29 Jul 2011 23:04:14 +0700 Subject: Fix orientation sensor. Orientation sensor's daemon (orientationd) requires both accelerometer and magnetic sensor to be enabled in order to work. Change-Id: If34a5af1c55e9db8c3255786b1052e895afa7176 --- libsensors/sensors.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/libsensors/sensors.cpp b/libsensors/sensors.cpp index 23a1e34..1a128cb 100644 --- a/libsensors/sensors.cpp +++ b/libsensors/sensors.cpp @@ -147,6 +147,13 @@ private: int mWritePipeFd; SensorBase* mSensors[numSensorDrivers]; + // For keeping track of usage (only count from system) + bool mAccelActive; + bool mMagnetActive; + bool mOrientationActive; + + int real_activate(int handle, int enabled); + int handleToDriver(int handle) const { switch (handle) { @@ -205,6 +212,10 @@ sensors_poll_context_t::sensors_poll_context_t() mPollFds[wake].fd = wakeFds[0]; mPollFds[wake].events = POLLIN; mPollFds[wake].revents = 0; + + mAccelActive = false; + mMagnetActive = false; + mOrientationActive = false; } sensors_poll_context_t::~sensors_poll_context_t() { @@ -216,6 +227,36 @@ sensors_poll_context_t::~sensors_poll_context_t() { } int sensors_poll_context_t::activate(int handle, int enabled) { + int err; + + // Orientation requires accelerometer and magnetic sensor + if (handle == ID_O) { + mOrientationActive = enabled ? true : false; + if (!mAccelActive) { + err = real_activate(ID_A, enabled); + if (err) return err; + } + if (!mMagnetActive) { + err = real_activate(ID_M, enabled); + if (err) return err; + } + } + // Keep track of magnetic and accelerometer use from system + else if (handle == ID_A) { + mAccelActive = enabled ? true : false; + // No need to enable or disable if orientation sensor is active as that will handle it + if (mOrientationActive) return 0; + } + else if (handle == ID_M) { + mMagnetActive = enabled ? true : false; + // No need to enable or disable if orientation sensor is active as that will handle it + if (mOrientationActive) return 0; + } + + return real_activate(handle, enabled); +} + +int sensors_poll_context_t::real_activate(int handle, int enabled) { int index = handleToDriver(handle); if (index < 0) return index; int err = mSensors[index]->enable(handle, enabled); -- cgit v1.1